Integrate with Conda and a publish through CI

Closes #113
Code Changes

[x] Create conda meta.yaml file
[x] Create conda account for ethyca
[x] Create secret CONDA_TOKEN in repo
[x] Add github CI workflow step to publish
[ ] Update documentation for conda usage?

Steps to Confirm

[x] Verify package is published to conda - https://anaconda.org/ethyca/fidesctl
[x] Verify CI publishes package on tag releases
[ ] Verify cli works when installed through conda. Someone run this for me please conda install -c ethyca fidesctl -c plotly -c conda-forge

Pre-Merge Checklist

[x] All CI Pipelines Succeeded
[ ] Documentation Updated

Description Of Changes

Create "ethyca" account/channel in Anaconda
Create conda meta.yml file that leverages our current pip setup
Create workflow that builds and uploads conda package

Have tested building and uploading with the current metadata file successfully.
There's really alot to anaconda and I'm still not an expert. I won't really document all my learnings but more just how we got to this solution.
Conda provides some OK documentation on building your own package and creating your metadata file here:
https://conda.io/projects/conda-build/en/latest/user-guide/tutorials/build-pkgs.html
https://docs.conda.io/projects/conda-build/en/latest/resources/define-metadata.html
Also found a couple guides that walk you through the process:
https://levelup.gitconnected.com/publishing-your-python-package-on-conda-and-conda-forge-309a405740cf
https://medium.com/analytics-vidhya/publish-a-python-package-to-conda-b352eb0bcb2e
Even following these it was still challenging getting a build to work. Eventually I found out that you can use the skeleton command to model your conda project from your pypi setup. This is what I had to run:
conda skeleton pypi fidesctl
This didnt work right away but it filled in all dependencies and other information I was trying to build up myself. I found a couple irl examples which helped me make more progress:
https://github.com/plotly/plotly.py/blob/master/packages/python/plotly/recipe/meta.yaml
https://github.com/fcakyon/conda-publish-action/blob/master/example_conda_folder/meta.yaml
Once I got the build working I was able to simplify the metadata file alot by doing some jinja magic. This way we could just leverage our setup.py and requirements.txt files and not duplicating dependency declarations(see https://stackoverflow.com/questions/61485382/add-requirements-from-requirements-txt-to-conda-meta-yaml)
There's nothing too weird in the metadata fie but if you're wondering what the noarch line is, see https://docs.anaconda.com/anaconda-repository/user-guide/tasks/pkgs/use-noarch-pkgs/
Noarch Python packages cut down on the overhead of building multiple different pure Python packages on different architectures and Python versions by sorting out platform and Python version-specific differences at install time.

From the root directory you can build using the following:
conda build --output-folder ./conda-out/ ./fidesctl/conda/ -c plotly -c conda-forge
All of our dependencies are either in the default or conda-forge channels except for plotly.
Here is a build output:
see log

eduardoarmendariz@eth-27s-mbp fides % conda build --output-folder ./conda-out/ ./fidesctl/conda/ -c plotly -c conda-forge

No numpy version specified in conda_build_config.yaml.  Falling back to default numpy value of 1.16
WARNING:conda_build.metadata:No numpy version specified in conda_build_config.yaml.  Falling back to default numpy value of 1.16
Copying /Users/eduardoarmendariz/fides to /Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work/
Adding in variants from internal_defaults
INFO:conda_build.variants:Adding in variants from internal_defaults
Attempting to finalize metadata for fidesctl
INFO:conda_build.metadata:Attempting to finalize metadata for fidesctl
Collecting package metadata (repodata.json): ...working... done
Solving environment: ...working... done
Collecting package metadata (repodata.json): ...working... done
Solving environment: ...working... done
BUILD START: ['fidesctl-1.0.0+20.gb368994-py_0.tar.bz2']
Collecting package metadata (repodata.json): ...working... done
Solving environment: ...working... done

## Package Plan ##

  environment location: /Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh

The following NEW packages will be INSTALLED:

    bzip2:           1.0.8-h0d85af4_4          conda-forge
    ca-certificates: 2021.10.8-h033912b_0      conda-forge
    libffi:          3.4.2-h0d85af4_5          conda-forge
    libzlib:         1.2.11-h9173be1_1013      conda-forge
    ncurses:         6.2-h2e338ed_4            conda-forge
    openssl:         3.0.0-h0d85af4_2          conda-forge
    pip:             21.3.1-pyhd8ed1ab_0       conda-forge
    python:          3.10.0-h38b4d05_3_cpython conda-forge
    python_abi:      3.10-2_cp310              conda-forge
    readline:        8.1-h05e3726_0            conda-forge
    setuptools:      59.2.0-py310h2ec42d9_0    conda-forge
    sqlite:          3.36.0-h23a322b_2         conda-forge
    tk:              8.6.11-h5dbffcc_1         conda-forge
    tzdata:          2021e-he74cb21_0          conda-forge
    wheel:           0.37.0-pyhd8ed1ab_1       conda-forge
    xz:              5.2.5-haf1e3a3_1          conda-forge
    zlib:            1.2.11-h9173be1_1013      conda-forge

Preparing transaction: ...working... done
Verifying transaction: ...working... done
Executing transaction: ...working... done
Collecting package metadata (repodata.json): ...working... done
Solving environment: ...working... done
source tree in: /Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work
export PREFIX=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh
export BUILD_PREFIX=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/_build_env
export SRC_DIR=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work
Using pip 21.3.1 from $PREFIX/lib/python3.10/site-packages/pip (python 3.10)
Non-user install because user site-packages disabled
Ignoring indexes: https://pypi.org/simple
Created temporary directory: /private/tmp/pip-ephem-wheel-cache-2_csw0fu
Created temporary directory: /private/tmp/pip-req-tracker-uhrx_vgy
Initialized build tracking at /private/tmp/pip-req-tracker-uhrx_vgy
Created build tracker: /private/tmp/pip-req-tracker-uhrx_vgy
Entered build tracker: /private/tmp/pip-req-tracker-uhrx_vgy
Created temporary directory: /private/tmp/pip-install-slj305ms
Processing $SRC_DIR/fidesctl
  Added file://$SRC_DIR/fidesctl to build tracker '/private/tmp/pip-req-tracker-uhrx_vgy'
  Created temporary directory: /private/tmp/pip-modern-metadata-klhfcqtl
  Preparing metadata (pyproject.toml): started
  Running command /Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh/bin/python /Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/_in_process.py prepare_metadata_for_build_wheel /tmp/tmp2rnro96f
  /Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh/lib/python3.10/distutils/dist.py:274: UserWarning: Unknown distribution option: 'dev_requires'
    warnings.warn(msg)
  running dist_info
  creating /private/tmp/pip-modern-metadata-klhfcqtl/fidesctl.egg-info
  writing /private/tmp/pip-modern-metadata-klhfcqtl/fidesctl.egg-info/PKG-INFO
  writing dependency_links to /private/tmp/pip-modern-metadata-klhfcqtl/fidesctl.egg-info/dependency_links.txt
  writing entry points to /private/tmp/pip-modern-metadata-klhfcqtl/fidesctl.egg-info/entry_points.txt
  writing requirements to /private/tmp/pip-modern-metadata-klhfcqtl/fidesctl.egg-info/requires.txt
  writing top-level names to /private/tmp/pip-modern-metadata-klhfcqtl/fidesctl.egg-info/top_level.txt
  writing manifest file '/private/tmp/pip-modern-metadata-klhfcqtl/fidesctl.egg-info/SOURCES.txt'
  reading manifest file '/private/tmp/pip-modern-metadata-klhfcqtl/fidesctl.egg-info/SOURCES.txt'
  reading manifest template 'MANIFEST.in'
  warning: no files found matching 'LICENSE'
  writing manifest file '/private/tmp/pip-modern-metadata-klhfcqtl/fidesctl.egg-info/SOURCES.txt'
  creating '/private/tmp/pip-modern-metadata-klhfcqtl/fidesctl.dist-info'
  Preparing metadata (pyproject.toml): finished with status 'done'
  Source in $SRC_DIR/fidesctl has version 1.0.0+20.gb368994, which satisfies requirement fidesctl==1.0.0+20.gb368994 from file://$SRC_DIR/fidesctl
  Removed fidesctl==1.0.0+20.gb368994 from file://$SRC_DIR/fidesctl from build tracker '/private/tmp/pip-req-tracker-uhrx_vgy'
Created temporary directory: /private/tmp/pip-unpack-rce_kfrf
Building wheels for collected packages: fidesctl
  Created temporary directory: /private/tmp/pip-wheel-cwzw1xs5
  Destination directory: /private/tmp/pip-wheel-cwzw1xs5
  Building wheel for fidesctl (pyproject.toml): started
  Running command /Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh/bin/python /Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/_in_process.py build_wheel /tmp/tmpfi3itp6w
  /Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh/lib/python3.10/distutils/dist.py:274: UserWarning: Unknown distribution option: 'dev_requires'
    warnings.warn(msg)
  running bdist_wheel
  running build
  running build_py
  creating build
  creating build/lib
  creating build/lib/fidesctl
  copying src/fidesctl/_version.py -> build/lib/fidesctl
  copying src/fidesctl/__init__.py -> build/lib/fidesctl
  creating build/lib/fidesapi
  copying src/fidesapi/database.py -> build/lib/fidesapi
  copying src/fidesapi/__init__.py -> build/lib/fidesapi
  copying src/fidesapi/sql_models.py -> build/lib/fidesapi
  copying src/fidesapi/visualize.py -> build/lib/fidesapi
  copying src/fidesapi/db_session.py -> build/lib/fidesapi
  copying src/fidesapi/errors.py -> build/lib/fidesapi
  copying src/fidesapi/main.py -> build/lib/fidesapi
  copying src/fidesapi/crud.py -> build/lib/fidesapi
  creating build/lib/fideslang
  copying src/fideslang/manifests.py -> build/lib/fideslang
  copying src/fideslang/models.py -> build/lib/fideslang
  copying src/fideslang/__init__.py -> build/lib/fideslang
  copying src/fideslang/utils.py -> build/lib/fideslang
  copying src/fideslang/default_taxonomy.py -> build/lib/fideslang
  copying src/fideslang/parse.py -> build/lib/fideslang
  copying src/fideslang/relationships.py -> build/lib/fideslang
  copying src/fideslang/validation.py -> build/lib/fideslang
  creating build/lib/fidesctl/core
  copying src/fidesctl/core/config.py -> build/lib/fidesctl/core
  copying src/fidesctl/core/generate_dataset.py -> build/lib/fidesctl/core
  copying src/fidesctl/core/__init__.py -> build/lib/fidesctl/core
  copying src/fidesctl/core/visualize.py -> build/lib/fidesctl/core
  copying src/fidesctl/core/api.py -> build/lib/fidesctl/core
  copying src/fidesctl/core/utils.py -> build/lib/fidesctl/core
  copying src/fidesctl/core/evaluate.py -> build/lib/fidesctl/core
  copying src/fidesctl/core/parse.py -> build/lib/fidesctl/core
  copying src/fidesctl/core/api_helpers.py -> build/lib/fidesctl/core
  copying src/fidesctl/core/annotate_dataset.py -> build/lib/fidesctl/core
  copying src/fidesctl/core/apply.py -> build/lib/fidesctl/core
  creating build/lib/fidesctl/cli
  copying src/fidesctl/cli/options.py -> build/lib/fidesctl/cli
  copying src/fidesctl/cli/__init__.py -> build/lib/fidesctl/cli
  copying src/fidesctl/cli/cli.py -> build/lib/fidesctl/cli
  copying src/fidesctl/cli/utils.py -> build/lib/fidesctl/cli
  creating build/lib/fidesapi/migrations
  copying src/fidesapi/migrations/env.py -> build/lib/fidesapi/migrations
  copying src/fidesapi/migrations/__init__.py -> build/lib/fidesapi/migrations
  creating build/lib/fidesapi/migrations/versions
  copying src/fidesapi/migrations/versions/26934c96ec80_initial_migration.py -> build/lib/fidesapi/migrations/versions
  copying src/fidesapi/migrations/versions/__init__.py -> build/lib/fidesapi/migrations/versions
  copying src/fidesapi/migrations/versions/732105cd54e3_update_dataset_field_name.py -> build/lib/fidesapi/migrations/versions
  copying src/fidesapi/migrations/versions/327cd266f7b3_update_dataset_depth.py -> build/lib/fidesapi/migrations/versions
  copying src/fidesapi/migrations/versions/e576b6a80a49_add_parent_key_to_dataqualifier.py -> build/lib/fidesapi/migrations/versions
  copying src/fidesapi/migrations/versions/45c7a349db68_remove_qualifier_lists_from_data_set_.py -> build/lib/fidesapi/migrations/versions
  running egg_info
  writing src/fidesctl.egg-info/PKG-INFO
  writing dependency_links to src/fidesctl.egg-info/dependency_links.txt
  writing entry points to src/fidesctl.egg-info/entry_points.txt
  writing requirements to src/fidesctl.egg-info/requires.txt
  writing top-level names to src/fidesctl.egg-info/top_level.txt
  writing manifest file 'src/fidesctl.egg-info/SOURCES.txt'
  reading manifest file 'src/fidesctl.egg-info/SOURCES.txt'
  reading manifest template 'MANIFEST.in'
  warning: no files found matching 'LICENSE'
  writing manifest file 'src/fidesctl.egg-info/SOURCES.txt'
  copying src/fidesapi/alembic.ini -> build/lib/fidesapi
  warning: cmd_build_py: byte-compiling is disabled, skipping.

  UPDATING build/lib/fidesctl/_version.py
  set build/lib/fidesctl/_version.py to '1.0.0+20.gb368994'
  installing to build/bdist.macosx-10.9-x86_64/wheel
  running install
  running install_lib
  creating build/bdist.macosx-10.9-x86_64
  creating build/bdist.macosx-10.9-x86_64/wheel
  creating build/bdist.macosx-10.9-x86_64/wheel/fidesctl
  creating build/bdist.macosx-10.9-x86_64/wheel/fidesctl/core
  copying build/lib/fidesctl/core/config.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/core
  copying build/lib/fidesctl/core/generate_dataset.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/core
  copying build/lib/fidesctl/core/__init__.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/core
  copying build/lib/fidesctl/core/visualize.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/core
  copying build/lib/fidesctl/core/api.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/core
  copying build/lib/fidesctl/core/utils.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/core
  copying build/lib/fidesctl/core/evaluate.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/core
  copying build/lib/fidesctl/core/parse.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/core
  copying build/lib/fidesctl/core/api_helpers.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/core
  copying build/lib/fidesctl/core/annotate_dataset.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/core
  copying build/lib/fidesctl/core/apply.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/core
  copying build/lib/fidesctl/_version.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl
  copying build/lib/fidesctl/__init__.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl
  creating build/bdist.macosx-10.9-x86_64/wheel/fidesctl/cli
  copying build/lib/fidesctl/cli/options.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/cli
  copying build/lib/fidesctl/cli/__init__.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/cli
  copying build/lib/fidesctl/cli/cli.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/cli
  copying build/lib/fidesctl/cli/utils.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesctl/cli
  creating build/bdist.macosx-10.9-x86_64/wheel/fidesapi
  creating build/bdist.macosx-10.9-x86_64/wheel/fidesapi/migrations
  copying build/lib/fidesapi/migrations/env.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi/migrations
  creating build/bdist.macosx-10.9-x86_64/wheel/fidesapi/migrations/versions
  copying build/lib/fidesapi/migrations/versions/26934c96ec80_initial_migration.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi/migrations/versions
  copying build/lib/fidesapi/migrations/versions/__init__.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi/migrations/versions
  copying build/lib/fidesapi/migrations/versions/732105cd54e3_update_dataset_field_name.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi/migrations/versions
  copying build/lib/fidesapi/migrations/versions/327cd266f7b3_update_dataset_depth.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi/migrations/versions
  copying build/lib/fidesapi/migrations/versions/e576b6a80a49_add_parent_key_to_dataqualifier.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi/migrations/versions
  copying build/lib/fidesapi/migrations/versions/45c7a349db68_remove_qualifier_lists_from_data_set_.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi/migrations/versions
  copying build/lib/fidesapi/migrations/__init__.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi/migrations
  copying build/lib/fidesapi/alembic.ini -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi
  copying build/lib/fidesapi/database.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi
  copying build/lib/fidesapi/__init__.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi
  copying build/lib/fidesapi/sql_models.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi
  copying build/lib/fidesapi/visualize.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi
  copying build/lib/fidesapi/db_session.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi
  copying build/lib/fidesapi/errors.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi
  copying build/lib/fidesapi/main.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi
  copying build/lib/fidesapi/crud.py -> build/bdist.macosx-10.9-x86_64/wheel/fidesapi
  creating build/bdist.macosx-10.9-x86_64/wheel/fideslang
  copying build/lib/fideslang/manifests.py -> build/bdist.macosx-10.9-x86_64/wheel/fideslang
  copying build/lib/fideslang/models.py -> build/bdist.macosx-10.9-x86_64/wheel/fideslang
  copying build/lib/fideslang/__init__.py -> build/bdist.macosx-10.9-x86_64/wheel/fideslang
  copying build/lib/fideslang/utils.py -> build/bdist.macosx-10.9-x86_64/wheel/fideslang
  copying build/lib/fideslang/default_taxonomy.py -> build/bdist.macosx-10.9-x86_64/wheel/fideslang
  copying build/lib/fideslang/parse.py -> build/bdist.macosx-10.9-x86_64/wheel/fideslang
  copying build/lib/fideslang/relationships.py -> build/bdist.macosx-10.9-x86_64/wheel/fideslang
  copying build/lib/fideslang/validation.py -> build/bdist.macosx-10.9-x86_64/wheel/fideslang
  warning: install_lib: byte-compiling is disabled, skipping.

  running install_egg_info
  Copying src/fidesctl.egg-info to build/bdist.macosx-10.9-x86_64/wheel/fidesctl-1.0.0+20.gb368994-py3.10.egg-info
  running install_scripts
  creating build/bdist.macosx-10.9-x86_64/wheel/fidesctl-1.0.0+20.gb368994.dist-info/WHEEL
  creating '/private/tmp/pip-wheel-cwzw1xs5/tmpc4tsdcrz/fidesctl-1.0.0+20.gb368994-py3-none-any.whl' and adding 'build/bdist.macosx-10.9-x86_64/wheel' to it
  adding 'fidesapi/__init__.py'
  adding 'fidesapi/alembic.ini'
  adding 'fidesapi/crud.py'
  adding 'fidesapi/database.py'
  adding 'fidesapi/db_session.py'
  adding 'fidesapi/errors.py'
  adding 'fidesapi/main.py'
  adding 'fidesapi/sql_models.py'
  adding 'fidesapi/visualize.py'
  adding 'fidesapi/migrations/__init__.py'
  adding 'fidesapi/migrations/env.py'
  adding 'fidesapi/migrations/versions/26934c96ec80_initial_migration.py'
  adding 'fidesapi/migrations/versions/327cd266f7b3_update_dataset_depth.py'
  adding 'fidesapi/migrations/versions/45c7a349db68_remove_qualifier_lists_from_data_set_.py'
  adding 'fidesapi/migrations/versions/732105cd54e3_update_dataset_field_name.py'
  adding 'fidesapi/migrations/versions/__init__.py'
  adding 'fidesapi/migrations/versions/e576b6a80a49_add_parent_key_to_dataqualifier.py'
  adding 'fidesctl/__init__.py'
  adding 'fidesctl/_version.py'
  adding 'fidesctl/cli/__init__.py'
  adding 'fidesctl/cli/cli.py'
  adding 'fidesctl/cli/options.py'
  adding 'fidesctl/cli/utils.py'
  adding 'fidesctl/core/__init__.py'
  adding 'fidesctl/core/annotate_dataset.py'
  adding 'fidesctl/core/api.py'
  adding 'fidesctl/core/api_helpers.py'
  adding 'fidesctl/core/apply.py'
  adding 'fidesctl/core/config.py'
  adding 'fidesctl/core/evaluate.py'
  adding 'fidesctl/core/generate_dataset.py'
  adding 'fidesctl/core/parse.py'
  adding 'fidesctl/core/utils.py'
  adding 'fidesctl/core/visualize.py'
  adding 'fideslang/__init__.py'
  adding 'fideslang/default_taxonomy.py'
  adding 'fideslang/manifests.py'
  adding 'fideslang/models.py'
  adding 'fideslang/parse.py'
  adding 'fideslang/relationships.py'
  adding 'fideslang/utils.py'
  adding 'fideslang/validation.py'
  adding 'fidesctl-1.0.0+20.gb368994.dist-info/METADATA'
  adding 'fidesctl-1.0.0+20.gb368994.dist-info/WHEEL'
  adding 'fidesctl-1.0.0+20.gb368994.dist-info/entry_points.txt'
  adding 'fidesctl-1.0.0+20.gb368994.dist-info/top_level.txt'
  adding 'fidesctl-1.0.0+20.gb368994.dist-info/RECORD'
  removing build/bdist.macosx-10.9-x86_64/wheel
  Building wheel for fidesctl (pyproject.toml): finished with status 'done'
  Created wheel for fidesctl: filename=fidesctl-1.0.0+20.gb368994-py3-none-any.whl size=50432 sha256=5b3eed676cf60c7683513c470eaad0c685088ad616b6d2d40853054b63f7586f
  Stored in directory: /private/tmp/pip-ephem-wheel-cache-2_csw0fu/wheels/4c/88/04/2a920e7062a7c975608bec27ebdd48e5527603773741a301aa
Successfully built fidesctl
Installing collected packages: fidesctl

  changing mode of $PREFIX/bin/fidesctl to 755
Successfully installed fidesctl-1.0.0+20.gb368994
Removed build tracker: '/private/tmp/pip-req-tracker-uhrx_vgy'

Resource usage statistics from building fidesctl:
   Process count: 3
   CPU time: Sys=0:00:00.0, User=0:00:00.0
   Memory: 49.9M
   Disk usage: 217.7K
   Time elapsed: 0:00:08.4

Packaging fidesctl
INFO:conda_build.build:Packaging fidesctl
INFO conda_build.build:build(2291): Packaging fidesctl
Packaging fidesctl-1.0.0+20.gb368994-py_0
INFO:conda_build.build:Packaging fidesctl-1.0.0+20.gb368994-py_0
INFO conda_build.build:bundle_conda(1531): Packaging fidesctl-1.0.0+20.gb368994-py_0
number of files: 51
Fixing permissions
Packaged license file/s.
INFO :: Time taken to mark (prefix)
        0 replacements in 0 files was 0.04 seconds
TEST START: ./conda-out/noarch/fidesctl-1.0.0+20.gb368994-py_0.tar.bz2
Adding in variants from /var/folders/9d/bpnbpdjd54d2nfymlsq8fkc40000gp/T/tmpywvmiemz/info/recipe/conda_build_config.yaml
INFO:conda_build.variants:Adding in variants from /var/folders/9d/bpnbpdjd54d2nfymlsq8fkc40000gp/T/tmpywvmiemz/info/recipe/conda_build_config.yaml
INFO conda_build.variants:_combine_spec_dictionaries(234): Adding in variants from /var/folders/9d/bpnbpdjd54d2nfymlsq8fkc40000gp/T/tmpywvmiemz/info/recipe/conda_build_config.yaml
Renaming work directory '/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work' to '/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work_moved_fidesctl-1.0.0+20.gb368994-py_0_noarch'
INFO:conda_build.utils:Renaming work directory '/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work' to '/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work_moved_fidesctl-1.0.0+20.gb368994-py_0_noarch'
INFO conda_build.utils:shutil_move_more_retrying(2078): Renaming work directory '/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work' to '/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work_moved_fidesctl-1.0.0+20.gb368994-py_0_noarch'
shutil.move(work)=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work, dest=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work_moved_fidesctl-1.0.0+20.gb368994-py_0_noarch)
INFO:conda_build.utils:shutil.move(work)=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work, dest=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work_moved_fidesctl-1.0.0+20.gb368994-py_0_noarch)
INFO conda_build.utils:shutil_move_more_retrying(2085): shutil.move(work)=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work, dest=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work_moved_fidesctl-1.0.0+20.gb368994-py_0_noarch)
Collecting package metadata (repodata.json): ...working... done
Solving environment: ...working... done

## Package Plan ##

  environment location: /Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/_test_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_p

The following NEW packages will be INSTALLED:

    alembic:            1.6.5-pyhd8ed1ab_0       conda-forge
    anyjson:            0.3.3-pyhd8ed1ab_1004    conda-forge
    argon2-cffi:        21.1.0-py39h89e85a6_2    conda-forge
    arrow:              1.2.1-pyhd8ed1ab_0       conda-forge
    babel:              2.9.1-pyh44b312d_0       conda-forge
    bcrypt:             3.2.0-py39h89e85a6_2     conda-forge
    brotlipy:           0.7.0-py39h89e85a6_1003  conda-forge
    ca-certificates:    2021.10.8-h033912b_0     conda-forge
    certifi:            2021.10.8-py39h6e9494a_1 conda-forge
    cffi:               1.15.0-py39he338e87_0    conda-forge
    chardet:            4.0.0-py39h6e9494a_2     conda-forge
    click:              7.1.2-pyh9f0ad1d_0       conda-forge
    colorama:           0.4.4-pyh9f0ad1d_0       conda-forge
    colour:             0.1.5-py_0               conda-forge
    cryptography:       3.4.8-py39h209aa08_1     conda-forge
    deepdiff:           5.5.0-pyhd8ed1ab_0       conda-forge
    fastapi:            0.68.1-pyhd8ed1ab_0      conda-forge
    fidesctl:           1.0.0+20.gb368994-py_0   file:///Users/eduardoarmendariz/fides/conda-out
    furl:               2.1.3-pyhd8ed1ab_0       conda-forge
    greenlet:           1.1.2-py39h9fcab8e_1     conda-forge
    idna:               2.10-pyh9f0ad1d_0        conda-forge
    importlib-metadata: 4.8.2-py39h6e9494a_0     conda-forge
    importlib_metadata: 4.8.2-hd8ed1ab_0         conda-forge
    infinity:           1.5-pyhd8ed1ab_0         conda-forge
    intervals:          0.9.2-pyhd8ed1ab_0       conda-forge
    jsonpickle:         2.0.0-pyhd8ed1ab_0       conda-forge
    krb5:               1.19.2-hcfbf3a7_3        conda-forge
    libblas:            3.9.0-12_osx64_openblas  conda-forge
    libcblas:           3.9.0-12_osx64_openblas  conda-forge
    libcxx:             12.0.1-habf9029_0        conda-forge
    libedit:            3.1.20191231-h0678c8f_2  conda-forge
    libffi:             3.4.2-h0d85af4_5         conda-forge
    libgfortran:        5.0.0-9_3_0_h6c81a4c_23  conda-forge
    libgfortran5:       9.3.0-h6c81a4c_23        conda-forge
    liblapack:          3.9.0-12_osx64_openblas  conda-forge
    libopenblas:        0.3.18-openmp_h3351f45_0 conda-forge
    libpq:              13.5-hea3049e_0          conda-forge
    libzlib:            1.2.11-h9173be1_1013     conda-forge
    llvm-openmp:        12.0.1-hda6cdc1_1        conda-forge
    mako:               1.1.6-pyhd8ed1ab_0       conda-forge
    markupsafe:         2.0.1-py39h89e85a6_1     conda-forge
    ncurses:            6.2-h2e338ed_4           conda-forge
    numpy:              1.21.4-py39h7eed0ac_0    conda-forge
    openssl:            1.1.1l-h0d85af4_0        conda-forge
    ordered-set:        4.0.2-py_0               conda-forge
    orderedmultidict:   1.0.1-py_0               conda-forge
    pandas:             1.3.3-py39h4d6be9b_0     conda-forge
    passlib:            1.7.4-pyh9f0ad1d_0       conda-forge
    pendulum:           2.1.2-pyhd8ed1ab_1       conda-forge
    phonenumbers:       8.12.37-pyhd8ed1ab_0     conda-forge
    pip:                21.3.1-pyhd8ed1ab_0      conda-forge
    plotly:             5.3.1-py_0               plotly
    psycopg2:           2.9.1-py39h9d1abf3_1     conda-forge
    psycopg2-binary:    2.9.1-pyhd8ed1ab_1       conda-forge
    pycparser:          2.21-pyhd8ed1ab_0        conda-forge
    pydantic:           1.8.2-py39h89e85a6_2     conda-forge
    pyjwt:              2.1.0-pyhd8ed1ab_0       conda-forge
    pymysql:            1.0.2-pyhd8ed1ab_0       conda-forge
    pyopenssl:          21.0.0-pyhd8ed1ab_0      conda-forge
    pysocks:            1.7.1-py39h6e9494a_4     conda-forge
    python:             3.9.7-h1248fe1_3_cpython conda-forge
    python-dateutil:    2.8.2-pyhd8ed1ab_0       conda-forge
    python-editor:      1.0.4-py_0               conda-forge
    python_abi:         3.9-2_cp39               conda-forge
    pytz:               2021.3-pyhd8ed1ab_0      conda-forge
    pytzdata:           2020.1-pyh9f0ad1d_0      conda-forge
    pyyaml:             5.4.1-py39h89e85a6_1     conda-forge
    readline:           8.1-h05e3726_0           conda-forge
    requests:           2.25.1-pyhd3deb0d_0      conda-forge
    setuptools:         59.2.0-py39h6e9494a_0    conda-forge
    six:                1.16.0-pyh6c4a22f_0      conda-forge
    sqlalchemy:         1.4.14-py39h89e85a6_0    conda-forge
    sqlalchemy-utils:   0.37.8-pyhd8ed1ab_0      conda-forge
    sqlite:             3.36.0-h23a322b_2        conda-forge
    starlette:          0.14.2-pyhd8ed1ab_0      conda-forge
    tenacity:           8.0.1-pyhd8ed1ab_0       conda-forge
    tk:                 8.6.11-h5dbffcc_1        conda-forge
    toml:               0.10.2-pyhd8ed1ab_0      conda-forge
    typing-extensions:  4.0.0-hd8ed1ab_0         conda-forge
    typing_extensions:  4.0.0-pyha770c72_0       conda-forge
    tzdata:             2021e-he74cb21_0         conda-forge
    urllib3:            1.26.7-pyhd8ed1ab_0      conda-forge
    versioneer:         0.19-pyhd8ed1ab_0        conda-forge
    wheel:              0.37.0-pyhd8ed1ab_1      conda-forge
    xz:                 5.2.5-haf1e3a3_1         conda-forge
    yaml:               0.2.5-haf1e3a3_0         conda-forge
    zipp:               3.6.0-pyhd8ed1ab_0       conda-forge
    zlib:               1.2.11-h9173be1_1013     conda-forge

Preparing transaction: ...working... done
Verifying transaction: ...working... done
Executing transaction: ...working... done
export PREFIX=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/_test_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_p
export SRC_DIR=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/test_tmp
import: 'fidesctl'
import: 'fidesctl'
+ fidesctl --help
Usage: fidesctl [OPTIONS] COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]...

  The parent group for the Fidesctl CLI.

Options:
  --version               Show the version and exit.
  -f, --config-path TEXT  Optional configuration file
  --local                 Do not make any API calls to the webserver.
  -h, --help              Show this message and exit.
+ exit 0

Resource usage statistics from testing fidesctl:
   Process count: 4
   CPU time: Sys=0:00:00.0, User=0:00:00.0
   Memory: 61.2M
   Disk usage: 40B
   Time elapsed: 0:00:18.3

TEST END: ./conda-out/noarch/fidesctl-1.0.0+20.gb368994-py_0.tar.bz2
Renaming work directory '/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work' to '/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work_moved_fidesctl-1.0.0+20.gb368994-py_0_osx-64_main_build_loop'
INFO:conda_build.utils:Renaming work directory '/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work' to '/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work_moved_fidesctl-1.0.0+20.gb368994-py_0_osx-64_main_build_loop'
INFO conda_build.utils:shutil_move_more_retrying(2078): Renaming work directory '/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work' to '/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work_moved_fidesctl-1.0.0+20.gb368994-py_0_osx-64_main_build_loop'
shutil.move(work)=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work, dest=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work_moved_fidesctl-1.0.0+20.gb368994-py_0_osx-64_main_build_loop)
INFO:conda_build.utils:shutil.move(work)=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work, dest=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work_moved_fidesctl-1.0.0+20.gb368994-py_0_osx-64_main_build_loop)
INFO conda_build.utils:shutil_move_more_retrying(2085): shutil.move(work)=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work, dest=/Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1637765131880/work_moved_fidesctl-1.0.0+20.gb368994-py_0_osx-64_main_build_loop)
# Automatic uploading is disabled
# If you want to upload package(s) to anaconda.org later, type:

# To have conda build upload to anaconda.org automatically, use
# conda config --set anaconda_upload yes
anaconda upload \
    ./conda-out/noarch/fidesctl-1.0.0+20.gb368994-py_0.tar.bz2
anaconda_upload is not set.  Not uploading wheels: []

INFO :: The inputs making up the hashes for the built packages are as follows:
{
  "fidesctl-1.0.0+20.gb368994-py_0": {
    "recipe": {}
  }
}

####################################################################################
Resource usage summary:

Total time: 0:03:13.7
CPU usage: sys=0:00:00.0, user=0:00:00.0
Maximum memory usage observed: 61.2M
Total disk usage observed (not including envs): 217.7K

####################################################################################

This build seems to run fidesctl --test so I think this means that we have a working cli(?)

Side note, to test metadata output you can run the following:
conda render ./fidesctl/conda/

After the build succeeds we can upload our package to conda. This required we create an account. For now this is under a personal account and channel "areduard"
anaconda -t "<TOKEN>" upload -u areduard ./conda-out/noarch/*.tar.bz2
Which succeeds with this output:
Using Anaconda API: https://api.anaconda.org
Using "areduard" as upload username
Processing './conda-out/noarch/fidesctl-1.0.0+20.gb368994-py_0.tar.bz2'
Detecting file type...
File type is "conda"
Extracting conda package attributes for upload
Creating package "fidesctl"
Creating release "1.0.0+20.gb368994"
Uploading file "areduard/fidesctl/1.0.0+20.gb368994/noarch/fidesctl-1.0.0+20.gb368994-py_0.tar.bz2"
 uploaded 49 of 49Kb: 100.00% ETA: 0.0 minutes
Upload complete

conda package located at:
https://anaconda.org/areduard/fidesctl

You can see the package here now - https://anaconda.org/areduard/fidesctl

Going to create the Ethyca anaconda account and also integrate with github actions. This should be pretty straightforward and not time consuming. Should be able to use conda with the following action - https://github.com/marketplace/actions/setup-miniconda

Here is our package under the ethyca acount: https://anaconda.org/ethyca/fidesctl
Command used:
anaconda -t "<TOKEN>" upload -u ethyca ./conda-out/noarch/fidesctl*.bz2

Also created a new github token with this secret as CONDA_TOKEN

20 commits later got the CI upload to work. Was just an issue with not defining the shell to use. You can see that this commit uploaded a build here - https://anaconda.org/ethyca/fidesctl/files as noarch/fidesctl-0+untagged.1.g6088bce-py_0.tar.bz2
When we are ready to push this we just have to uncomment here and remove the PR part
# on:
#   push:
#     tags:
#       - "*"
on:
  pull_request:
    branches:
      - main
    paths:
      - "*"

This technically has been tested by the conda build as it runs fidesctl --help in a new environment:
+ fidesctl --help
+ exit 0
INFO:conda_build.utils:Renaming work directory '/usr/share/miniconda/conda-bld/fidesctl_1637798836201/work' to '/usr/share/miniconda/conda-bld/fidesctl_1637798836201/work_moved_fidesctl-0+untagged.1.g6088bce-py_0_linux-64_main_build_loop'
export PREFIX=/usr/share/miniconda/conda-bld/fidesctl_1637798836201/_test_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold
INFO conda_build.utils:shutil_move_more_retrying(2091): Renaming work directory '/usr/share/miniconda/conda-bld/fidesctl_1637798836201/work' to '/usr/share/miniconda/conda-bld/fidesctl_1637798836201/work_moved_fidesctl-0+untagged.1.g6088bce-py_0_linux-64_main_build_loop'
export SRC_DIR=/usr/share/miniconda/conda-bld/fidesctl_1637798836201/test_tmp
INFO:conda_build.utils:shutil.move(work)=/usr/share/miniconda/conda-bld/fidesctl_1637798836201/work, dest=/usr/share/miniconda/conda-bld/fidesctl_1637798836201/work_moved_fidesctl-0+untagged.1.g6088bce-py_0_linux-64_main_build_loop)
import: 'fidesctl'
INFO conda_build.utils:shutil_move_more_retrying(2098): shutil.move(work)=/usr/share/miniconda/conda-bld/fidesctl_1637798836201/work, dest=/usr/share/miniconda/conda-bld/fidesctl_1637798836201/work_moved_fidesctl-0+untagged.1.g6088bce-py_0_linux-64_main_build_loop)
import: 'fidesctl'
Usage: fidesctl [OPTIONS] COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]...

  The parent group for the Fidesctl CLI.

Options:
  --version               Show the version and exit.
  -f, --config-path TEXT  Optional configuration file
  --local                 Do not make any API calls to the webserver.
  -h, --help              Show this message and exit.

I just haven't had that much luck doing my own manual testing yet

I've tried installing fidesctl through conda from different machines and it seems to be painfully slow. Similar to what is reported here:
https://github.com/conda/conda/issues/10034
conda install -c ethyca fidesctl -c plotly -c conda-forge
I am not sure if this is normal for a new conda environment but this could use some more research. Unless I am missing something really simple here. Going to change some conda configs to test this out

https://github.com/conda/conda/issues/9608

There seems to be alot of issues around this. Lots of good comments in this issue - https://github.com/conda/conda/issues/9367
I'm guessing part of the problem is using conda-forge as a channel, but that's where alot of our dependencies are hosted.
A couple more really interesting reads about this:
https://www.anaconda.com/blog/understanding-and-improving-condas-performance
https://wolfv.medium.com/making-conda-fast-again-4da4debfb3b7

@earmenda can you leave a note here about difficulties with the optional dependencies?

judging by this, it seems like conda doesn't have the concept of optional deps 🤔
https://stackoverflow.com/questions/47445426/conda-keeps-trying-to-install-all-optional-dependencies
so we need to try to make it just install them all by default?

I was able to get around the slow install times by just creating a new environment. Not sure I understand what's going on there yet with conda but I was able to test the package now.
You can see that conda sets the PATH so that my environment's fidesctl is used:
(test_conda) eduardoarmendariz@eth-27s-mbp ~ % where fidesctl
/Users/eduardoarmendariz/opt/anaconda3/envs/test_conda/bin/fidesctl
/opt/homebrew/bin/fidesctl

I am able to execute evaluations:
(test_conda) eduardoarmendariz@eth-27s-mbp ~ % fidesctl evaluate /Users/eduardoarmendariz/fides/fidesctl/demo_resources
Loading resource manifests from: /Users/eduardoarmendariz/fides/fidesctl/demo_resources
Taxonomy successfully created.
----------
Processing dataset resources...
CREATED 0 dataset resources.
UPDATED 0 dataset resources.
SKIPPED 1 dataset resources.
----------
Processing registry resources...
CREATED 0 registry resources.
UPDATED 0 registry resources.
SKIPPED 1 registry resources.
----------
Processing policy resources...
CREATED 0 policy resources.
UPDATED 0 policy resources.
SKIPPED 1 policy resources.
----------
Processing system resources...
CREATED 0 system resources.
UPDATED 0 system resources.
SKIPPED 2 system resources.
----------
Loading resource manifests from: /Users/eduardoarmendariz/fides/fidesctl/demo_resources
Taxonomy successfully created.
Evaluating the following Policies:
- demo_privacy_policy
----------
Checking for missing resources...
Executing Policy evaluation(s)...
Sending the evaluation results to the server...
Evaluation passed!

Seeing issues with the webserver packages though:
(test_conda) eduardoarmendariz@eth-27s-mbp ~ % fidesctl  webserver
Packages not found, try: pip install "fidesctl[webserver]"

Like Thomas mentioned, this is one of those optional dependencies we allow users to install separately but conda does not support that. I'm pretty sure I included this in our conda build though:
requirements:
  host:
    - pip
    - python >=3.7, <4
  run:
    - python >=3.7, <4
    {% for package in data.get('install_requires') %}
    - {{ package }}
    {% endfor %}
    {% for package in data.get('extras_require')['all'] %}
    - {{ package }}
    {% endfor %}

This post was a good read for understanding how conda environments work:
https://stackoverflow.com/questions/43405601/isolated-virtual-environment-using-conda?rq=1

This is what our rendered yaml looks like:
(base) eduardoarmendariz@eth-27s-mbp fides % conda render ./fidesctl/conda
--------------
Hash contents:
--------------
{}
----------
meta.yaml:
----------
package:
  name: fidesctl
  version: 1.0.0+37.g04e467d.dirty
source:
  path: /Users/eduardoarmendariz/fides
build:
  entry_points:
    - fidesctl=fidesctl.cli:cli
  noarch: python
  number: '0'
  script: 'cd fidesctl

    /Users/eduardoarmendariz/opt/anaconda3/conda-bld/fidesctl_1638254106041/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeh/bin/python
    -m pip install . -vv

    '
requirements:
  host:
    - bzip2 1.0.8 h0d85af4_4
    - ca-certificates 2021.10.8 h033912b_0
    - libffi 3.4.2 h0d85af4_5
    - libzlib 1.2.11 h9173be1_1013
    - ncurses 6.2 h2e338ed_4
    - tzdata 2021e he74cb21_0
    - xz 5.2.5 haf1e3a3_1
    - openssl 3.0.0 h0d85af4_2
    - readline 8.1 h05e3726_0
    - zlib 1.2.11 h9173be1_1013
    - sqlite 3.37.0 h23a322b_0
    - tk 8.6.11 h5dbffcc_1
    - python 3.10.0 h38b4d05_3_cpython
    - python_abi 3.10 2_cp310
    - wheel 0.37.0 pyhd8ed1ab_1
    - setuptools 59.4.0 py310h2ec42d9_0
    - pip 21.3.1 pyhd8ed1ab_0
  run:
    - pyyaml==5.4.1
    - python >=3.7, <4
    - toml==0.10.2
    - psycopg2-binary==2.9.1
    - PyJWT==2.1.0
    - plotly==5.3.1
    - colorama==0.4.4
    - versioneer==0.19
    - deepdiff==5.5.0
    - fastapi[all]==0.68.1
    - pandas==1.3.3
    - pydantic==1.8.2
    - requests==2.25.1
    - click==7.1.2
    - SQLAlchemy-Utils==0.37.8
    - alembic==1.6.5
    - sqlalchemy==1.4.14
    - pymysql==1.0.2
test:
  commands:
    - fidesctl --help
  imports:
    - fidesctl
about:
  description: '# Fidesctl

    Fidesctl is the CLI component of the Fides application. '
  doc_url: https://ethyca.github.io/fides/
  home: https://github.com/ethyca/fides
  license: Apache License 2.0
  license_family: APACHE
  license_file: LICENSE
  summary: CLI for Fides
extra:
  copy_test_source_files: true
  final: true

The interesting part being that the run requirements block has the dependencies we need:
  run:
...
    - psycopg2-binary==2.9.1
...
    - fastapi[all]==0.68.1
...

Actual stack trace:
(test_conda) eduardoarmendariz@eth-27s-mbp ~ % /Users/eduardoarmendariz/opt/anaconda3/envs/test_conda/bin/fidesctl webserver
Traceback (most recent call last):
  File "/Users/eduardoarmendariz/opt/anaconda3/envs/test_conda/lib/python3.9/site-packages/fidesctl/cli/cli.py", line 333, in webserver
    from fidesapi.main import start_webserver
  File "/Users/eduardoarmendariz/opt/anaconda3/envs/test_conda/lib/python3.9/site-packages/fidesapi/main.py", line 8, in <module>
    import uvicorn
ModuleNotFoundError: No module named 'uvicorn'
Packages not found, try: pip install "fidesctl[webserver]"(test_conda) eduardoarmendariz@eth-27s-mbp ~ % /Users/eduardoarmendariz/opt/anaconda3/envs/test_conda/bin/fidesctl webserver
Traceback (most recent call last):
  File "/Users/eduardoarmendariz/opt/anaconda3/envs/test_conda/lib/python3.9/site-packages/fidesctl/cli/cli.py", line 333, in webserver
    from fidesapi.main import start_webserver
  File "/Users/eduardoarmendariz/opt/anaconda3/envs/test_conda/lib/python3.9/site-packages/fidesapi/main.py", line 8, in <module>
    import uvicorn
ModuleNotFoundError: No module named 'uvicorn'
Packages not found, try: pip install "fidesctl[webserver]"

I added the following to the run requirements and it looks like it resolved the issue:
    - uvicorn==0.15.0

To me this seems like just a difference between pypi and conda.
In the pypi documentation is see the following for installing optional dependencies:
You can install all of these with pip install "fastapi[all]".

But with conda there's nothing really like that in the documentation.
My guess here is that the conda dist just doesn't support installing these dependencies optionally. I can't really find any documentation or examples that would make me think otherwise.
@ThomasLaPiana Based on this I feel we have two options:

Explicitly declare these dependencies in our pypi setup.py rather than using [all]. The reason to consider this is so that there isn't two places where we declare dependency requirements.
Explicitly declare these dependencies in our conda meta.yaml under run requirements. The reason to consider this is so that we don't have to be explicit about our pypi dependencies where we don't have to.

Thoughts?

@earmenda can you clarify on option 1?
I definitely don't want to lose the ability to have optional dependencies, and PyPI is our main priority, I don't want to lose functionality there for the sake of making the conda build easier. I'd lean towards just having conda install everything by default, but I might be misunderstanding what your solution is for #1

Sure let me clarify a little bit. Both options would still enable optional dependencies from the fidesctl prespective just to be clear(at least for pypi). The issue is that using fastapi[all] in conda does not bring in optional dependencies like it does for pypi.
Option 1
Add fastapi optional dependencies explicitly to our optional dependencies in pypi. Here is what that would look like:
extras = {
    "postgres": ["psycopg2-binary==2.9.1"],
    "mysql": ["pymysql==1.0.2"],
    "webserver": ["fastapi[all]==0.68.1", "psycopg2-binary==2.9.1", "uvicorn==0.15.0"],
}

In this case we added uvicorn explicitly to the pypi setup.py file. But it is still an optional dependency, we just dont rely on the benefit of using fastapi[all]. I would argue we should just change this to fastapi to be consistent in both disttributions. The reason this works for conda is because we are taking the dependencies from extras in the conda meta.yaml.
Option 2
Add fastapi optional dependencies explicitly to our conda meta.yaml.
  run:
    - python >=3.7, <4
    {% for package in data.get('install_requires') %}
    - {{ package }}
    {% endfor %}
    {% for package in data.get('extras_require')['all'] %}
    - {{ package }}
    {% endfor %}
    - uvicorn==0.15.0

In this case we added uvicorn explicitly to the conda configuration. I don't like this as much because we have to maintain a dependency in two places.

Used by Pydantic:
ujson - for faster JSON "parsing".
email_validator - for email validation.
Used by Starlette:
requests - Required if you want to use the TestClient.
jinja2 - Required if you want to use the default template configuration.
python-multipart - Required if you want to support form "parsing", with request.form().
itsdangerous - Required for SessionMiddleware support.
pyyaml - Required for Starlette's SchemaGenerator support (you probably don't need it with FastAPI).
ujson - Required if you want to use UJSONResponse.
Used by FastAPI / Starlette:
uvicorn - for the server that loads and serves your application.
orjson - Required if you want to use ORJSONResponse.
You can install all of these with pip install "fastapi[all]"

Since we are using [all] we might also need to explicitly add some of these other dependencies. Hopefully this makes things clearer.

Used by Pydantic:
ujson - for faster JSON "parsing".
email_validator - for email validation.
Used by Starlette:
requests - Required if you want to use the TestClient.
jinja2 - Required if you want to use the default template configuration.
python-multipart - Required if you want to support form "parsing", with request.form().
itsdangerous - Required for SessionMiddleware support.
pyyaml - Required for Starlette's SchemaGenerator support (you probably don't need it with FastAPI).
ujson - Required if you want to use UJSONResponse.
Used by FastAPI / Starlette:
uvicorn - for the server that loads and serves your application.
orjson - Required if you want to use ORJSONResponse.
You can install all of these with pip install "fastapi[all]"

Since we are using [all] we might also need to explicitly add some of these other dependencies. Hopefully this makes things clearer.

ok, this makes sense, let's go with option 1. this will also allow us to slim down our own fastapi installation a bit too. Let's figure out the bare minimum we need to run fastapi in our current configuration and go with that, so we're not doing fastapi[all]

I was able to run all unit and integration tests with the updated setup.py by just adding uvicorn. This gives me confidence that we don't need any of the other optional dependencies.
Also did a good amount of manual testing by installing a pgsql instance locally and running a server against it using the conda installed fidesctl.
(test_conda) eduardoarmendariz@eth-27s-mbp test_conda % fidesctl webserver
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade  -> 26934c96ec80, initial migration
INFO  [alembic.runtime.migration] Running upgrade 26934c96ec80 -> 327cd266f7b3, update dataset depth
INFO  [alembic.runtime.migration] Running upgrade 327cd266f7b3 -> e576b6a80a49, add parent_key to DataQualifier
INFO  [alembic.runtime.migration] Running upgrade e576b6a80a49 -> 732105cd54e3, update dataset field name
INFO  [alembic.runtime.migration] Running upgrade 732105cd54e3 -> 45c7a349db68, Remove qualifier lists from data set models
UPSERTING the default fideslang taxonomy
----------
Processing data_subject resources...
UPSERTED 15 data_subject resources.
----------
Processing data_qualifier resources...
UPSERTED 5 data_qualifier resources.
----------
Processing data_use resources...
UPSERTED 23 data_use resources.
----------
Processing data_category resources...
UPSERTED 77 data_category resources.
----------
Processing organization resources...
UPSERTED 1 organization resources.
----------

Running evaluation against this server also looks good
(test_conda) eduardoarmendariz@eth-27s-mbp test_conda % fidesctl evaluate ~/fides/fidesctl/demo_resources
Loading resource manifests from: /Users/eduardoarmendariz/fides/fidesctl/demo_resources
Taxonomy successfully created.
----------
Processing system resources...
CREATED 2 system resources.
UPDATED 0 system resources.
SKIPPED 0 system resources.
----------
Processing registry resources...
CREATED 1 registry resources.
UPDATED 0 registry resources.
SKIPPED 0 registry resources.
----------
Processing dataset resources...
CREATED 1 dataset resources.
UPDATED 0 dataset resources.
SKIPPED 0 dataset resources.
----------
Processing policy resources...
CREATED 1 policy resources.
UPDATED 0 policy resources.
SKIPPED 0 policy resources.
----------
Loading resource manifests from: /Users/eduardoarmendariz/fides/fidesctl/demo_resources
Taxonomy successfully created.
Evaluating the following Policies:
- demo_privacy_policy
----------
Checking for missing resources...
Executing Policy evaluation(s)...
Sending the evaluation results to the server...
Evaluation passed!

Just going to update documentation then I will publish this draft

Updated documentation so this should be ready for review, will just add some comments on areas I think could use some extra attention.


Add Scroll Bar (Vertical) and Scroll-to-Top Button to Website

Hi @Priyaaa1
I've noticed that the website is missing a vertical scroll bar allowing users to scroll up and down as needed.
Additionally, implementing a scroll-to-top button can enhance user experience by providing a convenient way for users to quickly return to the top of the page.
Benefits of adding a scroll bar and scroll-to-top button,

Improved User Experience.
Enhanced Accessibility.
A vertical scroll bar and scroll-to-top button demonstrates attention to detail.
These features contribute to a positive first impression of the website.

As a GGSoC'24 contributor I'd like to take on the task, Could you please assign this project to me so I can start working on it?

Hey there, @Priyaaa1 ,
I've noticed an opportunity to improve the website's usability by adding an interactive eye-catching custom vertical scroll bar and a scroll-to-top button, matching your UI . These features are essential for enhancing user navigation and overall experience on the site.
As a contributor to GGSoC'24, I'm eager to take on this task and contribute to the project's success. Could you please assign this issue to me so that I can begin working on it?


added reporting of sdkVersion

The sdkverion gets reported to analytics in the metadata header

Could you add this new metadata to the testGenerateOutboundRequestMetadata unit test? By the way, you can make that function a computed property. No need for getter/setter functions in Swift :-)
I noticed that the Travis CI build on this commit failed. I checked and found that it's failing because of the unit test_testPreventSimultaneousSendRequests_, which I don't think it has anything to do with this commit.


feat: laravel pulse card request

Someone to create a pulse card for it

https://github.com/schmeits/pulse-panphp :) have fun!!

https://github.com/schmeits/pulse-panphp :) have fun!!

That amazing.. @schmeits  🫡


Feature/set dialog labels via options

In certain scenarios I need to set the labels of the dialogs after the config phase (e.g. the language has been changed by the user).
To achieve this, I've added the ability to set the label though the options passed to $mdpDatePicker and $mdpTimePicker.

Maybe a duplicate of #97?


Fixed the non deterministic test testSerdeWithInputFormat

Fixed a non deterministic test in org.apache.druid.indexing.kafka.supervisor.KafkaSupervisorSpecTest.testSerdeWithInputFormat

Steps to reproduce
To reproduce the problem, first build the module kafka-indexing-service:

mvn install -pl extensions-core/kafka-indexing-service -am -DskipTests

Then, run the regular test:

mvn -pl extensions-core/kafka-indexing-service test -Dtest=org.apache.druid.indexing.kafka.supervisor.KafkaSupervisorSpecTest#testSerdeWithInputFormat

To identify the flaky test, execute the following nondex command:

mvn -pl extensions-core/kafka-indexing-service edu.illinois:nondex-maven-plugin:2.1.7:nondex -Dtest=org.apache.druid.indexing.kafka.supervisor.KafkaSupervisorSpecTest#testSerdeWithInputFormat

Description
The testSerdeWithInputFormat was producing non-deterministic output because the JSON object used in the test did not include a parser that enforced a specific order, unlike other tests. Due to the inherent non-deterministic nature of JSON serialization, this resulted in inconsistent outputs. The dimension spec array gave non deterministic order on different runs as follow-
expected: "dimensionExclusions":["__time","value_max","count","value_min","value_sum","value]","timestamp"]
actual: "dimensionExclusions":["value_sum","value","count","__time","value_min","value_max]","timestamp"] .
The fix involves adding a parser to the JSON like the other tests to ensure a consistent order.

This PR has:

[x] been self-reviewed.
[ ] added documentation for new or modified features or behaviors.
[ ] a release note entry in the PR description.
[ ] added Javadocs for most classes and all non-trivial methods. Linked related entities via Javadoc links.
[ ] added or updated version, license, or notice information in licenses.yaml
[ ] added comments explaining the "why" and the intent of the code wherever would not be obvious for an unfamiliar reader.
[ ] added unit tests or modified existing tests to cover new code paths, ensuring the threshold for code coverage is met.
[ ] added integration tests.
[ ] been tested in a test Druid cluster.

Initially, I had resolved the issue by sorting the contents of the JSON. However, since the ordering of elements is important, I later updated the solution to align with how other tests handled ordering. The parser we were using provided a deterministic order, which ensured the test passed.
Now that the parser is deprecated, one possible solution could be to avoid relying on string equality for comparisons and instead perform a direct JSON comparison. What is your opinion on this one?


Fixing tslint for DT, adding custom rules and other cleanup

@andy-ms can you review as well please

Could you provide some instructions on testing this with a DefinitelyTyped checkout? It doesn't seem to be part of the suite run by dt --changes.

:+1:

Thanks for the review @andy-ms. Merging this.


adding contribute page on website.

This will add contribute page with following content:

Contributor workflow
Your First Contribution (to fulfill CNCF assessment criteria)
DCO
TUF Repositories
Slack channel
Mailing list
Community meeting
Gvernance

@joshuagl As per this discussion, I've created contributing page that will resolve #49. This contributing page is based on CNCF assessment criteria. PTAL and provide your feedback.
Thank you!

@trishankatdatadog I think we should give link of contributing.md files too on contributing page, WYT? If you like, I will add contributing.md file for this repo, as python-tud already have CONTRIBUTING.md

@trishankatdatadog I think we should give link of contributing.md files too on contributing page, WYT? If you like, I will add contributing.md file for this repo, as python-tud already have CONTRIBUTING.md

@joshuagl @mnm678 WDYT?


Deprecate transmission container

qbittorrent or even rtorrent is superior in every way, I'm not interested in maintaining this anymore. Some is free to fork my repo and keep it active if they choose.

Done in https://github.com/onedr0p/containers/commit/ed0e6d1a0feafeaac3387fd7d1444c83f6c5258f


[WIP] Testing ci for ci don't merge

Still running 💛

🚎 :trollface:

Seesh, these tests take for-ev-er

It's green 🍏

CI server still having issues staying up. Will check it out soon


build($webpack $compile): webpack optimizations, eslint airbnb, stylelint, and prettier

webpack cleanup including multithreading (happypack)
airbnb eslint config and integration
babel stage-3 integration
prettier formatter with eslint/stylelint integration
stylelint integration

Deploy preview for fcccolumbus processing.
Built with commit cc768f64fa44bdab4b378b96035882e9b0b0df2b
https://app.netlify.com/sites/fcccolumbus/deploys/5a7bde340b79b73af8631fbf

Coverage decreased (-1.8%) to 68.75% when pulling 605ef3c40705542f42e74c901a3226be5710b35c on jwoo92:dev into f6ecadb3973c670383109d432307ec8b91354dfa on FCCColumbus:dev.

The production build works fine locally, however it seems I am experiencing build issues within Netlify. I have read a few people experiencing a yarn bug related to phantomJS and Linux platforms, but can not say for certain if that is right direction yet. That is where I am at on the build error for now and I will look more into this tonight.

I attempted to do an npm install and got this error
```

⚠ The /home/daniel/Development/F3C_Website/node_modules/mozjpeg/vendor/cjpeg binary doesn't seem to work correctly
⚠ mozjpeg pre-build test failed
ℹ compiling from source
✖ Error: autoreconf -fiv && ./configure --disable-shared --disable-dependency-tracking --with-jpeg8  --prefix="/home/daniel/Development/F3C_Website/node_modules/mozjpeg/vendor" --bindir="/home/daniel/Development/F3C_Website/node_modules/mozjpeg/vendor" --libdir="/home/daniel/Development/F3C_Website/node_modules/mozjpeg/vendor" && make -j2 && make install -j2
Command failed: ./configure --disable-shared --disable-dependency-tracking --with-jpeg8  --prefix="/home/daniel/Development/F3C_Website/node_modules/mozjpeg/vendor" --bindir="/home/daniel/Development/F3C_Website/node_modules/mozjpeg/vendor" --libdir="/home/daniel/Development/F3C_Website/node_modules/mozjpeg/vendor"
configure: error: no nasm (Netwide Assembler) found
at ChildProcess.exithandler (child_process.js:275:12)
at emitTwo (events.js:126:13)
at ChildProcess.emit (events.js:214:7)
at maybeClose (internal/child_process.js:925:16)
at Socket.stream.socket.on (internal/child_process.js:346:11)
at emitOne (events.js:116:13)
at Socket.emit (events.js:211:7)
at Pipe._handle.close [as _onclose] (net.js:554:12)

This is from an Ubuntu 16.04 operating system

The quick fix I found was installing these dependencies, removing node_modules, and then doing a yarn or npm install

`sudo apt-get install autoconf libtool nasm`

Does this solve the Netlify issue? Not sure.

The complie time for me was a tad longer than 5 seconds. Maybe about 12 seconds.

@DanStockham I just retried the build and it worked just fine. It must of been on Netlify's end. The built time will vary depending on the computer specs its being developed on. I will need to check for merge issues now given the difference in time-frame before merging this though.


allow overriding emoji support detection

In my fork of Pinafore (which you used emoji-picker-element in) I've implemented a polyfill for unsupported Unicode emojis, which is working great, but I can't insert them with the picker. Ideally I'd be able to pass in a function overriding the default detector and a function that's called with a reference to newly-rendered emojis. Would you be open to a PR implementing this?

Actually I decided I'm going to use color fonts instead of images, so I don't need this, but it still seems wasteful to do detection multiple times.

Yeah I had started doing some work on #82 (custom fonts) which would imply that you can disable detection entirely. However I have not yet finished that work.
It seems to me that this issue is a duplicate of #82?

Yeah, I guess it is now.


apple tv scripts going nuts

Make sure you are running the latest version of Home Assistant before reporting an issue.
You should only file an issue if you found a bug. Feature and enhancement requests should go in the Feature Requests section of our community forum:
Home Assistant release (hass --version): 38.2
Python release (python3 --version): latest
Component/platform: media player / plex /apple tv
Description of problem:
I have a scipt that sets lighting when the plex media player (apple TV in this case) changes states ie playing / paused stopped
since the latest upgrade from 27.x to 28.2 I have 2 apple TV's showing up  ... a Dark Blue banner apple TV and a light blue apple TV...  I am assuming one is discovered as a plex player and the other (dark blue) is pickud up under discovery as the acutal apple TV ... I have not changed by yaml for the new apple TV login
when plex starts or stops the lights go into disco mode.. probably conflicting seeeing the plex apple tv going to Play but the new apple TV staying in paused or unknown state?
any ideas how to fix this...
thanks
here are some error logs from last night
17-02-14 20:57:44 WARNING (MainThread) [homeassistant.components.sensor.template] Could not render template Battery Level, the state is unknown.
17-02-14 20:57:44 WARNING (MainThread) [homeassistant.components.sensor.template] Could not render template Battery Level, the state is unknown.
17-02-14 20:57:44 WARNING (MainThread) [homeassistant.components.sensor.template] Could not render template Battery Level, the state is unknown.
17-02-14 21:59:56 ERROR (Thread-11) [homeassistant.components.recorder] Error during query: (sqlite3.OperationalError) database is locked
17-02-14 22:00:01 ERROR (Thread-11) [homeassistant.components.recorder] Error during query: (sqlite3.OperationalError) database is locked
17-02-14 22:00:10 ERROR (Thread-11) [homeassistant.components.recorder] Error during query: (sqlite3.OperationalError) database is locked
17-02-14 22:02:50 WARNING (MainThread) [homeassistant.core] Unable to find service scene/turn_off
17-02-15 02:09:40 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/tasks.py", line 241, in _step
result = coro.throw(exc)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity_component.py", line 387, in _update_entity_states
yield from update_coro
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity.py", line 209, in async_update_ha_state
yield from self.hass.loop.run_in_executor(None, self.update)
File "/usr/lib/python3.5/asyncio/futures.py", line 361, in iter
yield self  # This tells Task to wait for completion.
File "/usr/lib/python3.5/asyncio/tasks.py", line 296, in _wakeup
future.result()
File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 246, in update
self.update_devices(no_throttle=True)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 123, in update_devices
devices = plexserver.clients()
File "/home/openflixr/.homeassistant/deps/plexapi/server.py", line 65, in clients
baseurl = 'http://%s:%s' % (elem.attrib['address'], elem.attrib['port'])
KeyError: 'port'
17-02-15 02:09:51 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/tasks.py", line 241, in _step
result = coro.throw(exc)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity_component.py", line 387, in _update_entity_states
yield from update_coro
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity.py", line 209, in async_update_ha_state
yield from self.hass.loop.run_in_executor(None, self.update)
File "/usr/lib/python3.5/asyncio/futures.py", line 361, in iter
yield self  # This tells Task to wait for completion.
File "/usr/lib/python3.5/asyncio/tasks.py", line 296, in _wakeup
future.result()
File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 246, in update
self.update_devices(no_throttle=True)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 123, in update_devices
devices = plexserver.clients()
File "/home/openflixr/.homeassistant/deps/plexapi/server.py", line 65, in clients
baseurl = 'http://%s:%s' % (elem.attrib['address'], elem.attrib['port'])
KeyError: 'port'
17-02-15 02:10:02 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/tasks.py", line 241, in _step
result = coro.throw(exc)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity_component.py", line 387, in _update_entity_states
yield from update_coro
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity.py", line 209, in async_update_ha_state
yield from self.hass.loop.run_in_executor(None, self.update)
File "/usr/lib/python3.5/asyncio/futures.py", line 361, in iter
yield self  # This tells Task to wait for completion.
File "/usr/lib/python3.5/asyncio/tasks.py", line 296, in _wakeup
future.result()
File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 246, in update
self.update_devices(no_throttle=True)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 123, in update_devices
devices = plexserver.clients()
File "/home/openflixr/.homeassistant/deps/plexapi/server.py", line 65, in clients
baseurl = 'http://%s:%s' % (elem.attrib['address'], elem.attrib['port'])
KeyError: 'port'
17-02-15 02:10:13 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/tasks.py", line 241, in _step
result = coro.throw(exc)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity_component.py", line 387, in _update_entity_states
yield from update_coro
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity.py", line 209, in async_update_ha_state
yield from self.hass.loop.run_in_executor(None, self.update)
File "/usr/lib/python3.5/asyncio/futures.py", line 361, in iter
yield self  # This tells Task to wait for completion.
File "/usr/lib/python3.5/asyncio/tasks.py", line 296, in _wakeup
future.result()
File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 246, in update
self.update_devices(no_throttle=True)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 123, in update_devices
devices = plexserver.clients()
File "/home/openflixr/.homeassistant/deps/plexapi/server.py", line 65, in clients
baseurl = 'http://%s:%s' % (elem.attrib['address'], elem.attrib['port'])
KeyError: 'port'
17-02-15 02:10:24 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/tasks.py", line 241, in _step
result = coro.throw(exc)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity_component.py", line 387, in _update_entity_states
yield from update_coro
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity.py", line 209, in async_update_ha_state
yield from self.hass.loop.run_in_executor(None, self.update)
File "/usr/lib/python3.5/asyncio/futures.py", line 361, in iter
yield self  # This tells Task to wait for completion.
File "/usr/lib/python3.5/asyncio/tasks.py", line 296, in _wakeup
future.result()
File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 246, in update
self.update_devices(no_throttle=True)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 123, in update_devices
devices = plexserver.clients()
File "/home/openflixr/.homeassistant/deps/plexapi/server.py", line 65, in clients
baseurl = 'http://%s:%s' % (elem.attrib['address'], elem.attrib['port'])
KeyError: 'port'
17-02-15 02:10:35 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/tasks.py", line 241, in _step
result = coro.throw(exc)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity_component.py", line 387, in _update_entity_states
yield from update_coro
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity.py", line 209, in async_update_ha_state
yield from self.hass.loop.run_in_executor(None, self.update)
File "/usr/lib/python3.5/asyncio/futures.py", line 361, in iter
yield self  # This tells Task to wait for completion.
File "/usr/lib/python3.5/asyncio/tasks.py", line 296, in _wakeup
future.result()
File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 246, in update
self.update_devices(no_throttle=True)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 123, in update_devices
devices = plexserver.clients()
File "/home/openflixr/.homeassistant/deps/plexapi/server.py", line 65, in clients
baseurl = 'http://%s:%s' % (elem.attrib['address'], elem.attrib['port'])
KeyError: 'port'
17-02-15 02:10:46 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/tasks.py", line 241, in _step
result = coro.throw(exc)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity_component.py", line 387, in _update_entity_states
yield from update_coro
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity.py", line 209, in async_update_ha_state
yield from self.hass.loop.run_in_executor(None, self.update)
File "/usr/lib/python3.5/asyncio/futures.py", line 361, in iter
yield self  # This tells Task to wait for completion.
File "/usr/lib/python3.5/asyncio/tasks.py", line 296, in _wakeup
future.result()
File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 246, in update
self.update_devices(no_throttle=True)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 123, in update_devices
devices = plexserver.clients()
File "/home/openflixr/.homeassistant/deps/plexapi/server.py", line 65, in clients
baseurl = 'http://%s:%s' % (elem.attrib['address'], elem.attrib['port'])
KeyError: 'port'
17-02-15 02:10:57 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/tasks.py", line 241, in _step
result = coro.throw(exc)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity_component.py", line 387, in _update_entity_states
yield from update_coro
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity.py", line 209, in async_update_ha_state
yield from self.hass.loop.run_in_executor(None, self.update)
File "/usr/lib/python3.5/asyncio/futures.py", line 361, in iter
yield self  # This tells Task to wait for completion.
File "/usr/lib/python3.5/asyncio/tasks.py", line 296, in _wakeup
future.result()
File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 246, in update
self.update_devices(no_throttle=True)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 123, in update_devices
devices = plexserver.clients()
File "/home/openflixr/.homeassistant/deps/plexapi/server.py", line 65, in clients
baseurl = 'http://%s:%s' % (elem.attrib['address'], elem.attrib['port'])
KeyError: 'port'
17-02-15 02:11:08 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/tasks.py", line 241, in _step
result = coro.throw(exc)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity_component.py", line 387, in _update_entity_states
yield from update_coro
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity.py", line 209, in async_update_ha_state
yield from self.hass.loop.run_in_executor(None, self.update)
File "/usr/lib/python3.5/asyncio/futures.py", line 361, in iter
yield self  # This tells Task to wait for completion.
File "/usr/lib/python3.5/asyncio/tasks.py", line 296, in _wakeup
future.result()
File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 246, in update
self.update_devices(no_throttle=True)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 123, in update_devices
devices = plexserver.clients()
File "/home/openflixr/.homeassistant/deps/plexapi/server.py", line 65, in clients
baseurl = 'http://%s:%s' % (elem.attrib['address'], elem.attrib['port'])
KeyError: 'port'
17-02-15 02:11:19 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/tasks.py", line 241, in _step
result = coro.throw(exc)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity_component.py", line 387, in _update_entity_states
yield from update_coro
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity.py", line 209, in async_update_ha_state
yield from self.hass.loop.run_in_executor(None, self.update)
File "/usr/lib/python3.5/asyncio/futures.py", line 361, in iter
yield self  # This tells Task to wait for completion.
File "/usr/lib/python3.5/asyncio/tasks.py", line 296, in _wakeup
future.result()
File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 246, in update
self.update_devices(no_throttle=True)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 123, in update_devices
devices = plexserver.clients()
File "/home/openflixr/.homeassistant/deps/plexapi/server.py", line 65, in clients
baseurl = 'http://%s:%s' % (elem.attrib['address'], elem.attrib['port'])
KeyError: 'port'
17-02-15 02:11:30 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/tasks.py", line 241, in _step
result = coro.throw(exc)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity_component.py", line 387, in _update_entity_states
yield from update_coro
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity.py", line 209, in async_update_ha_state
yield from self.hass.loop.run_in_executor(None, self.update)
File "/usr/lib/python3.5/asyncio/futures.py", line 361, in iter
yield self  # This tells Task to wait for completion.
File "/usr/lib/python3.5/asyncio/tasks.py", line 296, in _wakeup
future.result()
File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 246, in update
self.update_devices(no_throttle=True)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 123, in update_devices
devices = plexserver.clients()
File "/home/openflixr/.homeassistant/deps/plexapi/server.py", line 65, in clients
baseurl = 'http://%s:%s' % (elem.attrib['address'], elem.attrib['port'])
KeyError: 'port'

I don't think this is related to the Apple TV platform, it seems like your plex server is returning something strange when Home Assistant is requesting connected clients (at least the port is missing). Maybe someone else has better knowledge about plexapi? Otherwise it might be a good idea to maybe get some help here https://github.com/pkkid/python-plexapi.

updgading to .3 didnt help
taking pierres advice to pip3 install --upgrade yarl  didnt work either
my hass home screen still shows 2 different instances for my apple tv...
one has a dark blue banner and the other a light banner ....  it use to have only the light banner in 37.x and everthing worked fine..
now scripts that work off the playing/stopped state of plex on the apple tv keep turning the lights on and off like it cant figure out what is going on....
these errors repeat freqeuntly also although I dont know if its part of this problem
17-02-18 06:29:04 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/tasks.py", line 241, in _step
result = coro.throw(exc)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity_component.py", line 387, in _update_entity_states
yield from update_coro
File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity.py", line 209, in async_update_ha_state
yield from self.hass.loop.run_in_executor(None, self.update)
File "/usr/lib/python3.5/asyncio/futures.py", line 361, in iter
yield self  # This tells Task to wait for completion.
File "/usr/lib/python3.5/asyncio/tasks.py", line 296, in _wakeup
future.result()
File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 246, in update
self.update_devices(no_throttle=True)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 123, in update_devices
devices = plexserver.clients()
File "/home/openflixr/.homeassistant/deps/plexapi/server.py", line 65, in clients
baseurl = 'http://%s:%s' % (elem.attrib['address'], elem.attrib['port'])
KeyError: 'port'
17-02-18 06:29:08 ERROR (MainThread) [homeassistant.core] Error doing job: Future exception was never retrieved
Traceback (most recent call last):
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 117, in
track_utc_time_change(hass, lambda now: update_devices(), second=30)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/util/init.py", line 296, in wrapper
result = method(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/media_player/plex.py", line 123, in update_devices
devices = plexserver.clients()
File "/home/openflixr/.homeassistant/deps/plexapi/server.py", line 65, in clients
baseurl = 'http://%s:%s' % (elem.attrib['address'], elem.attrib['port'])
KeyError: 'port'

Can you upgrade to 0.38.4 and try again? It's the same issue as in #6032.

Sorry, no, ignore my last post. It mixed things up.

I created an issue over at plexapi for this. Lets see if we can get any clarity on the issue.


Swallows regular output

It seems that this swallows regular jest output. Would be nice to have this reported output something extra once ALL tests are finished.

Hey @Andarist, this reporter is designed to be used in addition to existing reporters which are responsible for the regular output you want to see
For example, you can configure this reporter to be run after the default:
{
  "reporters": ["default", "jest-skipped-reporter"],
}

That would output something like:

Oh cool! I haven't yet used any custom reporter before this one and had no idea the setting needs to re-include the "default" one. Thanks!

No sweat, enjoy!

🤔 Didn't quite work as expected. Not sure if it's b/c of Typescript though


Automated Package Upgrade

:tada: This PR is included in version 2.0.58 :tada:
The release is available on:

npm package (@latest dist-tag)
GitHub release

Your semantic-release bot :package::rocket: