├── .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 | [![test](https://github.com/mimesis-lab/mimesis-factory/workflows/test/badge.svg?branch=master&event=push)](https://github.com/mimesis-lab/mimesis-factory/actions?query=workflow%3Atest) 9 | [![codecov](https://codecov.io/gh/mimesis-lab/mimesis-factory/branch/master/graph/badge.svg?token=WYTXPoQKPm)](https://codecov.io/gh/mimesis-lab/mimesis-factory) 10 | [![PyPI version](https://badge.fury.io/py/mimesis-factory.svg)](https://badge.fury.io/py/mimesis-factory) 11 | [![wemake-python-styleguide](https://img.shields.io/badge/style-wemake-000000.svg)](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 | --------------------------------------------------------------------------------