wemake-services / dotenv-linter Goto Github PK
View Code? Open in Web Editor NEW:relaxed: Linting dotenv files like a charm!
Home Page: https://dotenv-linter.rtfd.io
License: MIT License
:relaxed: Linting dotenv files like a charm!
Home Page: https://dotenv-linter.rtfd.io
License: MIT License
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.
- repo: https://github.com/wemake-services/dotenv-linter rev: 0.4.0 # Use the ref you want to point at hooks: - id: dotenv-linter
DEFAULT_FROM_EMAIL='name [email protected]'
.env:3 301 Found quoted value
https://dotenv-linter.github.io/#/checks/quote_character
What's the right way?
Duplicate keys will be overridden while this file is processed by other tools.
We need to warn our users.
Let's start with creating initial project structure, including these files and folders:
pyproject.toml
poetry.lock
tests/
dotenv_linter/
.editorconfig
.gitignore
README.md
All these files can be found here: https://github.com/wemake-services/wemake-python-styleguide
We need to create integration tests for all violations.
How should it look like?
tests/fixtures/integration
tests/test_violations/
where all other tests will be locatedtests/test_violations/
we create a single test_VIOLATION_TYPE/
subfolder for all violation typesHow should it work?
.env
contentsPopen
to lint this fixture with dotenv-linter
commandExample: https://github.com/wemake-services/wemake-python-styleguide/blob/master/tests/test_plugins.py
For future contributors CONTRIBUTING.md
might be very useful.
Here are some examples:
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.
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"
Dependabot couldn't authenticate with https://pypi.python.org/simple/.
You can provide authentication details in your Dependabot dashboard by clicking into the account menu (in the top right) and selecting 'Config variables'.
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
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?
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
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
Than we parse these files with our grammar, we get list of tokens / ast nodes as a result
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
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
Currently we have:
Anyone is welcome!
You can write things like:
KEY=1
But, this spaces before KEY
will be removed. We need to warn about that.
One should use _
to separate words inside keys.
-
should be not allowed.
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 installation support, like:
brew install dotenv-linter
Many developers use homebrew as their primary tool for package management.
Will be easy to engage more people to use.
We need to support GithubActions and be presented in the marketplace.
We need to forbid to have these lines:
DJANGO_SECRET_KEY
What should be allowed?
DJANGO_SECRET_KEY=
POSTGRES_PASSWORD=123
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!
We need to support the output format of reviewdog
: https://github.com/reviewdog/reviewdog
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.
We need to create a blacklist of names that cannot be used. Like DJANGO_ENV
in my case
Dependabot couldn't authenticate with https://pypi.python.org/simple/.
You can provide authentication details in your Dependabot dashboard by clicking into the account menu (in the top right) and selecting 'Config variables'.
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
It should not raise any violations.
Since these two files are different. They can and should have the same keys.
Currently, we don't have any docker images. They might be useful to some people.
Plan:
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.
Hello ๐
first of all thanks for another awesome project!
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.
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.
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.
Contents of flake8 --bug-report
:
Contents of pip freeze
:
We need to enforce \n
for line breaks.
All keys should be all UPPERCASE.
This file:
# First line
#
# Third line
Causes a crash:
config/.env:0 001 Unable to correctly parse dotenv file
It should pass without an issue.
Hi ๐
Is it possible to release a new version of dotenv-linter
?
Recently I have encountered a few issues related to the click
version (>=6.0,<7.0
) required by dotenv-linter==0.1.5
.
It seems that dotenv-linter
works perfectly also with click>=7
- just look at the latest test
workflow run.
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
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.
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
Would be great for this tool to support the Pre-commit tool hooks.
For this, a configuration file has to be added: https://pre-commit.com/#new-hooks
We need to tests that all violations
You can have a look at the example (this code can be even copy-pasted): https://github.com/wemake-services/wemake-python-styleguide/tree/master/tests/test_violations
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
The linter should return something like:
.env:22 101 Found incorrect name: ;INCORRENT_COMMENT
.env:23 101 Found incorrect name: SOME@KEY
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
n/a
not relevant
+ 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)
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.
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-----"
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
It should pass the validation.
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"
}
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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.