Giter Site home page Giter Site logo

qeb-hwt's Introduction

Qeb-Hwt

This is the implementation of https://github.com/apps/qeb-hwt.

Let Bots, powered with AI and continuously learning to increase its knowledge, manage your dependencies.

Installation

To install Qeb-HWt App, please refer to the following link.

Usage

Qeb-Hwt is one of the integration of Thamos CLI. Internally, it relies on Thamos CLI and on actual Thoth Adviser, core component that provides reccomendations.

You need to provide your own custom configuration file as a template called .thoth.yaml.

An example of configuration file template can be:

host: {THOTH_SERVICE_HOST}
tls_verify: true
requirements_format: pipenv

runtime_environments:
- name: '{os_name}:{os_version}'
  operating_system:
    name: {os_name}
    version: '{os_version}'
  hardware:
    cpu_family: {cpu_family}
    cpu_model: {cpu_model}
  python_version: '{python_version}'
  cuda_version: {cuda_version}
  recommendation_type: stable

Listing of automatically expanded configuration options which are supplied the config sub-command (these options are optional and will be expanded based on HW or SW discovery):

Configuration option Explanation Example
os_name name of operating system fedora
os_version version of operating system 30
cpu_family CPU family identifier 6
cpu_model CPU model identifier 94
python_version Python version (major.minor) 3.6
cuda_version CUDA version (major.minor) 9.0

These configuration options are optional and can be mixed with adjustment based on environment variables (see THOTH_SERVICE_HOST example above). Note the environment variables are not expanded on thamos config call but rather on other sub-commands issued (e.g. thamos advise or others).

The output format coming out of recommendations can be compatible with Pipenv, raw pip or similar to the one provided by pip-tools (actually same as for pip as these formats are interchangeable). The format is configured using requirements_format configuration option, available options are:

  • requirements_format: pipenv for Pipenv compatible output.

Remember you need to have Pipfile in your directory in this case.

  • requirements_format: pip or requirements_format: pip-tools for pip or pip-tools compatible output.

Remember you need to have requirements.txt or requirements.in in your directory in this case.

An example of configuration:

host: khemenu.thoth-station.ninja
tls_verify: false
requirements_format: pipenv

runtime_environments:
- name: rhel:8
  operating_system:
    name: rhel
    version: "8"
  python_version: "3.6"
  recommendation_type: latest

Support for multiple runtime environments

Thoth performs recommendations based on your hardware and software environment, so called runtime environments. You can specify more than just one runtime environment that should be targetted during recommendations as stated here.

Currently Qeb-Hwt Thoth Integration will take the first runtime environment entry stated in the runtime_environments listing by default.

qeb-hwt's People

Contributors

bissenbay avatar fridex avatar goern avatar gregory-pereira avatar harshad16 avatar khebhut[bot] avatar saisankargochhayat avatar sesheta avatar

Stargazers

 avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

qeb-hwt's Issues

Failed to update dependencies to their latest version

Automatic dependency update failed for the current master with SHA 006fb05.

The automatic dependency management cannot continue. Please fix errors reported bellow.

Command
  $ pipenv update --dev
Standard output

Standard error
Warning: Python 3.7 was not found on your system…
Neither 'pyenv' nor 'asdf' could be found to install Python.
You can specify specific versions of Python with:
$ pipenv --python path/to/python

Environment details

Kebechet version: 1.0.1
Python version: 3.6.8
Platform: Linux-3.10.0-957.21.2.el7.x86_64-x86_64-with-redhat-8.2-Ootpa
pipenv version: pipenv, version 2020.6.2


Dependency graph
Unable to obtain dependency graph:

Warning: Python 3.7 was not found on your system…
Neither 'pyenv' nor 'asdf' could be found to install Python.
You can specify specific versions of Python with:
$ pipenv --python path/to/python

Notes

For more information, see Pipfile and Pipfile.lock.

Once this issue is resolved, the issue will be automatically closed by bot.

TypeError: __init__() got an unexpected keyword argument 'has_multiple_single_files'

Sentry Issue: THOTH-1PK1

TypeError: __init__() got an unexpected keyword argument 'has_multiple_single_files'
(8 additional frame(s) were not displayed)
...
  File "octomachinery/github/api/app_client.py", line 71, in log_installs_list
    installations = await self.get_installations()
  File "octomachinery/github/api/app_client.py", line 131, in get_installations
    async for install in amap(
  File "octomachinery/utils/asynctools.py", line 82, in amap
    yield await try_await(callback(async_value))
  File "octomachinery/utils/asynctools.py", line 67, in try_await
    return await potentially_awaitable
  File "octomachinery/utils/asynctools.py", line 88, in callback_wrapper
    return await try_await(callback(**args_dict))

wrong commit hash if master merged into PR

Describe the bug
If we merge the master branch into the PR (to update the PR) it seems like the check-run is not using the new merge commit, example: thoth-station/build-analyzers#126

To Reproduce

  1. have a PR with thamos check-run
  2. click 'update from master' button on PR
  3. see check-run disappear

Expected behaviour
the thamos check-run is updated based on the new head commit of the PR

Additional context
Behaviour is observed based on #6

Do not re run qeb hwt at each event

Describe the bug
Do not re run qeb hwt at each event

To Reproduce
Steps to reproduce the behavior:

  1. Change title in PR?

Expected behavior
Check run is not rerun at each event (change title of PR)

Screenshots
If applicable, add screenshots to help explain your problem.

Additional context
Add any other context about the problem here.

ClientConnectorError: Cannot connect to host khemenu.thoth-station.ninja:443 ssl:default [Name or service not known]

Sentry Issue: THOTH-1PAM

gaierror: [Errno -2] Name or service not known
(1 additional frame(s) were not displayed)
...
  File "aiohttp/connector.py", line 829, in _resolve_host
    addrs = await \
  File "aiohttp/resolver.py", line 29, in resolve
    infos = await self._loop.getaddrinfo(
  File "asyncio/base_events.py", line 817, in getaddrinfo
    return await self.run_in_executor(
  File "concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "socket.py", line 914, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):

ClientConnectorError: Cannot connect to host khemenu.thoth-station.ninja:443 ssl:default [Name or service not known]
(16 additional frame(s) were not displayed)
...
  File "app.py", line 145, in on_pr_open_or_sync
    resp = await session.post(USER_API_URL, json=data)
  File "aiohttp/client.py", line 480, in _request
    conn = await self._connector.connect(
  File "aiohttp/connector.py", line 523, in connect
    proto = await self._create_connection(req, traces, timeout)
  File "aiohttp/connector.py", line 858, in _create_connection
    _, proto = await self._create_direct_connection(
  File "aiohttp/connector.py", line 971, in _create_direct_connection
    raise ClientConnectorError(req.connection_key, exc) from exc

Task exception was never retrieved
future: <Task finished name='Task-379908' coro=<route_github_event() done, defined at /opt/app-root/lib64/python3.8/site-packages/octomachinery/routing/webhooks_dispatcher.py:22> exception=ClientConnectorError(ConnectionKey(host='khemenu.thoth-station.ninja', port=443, is_ssl=True, ssl=None, proxy=None, proxy_auth=None, proxy_headers_hash=None), gaierror(-2, 'Name or service not known'))>

User feedback when inputs provided are wrong

Describe the bug
When I use the App I want to receive back logs from Adviser when the workflow fails because of wrong inputs (e.g. .thoth.yaml provided is wrong)

To Reproduce
Steps to reproduce the behavior:

  1. Open a PR in a repo with the App installed with wrong .thoth.yaml

Expected behavior
A justification is sent back to the user saying why adviser failed.

Screenshots

---> Running application from script (app.sh) ...
2020-02-05 10:58:06,104   1 INFO     thoth.adviser:160: Version: 0.7.3
Usage: thoth-adviser advise [OPTIONS]
Try "thoth-adviser advise --help" for help.
Error: Invalid value for "--recommendation-type" / "-t": invalid choice: stable. (choose from STABLE, TESTING, LATEST)

Additional context
It requires modification in the workflow with a new task that handles the failure of the inner workflow.

Error in parenthesis for json.loads in thamos advise workflow

Describe the bug
Thamos advise fails because it cannot parse the json.

To Reproduce

Expected behavior
No failure for json formatter

Screenshots

 fmurdaca@pc-7  ~  argo logs -w qeb-hwt-5cce216a
thamos-advise:	Traceback (most recent call last):
thamos-advise:	  File "/argo/staging/script", line 49, in <module>
thamos-advise:	    _LOGGER.debug(json.loads(exception.body)['error'])
thamos-advise:	  File "/usr/lib64/python3.7/json/__init__.py", line 348, in loads
thamos-advise:	    return _default_decoder.decode(s)
thamos-advise:	  File "/usr/lib64/python3.7/json/decoder.py", line 337, in decode
thamos-advise:	    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
thamos-advise:	  File "/usr/lib64/python3.7/json/decoder.py", line 355, in raw_decode
thamos-advise:	    raise JSONDecodeError("Expecting value", s, err.value) from None
thamos-advise:	json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

create screen cast for Qeb-Hwt GitHub App

As a Thoth Product Owner,
I want to publish a screen cast,
so that I can demo what Qeb-Hwt GitHub App does
and so that I can explain whats in to Devs

Story-Points: 3
Key-Result: KR162

Goal
marketing

update docs in qeb-hwt readme file

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like
A clear and concise description of what you want to happen.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

What can Kebechet do?

As a user new to the Kebechet app, I don't really understand what it does or how I can use it. I want to have a clear and concise description of Kebechet's capabilities and how can I make use of them.

Not all exceptions has body

Describe the bug
Not all exceptions has body.

Expected behavior
Exception is handled correctly and reporter as error.

Screenshots

thamos-advise:	During handling of the above exception, another exception occurred:
thamos-advise:	Traceback (most recent call last):
thamos-advise:	  File "/argo/staging/script", line 49, in <module>
thamos-advise:	    _LOGGER.debug(json.loads(exception.body))
thamos-advise:	AttributeError: 'KeyError' object has no attribute 'body'

GitHub App fails when Thamos has errors

Describe the bug
A User of Qeb-Hwt GitHub App submit a PR without a Pipfile, Qeb-Hwt App doesn't return any feedback to user.

To Reproduce
Steps to reproduce the behavior:

  1. Open a PR without Pipfile in repo with Qeb-Hwt App installed

Expected behavior
The exception error (e.g. Pipfile not provided) should be sent back to the user.

Workflow task fails with "failed to save outputs: timeout after 0s"

Describe the bug
This bus is known and it has been already solved upstream. We need to update argo version to 2.5.0 to have it

To Reproduce
Steps to reproduce the behavior:

  1. Start thamos advise with following inputs
THOTH_ADVISER_JOB_ID: adviser-142bd0d8
  THOTH_DOCUMENT_ID: adviser-142bd0d8
  THOTH_LOG_ADVISER: DEBUG
  THOTH_ADVISER_TIMEOUT_SECONDS: 3600
  THOTH_ADVISER_REQUIREMENTS: [[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages]
"rfc5424-logging-handler" = "*"
argo-workflows = ">=2.0,<3.0"
daiquiri = "*"
requests = "*"
sentry-sdk = "*"
openshift = "~=0.10.0"
attrs = "*"
pyyaml = "*"
attrdict = "*"
flexmock = "*"

[dev-packages]
pytest = "*"
pytest-timeout = "*"
pytest-cov = "*"
pylint = "*"
coala = "*"
coala-bears = "*"
pytest-mypy = "*"
typeshed = "*"
mypy = "*"
pre-commit = "*"

[requires]
python_version = "3.6"

  THOTH_ADVISER_REQUIREMENTS_LOCKED: {
    "_meta": {
        "hash": {
            "sha256": "88feabab345616c404afc508671d71bdf60c61dc53257b371a267d418f7bcfd4"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.6"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.python.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "argo-workflows": {
            "hashes": [
                "sha256:00a0c0e14ecccd9694b14cce9895e83a161929818ccf2c4c6d1e3681762d9539",
                "sha256:1d36d0e56c472c9af98cdfc21a0a9d3087227ee8d118310f2ac6649df124c5d5"
            ],
            "index": "pypi",
            "version": "==2.1.4"
        },
        "attrdict": {
            "hashes": [
                "sha256:35c90698b55c683946091177177a9e9c0713a0860f0e049febd72649ccd77b70",
                "sha256:9432e3498c74ff7e1b20b3d93b45d766b71cbffa90923496f82c4ae38b92be34"
            ],
            "index": "pypi",
            "version": "==2.0.1"
        },
        "attrs": {
            "hashes": [
                "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c",
                "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"
            ],
            "index": "pypi",
            "version": "==19.3.0"
        },
        "cachetools": {
            "hashes": [
                "sha256:9a52dd97a85f257f4e4127f15818e71a0c7899f121b34591fcc1173ea79a0198",
                "sha256:b304586d357c43221856be51d73387f93e2a961598a9b6b6670664746f3b6c6c"
            ],
            "version": "==4.0.0"
        },
        "certifi": {
            "hashes": [
                "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3",
                "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"
            ],
            "version": "==2019.11.28"
        },
        "chardet": {
            "hashes": [
                "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
                "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
            ],
            "version": "==3.0.4"
        },
        "daiquiri": {
            "hashes": [
                "sha256:6b235ed15b73b87fd3cc2521aacbb727bf8443a0896dc534b07503841d03cfdb",
                "sha256:d57b9fd5432933c6e899054eb62cee22eab89f560c8493254d327ec27893c866"
            ],
            "index": "pypi",
            "version": "==2.0.0"
        },
        "dictdiffer": {
            "hashes": [
                "sha256:1adec0d67cdf6166bda96ae2934ddb5e54433998ceab63c984574d187cc563d2",
                "sha256:d79d9a39e459fe33497c858470ca0d2e93cb96621751de06d631856adfd9c390"
            ],
            "version": "==0.8.1"
        },
        "flexmock": {
            "hashes": [
                "sha256:5033ceb974d6452cf8716c2ff5059074b77e546df5c849fb44a53f98dfe0d82c"
            ],
            "index": "pypi",
            "version": "==0.10.4"
        },
        "google-auth": {
            "hashes": [
                "sha256:44549e69ac39acf41fdf47f3f39a06e4e68378476806760d94a2c6a361b2bb06",
                "sha256:b2d83edc02a9deeed9b1b839046671fd9eda223d21bd2dd50051559787032fd8"
            ],
            "version": "==1.11.0"
        },
        "idna": {
            "hashes": [
                "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407",
                "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"
            ],
            "version": "==2.8"
        },
        "jinja2": {
            "hashes": [
                "sha256:6e7a3c2934694d59ad334c93dd1b6c96699cf24c53fdb8ec848ac6b23e685734",
                "sha256:d6609ae5ec3d56212ca7d802eda654eaf2310000816ce815361041465b108be4"
            ],
            "version": "==2.11.0"
        },
        "kubernetes": {
            "hashes": [
                "sha256:3770a496663396ad1def665eeadb947b3f45217a08b64b10c01a57e981ac8592",
                "sha256:a6dee02a1b39ea4bb9c4c2cc415ea0ada33d8ea0a920f7d4fb6d166989dcac01"
            ],
            "version": "==10.0.1"
        },
        "markupsafe": {
            "hashes": [
                "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
                "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
                "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
                "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
                "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
                "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
                "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
                "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
                "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
                "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
                "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
                "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
                "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
                "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
                "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
                "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
                "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
                "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
                "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
                "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
                "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
                "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
                "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
                "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
                "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
                "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
                "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
                "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
                "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
                "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
                "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
                "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
                "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
            ],
            "version": "==1.1.1"
        },
        "mock": {
            "hashes": [
                "sha256:83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3",
                "sha256:d157e52d4e5b938c550f39eb2fd15610db062441a9c2747d3dbfa9298211d0f8"
            ],
            "version": "==3.0.5"
        },
        "oauthlib": {
            "hashes": [
                "sha256:bee41cc35fcca6e988463cacc3bcb8a96224f470ca547e697b604cc697b2f889",
                "sha256:df884cd6cbe20e32633f1db1072e9356f53638e4361bef4e8b03c9127c9328ea"
            ],
            "version": "==3.1.0"
        },
        "openshift": {
            "hashes": [
                "sha256:ce7411a5689e6d3831bb5dc08a8c324860d71e3dd5547ba44f4d139cfa57c34b"
            ],
            "index": "pypi",
            "version": "==0.10.1"
        },
        "pyasn1": {
            "hashes": [
                "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d",
                "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"
            ],
            "version": "==0.4.8"
        },
        "pyasn1-modules": {
            "hashes": [
                "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e",
                "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"
            ],
            "version": "==0.2.8"
        },
        "python-dateutil": {
            "hashes": [
                "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c",
                "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"
            ],
            "version": "==2.8.1"
        },
        "python-json-logger": {
            "hashes": [
                "sha256:b7a31162f2a01965a5efb94453ce69230ed208468b0bbc7fdfc56e6d8df2e281"
            ],
            "version": "==0.1.11"
        },
        "python-string-utils": {
            "hashes": [
                "sha256:05d24a8d884b629b534af992dc1f35dc4de4c73678ffdffa0efcbe667058af1f"
            ],
            "version": "==0.6.0"
        },
        "pytz": {
            "hashes": [
                "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d",
                "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"
            ],
            "version": "==2019.3"
        },
        "pyyaml": {
            "hashes": [
                "sha256:059b2ee3194d718896c0ad077dd8c043e5e909d9180f387ce42012662a4946d6",
                "sha256:1cf708e2ac57f3aabc87405f04b86354f66799c8e62c28c5fc5f88b5521b2dbf",
                "sha256:24521fa2890642614558b492b473bee0ac1f8057a7263156b02e8b14c88ce6f5",
                "sha256:4fee71aa5bc6ed9d5f116327c04273e25ae31a3020386916905767ec4fc5317e",
                "sha256:70024e02197337533eef7b85b068212420f950319cc8c580261963aefc75f811",
                "sha256:74782fbd4d4f87ff04159e986886931456a1894c61229be9eaf4de6f6e44b99e",
                "sha256:940532b111b1952befd7db542c370887a8611660d2b9becff75d39355303d82d",
                "sha256:cb1f2f5e426dc9f07a7681419fe39cee823bb74f723f36f70399123f439e9b20",
                "sha256:dbbb2379c19ed6042e8f11f2a2c66d39cceb8aeace421bfc29d085d93eda3689",
                "sha256:e3a057b7a64f1222b56e47bcff5e4b94c4f61faac04c7c4ecb1985e18caa3994",
                "sha256:e9f45bd5b92c7974e59bcd2dcc8631a6b6cc380a904725fce7bc08872e691615"
            ],
            "index": "pypi",
            "version": "==5.3"
        },
        "requests": {
            "hashes": [
                "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4",
                "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31"
            ],
            "index": "pypi",
            "version": "==2.22.0"
        },
        "requests-oauthlib": {
            "hashes": [
                "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d",
                "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"
            ],
            "version": "==1.3.0"
        },
        "rfc5424-logging-handler": {
            "hashes": [
                "sha256:9ae14073ef6d76d0c730ad6b6e3aeece841a6d413672d282876c0506dc097257",
                "sha256:eaba528e47fba3e2845d52d559885cbc27a37db42a9d265ea539b3b4452d3057"
            ],
            "index": "pypi",
            "version": "==1.4.3"
        },
        "rsa": {
            "hashes": [
                "sha256:14ba45700ff1ec9eeb206a2ce76b32814958a98e372006c8fb76ba820211be66",
                "sha256:1a836406405730121ae9823e19c6e806c62bbad73f890574fff50efa4122c487"
            ],
            "version": "==4.0"
        },
        "ruamel.yaml": {
            "hashes": [
                "sha256:91d6bfe4fce401a00388deb0f5d29e10d2d3683a868c1113ae16bbc351ceb6a4",
                "sha256:966e5a049eebf011c90424b9ec7dab6358cee8de0907354b27a27f20a8c4c2ec"
            ],
            "version": "==0.16.6"
        },
        "ruamel.yaml.clib": {
            "hashes": [
                "sha256:1e77424825caba5553bbade750cec2277ef130647d685c2b38f68bc03453bac6",
                "sha256:392b7c371312abf27fb549ec2d5e0092f7ef6e6c9f767bfb13e83cb903aca0fd",
                "sha256:4d55386129291b96483edcb93b381470f7cd69f97585829b048a3d758d31210a",
                "sha256:550168c02d8de52ee58c3d8a8193d5a8a9491a5e7b2462d27ac5bf63717574c9",
                "sha256:57933a6986a3036257ad7bf283529e7c19c2810ff24c86f4a0cfeb49d2099919",
                "sha256:615b0396a7fad02d1f9a0dcf9f01202bf9caefee6265198f252c865f4227fcc6",
                "sha256:77556a7aa190be9a2bd83b7ee075d3df5f3c5016d395613671487e79b082d784",
                "sha256:7aee724e1ff424757b5bd8f6c5bbdb033a570b2b4683b17ace4dbe61a99a657b",
                "sha256:8073c8b92b06b572e4057b583c3d01674ceaf32167801fe545a087d7a1e8bf52",
                "sha256:9c6d040d0396c28d3eaaa6cb20152cb3b2f15adf35a0304f4f40a3cf9f1d2448",
                "sha256:a0ff786d2a7dbe55f9544b3f6ebbcc495d7e730df92a08434604f6f470b899c5",
                "sha256:b1b7fcee6aedcdc7e62c3a73f238b3d080c7ba6650cd808bce8d7761ec484070",
                "sha256:b66832ea8077d9b3f6e311c4a53d06273db5dc2db6e8a908550f3c14d67e718c",
                "sha256:be018933c2f4ee7de55e7bd7d0d801b3dfb09d21dad0cce8a97995fd3e44be30",
                "sha256:d0d3ac228c9bbab08134b4004d748cf9f8743504875b3603b3afbb97e3472947",
                "sha256:d10e9dd744cf85c219bf747c75194b624cc7a94f0c80ead624b06bfa9f61d3bc",
                "sha256:ea4362548ee0cbc266949d8a441238d9ad3600ca9910c3fe4e82ee3a50706973",
                "sha256:ed5b3698a2bb241b7f5cbbe277eaa7fe48b07a58784fba4f75224fd066d253ad",
                "sha256:f9dcc1ae73f36e8059589b601e8e4776b9976effd76c21ad6a855a74318efd6e"
            ],
            "markers": "platform_python_implementation == 'CPython' and python_version < '3.8'",
            "version": "==0.2.0"
        },
        "sentry-sdk": {
            "hashes": [
                "sha256:b06dd27391fd11fb32f84fe054e6a64736c469514a718a99fb5ce1dff95d6b28",
                "sha256:e023da07cfbead3868e1e2ba994160517885a32dfd994fc455b118e37989479b"
            ],
            "index": "pypi",
            "version": "==0.14.1"
        },
        "six": {
            "hashes": [
                "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
                "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
            ],
            "version": "==1.14.0"
        },
        "tzlocal": {
            "hashes": [
                "sha256:11c9f16e0a633b4b60e1eede97d8a46340d042e67b670b290ca526576e039048",
                "sha256:949b9dd5ba4be17190a80c0268167d7e6c92c62b30026cf9764caf3e308e5590"
            ],
            "version": "==2.0.0"
        },
        "urllib3": {
            "hashes": [
                "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc",
                "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"
            ],
            "version": "==1.25.8"
        },
        "websocket-client": {
            "hashes": [
                "sha256:0fc45c961324d79c781bab301359d5a1b00b13ad1b10415a4780229ef71a5549",
                "sha256:d735b91d6d1692a6a181f2a8c9e0238e5f6373356f561bb9dc4c7af36f452010"
            ],
            "version": "==0.57.0"
        }
    },
    "develop": {
        "alabaster": {
            "hashes": [
                "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359",
                "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"
            ],
            "version": "==0.7.12"
        },
        "appdirs": {
            "hashes": [
                "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92",
                "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e"
            ],
            "version": "==1.4.3"
        },
        "aspy.yaml": {
            "hashes": [
                "sha256:463372c043f70160a9ec950c3f1e4c3a82db5fca01d334b6bc89c7164d744bdc",
                "sha256:e7c742382eff2caed61f87a39d13f99109088e5e93f04d76eb8d4b28aa143f45"
            ],
            "version": "==1.3.0"
        },
        "astroid": {
            "hashes": [
                "sha256:87de48a92e29cedf7210ffa853d11441e7ad94cb47bacd91b023499b51cbc756",
                "sha256:d25869fc7f44f1d9fb7d24fd7ea0639656f5355fc3089cd1f3d18c6ec6b124c7"
            ],
            "version": "==1.6.6"
        },
        "attrs": {
            "hashes": [
                "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c",
                "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"
            ],
            "index": "pypi",
            "version": "==19.3.0"
        },
        "autoflake": {
            "hashes": [
                "sha256:67f3886b74f8614b9696ea47eb9ce90fa808da142619e8e6da6eaf541df30e0f"
            ],
            "version": "==0.6.6"
        },
        "autopep8": {
            "hashes": [
                "sha256:0f592a0447acea0c2b0a9602be1e4e3d86db52badd2e3c84f0193bfd89fd3a43"
            ],
            "version": "==1.5"
        },
        "babel": {
            "hashes": [
                "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38",
                "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"
            ],
            "version": "==2.8.0"
        },
        "bandit": {
            "hashes": [
                "sha256:336620e220cf2d3115877685e264477ff9d9abaeb0afe3dc7264f55fa17a3952",
                "sha256:41e75315853507aa145d62a78a2a6c5e3240fe14ee7c601459d0df9418196065"
            ],
            "version": "==1.6.2"
        },
        "certifi": {
            "hashes": [
                "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3",
                "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"
            ],
            "version": "==2019.11.28"
        },
        "cfgv": {
            "hashes": [
                "sha256:edb387943b665bf9c434f717bf630fa78aecd53d5900d2e05da6ad6048553144",
                "sha256:fbd93c9ab0a523bf7daec408f3be2ed99a980e20b2d19b50fc184ca6b820d289"
            ],
            "version": "==2.0.1"
        },
        "chardet": {
            "hashes": [
                "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
                "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
            ],
            "version": "==3.0.4"
        },
        "click": {
            "hashes": [
                "sha256:cc6a19da8ebff6e7074f731447ef7e112bd23adf3de5c597cf9989f2fd8defe9",
                "sha256:fcf697e1fd4b567d817c69dab10a4035937fe6af175c05fd6806b69f74cbc6c4"
            ],
            "version": "==6.6"
        },
        "cmakelint": {
            "hashes": [
                "sha256:58aebd449baac4444fca2346f172821e7684f99312694128087617f50db0c4be",
                "sha256:b8df7e5595d30ba8e3e047876ef5dab5bd1dda0f6716324efc6f216e3e8fc42d"
            ],
            "version": "==1.4.1"
        },
        "coala": {
            "hashes": [
                "sha256:2029886b381451d7641e6a17af2c72a0a7909d9ce1a0ffef2ed4c1dfdc706134",
                "sha256:cd4beff47de084b22802b47a74b1027c96b68e0989cacb4a9c2a39b9a912bf0e"
            ],
            "index": "pypi",
            "version": "==0.11.0"
        },
        "coala-bears": {
            "hashes": [
                "sha256:51d6c9caf6a14836c39a55e8b2b0a16bebc1c4ffe6fc2875f79599ae82836c35",
                "sha256:f67fdaa261d08f5edc7679994f6013c46b2b59ef1d1d09dfd778d9a58af1bb03"
            ],
            "index": "pypi",
            "version": "==0.11.1"
        },
        "coala-utils": {
            "hashes": [
                "sha256:e641611e00e055e5d0ef1640179540a2c5a1604dcc629d103acd979e7c75c549"
            ],
            "version": "==0.6.7"
        },
        "colorama": {
            "hashes": [
                "sha256:463f8483208e921368c9f306094eb6f725c6ca42b0f97e313cb5d5512459feda",
                "sha256:48eb22f4f8461b1df5734a074b57042430fb06e1d61bd1e11b078c0fe6d7a1f1"
            ],
            "version": "==0.3.9"
        },
        "colorlog": {
            "hashes": [
                "sha256:188a8f47b797fdf001891b5a55263789a2fda0ba7ba4c44f12741d0a8d5e9e03",
                "sha256:229cd0794a19d8f33b2b4a4b70e1225b6c010af96c2dc8615279abbc1bb3929a"
            ],
            "version": "==2.10.0"
        },
        "coverage": {
            "hashes": [
                "sha256:15cf13a6896048d6d947bf7d222f36e4809ab926894beb748fc9caa14605d9c3",
                "sha256:1daa3eceed220f9fdb80d5ff950dd95112cd27f70d004c7918ca6dfc6c47054c",
                "sha256:1e44a022500d944d42f94df76727ba3fc0a5c0b672c358b61067abb88caee7a0",
                "sha256:25dbf1110d70bab68a74b4b9d74f30e99b177cde3388e07cc7272f2168bd1477",
                "sha256:3230d1003eec018ad4a472d254991e34241e0bbd513e97a29727c7c2f637bd2a",
                "sha256:3dbb72eaeea5763676a1a1efd9b427a048c97c39ed92e13336e726117d0b72bf",
                "sha256:5012d3b8d5a500834783689a5d2292fe06ec75dc86ee1ccdad04b6f5bf231691",
                "sha256:51bc7710b13a2ae0c726f69756cf7ffd4362f4ac36546e243136187cfcc8aa73",
                "sha256:527b4f316e6bf7755082a783726da20671a0cc388b786a64417780b90565b987",
                "sha256:722e4557c8039aad9592c6a4213db75da08c2cd9945320220634f637251c3894",
                "sha256:76e2057e8ffba5472fd28a3a010431fd9e928885ff480cb278877c6e9943cc2e",
                "sha256:77afca04240c40450c331fa796b3eab6f1e15c5ecf8bf2b8bee9706cd5452fef",
                "sha256:7afad9835e7a651d3551eab18cbc0fdb888f0a6136169fbef0662d9cdc9987cf",
                "sha256:9bea19ac2f08672636350f203db89382121c9c2ade85d945953ef3c8cf9d2a68",
                "sha256:a8b8ac7876bc3598e43e2603f772d2353d9931709345ad6c1149009fd1bc81b8",
                "sha256:b0840b45187699affd4c6588286d429cd79a99d509fe3de0f209594669bb0954",
                "sha256:b26aaf69713e5674efbde4d728fb7124e429c9466aeaf5f4a7e9e699b12c9fe2",
                "sha256:b63dd43f455ba878e5e9f80ba4f748c0a2156dde6e0e6e690310e24d6e8caf40",
                "sha256:be18f4ae5a9e46edae3f329de2191747966a34a3d93046dbdf897319923923bc",
                "sha256:c312e57847db2526bc92b9bfa78266bfbaabac3fdcd751df4d062cd4c23e46dc",
                "sha256:c60097190fe9dc2b329a0eb03393e2e0829156a589bd732e70794c0dd804258e",
                "sha256:c62a2143e1313944bf4a5ab34fd3b4be15367a02e9478b0ce800cb510e3bbb9d",
                "sha256:cc1109f54a14d940b8512ee9f1c3975c181bbb200306c6d8b87d93376538782f",
                "sha256:cd60f507c125ac0ad83f05803063bed27e50fa903b9c2cfee3f8a6867ca600fc",
                "sha256:d513cc3db248e566e07a0da99c230aca3556d9b09ed02f420664e2da97eac301",
                "sha256:d649dc0bcace6fcdb446ae02b98798a856593b19b637c1b9af8edadf2b150bea",
                "sha256:d7008a6796095a79544f4da1ee49418901961c97ca9e9d44904205ff7d6aa8cb",
                "sha256:da93027835164b8223e8e5af2cf902a4c80ed93cb0909417234f4a9df3bcd9af",
                "sha256:e69215621707119c6baf99bda014a45b999d37602cb7043d943c76a59b05bf52",
                "sha256:ea9525e0fef2de9208250d6c5aeeee0138921057cd67fcef90fbed49c4d62d37",
                "sha256:fca1669d464f0c9831fd10be2eef6b86f5ebd76c724d1e0706ebdff86bb4adf0"
            ],
            "version": "==5.0.3"
        },
        "cppclean": {
            "hashes": [
                "sha256:59605ea292485f8e19b36b375dc4371443645b03da3798c7b8f00f9babc6e016"
            ],
            "version": "==0.12"
        },
        "cpplint": {
            "hashes": [
                "sha256:08b384606136146ac1d32a2ffb60623a5dc1b20434588eaa0fa12a6e24eb3bf5",
                "sha256:344476251bc55cadf38171c207e56ef8c4acb97dc1529f22701901d06f89fd26"
            ],
            "version": "==1.4.5"
        },
        "decorator": {
            "hashes": [
                "sha256:54c38050039232e1db4ad7375cfce6748d7b41c29e95a081c8a6d2c30364a2ce",
                "sha256:5d19b92a3c8f7f101c8dd86afd86b0f061a8ce4540ab8cd401fa2542756bce6d"
            ],
            "version": "==4.4.1"
        },
        "dennis": {
            "hashes": [
                "sha256:8c942dd5da7d03c65daebc069c5ee5c7f1374ac9b0c8c89c627caa66fe822604",
                "sha256:f6487392ac91800c5f0684a99b404b7fd0f72ceb48faeb5a0ce4e2c24fb62d3f"
            ],
            "version": "==0.9"
        },
        "dependency-management": {
            "hashes": [
                "sha256:5033e7e1b0d666827c7d5b8effdc350f936a0edcdf733d758de0bc0fed0ccffb",
                "sha256:f0c43082df3d47f6459fb89ea06edc800f183febb564a49fdb46d1bf4becaa60"
            ],
            "version": "==0.4.0"
        },
        "docopt": {
            "hashes": [
                "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"
            ],
            "version": "==0.6.2"
        },
        "docutils": {
            "hashes": [
                "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af",
                "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"
            ],
            "version": "==0.16"
        },
        "eradicate": {
            "hashes": [
                "sha256:614386082723d1ee942feff41ba3e8aaaf4e06ffb0c032f8fb7d584eeb3ea7c3"
            ],
            "version": "==0.1.6"
        },
        "future": {
            "hashes": [
                "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"
            ],
            "version": "==0.18.2"
        },
        "gitdb2": {
            "hashes": [
                "sha256:1b6df1433567a51a4a9c1a5a0de977aa351a405cc56d7d35f3388bad1f630350",
                "sha256:96bbb507d765a7f51eb802554a9cfe194a174582f772e0d89f4e87288c288b7b"
            ],
            "version": "==2.0.6"
        },
        "gitpython": {
            "hashes": [
                "sha256:9c2398ffc3dcb3c40b27324b316f08a4f93ad646d5a6328cafbb871aa79f5e42",
                "sha256:c155c6a2653593ccb300462f6ef533583a913e17857cfef8fc617c246b6dc245"
            ],
            "version": "==3.0.5"
        },
        "guess-language-spirit": {
            "hashes": [
                "sha256:a9b20470246bbfd1b69b055ff6459e05aa8cb5f1f1d8481350819cd7680792cc"
            ],
            "version": "==0.5.3"
        },
        "html-linter": {
            "hashes": [
                "sha256:1fedb2b0c3575023dcd7bf1c05a6ceeb650a7ea36d11411eb871b38fd92a0ed0"
            ],
            "version": "==0.3.0"
        },
        "identify": {
            "hashes": [
                "sha256:1222b648251bdcb8deb240b294f450fbf704c7984e08baa92507e4ea10b436d5",
                "sha256:d824ebe21f38325c771c41b08a95a761db1982f1fc0eee37c6c97df3f1636b96"
            ],
            "version": "==1.4.11"
        },
        "idna": {
            "hashes": [
                "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407",
                "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"
            ],
            "version": "==2.8"
        },
        "imagesize": {
            "hashes": [
                "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1",
                "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"
            ],
            "version": "==1.2.0"
        },
        "importlib-metadata": {
            "hashes": [
                "sha256:06f5b3a99029c7134207dd882428a66992a9de2bef7c2b699b5641f9886c3302",
                "sha256:b97607a1a18a5100839aec1dc26a1ea17ee0d93b20b0f008d80a5a050afb200b"
            ],
            "markers": "python_version < '3.8'",
            "version": "==1.5.0"
        },
        "importlib-resources": {
            "hashes": [
                "sha256:6e2783b2538bd5a14678284a3962b0660c715e5a0f10243fd5e00a4b5974f50b",
                "sha256:d3279fd0f6f847cced9f7acc19bd3e5df54d34f93a2e7bb5f238f81545787078"
            ],
            "markers": "python_version < '3.7'",
            "version": "==1.0.2"
        },
        "ipython-genutils": {
            "hashes": [
                "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8",
                "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"
            ],
            "version": "==0.2.0"
        },
        "isort": {
            "hashes": [
                "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1",
                "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"
            ],
            "version": "==4.3.21"
        },
        "jinja2": {
            "hashes": [
                "sha256:6e7a3c2934694d59ad334c93dd1b6c96699cf24c53fdb8ec848ac6b23e685734",
                "sha256:d6609ae5ec3d56212ca7d802eda654eaf2310000816ce815361041465b108be4"
            ],
            "version": "==2.11.0"
        },
        "jsonschema": {
            "hashes": [
                "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163",
                "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"
            ],
            "version": "==3.2.0"
        },
        "jupyter-core": {
            "hashes": [
                "sha256:464769f7387d7a62a2403d067f1ddc616655b7f77f5d810c0dd62cb54bfd0fb9",
                "sha256:a183e0ec2e8f6adddf62b0a3fc6a2237e3e0056d381e536d3e7c7ecc3067e244"
            ],
            "version": "==4.6.1"
        },
        "lazy-object-proxy": {
            "hashes": [
                "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d",
                "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449",
                "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08",
                "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a",
                "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50",
                "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd",
                "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239",
                "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb",
                "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea",
                "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e",
                "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156",
                "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142",
                "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442",
                "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62",
                "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db",
                "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531",
                "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383",
                "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a",
                "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357",
                "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4",
                "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"
            ],
            "version": "==1.4.3"
        },
        "libclang-py3": {
            "hashes": [
                "sha256:e267c3450765a8645ab160b3aad6b3b9e5adcd471325f5e65cc20206a8265027"
            ],
            "version": "==3.4.0"
        },
        "mando": {
            "hashes": [
                "sha256:4626fe3d74bb23e3a64dda59843d1641f0bf01097f61ff817d3f2e1db21cb4b3",
                "sha256:ef1e10b7004b84c41cb272516640f1d387fcd1e16ba48fb96d6a6eba131faef3"
            ],
            "version": "==0.3.3"
        },
        "markupsafe": {
            "hashes": [
                "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
                "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
                "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
                "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
                "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
                "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
                "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
                "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
                "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
                "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
                "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
                "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
                "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
                "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
                "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
                "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
                "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
                "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
                "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
                "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
                "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
                "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
                "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
                "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
                "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
                "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
                "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
                "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
                "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
                "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
                "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
                "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
                "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
            ],
            "version": "==1.1.1"
        },
        "mccabe": {
            "hashes": [
                "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
                "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
            ],
            "version": "==0.6.1"
        },
        "more-itertools": {
            "hashes": [
                "sha256:5dd8bcf33e5f9513ffa06d5ad33d78f31e1931ac9a18f33d37e77a180d393a7c",
                "sha256:b1ddb932186d8a6ac451e1d95844b382f55e12686d51ca0c68b6f61f2ab7a507"
            ],
            "version": "==8.2.0"
        },
        "munkres3": {
            "hashes": [
                "sha256:cd2e0570e564801127ebe54c442ea02c87472a2e530fc65d8bab4d779f4ff299",
                "sha256:f7c110d39296b580458bf0dc8cbc1c461c4d7525da243f4dcc3f3897b125cccf"
            ],
            "version": "==1.0.5.5"
        },
        "mypy": {
            "hashes": [
                "sha256:0a9a45157e532da06fe56adcfef8a74629566b607fa2c1ac0122d1ff995c748a",
                "sha256:2c35cae79ceb20d47facfad51f952df16c2ae9f45db6cb38405a3da1cf8fc0a7",
                "sha256:4b9365ade157794cef9685791032521233729cb00ce76b0ddc78749abea463d2",
                "sha256:53ea810ae3f83f9c9b452582261ea859828a9ed666f2e1ca840300b69322c474",
                "sha256:634aef60b4ff0f650d3e59d4374626ca6153fcaff96ec075b215b568e6ee3cb0",
                "sha256:7e396ce53cacd5596ff6d191b47ab0ea18f8e0ec04e15d69728d530e86d4c217",
                "sha256:7eadc91af8270455e0d73565b8964da1642fe226665dd5c9560067cd64d56749",
                "sha256:7f672d02fffcbace4db2b05369142e0506cdcde20cea0e07c7c2171c4fd11dd6",
                "sha256:85baab8d74ec601e86134afe2bcccd87820f79d2f8d5798c889507d1088287bf",
                "sha256:87c556fb85d709dacd4b4cb6167eecc5bbb4f0a9864b69136a0d4640fdc76a36",
                "sha256:a6bd44efee4dc8c3324c13785a9dc3519b3ee3a92cada42d2b57762b7053b49b",
                "sha256:c6d27bd20c3ba60d5b02f20bd28e20091d6286a699174dfad515636cb09b5a72",
                "sha256:e2bb577d10d09a2d8822a042a23b8d62bc3b269667c9eb8e60a6edfa000211b1",
                "sha256:f97a605d7c8bc2c6d1172c2f0d5a65b24142e11a58de689046e62c2d632ca8c1"
            ],
            "index": "pypi",
            "version": "==0.761"
        },
        "mypy-extensions": {
            "hashes": [
                "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d",
                "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"
            ],
            "version": "==0.4.3"
        },
        "mypy-lang": {
            "hashes": [
                "sha256:65322cf3466282947184271792b9f63153872896e958047708d8927864f4fb19"
            ],
            "version": "==0.4.6"
        },
        "nbformat": {
            "hashes": [
                "sha256:b9a0dbdbd45bb034f4f8893cafd6f652ea08c8c1674ba83f2dc55d3955743b0b",
                "sha256:f7494ef0df60766b7cabe0a3651556345a963b74dbc16bc7c18479041170d402"
            ],
            "version": "==4.4.0"
        },
        "nltk": {
            "hashes": [
                "sha256:bed45551259aa2101381bbdd5df37d44ca2669c5c3dad72439fa459b29137d94"
            ],
            "version": "==3.4.5"
        },
        "nodeenv": {
            "hashes": [
                "sha256:561057acd4ae3809e665a9aaaf214afff110bbb6a6d5c8a96121aea6878408b3"
            ],
            "version": "==1.3.4"
        },
        "packaging": {
            "hashes": [
                "sha256:170748228214b70b672c581a3dd610ee51f733018650740e98c7df862a583f73",
                "sha256:e665345f9eef0c621aa0bf2f8d78cf6d21904eef16a93f020240b704a57f1334"
            ],
            "version": "==20.1"
        },
        "pbr": {
            "hashes": [
                "sha256:139d2625547dbfa5fb0b81daebb39601c478c21956dc57e2e07b74450a8c506b",
                "sha256:61aa52a0f18b71c5cc58232d2cf8f8d09cd67fcad60b742a60124cb8d6951488"
            ],
            "version": "==5.4.4"
        },
        "pluggy": {
            "hashes": [
                "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0",
                "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"
            ],
            "version": "==0.13.1"
        },
        "polib": {
            "hashes": [
                "sha256:93b730477c16380c9a96726c54016822ff81acfa553977fdd131f2b90ba858d7",
                "sha256:fad87d13696127ffb27ea0882d6182f1a9cf8a5e2b37a587751166c51e5a332a"
            ],
            "version": "==1.1.0"
        },
        "pre-commit": {
            "hashes": [
                "sha256:0385479a0fe0765b1d32241f6b5358668cb4b6496a09aaf9c79acc6530489dbb",
                "sha256:bf80d9dd58bea4f45d5d71845456fdcb78c1027eda9ed562db6fa2bd7a680c3a"
            ],
            "index": "pypi",
            "version": "==2.0.1"
        },
        "proselint": {
            "hashes": [
                "sha256:094d808d44bf1a60dcb1465749be5cc44f4f6c146c04bc5f28976a833786e830",
                "sha256:ec886ae96bd9eb51994d1fd44d94e937868171abd5f7a8e0066307c3e8591f85"
            ],
            "version": "==0.7.0"
        },
        "py": {
            "hashes": [
                "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa",
                "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0"
            ],
            "version": "==1.8.1"
        },
        "pycodestyle": {
            "hashes": [
                "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56",
                "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"
            ],
            "version": "==2.5.0"
        },
        "pydocstyle": {
            "hashes": [
                "sha256:20939fb9c2d61a9870449573d9ed762ec040c764b2241bec22c5ea956b9caf90",
                "sha256:f808d8fc23952fe93c2d85598732bfa854cb5ee8a25f8191f60600710f898e8d"
            ],
            "version": "==1.1.1"
        },
        "pyflakes": {
            "hashes": [
                "sha256:05c8a1702088e9b54acb422f78210afc6074b3472afa7a0a77f0b8aa3f5db605",
                "sha256:a3ecf40567dc470c006c19abbac9c8b4a77a8a5a01e975bb6452b8814818ad3f"
            ],
            "version": "==1.4.0"
        },
        "pygments": {
            "hashes": [
                "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b",
                "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe"
            ],
            "version": "==2.5.2"
        },
        "pylint": {
            "hashes": [
                "sha256:367e3d49813d349a905390ac27989eff82ab84958731c5ef0bef867452cfdc42",
                "sha256:97a42df23d436c70132971d1dcb9efad2fe5c0c6add55b90161e773caf729300"
            ],
            "index": "pypi",
            "version": "==1.9.5"
        },
        "pyparsing": {
            "hashes": [
                "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f",
                "sha256:c342dccb5250c08d45fd6f8b4a559613ca603b57498511740e65cd11a2e7dcec"
            ],
            "version": "==2.4.6"
        },
        "pyprint": {
            "hashes": [
                "sha256:c68976963bad16f15aa52e7734666012700c5dfbab604656867fa53ad7a2fe5d",
                "sha256:fa0e1c140b392b76f2028543fa70bae47900120282b119859cdde664d167b0e2"
            ],
            "version": "==0.2.6"
        },
        "pyroma": {
            "hashes": [
                "sha256:d3fd8055687c51f8cb704048d6432ecca8fb5513a9c2db857fc6617a095aaa50"
            ],
            "version": "==2.2"
        },
        "pyrsistent": {
            "hashes": [
                "sha256:cdc7b5e3ed77bed61270a47d35434a30617b9becdf2478af76ad2c6ade307280"
            ],
            "version": "==0.15.7"
        },
        "pytest": {
            "hashes": [
                "sha256:0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d",
                "sha256:ff615c761e25eb25df19edddc0b970302d2a9091fbce0e7213298d85fb61fef6"
            ],
            "index": "pypi",
            "version": "==5.3.5"
        },
        "pytest-cov": {
            "hashes": [
                "sha256:cc6742d8bac45070217169f5f72ceee1e0e55b0221f54bcf24845972d3a47f2b",
                "sha256:cdbdef4f870408ebdbfeb44e63e07eb18bb4619fae852f6e760645fa36172626"
            ],
            "index": "pypi",
            "version": "==2.8.1"
        },
        "pytest-mypy": {
            "hashes": [
                "sha256:3b7b56912d55439d5f447cc609f91caac7f74f0f1c89f1379d04f06bac777c32",
                "sha256:5a5338cecff17f005b181546a13e282761754b481225df37f33d37f86ac5b304"
            ],
            "index": "pypi",
            "version": "==0.4.2"
        },
        "pytest-timeout": {
            "hashes": [
                "sha256:80faa19cd245a42b87a51699d640c00d937c02b749052bfca6bae8bdbe12c48e",
                "sha256:95ca727d4a1dace6ec5f0534d2940b8417ff8b782f7eef0ea09240bdd94d95c2"
            ],
            "index": "pypi",
            "version": "==1.3.4"
        },
        "pytz": {
            "hashes": [
                "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d",
                "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"
            ],
            "version": "==2019.3"
        },
        "pyyaml": {
            "hashes": [
                "sha256:059b2ee3194d718896c0ad077dd8c043e5e909d9180f387ce42012662a4946d6",
                "sha256:1cf708e2ac57f3aabc87405f04b86354f66799c8e62c28c5fc5f88b5521b2dbf",
                "sha256:24521fa2890642614558b492b473bee0ac1f8057a7263156b02e8b14c88ce6f5",
                "sha256:4fee71aa5bc6ed9d5f116327c04273e25ae31a3020386916905767ec4fc5317e",
                "sha256:70024e02197337533eef7b85b068212420f950319cc8c580261963aefc75f811",
                "sha256:74782fbd4d4f87ff04159e986886931456a1894c61229be9eaf4de6f6e44b99e",
                "sha256:940532b111b1952befd7db542c370887a8611660d2b9becff75d39355303d82d",
                "sha256:cb1f2f5e426dc9f07a7681419fe39cee823bb74f723f36f70399123f439e9b20",
                "sha256:dbbb2379c19ed6042e8f11f2a2c66d39cceb8aeace421bfc29d085d93eda3689",
                "sha256:e3a057b7a64f1222b56e47bcff5e4b94c4f61faac04c7c4ecb1985e18caa3994",
                "sha256:e9f45bd5b92c7974e59bcd2dcc8631a6b6cc380a904725fce7bc08872e691615"
            ],
            "index": "pypi",
            "version": "==5.3"
        },
        "radon": {
            "hashes": [
                "sha256:035d6918f8d246ef70083993be70d1440a29701f403fe76c38595a45274b5063",
                "sha256:a9f9171e69b6b57d5f8e58f89c76a79d7e09d790cc8fff0f95cd4c946e8cee8e"
            ],
            "version": "==1.4.0"
        },
        "requests": {
            "hashes": [
                "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4",
                "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31"
            ],
            "index": "pypi",
            "version": "==2.22.0"
        },
        "restructuredtext-lint": {
            "hashes": [
                "sha256:e29dae3888168ff3813d34f554376fe4c58b6be2200dc1ced9cfea0e687b8b78"
            ],
            "version": "==1.0.1"
        },
        "rstcheck": {
            "hashes": [
                "sha256:cd3a1ce114a5f5a088caa8e4427dc03bc46d3332dd2b1153ef1184cd9eeabbcd"
            ],
            "version": "==2.2"
        },
        "safety": {
            "hashes": [
                "sha256:24035999031ad5f5f75df310abe4ecbb832b6de869752dc8abe52908a6878d29",
                "sha256:d7135e2934da57a64d9ad2d34854acc3d05075df91b6e2eddadd868ec6886573"
            ],
            "version": "==0.5.1"
        },
        "sarge": {
            "hashes": [
                "sha256:da8cc90883f8e5ab4af0d746438f608662f5f2a35da2e858517927edefa134b0"
            ],
            "version": "==0.1.5.post0"
        },
        "scspell3k": {
            "hashes": [
                "sha256:c7ee9dd5f9707d08885259246e20cf6bc73a1ac7876713ab7d1d3ce8cc6dcd09"
            ],
            "version": "==2.2"
        },
        "six": {
            "hashes": [
                "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
                "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
            ],
            "version": "==1.14.0"
        },
        "smmap2": {
            "hashes": [
                "sha256:0555a7bf4df71d1ef4218e4807bbf9b201f910174e6e08af2e138d4e517b4dde",
                "sha256:29a9ffa0497e7f2be94ca0ed1ca1aa3cd4cf25a1f6b4f5f87f74b46ed91d609a"
            ],
            "version": "==2.0.5"
        },
        "snowballstemmer": {
            "hashes": [
                "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0",
                "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"
            ],
            "version": "==2.0.0"
        },
        "sphinx": {
            "hashes": [
                "sha256:82cd2728c906be96e307b81352d3fd9fb731869234c6b835cc25e9a3dfb4b7e4",
                "sha256:b83f430200f546bfd5088c653f0c5516af708da36066dfde08d08bedb1b33a4b"
            ],
            "version": "==1.4.9"
        },
        "stevedore": {
            "hashes": [
                "sha256:01d9f4beecf0fbd070ddb18e5efb10567801ba7ef3ddab0074f54e3cd4e91730",
                "sha256:e0739f9739a681c7a1fda76a102b65295e96a144ccdb552f2ae03c5f0abe8a14"
            ],
            "version": "==1.31.0"
        },
        "template-remover": {
            "hashes": [
                "sha256:480f1ce63f56affac1edb29356afcca1260e8409cd928fcf9438fc149df5ff41"
            ],
            "version": "==0.1.9"
        },
        "termcolor": {
            "hashes": [
                "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"
            ],
            "version": "==1.1.0"
        },
        "toml": {
            "hashes": [
                "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c",
                "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e"
            ],
            "version": "==0.10.0"
        },
        "traitlets": {
            "hashes": [
                "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44",
                "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"
            ],
            "version": "==4.3.3"
        },
        "typed-ast": {
            "hashes": [
                "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355",
                "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919",
                "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa",
                "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652",
                "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75",
                "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01",
                "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d",
                "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1",
                "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907",
                "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c",
                "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3",
                "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b",
                "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614",
                "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb",
                "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b",
                "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41",
                "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6",
                "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34",
                "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe",
                "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4",
                "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"
            ],
            "version": "==1.4.1"
        },
        "typeshed": {
            "hashes": [
                "sha256:097c3f643fb754d38b0538c1d9d2b49f04e68ab6ea53196171c8663d9c473211",
                "sha256:5a9253eb9e9beaa54ee5aa4e41f1ba1af15ffcd647d0a27e22239b699626d07d"
            ],
            "index": "pypi",
            "version": "==0.0.1"
        },
        "typing-extensions": {
            "hashes": [
                "sha256:091ecc894d5e908ac75209f10d5b4f118fbdb2eb1ede6a63544054bb1edb41f2",
                "sha256:910f4656f54de5993ad9304959ce9bb903f90aadc7c67a0bef07e678014e892d",
                "sha256:cf8b63fedea4d89bab840ecbb93e75578af28f76f66c35889bd7065f5af88575"
            ],
            "version": "==3.7.4.1"
        },
        "unidiff": {
            "hashes": [
                "sha256:6e7ff4be1a9cd8d72197cd15ec735260b8b95d6f9d3e6fdc8a37301b12af0b27",
                "sha256:9c9ab5fb96b6988b4cd5def6b275492442c04a570900d33aa6373105780025bc"
            ],
            "version": "==0.5.5"
        },
        "urllib3": {
            "hashes": [
                "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc",
                "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"
            ],
            "version": "==1.25.8"
        },
        "virtualenv": {
            "hashes": [
                "sha256:0d62c70883c0342d59c11d0ddac0d954d0431321a41ab20851facf2b222598f3",
                "sha256:55059a7a676e4e19498f1aad09b8313a38fcc0cdbe4fdddc0e9b06946d21b4bb"
            ],
            "version": "==16.7.9"
        },
        "vulture": {
            "hashes": [
                "sha256:9c2dc36b84f3729361990b4488b7fde1cbe5afb9e3b59456aafc6928684fcd4b"
            ],
            "version": "==0.10"
        },
        "wcwidth": {
            "hashes": [
                "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603",
                "sha256:f28b3e8a6483e5d49e7f8949ac1a78314e740333ae305b4ba5defd3e74fb37a8"
            ],
            "version": "==0.1.8"
        },
        "wrapt": {
            "hashes": [
                "sha256:565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1"
            ],
            "version": "==1.11.2"
        },
        "yamllint": {
            "hashes": [
                "sha256:1c1fde0588308b6e01c27c750368bf47f44c5efade99d64dd5bce099862c97b9",
                "sha256:6d6cc4d6545aa40a0edc9039d63ce0828cd50d273c775e7df2092c9b28c15ed4"
            ],
            "version": "==1.6.1"
        },
        "yapf": {
            "hashes": [
                "sha256:4c00a1a97577119369f7a71f4f5c5e536315a9f9b07307e478508ed8d12ff596",
                "sha256:91888478e79277352e4fa7c0ddc0a6fe00a51c0d41322ab5ff3c44e66a918b14"
            ],
            "version": "==0.14.0"
        },
        "zipp": {
            "hashes": [
                "sha256:ccc94ed0909b58ffe34430ea5451f07bc0c76467d7081619a454bf5c98b89e28",
                "sha256:feae2f18633c32fc71f2de629bfb3bd3c9325cd4419642b1f1da42ee488d9b98"
            ],
            "version": "==2.1.0"
        }
    }
}

  THOTH_ADVISER_LIBRARY_USAGE: {"report": {"setuptools": ["setuptools.command.test.test", "setuptools.setup"], "sys": ["sys.exit", "sys.version_info"], "pytest": ["pytest.main", "pytest.fixture"], "sphinx_nameko_theme": ["sphinx_nameko_theme.get_html_theme_path"], "sentry_sdk": ["sentry_sdk.init", "sentry_sdk.integrations.aiohttp.AioHttpIntegration", "sentry_sdk.integrations.flask.FlaskIntegration", "sentry_sdk.integrations.logging.ignore_logger", "sentry_sdk.integrations.sqlalchemy.SqlalchemyIntegration"], "daiquiri": ["daiquiri.formatter.ColorFormatter", "daiquiri.output.Stream", "daiquiri.setup"], "time": ["time.gmtime"], "urllib3": ["urllib3.disable_warnings", "urllib3.disable_warnings"], "rfc5424logging": ["rfc5424logging.Rfc5424SysLogHandler"], "kubernetes": ["kubernetes.client.ApiClient", "kubernetes.client.Configuration", "kubernetes.client.rest.RESTClientObject", "kubernetes.config.new_client_from_config"], "openshift": ["openshift.dynamic.DynamicClient", "openshift.dynamic.exceptions.NotFoundError"], "requests": ["requests.get", "requests.post", "requests.get"], "argo": ["argo.workflows.client.ApiClient", "argo.workflows.client.V1alpha1Api", "argo.workflows.models.V1alpha1Metadata", "argo.workflows.models.V1alpha1Parameter", "argo.workflows.models.V1alpha1Workflow", "argo.workflows.models.V1alpha1WorkflowSpec", "argo.workflows.models.V1alpha1WorkflowStatus"], "yaml": ["yaml.safe_load", "yaml.safe_load"], "attrdict": ["attrdict.AttrDict"], "attr": ["attr.asdict", "attr.s", "attr.ib", "attr.s", "attr.ib", "attr.s", "attr.asdict", "attr.ib", "attr.s"], "thoth": ["thoth.common.Workflow", "thoth.common.Workflow.from_file", "thoth.common.Workflow.from_url"]}, "version": "0.0.7"}
  THOTH_ADVISER_REQUIREMENTS_FORMAT: pipenv
  THOTH_ADVISER_RECOMMENDATION_TYPE: latest
  THOTH_ADVISER_RUNTIME_ENVIRONMENT: {"hardware": {"cpu_family": null, "cpu_model": null}, "operating_system": {"name": "rhel", "version": "8"}, "python_version": "3.6", "cuda_version": null, "name": "rhel:8"}
  THOTH_ADVISER_METADATA: {"github_event_type": "thoth_thamos_advise", "github_check_run_id": 484501078, "github_installation_id": 6181026, "github_base_repo_url": "https://api.github.com/repos/thoth-station/common", "origin": "https://github.com/pacospace/common", "is_s2i": false}
  THOTH_ADVISER_SEED: 42
  THOTH_ADVISER_BEAM_WIDTH: 1000
  THOTH_ADVISER_LIMIT: 1000
  THOTH_ADVISER_COUNT: 1
  THOTH_ADVISER_LIMIT_LATEST_VERSIONS: 5
  THOTH_FORCE_SYNC:  0

Expected behavior
Advise is delivered regarding the software stack.

Screenshots

STEP                                    PODNAME                               DURATION  MESSAGE
 ⚠ adviser-142bd0d8-dfd3a3e6 (adviser)                                                  
 └-⚠ advise (advise/advise)             adviser-142bd0d8-dfd3a3e6-3290218390  2m        failed to save outputs: timeout after 0s

Additional context
Argo bug solved: argoproj/argo-workflows#1573

GitHub API Changes affecting our applications

Hi @AICoE Admin,

We're contacting you regarding upcoming changes to GitHub Apps owned by your organization:
  - Sefkhet-Abwy
  - Qeb-Hwt
  - aicoe-ci
  - Khebhut



We no longer support two events which your GitHub Apps may rely on, "integration_installation" and "integration_installation_repositories".

These events can be replaced with the "installation" and "installation_repositories" events respectively.

The "integration_installation" and "integration_installation_repositories" events will be removed after October 1st, 2020.

Please visit https://developer.github.com/changes/2020-04-15-replacing-the-installation-and-installation-repositories-events for more information about suggested changes, brownouts, and removal dates.

Thanks,
The GitHub Team

/kind feature
/priority important-soon
/assign @saisankargochhayat

Move logic to thoth-lab

qeb-hwt/app.py

Lines 277 to 282 in 0a27374

# TODO: Move logic to thoth-lab
justification = create_pretty_report_from_json(report=adviser_report, is_justification=True)
# Complete report
report = create_pretty_report_from_json(report=adviser_report)
_LOGGER.info("on_thamos_workflow_finished: len(report)=%s", len(report))


This issue was generated by todo based on a TODO comment in 0a27374 when #53 was merged. cc @pacospace.

Testing Qeb-Hwt

Is your feature request related to a problem? Please describe.
Testing Qeb-Hwt currently is not possible as we have webhook coming in from bots and GH check runs goes back to GH PRs opened. Therefore having two apps deployed that send back GH check runs on the same PR is not something we can use.

Describe the solution you'd like
Proposed solution is to add two env variables in qeb-hwt logic:

  • THOTH_ENVIRONMENT e.g for test, stage
  • THOTH_GH_REPO_TEST e.g. thoth-station/srcopsmetrics

These two env variables would allow for filtering webhooks coming from GH PRs. In this way:

  • in Thoth test environment the qeb-hwt app would receive only from one single GH repo so that GH check run can be sent back only for PRs coming from that repo.

  • in Thoth stage environment the qeb-hwt app would receive from everywhere except the single GH repo selected for testing.

This will allow for testing changes in the Qeb-Hwt App before moving them to stage environment.

Describe alternatives you've considered

Additional context

HTTPError: 503 Server Error: Service Unavailable for url: http://qeb-hwt-webhook-receiver-aicoe-prod-bots.apps.ocp4.prod.psi.redhat.com/


qeb-hwt-7c9dff24-1745642234: 2020-12-07T23:22:32.582190537Z {"name": "thoth.common", "levelname": "WARNING", "module": "logging", "lineno": 344, "funcname": "init_logging", "created": 1607383352.5818377, "asctime": "2020-12-07 23:22:32,581", "msecs": 581.8376541137695, "relative_created": 5711.118936538696, "process": 1, "message": "Logging to a Sentry instance is turned off"}
qeb-hwt-7c9dff24-1745642234: 2020-12-07T23:22:32.67324918Z Traceback (most recent call last):
qeb-hwt-7c9dff24-1745642234: 2020-12-07T23:22:32.67324918Z   File "qeb_thamos_advise.py", line 149, in <module>
qeb-hwt-7c9dff24-1745642234: 2020-12-07T23:22:32.673516838Z     qeb_hwt_thamos_advise()
qeb-hwt-7c9dff24-1745642234: 2020-12-07T23:22:32.673516838Z   File "qeb_thamos_advise.py", line 96, in qeb_hwt_thamos_advise
qeb-hwt-7c9dff24-1745642234: 2020-12-07T23:22:32.673674065Z     trigger_finished_webhook(exception_message=exception_message, has_error=True, error_type="MissingThothYamlFile")
qeb-hwt-7c9dff24-1745642234: 2020-12-07T23:22:32.673674065Z   File "/opt/app-root/src/thoth/workflow_helpers/trigger_finished_webhook.py", line 117, in trigger_finished_webhook
qeb-hwt-7c9dff24-1745642234: 2020-12-07T23:22:32.673840801Z     response.raise_for_status()
qeb-hwt-7c9dff24-1745642234: 2020-12-07T23:22:32.673840801Z   File "/opt/app-root/lib/python3.6/site-packages/requests/models.py", line 943, in raise_for_status
qeb-hwt-7c9dff24-1745642234: 2020-12-07T23:22:32.674506936Z     raise HTTPError(http_error_msg, response=self)
qeb-hwt-7c9dff24-1745642234: 2020-12-07T23:22:32.67451582Z requests.exceptions.HTTPError: 503 Server Error: Service Unavailable for url: http://qeb-hwt-webhook-receiver-aicoe-prod-bots.apps.ocp4.prod.psi.redhat.com/

Unclosed connection

/kind bug

Sentry Issue: THOTH-1PMH

Unclosed connection
client_connection: Connection<ConnectionKey(host='khemenu.thoth-station.ninja', port=443, is_ssl=True, ssl=None, proxy=None, proxy_auth=None, proxy_headers_hash=None)>

Failed to update dependencies to their latest version

Automatic dependency update failed for the current master with SHA 006fb05.

The automatic dependency management cannot continue. Please fix errors reported bellow.

Command
  $ pipenv update --dev
Standard output

Standard error
Warning: Python 3.7 was not found on your system…
Neither 'pyenv' nor 'asdf' could be found to install Python.
You can specify specific versions of Python with:
$ pipenv --python path/to/python

Environment details

Kebechet version: 1.0.1
Python version: 3.6.8
Platform: Linux-3.10.0-957.21.2.el7.x86_64-x86_64-with-redhat-8.2-Ootpa
pipenv version: pipenv, version 2020.6.2


Dependency graph
Unable to obtain dependency graph:

Warning: Python 3.7 was not found on your system…
Neither 'pyenv' nor 'asdf' could be found to install Python.
You can specify specific versions of Python with:
$ pipenv --python path/to/python

Notes

For more information, see Pipfile and Pipfile.lock.

Once this issue is resolved, the issue will be automatically closed by bot.

.thoth.yaml should be checked in the content, the presence is not enough

Describe the bug
.thoth.yaml can be present but not having inputs for adviser: https://github.com/thoth-station/srcops-testing/blob/master/.thoth.yaml

Expected behavior
In this case qeb-hwt outer workflow should check if the .thoth.yaml file has all required inputs for adviser otherwise report back to the user asking to add required information to the configuration file.

Screenshots

thamos-advise:	Traceback (most recent call last):
thamos-advise:	  File "/argo/staging/script", line 32, in <module>
thamos-advise:	    recommendation_type=thoth_yaml['runtime_environments'][0]['recommendation_type'],
thamos-advise:	KeyError: 'runtime_environments'

qeb-hwt is unavailable!

Describe the bug


2020-12-11 12:00:18,711   1 INFO     octomachinery.app.server.machinery:62: * user agent: Qeb-Hwt GitHub App/0.2.0-dev (+https://github.com/apps/qeb-hwt )
--
  | 2020-12-11 12:00:18,894   1 CRITICAL root:102: Traceback (most recent call last):
  | File "app.py", line 293, in <module>
  | name="Qeb-Hwt GitHub App", version=qeb_hwt_version, url="https://github.com/apps/qeb-hwt "
  | File "/opt/app-root/lib/python3.7/site-packages/octomachinery/app/server/runner.py", line 70, in run
  | run_until_complete(run_server_forever, config, event_routers)
  | File "/opt/app-root/lib/python3.7/site-packages/anyio/__init__.py", line 68, in run
  | return asynclib.run(func, *args, **backend_options)  # type: ignore
  | File "/opt/app-root/lib/python3.7/site-packages/anyio/_backends/_asyncio.py", line 96, in run
  | raise exception
  | File "/opt/app-root/lib/python3.7/site-packages/anyio/_backends/_asyncio.py", line 66, in wrapper
  | retval = await func(*args)
  | File "/opt/app-root/lib/python3.7/site-packages/octomachinery/utils/asynctools.py", line 14, in async_func_wrapper
  | return await async_func(*args, **kwargs)
  | File "/opt/app-root/lib/python3.7/site-packages/octomachinery/app/server/machinery.py", line 134, in run_forever
  | await _prepare_github_app(github_app)
  | File "/opt/app-root/lib/python3.7/site-packages/octomachinery/app/server/machinery.py", line 64, in _prepare_github_app
  | await github_app.log_installs_list()
  | File "/opt/app-root/lib/python3.7/site-packages/octomachinery/github/api/app_client.py", line 62, in log_installs_list
  | installations = await self.get_installations()
  | File "/opt/app-root/lib/python3.7/site-packages/octomachinery/github/api/app_client.py", line 126, in get_installations
  | preview_api_version='machine-man',
  | File "/opt/app-root/lib/python3.7/site-packages/octomachinery/utils/asynctools.py", line 82, in amap
  | yield await try_await(callback(async_value))
  | File "/opt/app-root/lib/python3.7/site-packages/octomachinery/utils/asynctools.py", line 67, in try_await
  | return await potentially_awaitable
  | File "/opt/app-root/lib/python3.7/site-packages/octomachinery/utils/asynctools.py", line 88, in callback_wrapper
  | return await try_await(callback(**args_dict))
  | TypeError: __init__() got an unexpected keyword argument 'has_multiple_single_files'

To Reproduce
Steps to reproduce the behavior:
unknown

/kind bug
/priority critical-urgent

No direct deps must not lead to failure

Describe the bug
If a project does not have direct dependencies, Qeb-Hwt shall not result in a failed check-run.

Expected behavior
successful check run with the comment that there are no direct dependencies.

Screenshots
check-run

Additional context
n/a

TypeError: on_pr_open_or_sync() missing 1 required keyword-only argument: 'installation'

Sentry Issue: THOTH-1PHV

CancelledError: 
  File "octomachinery/utils/asynctools.py", line 43, in _aio_gather_iter_pairs
    yield await task_res_q.get()
  File "anyio/_backends/_asyncio.py", line 724, in get
    return await super().get()
  File "asyncio/queues.py", line 163, in get
    await getter

TypeError: on_pr_open_or_sync() missing 1 required keyword-only argument: 'installation'
(8 additional frame(s) were not displayed)
...
  File "octomachinery/utils/asynctools.py", line 21, in _send_task_res_to_q
    task_res = await aio_task
  File "octomachinery/routing/routers.py", line 79, in dispatch
    await aio_gather(*callback_coros)
  File "octomachinery/routing/routers.py", line 77, in <genexpr>
    callback_coros = (cb(event, *args, **kwargs) for cb in callback_gen)
  File "octomachinery/routing/default_router.py", line 32, in wrapper
    return original_function(*args, **kwargs)
  File "octomachinery/routing/decorators.py", line 20, in wrapper
    return wrapped_function(**event.payload)

TypeError: __init__() got an unexpected keyword argument 'suspended_by'

Sentry Issue: THOTH-1P3T

TypeError: __init__() got an unexpected keyword argument 'suspended_by'
  File "octomachinery/routing/webhooks_dispatcher.py", line 58, in route_github_event
    github_install = await github_app.get_installation(github_event)
  File "octomachinery/github/api/app_client.py", line 104, in get_installation
    return await self.get_installation_by_id(install_id)
  File "octomachinery/github/api/app_client.py", line 113, in get_installation_by_id
    preview_api_version='machine-man',

Task exception was never retrieved
future: <Task finished coro=<route_github_event() done, defined at /opt/app-root/lib64/python3.7/site-packages/octomachinery/routing/webhooks_dispatcher.py:22> exception=TypeError("__init__() got an unexpected keyword argument 'suspended_by'")>

already solved (#102)

qeb-hwt/CHANGELOG.md

Lines 150 to 155 in 81a895c

* remove TODO already solved (#102)
### Automatic Updates
* :pushpin: Automatic update of dependency thoth-common from 0.19.0 to 0.20.0 (#109)
* :pushpin: Automatic update of dependency thoth-common from 0.19.0 to 0.20.0 (#108)
* :pushpin: Automatic update of dependency octomachinery from 0.2.2 to 0.3.0 (#107)
* :pushpin: Automatic update of dependency pytest from 6.0.1 to 6.0.2 (#105)


This issue was generated by todo based on a TODO comment in 81a895c when #114 was merged. cc @thoth-station.

already solved (#102)

qeb-hwt/CHANGELOG.md

Lines 150 to 155 in 19d3d3f

* remove TODO already solved (#102)
### Automatic Updates
* :pushpin: Automatic update of dependency thoth-common from 0.19.0 to 0.20.0 (#109)
* :pushpin: Automatic update of dependency thoth-common from 0.19.0 to 0.20.0 (#108)
* :pushpin: Automatic update of dependency octomachinery from 0.2.2 to 0.3.0 (#107)
* :pushpin: Automatic update of dependency pytest from 6.0.1 to 6.0.2 (#105)


This issue was generated by todo based on a TODO comment in 19d3d3f. It's been assigned to @sesheta because they committed the code.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.