Giter VIP home page Giter VIP logo

dotenv-linter's People

Contributors

ccs-tech avatar dependabot-preview[bot] avatar dependabot-support avatar dependabot[bot] avatar github-actions[bot] avatar hukkinj1 avatar kaelscion avatar kristobaljunta avatar skarzi avatar sobolevn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

dotenv-linter's Issues

Update to Click 7

recently black has an update and it uses minimum click 7. Is it possible to update the library to use click 7 as well? also please have a look at typer it will help future upgrades and will add shell completions.

Test each unique violation

We need to create integration tests for all violations.

How should it look like?

  1. We create a folder tests/fixtures/integration
  2. We create a folder called tests/test_violations/ where all other tests will be located
  3. Inside tests/test_violations/ we create a single test_VIOLATION_TYPE/ subfolder for all violation types
  4. Then we create individual tests file for each violation class in the corresponding types subfolders

How should it work?

  1. We create a fixture file with .env contents
  2. We start a new process with Popen to lint this fixture with dotenv-linter command
  3. We check the outputs

Example: https://github.com/wemake-services/wemake-python-styleguide/blob/master/tests/test_plugins.py

Don't expect any particular casing convention

While it is good for shell script authors to apply conventions of variable casing to distinguish between local and environment variables, this is unfortunately not a practical rule to use for environment variables in general.

Some applications have already begun to expect lowercase variable names (http_proxy), while other applications expect uppercase names (HTTP_PROXY). I wish a quick transition to a uniform standard would occur, but this has not been the case. So while the designer of a new environment-facing application should by all means prefer uppercase, we cannot reasonably apply a casing rule to .env files, because of the existing, mature exceptions.

Note that both lowercase and uppercase variables may be needed, for applications that need to apply proxy configurations to different sub-application calls. Hence, dotenv-linter should probably neither warn for duplicate variables as long as the declarations differ in casing.

Install all initial dependencies

We will surely rely on these dev dependencies:

pytest-cov = "^2.6"
pytest-flake8 = "^1.0"
pytest-randomly = "^1.2"
pytest = "^3.9"
mypy = "^0.641"
wemake-python-styleguide = "^0.5"

Roadmap

Purpose

The main idea of this project is to lint .env files like this one: https://github.com/wemake-services/wemake-django-template/blob/master/%7B%7Bcookiecutter.project_name%7D%7D/config/.env.template

Architecture

This should be an installable python package. We usually use poetry for that. Here's an example: https://github.com/wemake-services/wemake-python-styleguide/blob/master/pyproject.toml

How does the linting process work?

  1. We specify grammar that will be used for parsing .env files. I guess we will use ply for that. Here's an example of how we can create a simple grammar: https://github.com/ivelum/djangoql/blob/master/djangoql/ast.py

  2. We read files that are specified by user

1.1 I will have an extra look about how LSP protocol works, so this plugin can latter be easily integrated with vscode / sublime / etc

  1. Than we parse these files with our grammar, we get list of tokens / ast nodes as a result

  2. Than we perform checks on these tokens / nodes, like we do in https://github.com/wemake-services/wemake-python-styleguide/blob/master/wemake_python_styleguide/visitors/base.py

Technical decisions

I suggest to target python3.6 and python3.7. Or two latest versions of python in the future.
I suggest to use https://github.com/wemake-services/wemake-python-styleguide and mypy for linting
I suggest to use pytest for tests
I suggest to use sphinx for docs

Team

Currently we have:

Anyone is welcome!

Forbid extra leading spaces

You can write things like:

   KEY=1

But, this spaces before KEY will be removed. We need to warn about that.

Forbid spaces around `=`

You can write KEY = VALUE and you can write KEY=VALUE.
Let's stick to the second one, since it is more unix like.

Homebrew support

Rule request

Homebrew installation support, like:

brew install dotenv-linter

Thesis

Many developers use homebrew as their primary tool for package management.

Reasoning

Will be easy to engage more people to use.

Forbid raw names

We need to forbid to have these lines:

DJANGO_SECRET_KEY

What should be allowed?

DJANGO_SECRET_KEY=
POSTGRES_PASSWORD=123

release a new dotenv-linter version

Hi ๐Ÿ‘‹

Could you release a new dotenv-linter version to PyPI?
0.2.0 has click pinned to <8 which causes conflicts with a few other packages dependent on the newest click version (8.0.3)

Big thanks for developing and maintaining this project!

Forbid quoted values

Some tools do remove quotes from values like:

KEY="SOME TEXT"

And some tools don't do that. This can be a possible error later on.
We need to warn our users.

Separate files with the same keys raise a violation

Bug report

What's wrong

I have two separate files:

KEY=1

and

KEY=2

When I run dotenv-linter file1 file2 it raise two violations:

file2:1 102 Found duplicate name: KEY
file2:1 102 Found duplicate name: KEY

How is that should be

It should not raise any violations.
Since these two files are different. They can and should have the same keys.

Add dockerhub integration

Currently, we don't have any docker images. They might be useful to some people.
Plan:

  • create a Dockerfile and reuse it for #157
  • publish an image to Dockerhub
  • document it

Check for missing keys

Have you considered adding a rule to check for missing keys?

One possible use for that: on a system where application is running for some time and with periodical updates, a situation is possible, where an update will introduce a new key and that should be checked in .env

Not sure if this is in scope of a linter though, or should this be enforced by sane defaults/exceptions on application end.

GitHub action linting multiple dotenv files

Bug report

Hello ๐Ÿ‘‹

first of all thanks for another awesome project!

What's wrong

I have troubles with GitHub action when options is list of files.
In one of my projects I have multiple dotenv files stored in multiple directories, something like:

.envs/
  .webserver/
    .something
  .worker/
    .something_else

so I wanted to use find and paste combination to create output with string being space separated list of all dotenv files that I want to lint.
I have also checked that passing such string to options input directly like listed in docs and below fails.

...
 with:
    options: '.envs/.webserver/.something .envs/.webserver/.something_else'

It probably doesn't work because in entrypoint.sh - output=$(dotenv-linter "$INPUT_OPTIONS") is quoted to prevent globbing (if I understand correctly), but this also feeds dotenv-liter command with one argument that is regular string, something like:

dotenv-linter ".envs/.webserver/.something .envs/.webLinting options: .envs/.dist/.slave-1 .envs/.dist/.master .envs/.dist/.slave-2
11
server/.something_else"

so the command fails with following output:

Error: Invalid value for "files": Path ".envs/.webserver/.something .envs/.webserver/.something_else .envs/.worker/.something" does not exist.

How is that should be

It should work properly as described in docs.
When I remove quotes in entrypoint.sh getting - $(dotenv-linter $INPUT_OPTIONS) it works as expected, however it expands globs, which may be undesired behaviour.

System information

GitHub actions runs on ubuntu-latest. However I have also tested it by building image and running command inside it locally.
If it will be helpful I can prepare some simple failing example later on this week.

flake8 information

Contents of flake8 --bug-report:

pip information

Contents of pip freeze:

Empty comments raises `ParseViolation`

Bug report

What's wrong

This file:

# First line
#
# Third line

Causes a crash:

config/.env:0 001 Unable to correctly parse dotenv file

How is that should be

It should pass without an issue.

Feature: Ability to configure enabled violations

Feature request

Having a linter is cool and all, but the use case of each developer changes from case to case. I understand how a lot of these violations make sense, but there might be cases at which a certain violation should be disabled due to the implementation of the dotenv loader.

For example, see this release note of the php dot env loader: https://github.com/vlucas/phpdotenv/releases/tag/v3.0.0 which advertises multiline comments. According to https://github.com/vlucas/phpdotenv/blob/master/src/Loader.php#L16 it will only work when wrapping the value in quotes.
In older versions of the loader it would even throw an exception when working with a value with spaces not wrapped in quotes: https://github.com/vlucas/phpdotenv/blob/2.5/src/Loader.php#L262

Another example, albeit less substantiated, having duplicate keys in a dotenv would be possible when the loader provides functionality similar to parsing .ini files.
A valid .ini example:

[DATABASE]
database = mysqli://username:password@localhost/my_database
[ADMIN_DATABASE]
database = mysqli://admin:adminpassword@localhost/my_database

Perhaps a silly example but I hope you understand my point :P

What's wrong

There's currently no way to enable/disable specific violations. As of this moment, I can't implement this package in our pipeline due to the disallowed quoted values. For other developers, it could be any of the other violations which would prevent them from using this linter.

How is that should be

Having a way to configure the violations which are applicable to the developer would make this package a whole lot more useful since it's adoption would be a lot easier and flexible

I suggest, besides perhaps supporting the configuration of violations via cli arguments, to be able to provide a config file containing the configuration for the linter to use.
A good example would be the php code sniffer which supports an xml file containing the full configuration for the code sniffer command to use.
Another syntax like yaml or json would be fine as well of course.

And as icing on the cake you could even let developers configure whether an error or a warning is issued for each violation. This would make it even more useful in automated pipelines where errors are not allowed but warnings won't halt the pipeline. For example: quoted strings aren't really a big deal, so if a developer wants to, that could be a warning. While having duplicate name in your dotenv is a big no go. But this could be a separate feature request which would be dependent on this feature request.

Let me know what you think :)

As a sidenote, this feature request might depend on this feature: Test each unique violation #13

Increase verbosity of "Unable to correctly parse dotenv file" error when violating IncorrectNameViolation

Bug report

What's wrong

The linter will return a rather not-helpful message "Unable to correctly parse dotenv file" when the dotenv file contains invalid characters in the name. For example:

;INCORRENT_COMMENT=disabled
SOME@KEY=incorrect

How is that should be

The linter should return something like:

.env:22 101 Found incorrect name: ;INCORRENT_COMMENT
.env:23 101 Found incorrect name: SOME@KEY

System information

Linux homestead 4.15.0-32-generic #35-Ubuntu SMP Fri Aug 10 17:58:07 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

flake8 information

n/a

pip information

not relevant

cannot import name 'field' from 'attr'

+ dotenv-linter config/.env config/.env.template
Traceback (most recent call last):
  File "/usr/local/bin/dotenv-linter", line 5, in <module>
    from dotenv_linter.cli import cli
  File "/usr/local/lib/python3.9/site-packages/dotenv_linter/cli.py", line 11, in <module>
    from dotenv_linter.checker import DotenvFileChecker
  File "/usr/local/lib/python3.9/site-packages/dotenv_linter/checker.py", line 8, in <module>
    from dotenv_linter.grammar.fst import Module
  File "/usr/local/lib/python3.9/site-packages/dotenv_linter/grammar/fst.py", line 22, in <module>
    from attr import dataclass, field
ImportError: cannot import name 'field' from 'attr' (/usr/local/lib/python3.9/site-packages/attr/__init__.py)

Create a binary release

Some users say, that we need a binary release, so it would be possible to just use wget or curl to install this project.

So, let's do it.

Multiline quoted values are considered as error

Bug report

A good example of a multiline value is a public key in .env:

JWT_FAN_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu1SU1LfVLPHCozMxH2Mo
4lgO....
mwIDAQAB
-----END PUBLIC KEY-----"

What's wrong

It complains of multiline values in a vague manner, see #30 .

Shell trace:

dotenv-linter config/.env config/.env.template
config/.env:0 001 Unable to correctly parse dotenv file
config/.env.template:0 001 Unable to correctly parse dotenv file

How is that should be

It should pass the validation.

System information

flake8 information

Contents of flake8 --bug-report:

{
  "dependencies": [],
  "platform": {
    "python_implementation": "CPython",
    "python_version": "3.9.10",
    "system": "Linux"
  },
  "plugins": [
    {
      "is_local": false,
      "plugin": "flake8-bandit",
      "version": "3.0.0"
    },
    {
      "is_local": false,
      "plugin": "flake8-broken-line",
      "version": "0.4.0"
    },
    {
      "is_local": false,
      "plugin": "flake8-bugbear",
      "version": "22.3.23"
    },
    {
      "is_local": false,
      "plugin": "flake8-comprehensions",
      "version": "3.8.0"
    },
    {
      "is_local": false,
      "plugin": "flake8-darglint",
      "version": "1.8.1"
    },
    {
      "is_local": false,
      "plugin": "flake8-debugger",
      "version": "4.0.0"
    },
    {
      "is_local": false,
      "plugin": "flake8-django",
      "version": "1.1.1"
    },
    {
      "is_local": false,
      "plugin": "flake8-docstrings",
      "version": "1.6.0, pydocstyle: 6.1.1"
    },
    {
      "is_local": false,
      "plugin": "flake8-eradicate",
      "version": "1.2.0"
    },
    {
      "is_local": false,
      "plugin": "flake8-pytest-style",
      "version": "1.6.0"
    },
    {
      "is_local": false,
      "plugin": "flake8-string-format",
      "version": "0.3.0"
    },
    {
      "is_local": false,
      "plugin": "flake8_commas",
      "version": "2.1.0"
    },
    {
      "is_local": false,
      "plugin": "flake8_isort",
      "version": "4.1.1"
    },
    {
      "is_local": false,
      "plugin": "flake8_quotes",
      "version": "3.3.1"
    },
    {
      "is_local": false,
      "plugin": "logging-format",
      "version": "0.6.0"
    },
    {
      "is_local": false,
      "plugin": "mccabe",
      "version": "0.6.1"
    },
    {
      "is_local": false,
      "plugin": "naming",
      "version": "0.12.1"
    },
    {
      "is_local": false,
      "plugin": "nitpick",
      "version": "0.32.0"
    },
    {
      "is_local": false,
      "plugin": "pycodestyle",
      "version": "2.7.0"
    },
    {
      "is_local": false,
      "plugin": "pyflakes",
      "version": "2.3.1"
    },
    {
      "is_local": false,
      "plugin": "rst-docstrings",
      "version": "0.2.5"
    },
    {
      "is_local": false,
      "plugin": "wemake_python_styleguide",
      "version": "0.16.1"
    }
  ],
  "version": "3.9.2"
}

pip information

Contents of pip freeze:

alabaster @ file:///var/cache/pypoetry/artifacts/48/57/b7/0e44080d4c6f80ece83e427f90368b376fdec42759b60c2c37a04da23b/alabaster-0.7.12-py2.py3-none-any.whl
appdirs @ file:///var/cache/pypoetry/artifacts/47/cf/4f/4ef02fb715aa36daeebad18cc5570126159c659c41c7b5ec46a7387d9b/appdirs-1.4.4-py2.py3-none-any.whl
asgiref @ file:///var/cache/pypoetry/artifacts/97/19/96/6fe4e79be71b46c24f8ad1d77086edd058efc60976b764fcac45c2e160/asgiref-3.5.0-py3-none-any.whl
astor @ file:///var/cache/pypoetry/artifacts/1f/03/36/982d1222edac5e8cb8ac6e0464249747fa800d4fb04728a99153ecfe4d/astor-0.8.1-py2.py3-none-any.whl
asttokens @ file:///var/cache/pypoetry/artifacts/cc/f5/53/c8c73ee645bbb70b6b0ce34f55ed59b6f3f3238881f15a7e44ebe2ce2d/asttokens-2.0.5-py2.py3-none-any.whl
attrs @ file:///var/cache/pypoetry/artifacts/5b/25/94/5d165cd3190cb7dfdc98de86c28e8131fc6e19d83a504412664abffec0/attrs-21.4.0-py2.py3-none-any.whl
autorepr @ file:///var/cache/pypoetry/artifacts/79/b0/2c/559adfad5f45b74ef658fdab7bff52f955339a62d1aeae798f390f88d9/autorepr-0.3.0-py2.py3-none-any.whl
Babel @ file:///var/cache/pypoetry/artifacts/1e/28/b6/110e8fc8ccc0dafe21bbc521139d0d0674574f7daa6f6f90137bdb4759/Babel-2.9.1-py2.py3-none-any.whl
backcall @ file:///var/cache/pypoetry/artifacts/43/8e/e8/4e598704edf6fb4a53d552ea511c04e9958dcf850897760e5387878b99/backcall-0.2.0-py2.py3-none-any.whl
bandit @ file:///var/cache/pypoetry/artifacts/e1/dd/ec/e62dfd3ee09d3cd493d916e8c091fd36282782651007fa0eb0dd0a47dc/bandit-1.7.4-py3-none-any.whl
bcrypt @ file:///var/cache/pypoetry/artifacts/9e/d8/b7/98bc0f261bc7bbaf83dc5f4bea9537492452fd402ed6b7e9d2e650ac3f/bcrypt-3.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl
blinker @ file:///var/cache/pypoetry/artifacts/80/f5/69/121d7a9c19924e7c996e4e59d73db84bdcb556f8587bf809606e4c2859/blinker-1.4.tar.gz
cattrs @ file:///var/cache/pypoetry/artifacts/9c/25/df/aa6665eb923fafb1a2a0097a060464ba72a5ad40f9b24d6c93e9c779e6/cattrs-1.10.0-py3-none-any.whl
certifi @ file:///var/cache/pypoetry/artifacts/71/9a/ba/a51b34ce9aacf9ac5dbb90d7c7335877522ee188189d9a521ee1a9c411/certifi-2021.10.8-py2.py3-none-any.whl
cffi @ file:///var/cache/pypoetry/artifacts/0b/b7/48/30ff76ec327f0041e809dd9c35b741a68d6d8566a123e6dabda722536a/cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
charset-normalizer @ file:///var/cache/pypoetry/artifacts/2b/25/ee/fa64b49cb44c9c392acf26e69ee8314d3b386932de86a9945f4ad2e633/charset_normalizer-2.0.12-py3-none-any.whl
click @ file:///var/cache/pypoetry/artifacts/c8/49/bb/2cd4d1e4554d3cdd76625d4ed56663d7e793123d1a36e8ae1d67a5a6d9/click-8.1.0-py3-none-any.whl
click-default-group @ file:///var/cache/pypoetry/artifacts/16/7e/58/9e411ca51d8f7b1276c5eb6f5780d10f39ee506839617ece9a5d229fbd/click-default-group-1.2.2.tar.gz
ConfigUpdater @ file:///var/cache/pypoetry/artifacts/40/87/c8/f412301c7171b20fe38c61640da4e7ace132fe8ae24cf0850f49992eb5/ConfigUpdater-3.1-py2.py3-none-any.whl
coverage @ file:///var/cache/pypoetry/artifacts/67/c6/b5/6278ee4c01ddec492ba84935b44db1898a08d44567af67faf8787802ca/coverage-6.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
cryptography @ file:///var/cache/pypoetry/artifacts/c9/00/7a/1d15e37ad46f546b7d06edda32e1f94f7afc0f5caf09e744c2ac6b27be/cryptography-36.0.2-cp36-abi3-manylinux_2_24_x86_64.whl
darglint @ file:///var/cache/pypoetry/artifacts/2d/47/f9/e4df12fe8185cdb64f2f77c23d349693941e09d8d5374c68454fb12e4f/darglint-1.8.1-py3-none-any.whl
decorator @ file:///var/cache/pypoetry/artifacts/5d/5c/84/5cc4430045ad08424f907a400ea96b8345cbfec6d87285e47a6c449740/decorator-5.1.1-py3-none-any.whl
dennis @ file:///var/cache/pypoetry/artifacts/0d/27/be/f91e40a24c3146b21eeb0a74e0885798c611c70e51fb2980d000698000/dennis-0.9-py2.py3-none-any.whl
dictdiffer @ file:///var/cache/pypoetry/artifacts/bc/85/a4/4043bd24ee0498bfa674ee88c3b151fb29f0946a2b17b0f3e5f02c906b/dictdiffer-0.9.0-py2.py3-none-any.whl
Django @ file:///var/cache/pypoetry/artifacts/0d/23/7a/b07a7d6199ada0737b70977203f6f168ed1d50799b0fa2378e2443a750/Django-3.2.12-py3-none-any.whl
django-axes @ file:///var/cache/pypoetry/artifacts/c7/ae/51/ce01ff73c6ca29d554ea13ada49163108e0fc80909fb41b1f87869d030/django_axes-5.31.0-py3-none-any.whl
django-coverage-plugin @ file:///var/cache/pypoetry/artifacts/43/5e/3e/5010cae08427e16ade81bf1691fd02c13670be4092e19e1a821b7fe553/django_coverage_plugin-2.0.2-py3-none-any.whl
django-csp @ file:///var/cache/pypoetry/artifacts/d0/34/4a/8d007a8d828993707d973b17edf381be3bc033b80dac82b61e51ac2d29/django_csp-3.7-py2.py3-none-any.whl
django-debug-toolbar @ file:///var/cache/pypoetry/artifacts/58/74/61/f227b9dce16c03b515318bfdeadae6fcd22107ed69534375ef40a05f67/django_debug_toolbar-3.2.4-py3-none-any.whl
django-extra-checks @ file:///var/cache/pypoetry/artifacts/fc/0a/a9/47e1063e7b9fb0c021d0db33b6541d87d453180001284f969749b4ea88/django_extra_checks-0.11.0-py3-none-any.whl
django-health-check @ file:///var/cache/pypoetry/artifacts/87/8c/68/5a65a062a0058a3a12b58b5295a8f7d9a64f3e071a4e9cd2073c213fca/django_health_check-3.16.5-py2.py3-none-any.whl
django-http-referrer-policy @ file:///var/cache/pypoetry/artifacts/dd/d3/d2/ad8be4d52afa557b75fcd359fb125d1eac84ada623e59bad72d91fd17a/django_http_referrer_policy-1.1.1-py2.py3-none-any.whl
django-ipware @ file:///var/cache/pypoetry/artifacts/d9/5b/15/1d1ac36abc84349e898e7a2be8858c9c7490e9b20efbc0bafce3e9e344/django_ipware-4.0.2-py2.py3-none-any.whl
django-migration-linter @ file:///var/cache/pypoetry/artifacts/d7/bb/a7/7b5931129b5f50f096e23145208b3306972ebda7812f2f9b21d9fbd769/django_migration_linter-4.0.0-py2.py3-none-any.whl
django-permissions-policy @ file:///var/cache/pypoetry/artifacts/7d/2b/ca/ea75f5a8eef6129cbd5ca1a30819e788634af7926c1a396afb4b48015e/django_permissions_policy-4.9.0-py3-none-any.whl
django-querycount @ file:///var/cache/pypoetry/artifacts/03/cc/8b/0ab87e1e14eaaf26f19612a68bdcd08208ab05c57511cbf45555264b94/django-querycount-0.7.0.tar.gz
django-split-settings @ file:///var/cache/pypoetry/artifacts/ef/3e/ef/b021873d1b32bea8df2066771bb8804f0ada0fd66f2e340e4c98845f00/django_split_settings-1.1.0-py3-none-any.whl
django-stubs @ file:///var/cache/pypoetry/artifacts/49/4c/e8/15e33b1eba2afeafd202ad1a4f6271bf6700af6e406ab737d293c27b0a/django_stubs-1.10.1-py3-none-any.whl
django-stubs-ext @ file:///var/cache/pypoetry/artifacts/82/1f/f6/595d5eb10de2b1ecef61544bd1d9ea6610af0706da6596b8d12df21273/django_stubs_ext-0.4.0-py3-none-any.whl
django-test-migrations @ file:///var/cache/pypoetry/artifacts/39/6f/d0/73fa582c5408bdcfa3ed2b06d52290b40c0bf547940e79d12d281856b1/django_test_migrations-1.2.0-py3-none-any.whl
djangorestframework @ file:///var/cache/pypoetry/artifacts/4a/0e/8b/eb31ad1f5a8d0aef287e2de8aeed7d250803677468c74b0abd296678b8/djangorestframework-3.13.1-py3-none-any.whl
doc8 @ file:///var/cache/pypoetry/artifacts/62/d9/c0/339e78b9e83afdddb707c603cf6694e8a2d8990fc2074e140811e88975/doc8-0.11.1-py3-none-any.whl
docopt @ file:///var/cache/pypoetry/artifacts/62/59/95/15eae6f8c50ce007785835b8aa0679822968e1f7fdb53964bf2ac50671/docopt-0.6.2.tar.gz
docutils @ file:///var/cache/pypoetry/artifacts/43/28/92/79000933ad30371dc938d9b368a9000e20ac0bb467a716c19ef1fbd3c7/docutils-0.17.1-py2.py3-none-any.whl
dotenv-linter @ file:///var/cache/pypoetry/artifacts/88/12/89/a93880e8f7491300abbf97ce78722882723ebb905f23cc629297dcca66/dotenv_linter-0.3.0-py3-none-any.whl
dparse @ file:///var/cache/pypoetry/artifacts/0e/d3/3f/27b08502c8c8da888ca1b2701c4f1d91b6777be03197cc2566b65eb3dd/dparse-0.5.1-py3-none-any.whl
dpath @ file:///var/cache/pypoetry/artifacts/7c/ba/dd/0b2e0c72068f1f80e3050cbc8ccb9c336a39faea2a4b0659be32e74e21/dpath-2.0.6-py3-none-any.whl
dump-env @ file:///var/cache/pypoetry/artifacts/fb/18/a6/9e870a9b3d8cb24700fbba951a42b3686ca183a0e801b539c16593acf7/dump_env-1.3.0-py3-none-any.whl
eradicate @ file:///var/cache/pypoetry/artifacts/12/ce/ac/197035fe6d51568abb7ea160f5ad416d2164a2010005e8356b8229e550/eradicate-2.0.0.tar.gz
executing @ file:///var/cache/pypoetry/artifacts/db/dd/b5/f62d2b5c6262637d6343857b8979bc8f3de8d3b94ddf5fdeb7487e22e3/executing-0.8.3-py2.py3-none-any.whl
flake8 @ file:///var/cache/pypoetry/artifacts/3f/57/d5/11722093c13092cc3bfc3dd7c88aef6f8e4d5ac97cfe5fd054d5aba412/flake8-3.9.2-py2.py3-none-any.whl
flake8-bandit @ file:///var/cache/pypoetry/artifacts/0a/7f/bc/bf09e6064c6f1a6c159621a7d5fada54b636229a3dabb426085daba31b/flake8_bandit-3.0.0-py2.py3-none-any.whl
flake8-broken-line @ file:///var/cache/pypoetry/artifacts/a3/9f/36/0224d46b3050800707535f9c03fee2b60fcc1b48f3c4b419d2cd1bcbd0/flake8_broken_line-0.4.0-py3-none-any.whl
flake8-bugbear @ file:///var/cache/pypoetry/artifacts/70/6f/8b/dba01c4ea9cacb2c31ffb4cb9f030f9d0f3ae5f864bfc703eed10f37b4/flake8_bugbear-22.3.23-py3-none-any.whl
flake8-commas @ file:///var/cache/pypoetry/artifacts/32/06/3d/62f07a797bd4a6d9f15ead0b6306a47bd0650ca9b3e20aa08d4ee2c23d/flake8_commas-2.1.0-py2.py3-none-any.whl
flake8-comprehensions @ file:///var/cache/pypoetry/artifacts/8a/f0/bd/c5b42fff0dce6be658153f234d81795c2344f5a2c4f69e1c7e6e9736d8/flake8_comprehensions-3.8.0-py3-none-any.whl
flake8-debugger @ file:///var/cache/pypoetry/artifacts/66/04/47/7bef98a8d237eb17cbfbcb803343be1c79e2c0674ceba163717b6c8e1b/flake8_debugger-4.0.0-py3-none-any.whl
flake8-django @ file:///var/cache/pypoetry/artifacts/e3/98/6a/1f0dfad4bcbe43338eeed14fcdefe4991f36f1f9b9bb0d65266dcdc654/flake8_django-1.1.2-py3-none-any.whl
flake8-docstrings @ file:///var/cache/pypoetry/artifacts/e0/85/e9/6b482a11d48cf26e1170d9f5bf0b044a5a6c9b816ffe70945e90fc3e56/flake8_docstrings-1.6.0-py2.py3-none-any.whl
flake8-eradicate @ file:///var/cache/pypoetry/artifacts/94/a4/1b/56cd39944d5d4d2639e80929837e7fc3b2ff432e095fd7a4d528c56090/flake8_eradicate-1.2.0-py3-none-any.whl
flake8-isort @ file:///var/cache/pypoetry/artifacts/73/53/0f/7e71fed3a8631dfabd048e16a84f9fb8e15c8c9a381bda2a444bf42961/flake8_isort-4.1.1-py3-none-any.whl
flake8-logging-format @ file:///var/cache/pypoetry/artifacts/44/ad/98/9770fba04f15ce5a2aa59adeb2e1e65dcd1fdeb713431fdeb05aca0c58/flake8-logging-format-0.6.0.tar.gz
flake8-plugin-utils @ file:///var/cache/pypoetry/artifacts/d1/c5/cd/002f81a0e6fe87b5dc718a0f7381e43f0814e72acccd04d84899cb342b/flake8_plugin_utils-1.3.2-py3-none-any.whl
flake8-polyfill @ file:///var/cache/pypoetry/artifacts/28/17/cc/952c11cd5ffb2608137557f928dc4f9365b4dbe1e2a6015eeea78583ac/flake8_polyfill-1.0.2-py2.py3-none-any.whl
flake8-pytest-style @ file:///var/cache/pypoetry/artifacts/da/07/65/f01e20adbfd9eacf37bea3f2a189a12bd2ad42eb8edad18b487e3c4af1/flake8_pytest_style-1.6.0-py3-none-any.whl
flake8-quotes @ file:///var/cache/pypoetry/artifacts/76/04/0d/e3326c63986618bbd2e54c3211274f66a0bfae21c700e3e67ed14640cd/flake8-quotes-3.3.1.tar.gz
flake8-rst-docstrings @ file:///var/cache/pypoetry/artifacts/07/75/20/16ffb132e46114df2fbe48fe2f50254b3f8ea6016371f04addc6738f41/flake8_rst_docstrings-0.2.5-py3-none-any.whl
flake8-string-format @ file:///var/cache/pypoetry/artifacts/24/89/bb/7ce8e216f8c7289aa8a2ad4c44f30f87af6c7cdaf5d510110d566d66ec/flake8_string_format-0.3.0-py2.py3-none-any.whl
flatten-dict @ file:///var/cache/pypoetry/artifacts/26/bb/15/9b7ce0da158ec2a7d5ea6bad65b1411625b78bdc4d4fadfee34f74c5a1/flatten_dict-0.4.2-py2.py3-none-any.whl
furl @ file:///var/cache/pypoetry/artifacts/3e/b6/5a/905e80c0db0fe7a997da21a822502002912d8076d5c5ba2f758bbe318e/furl-2.1.3-py2.py3-none-any.whl
gitdb @ file:///var/cache/pypoetry/artifacts/90/22/b2/13e35fcefe45f6779d7507377070865acf263775bda5c08fff422c1a4d/gitdb-4.0.9-py3-none-any.whl
GitPython @ file:///var/cache/pypoetry/artifacts/c0/0a/c6/d3f006e6bd78795a03581a408b47eed8e5839bd35849453d0b65c005d5/GitPython-3.1.27-py3-none-any.whl
gunicorn @ file:///var/cache/pypoetry/artifacts/d4/22/ea/fb991f1fdb4e8ae8fd30e0bce3c23ece991aa75df3f5a4c4f4d5aba6ae/gunicorn-20.1.0-py3-none-any.whl
hypothesis @ file:///var/cache/pypoetry/artifacts/8c/16/2a/d0121170b123b9c14fe38331fd7eb0553d80dd97b96aa2d89df0cf8612/hypothesis-6.41.0-py3-none-any.whl
identify @ file:///var/cache/pypoetry/artifacts/43/96/84/cf181c7ebd84e914f9a0b2aef0b19fd311d3fe841e7fe02a6b481ca1f2/identify-2.4.12-py2.py3-none-any.whl
idna @ file:///var/cache/pypoetry/artifacts/d5/04/80/9c17fd3240a37d12ff2ef042b0306aeb1abd2d8b95f150fd60be938352/idna-3.3-py3-none-any.whl
imagesize @ file:///var/cache/pypoetry/artifacts/96/5c/68/c505397f41dd445fe3305ed42a0c203fe0f36fee2cbb522ef564d90d71/imagesize-1.3.0-py2.py3-none-any.whl
importlib-metadata @ file:///var/cache/pypoetry/artifacts/0e/bf/b8/5aa8328f4872f2f038b15e48abea8dbe20ba8b18cc0309ad17a127019e/importlib_metadata-4.11.3-py3-none-any.whl
iniconfig @ file:///var/cache/pypoetry/artifacts/fa/b0/c6/10cfac68c9e6de9d2a1678366ca89fd9292b362c1760dbe758e41691cb/iniconfig-1.1.1-py2.py3-none-any.whl
ipython @ file:///var/cache/pypoetry/artifacts/ae/65/35/08eb74fc34169f264d54aed92dc0b070498e3e74dd57feae6b3b5fce35/ipython-8.2.0-py3-none-any.whl
isort @ file:///var/cache/pypoetry/artifacts/9d/c0/d5/617ee6ec6b065b9a3c8c3f7a0b06604f1a47738904535923554e135a7d/isort-5.10.1-py3-none-any.whl
jedi @ file:///var/cache/pypoetry/artifacts/c0/16/7b/b208472f00204d5aaeb0895fcde8e681c56c250bdf8d106fa76cdf7b30/jedi-0.18.1-py2.py3-none-any.whl
Jinja2 @ file:///var/cache/pypoetry/artifacts/72/17/28/89e0501c998a9d7241d2c068d57e21d274caaa3ea52f338b31ba912c30/Jinja2-3.1.1-py3-none-any.whl
jmespath @ file:///var/cache/pypoetry/artifacts/9b/2b/69/20e4f26420d69eb0e0a57f76a4bec6cb3d6747f30e744483165c06fd47/jmespath-1.0.0-py3-none-any.whl
loguru @ file:///var/cache/pypoetry/artifacts/af/c5/2e/90fa5f415cade87a24f804aa29454a5263fa93efb5f9568878194ebad1/loguru-0.6.0-py3-none-any.whl
MarkupSafe @ file:///var/cache/pypoetry/artifacts/f4/6d/d3/a9a915049dea17a65026c9ac187154834bfe6c9174f0dd25e602f28c45/MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
marshmallow @ file:///var/cache/pypoetry/artifacts/b1/a8/f0/dc5ab8b9250d261e30d3dccf2712fdb1abdda469f9a8ed4b26317c411d/marshmallow-3.15.0-py3-none-any.whl
marshmallow-polyfield @ file:///var/cache/pypoetry/artifacts/15/54/1a/bf7b323a7e9bef7044335503b044f792374a95673e74fcf13d80690a10/marshmallow_polyfield-5.10-py3-none-any.whl
matplotlib-inline @ file:///var/cache/pypoetry/artifacts/b5/de/c6/6384d0999287fcdc9e88d38f7951106dcb7ffac7c4e8c0d0c665e12cac/matplotlib_inline-0.1.3-py3-none-any.whl
mccabe @ file:///var/cache/pypoetry/artifacts/96/5e/5f/21ae5296697ca7f94de4da6e21d4936d74029c352a35202e4c339a4253/mccabe-0.6.1-py2.py3-none-any.whl
more-itertools @ file:///var/cache/pypoetry/artifacts/a6/67/cb/fbf4fb4bbfedae39080e351b12ca64287d47c839769eeaf91434f3274c/more_itertools-8.12.0-py3-none-any.whl
mypy @ file:///var/cache/pypoetry/artifacts/d4/da/d3/1a1c57050f64829d33d3f8ed5bbfa5552d8c77f6d236e65688cd1dd3a5/mypy-0.942-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
mypy-extensions @ file:///var/cache/pypoetry/artifacts/92/45/bf/1807ce854ff668d92602207a37bfa9316def2a3f257bd03c4c5be4bc9b/mypy_extensions-0.4.3-py2.py3-none-any.whl
nitpick @ file:///var/cache/pypoetry/artifacts/ed/15/38/9a2feec831ee98ccd2c1e2b2ef3d6c09b8f7671f753d6012a0d9075a5a/nitpick-0.32.0-py3-none-any.whl
nplusone @ file:///var/cache/pypoetry/artifacts/d1/98/0e/1a934f485b1ecaf2c61214530f84a759a58a7f1153285678cb27a030d6/nplusone-1.0.0-py2.py3-none-any.whl
orderedmultidict @ file:///var/cache/pypoetry/artifacts/26/0f/83/fbc0d74820163c8be8a1153fb4a4244bab2097cf7fa875e7ad9bb436b9/orderedmultidict-1.0.1-py2.py3-none-any.whl
packaging @ file:///var/cache/pypoetry/artifacts/47/3f/ce/b240169f7d8bef1ff24a0269b709721ce86543c2ec25e0b6adb2c2d7ac/packaging-21.3-py3-none-any.whl
parso @ file:///var/cache/pypoetry/artifacts/4e/d3/c5/d91e200388f1ce44b74484eb39fbfd0797eb236741d3672a7d728668b2/parso-0.8.3-py2.py3-none-any.whl
pathspec @ file:///var/cache/pypoetry/artifacts/0a/67/21/620031f7f2938bad77b057a68a4c2a334542a7402a3214ed48690caf8c/pathspec-0.9.0-py2.py3-none-any.whl
pbr @ file:///var/cache/pypoetry/artifacts/84/55/59/eb463369b9b26da119a7363f15941299731f5758e62a5b5d7d6e99b19b/pbr-5.8.1-py2.py3-none-any.whl
pep8-naming @ file:///var/cache/pypoetry/artifacts/c5/94/df/bcd60db349c70b5041763ab528cbf6864991142dc2a25426cc75f63068/pep8_naming-0.12.1-py2.py3-none-any.whl
pexpect @ file:///var/cache/pypoetry/artifacts/5c/c2/43/b54fe59cab7e831df35401c8e6840162bf4a2ae5862604e7bc22db3000/pexpect-4.8.0-py2.py3-none-any.whl
pickleshare @ file:///var/cache/pypoetry/artifacts/b5/48/a1/d2b823337003d531d87cf0d503ef28bb579703a74d14ad24a88863d616/pickleshare-0.7.5-py2.py3-none-any.whl
pluggy @ file:///var/cache/pypoetry/artifacts/81/78/ca/13f743a3628faf5a0b7f021efb45f2193acba3a13663d498f6b34bf02e/pluggy-1.0.0-py2.py3-none-any.whl
ply @ file:///var/cache/pypoetry/artifacts/2b/25/0d/ef9d0dfd2e95b921a7543c69448857f8790ec284109671c98fd13e1452/ply-3.11-py2.py3-none-any.whl
polib @ file:///var/cache/pypoetry/artifacts/04/fc/6e/ecd4a05c628ac01f9a83cc6a6457080c815828af9e948a1dc2a3c5ba14/polib-1.1.1-py2.py3-none-any.whl
polint @ file:///var/cache/pypoetry/artifacts/2d/8e/0e/27d0b0608f7b45e33a0ae8b83c0ff42b60c79c1d463356db6215c22337/polint-0.4.tar.gz
prompt-toolkit @ file:///var/cache/pypoetry/artifacts/10/eb/01/0c438e83f168b89ab07bda4768ab09d84c4650eda85acaf3bdc78248ae/prompt_toolkit-3.0.28-py3-none-any.whl
psycopg2-binary @ file:///var/cache/pypoetry/artifacts/94/ac/90/f784541d1d49caa6ed277fd52527d966505b9420b43a1de15d2f021cdc/psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
ptyprocess @ file:///var/cache/pypoetry/artifacts/2a/29/5d/0cdc5ec916431d60f03d2f725c54edbfa9fe53700b75fdfee209a3291e/ptyprocess-0.7.0-py2.py3-none-any.whl
pure-eval @ file:///var/cache/pypoetry/artifacts/b4/e9/b2/1b0a1d953cf0bfaf71e297cb566c0b57ee2a8848baed30c261ef22fae7/pure_eval-0.2.2-py3-none-any.whl
py @ file:///var/cache/pypoetry/artifacts/b3/5c/47/ba5a596e01a2b61fa2daa6a438252483ad8c04e6c99e5dc22eaf8a489a/py-1.11.0-py2.py3-none-any.whl
pycodestyle @ file:///var/cache/pypoetry/artifacts/4c/30/97/026c283ef67eb248e5b7e6fad1f8ffb99dae50c11fd93eb939fd7c1f46/pycodestyle-2.7.0-py2.py3-none-any.whl
pycparser @ file:///var/cache/pypoetry/artifacts/fb/06/dd/b5671b47dd0597663bc05d60d324bb315a8cef56f3179b8f9067f88e50/pycparser-2.21-py2.py3-none-any.whl
pydocstyle @ file:///var/cache/pypoetry/artifacts/75/e7/e5/1acad15a51efd39cf39259c7888c205fd787a92efea28f7afc5a9e315c/pydocstyle-6.1.1-py3-none-any.whl
pyflakes @ file:///var/cache/pypoetry/artifacts/eb/c4/2c/47fcc1b3f387b1f7033e85b3ac6ee7772338461a8de8ac3977c6a7dcc1/pyflakes-2.3.1-py2.py3-none-any.whl
Pygments @ file:///var/cache/pypoetry/artifacts/eb/89/d1/4faa7ff8e87642649c25d60a15480ea042f1cff3c237ad940149669cbf/Pygments-2.11.2-py3-none-any.whl
PyJWT @ file:///var/cache/pypoetry/artifacts/6d/a2/4c/7218503a28c8d672d4374161e6e47a71ffc11c0046a535d2ff709af4ca/PyJWT-2.3.0-py3-none-any.whl
pyparsing @ file:///var/cache/pypoetry/artifacts/8e/18/e1/a47fbcc66e38a452c34d2a444d74d8a03fd4aa7c0b6e27c0bee1582107/pyparsing-3.0.7-py3-none-any.whl
pytest @ file:///var/cache/pypoetry/artifacts/0d/89/89/a248cc870a30ec312f23957c835d3c5d0a9a9b26cc85fab5453ac5a6da/pytest-7.1.1-py3-none-any.whl
pytest-cov @ file:///var/cache/pypoetry/artifacts/50/df/c5/4bd35027c6247daac4ba547aff90d97ccdc7daf4aa62e110d69cfd39de/pytest_cov-3.0.0-py3-none-any.whl
pytest-deadfixtures @ file:///var/cache/pypoetry/artifacts/6f/9f/6d/c7cb973d03323de65acbaf59cb574c1e21b97b8f6aa509c592d0c1b5c1/pytest_deadfixtures-2.2.1-py2.py3-none-any.whl
pytest-django @ file:///var/cache/pypoetry/artifacts/c7/ec/32/8af5b8dabeb08d93806b4b99e76a2173cc6ad298d0ca2b2f055d160214/pytest_django-4.5.2-py3-none-any.whl
pytest-randomly @ file:///var/cache/pypoetry/artifacts/99/29/cd/a806a9ce497096d8fe2b4ef24aec6582ce95841657f5f9c574b99acd8f/pytest_randomly-3.11.0-py3-none-any.whl
pytest-testmon @ file:///var/cache/pypoetry/artifacts/2b/86/db/be7076cc78d6c772cd7012d0e22c00675df86bb361b4908d86ad8f8fc6/pytest-testmon-1.3.1.tar.gz
pytest-timeout @ file:///var/cache/pypoetry/artifacts/01/50/cd/e545519870e3eba72f43aa461a3c270572cf996580ba5cec7961a3fe7e/pytest_timeout-2.1.0-py3-none-any.whl
python-decouple @ file:///var/cache/pypoetry/artifacts/36/f6/f5/7c5662dc0034f40ef44b0fd289d9f4132fb6eb9c96ce6b1b702865fd6a/python_decouple-3.6-py3-none-any.whl
python-slugify @ file:///var/cache/pypoetry/artifacts/26/60/f8/a441c9fdba2f1c5f992057fd43b6ccb5302a4886f17f4cde9d43a718f6/python_slugify-6.1.1-py2.py3-none-any.whl
pytz @ file:///var/cache/pypoetry/artifacts/fb/60/46/e704d81037c87ab74c6677ae79ab43dda85c31e3ae38f53c44486b593a/pytz-2022.1-py2.py3-none-any.whl
PyYAML @ file:///var/cache/pypoetry/artifacts/4e/12/e6/32a4a77023f06c3061d2fc6d4692aa531b8530e211b24ff1f77a39e6ee/PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
requests @ file:///var/cache/pypoetry/artifacts/ff/f3/bc/a6781f93c2f9488431db494169bb514a083a1d77f3c325a277d8699398/requests-2.27.1-py2.py3-none-any.whl
requests-cache @ file:///var/cache/pypoetry/artifacts/00/5e/1d/3398c845c68a702ca8447a4d54785471bb7f83b0027aa2a7b989dfb5de/requests_cache-0.9.3-py3-none-any.whl
restructuredtext-lint @ file:///var/cache/pypoetry/artifacts/04/32/b5/e5036c2c17882570082f8f5147166579794efaa6ebc2fc7ab5a0aea9cb/restructuredtext_lint-1.4.0.tar.gz
ruamel.yaml @ file:///var/cache/pypoetry/artifacts/7c/2c/48/111028a9e95097a5ff404a2dc3c1990c911bec7802cb01366c06a9919d/ruamel.yaml-0.17.21-py3-none-any.whl
ruamel.yaml.clib @ file:///var/cache/pypoetry/artifacts/52/95/75/d1a001b469ea6ed66dd6f4194c9f7eb370223816cf6292be2a8213e9a4/ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux1_x86_64.whl
safety @ file:///var/cache/pypoetry/artifacts/8f/cc/5a/1dc0196c65cdb3f015bad143c000d159aca6f838a21d7d10872b092b83/safety-1.10.3-py2.py3-none-any.whl
six @ file:///var/cache/pypoetry/artifacts/08/9f/47/c16ae03035fc69eaf100ea39657a49baaeef714e25a52575710c34cd48/six-1.16.0-py2.py3-none-any.whl
smmap @ file:///var/cache/pypoetry/artifacts/76/3f/89/377e56f6e08e5b1fa88da762382b4c9c817c6dd24eae2e0e190898511d/smmap-5.0.0-py3-none-any.whl
snowballstemmer @ file:///var/cache/pypoetry/artifacts/a4/95/b0/c0f70d4b9bb0bac123e716da53ba9b012071cedf7c99bcf030757530f4/snowballstemmer-2.2.0-py2.py3-none-any.whl
sortedcontainers @ file:///var/cache/pypoetry/artifacts/b9/80/e1/4bdfa349488797fd308ecbe48f4fad57a3245777fb47c8741730583262/sortedcontainers-2.4.0-py2.py3-none-any.whl
Sphinx @ file:///var/cache/pypoetry/artifacts/b8/21/89/626dfd895b30a559af2369438bbb53f9b97470130e07400845f5b02e7a/Sphinx-4.5.0-py3-none-any.whl
sphinx-autodoc-typehints @ file:///var/cache/pypoetry/artifacts/20/93/18/5a773d9276bc8ce1415caaeebec57d0a552e288507431207cd1dd05ce2/sphinx_autodoc_typehints-1.17.0-py3-none-any.whl
sphinxcontrib-applehelp @ file:///var/cache/pypoetry/artifacts/8d/eb/86/eec708bb3ff50c9780e78f36a9cb82cd9ff8030a90bd23b9a6f20aecca/sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl
sphinxcontrib-devhelp @ file:///var/cache/pypoetry/artifacts/56/a5/74/11ccaa7737f06a10422027e0595b24d243af7a7a1dc4982dec22044c28/sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl
sphinxcontrib-htmlhelp @ file:///var/cache/pypoetry/artifacts/66/d0/cb/7228297c74d9280e7246b52187704724b0b0881e2762cdef34e04be778/sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl
sphinxcontrib-jsmath @ file:///var/cache/pypoetry/artifacts/d2/22/96/2076357e64b369910aa24a20d5b719beb24a1487146e4742476ee1e2d8/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl
sphinxcontrib-qthelp @ file:///var/cache/pypoetry/artifacts/32/fc/a9/112a82396d53ec629c1450253a6ded4d94d7ffffd63acd49879543ece9/sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl
sphinxcontrib-serializinghtml @ file:///var/cache/pypoetry/artifacts/e6/9a/17/830e357f3aee36549c613a2d660b5cf38d70c27ecb7c218d15c7bfffe1/sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl
sqlparse @ file:///var/cache/pypoetry/artifacts/ea/fd/ba/117a876397913faee210ef8bac93829e22ad9232662e656971383c0718/sqlparse-0.4.2-py3-none-any.whl
stack-data @ file:///var/cache/pypoetry/artifacts/8b/fe/a7/d09813a045f57169e0ee524ef3045a0f23d4d413e084119d812d3f1f74/stack_data-0.2.0-py3-none-any.whl
stevedore @ file:///var/cache/pypoetry/artifacts/42/17/61/45c6b9d8b0d45dd19994d1f96aa784b4e9792c968eb24e21b0816a258b/stevedore-3.5.0-py3-none-any.whl
StrEnum @ file:///var/cache/pypoetry/artifacts/2e/2c/16/aef2a824de49f2b243d5b27f479a6fc3fbd80bad0fd342e9122c73d19e/StrEnum-0.4.7-py3-none-any.whl
structlog @ file:///var/cache/pypoetry/artifacts/d5/18/ec/dae176ee85c67dc20c576e0e6ff3570f7435bc9fcfd99d3642590ff256/structlog-21.5.0-py3-none-any.whl
testfixtures @ file:///var/cache/pypoetry/artifacts/42/0d/ed/2ebf061a3336990c5502f46fcc245856d3b4410e3d4534faf557ff708e/testfixtures-6.18.5-py2.py3-none-any.whl
text-unidecode @ file:///var/cache/pypoetry/artifacts/34/f9/c2/484c44b08bab89d472229bbd257fcc1d1c6273ee027f01cb08c4e3c309/text_unidecode-1.3-py2.py3-none-any.whl
toml @ file:///var/cache/pypoetry/artifacts/6b/6a/c9/53b19f7870a77d855e8b05ecdc98193944e5d246dafe11bbcad850ecba/toml-0.10.2-py2.py3-none-any.whl
tomli @ file:///var/cache/pypoetry/artifacts/73/7c/d9/9f2752fc5b05f9176c6f3adc6484be1cec75a68925b8c5fe39d6493a07/tomli-2.0.1-py3-none-any.whl
tomlkit @ file:///var/cache/pypoetry/artifacts/94/40/ed/49ed2b2bc80640b90ddc4d96266c9961325337428d29b7f21cd69c3e54/tomlkit-0.10.1-py3-none-any.whl
traitlets @ file:///var/cache/pypoetry/artifacts/ee/01/57/93229f3393af5b0814aff282450fcac279f4d7f32188b49db882ebf459/traitlets-5.1.1-py3-none-any.whl
types-pytz @ file:///var/cache/pypoetry/artifacts/61/77/ee/cd9fa35006e7dfc60d6732fca2ae8da2367b7c581246fdfcb6020a695f/types_pytz-2021.3.6-py3-none-any.whl
types-PyYAML @ file:///var/cache/pypoetry/artifacts/ea/cd/f1/313bfb1194cc1813c5cde122729c70514e36bc53f71ee71e7f09da2213/types_PyYAML-6.0.5-py3-none-any.whl
typing_extensions @ file:///var/cache/pypoetry/artifacts/9b/2e/e0/f2f5524348ab0c59b31fc2526543d60a53583608f35a4574a4978f5358/typing_extensions-4.1.1-py3-none-any.whl
url-normalize @ file:///var/cache/pypoetry/artifacts/f0/fd/a4/2aa3b335b13d88d06030cbecd42d587d34209d08f8dbc73f582acda1a1/url_normalize-1.4.3-py2.py3-none-any.whl
urllib3 @ file:///var/cache/pypoetry/artifacts/86/4a/ad/37e91024d94f8218fc54b1fbb58b71888f53c1636daeb28593fa254ed2/urllib3-1.26.9-py2.py3-none-any.whl
wcwidth @ file:///var/cache/pypoetry/artifacts/7d/f4/60/0737157bb9711fec72c70dff523aa54491eef317e0d586cf5388ff0908/wcwidth-0.2.5-py2.py3-none-any.whl
wemake-python-styleguide @ file:///var/cache/pypoetry/artifacts/47/a2/24/991460310cb6782b1c07d99c5499aa92bd5a21148d808ab6be91764993/wemake_python_styleguide-0.16.1-py3-none-any.whl
yamllint @ file:///var/cache/pypoetry/artifacts/8c/0d/1d/d374803ba2bede59a88d3ccd01491ef38dd180af1857f95222b6b30e83/yamllint-1.26.3.tar.gz
zipp @ file:///var/cache/pypoetry/artifacts/56/e8/08/1c23b9c68eb26c3bb69d9d55caf98b80bd74e71c3f2bd63b439e2ef60c/zipp-3.7.0-py3-none-any.whl

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.