├── .editorconfig
├── .github
└── workflows
│ ├── misspell.yml
│ └── test.yml
├── .gitignore
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── media
└── logo.png
├── mimesis_factory.py
├── poetry.lock
├── pyproject.toml
├── setup.cfg
└── tests
├── test_field_params.py
├── test_locale_override.py
├── test_providers.py
├── test_raw_factories.py
└── test_raw_objects.py
/.editorconfig:
--------------------------------------------------------------------------------
1 | # Check http://editorconfig.org for more information
2 | # This is the main config file for this project:
3 | root = true
4 |
5 | [*]
6 | charset = utf-8
7 | trim_trailing_whitespace = true
8 | end_of_line = lf
9 | indent_style = space
10 | insert_final_newline = true
11 | indent_size = 2
12 |
13 | [*.py]
14 | indent_size = 4
15 |
--------------------------------------------------------------------------------
/.github/workflows/misspell.yml:
--------------------------------------------------------------------------------
1 | name: misspell
2 |
3 | on:
4 | workflow_dispatch:
5 | schedule:
6 | - cron: '0 0 * * *'
7 |
8 | jobs:
9 | build:
10 |
11 | runs-on: ubuntu-latest
12 |
13 | steps:
14 | - uses: actions/checkout@v2
15 | - uses: sobolevn/misspell-fixer-action@0.1.0
16 | - uses: peter-evans/create-pull-request@v3
17 | with:
18 | token: ${{ secrets.GITHUB_TOKEN }}
19 | commit-message: 'Fixes by misspell-fixer'
20 | title: 'Typos fix by misspell-fixer'
21 |
--------------------------------------------------------------------------------
/.github/workflows/test.yml:
--------------------------------------------------------------------------------
1 | name: test
2 |
3 | on:
4 | push:
5 | branches:
6 | - master
7 | pull_request:
8 | workflow_dispatch:
9 |
10 | jobs:
11 | build:
12 | runs-on: ubuntu-latest
13 | strategy:
14 | matrix:
15 | python-version: [3.6, 3.7, 3.8, 3.9]
16 |
17 | steps:
18 | - uses: actions/checkout@v2
19 | - name: Set up Python ${{ matrix.python-version }}
20 | uses: actions/setup-python@v2
21 | with:
22 | python-version: ${{ matrix.python-version }}
23 |
24 | - name: Install poetry
25 | run: |
26 | curl -sSL \
27 | "https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py" | python
28 | # Adding `poetry` to `$PATH`:
29 | echo "$HOME/.poetry/bin" >> $GITHUB_PATH
30 |
31 | - name: Set up cache
32 | uses: actions/cache@v2
33 | with:
34 | path: .venv
35 | key: venv-${{ matrix.python-version }}-${{ hashFiles('poetry.lock') }}
36 |
37 | - name: Install dependencies
38 | run: |
39 | poetry config virtualenvs.in-project true
40 | poetry install
41 |
42 | poetry run pip install -U pip
43 |
44 | - name: Run checks
45 | run: |
46 | poetry run flake8 .
47 | poetry run mypy mimesis_factory.py
48 | poetry run pytest
49 | poetry check
50 | poetry run pip check
51 | poetry run safety check --bare --full-report
52 |
53 | - name: Upload coverage to Codecov
54 | uses: codecov/codecov-action@v1
55 | with:
56 | file: ./coverage.xml
57 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by .ignore support plugin (hsz.mobi)
2 | ### Python template
3 | # Byte-compiled / optimized / DLL files
4 | __pycache__/
5 | *.py[cod]
6 | *$py.class
7 |
8 | # C extensions
9 | *.so
10 |
11 | # Distribution / packaging
12 | .Python
13 | build/
14 | develop-eggs/
15 | dist/
16 | downloads/
17 | eggs/
18 | .eggs/
19 | lib/
20 | lib64/
21 | parts/
22 | sdist/
23 | var/
24 | wheels/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 | MANIFEST
29 |
30 | # PyInstaller
31 | # Usually these files are written by a python script from a template
32 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
33 | *.manifest
34 | *.spec
35 |
36 | # Installer logs
37 | pip-log.txt
38 | pip-delete-this-directory.txt
39 |
40 | # Unit test / coverage reports
41 | htmlcov/
42 | .tox/
43 | .coverage
44 | .coverage.*
45 | .cache
46 | nosetests.xml
47 | coverage.xml
48 | *.cover
49 | .hypothesis/
50 |
51 | # Translations
52 | *.mo
53 | *.pot
54 |
55 | # Django stuff:
56 | *.log
57 | .static_storage/
58 | .media/
59 | local_settings.py
60 |
61 | # Flask stuff:
62 | instance/
63 | .webassets-cache
64 |
65 | # Scrapy stuff:
66 | .scrapy
67 |
68 | # Sphinx documentation
69 | docs/_build/
70 |
71 | # PyBuilder
72 | target/
73 |
74 | # Jupyter Notebook
75 | .ipynb_checkpoints
76 |
77 | # pyenv
78 | .python-version
79 |
80 | # celery beat schedule file
81 | celerybeat-schedule
82 |
83 | # SageMath parsed files
84 | *.sage.py
85 |
86 | # Environments
87 | .env
88 | .venv
89 | env/
90 | venv/
91 | ENV/
92 | env.bak/
93 | venv.bak/
94 |
95 | # Spyder project settings
96 | .spyderproject
97 | .spyproject
98 |
99 | # Rope project settings
100 | .ropeproject
101 |
102 | # mkdocs documentation
103 | /site
104 |
105 | # mypy
106 | .mypy_cache/
107 | ### VirtualEnv template
108 | # Virtualenv
109 | # http://iamzed.com/2009/05/07/a-primer-on-virtualenv/
110 | .Python
111 | [Bb]in
112 | [Ii]nclude
113 | [Ll]ib
114 | [Ll]ib64
115 | [Ll]ocal
116 | [Ss]cripts
117 | pyvenv.cfg
118 | .venv
119 | pip-selfcheck.json
120 | ### JetBrains template
121 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
122 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
123 |
124 | # User-specific stuff:
125 | .idea/**/workspace.xml
126 | .idea/**/tasks.xml
127 | .idea/dictionaries
128 |
129 | # Sensitive or high-churn files:
130 | .idea/**/dataSources/
131 | .idea/**/dataSources.ids
132 | .idea/**/dataSources.xml
133 | .idea/**/dataSources.local.xml
134 | .idea/**/sqlDataSources.xml
135 | .idea/**/dynamic.xml
136 | .idea/**/uiDesigner.xml
137 |
138 | # Gradle:
139 | .idea/**/gradle.xml
140 | .idea/**/libraries
141 |
142 | # CMake
143 | cmake-build-debug/
144 |
145 | # Mongo Explorer plugin:
146 | .idea/**/mongoSettings.xml
147 |
148 | ## File-based project format:
149 | *.iws
150 |
151 | ## Plugin-specific files:
152 |
153 | # IntelliJ
154 | out/
155 |
156 | # mpeltonen/sbt-idea plugin
157 | .idea_modules/
158 |
159 | # JIRA plugin
160 | atlassian-ide-plugin.xml
161 |
162 | # Cursive Clojure plugin
163 | .idea/replstate.xml
164 |
165 | # Crashlytics plugin (for Android Studio and IntelliJ)
166 | com_crashlytics_export_strings.xml
167 | crashlytics.properties
168 | crashlytics-build.properties
169 | fabric.properties
170 | ### macOS template
171 | # General
172 | .DS_Store
173 | .AppleDouble
174 | .LSOverride
175 |
176 | # Icon must end with two \r
177 | Icon
178 |
179 | # Thumbnails
180 | ._*
181 |
182 | # Files that might appear in the root of a volume
183 | .DocumentRevisions-V100
184 | .fseventsd
185 | .Spotlight-V100
186 | .TemporaryItems
187 | .Trashes
188 | .VolumeIcon.icns
189 | .com.apple.timemachine.donotpresent
190 |
191 | # Directories potentially created on remote AFP share
192 | .AppleDB
193 | .AppleDesktop
194 | Network Trash Folder
195 | Temporary Items
196 | .apdisk
197 | .idea/
198 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Version history
2 |
3 |
4 | ## Version 1.3.0
5 |
6 | ### Features
7 |
8 | - `python3.9` support
9 |
10 |
11 | ## Version 1.2.0
12 |
13 | ### Features
14 |
15 | - Updates `factory-boy` to the latest version
16 |
17 |
18 | ## Version 1.1.0
19 |
20 | ### Features
21 |
22 | - Updates `mimesis` to version `4.x`
23 | - Adds support for `python@3.8`
24 |
25 | ### Misc
26 |
27 | - Updates `poetry` to `1.0`
28 |
29 |
30 | ## Version 1.0.0
31 |
32 | ### Features
33 |
34 | - Updates `mimesis` to version `3.x`
35 |
36 | ### Misc
37 |
38 | - Now using `wemake-python-styleguide` to lint our code
39 | - Now using `mypy` to typecheck our code
40 |
41 |
42 | ## Version 0.1.0
43 |
44 | - Initial version
45 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # How to contribute
2 |
3 | ## Dependencies
4 |
5 | We use [`poetry`](https://github.com/sdispater/poetry) to manage the dependencies.
6 |
7 | To install them you would need to run two commands:
8 |
9 | ```bash
10 | poetry install
11 | ```
12 |
13 | ## Tests
14 |
15 | We use `pytest`, `mypy`, and `flake8` for quality control.
16 | To run all tests:
17 |
18 | ```bash
19 | pytest
20 | ```
21 |
22 | We also use [`wemake-python-styleguide`](https://github.com/wemake-services/wemake-python-styleguide) to lint our `python` code.
23 |
24 | To run linting:
25 |
26 | ```bash
27 | flake8 mimesis_factory.py tests
28 | ```
29 |
30 | And to type check your code:
31 |
32 | ```bash
33 | mypy mimesis_factory.py
34 | ```
35 |
36 | Make sure you have followed all the steps before submitting your PR.
37 |
38 |
39 | ## Before submitting
40 |
41 | Before submitting your code please do the following steps:
42 |
43 | 1. Run `pytest` to make sure everything was working before
44 | 2. Add any changes you want
45 | 3. Adds tests for the new changes
46 | 4. Edit documentation if you have changed something significant
47 | 5. Run `pytest` again to make sure it is still working
48 |
49 |
50 | ## Other help
51 |
52 | You can contribute by spreading a word about this library.
53 | It would also be a huge contribution to write
54 | a short article on how you are using this project.
55 | What are your best-practices?
56 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Nikita Sobolev
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ⛔️ DEPRECATED
2 |
3 | This repository is now deprecated. We have integrated ``mimesis-factory`` into mimesis itself, and there is no longer a need to use a separate package.
4 | Refer to the [Integration with factory_boy](https://mimesis.name/en/master/factory_plugin.html) section for more details.
5 |
6 | ## mimesis_factory
7 |
8 | [](https://github.com/mimesis-lab/mimesis-factory/actions?query=workflow%3Atest)
9 | [](https://codecov.io/gh/mimesis-lab/mimesis-factory)
10 | [](https://badge.fury.io/py/mimesis-factory)
11 | [](https://github.com/wemake-services/wemake-python-styleguide)
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | ## Description
22 |
23 | [Mimesis](https://github.com/lk-geimfari/mimesis) integration for [`factory_boy`](https://github.com/FactoryBoy/factory_boy).
24 |
25 | ## Installation
26 |
27 | ```python
28 | ➜ pip install mimesis_factory
29 | ```
30 |
31 |
32 | ## Usage
33 |
34 | Look at the example below and you’ll understand how it works:
35 |
36 | ```python
37 | class Account(object):
38 | def __init__(self, username, email, name, surname, age):
39 | self.username = username
40 | self.email = email
41 | self.name = name
42 | self.surname = surname
43 | self.age = age
44 | ```
45 |
46 | Now, use the `MimesisField` class from `mimesis_factory`
47 | to define how fake data is generated:
48 |
49 | ```python
50 | import factory
51 | from mimesis_factory import MimesisField
52 |
53 | from account import Account
54 |
55 |
56 | class AccountFactory(factory.Factory):
57 | class Meta(object):
58 | model = Account
59 |
60 | username = MimesisField('username', template='l_d')
61 | name = MimesisField('name', gender='female')
62 | surname = MimesisField('surname', gender='female')
63 | age = MimesisField('age', minimum=18, maximum=90)
64 | email = factory.LazyAttribute(
65 | lambda instance: '{0}@example.org'.format(instance.username)
66 | )
67 | access_token = MimesisField('token', entropy=32)
68 | ```
69 |
70 |
71 | ## pytest
72 |
73 | We also recommend to use [`pytest-factoryboy`](https://github.com/pytest-dev/pytest-factoryboy).
74 | This way it will be possible to integrate your factories into `pytest` fixtures.
75 |
76 |
77 | ## License
78 |
79 | `mimesis_factory` is released under the MIT License.
80 |
--------------------------------------------------------------------------------
/media/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lk-geimfari/mimesis-factory/1ac868fe04c2337c4153b841db9fc216975d5a06/media/logo.png
--------------------------------------------------------------------------------
/mimesis_factory.py:
--------------------------------------------------------------------------------
1 | import contextlib
2 | from typing import (
3 | Any,
4 | ClassVar,
5 | Dict,
6 | Iterable,
7 | Iterator,
8 | Optional,
9 | Tuple,
10 | Type,
11 | )
12 |
13 | from factory import declarations
14 | from mimesis import locales
15 | from mimesis.providers.base import BaseProvider
16 | from mimesis.providers.generic import Generic
17 | from mimesis.schema import Field
18 |
19 | _CacheKey = Tuple[str, Any]
20 | _Providers = Iterable[Type[BaseProvider]]
21 |
22 |
23 | class MimesisField(declarations.BaseDeclaration):
24 | """
25 | Mimesis integration with FactoryBoy starts here.
26 |
27 | This class provides common interface for FactoryBoy,
28 | but inside it has Mimesis generators.
29 | """
30 |
31 | _cached_instances: ClassVar[Dict[_CacheKey, Field]] = {}
32 | _default_locale: ClassVar[str] = locales.DEFAULT_LOCALE
33 |
34 | def __init__(
35 | self, field: str, locale: Optional[str] = None, **kwargs,
36 | ) -> None:
37 | """
38 | Creates a field instance.
39 |
40 | The created field is lazy. It also receives build time parameters.
41 | These parameters are not applied yet.
42 |
43 | Args:
44 | field: name to be passed to ``Field`` from ``Mimesis``.
45 | locale: locale to use. This parameter has the highest priority.
46 | kwargs: optional parameters that would be passed to ``Field``.
47 |
48 | """
49 | super().__init__()
50 | self.locale = locale
51 | self.kwargs = kwargs
52 | self.field = field
53 |
54 | def evaluate(
55 | self, instance, step, extra: Optional[Dict[str, Any]],
56 | ) -> Generic:
57 | """Evaluates the lazy field."""
58 | kwargs: Dict[str, Any] = {}
59 | kwargs.update(self.kwargs)
60 | kwargs.update(extra or {})
61 |
62 | providers = step.builder.factory_meta.declarations.get('providers')
63 | mimesis = self._get_cached_instance(
64 | locale=self.locale,
65 | providers=providers,
66 | )
67 | return mimesis(self.field, **kwargs)
68 |
69 | @classmethod
70 | @contextlib.contextmanager
71 | def override_locale(cls, locale: str) -> Iterator[None]:
72 | """
73 | Overrides unspecified locales.
74 |
75 | Remember, that implicit locales would not be overridden.
76 | """
77 | old_locale = cls._default_locale
78 | cls._default_locale = locale # noqa: WPS601
79 | yield
80 | cls._default_locale = old_locale # noqa: WPS601
81 |
82 | @classmethod
83 | def _get_cached_instance(
84 | cls,
85 | locale: Optional[str] = None,
86 | providers: Optional[_Providers] = None,
87 | ) -> Field:
88 | if locale is None:
89 | locale = cls._default_locale
90 |
91 | key = (locale, providers)
92 | if key not in cls._cached_instances:
93 | cls._cached_instances[key] = Field(locale, providers=providers)
94 |
95 | return cls._cached_instances[key]
96 |
--------------------------------------------------------------------------------
/poetry.lock:
--------------------------------------------------------------------------------
1 | [[package]]
2 | name = "aiocontextvars"
3 | version = "0.2.2"
4 | description = "Asyncio support for PEP-567 contextvars backport."
5 | category = "dev"
6 | optional = false
7 | python-versions = ">=3.5"
8 |
9 | [package.dependencies]
10 | contextvars = {version = "2.4", markers = "python_version < \"3.7\""}
11 |
12 | [[package]]
13 | name = "astor"
14 | version = "0.8.1"
15 | description = "Read/rewrite/write Python ASTs"
16 | category = "dev"
17 | optional = false
18 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
19 |
20 | [[package]]
21 | name = "atomicwrites"
22 | version = "1.4.0"
23 | description = "Atomic file writes."
24 | category = "dev"
25 | optional = false
26 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
27 |
28 | [[package]]
29 | name = "attrs"
30 | version = "21.2.0"
31 | description = "Classes Without Boilerplate"
32 | category = "dev"
33 | optional = false
34 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
35 |
36 | [package.extras]
37 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"]
38 | docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
39 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
40 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
41 |
42 | [[package]]
43 | name = "autorepr"
44 | version = "0.3.0"
45 | description = "Makes civilized __repr__, __str__, and __unicode__ methods"
46 | category = "dev"
47 | optional = false
48 | python-versions = "*"
49 |
50 | [[package]]
51 | name = "bandit"
52 | version = "1.7.0"
53 | description = "Security oriented static analyser for python code."
54 | category = "dev"
55 | optional = false
56 | python-versions = ">=3.5"
57 |
58 | [package.dependencies]
59 | colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""}
60 | GitPython = ">=1.0.1"
61 | PyYAML = ">=5.3.1"
62 | six = ">=1.10.0"
63 | stevedore = ">=1.20.0"
64 |
65 | [[package]]
66 | name = "cachy"
67 | version = "0.3.0"
68 | description = "Cachy provides a simple yet effective caching library."
69 | category = "dev"
70 | optional = false
71 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
72 |
73 | [package.extras]
74 | redis = ["redis (>=3.3.6,<4.0.0)"]
75 | memcached = ["python-memcached (>=1.59,<2.0)"]
76 | msgpack = ["msgpack-python (>=0.5,<0.6)"]
77 |
78 | [[package]]
79 | name = "certifi"
80 | version = "2020.12.5"
81 | description = "Python package for providing Mozilla's CA Bundle."
82 | category = "dev"
83 | optional = false
84 | python-versions = "*"
85 |
86 | [[package]]
87 | name = "chardet"
88 | version = "4.0.0"
89 | description = "Universal encoding detector for Python 2 and 3"
90 | category = "dev"
91 | optional = false
92 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
93 |
94 | [[package]]
95 | name = "click"
96 | version = "8.0.0"
97 | description = "Composable command line interface toolkit"
98 | category = "dev"
99 | optional = false
100 | python-versions = ">=3.6"
101 |
102 | [package.dependencies]
103 | colorama = {version = "*", markers = "platform_system == \"Windows\""}
104 |
105 | [[package]]
106 | name = "colorama"
107 | version = "0.4.4"
108 | description = "Cross-platform colored terminal text."
109 | category = "dev"
110 | optional = false
111 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
112 |
113 | [[package]]
114 | name = "configupdater"
115 | version = "2.0"
116 | description = "Parser like ConfigParser but for updating configuration files"
117 | category = "dev"
118 | optional = false
119 | python-versions = ">=3.6"
120 |
121 | [package.dependencies]
122 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
123 |
124 | [package.extras]
125 | testing = ["sphinx", "flake8", "pytest", "pytest-cov", "pytest-virtualenv", "pytest-xdist"]
126 |
127 | [[package]]
128 | name = "contextvars"
129 | version = "2.4"
130 | description = "PEP 567 Backport"
131 | category = "dev"
132 | optional = false
133 | python-versions = "*"
134 |
135 | [package.dependencies]
136 | immutables = ">=0.9"
137 |
138 | [[package]]
139 | name = "coverage"
140 | version = "5.5"
141 | description = "Code coverage measurement for Python"
142 | category = "dev"
143 | optional = false
144 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
145 |
146 | [package.extras]
147 | toml = ["toml"]
148 |
149 | [[package]]
150 | name = "darglint"
151 | version = "1.8.0"
152 | description = "A utility for ensuring Google-style docstrings stay up to date with the source code."
153 | category = "dev"
154 | optional = false
155 | python-versions = ">=3.6,<4.0"
156 |
157 | [[package]]
158 | name = "dataclasses"
159 | version = "0.8"
160 | description = "A backport of the dataclasses module for Python 3.6"
161 | category = "dev"
162 | optional = false
163 | python-versions = ">=3.6, <3.7"
164 |
165 | [[package]]
166 | name = "decorator"
167 | version = "5.0.8"
168 | description = "Decorators for Humans"
169 | category = "dev"
170 | optional = false
171 | python-versions = ">=3.5"
172 |
173 | [[package]]
174 | name = "dictdiffer"
175 | version = "0.8.1"
176 | description = "Dictdiffer is a library that helps you to diff and patch dictionaries."
177 | category = "dev"
178 | optional = false
179 | python-versions = "*"
180 |
181 | [package.extras]
182 | all = ["Sphinx (>=1.4.4)", "sphinx-rtd-theme (>=0.1.9)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "pydocstyle (>=1.0.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)", "pytest (>=2.8.0)", "tox (>=3.7.0)", "numpy (>=1.11.0)"]
183 | docs = ["Sphinx (>=1.4.4)", "sphinx-rtd-theme (>=0.1.9)"]
184 | numpy = ["numpy (>=1.11.0)"]
185 | tests = ["check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "pydocstyle (>=1.0.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)", "pytest (>=2.8.0)", "tox (>=3.7.0)"]
186 |
187 | [[package]]
188 | name = "docutils"
189 | version = "0.17.1"
190 | description = "Docutils -- Python Documentation Utilities"
191 | category = "dev"
192 | optional = false
193 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
194 |
195 | [[package]]
196 | name = "dparse"
197 | version = "0.5.1"
198 | description = "A parser for Python dependency files"
199 | category = "dev"
200 | optional = false
201 | python-versions = ">=3.5"
202 |
203 | [package.dependencies]
204 | packaging = "*"
205 | pyyaml = "*"
206 | toml = "*"
207 |
208 | [package.extras]
209 | pipenv = ["pipenv"]
210 |
211 | [[package]]
212 | name = "eradicate"
213 | version = "2.0.0"
214 | description = "Removes commented-out code."
215 | category = "dev"
216 | optional = false
217 | python-versions = "*"
218 |
219 | [[package]]
220 | name = "factory-boy"
221 | version = "3.2.0"
222 | description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby."
223 | category = "main"
224 | optional = false
225 | python-versions = ">=3.6"
226 |
227 | [package.dependencies]
228 | Faker = ">=0.7.0"
229 |
230 | [package.extras]
231 | dev = ["coverage", "django", "flake8", "isort", "pillow", "sqlalchemy", "mongoengine", "wheel (>=0.32.0)", "tox", "zest.releaser"]
232 | doc = ["sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"]
233 |
234 | [[package]]
235 | name = "faker"
236 | version = "8.1.4"
237 | description = "Faker is a Python package that generates fake data for you."
238 | category = "main"
239 | optional = false
240 | python-versions = ">=3.6"
241 |
242 | [package.dependencies]
243 | python-dateutil = ">=2.4"
244 | text-unidecode = "1.3"
245 |
246 | [[package]]
247 | name = "flake8"
248 | version = "3.9.2"
249 | description = "the modular source code checker: pep8 pyflakes and co"
250 | category = "dev"
251 | optional = false
252 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
253 |
254 | [package.dependencies]
255 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
256 | mccabe = ">=0.6.0,<0.7.0"
257 | pycodestyle = ">=2.7.0,<2.8.0"
258 | pyflakes = ">=2.3.0,<2.4.0"
259 |
260 | [[package]]
261 | name = "flake8-bandit"
262 | version = "2.1.2"
263 | description = "Automated security testing with bandit and flake8."
264 | category = "dev"
265 | optional = false
266 | python-versions = "*"
267 |
268 | [package.dependencies]
269 | bandit = "*"
270 | flake8 = "*"
271 | flake8-polyfill = "*"
272 | pycodestyle = "*"
273 |
274 | [[package]]
275 | name = "flake8-broken-line"
276 | version = "0.3.0"
277 | description = "Flake8 plugin to forbid backslashes for line breaks"
278 | category = "dev"
279 | optional = false
280 | python-versions = ">=3.6,<4.0"
281 |
282 | [package.dependencies]
283 | flake8 = ">=3.5,<4.0"
284 |
285 | [[package]]
286 | name = "flake8-bugbear"
287 | version = "20.11.1"
288 | description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle."
289 | category = "dev"
290 | optional = false
291 | python-versions = ">=3.6"
292 |
293 | [package.dependencies]
294 | attrs = ">=19.2.0"
295 | flake8 = ">=3.0.0"
296 |
297 | [package.extras]
298 | dev = ["coverage", "black", "hypothesis", "hypothesmith"]
299 |
300 | [[package]]
301 | name = "flake8-commas"
302 | version = "2.0.0"
303 | description = "Flake8 lint for trailing commas."
304 | category = "dev"
305 | optional = false
306 | python-versions = "*"
307 |
308 | [package.dependencies]
309 | flake8 = ">=2,<4.0.0"
310 |
311 | [[package]]
312 | name = "flake8-comprehensions"
313 | version = "3.5.0"
314 | description = "A flake8 plugin to help you write better list/set/dict comprehensions."
315 | category = "dev"
316 | optional = false
317 | python-versions = ">=3.6"
318 |
319 | [package.dependencies]
320 | flake8 = ">=3.0,<3.2.0 || >3.2.0,<4"
321 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
322 |
323 | [[package]]
324 | name = "flake8-debugger"
325 | version = "4.0.0"
326 | description = "ipdb/pdb statement checker plugin for flake8"
327 | category = "dev"
328 | optional = false
329 | python-versions = ">=3.6"
330 |
331 | [package.dependencies]
332 | flake8 = ">=3.0"
333 | pycodestyle = "*"
334 | six = "*"
335 |
336 | [[package]]
337 | name = "flake8-docstrings"
338 | version = "1.6.0"
339 | description = "Extension for flake8 which uses pydocstyle to check docstrings"
340 | category = "dev"
341 | optional = false
342 | python-versions = "*"
343 |
344 | [package.dependencies]
345 | flake8 = ">=3"
346 | pydocstyle = ">=2.1"
347 |
348 | [[package]]
349 | name = "flake8-eradicate"
350 | version = "1.0.0"
351 | description = "Flake8 plugin to find commented out code"
352 | category = "dev"
353 | optional = false
354 | python-versions = ">=3.6,<4.0"
355 |
356 | [package.dependencies]
357 | attrs = "*"
358 | eradicate = ">=2.0,<3.0"
359 | flake8 = ">=3.5,<4.0"
360 |
361 | [[package]]
362 | name = "flake8-isort"
363 | version = "4.0.0"
364 | description = "flake8 plugin that integrates isort ."
365 | category = "dev"
366 | optional = false
367 | python-versions = "*"
368 |
369 | [package.dependencies]
370 | flake8 = ">=3.2.1,<4"
371 | isort = ">=4.3.5,<6"
372 | testfixtures = ">=6.8.0,<7"
373 |
374 | [package.extras]
375 | test = ["pytest (>=4.0.2,<6)", "toml"]
376 |
377 | [[package]]
378 | name = "flake8-plugin-utils"
379 | version = "1.3.2"
380 | description = "The package provides base classes and utils for flake8 plugin writing"
381 | category = "dev"
382 | optional = false
383 | python-versions = ">=3.6,<4.0"
384 |
385 | [[package]]
386 | name = "flake8-polyfill"
387 | version = "1.0.2"
388 | description = "Polyfill package for Flake8 plugins"
389 | category = "dev"
390 | optional = false
391 | python-versions = "*"
392 |
393 | [package.dependencies]
394 | flake8 = "*"
395 |
396 | [[package]]
397 | name = "flake8-pytest-style"
398 | version = "1.5.0"
399 | description = "A flake8 plugin checking common style issues or inconsistencies with pytest-based tests."
400 | category = "dev"
401 | optional = false
402 | python-versions = ">=3.6,<4.0"
403 |
404 | [package.dependencies]
405 | flake8-plugin-utils = ">=1.3.2,<2.0.0"
406 |
407 | [[package]]
408 | name = "flake8-quotes"
409 | version = "3.2.0"
410 | description = "Flake8 lint for quotes."
411 | category = "dev"
412 | optional = false
413 | python-versions = "*"
414 |
415 | [package.dependencies]
416 | flake8 = "*"
417 |
418 | [[package]]
419 | name = "flake8-rst-docstrings"
420 | version = "0.2.3"
421 | description = "Python docstring reStructuredText (RST) validator"
422 | category = "dev"
423 | optional = false
424 | python-versions = ">=3.3"
425 |
426 | [package.dependencies]
427 | flake8 = ">=3.0.0"
428 | pygments = "*"
429 | restructuredtext-lint = "*"
430 |
431 | [[package]]
432 | name = "flake8-string-format"
433 | version = "0.3.0"
434 | description = "string format checker, plugin for flake8"
435 | category = "dev"
436 | optional = false
437 | python-versions = "*"
438 |
439 | [package.dependencies]
440 | flake8 = "*"
441 |
442 | [[package]]
443 | name = "gitdb"
444 | version = "4.0.7"
445 | description = "Git Object Database"
446 | category = "dev"
447 | optional = false
448 | python-versions = ">=3.4"
449 |
450 | [package.dependencies]
451 | smmap = ">=3.0.1,<5"
452 |
453 | [[package]]
454 | name = "gitpython"
455 | version = "3.1.17"
456 | description = "Python Git Library"
457 | category = "dev"
458 | optional = false
459 | python-versions = ">=3.5"
460 |
461 | [package.dependencies]
462 | gitdb = ">=4.0.1,<5"
463 | typing-extensions = {version = ">=3.7.4.0", markers = "python_version < \"3.8\""}
464 |
465 | [[package]]
466 | name = "identify"
467 | version = "1.6.2"
468 | description = "File identification library for Python"
469 | category = "dev"
470 | optional = false
471 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
472 |
473 | [package.extras]
474 | license = ["editdistance"]
475 |
476 | [[package]]
477 | name = "idna"
478 | version = "2.10"
479 | description = "Internationalized Domain Names in Applications (IDNA)"
480 | category = "dev"
481 | optional = false
482 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
483 |
484 | [[package]]
485 | name = "immutables"
486 | version = "0.15"
487 | description = "Immutable Collections"
488 | category = "dev"
489 | optional = false
490 | python-versions = ">=3.5"
491 |
492 | [package.extras]
493 | test = ["flake8 (>=3.8.4,<3.9.0)", "pycodestyle (>=2.6.0,<2.7.0)"]
494 |
495 | [[package]]
496 | name = "importlib-metadata"
497 | version = "4.0.1"
498 | description = "Read metadata from Python packages"
499 | category = "dev"
500 | optional = false
501 | python-versions = ">=3.6"
502 |
503 | [package.dependencies]
504 | typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""}
505 | zipp = ">=0.5"
506 |
507 | [package.extras]
508 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
509 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
510 |
511 | [[package]]
512 | name = "inflection"
513 | version = "0.5.1"
514 | description = "A port of Ruby on Rails inflector to Python"
515 | category = "dev"
516 | optional = false
517 | python-versions = ">=3.5"
518 |
519 | [[package]]
520 | name = "iniconfig"
521 | version = "1.1.1"
522 | description = "iniconfig: brain-dead simple config-ini parsing"
523 | category = "dev"
524 | optional = false
525 | python-versions = "*"
526 |
527 | [[package]]
528 | name = "isort"
529 | version = "5.8.0"
530 | description = "A Python utility / library to sort Python imports."
531 | category = "dev"
532 | optional = false
533 | python-versions = ">=3.6,<4.0"
534 |
535 | [package.extras]
536 | pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
537 | requirements_deprecated_finder = ["pipreqs", "pip-api"]
538 | colors = ["colorama (>=0.4.3,<0.5.0)"]
539 |
540 | [[package]]
541 | name = "jmespath"
542 | version = "0.10.0"
543 | description = "JSON Matching Expressions"
544 | category = "dev"
545 | optional = false
546 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
547 |
548 | [[package]]
549 | name = "loguru"
550 | version = "0.5.3"
551 | description = "Python logging made (stupidly) simple"
552 | category = "dev"
553 | optional = false
554 | python-versions = ">=3.5"
555 |
556 | [package.dependencies]
557 | aiocontextvars = {version = ">=0.2.0", markers = "python_version < \"3.7\""}
558 | colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""}
559 | win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""}
560 |
561 | [package.extras]
562 | dev = ["codecov (>=2.0.15)", "colorama (>=0.3.4)", "flake8 (>=3.7.7)", "tox (>=3.9.0)", "tox-travis (>=0.12)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "Sphinx (>=2.2.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "black (>=19.10b0)", "isort (>=5.1.1)"]
563 |
564 | [[package]]
565 | name = "marshmallow"
566 | version = "3.12.1"
567 | description = "A lightweight library for converting complex datatypes to and from native Python datatypes."
568 | category = "dev"
569 | optional = false
570 | python-versions = ">=3.5"
571 |
572 | [package.extras]
573 | dev = ["pytest", "pytz", "simplejson", "mypy (==0.812)", "flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.4,<3.0)", "tox"]
574 | docs = ["sphinx (==4.0.0)", "sphinx-issues (==1.2.0)", "alabaster (==0.7.12)", "sphinx-version-warning (==1.1.2)", "autodocsumm (==0.2.4)"]
575 | lint = ["mypy (==0.812)", "flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.4,<3.0)"]
576 | tests = ["pytest", "pytz", "simplejson"]
577 |
578 | [[package]]
579 | name = "marshmallow-polyfield"
580 | version = "5.10"
581 | description = "An unofficial extension to Marshmallow to allow for polymorphic fields"
582 | category = "dev"
583 | optional = false
584 | python-versions = ">=3.5"
585 |
586 | [package.dependencies]
587 | marshmallow = ">=3.0.0b10"
588 |
589 | [[package]]
590 | name = "mccabe"
591 | version = "0.6.1"
592 | description = "McCabe checker, plugin for flake8"
593 | category = "dev"
594 | optional = false
595 | python-versions = "*"
596 |
597 | [[package]]
598 | name = "mimesis"
599 | version = "4.1.3"
600 | description = "Mimesis: fake data generator."
601 | category = "main"
602 | optional = false
603 | python-versions = "*"
604 |
605 | [[package]]
606 | name = "more-itertools"
607 | version = "8.7.0"
608 | description = "More routines for operating on iterables, beyond itertools"
609 | category = "dev"
610 | optional = false
611 | python-versions = ">=3.5"
612 |
613 | [[package]]
614 | name = "mypy"
615 | version = "0.910"
616 | description = "Optional static typing for Python"
617 | category = "dev"
618 | optional = false
619 | python-versions = ">=3.5"
620 |
621 | [package.dependencies]
622 | mypy-extensions = ">=0.4.3,<0.5.0"
623 | toml = "*"
624 | typed-ast = {version = ">=1.4.0,<1.5.0", markers = "python_version < \"3.8\""}
625 | typing-extensions = ">=3.7.4"
626 |
627 | [package.extras]
628 | dmypy = ["psutil (>=4.0)"]
629 | python2 = ["typed-ast (>=1.4.0,<1.5.0)"]
630 |
631 | [[package]]
632 | name = "mypy-extensions"
633 | version = "0.4.3"
634 | description = "Experimental type system extensions for programs checked with the mypy typechecker."
635 | category = "dev"
636 | optional = false
637 | python-versions = "*"
638 |
639 | [[package]]
640 | name = "nitpick"
641 | version = "0.27.0"
642 | description = "Enforce the same settings across multiple language-independent projects"
643 | category = "dev"
644 | optional = false
645 | python-versions = ">=3.6,<4.0"
646 |
647 | [package.dependencies]
648 | attrs = "*"
649 | autorepr = "*"
650 | cachy = "*"
651 | click = "*"
652 | ConfigUpdater = "*"
653 | dictdiffer = "*"
654 | flake8 = ">=3.0.0"
655 | identify = "*"
656 | jmespath = "*"
657 | loguru = "*"
658 | marshmallow = ">=3.0.0b10"
659 | marshmallow-polyfield = ">=5.10,<6.0"
660 | more-itertools = "*"
661 | pluggy = "*"
662 | pydantic = "*"
663 | python-slugify = "*"
664 | requests = "*"
665 | "ruamel.yaml" = "*"
666 | sortedcontainers = "*"
667 | toml = "*"
668 | tomlkit = "*"
669 |
670 | [package.extras]
671 | test = ["freezegun", "pytest-cov", "pytest-socket", "pytest-testmon", "pytest-watch", "pytest", "responses", "testfixtures"]
672 | lint = ["pylint"]
673 | doc = ["sphinx", "sphinx-rtd-theme", "sphobjinv"]
674 |
675 | [[package]]
676 | name = "packaging"
677 | version = "20.9"
678 | description = "Core utilities for Python packages"
679 | category = "dev"
680 | optional = false
681 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
682 |
683 | [package.dependencies]
684 | pyparsing = ">=2.0.2"
685 |
686 | [[package]]
687 | name = "pbr"
688 | version = "5.6.0"
689 | description = "Python Build Reasonableness"
690 | category = "dev"
691 | optional = false
692 | python-versions = ">=2.6"
693 |
694 | [[package]]
695 | name = "pep8-naming"
696 | version = "0.11.1"
697 | description = "Check PEP-8 naming conventions, plugin for flake8"
698 | category = "dev"
699 | optional = false
700 | python-versions = "*"
701 |
702 | [package.dependencies]
703 | flake8-polyfill = ">=1.0.2,<2"
704 |
705 | [[package]]
706 | name = "pluggy"
707 | version = "0.13.1"
708 | description = "plugin and hook calling mechanisms for python"
709 | category = "dev"
710 | optional = false
711 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
712 |
713 | [package.dependencies]
714 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
715 |
716 | [package.extras]
717 | dev = ["pre-commit", "tox"]
718 |
719 | [[package]]
720 | name = "py"
721 | version = "1.10.0"
722 | description = "library with cross-python path, ini-parsing, io, code, log facilities"
723 | category = "dev"
724 | optional = false
725 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
726 |
727 | [[package]]
728 | name = "pycodestyle"
729 | version = "2.7.0"
730 | description = "Python style guide checker"
731 | category = "dev"
732 | optional = false
733 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
734 |
735 | [[package]]
736 | name = "pydantic"
737 | version = "1.7.4"
738 | description = "Data validation and settings management using python 3.6 type hinting"
739 | category = "dev"
740 | optional = false
741 | python-versions = ">=3.6"
742 |
743 | [package.dependencies]
744 | dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""}
745 |
746 | [package.extras]
747 | dotenv = ["python-dotenv (>=0.10.4)"]
748 | email = ["email-validator (>=1.0.3)"]
749 | typing_extensions = ["typing-extensions (>=3.7.2)"]
750 |
751 | [[package]]
752 | name = "pydocstyle"
753 | version = "6.0.0"
754 | description = "Python docstring style checker"
755 | category = "dev"
756 | optional = false
757 | python-versions = ">=3.6"
758 |
759 | [package.dependencies]
760 | snowballstemmer = "*"
761 |
762 | [[package]]
763 | name = "pyflakes"
764 | version = "2.3.1"
765 | description = "passive checker of Python programs"
766 | category = "dev"
767 | optional = false
768 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
769 |
770 | [[package]]
771 | name = "pygments"
772 | version = "2.9.0"
773 | description = "Pygments is a syntax highlighting package written in Python."
774 | category = "dev"
775 | optional = false
776 | python-versions = ">=3.5"
777 |
778 | [[package]]
779 | name = "pyparsing"
780 | version = "2.4.7"
781 | description = "Python parsing module"
782 | category = "dev"
783 | optional = false
784 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
785 |
786 | [[package]]
787 | name = "pytest"
788 | version = "6.2.4"
789 | description = "pytest: simple powerful testing with Python"
790 | category = "dev"
791 | optional = false
792 | python-versions = ">=3.6"
793 |
794 | [package.dependencies]
795 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
796 | attrs = ">=19.2.0"
797 | colorama = {version = "*", markers = "sys_platform == \"win32\""}
798 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
799 | iniconfig = "*"
800 | packaging = "*"
801 | pluggy = ">=0.12,<1.0.0a1"
802 | py = ">=1.8.2"
803 | toml = "*"
804 |
805 | [package.extras]
806 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
807 |
808 | [[package]]
809 | name = "pytest-cov"
810 | version = "2.12.1"
811 | description = "Pytest plugin for measuring coverage."
812 | category = "dev"
813 | optional = false
814 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
815 |
816 | [package.dependencies]
817 | coverage = ">=5.2.1"
818 | pytest = ">=4.6"
819 | toml = "*"
820 |
821 | [package.extras]
822 | testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"]
823 |
824 | [[package]]
825 | name = "pytest-factoryboy"
826 | version = "2.1.0"
827 | description = "Factory Boy support for pytest."
828 | category = "dev"
829 | optional = false
830 | python-versions = ">=3.6"
831 |
832 | [package.dependencies]
833 | factory-boy = ">=2.10.0"
834 | inflection = "*"
835 | pytest = ">=4.6"
836 |
837 | [[package]]
838 | name = "pytest-randomly"
839 | version = "3.8.0"
840 | description = "Pytest plugin to randomly order tests and control random.seed."
841 | category = "dev"
842 | optional = false
843 | python-versions = ">=3.6"
844 |
845 | [package.dependencies]
846 | importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""}
847 | pytest = "*"
848 |
849 | [[package]]
850 | name = "python-dateutil"
851 | version = "2.8.1"
852 | description = "Extensions to the standard Python datetime module"
853 | category = "main"
854 | optional = false
855 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
856 |
857 | [package.dependencies]
858 | six = ">=1.5"
859 |
860 | [[package]]
861 | name = "python-slugify"
862 | version = "5.0.2"
863 | description = "A Python Slugify application that handles Unicode"
864 | category = "dev"
865 | optional = false
866 | python-versions = ">=3.6"
867 |
868 | [package.dependencies]
869 | text-unidecode = ">=1.3"
870 |
871 | [package.extras]
872 | unidecode = ["Unidecode (>=1.1.1)"]
873 |
874 | [[package]]
875 | name = "pyyaml"
876 | version = "5.4.1"
877 | description = "YAML parser and emitter for Python"
878 | category = "dev"
879 | optional = false
880 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
881 |
882 | [[package]]
883 | name = "requests"
884 | version = "2.25.1"
885 | description = "Python HTTP for Humans."
886 | category = "dev"
887 | optional = false
888 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
889 |
890 | [package.dependencies]
891 | certifi = ">=2017.4.17"
892 | chardet = ">=3.0.2,<5"
893 | idna = ">=2.5,<3"
894 | urllib3 = ">=1.21.1,<1.27"
895 |
896 | [package.extras]
897 | security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
898 | socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
899 |
900 | [[package]]
901 | name = "restructuredtext-lint"
902 | version = "1.3.2"
903 | description = "reStructuredText linter"
904 | category = "dev"
905 | optional = false
906 | python-versions = "*"
907 |
908 | [package.dependencies]
909 | docutils = ">=0.11,<1.0"
910 |
911 | [[package]]
912 | name = "ruamel.yaml"
913 | version = "0.17.4"
914 | description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order"
915 | category = "dev"
916 | optional = false
917 | python-versions = ">=3"
918 |
919 | [package.dependencies]
920 | "ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.10\""}
921 |
922 | [package.extras]
923 | docs = ["ryd"]
924 | jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"]
925 |
926 | [[package]]
927 | name = "ruamel.yaml.clib"
928 | version = "0.2.2"
929 | description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml"
930 | category = "dev"
931 | optional = false
932 | python-versions = "*"
933 |
934 | [[package]]
935 | name = "safety"
936 | version = "1.10.3"
937 | description = "Checks installed dependencies for known vulnerabilities."
938 | category = "dev"
939 | optional = false
940 | python-versions = ">=3.5"
941 |
942 | [package.dependencies]
943 | Click = ">=6.0"
944 | dparse = ">=0.5.1"
945 | packaging = "*"
946 | requests = "*"
947 |
948 | [[package]]
949 | name = "six"
950 | version = "1.16.0"
951 | description = "Python 2 and 3 compatibility utilities"
952 | category = "main"
953 | optional = false
954 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
955 |
956 | [[package]]
957 | name = "smmap"
958 | version = "4.0.0"
959 | description = "A pure Python implementation of a sliding window memory map manager"
960 | category = "dev"
961 | optional = false
962 | python-versions = ">=3.5"
963 |
964 | [[package]]
965 | name = "snowballstemmer"
966 | version = "2.1.0"
967 | description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
968 | category = "dev"
969 | optional = false
970 | python-versions = "*"
971 |
972 | [[package]]
973 | name = "sortedcontainers"
974 | version = "2.3.0"
975 | description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set"
976 | category = "dev"
977 | optional = false
978 | python-versions = "*"
979 |
980 | [[package]]
981 | name = "stevedore"
982 | version = "3.3.0"
983 | description = "Manage dynamic plugins for Python applications"
984 | category = "dev"
985 | optional = false
986 | python-versions = ">=3.6"
987 |
988 | [package.dependencies]
989 | importlib-metadata = {version = ">=1.7.0", markers = "python_version < \"3.8\""}
990 | pbr = ">=2.0.0,<2.1.0 || >2.1.0"
991 |
992 | [[package]]
993 | name = "testfixtures"
994 | version = "6.17.1"
995 | description = "A collection of helpers and mock objects for unit tests and doc tests."
996 | category = "dev"
997 | optional = false
998 | python-versions = "*"
999 |
1000 | [package.extras]
1001 | build = ["setuptools-git", "wheel", "twine"]
1002 | docs = ["sphinx", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"]
1003 | test = ["pytest (>=3.6)", "pytest-cov", "pytest-django", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"]
1004 |
1005 | [[package]]
1006 | name = "text-unidecode"
1007 | version = "1.3"
1008 | description = "The most basic Text::Unidecode port"
1009 | category = "main"
1010 | optional = false
1011 | python-versions = "*"
1012 |
1013 | [[package]]
1014 | name = "toml"
1015 | version = "0.10.2"
1016 | description = "Python Library for Tom's Obvious, Minimal Language"
1017 | category = "dev"
1018 | optional = false
1019 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
1020 |
1021 | [[package]]
1022 | name = "tomlkit"
1023 | version = "0.7.0"
1024 | description = "Style preserving TOML library"
1025 | category = "dev"
1026 | optional = false
1027 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
1028 |
1029 | [[package]]
1030 | name = "typed-ast"
1031 | version = "1.4.3"
1032 | description = "a fork of Python 2 and 3 ast modules with type comment support"
1033 | category = "dev"
1034 | optional = false
1035 | python-versions = "*"
1036 |
1037 | [[package]]
1038 | name = "typing-extensions"
1039 | version = "3.10.0.0"
1040 | description = "Backported and Experimental Type Hints for Python 3.5+"
1041 | category = "dev"
1042 | optional = false
1043 | python-versions = "*"
1044 |
1045 | [[package]]
1046 | name = "urllib3"
1047 | version = "1.26.5"
1048 | description = "HTTP library with thread-safe connection pooling, file post, and more."
1049 | category = "dev"
1050 | optional = false
1051 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
1052 |
1053 | [package.extras]
1054 | brotli = ["brotlipy (>=0.6.0)"]
1055 | secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
1056 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
1057 |
1058 | [[package]]
1059 | name = "validators"
1060 | version = "0.18.2"
1061 | description = "Python Data Validation for Humans™."
1062 | category = "dev"
1063 | optional = false
1064 | python-versions = ">=3.4"
1065 |
1066 | [package.dependencies]
1067 | decorator = ">=3.4.0"
1068 | six = ">=1.4.0"
1069 |
1070 | [package.extras]
1071 | test = ["pytest (>=2.2.3)", "flake8 (>=2.4.0)", "isort (>=4.2.2)"]
1072 |
1073 | [[package]]
1074 | name = "wemake-python-styleguide"
1075 | version = "0.15.3"
1076 | description = "The strictest and most opinionated python linter ever"
1077 | category = "dev"
1078 | optional = false
1079 | python-versions = ">=3.6,<4.0"
1080 |
1081 | [package.dependencies]
1082 | astor = ">=0.8,<0.9"
1083 | attrs = "*"
1084 | darglint = ">=1.2,<2.0"
1085 | flake8 = ">=3.7,<4.0"
1086 | flake8-bandit = ">=2.1,<3.0"
1087 | flake8-broken-line = ">=0.3,<0.4"
1088 | flake8-bugbear = ">=20.1,<22.0"
1089 | flake8-commas = ">=2.0,<3.0"
1090 | flake8-comprehensions = ">=3.1,<4.0"
1091 | flake8-debugger = ">=4.0,<5.0"
1092 | flake8-docstrings = ">=1.3,<2.0"
1093 | flake8-eradicate = ">=1.0,<2.0"
1094 | flake8-isort = ">=4.0,<5.0"
1095 | flake8-quotes = ">=3.0,<4.0"
1096 | flake8-rst-docstrings = ">=0.2.3,<0.3.0"
1097 | flake8-string-format = ">=0.3,<0.4"
1098 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
1099 | pep8-naming = ">=0.11,<0.12"
1100 | pygments = ">=2.4,<3.0"
1101 | typing_extensions = ">=3.6,<4.0"
1102 |
1103 | [[package]]
1104 | name = "win32-setctime"
1105 | version = "1.0.3"
1106 | description = "A small Python utility to set file creation time on Windows"
1107 | category = "dev"
1108 | optional = false
1109 | python-versions = ">=3.5"
1110 |
1111 | [package.extras]
1112 | dev = ["pytest (>=4.6.2)", "black (>=19.3b0)"]
1113 |
1114 | [[package]]
1115 | name = "zipp"
1116 | version = "3.4.1"
1117 | description = "Backport of pathlib-compatible object wrapper for zip files"
1118 | category = "dev"
1119 | optional = false
1120 | python-versions = ">=3.6"
1121 |
1122 | [package.extras]
1123 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
1124 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
1125 |
1126 | [metadata]
1127 | lock-version = "1.1"
1128 | python-versions = "^3.6"
1129 | content-hash = "a0b446092c761885908a560fe988f21d229fbd29139b93859cc2375b98679187"
1130 |
1131 | [metadata.files]
1132 | aiocontextvars = [
1133 | {file = "aiocontextvars-0.2.2-py2.py3-none-any.whl", hash = "sha256:885daf8261818767d8f7cbd79f9d4482d118f024b6586ef6e67980236a27bfa3"},
1134 | {file = "aiocontextvars-0.2.2.tar.gz", hash = "sha256:f027372dc48641f683c559f247bd84962becaacdc9ba711d583c3871fb5652aa"},
1135 | ]
1136 | astor = [
1137 | {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"},
1138 | {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"},
1139 | ]
1140 | atomicwrites = [
1141 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
1142 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
1143 | ]
1144 | attrs = [
1145 | {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
1146 | {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
1147 | ]
1148 | autorepr = [
1149 | {file = "autorepr-0.3.0-py2-none-any.whl", hash = "sha256:c34567e4073630feb52d9c788fc198085e9e9de4817e3b93b7c4c534fc689f11"},
1150 | {file = "autorepr-0.3.0-py2.py3-none-any.whl", hash = "sha256:1d9010d14fb325d3961e3aa73692685563f97d6ba4a2f0f735329fb37422599c"},
1151 | {file = "autorepr-0.3.0.tar.gz", hash = "sha256:ef770b84793d5433e6bb893054973b8c7ce6b487274f9c3f734f678cae11e85e"},
1152 | ]
1153 | bandit = [
1154 | {file = "bandit-1.7.0-py3-none-any.whl", hash = "sha256:216be4d044209fa06cf2a3e51b319769a51be8318140659719aa7a115c35ed07"},
1155 | {file = "bandit-1.7.0.tar.gz", hash = "sha256:8a4c7415254d75df8ff3c3b15cfe9042ecee628a1e40b44c15a98890fbfc2608"},
1156 | ]
1157 | cachy = [
1158 | {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"},
1159 | {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"},
1160 | ]
1161 | certifi = [
1162 | {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"},
1163 | {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"},
1164 | ]
1165 | chardet = [
1166 | {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"},
1167 | {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"},
1168 | ]
1169 | click = [
1170 | {file = "click-8.0.0-py3-none-any.whl", hash = "sha256:e90e62ced43dc8105fb9a26d62f0d9340b5c8db053a814e25d95c19873ae87db"},
1171 | {file = "click-8.0.0.tar.gz", hash = "sha256:7d8c289ee437bcb0316820ccee14aefcb056e58d31830ecab8e47eda6540e136"},
1172 | ]
1173 | colorama = [
1174 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
1175 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
1176 | ]
1177 | configupdater = [
1178 | {file = "ConfigUpdater-2.0-py2.py3-none-any.whl", hash = "sha256:bc62bd5141c45a89840a3e82e0a06f23fb2c00de82e2b72c8030cafb4daea9a2"},
1179 | {file = "ConfigUpdater-2.0.tar.gz", hash = "sha256:6a60447fb25e5cb5036cdd5761287ac5649135a49094bc8bd71d999417483441"},
1180 | ]
1181 | contextvars = [
1182 | {file = "contextvars-2.4.tar.gz", hash = "sha256:f38c908aaa59c14335eeea12abea5f443646216c4e29380d7bf34d2018e2c39e"},
1183 | ]
1184 | coverage = [
1185 | {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"},
1186 | {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"},
1187 | {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"},
1188 | {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"},
1189 | {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"},
1190 | {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"},
1191 | {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"},
1192 | {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"},
1193 | {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"},
1194 | {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"},
1195 | {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"},
1196 | {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"},
1197 | {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"},
1198 | {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"},
1199 | {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"},
1200 | {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"},
1201 | {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"},
1202 | {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"},
1203 | {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"},
1204 | {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"},
1205 | {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"},
1206 | {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"},
1207 | {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"},
1208 | {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"},
1209 | {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"},
1210 | {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"},
1211 | {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"},
1212 | {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"},
1213 | {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"},
1214 | {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"},
1215 | {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"},
1216 | {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"},
1217 | {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"},
1218 | {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"},
1219 | {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"},
1220 | {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"},
1221 | {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"},
1222 | {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"},
1223 | {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"},
1224 | {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"},
1225 | {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"},
1226 | {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"},
1227 | {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"},
1228 | {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"},
1229 | {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"},
1230 | {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"},
1231 | {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"},
1232 | {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"},
1233 | {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"},
1234 | {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"},
1235 | {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"},
1236 | {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"},
1237 | ]
1238 | darglint = [
1239 | {file = "darglint-1.8.0-py3-none-any.whl", hash = "sha256:ac6797bcc918cd8d8f14c168a4a364f54e1aeb4ced59db58e7e4c6dfec2fe15c"},
1240 | {file = "darglint-1.8.0.tar.gz", hash = "sha256:aa605ef47817a6d14797d32b390466edab621768ea4ca5cc0f3c54f6d8dcaec8"},
1241 | ]
1242 | dataclasses = [
1243 | {file = "dataclasses-0.8-py3-none-any.whl", hash = "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf"},
1244 | {file = "dataclasses-0.8.tar.gz", hash = "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97"},
1245 | ]
1246 | decorator = [
1247 | {file = "decorator-5.0.8-py3-none-any.whl", hash = "sha256:77a3141f7f5837b5de43569c35508ca4570022ba501db8c8a2a8b292bd35772a"},
1248 | {file = "decorator-5.0.8.tar.gz", hash = "sha256:bff00cfb18698f9a19fa6400451fd7ea894f3845cedd7b8b7b0ce9c53171fefb"},
1249 | ]
1250 | dictdiffer = [
1251 | {file = "dictdiffer-0.8.1-py2.py3-none-any.whl", hash = "sha256:d79d9a39e459fe33497c858470ca0d2e93cb96621751de06d631856adfd9c390"},
1252 | {file = "dictdiffer-0.8.1.tar.gz", hash = "sha256:1adec0d67cdf6166bda96ae2934ddb5e54433998ceab63c984574d187cc563d2"},
1253 | ]
1254 | docutils = [
1255 | {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"},
1256 | {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"},
1257 | ]
1258 | dparse = [
1259 | {file = "dparse-0.5.1-py3-none-any.whl", hash = "sha256:e953a25e44ebb60a5c6efc2add4420c177f1d8404509da88da9729202f306994"},
1260 | {file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"},
1261 | ]
1262 | eradicate = [
1263 | {file = "eradicate-2.0.0.tar.gz", hash = "sha256:27434596f2c5314cc9b31410c93d8f7e8885747399773cd088d3adea647a60c8"},
1264 | ]
1265 | factory-boy = [
1266 | {file = "factory_boy-3.2.0-py2.py3-none-any.whl", hash = "sha256:1d3db4b44b8c8c54cdd8b83ae4bdb9aeb121e464400035f1f03ae0e1eade56a4"},
1267 | {file = "factory_boy-3.2.0.tar.gz", hash = "sha256:401cc00ff339a022f84d64a4339503d1689e8263a4478d876e58a3295b155c5b"},
1268 | ]
1269 | faker = [
1270 | {file = "Faker-8.1.4-py3-none-any.whl", hash = "sha256:73562fb99b6046c5d26b8dd98a1437a896f8601c96382d835c656166159f4f59"},
1271 | {file = "Faker-8.1.4.tar.gz", hash = "sha256:c6a4a0a1dde71f16d489a3097661a87ae96329dbde4c3ece8a5ccc340441ade1"},
1272 | ]
1273 | flake8 = [
1274 | {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"},
1275 | {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"},
1276 | ]
1277 | flake8-bandit = [
1278 | {file = "flake8_bandit-2.1.2.tar.gz", hash = "sha256:687fc8da2e4a239b206af2e54a90093572a60d0954f3054e23690739b0b0de3b"},
1279 | ]
1280 | flake8-broken-line = [
1281 | {file = "flake8-broken-line-0.3.0.tar.gz", hash = "sha256:f74e052833324a9e5f0055032f7ccc54b23faabafe5a26241c2f977e70b10b50"},
1282 | {file = "flake8_broken_line-0.3.0-py3-none-any.whl", hash = "sha256:611f79c7f27118e7e5d3dc098ef7681c40aeadf23783700c5dbee840d2baf3af"},
1283 | ]
1284 | flake8-bugbear = [
1285 | {file = "flake8-bugbear-20.11.1.tar.gz", hash = "sha256:528020129fea2dea33a466b9d64ab650aa3e5f9ffc788b70ea4bc6cf18283538"},
1286 | {file = "flake8_bugbear-20.11.1-py36.py37.py38-none-any.whl", hash = "sha256:f35b8135ece7a014bc0aee5b5d485334ac30a6da48494998cc1fabf7ec70d703"},
1287 | ]
1288 | flake8-commas = [
1289 | {file = "flake8-commas-2.0.0.tar.gz", hash = "sha256:d3005899466f51380387df7151fb59afec666a0f4f4a2c6a8995b975de0f44b7"},
1290 | {file = "flake8_commas-2.0.0-py2.py3-none-any.whl", hash = "sha256:ee2141a3495ef9789a3894ed8802d03eff1eaaf98ce6d8653a7c573ef101935e"},
1291 | ]
1292 | flake8-comprehensions = [
1293 | {file = "flake8-comprehensions-3.5.0.tar.gz", hash = "sha256:f24be9032587127f7a5bc6d066bf755b6e66834f694383adb8a673e229c1f559"},
1294 | {file = "flake8_comprehensions-3.5.0-py3-none-any.whl", hash = "sha256:b07aef3277623db32310aa241a1cec67212b53c1d18e767d7e26d4d83aa05bf7"},
1295 | ]
1296 | flake8-debugger = [
1297 | {file = "flake8-debugger-4.0.0.tar.gz", hash = "sha256:e43dc777f7db1481db473210101ec2df2bd39a45b149d7218a618e954177eda6"},
1298 | {file = "flake8_debugger-4.0.0-py3-none-any.whl", hash = "sha256:82e64faa72e18d1bdd0000407502ebb8ecffa7bc027c62b9d4110ce27c091032"},
1299 | ]
1300 | flake8-docstrings = [
1301 | {file = "flake8-docstrings-1.6.0.tar.gz", hash = "sha256:9fe7c6a306064af8e62a055c2f61e9eb1da55f84bb39caef2b84ce53708ac34b"},
1302 | {file = "flake8_docstrings-1.6.0-py2.py3-none-any.whl", hash = "sha256:99cac583d6c7e32dd28bbfbef120a7c0d1b6dde4adb5a9fd441c4227a6534bde"},
1303 | ]
1304 | flake8-eradicate = [
1305 | {file = "flake8-eradicate-1.0.0.tar.gz", hash = "sha256:fe7167226676823d50cf540532302a6f576c5a398c5260692571a05ef72c5f5b"},
1306 | {file = "flake8_eradicate-1.0.0-py3-none-any.whl", hash = "sha256:0fc4ab858a18c7ed630621b5345254c8f55be6060ea5c44a25e384d613618d1f"},
1307 | ]
1308 | flake8-isort = [
1309 | {file = "flake8-isort-4.0.0.tar.gz", hash = "sha256:2b91300f4f1926b396c2c90185844eb1a3d5ec39ea6138832d119da0a208f4d9"},
1310 | {file = "flake8_isort-4.0.0-py2.py3-none-any.whl", hash = "sha256:729cd6ef9ba3659512dee337687c05d79c78e1215fdf921ed67e5fe46cce2f3c"},
1311 | ]
1312 | flake8-plugin-utils = [
1313 | {file = "flake8-plugin-utils-1.3.2.tar.gz", hash = "sha256:20fa2a8ca2decac50116edb42e6af0a1253ef639ad79941249b840531889c65a"},
1314 | {file = "flake8_plugin_utils-1.3.2-py3-none-any.whl", hash = "sha256:1fe43e3e9acf3a7c0f6b88f5338cad37044d2f156c43cb6b080b5f9da8a76f06"},
1315 | ]
1316 | flake8-polyfill = [
1317 | {file = "flake8-polyfill-1.0.2.tar.gz", hash = "sha256:e44b087597f6da52ec6393a709e7108b2905317d0c0b744cdca6208e670d8eda"},
1318 | {file = "flake8_polyfill-1.0.2-py2.py3-none-any.whl", hash = "sha256:12be6a34ee3ab795b19ca73505e7b55826d5f6ad7230d31b18e106400169b9e9"},
1319 | ]
1320 | flake8-pytest-style = [
1321 | {file = "flake8-pytest-style-1.5.0.tar.gz", hash = "sha256:668ce8f55edf7db4ac386d2735c3b354b5cb47aa341a4655d91a5788dd03124b"},
1322 | {file = "flake8_pytest_style-1.5.0-py3-none-any.whl", hash = "sha256:ec287a7dc4fe95082af5e408c8b2f8f4b6bcb366d5a17ff6c34112eb03446580"},
1323 | ]
1324 | flake8-quotes = [
1325 | {file = "flake8-quotes-3.2.0.tar.gz", hash = "sha256:3f1116e985ef437c130431ac92f9b3155f8f652fda7405ac22ffdfd7a9d1055e"},
1326 | ]
1327 | flake8-rst-docstrings = [
1328 | {file = "flake8-rst-docstrings-0.2.3.tar.gz", hash = "sha256:3045794e1c8467fba33aaea5c246b8369efc9c44ef8b0b20199bb6df7a4bd47b"},
1329 | {file = "flake8_rst_docstrings-0.2.3-py3-none-any.whl", hash = "sha256:565bbb391d7e4d0042924102221e9857ad72929cdd305b26501736ec22c1451a"},
1330 | ]
1331 | flake8-string-format = [
1332 | {file = "flake8-string-format-0.3.0.tar.gz", hash = "sha256:65f3da786a1461ef77fca3780b314edb2853c377f2e35069723348c8917deaa2"},
1333 | {file = "flake8_string_format-0.3.0-py2.py3-none-any.whl", hash = "sha256:812ff431f10576a74c89be4e85b8e075a705be39bc40c4b4278b5b13e2afa9af"},
1334 | ]
1335 | gitdb = [
1336 | {file = "gitdb-4.0.7-py3-none-any.whl", hash = "sha256:6c4cc71933456991da20917998acbe6cf4fb41eeaab7d6d67fbc05ecd4c865b0"},
1337 | {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"},
1338 | ]
1339 | gitpython = [
1340 | {file = "GitPython-3.1.17-py3-none-any.whl", hash = "sha256:29fe82050709760081f588dd50ce83504feddbebdc4da6956d02351552b1c135"},
1341 | {file = "GitPython-3.1.17.tar.gz", hash = "sha256:ee24bdc93dce357630764db659edaf6b8d664d4ff5447ccfeedd2dc5c253f41e"},
1342 | ]
1343 | identify = [
1344 | {file = "identify-1.6.2-py2.py3-none-any.whl", hash = "sha256:8f9879b5b7cca553878d31548a419ec2f227d3328da92fe8202bc5e546d5cbc3"},
1345 | {file = "identify-1.6.2.tar.gz", hash = "sha256:1c2014f6985ed02e62b2e6955578acf069cb2c54859e17853be474bfe7e13bed"},
1346 | ]
1347 | idna = [
1348 | {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"},
1349 | {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"},
1350 | ]
1351 | immutables = [
1352 | {file = "immutables-0.15-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:6728f4392e3e8e64b593a5a0cd910a1278f07f879795517e09f308daed138631"},
1353 | {file = "immutables-0.15-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f0836cd3bdc37c8a77b192bbe5f41dbcc3ce654db048ebbba89bdfe6db7a1c7a"},
1354 | {file = "immutables-0.15-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:8703d8abfd8687932f2a05f38e7de270c3a6ca3bd1c1efb3c938656b3f2f985a"},
1355 | {file = "immutables-0.15-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b8ad986f9b532c026f19585289384b0769188fcb68b37c7f0bd0df9092a6ca54"},
1356 | {file = "immutables-0.15-cp36-cp36m-win_amd64.whl", hash = "sha256:6f117d9206165b9dab8fd81c5129db757d1a044953f438654236ed9a7a4224ae"},
1357 | {file = "immutables-0.15-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:b75ade826920c4e490b1bb14cf967ac14e61eb7c5562161c5d7337d61962c226"},
1358 | {file = "immutables-0.15-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:b7e13c061785e34f73c4f659861f1b3e4a5fd918e4395c84b21c4e3d449ebe27"},
1359 | {file = "immutables-0.15-cp37-cp37m-win_amd64.whl", hash = "sha256:3035849accee4f4e510ed7c94366a40e0f5fef9069fbe04a35f4787b13610a4a"},
1360 | {file = "immutables-0.15-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:b04fa69174e0c8f815f9c55f2a43fc9e5a68452fab459a08e904a74e8471639f"},
1361 | {file = "immutables-0.15-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:141c2e9ea515a3a815007a429f0b47a578ebeb42c831edaec882a245a35fffca"},
1362 | {file = "immutables-0.15-cp38-cp38-win_amd64.whl", hash = "sha256:cbe8c64640637faa5535d539421b293327f119c31507c33ca880bd4f16035eb6"},
1363 | {file = "immutables-0.15-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:a0a4e4417d5ef4812d7f99470cd39347b58cb927365dd2b8da9161040d260db0"},
1364 | {file = "immutables-0.15-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3b15c08c71c59e5b7c2470ef949d49ff9f4263bb77f488422eaa157da84d6999"},
1365 | {file = "immutables-0.15-cp39-cp39-win_amd64.whl", hash = "sha256:2283a93c151566e6830aee0e5bee55fc273455503b43aa004356b50f9182092b"},
1366 | {file = "immutables-0.15.tar.gz", hash = "sha256:3713ab1ebbb6946b7ce1387bb9d1d7f5e09c45add58c2a2ee65f963c171e746b"},
1367 | ]
1368 | importlib-metadata = [
1369 | {file = "importlib_metadata-4.0.1-py3-none-any.whl", hash = "sha256:d7eb1dea6d6a6086f8be21784cc9e3bcfa55872b52309bc5fad53a8ea444465d"},
1370 | {file = "importlib_metadata-4.0.1.tar.gz", hash = "sha256:8c501196e49fb9df5df43833bdb1e4328f64847763ec8a50703148b73784d581"},
1371 | ]
1372 | inflection = [
1373 | {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"},
1374 | {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"},
1375 | ]
1376 | iniconfig = [
1377 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
1378 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
1379 | ]
1380 | isort = [
1381 | {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"},
1382 | {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"},
1383 | ]
1384 | jmespath = [
1385 | {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"},
1386 | {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"},
1387 | ]
1388 | loguru = [
1389 | {file = "loguru-0.5.3-py3-none-any.whl", hash = "sha256:f8087ac396b5ee5f67c963b495d615ebbceac2796379599820e324419d53667c"},
1390 | {file = "loguru-0.5.3.tar.gz", hash = "sha256:b28e72ac7a98be3d28ad28570299a393dfcd32e5e3f6a353dec94675767b6319"},
1391 | ]
1392 | marshmallow = [
1393 | {file = "marshmallow-3.12.1-py2.py3-none-any.whl", hash = "sha256:b45cde981d1835145257b4a3c5cb7b80786dcf5f50dd2990749a50c16cb48e01"},
1394 | {file = "marshmallow-3.12.1.tar.gz", hash = "sha256:8050475b70470cc58f4441ee92375db611792ba39ca1ad41d39cad193ea9e040"},
1395 | ]
1396 | marshmallow-polyfield = [
1397 | {file = "marshmallow-polyfield-5.10.tar.gz", hash = "sha256:75d0e31b725650e91428f975a66ed30f703cc6f9fcfe45b8436ee6d676921691"},
1398 | {file = "marshmallow_polyfield-5.10-py3-none-any.whl", hash = "sha256:a0a91730c6d21bfac1563990c7ba1413928e7499af669619d4fb38d1fb25c4e9"},
1399 | ]
1400 | mccabe = [
1401 | {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
1402 | {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
1403 | ]
1404 | mimesis = [
1405 | {file = "mimesis-4.1.3.tar.gz", hash = "sha256:90f36c21c1bb9944afc17178eb5868b0c85aa1fe49eb04bcbdafafd1ad4ca2ba"},
1406 | ]
1407 | more-itertools = [
1408 | {file = "more-itertools-8.7.0.tar.gz", hash = "sha256:c5d6da9ca3ff65220c3bfd2a8db06d698f05d4d2b9be57e1deb2be5a45019713"},
1409 | {file = "more_itertools-8.7.0-py3-none-any.whl", hash = "sha256:5652a9ac72209ed7df8d9c15daf4e1aa0e3d2ccd3c87f8265a0673cd9cbc9ced"},
1410 | ]
1411 | mypy = [
1412 | {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"},
1413 | {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"},
1414 | {file = "mypy-0.910-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9"},
1415 | {file = "mypy-0.910-cp35-cp35m-win_amd64.whl", hash = "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e"},
1416 | {file = "mypy-0.910-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921"},
1417 | {file = "mypy-0.910-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6"},
1418 | {file = "mypy-0.910-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212"},
1419 | {file = "mypy-0.910-cp36-cp36m-win_amd64.whl", hash = "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885"},
1420 | {file = "mypy-0.910-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0"},
1421 | {file = "mypy-0.910-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de"},
1422 | {file = "mypy-0.910-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703"},
1423 | {file = "mypy-0.910-cp37-cp37m-win_amd64.whl", hash = "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a"},
1424 | {file = "mypy-0.910-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504"},
1425 | {file = "mypy-0.910-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9"},
1426 | {file = "mypy-0.910-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072"},
1427 | {file = "mypy-0.910-cp38-cp38-win_amd64.whl", hash = "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811"},
1428 | {file = "mypy-0.910-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e"},
1429 | {file = "mypy-0.910-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b"},
1430 | {file = "mypy-0.910-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2"},
1431 | {file = "mypy-0.910-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97"},
1432 | {file = "mypy-0.910-cp39-cp39-win_amd64.whl", hash = "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8"},
1433 | {file = "mypy-0.910-py3-none-any.whl", hash = "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"},
1434 | {file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"},
1435 | ]
1436 | mypy-extensions = [
1437 | {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
1438 | {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
1439 | ]
1440 | nitpick = [
1441 | {file = "nitpick-0.27.0-py3-none-any.whl", hash = "sha256:bc8a92b004099cef4f35db4f986b76bd1425a364afc5cd0fc38fce13365cf81f"},
1442 | {file = "nitpick-0.27.0.tar.gz", hash = "sha256:4424a2a374c76173fd6cc1b637b9ab79f1f487cb892e7e9db4458de072082f07"},
1443 | ]
1444 | packaging = [
1445 | {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"},
1446 | {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"},
1447 | ]
1448 | pbr = [
1449 | {file = "pbr-5.6.0-py2.py3-none-any.whl", hash = "sha256:c68c661ac5cc81058ac94247278eeda6d2e6aecb3e227b0387c30d277e7ef8d4"},
1450 | {file = "pbr-5.6.0.tar.gz", hash = "sha256:42df03e7797b796625b1029c0400279c7c34fd7df24a7d7818a1abb5b38710dd"},
1451 | ]
1452 | pep8-naming = [
1453 | {file = "pep8-naming-0.11.1.tar.gz", hash = "sha256:a1dd47dd243adfe8a83616e27cf03164960b507530f155db94e10b36a6cd6724"},
1454 | {file = "pep8_naming-0.11.1-py2.py3-none-any.whl", hash = "sha256:f43bfe3eea7e0d73e8b5d07d6407ab47f2476ccaeff6937c84275cd30b016738"},
1455 | ]
1456 | pluggy = [
1457 | {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
1458 | {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
1459 | ]
1460 | py = [
1461 | {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"},
1462 | {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"},
1463 | ]
1464 | pycodestyle = [
1465 | {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"},
1466 | {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"},
1467 | ]
1468 | pydantic = [
1469 | {file = "pydantic-1.7.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3c60039e84552442defbcb5d56711ef0e057028ca7bfc559374917408a88d84e"},
1470 | {file = "pydantic-1.7.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6e7e314acb170e143c6f3912f93f2ec80a96aa2009ee681356b7ce20d57e5c62"},
1471 | {file = "pydantic-1.7.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:8ef77cd17b73b5ba46788d040c0e820e49a2d80cfcd66fda3ba8be31094fd146"},
1472 | {file = "pydantic-1.7.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:115d8aa6f257a1d469c66b6bfc7aaf04cd87c25095f24542065c68ebcb42fe63"},
1473 | {file = "pydantic-1.7.4-cp36-cp36m-win_amd64.whl", hash = "sha256:66757d4e1eab69a3cfd3114480cc1d72b6dd847c4d30e676ae838c6740fdd146"},
1474 | {file = "pydantic-1.7.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4c92863263e4bd89e4f9cf1ab70d918170c51bd96305fe7b00853d80660acb26"},
1475 | {file = "pydantic-1.7.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3b8154babf30a5e0fa3aa91f188356763749d9b30f7f211fafb247d4256d7877"},
1476 | {file = "pydantic-1.7.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:80cc46378505f7ff202879dcffe4bfbf776c15675028f6e08d1d10bdfbb168ac"},
1477 | {file = "pydantic-1.7.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:dda60d7878a5af2d8560c55c7c47a8908344aa78d32ec1c02d742ede09c534df"},
1478 | {file = "pydantic-1.7.4-cp37-cp37m-win_amd64.whl", hash = "sha256:4c1979d5cc3e14b35f0825caddea5a243dd6085e2a7539c006bc46997ef7a61a"},
1479 | {file = "pydantic-1.7.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8857576600c32aa488f18d30833aa833b54a48e3bab3adb6de97e463af71f8f8"},
1480 | {file = "pydantic-1.7.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1f86d4da363badb39426a0ff494bf1d8510cd2f7274f460eee37bdbf2fd495ec"},
1481 | {file = "pydantic-1.7.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:3ea1256a9e782149381e8200119f3e2edea7cd6b123f1c79ab4bbefe4d9ba2c9"},
1482 | {file = "pydantic-1.7.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:e28455b42a0465a7bf2cde5eab530389226ce7dc779de28d17b8377245982b1e"},
1483 | {file = "pydantic-1.7.4-cp38-cp38-win_amd64.whl", hash = "sha256:47c5b1d44934375a3311891cabd450c150a31cf5c22e84aa172967bf186718be"},
1484 | {file = "pydantic-1.7.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:00250e5123dd0b123ff72be0e1b69140e0b0b9e404d15be3846b77c6f1b1e387"},
1485 | {file = "pydantic-1.7.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d24aa3f7f791a023888976b600f2f389d3713e4f23b7a4c88217d3fce61cdffc"},
1486 | {file = "pydantic-1.7.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:2c44a9afd4c4c850885436a4209376857989aaf0853c7b118bb2e628d4b78c4e"},
1487 | {file = "pydantic-1.7.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:e87edd753da0ca1d44e308a1b1034859ffeab1f4a4492276bff9e1c3230db4fe"},
1488 | {file = "pydantic-1.7.4-cp39-cp39-win_amd64.whl", hash = "sha256:a3026ee105b5360855e500b4abf1a1d0b034d88e75a2d0d66a4c35e60858e15b"},
1489 | {file = "pydantic-1.7.4-py3-none-any.whl", hash = "sha256:a82385c6d5a77e3387e94612e3e34b77e13c39ff1295c26e3ba664e7b98073e2"},
1490 | {file = "pydantic-1.7.4.tar.gz", hash = "sha256:0a1abcbd525fbb52da58c813d54c2ec706c31a91afdb75411a73dd1dec036595"},
1491 | ]
1492 | pydocstyle = [
1493 | {file = "pydocstyle-6.0.0-py3-none-any.whl", hash = "sha256:d4449cf16d7e6709f63192146706933c7a334af7c0f083904799ccb851c50f6d"},
1494 | {file = "pydocstyle-6.0.0.tar.gz", hash = "sha256:164befb520d851dbcf0e029681b91f4f599c62c5cd8933fd54b1bfbd50e89e1f"},
1495 | ]
1496 | pyflakes = [
1497 | {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"},
1498 | {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"},
1499 | ]
1500 | pygments = [
1501 | {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"},
1502 | {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"},
1503 | ]
1504 | pyparsing = [
1505 | {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
1506 | {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
1507 | ]
1508 | pytest = [
1509 | {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"},
1510 | {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"},
1511 | ]
1512 | pytest-cov = [
1513 | {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"},
1514 | {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"},
1515 | ]
1516 | pytest-factoryboy = [
1517 | {file = "pytest-factoryboy-2.1.0.tar.gz", hash = "sha256:23bc562ab32cc39eddfbbbf70e618a1b30e834a4cfa451c4bedc36216f0a7b19"},
1518 | {file = "pytest_factoryboy-2.1.0-py3-none-any.whl", hash = "sha256:10c02d2736cb52c7af28065db9617e7f50634e95eaa07eeb9a007026aa3dc0a8"},
1519 | ]
1520 | pytest-randomly = [
1521 | {file = "pytest-randomly-3.8.0.tar.gz", hash = "sha256:d9e21a72446757129378beea00bc9a32df1fb1cfd0bbe408be1ae9685bdf1209"},
1522 | {file = "pytest_randomly-3.8.0-py3-none-any.whl", hash = "sha256:f5b7a09e84ee1eabcdedbb73c51d0929ae2f582bab6941dbb513bb49296d6340"},
1523 | ]
1524 | python-dateutil = [
1525 | {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"},
1526 | {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"},
1527 | ]
1528 | python-slugify = [
1529 | {file = "python-slugify-5.0.2.tar.gz", hash = "sha256:f13383a0b9fcbe649a1892b9c8eb4f8eab1d6d84b84bb7a624317afa98159cab"},
1530 | {file = "python_slugify-5.0.2-py2.py3-none-any.whl", hash = "sha256:6d8c5df75cd4a7c3a2d21e257633de53f52ab0265cd2d1dc62a730e8194a7380"},
1531 | ]
1532 | pyyaml = [
1533 | {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"},
1534 | {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"},
1535 | {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"},
1536 | {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"},
1537 | {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"},
1538 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"},
1539 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"},
1540 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"},
1541 | {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"},
1542 | {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"},
1543 | {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"},
1544 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"},
1545 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"},
1546 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"},
1547 | {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"},
1548 | {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"},
1549 | {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"},
1550 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"},
1551 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"},
1552 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"},
1553 | {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"},
1554 | {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"},
1555 | {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"},
1556 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"},
1557 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"},
1558 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"},
1559 | {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"},
1560 | {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"},
1561 | {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"},
1562 | ]
1563 | requests = [
1564 | {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"},
1565 | {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"},
1566 | ]
1567 | restructuredtext-lint = [
1568 | {file = "restructuredtext_lint-1.3.2.tar.gz", hash = "sha256:d3b10a1fe2ecac537e51ae6d151b223b78de9fafdd50e5eb6b08c243df173c80"},
1569 | ]
1570 | "ruamel.yaml" = [
1571 | {file = "ruamel.yaml-0.17.4-py3-none-any.whl", hash = "sha256:ac79fb25f5476e8e9ed1c53b8a2286d2c3f5dde49eb37dbcee5c7eb6a8415a22"},
1572 | {file = "ruamel.yaml-0.17.4.tar.gz", hash = "sha256:44bc6b54fddd45e4bc0619059196679f9e8b79c027f4131bb072e6a22f4d5e28"},
1573 | ]
1574 | "ruamel.yaml.clib" = [
1575 | {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:28116f204103cb3a108dfd37668f20abe6e3cafd0d3fd40dba126c732457b3cc"},
1576 | {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:daf21aa33ee9b351f66deed30a3d450ab55c14242cfdfcd377798e2c0d25c9f1"},
1577 | {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-win32.whl", hash = "sha256:30dca9bbcbb1cc858717438218d11eafb78666759e5094dd767468c0d577a7e7"},
1578 | {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-win_amd64.whl", hash = "sha256:f6061a31880c1ed6b6ce341215336e2f3d0c1deccd84957b6fa8ca474b41e89f"},
1579 | {file = "ruamel.yaml.clib-0.2.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:73b3d43e04cc4b228fa6fa5d796409ece6fcb53a6c270eb2048109cbcbc3b9c2"},
1580 | {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:53b9dd1abd70e257a6e32f934ebc482dac5edb8c93e23deb663eac724c30b026"},
1581 | {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:839dd72545ef7ba78fd2aa1a5dd07b33696adf3e68fae7f31327161c1093001b"},
1582 | {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1236df55e0f73cd138c0eca074ee086136c3f16a97c2ac719032c050f7e0622f"},
1583 | {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win32.whl", hash = "sha256:b1e981fe1aff1fd11627f531524826a4dcc1f26c726235a52fcb62ded27d150f"},
1584 | {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4e52c96ca66de04be42ea2278012a2342d89f5e82b4512fb6fb7134e377e2e62"},
1585 | {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a873e4d4954f865dcb60bdc4914af7eaae48fb56b60ed6daa1d6251c72f5337c"},
1586 | {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ab845f1f51f7eb750a78937be9f79baea4a42c7960f5a94dde34e69f3cce1988"},
1587 | {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:2fd336a5c6415c82e2deb40d08c222087febe0aebe520f4d21910629018ab0f3"},
1588 | {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win32.whl", hash = "sha256:e9f7d1d8c26a6a12c23421061f9022bb62704e38211fe375c645485f38df34a2"},
1589 | {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2602e91bd5c1b874d6f93d3086f9830f3e907c543c7672cf293a97c3fabdcd91"},
1590 | {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:44c7b0498c39f27795224438f1a6be6c5352f82cb887bc33d962c3a3acc00df6"},
1591 | {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8e8fd0a22c9d92af3a34f91e8a2594eeb35cba90ab643c5e0e643567dc8be43e"},
1592 | {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:75f0ee6839532e52a3a53f80ce64925ed4aed697dd3fa890c4c918f3304bd4f4"},
1593 | {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win32.whl", hash = "sha256:464e66a04e740d754170be5e740657a3b3b6d2bcc567f0c3437879a6e6087ff6"},
1594 | {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:52ae5739e4b5d6317b52f5b040b1b6639e8af68a5b8fd606a8b08658fbd0cab5"},
1595 | {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df5019e7783d14b79217ad9c56edf1ba7485d614ad5a385d1b3c768635c81c0"},
1596 | {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5254af7d8bdf4d5484c089f929cb7f5bafa59b4f01d4f48adda4be41e6d29f99"},
1597 | {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8be05be57dc5c7b4a0b24edcaa2f7275866d9c907725226cdde46da09367d923"},
1598 | {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win32.whl", hash = "sha256:74161d827407f4db9072011adcfb825b5258a5ccb3d2cd518dd6c9edea9e30f1"},
1599 | {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:058a1cc3df2a8aecc12f983a48bda99315cebf55a3b3a5463e37bb599b05727b"},
1600 | {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6ac7e45367b1317e56f1461719c853fd6825226f45b835df7436bb04031fd8a"},
1601 | {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b4b0d31f2052b3f9f9b5327024dc629a253a83d8649d4734ca7f35b60ec3e9e5"},
1602 | {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1f8c0a4577c0e6c99d208de5c4d3fd8aceed9574bb154d7a2b21c16bb924154c"},
1603 | {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-win32.whl", hash = "sha256:46d6d20815064e8bb023ea8628cfb7402c0f0e83de2c2227a88097e239a7dffd"},
1604 | {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6c0a5dc52fc74eb87c67374a4e554d4761fd42a4d01390b7e868b30d21f4b8bb"},
1605 | {file = "ruamel.yaml.clib-0.2.2.tar.gz", hash = "sha256:2d24bd98af676f4990c4d715bcdc2a60b19c56a3fb3a763164d2d8ca0e806ba7"},
1606 | ]
1607 | safety = [
1608 | {file = "safety-1.10.3-py2.py3-none-any.whl", hash = "sha256:5f802ad5df5614f9622d8d71fedec2757099705c2356f862847c58c6dfe13e84"},
1609 | {file = "safety-1.10.3.tar.gz", hash = "sha256:30e394d02a20ac49b7f65292d19d38fa927a8f9582cdfd3ad1adbbc66c641ad5"},
1610 | ]
1611 | six = [
1612 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
1613 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
1614 | ]
1615 | smmap = [
1616 | {file = "smmap-4.0.0-py2.py3-none-any.whl", hash = "sha256:a9a7479e4c572e2e775c404dcd3080c8dc49f39918c2cf74913d30c4c478e3c2"},
1617 | {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"},
1618 | ]
1619 | snowballstemmer = [
1620 | {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"},
1621 | {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"},
1622 | ]
1623 | sortedcontainers = [
1624 | {file = "sortedcontainers-2.3.0-py2.py3-none-any.whl", hash = "sha256:37257a32add0a3ee490bb170b599e93095eed89a55da91fa9f48753ea12fd73f"},
1625 | {file = "sortedcontainers-2.3.0.tar.gz", hash = "sha256:59cc937650cf60d677c16775597c89a960658a09cf7c1a668f86e1e4464b10a1"},
1626 | ]
1627 | stevedore = [
1628 | {file = "stevedore-3.3.0-py3-none-any.whl", hash = "sha256:50d7b78fbaf0d04cd62411188fa7eedcb03eb7f4c4b37005615ceebe582aa82a"},
1629 | {file = "stevedore-3.3.0.tar.gz", hash = "sha256:3a5bbd0652bf552748871eaa73a4a8dc2899786bc497a2aa1fcb4dcdb0debeee"},
1630 | ]
1631 | testfixtures = [
1632 | {file = "testfixtures-6.17.1-py2.py3-none-any.whl", hash = "sha256:9ed31e83f59619e2fa17df053b241e16e0608f4580f7b5a9333a0c9bdcc99137"},
1633 | {file = "testfixtures-6.17.1.tar.gz", hash = "sha256:5ec3a0dd6f71cc4c304fbc024a10cc293d3e0b852c868014b9f233203e149bda"},
1634 | ]
1635 | text-unidecode = [
1636 | {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"},
1637 | {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"},
1638 | ]
1639 | toml = [
1640 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
1641 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
1642 | ]
1643 | tomlkit = [
1644 | {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"},
1645 | {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"},
1646 | ]
1647 | typed-ast = [
1648 | {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"},
1649 | {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"},
1650 | {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"},
1651 | {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"},
1652 | {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"},
1653 | {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"},
1654 | {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"},
1655 | {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"},
1656 | {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"},
1657 | {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"},
1658 | {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"},
1659 | {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"},
1660 | {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"},
1661 | {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"},
1662 | {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"},
1663 | {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"},
1664 | {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"},
1665 | {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"},
1666 | {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"},
1667 | {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"},
1668 | {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"},
1669 | {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"},
1670 | {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"},
1671 | {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"},
1672 | {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"},
1673 | {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"},
1674 | {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"},
1675 | {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"},
1676 | {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"},
1677 | {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"},
1678 | ]
1679 | typing-extensions = [
1680 | {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"},
1681 | {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"},
1682 | {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"},
1683 | ]
1684 | urllib3 = [
1685 | {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"},
1686 | {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"},
1687 | ]
1688 | validators = [
1689 | {file = "validators-0.18.2-py3-none-any.whl", hash = "sha256:0143dcca8a386498edaf5780cbd5960da1a4c85e0719f3ee5c9b41249c4fefbd"},
1690 | {file = "validators-0.18.2.tar.gz", hash = "sha256:37cd9a9213278538ad09b5b9f9134266e7c226ab1fede1d500e29e0a8fbb9ea6"},
1691 | ]
1692 | wemake-python-styleguide = [
1693 | {file = "wemake-python-styleguide-0.15.3.tar.gz", hash = "sha256:8b89aedabae67b7b915908ed06c178b702068137c0d8afe1fb59cdc829cd2143"},
1694 | {file = "wemake_python_styleguide-0.15.3-py3-none-any.whl", hash = "sha256:a382f6c9ec87d56daa08a11e47cab019c99b384f1393b32564ebc74c6da80441"},
1695 | ]
1696 | win32-setctime = [
1697 | {file = "win32_setctime-1.0.3-py3-none-any.whl", hash = "sha256:dc925662de0a6eb987f0b01f599c01a8236cb8c62831c22d9cada09ad958243e"},
1698 | {file = "win32_setctime-1.0.3.tar.gz", hash = "sha256:4e88556c32fdf47f64165a2180ba4552f8bb32c1103a2fafd05723a0bd42bd4b"},
1699 | ]
1700 | zipp = [
1701 | {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"},
1702 | {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"},
1703 | ]
1704 |
--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------
1 | [build-system]
2 | requires = ["poetry>=1.0"]
3 | build-backend = "poetry.masonry.api"
4 |
5 |
6 | [tool.nitpick]
7 | style = "https://raw.githubusercontent.com/wemake-services/wemake-python-styleguide/master/styles/nitpick-style-wemake.toml"
8 |
9 |
10 | [tool.poetry]
11 | name = "mimesis_factory"
12 | version = "1.2.0"
13 | description = "Mimesis integration with factory_boy"
14 |
15 | license = "MIT"
16 |
17 | authors = [
18 | "Nikita Sobolev ",
19 | "Líkið Geimfari "
20 | ]
21 |
22 | readme = 'README.md'
23 |
24 | repository = "https://github.com/mimesis-lab/mimesis-factory"
25 | homepage = "https://github.com/mimesis-lab/mimesis-factory"
26 |
27 | keywords = [
28 | "mimesis",
29 | "factory_boy",
30 | "testing",
31 | "fixtures",
32 | "fake data",
33 | "fabric",
34 | "factory"
35 | ]
36 |
37 | [tool.poetry.dependencies]
38 | python = "^3.6"
39 |
40 | factory-boy = ">=2.11,<4.0"
41 | mimesis = "^4.0"
42 |
43 | [tool.poetry.dev-dependencies]
44 | pytest-cov = "^2.12"
45 | pytest-factoryboy = "^2.1"
46 | pytest-randomly = "^3.8"
47 | pytest = "^6.2"
48 |
49 | wemake-python-styleguide = "^0.15"
50 | flake8-pytest-style = "^1.5"
51 | nitpick = "^0.27"
52 |
53 | validators = "^0.18"
54 | mypy = "^0.910"
55 | safety = "^1.10"
56 |
--------------------------------------------------------------------------------
/setup.cfg:
--------------------------------------------------------------------------------
1 | # All configuration for plugins and other utils is defined here.
2 | # Read more about `setup.cfg`:
3 | # https://docs.python.org/3/distutils/configfile.html
4 |
5 |
6 | [flake8]
7 | # Base flake8 configuration:
8 | # https://flake8.pycqa.org/en/latest/user/configuration.html
9 | format = wemake
10 | show-source = True
11 | statistics = False
12 | doctests = True
13 |
14 | # darglint configuration:
15 | # https://github.com/terrencepreilly/darglint
16 | strictness = long
17 | docstring-style = numpy
18 |
19 | # Plugins:
20 | max-complexity = 6
21 | max-line-length = 80
22 | allowed-domain-names = params
23 |
24 | # Disable some pydocstyle checks:
25 | ignore = D100, D104, D106, D401, X100, DAR103, DAR203, RST303, RST304, W504
26 |
27 | exclude =
28 | # Trash and cache:
29 | .git
30 | __pycache__
31 | .venv
32 | .eggs
33 | *.egg
34 |
35 | per-file-ignores =
36 | # Allow to use `assert` in tests, also decrease the number of docs:
37 | tests/*.py: D101, D103, D107, S101, WPS202, WPS218, WPS226, WPS432
38 |
39 |
40 | [isort]
41 | # isort configuration:
42 | # https://github.com/timothycrosley/isort/wiki/isort-Settings
43 | include_trailing_comma = true
44 | use_parentheses = true
45 | # See https://github.com/timothycrosley/isort#multi-line-output-modes
46 | multi_line_output = 3
47 | line_length = 80
48 |
49 |
50 | [tool:pytest]
51 | # py.test options:
52 | norecursedirs = *.egg .eggs dist build docs .tox .git __pycache__
53 |
54 | addopts =
55 | --strict-markers
56 | --strict-config
57 | --doctest-modules
58 | --cov-branch
59 | --cov=mimesis_factory
60 | --cov-report=term-missing:skip-covered
61 | --cov-report=html
62 | --cov-report=xml
63 | --cov-fail-under=100
64 |
65 |
66 | [mypy]
67 | # The mypy configurations: https://mypy.readthedocs.io/en/latest/config_file.html
68 |
69 | allow_redefinition = False
70 | check_untyped_defs = True
71 | disallow_untyped_calls = True
72 | ignore_errors = False
73 | ignore_missing_imports = True
74 | implicit_reexport = False
75 | strict_optional = True
76 | strict_equality = True
77 | no_implicit_optional = True
78 | local_partial_types = True
79 | warn_no_return = True
80 | warn_unused_ignores = True
81 | warn_redundant_casts = True
82 | warn_unused_configs = True
83 | warn_unreachable = True
84 |
--------------------------------------------------------------------------------
/tests/test_field_params.py:
--------------------------------------------------------------------------------
1 | import factory
2 | import pytest
3 | from mimesis.enums import Gender
4 | from pytest_factoryboy import register
5 |
6 | from mimesis_factory import MimesisField
7 |
8 | MIN_AGE = 30
9 | MAX_AGE = 32
10 |
11 |
12 | class Guest(object):
13 | def __init__(self, full_name, age):
14 | self.full_name = full_name
15 | self.age = age
16 |
17 |
18 | @register
19 | class GuestFactory(factory.Factory):
20 | class Meta(object):
21 | model = Guest
22 |
23 | full_name = MimesisField('full_name', gender=Gender.FEMALE)
24 | age = MimesisField('age', minimum=MIN_AGE, maximum=MAX_AGE)
25 |
26 |
27 | def test_guest_factory_different_data(guest_factory):
28 | guest1 = guest_factory()
29 | guest2 = guest_factory()
30 |
31 | assert isinstance(guest1, Guest)
32 | assert isinstance(guest2, Guest)
33 | assert guest1 != guest2
34 | assert guest1.full_name != guest2.full_name
35 | assert MIN_AGE <= guest1.age <= MAX_AGE
36 | assert MIN_AGE <= guest2.age <= MAX_AGE
37 |
38 |
39 | def test_guest_factory_create_batch(guest_factory):
40 | guests = guest_factory.create_batch(50)
41 | names = {guest.full_name for guest in guests}
42 |
43 | assert len(guests) == len(names)
44 |
45 | for guest in guests:
46 | assert isinstance(guest, Guest)
47 | assert MIN_AGE <= guest.age <= MAX_AGE
48 |
49 |
50 | def test_guest_factory_build_batch(guest_factory):
51 | guests = guest_factory.build_batch(50)
52 | names = {guest.full_name for guest in guests}
53 |
54 | assert len(guests) == len(names)
55 |
56 | for guest in guests:
57 | assert isinstance(guest, Guest)
58 | assert MIN_AGE <= guest.age <= MAX_AGE
59 |
60 |
61 | def test_guest_instance_data(guest):
62 | assert isinstance(guest, Guest)
63 | assert guest.full_name != ''
64 | assert MIN_AGE <= guest.age <= MAX_AGE
65 |
66 |
67 | @pytest.mark.parametrize('guest__age', [19])
68 | def test_guest_data_overrides(guest):
69 | assert isinstance(guest, Guest)
70 | assert guest.full_name != ''
71 | assert guest.age == 19
72 |
--------------------------------------------------------------------------------
/tests/test_locale_override.py:
--------------------------------------------------------------------------------
1 | import string
2 |
3 | import factory
4 | from pytest_factoryboy import register
5 |
6 | from mimesis_factory import MimesisField
7 |
8 |
9 | class Person(object):
10 | def __init__(self, full_name_en: str, full_name_ru: str) -> None:
11 | self._full_name_en = full_name_en
12 | self._full_name_ru = full_name_ru
13 |
14 | @property
15 | def full_name_en(self) -> str:
16 | """Some names have special symbols in them."""
17 | return self._full_name_en.replace(' ', '').replace("'", '')
18 |
19 | @property
20 | def full_name_ru(self) -> str:
21 | """Some names have special symbols in them."""
22 | return self._full_name_ru.replace(' ', '').replace("'", '')
23 |
24 |
25 | @register
26 | class PersonFactory(factory.Factory):
27 | class Meta(object):
28 | model = Person
29 |
30 | full_name_en = MimesisField('full_name')
31 | full_name_ru = MimesisField('full_name', locale='ru')
32 |
33 |
34 | def test_data_with_different_locales(person):
35 | for letter in person.full_name_en:
36 | assert letter in string.ascii_letters
37 |
38 | for russian_letter in person.full_name_ru:
39 | assert russian_letter not in string.ascii_letters
40 |
41 |
42 | def test_data_with_override_locale(person_factory):
43 | with MimesisField.override_locale('ru'):
44 | person = person_factory()
45 |
46 | for letter in person.full_name_en:
47 | # Default locale will be changed to overridden:
48 | assert letter not in string.ascii_letters
49 |
50 | for russian_letter in person.full_name_ru:
51 | assert russian_letter not in string.ascii_letters
52 |
53 |
54 | def test_data_with_override_defined_locale(person_factory):
55 | with MimesisField.override_locale('en'):
56 | person = person_factory()
57 |
58 | for letter in person.full_name_en:
59 | assert letter in string.ascii_letters
60 |
61 | for russian_letter in person.full_name_ru:
62 | # Keyword locale has a priority over override:
63 | assert russian_letter not in string.ascii_letters
64 |
--------------------------------------------------------------------------------
/tests/test_providers.py:
--------------------------------------------------------------------------------
1 | import factory
2 | import pytest
3 | from mimesis import builtins
4 | from mimesis.enums import Gender
5 | from mimesis.exceptions import UnsupportedField
6 | from pytest_factoryboy import register
7 |
8 | from mimesis_factory import MimesisField
9 |
10 |
11 | class Guest(object):
12 | def __init__(self, full_name, patronymic):
13 | self.full_name = full_name
14 | self.patronymic = patronymic
15 |
16 |
17 | @register
18 | class FactoryWithNoProviders(factory.Factory):
19 | class Meta(object):
20 | model = Guest
21 |
22 | full_name = MimesisField('full_name', gender=Gender.FEMALE)
23 | patronymic = MimesisField('patronymic')
24 |
25 |
26 | @register
27 | class FactoryWithProviders(factory.Factory):
28 | class Meta(object):
29 | model = Guest
30 |
31 | class Params(object):
32 | providers = (builtins.RussiaSpecProvider,)
33 |
34 | full_name = MimesisField('full_name', gender=Gender.FEMALE)
35 | patronymic = MimesisField('patronymic')
36 |
37 |
38 | def test_factory_with_not_extended_providers(factory_with_no_providers):
39 | with pytest.raises(UnsupportedField):
40 | factory_with_no_providers()
41 |
42 |
43 | def test_factory_with_extended_providers(factory_with_providers):
44 | guest = factory_with_providers()
45 | assert isinstance(guest, Guest)
46 |
--------------------------------------------------------------------------------
/tests/test_raw_factories.py:
--------------------------------------------------------------------------------
1 | import factory
2 |
3 | from mimesis_factory import MimesisField
4 |
5 |
6 | class User(object):
7 | def __init__(self, uid, email):
8 | self.uid = uid
9 | self.email = email
10 |
11 |
12 | class UserFactory(factory.Factory):
13 | class Meta(object):
14 | model = User
15 |
16 | uid = factory.Sequence(lambda order: order)
17 | email = MimesisField('email')
18 |
19 |
20 | def test_direct_factory():
21 | users = UserFactory.create_batch(10)
22 |
23 | uids = {user.uid for user in users}
24 | emails = {user.email for user in users}
25 |
26 | assert len(users) == len(emails)
27 | assert len(users) == len(uids)
28 |
29 |
30 | def test_factory_extras():
31 | user = UserFactory(email='custom@mail.ru')
32 |
33 | assert user.email == 'custom@mail.ru'
34 |
--------------------------------------------------------------------------------
/tests/test_raw_objects.py:
--------------------------------------------------------------------------------
1 | import factory
2 | import pytest
3 | import validators
4 | from pytest_factoryboy import register
5 |
6 | from mimesis_factory import MimesisField
7 |
8 | TEST_USERNAMES = ('sobolevn', 'lk-geimfari')
9 |
10 |
11 | class Account(object):
12 | def __init__(self, uid, username, email):
13 | self.uid = uid
14 | self.username = username
15 | self.email = email
16 |
17 |
18 | @register
19 | class AccountFactory(factory.Factory):
20 | class Meta(object):
21 | model = Account
22 | exclude = ('_domain',)
23 |
24 | uid = factory.Sequence(lambda order: order + 1)
25 | username = MimesisField('username')
26 | _domain = MimesisField('top_level_domain')
27 | email = factory.LazyAttribute(
28 | lambda instance: '{0}@example{1}'.format(
29 | instance.username,
30 | instance._domain, # noqa: WPS437
31 | ),
32 | )
33 |
34 |
35 | def test_account_factory_different_data(account_factory):
36 | account1 = account_factory()
37 | account2 = account_factory()
38 |
39 | assert isinstance(account1, Account)
40 | assert isinstance(account2, Account)
41 | assert account1 != account2
42 | assert account1.uid != account2.uid
43 | assert account1.username != account2.username
44 | assert account1.email != account2.email
45 |
46 |
47 | def test_account_factory_overrides(account_factory):
48 | username = 'sobolevn'
49 | desired_id = 190
50 | account = account_factory(username=username, uid=desired_id)
51 |
52 | assert account.uid == desired_id
53 | assert account.username == username
54 | assert account.email.startswith(username)
55 |
56 |
57 | def test_account_factory_create_batch(account_factory):
58 | accounts = account_factory.create_batch(10)
59 | uids = {account.uid for account in accounts}
60 | usernames = {account.username for account in accounts}
61 |
62 | assert len(accounts) == len(uids)
63 | assert len(accounts) == len(usernames)
64 |
65 | for account in accounts:
66 | assert isinstance(account, Account)
67 | assert account.uid > 0
68 | assert account.username != ''
69 | assert account.email.startswith(account.username)
70 |
71 |
72 | def test_account_factory_build_batch(account_factory):
73 | accounts = account_factory.build_batch(10)
74 | uids = {account.uid for account in accounts}
75 | usernames = {account.username for account in accounts}
76 |
77 | assert len(accounts) == len(uids)
78 | assert len(accounts) == len(usernames)
79 |
80 | for account in accounts:
81 | assert isinstance(account, Account)
82 | assert account.uid > 0
83 | assert account.username != ''
84 | assert account.email.startswith(account.username)
85 |
86 |
87 | def test_account_data(account):
88 | assert isinstance(account, Account)
89 | assert account.uid > 0
90 | assert account.username != ''
91 | assert validators.email(account.email)
92 |
93 | username, domain = account.email.split('@')
94 | assert account.username == username
95 | assert validators.domain(domain)
96 |
97 |
98 | @pytest.mark.parametrize('account__username', TEST_USERNAMES)
99 | def test_account_data_overrides(account):
100 | assert account.username in TEST_USERNAMES
101 |
102 | username, _ = account.email.split('@')
103 |
104 | assert account.username == username
105 | assert username in TEST_USERNAMES
106 |
107 |
108 | @pytest.mark.parametrize(('account__username', 'account__uid'), zip(
109 | TEST_USERNAMES, range(10000, 10003),
110 | ))
111 | def test_account_multiple_data_overrides(account):
112 | assert account.username in TEST_USERNAMES
113 | assert 10000 <= account.uid < 10003
114 |
115 | username, _ = account.email.split('@')
116 |
117 | assert account.username == username
118 | assert username in TEST_USERNAMES
119 |
120 |
121 | def test_account_excluded_data(account):
122 | with pytest.raises(AttributeError):
123 | account._domain # noqa: WPS428, WPS437
124 |
--------------------------------------------------------------------------------