pax_global_header00006660000000000000000000000064137547002310014514gustar00rootroot0000000000000052 comment=8c3b7140d4c9dab4600cb30acd61430dbf29ca6b django-split-settings-1.1.0/000077500000000000000000000000001375470023100157445ustar00rootroot00000000000000django-split-settings-1.1.0/.editorconfig000066400000000000000000000004211375470023100204160ustar00rootroot00000000000000# Check http://editorconfig.org for more information # This is the main config file for this project: root = true [*] charset = utf-8 trim_trailing_whitespace = true end_of_line = lf indent_style = space insert_final_newline = true indent_size = 2 [*.py] indent_size = 4 django-split-settings-1.1.0/.github/000077500000000000000000000000001375470023100173045ustar00rootroot00000000000000django-split-settings-1.1.0/.github/FUNDING.yml000066400000000000000000000001311375470023100211140ustar00rootroot00000000000000# These are supported funding model platforms patreon: sobolevn github: wemake-services django-split-settings-1.1.0/.github/workflows/000077500000000000000000000000001375470023100213415ustar00rootroot00000000000000django-split-settings-1.1.0/.github/workflows/misspell.yml000066400000000000000000000006331375470023100237160ustar00rootroot00000000000000name: misspell on: workflow_dispatch: schedule: - cron: '0 0 * * *' jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: sobolevn/misspell-fixer-action@0.1.0 - uses: peter-evans/create-pull-request@v3 with: token: ${{ secrets.GITHUB_TOKEN }} commit-message: 'Fixes by misspell-fixer' title: 'Typos fix by misspell-fixer' django-split-settings-1.1.0/.github/workflows/test.yml000066400000000000000000000027121375470023100230450ustar00rootroot00000000000000name: test on: [push, pull_request, workflow_dispatch] jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: [3.6, 3.7, 3.8, 3.9] django-version: - 'Django~=1.11.0' - 'Django~=2.2.0' - 'Django~=3.0.0' - 'Django~=3.1.0' continue-on-error: [false] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install poetry run: | curl -sSL \ "https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py" | python - echo "${HOME}/.poetry/bin" >> $GITHUB_PATH - name: Set up cache uses: actions/cache@v1 with: path: .venv key: venv-${{ matrix.python-version }}-${{ hashFiles('poetry.lock') }} - name: Install dependencies run: | poetry config virtualenvs.in-project true poetry install poetry run pip install -U "${{ matrix.django-version }}" - name: Run tests run: | poetry run flake8 . poetry run mypy split_settings poetry run pytest poetry run doc8 -q docs poetry check poetry run pip check poetry run safety check --full-report - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 with: file: ./coverage.xml django-split-settings-1.1.0/.gitignore000066400000000000000000000025551375470023100177430ustar00rootroot00000000000000#### joe made this: https://goel.io/joe #####=== Python ===##### # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] .mypy_cache/ # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ lib/ .eggs/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .cache nosetests.xml coverage.xml # Translations *.mo *.pot # Django stuff: *.log # Sphinx documentation docs/_build/ # PyBuilder target/ #####=== OSX ===##### .DS_Store .AppleDouble .LSOverride # Icon must end with two \r Icon # Thumbnails ._* # Files that might appear on external disk .Spotlight-V100 .Trashes # Directories potentially created on remote AFP share .AppleDB .AppleDesktop Network Trash Folder Temporary Items .apdisk #####=== Windows ===##### # Windows image file caches Thumbs.db ehthumbs.db # Folder config file Desktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ # Windows Installer files *.cab *.msi *.msm *.msp # Windows shortcuts *.lnk #####=== Custom ===##### # Temporary files: *~ # IDEs: .idea/ # Test database: *.db django-split-settings-1.1.0/CHANGELOG.md000066400000000000000000000062261375470023100175630ustar00rootroot00000000000000# Version history We follow Semantic Version. ## 1.1.0 ### Features - Adds `python3.9` support - Adds `django3.1` support ### Misc - Moves to Github Actions ## 1.0.1 ### Bugfixes - Fixes that django's dev server was not catching split setting filechanges ## 1.0.0 Breaking changes: - Drops `python2` support - Drops `django2.0` support Improvements: - Moves to `poetry` - Adds `mypy` support - Adds `wemake-python-styleguide` support - Adds extra CI checks: `safety`, `doc8` - Adds `py.typed` file to package type information ## 0.3.1 Improvements: - Added support for django till to 2.2 version. ## 0.3.0 Improvements: - Added `Django==2.0` - Removed old versions of `Django` from test matrix - Removed `python3.4` from test matrix - Documentation updates - Adds more `flake8` plugins to enforce strict style Bugs: - Fixes Windows problems via [#21](https://github.com/sobolevn/django-split-settings/pull/21) ## 0.2.5 Improvements: - Added `python3.6` and `Django==1.11` - Fixed `tests/settings` structure with `basic/` folder - Added documentation, which is built with `Sphinx` - Updated `README.rst` with new logo - Updated `README.rst` with `docs` badge - Updated `CONTRIBUTING.rst` with new information Bugs: - Updated `README.rst` to be compatible with `PyPI` ## 0.2.4 - Changed the default Django version in the requirements from `>= 1.5.1` to `>= 1.5` - Added `setup.cfg` to support `python setup.py test` command - Refactored how the tests work - Added `tests/conftest.py` file with the fixtures, used fixtures widely - Changed all test to be functions instead of classes - Added new classifiers - Added `pytest-env` to read env variables from `setup.cfg` - Removed `run_coveralls.py`, added `after_success` section in `.travis.yml` - Changed the `README.rst` to be shorter ## 0.2.3 - Added `django@1.10` support - Now `include` function finds parent `globals()` scope automatically if not provided - Added protection against infinite recursion - Added tests for stackable settings definition. See `tests/settings/stacked/` - Added tests for the new functionality - Added tests for `django@1.10` in `tox` and `travis` - Removed `3.2` and `3.3` from `setup.py` since these versions were not tested anyway ## 0.2.2 - Now supporting `unicode` filenames, fixes [#9](https://github.com/sobolevn/django-split-settings/issues/9) - Tests structure is changed - Removed example - Changed how `MANIFEST.in` is defined ## 0.2.1 - Changed `optional` to be a function. - Added `test_tools.py`, achieved 100% in coverage. - Removed `setuptools-git` from `setup.py`, now `Manifest` is only way to provide `dist` sources. - Added `run_coveralls.py` to work on both `CI` and local tests. - Style fixes. ## 0.2.0 - Now `tox` is used for testing. - Added `coverage` information and badge. - Removed `pep8` utility, now using `pylint`. ## 0.1.3 - Python 3.5 support, Django 1.9 test-support, documentation updates. ## 0.1.2 - Fixed Python 3 compatibility. Fixed [#7](https://github.com/sobolevn/django-split-settings/issues/7). ## 0.1.1 - Fixed issue [#1](https://github.com/sobolevn/django-split-settings/issues/1): now works with Gunicorn, too ## 0.1.0 - Initial version django-split-settings-1.1.0/CONTRIBUTING.md000066400000000000000000000041121375470023100201730ustar00rootroot00000000000000# How to contribute ## Dependencies We use [poetry](https://github.com/sdispater/poetry) to manage the dependencies. To install them you would need to run `install` command: ```bash poetry install ``` To activate your `virtualenv` run `poetry shell`. ## Tests We use `pytest` and `flake8` for quality control. We also use `wemake_python_styleguide` itself to develop `wemake_python_styleguide`. To run all tests: ```bash pytest ``` To run linting: ```bash flake8 . ``` These steps are mandatory during the CI. ## Type checks We use `mypy` to run type checks on our code. To use it: ```bash mypy django_split_settings ``` This step is mandatory during the CI. ## Submitting your code We use [trunk based](https://trunkbaseddevelopment.com/) development (we also sometimes call it `wemake-git-flow`). What the point of this method? 1. We use protected `master` branch, so the only way to push your code is via pull request 2. We use issue branches: to implement a new feature or to fix a bug create a new branch named `issue-$TASKNUMBER` 3. Then create a pull request to `master` branch 4. We use `git tag`s to make releases, so we can track what has changed since the latest release So, this way we achieve an easy and scalable development process which frees us from merging hell and long-living branches. In this method, the latest version of the app is always in the `master` branch. ### Before submitting Before submitting your code please do the following steps: 1. Run `pytest` to make sure everything was working before 2. Add any changes you want 3. Add tests for the new changes 4. Edit documentation if you have changed something significant 5. Update `CHANGELOG.md` with a quick summary of your changes 6. Run `pytest` again to make sure it is still working 7. Run `mypy` to ensure that types are correct 8. Run `flake8` to ensure that style is correct ## Other help You can contribute by spreading a word about this library. It would also be a huge contribution to write a short article on how you are using this project. You can also share your best practices with us. django-split-settings-1.1.0/LICENSE000066400000000000000000000027771375470023100167660ustar00rootroot00000000000000Copyright (c) 2013, 2General Oy All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of django-split-settings nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. django-split-settings-1.1.0/README.md000066400000000000000000000072611375470023100172310ustar00rootroot00000000000000

django-split-settings logo

--- [![wemake.services](https://img.shields.io/badge/%20-wemake.services-green.svg?label=%20&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC%2FxhBQAAAAFzUkdCAK7OHOkAAAAbUExURQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP%2F%2F%2F5TvxDIAAAAIdFJOUwAjRA8xXANAL%2Bv0SAAAADNJREFUGNNjYCAIOJjRBdBFWMkVQeGzcHAwksJnAPPZGOGAASzPzAEHEGVsLExQwE7YswCb7AFZSF3bbAAAAABJRU5ErkJggg%3D%3D)](https://wemake.services) [![test](https://github.com/sobolevn/django-split-settings/workflows/test/badge.svg)](https://github.com/sobolevn/django-split-settings/actions?query=workflow%3Atest) [![codecov](https://codecov.io/gh/sobolevn/django-split-settings/branch/master/graph/badge.svg)](https://codecov.io/gh/sobolevn/django-split-settings) [![Docs](https://readthedocs.org/projects/django-split-settings/badge/?version=latest)](http://django-split-settings.readthedocs.io/en/latest/?badge=latest) [![Python Version](https://img.shields.io/pypi/pyversions/django-split-settings.svg)](https://pypi.org/project/django-split-settings/) [![wemake-python-styleguide](https://img.shields.io/badge/style-wemake-000000.svg)](https://github.com/wemake-services/wemake-python-styleguide) Organize Django settings into multiple files and directories. Easily override and modify settings. Use wildcards in settings file paths and mark settings files as optional. Read [this blog post](https://sobolevn.me/2017/04/managing-djangos-settings) for more information. Also, check this [example project](https://github.com/wemake-services/wemake-django-template). ## Requirements While this package will most likely work with the most versions of `django`, we [officially support](https://github.com/sobolevn/django-split-settings/blob/master/.travis.yml): - 1.11 - 2.2 - 3.0 - 3.1 This package has no dependencies itself. In case you need older `python` / `django` versions support, then consider using older versions of `django-split-settings`. ## Installation ```bash pip install django-split-settings ``` ## Usage Replace your existing `settings.py` with a list of components that make up your Django settings. Preferably create a settings package that contains all the files. Here's a minimal example: ```python from split_settings.tools import optional, include include( 'components/base.py', 'components/database.py', optional('local_settings.py') ) ``` In the example, the files `base.py` and `database.py` are included in that order from the subdirectory called `components/`. `local_settings.py` in the same directory is included if it exists. **Note:** The local context is passed on to each file, so each following file can access and modify the settings declared in the previous files. We also made an in-depth [tutorial](https://sobolevn.me/2017/04/managing-djangos-settings). ## Tips and tricks You can use wildcards in file paths: ```python include('components/my_app/*.py') ``` Note that files are included in the order that `glob` returns them, probably in the same order as what `ls -U` would list them. The files are NOT in alphabetical order. You can modify common settings in environment settings simply importing them ```python # local_settings.py from components.base import INSTALLED_APPS INSTALLED_APPS += ( 'raven.contrib.django.raven_compat', ) ``` ## Do you want to contribute? Read the [CONTRIBUTING.md](https://github.com/sobolevn/django-split-settings/blob/master/CONTRIBUTING.md) file. ## Version history See [CHANGELOG.md](https://github.com/sobolevn/django-split-settings/blob/master/CHANGELOG.md) file. django-split-settings-1.1.0/docs/000077500000000000000000000000001375470023100166745ustar00rootroot00000000000000django-split-settings-1.1.0/docs/Makefile000066400000000000000000000011521375470023100203330ustar00rootroot00000000000000# Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build SPHINXPROJ = django_split_settings SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)django-split-settings-1.1.0/docs/_static/000077500000000000000000000000001375470023100203225ustar00rootroot00000000000000django-split-settings-1.1.0/docs/_static/logo-black.png000066400000000000000000001566621375470023100230620ustar00rootroot00000000000000PNG  IHDRTdgAMA a cHRMz&u0`:pQ<bKGD pHYs+tIME :4Uz 8IDATxg`Նs$K^0.qL!@IB B$H:$PC`1`n˲ԥݝ{3wvvrmYO"$fӉFhvjĎFh4[tFh:Z5FhAh4]h4tFh:Z5FhAh4]h4tFh:Z5FhAh4]h4tFh:Z5FhAh4]h4tFh:Z5FhAh4]h4tFh:Z5FhAh4`h43kDL_@ehGFicwFCQMD,$"u_DaޘJ+1MXVdhAh(yEXJd*dkkQY3G5vk42]㎓FcS Mou5CM]`_W]:nhlD}}R4@}C'r^= K}GFiCk4e ?hJ&Q][TA2d t u=  c;b㊪*׫'bt8k4 6cHZ^lBh)a@QuToȼ DXVQT Le=򊕫p`Զ "zV]ig(6 #\S+?E#a5ND$}l~bUp2v~|qG〱c(dFFȵ;^k4@jMӷзzu0@umW=׷`F](> T޽h$jqhZG FӎxYDm'"jjn%+V/rm-.qX RJ@DHlv=??+~g9N#fېRsz->s=7_GX }&:'S?.Yʶs6Us.&3ݻveΌtM'Om9 "|w>gb Vl3SF*Y,'VS9qA7U-rCRrYi)O4f=M[ZcIBǞ~?^ "5+FP`23b1ΛϷ'<|mTVZJD<fw'?s.榦fmAM5LP3v',UsLcB lɔe2)O]չ`!ҎQ{Ǯuk:vgd2w`GR`!_$Yh3Z5e1^׻'UVXea'[}+RJ-|e]^/<ޟ?k43 2c`$ò`h < x]:WԻ;zwGyڹ3u)CRt**mYd AKA֭IxOJR)olFTb]M ֮_UjZTB՚\]Sד A-N?"#7vd8?q)/Ǎ[gk4@ CEGON?oF(86/q+ۊfbf<\-Y7 mc5y~X / yH;ⶍ٣C`aCЫGwKi f77176׮E˖c9g!._sm]=}BlƒH'FCw׭^5MD'i:$=ƫ֬W^ß}M*m,oDaP$ΜOġ2e16:Q{NZ7r|`͙c4.F5zѣomnvjMpӧ9sQv{ADi*hF9 =w#0: ?hr8|={*Waϓ6#Z#lǰdu]Կ^YJhZG Z/~s?8h5-D~ɵYOz互 !лg:p8H]#+L2 P;Z4{[|qY8.Z~6|/ںzAdYV8 UyoCD M|Ϡ?ƬkMYтD(hJ3\v%ZMa(تfha tT:ͱ=Ns 0C\,nbQDcϘMMx0qʧ\ *?r](jJyQ{m=2UոgG]|ęl2+=gsBqLg,t8GnzT"Y"_,=h)%f_ȯO|/3s.b)%, -i{RkθGߧ:u.)Fަ=0l*Z55qΕ'Ӿb۲JߘwEtx&38x}(5ұZ!oŪUS/2e,՜ࡊ<ƍ[~31]yDѡ;M{B f@Md.{^{tjQqض,8:pSa!@*̙|'A.yd++koS/ /L`D8(Jq>pO~Lg|cC!*q֬C%0Ms&i4[ouGF$"0oZl-bEW޳de H))א!te ?F J1dwlxJ; @A,FN˲PW߀?`1 V*lV}j7Lo=ܯ/K{5f!>}<𲊕Kk14j)+WI'йLzXʭ&]E60>`S'{pu`&I)\=x0jp6(xs̘>Ƶ 8h{=‡1,ٵf!rS&\޵+>wrJ`Cy7^Cg|"wR*ڻ.ۜ-u,v"B޽0kBZZ36M,Z|)k &ZwA QܶiɊ  qx`AmGS5kv9T4"AĢe9V:- Y,CJ;w킫/:~s4bWׁ|®bזeҨ=A&[#43\Maf4i]u5MS.TQ{ 6Ju{cs3zU|'JdfYOϞs,k+Z5Qe  *)-{?tQs5@ů]Gtw !*=vc=JJ0}*#"eYܔL҇}aѣHF"&hꌙ||WV&۟ZV)셋QΝu<]т%$RӷscƜ-K䁌0 xxsO?4|n*]vkӚ4 ;b/,XIK`0(P (X2`i_sS2Ǝ&YUof4 2 eEeOefzohƇy ѧQB f"_,u/_}uZA8B J{.U5?:FBwoIGt YD$وA/5M8hqd "</3<ܜLm[(7Nl͜7KJ:aߑ{S ]vt.C>1x|oy#ɌV¦!9ˆC_@;PxD$ Ю-! .*(GE>g.757iRGMf}ǑxZf̙˿}K+*u#g4{b7rk׻ݢ4|SDD6^t9ٶŞ"% >tMan6mʻw*V"x7_>t0z=aPNĈߝ iTBHH֫/9FUz^V?V̛iމb%lYf؞7rȵU< ᗮ%i^Eֽ 4 mkv$*IUk?v@fe]ރ=GN8~}z?dC^ξd4.HڳR_uy+.kKm{Kf9 4@]sf5  t-yME'lJsR"Psu'@rf" Z5;mkvΒa'Sxւ#~[k7|~=h¸|qcѽKO~3 0nRçwbqn9(" DʝjUyG_TsY?7'q< iXTtBpR 0b:QT}յ0D8l'Si9tw_}`kZxrO}c B Pݱ-;e3Aně>oH`56lYb/w]޵ nti'G[R׮lSk;9nRzO'W_d2:d$)E39N4LX uK1|tqP5WWh@ZE='D~!*j˳\ %_B.^Rns! .aݝS᷍G ;|6 $`w[y d}7y5tZN hfՎ♗_Em]ⶭВ qH)9њR@pN;㎉1YbL/˩W.dXE<#ѽ_4/n@:%ВoUWL ܞX9'3z:Qoт//Op<#ϓQUɲADlAM0v4k1jaa胨sM{C[JuG_kj`6T|ɭh LȽzu.UYqꩻ-d9+%f@kS.#wQQ7:k+~/~&˦z0La\N5UONsW&R7!rO:H/~zꑹXF݉޴_~=T] 4qՔ{׌v:RR"\ Ы{wHf7}NKv}ŮM+ ̎oik,cfg}6|ySZԃװsS IGB9dv%P1tN"s[<_式]σ/oꩲ6k+Z5y]l5i\aݔ{nr@u'O9N^}?0f.`_cg]%<;NoR+fX8Iccimn@; JL |*8c'L|υH'pRLN!`ɞ#w*ϟ廘5/< 0n i Rn۫VwωfG5ۍF2>-]ƖiBJpINingPͰO2on@깿]^,AB$Hx. .HF>`x% v%C ciXZv^~ư7fjqL Wagdv M!:w'9TP*B6ճgZDcOW3?}/⽇@tV!ݺg~gAqT6~~Af)sVѽ5;Z5ۅhej<[2Ӈ=8(UV:sN> D-Nnw,g~ҎI% aO :5k~&,kְ')KыOߡLX">}=$H Y 3@}M hnp:;?N4c2{ #xS^ CDG<Ͻ&$?^srٽ/k\S]3ǟ Y۱fy_ tǏMg|B&ֵٟkp_IjF)'!]=";H$œ=ÄrL,ZJd:I NXK? 2tW33AzLeθ KO2c!  +W-Fj 8n r^:f[X_] >Ui4т.odטldvf{l":WejIGt [A"ֺQyrڵo (@bĄD(.! pcuoz@f9 :_g 3Qs HB9Eߡdp&H5+eoph$}IUރ\CPsȀ?ܶ,f4"M{G fADhln?ɤXD[#Y5̌D~x (*,PܨuaJ [o Q]Xp%VqJ[Pf/H$9 [N60Ǥ[1|X Àץ'jMݺ-zT1l(!H9i B; !/x= 4tPejh R4$0jx+WZ֍`EDLp5mo4+ή)w="x{%7}yϙ2U-Q^}N?8YNE6E`m|)>Un9Fт^з=xopOD !ԴJ>9ɌqwPX[öu+X*k8*Rn bNrR6jׂ 3xa6b1pQIګUWdA~0Lx5sja3Uh;i`bV˒T(aY@ 8 RSmIa]M 6qRuns.4tvAM1{IM?EGLO pduUe,L2bϡCP(;o3E =2ȫZoGL1%@?7gpj1 A\D>lsѥ঒p?yAAM"ѱdptvLNfx1g@fzeN=ht\J', 00OdEڕvz14lk f.B>t~w_n{yu#"@> A8ѥVs$}`JŠvɌ+;m ';yla@٫?DaZj;uC@xSPSSu""Hj=nmZKG=>#Fq2- 4?bJƁ4;ƭz M'6;`*+-Ҋ Z0 #k e[Lk8㺟^@]:wIf3X-d}5AfI(9 OF%H0ܗ` 1g2 '_J ec9z 0~ qBd"_\1?%"n^w<{xf',`04̃O'sA޶[EM$ޝI4-H-;P-3=]&)NPsɣ$u+++;>@<ʻrL, RCa,v`)%w2huAٖYkHNyr7,M{ [_} fZβn=$~BJH2G'EĜB'BAE P A{>٣/NUZpa`H8)6z &kIMV>6~?1l(vۖ?%ö,Y5o>W9iWCɏ5ەH xzx֥ uЁߨLKVTpSs3LUlaW}Q\T/:TvU݊n[*DԹ;xTaYHxJի$ ӷ48 'E6 u隆3wD-s$HZGX¯&όc) b%ԬaoJ:H$ ɒ "O>:2:z~ŝhok1__(j4-FJ(лwUH; !PO>ztٹg#2Dn+z$Q < pҴ}(@,Lb2  n֣ [^0F=@zg62'Aj)r',MŒv"% &/P] 9lbO9GTmxH|d2!D8했.w8bYhZ5;e䋯a v++i}Mn B5U-N̓Oc6gE}}!!Q]jW{ d2=3%HP3UٴkVÛ;ƀ ڱzvsؖ>7hJ&1|n4nh/aQ IqvQFo2JKaH !L!4f=i ۹Fg6N<\o!+A6$`3.dJ+9 c-M\K[nK[g9@]'։S}!<$Kg\>nXzN触*ܮ vXG0~htMɬd<"ds101.;lZ5,k=xiy<} #9&7bOj=lQdxkoB0Z{#Z3"v8o?l$e1esCm9m@^˼rr{$0H}TT҅Ao&o4{N9ff۶X>\֤PxuL^2vKx Ϝ3յP硠 { #JF2+y ;Y7}DTR ,ųUk۴\{-,H>p-S#,a}bO0 ͞•ΔlkpѶܭF1,xh534 ,Z/]0||_HPZkmk-p\̞!ExRG.4b \8Ne[6~x M#=I,]f+FrtN=z3bMF@RM-ۼEH>|#9SY |1lt!NeFg />(YWl%˸ =@AA٦d| $\σzP ׃ώ _oJp8pBlk-D8wk1k+qĞCG.ў;bȟg?Fx~|3 y=+F`oϛƩCID]d\[#Wc Ɉ9D2?;EAY<"kF>=sI1ZæiFeK+L2l~gd )_N$i\3qck:Z5'@W״2&a!eеOTdy-I! f K3F4 N=z b?=nBQVz^˼b!r4\lS|)E=L7Rس};S\rJ?R͎3_6rW1,sɗR쌫̵wJS%u*(z^t[Xnl"۲4M2 CAxtR`p=uec3ME ,_榦B !{n!3ݓO`uDfiG<+u[%--s"YyXZ1t$@c'S. d,s섖3Ήi fmi/hJ6 n6E BD,+ze&ѯWmP{ɭd=r,u׊$vn DU|6%PL:b~%A--% ] A%@o+>}zih@Cc3@ʝ٩Ђi F^AŪ0MAiTtI)b۩\ %~t#YCYKvIo[6KZ+s77ke fNb t65mtMQ\zu0=[23öm @&~}ɵԋ`;8,/-Vb񛙛j7.YKf_B.̕eNcK)  ;I ]P.]8zo2ԜtPkѲ 9 3s<}t-,uԩ3BָlQ'^?ocnn Dz^|ʻwem)Y<^C}88k5bڵ:Mbc17vPQkwߒAI[ `v$OIEEAD޲-,s3,>Bzy8t`j8z@c2KaXH\zy_-sxoz.kg{wLCSAfϺ(Z-dM[k6튪{c*E;q]_UUrj,YQW`e\.q_f۲vn_"#=_$^Q9ٵl7+(V(5nenf'e!b1 P7~鴳%5G QboeaM\[_e++1b,X ,ŊUUGm]74“e0E~L2g;SWw.fOP33u:ӯQ1%-lVs~n LjnN㺭Fbk%MTz5WVUXl\UUXQq]u0,ӂa$qղ=,! nL(KH Kz<D\KAyF%ޥ'滸eBCZRՄHg\xff qyi2-NR]i[ke7ކdZ$i%D!,ӀeoDȾ&.$J3 >x.'$\/j-+ V) U]J f@뺐R"SQ ԽKb@^:h Bi+kMXr%!f|9-\@ vQ ^Οv ] 5@*6.T MM]&?X/i2̀|(dyui0 e}z^ݻ_Կwգ;& ]ӦhAl3 ‚0UBu2(#9Xbܾso]%g9cv{L$ c`2RJ<2K 0 @R*Tݻc0d@>?N(*(m Syh-mFDRnw͎N;UVy&v®#X汓/%+r\[yf Bm]Weӊ韰cZDQ˜?%_A+Z̷5q\sH$ ЭKY5BO TKx,N֭m)u;ۖ\1~;Uf0suZۀUv~$|-SJѴf!P\TvO,ч6^׮A_uT}7I` :M֢9+׬A:VU˼nדXı."+ U w"|eU{C@umVTBԳ~ѽ ;Rà]7:fW\T˲rokFiŪXуF_P3G`t๙׈n` ~[z|J8]M-eK?ݯ^{d_x-׎ VV檵`f`[ @MVeNӴ9SⶍƦ0[gg,TTUaye%wڅ 3mj[hSۚ jMpe@s`0:wwǀ!B^љ؛`ۂdj;'bA8 p!/ޢp*  fA=]T T^ͦad}~\XP}o4hZ5mNX IjݿϷ aPe^t9W3ޤn1gׁ2y b>˦z8bx$`Hw1XǟPc3iHc%k$dɒc'\DW$H~;ޜ/X4K6CJ̀a@ ':,{qv+q fӖ}Е-^:&3.:jQ״;k)Q: ! nF[yߛj-^% nN0wBuYm\'׬F?"s: װH3$b֓,}YHeD9==vRyIlwY]A0,_49oco}iXo8y$֯bu}cuu > ʉ g#7+&D`ւHs$ ÒQ޽;z@B]MP:UXP@̍pPKD9P$1>/b04fΝf&̸}uڵH=r2VHl@, w9I._odM0<@h\@׬\5ذ@*ϒLbK`9%{v'0I AlMe⃂dX[#72`rFot_g%"Y=qmn% ag,}@u 7-빀~b lcNK?fMz`OXCA=T a0xRv% G?ݭ?= tCe S-ܩp+ՀD`>qͨ&.Z+*)kfÇ4HsMC fSa!{ yDM$@jJ .^{saV9h``VZu?6ś}B%-IMyvejfB65D(b N%s`D֭U8/Nz$4b$gdst:h?tygׇn}; Őv~ =6FB.1l\F̤9̽pciXDR2[qԷ:ۉ@9tv|WbY#&#af:13SdyɷY0O(QSϕ?X2cH&(H$H<H; ݝv/ֹ}5uT;__@0tsFV2_N뫙Vo*doqO Iplt2/}~} ,뫫sV9^ps#$g !@]zrH8(/ Ģ ̂ y̩ͰՊѢoȞY'aIRWTT:A4.%݈j׃M w۞?nwY.tœ 24[#& <48 Ly=,M*Uz6ЙZ͟3iD "Y׿1)''Oݺt&A c5h1#@r\/~g]vEI,##d N5F7zى\45d[~-۲߅*@^:8yc&B$Nf5a03}'!gN;DdHȾ6_,[s( aq !9_W. ؑ__iXQA8/Yʿ_+_~ |\75;-v*SwcG^%0 u xgoH(aχlWb,$rs4փE&ܱD]&~{ƾ zIC80AU ׬ݟ >T.v%XAkX|19SaP0CX̣ς9j K`uN~apW`o<ցp\oMM9uWj 2M>kkoI~Ξ^5;-蚝uBGA" RS> SEဝ،ibyU ` 3AkKF\s;S=‹w"yU%[|?p:`ғDrCC`u,w)a$5Ad~dHUIY<<{}9}&O b rN$"bܫU5ajal/kv»~Ga)8e,eaxg&k3vtM´x7وԳd934zCrMROwi% ӂ5y1!ޏP!w 9o=ΤADo!4/ד3mKbta w6 86 j <$X "L5nl}磏L3|yY"H)9fۨolǟ{t5|UUz9f[4;vѵ q7Ӂ_{}ѹzG]A<ed{L`W`z.=Ct*s 3q,2BƸ21z5|%-2iRb ODr' P C8 w\< ǀ"<*™_x_Nd !ksWߢǓ4AB=/p(ds##$uNIYo)zdBRV윖UO0 Ȗap2`g_zB B"GeU}Q~p)'GKJ':YNт)ȵr9 < XnEz3mYf\i8È"3P#2@NWggHҰȭ^K=NBv=$3iTeR`-"]9bd|6ˉ~3)a0OydQCzki1tL'@|GF-8,T@QgXSgA\lЭZ!tp8W-bZ ?VNsfC?/^vLY@~k=gXJɦa0s+v?}#[8DFxh?QX2=PpH3ceg|v*q*$i%D #qaj~tNjKN3X R0ή3aҧϿ#'"OԍaQ=!zɯ̓n`=ĥe۩+=y)@S=R]ޚ 3L29د #zqVmwX6̢R6Ift1t 'c?P ]Fp} XnMud#@iHǁ8\s3crkT}}akyOU*Ky`n ĜNEA>5r:L)%xkd:c&R:"|`pa@ޙjK]тa 8p<5tNqb!PSWϏ?_ht jgD=bEd% d8̢Rĺ%*. w>6=+QFfﷰ=fNc"Zr'\a} Q\_w+,ݭs7 %85%n(J6F&px&A>hRJ?0G7|#bfVk!e2d)3dJK$,ٌ'`xQ~a_vRj:<N=6Y)lqr\ݺ#)hQlSkv*~W]Щ9_Θmp2;8딓T=z(e3[BGF~7 9 %Gk}Q7RG:N=k&ӂ9VECc ǧFAk ѣ/9M^:~ZdJ0d0\C3kn9L&[$#oTT saSIa=]#1nj &@8ibq^NơNmYtºu|eiT# [~=O1{Zǻf{4;Eد>iaX%.}9TZXs[skc0;L]o2x]p`K2K"Y7۪>#ZZ %~?}gy8-T,Lt"ċH6y$) $H! œ<_JA!d\fR,Rlx)e1CiLVEA1{k ["sX2l8I>A`1iXVρ5Y߽ KTh%Kw|=[y?~"~iI'`eJt]]fBY|jɧ\f lkU=Ys/k/PG,p9Qwp^9TbfsAC1VWgEb8Xwz$ힳ6IIؐ+/"C f٩XόP3UHOpMUv? ^ B Ž_b2(((-YAE:CPa PT1e s4'> kLp:mn,.Hb!|@ 1,kx b933E)g!8J1c1Շ(Yh)Z5;LB5R?9a⽆g^cGzY%P=ο GnbdϰBKk9 6c AT^Kf͜^6#j I~ Ba0He@ F, :((Ebb:@(%:0DPA HyT>W,`o"5k@Jo(k?; 0/bFF`ʞ+$.\Jc|Q#dfIۢϘF9hA״{p`SuM-~'_xM 08X0 WZ??O5l:%baWósE}-5ٖ:jr[8. #H=ZVZnl7Ar,Y,8'sKOPTP QT K`Njž5/,0LiL iml7Lž>m|Fb{ȴPU8ߨE"f~{ž.!"v\NGiZ5횬 עeq?̦aLL<L'_x }&E[<5!͌QK$z~mnx" ezfvLgKdl8BFĻY@}VM|}w :u,Xۜ&G'?QW;=gs"'`8a;!-Ȇ~Ϻ.~Xt%8a,K?Zf4H3l$_O~mGlf?B,?OF,-&# #Rv!$p,A%{If-ݯT[؂æٲ!Qؙ?-[I/~C;"4~:/j"'o.[v.=Nf*OA&b=OD w'<, %4)u]ohT:>$Add]򾗇u= 8{ġgX%oj4 -JN/._xMͬ&1rLNapu!2 ׷zeD}(~HC~&yUH?r#{3&3ٱLlH6xN>r;s>gigYDykX蠒8*f VbOԋs{ǸQq_WV⎿=0pB\ϣO3  )a"R JsE,0K|C0OAR]5q뭷޺wBQD|)п'Z1ۆyl,1v,O`avv>N$ 732S$4A.x:0@R()y)Dt^[pI"UE_B.wR Z Md]x'^,u/DM ĕ鶿ϯMcMW֬ωeY+/+;s?v Q2єL`%|QN Ru=ʻuō?zvfcvCVq# iv4^+湱"ZTJɦicϾO9ҧ-"oL};$Q]~_߅n`dA$aV{D9&S$l>EwA=;:/}0SG800BUҎC#7D5z3{iEVL>f|5ֱi0//U+-.ӿ{L}~4-D5킨h|7sɦaulMprEVů,d&jͽ#*hV !P;HBQ7{G̡JBZ|~yGyCJ-6.9L=w܉_HR< #k.FтiD-|] OK.,Hd%֭hZYtfq̶gwkT4+ni%}%.=rf2 jD8-Wi=gB>k0R6y2#h9b%n&ށ'T:?>d_RA"Io{:h%Fj"rMGnbY` 50u9 ѥErTvt)'몉A* apҰ uH +̡b/i ^"%jZiv~o.;u-qȍ x8b(+-ٔFx6E[={cFb)RJ-?N~l V,1SߓғN`f _9pI@8i[恘w4\Q%t/ .KUWKaz5+]1G1WA ]u/Q{ 'u9HlZε74鑧{~L)f1)qoI`rDQba, .sfp0XJH7@)J7Уj4>8,TO=?'56kZ ]nȈ:HJ%ŸG׮pp toTN!33`OY(%3@t7'SÎr[}Ȕ_!}> zlܝ~"Zƨ{0[8R4~tǵWQYi d$n\ӑтiF/:,[#E_ %3-iZ:n`hدTIɲ'&~g_y Ox }1π礇>~h_cnnzh1BhA״K$2᚟^D^az W98, g|"=~L]ʔr#>[N;T=h,UTo$UY zrϭ9<=hCǓ|- ,"!Uq*2<Ϸ"]ٙ.wM%c3f'MF"p]oz)xYqF_gԃ*.E*=*[<({.l=?! 3O:+L1NڢFӡ-tM%Ϳ_qOh#)L":<(kJ[Y_}O?N9h,#b>|Cw>Rt4Z]&W_|NRxoΠe̕'&zwn ^K鍉~5ff2 Ba޼3M^{?gB'iv5k=*Q]|!zt Hu8 !x?M\3*-ՅH130v4=zt)NJ"ORJ*'rU]w_;[-7~J#]a#1xnz z!-_A]3ΉX,?QA;XlyLmi4; Z5Չ+*?]vΏ{,)NA螛G3RYJ`CQyZo ~q8_K\Ay)7ᳯ?"]r38*տNqĀ*Pc#"Ys~kleY h $3l Ͽnthvt ]SscsO?L A ~#hGlW0If޵ 7ҞCv$]1ۆTCPc1TT~~ÏqчDX @0 Y8[濵Hroe[/ъ!ᇟzo?I$qb?/ g ?Ao"5)%Lä_z?_hslkv "4;u~ TV-GȦ$‚\y94tսE9qtCRJ2M%5[uЁ~GY ߲l¡dfGM;.3Xl9_-4mkvrE;Zݖ\u4N~x{Grh/*" "$XW]-iu~zIq  Gp""T gWޝW{VKm[aBkB.93"7ٖI3Gy_sU41R7tXkv:87c}[l'`Æҝ] .m[P dy߆1@f,Њ冘}w=s۔ nX]f &OϽNl0&勇DPgf_~ ~0vVrMG Fr=J,]*6 ; rcⲍM[NpZpax#^Θ>s-d* 0(V9чsg!l֮|F‚DtvMC FEuXW]ʲ÷ O \q(¾3\9#u 82=IT^3-}~%+Vrm]LӄelHZϝKfFqAD0M#jwc9wQUHhAh6 PEU4TIz3ciY6ok-V5,]GS2ʪ<R|`!f͞`iJN;iH)aY$av{IˑJaF5Ŝ C9[$g⑧áC>}.Fs]v "|טx ۶Q!ĆjJB{ΛBQo g &&hW#<϶iwߚoilJy`> }MA FTv{*ۓ&#J!FbV@Yy-Vt m[aA&yp\ٛۄ}=σ'%\E̶1__7bO1LgzN9o V /TT&q"<0 A$OJ>馟_-ӢphAhZ!:Wf4 e%B̚kuy3h[}Cؒdi0@4v0~h{ mPӠ~=3A~f%tUkYs8f: odY0K:up]~zsMC FTS/Pj55r c9lmeNp^CeAb6tDF#~FaЭK;rqcG5ӝ^+WiXJ<ԜL= ?)s!ц8ã]8պ4sraܷHe"ȿK?pt  Xz*awP.eY@uCxn掮=`՗Ʀ-}PO ~G$rQtfݪѴsk4g0}L=Mlu 8DMxE.Ud`"y!">c@=M$q mDV gɵ7u&}άx>ch c20Qޭ_uyti'SA<)$>b2hAho8 L3&'Wm8).O/vڻ];:mϛEunȱķT8sDD}&-\ yUmd&(ȑte?mk1 hAhZ@Ϧ J`'hMjwlm9I2:oSݳp= rӃ>d}{=ѫGpjvk4>Z5<(Ab|ٹgщG{|9s&lۂ!s ]Ͳ׉[kQjt[n7pnuqj /|#WD,oo~SLgbhk4yt#"~{gN>(=cշ0u kmlĔU#kƆ69}WCeKcm$vúj-Ld-~-b2-;̭7s$o)"Himdg句h1hт!'ӥSQ!ġt/_SX 08f L)v;Wj+="vU|Mjk4hAh6JzZXJeY8t}axwa ,ӄ0 "l.՘Ҁ L[#P~]Mdnۤ8FhAh6h6;3wa4z=p֩'+L^,9orxJXZ O$/NR2;ۨ]l9Z5Dz1T/?g ޜ4/>֭K-[Z;\ ZSt9ܰOmVJ тѴ7k4[H#DtO}$1}{eYD7ڌ,w: @e,;Pbݺ[YJKQVZR"$Zz!6h6Fdf3;qc%E b`Y65"NRB/#&t3c~D9 # z yYe%v xx  Fn8.4|hQhBhvͲJJA8@s=PJV׭[Yhavxf٫|D s(P?5"!A.FFZ̙^1ճԒ=S̀<p.YO=:x_$pGhZ5vdV5Mewk!Q8k4-M{@%E9GzI βwi4tFh:bWh4fG]h4tFh:Z5FhAh4]h4tFh:Z5FhAh4yGQmq;3۳M!!RA,(`/޻Ob{WTY(*IB'lߙǔ&b;{=v-X` t ,X`,X`B%-X`K[` @` ,n ,4X݂ ,Xh ,X` t ,X`,X`B%-X`K[` @` ,n ,4X݂ ,Xh8ؠ( ($|f¿ fWYQQECͳ( 7k. teYYOgJQ̼,#IV<GE-g;W[[aPj|bGP&Sg %elݹf9٤|IBެJ@+A6mF&9Rހa))+S6 `mrn?x˯\B!tO9;îdm7q)2h4$zc^>p$B׎xЦUXѰ {W7.yIYr5yYq\l޾.sTC-X'aׅfnݹ{7Wu?wKkn:оujʱZ凭P ˊ@vC}޿+wYRSRL6|>xۚà ZYpHKv ͎Qf+֬c<  ](qq\Ǒ=7qY6X(vC`aaoׅ.C(ȲLڶyAaXF$(3&NH$BSp6 (#^v.q9(("b1DQݤP ^_=<;m݆,:e@s,Iz1m\^/zuI`(%7]a7acLOzkr5qҲ2ܟW{Zym&N?5Yb|Xzt,+HR e3x]XG\BfM@7AEL|<15̧Ivw-[X?uOn^#/ef͖pToGm^s;z6l˜pv'URKK8KK 0prf-\5/C4[ѷO/N8-^F$ޘl>DIbWA_%ۺ m 8y8XƽϸϾdm6oȤ|\piչb||pqsUt.APᗩ0=>{q:q3k}zyNM_N<?HqYj `$TA #jޔe(;w>!g=:`lߵ I Kx%N/Yc/ʴ'KPt'4Hyټ}G>h{QhÈWlj}>T/h U''ilRTR£/?D~A! ڧ3͚4#g9g*Z E?MQI)2~7Y{H)30wzdo5𥦐Kvcy'y<8f/\(x=2*VL6|YVXlï['-i/iPd(~3tu4u:T/i~[f W>K[Um?koKIMIt \ִ`$,Y8SF<%3fq#OjF<ǛףN\xZ?8+֮g7|kH2 ?V{fe.R<$I;ʕ7oC0|?~m:luϛogoI;U,B?6-pn)'jy Yn Ñ(%XkGE ];t u$>)Vn Nv;)~_*_3Wu?P׋Bw4]>FȘ{/!4 MX1nyK%SLH #()+g_b?ͱdeIEq\ Ds;8Xl9i>~A TdQ2 E%|2|XENV#:te;.S}6ɜvl6[)_e{5q-u 1H$7S~;C ) uLwynd;C9c q+,iVμn'+3ӐPP( F\"+8v6fⴙ\~ݔWPu/W-'ٍ7Y|%m v)+ !t:UeݭZ*:mO.lژ`!=$e+I"%eedesһ{WrQRVU>o6|Z6mrի3t8ьNcQgge20tlOjJ p6ïSel$Ɇ$}ym Oۖ-FV)|<+׭qv6E%%ȲBfMDQmjr92HFL1jK҇/Sy7 D8t҉tl fc뎝6{.&B fޗ`3C0&N{TOxEQ(+ufP:ibZ%ˈDxSReƍ2p#ny#gn7lG_O 3#X s怓 h|/YFAQ,kpű?$&w#r'`؈q]\rw m7C$ p_4u7bQ[yݻҮUKziߺ%i>; 5 ,ˤxd7j0ΟZw$QE&#R^"(22y }s͕ ʾ傥STLzEA vF;/{tA 2s6O}=Y\|PX wqm%"n}c)4]l޾{w}*a  mL$I!WfR\0&'xFj:P)h}t嫰+Vq/`{WFrz^|v'PTtO_4E)C֥Z;{_~7Ń zW{РỲcO2 rQ)G/=CiiJII&K7oӍJqxW{{"PIkEAJ~=Q;w MQ7TZ4m墬"[x/q8qt̜O0b1GIxz2⼳),.a¤)Gd@7ο8OU7$IHQ~tZdt8ffifンrLU0CŰظy+=2~1ɳ,䖑#֚L]N|eƿ2];V̽mZۯrڥ#Yt9)Q\k >f 櫝1O%ws'97>~aLU%b1|^ƾ1ÆA >d9ɜBc뎝Z~;cRn,^]; r%I"Ml*HOCJ mTˠ6Q)*LUJQ+*ANG5~ҡ=o<I#'L¯SE(c|75e&U`UkZ >|Ϥ|xitE3GSa~۱I*p ( Tvop8LӜ|ҳ9t]ytnߖ{~P,ԘsrF6n7}Ii/1ɈkFk/u=m۹ ph4JƍvH'‘HCF?C0>;wt5LՍ\?nޒ$Q\Z9 4y43 G"dg1;ʓq}W~%5zL( t؁H$moplDj@ɳ݅45AOjd.kSƌ1Ϛ !"oq:iwb)[Ut&IIfK2~=ѩ?պ CcYyw)C$El6AzgC2RVQ&;FX̨gD|[5ۢ@)L\.̚C~5?H7ߣ|,7(p$yU:25`][yR )YVNo'#'Q^u<S'FƸgDQ5Cߧ|~Y8c Joc<dZc`(DNx[q׌*#lFK=sBiYyN-;v_pji}z.Tx>  ]v)du kA+u'!w)*.n?0wNnݼ9MX1n!#O&@,#3=oUC^;u,1ڗ2c6`(ʵՠA  ҡMk f7m68{tģS~ŗt Fxjj9`Ү-^zF/FnFR~\#]NC4c&]vjR|W|>5pIQ жe u>Ц5^>] ~5APbq-'EQ$ ӡmkhJsI2کJsF4pprmwvKY t<@Jm2ԷdXQ1=5kp Am+2Z\4̤͆` 8hzwj()zNo} H<ʪUAMSTáPߺc'[E&KQ&w#O}ƹRKyIjPSaޒe^‘nuq]thӚM޽hcFO'̶@8uNu(e֤0T_-[&<~SB(jTg`(Ii|ܡM+|^oBzW2ڬۘgM5sc՜+otОvZY]ֈN6]I~qx?;'=:CvN4+.:".HQئ5^'R2&n]?>V͟^)_g%o6#7)ZPwMP^]pj*5N90HW$**4T7ufKmؼ9)ЧGoh$-[0oRhS ioYHJZە$A!R;8>Gn oP($.F,f<ֻҮ- s۴*Ou ? NsuYNcZh]p8Ԥ=EТiֹRH->&՗3yl/YA* nŖm;x&>-Ms0 ĠN@jw".Jqa)La (X-eQD,Z7ɡMj<hiԢ4`{HAQQ8&Ոƍ2}h֗4FPJKڱ=w=O?GߏfCe2~"(g3HMI·0xI r5J(+,SZ^+v}a޸E7E-6Ք?;$D~NUsS][KS6sbMIR(*)MK*@vffh $++bE`,mvjۆ"R)5^"Qй}[Πg^ 8[}vqqH5UsYbo}%.7]g: {Ƿ-cpxJ4?Q\z BF 9c/s]3y,$I] .npKQI)_3_43I%%'w=?y 꺰k~]UG,PgAZ*UsLJWg f]~^H[Anڤ };Ay7)*.Vv2c^ycv]fܱLnuAQ%70o܅nWKE* %Ze*6cFʟziLooCIYl(m}OqiY,,'Mf A w'#$ކwpaG_Y1Oq6051F"RC`eM͂1 s0u]韅n=#V%u7D<il||0[,]NaI 6IrwU{Κ)_7rDDQ5NL~P8QYϱ#rj[ LWEZQ_vLO!, 7R5 Oj_CAD_S߫T1j$,})Sfb8(M j ﺟw7$Zc`?hzfzZB@l޾7ohvKE݆#z%S1G"~q\x֙o^Z+ow674zgIS\5jɪ5 '.tXlf7ʬsm.g 4%U{zIB-2IAPChH2<'Gs3_32q f/չ ))FtNV}:uFՙ6o1]7\ H TS,xn<.id0%sCeJb^LE.;g8vXo0$:=:w"7 xn~=m;wa*Vks쁞~2I'_NV޴Uy}z=k=GZU=q9>#|sڭUj ovnXvf%>g/X qM4Jŧ@YE9Vc?ҲyS6KRw%U2=}NyDX,nX0v;kr7֧_ia 2xIVH$fh pR{4AQYH@0X$I<_6iQ]6mNsX»2 8HW !QXPjEE֘}zi-,.1 4p$B7__UT\@$%_ayb:֋vXFQq1ֻز};. g4ABQzVyeF\ֿ̑*P_p t33 rTvXKo5օY'0a/}gii %=+, ^1Hԛr6s/bیjx9M}2|~ :f_Z4&Yf7>}Ibn\9\TWKjs*%(慹qV.vKKᲊڝSO8ןΞ˱g_ȯB\4(߾Tq*UP$%P8T&Nwݯⴱ4,ZoK ҞF4nghAX-\Nj֮ƴ͎݀Vͭ VrԲӺT.vkA!6`9`]Q}pڷnE b |_v/{;v"j4=ma2xnH)n`~OxZkT0ԕ ,j`3x6n:r|^/ͤn򯔕W$FY!#w? GX_wR/*=O&n%/=8clپC *a.Rr+9/c|))L6A]I\+F1~)]ǭViڱ}$z2?{wy.:現XbԵ] x9YnzݢiC W! ?%VsΨ~L68+֮~VF=]deѪyS@7PO .e¤)1DXaO}A]ުr¿Mq-"3x\(yUsّ56g_rk2/uƼ<;;{8~1y[L+C|¸[fdY.jw= =d` M{RjJ />g_}=,3\1?";w֧_4&L¨H¨QF %vX.{~lݱ?VQyz!r0sBv!7o3&Ma0rC?|dedwŌ.@۟xλS.F^ˠWss-wiVvi~7m]T}}%%Jyp' |Fv ~axS"(T/o`upH6moP8–;Xv=H4@0HV-ٲ}~:ExXsxo&ϜMχ"I1[8QލT*AmcXˍn'1D*"?p"C$bm.cUdܕϕYynM17^mSKϺ X>Wbߘ4c];''+K0`YUSTDӯOoYqx ҵc{oOV-y,^)3Ϫ(!=D N%j@~_*,C5kA(ujx]ر+DZG{L,sd#?릫~S~3`9(#-R5n =j`x\&q/֧_PX\l]NnDF).-rqU0y,#45uF|+\p,\tAHeZ͂e(!"(zw*dOL$RԼR_̴4dYfJW_{ҡ=tџb J*5W2q ^rrT^ّϦPP-)NCISaݺKvRP4 !yO(tH܉f#3=w3NӾ\=3-%UVz(+`L1(~&U7P[wѼINBQ<'՛ȅ7ʬ*Tn%Z(#(T  }ť\0tuΫRw8o(̜K4Л⡴RvMgSX\/p|9__ƂIԺZɶ% /ɴ},52J֓KB͹gXT5)\-H@n:p+o Jbrߧƃ Faq1))di7C.YK''))851DnܸhwOF2ktqڷnď̓OҲr2t?idq9)-+ˇǸ1OrRҮr$ Qطօ_z4b6tگ4o~_*swv,j,mV &U^_TLmT Pvq S;G_Q$'N$OM{xS>y׸ /UsUQչnݼ?~.xEEj>SH(#M ]I0|xȲLaq 53ͧA(.-99xzWͣƔ=+ITWOye $~ASUyr9ԁtjۆTo 6It,19W{_}Gdt^kC>ɑzRZ^'Hx*I[~?x2KK6t>~qqr'td&|;qVi/T4N<(2SRPU!O |q0xqL1-;v'+ i>/=٧ .B%vPVVN<.(-/762HP8LC(kZާEaCVYKv<XOy ,˸N4Ʈ2G]ٓPJ@k_ 壯cٸu+{+3 jNV]:g'sH7WvAܾ_"s-'2{"6nJaqV}N0~geӳkg ĥ眅niYD#y0x/Xt9;w֮ :4mܘ#zvsr .}F"H5^H. >TT˒R(P4/-h&ɲgN/+VAHzV͛1⼡\=Z\qw]{5sLMcMv6w<7ZľG2th:a5Gkvwsg L; PRZ 8G:!'z- Wm?hת%o~9n3YQHڱy:u; 2On83/Tniv6g?/.B7E)xR?,)"':dEbkAeJJC6eUTT{<7Xv;y:y:SVEded$5 SRV uE/2.VL}:L1?Mdl޶J~,Nۙl Ah.XbjrafI t$+mZѱmc56&|ӲiZh@XyZ]vj͜h,37+֭'o6B6Dvf&[SڨoThqW.$lmۺ-aZI=roc6thOb:MFG ?>âR>g60i$\+`h yylٱ=EbqRvDp:dgfЪys:ie%&[~W?4z#`qi)_C7mF-lߕO$!Ivm[vׁ~ DM۹X╫+seɡ]1ìz4xH,:oRmDYE6-ӭSGvd̾J]ϧIzi٤ ۴6r jWU>-` G",YZ(hk&پVA\m(1M٥s"K LUɊZ]+0|q*/CVS̱*7oeG~> 9ʢMflR˚_8N¥~pڣu-XN:ߔg.gx1Q*6 Yg5qn\4ᰳ|:\8V;q:L#:imhu 5A6wջ'~F]ǚ _}0 z* ~V_U2W-\O}coޛfFIg>1_7C!zeX_ga%rB#]Iصǽk|P= =d97|J'hoG /#`r'Mςe˙9!aƱI6v25T֛ogoՈ yq,)N.i٬)n`(ڍx) ,GA1M߳~V~؏d}/۬@2k.̚K׎jI۩,^9 oڡM$*A4;oUI tD#"D~A>P've* z@N8z,Ew?vZҳpdef 8m?MnʯpS<ҖN=\q<~-,X`8 DQb8iTdEau^`˥ְ%eed|ڵjii@TYE~1v˅4f]x]aݻW[>ї^d{qV\z?% h)MO5Ҡu:Os} i} ,TBgedū/+3qL.ǃ &NˣPh,ƱG᥇kXaBC9;[v줠(aY5l {33j[xa% |}&Naɪ5! bs=Uf 8hB:whI,XȶQzu—Čy 1oln^U"qt^\|.:I? sn炥i,[ 9Ԟ.|ZZêuU($BѹvQFA*e]љ0f/XZP(% [Rr,XP=%R0x*YKn+ 22ܡ=t!
  • Star
  • Issue
  • django-split-settings-1.1.0/docs/_templates/github.html000066400000000000000000000030771375470023100232100ustar00rootroot00000000000000 django-split-settings-1.1.0/docs/_templates/moreinfo.html000066400000000000000000000007021375470023100235340ustar00rootroot00000000000000

    Links

    django-split-settings-1.1.0/docs/api.rst000066400000000000000000000001441375470023100201760ustar00rootroot00000000000000API === .. automodule:: split_settings.tools :members: .. autoclass:: _Optional :members: django-split-settings-1.1.0/docs/changelog.rst000066400000000000000000000000401375470023100213470ustar00rootroot00000000000000 .. mdinclude:: ../CHANGELOG.md django-split-settings-1.1.0/docs/conf.py000066400000000000000000000074131375470023100202000ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Configuration file for the Sphinx documentation builder. # # This file does only contain a selection of the most common options. For a # full list see the documentation: # http://www.sphinx-doc.org/en/master/config # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. import os import sys import tomlkit sys.path.insert(0, os.path.abspath('..')) # -- Project information ----------------------------------------------------- def _get_project_meta(): with open('../pyproject.toml') as pyproject: file_contents = pyproject.read() return tomlkit.parse(file_contents)['tool']['poetry'] pkg_meta = _get_project_meta() project = str(pkg_meta['name']) copyright = '2013, 2General Oy' # noqa: WPS125 author = 'Nikita Sobolev' # The short X.Y version version = str(pkg_meta['version']) # The full version, including alpha/beta/rc tags release = version # -- General configuration --------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. needs_sphinx = '3.2' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.viewcode', 'sphinx.ext.autosummary', # Used to write beautiful docstrings: 'sphinx.ext.napoleon', # Used to include .md files: 'm2r2', # Used to insert typehints into the final docs: 'sphinx_autodoc_typehints', ] autoclass_content = 'class' autodoc_member_order = 'bysource' # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: source_suffix = ['.rst', '.md'] # The master toctree document. master_doc = 'index' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = None # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path . exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' add_module_names = False # Set `typing.TYPE_CHECKING` to `True`: # https://pypi.org/project/sphinx-autodoc-typehints/ set_type_checking_flag = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'alabaster' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # Custom sidebar templates, must be a dictionary that maps document names # to template names. # # This is required for the alabaster theme # refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars html_sidebars = { '**': [ 'about.html', 'navigation.html', 'badges.html', 'moreinfo.html', 'github.html', 'searchbox.html', ], } django-split-settings-1.1.0/docs/index.rst000066400000000000000000000001511375470023100205320ustar00rootroot00000000000000.. mdinclude:: ../README.md API Reference ============= .. toctree:: :maxdepth: 2 api changelog django-split-settings-1.1.0/docs/requirements.txt000066400000000000000000000002541375470023100221610ustar00rootroot00000000000000# This file is used to setup env # to generate documentation. sphinx==3.2.1 sphinx_autodoc_typehints==1.11.1 recommonmark==0.6.0 m2r2==0.2.5 tomlkit==0.7.0 docutils==0.14 django-split-settings-1.1.0/poetry.lock000066400000000000000000002147661375470023100201600ustar00rootroot00000000000000[[package]] name = "alabaster" version = "0.7.12" description = "A configurable sidebar-enabled Sphinx theme" category = "dev" optional = false python-versions = "*" [[package]] name = "asgiref" version = "3.3.1" description = "ASGI specs, helper code, and adapters" category = "dev" optional = false python-versions = ">=3.5" [package.extras] tests = ["pytest", "pytest-asyncio"] [[package]] name = "astor" version = "0.8.1" description = "Read/rewrite/write Python ASTs" category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" [[package]] name = "atomicwrites" version = "1.4.0" description = "Atomic file writes." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "attrs" version = "20.3.0" description = "Classes Without Boilerplate" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.extras] dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] docs = ["furo", "sphinx", "zope.interface"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] [[package]] name = "babel" version = "2.9.0" description = "Internationalization utilities" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.dependencies] pytz = ">=2015.7" [[package]] name = "bandit" version = "1.6.2" description = "Security oriented static analyser for python code." category = "dev" optional = false python-versions = "*" [package.dependencies] colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} GitPython = ">=1.0.1" PyYAML = ">=3.13" six = ">=1.10.0" stevedore = ">=1.20.0" [[package]] name = "certifi" version = "2020.11.8" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false python-versions = "*" [[package]] name = "chardet" version = "3.0.4" description = "Universal encoding detector for Python 2 and 3" category = "dev" optional = false python-versions = "*" [[package]] name = "click" version = "7.1.2" description = "Composable command line interface toolkit" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "colorama" version = "0.4.4" description = "Cross-platform colored terminal text." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "coverage" version = "5.3" description = "Code coverage measurement for Python" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] toml = ["toml"] [[package]] name = "darglint" version = "1.5.5" description = "A utility for ensuring Google-style docstrings stay up to date with the source code." category = "dev" optional = false python-versions = ">=3.5,<4.0" [[package]] name = "dictdiffer" version = "0.8.1" description = "Dictdiffer is a library that helps you to diff and patch dictionaries." category = "dev" optional = false python-versions = "*" [package.extras] 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)"] docs = ["Sphinx (>=1.4.4)", "sphinx-rtd-theme (>=0.1.9)"] numpy = ["numpy (>=1.11.0)"] 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)"] [[package]] name = "django" version = "3.1.3" description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] asgiref = ">=3.2.10,<4" pytz = "*" sqlparse = ">=0.2.2" [package.extras] argon2 = ["argon2-cffi (>=16.1.0)"] bcrypt = ["bcrypt"] [[package]] name = "doc8" version = "0.8.1" description = "Style checker for Sphinx (or other) RST documentation" category = "dev" optional = false python-versions = "*" [package.dependencies] chardet = "*" docutils = "*" Pygments = "*" restructuredtext-lint = ">=0.7" six = "*" stevedore = "*" [[package]] name = "docutils" version = "0.16" description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "dparse" version = "0.5.1" description = "A parser for Python dependency files" category = "dev" optional = false python-versions = ">=3.5" [package.dependencies] packaging = "*" pyyaml = "*" toml = "*" [package.extras] pipenv = ["pipenv"] [[package]] name = "eradicate" version = "1.0" description = "Removes commented-out code." category = "dev" optional = false python-versions = "*" [[package]] name = "flake8" version = "3.8.4" description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" [package.dependencies] importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.6.0a1,<2.7.0" pyflakes = ">=2.2.0,<2.3.0" [[package]] name = "flake8-bandit" version = "2.1.2" description = "Automated security testing with bandit and flake8." category = "dev" optional = false python-versions = "*" [package.dependencies] bandit = "*" flake8 = "*" flake8-polyfill = "*" pycodestyle = "*" [[package]] name = "flake8-broken-line" version = "0.2.1" description = "Flake8 plugin to forbid backslashes for line breaks" category = "dev" optional = false python-versions = ">=3.6,<4.0" [package.dependencies] flake8 = ">=3.5,<4.0" [[package]] name = "flake8-bugbear" version = "19.8.0" description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." category = "dev" optional = false python-versions = ">=3.5" [package.dependencies] attrs = "*" flake8 = ">=3.0.0" [[package]] name = "flake8-commas" version = "2.0.0" description = "Flake8 lint for trailing commas." category = "dev" optional = false python-versions = "*" [package.dependencies] flake8 = ">=2,<4.0.0" [[package]] name = "flake8-comprehensions" version = "3.3.0" description = "A flake8 plugin to help you write better list/set/dict comprehensions." category = "dev" optional = false python-versions = ">=3.5" [package.dependencies] flake8 = ">=3.0,<3.2.0 || >3.2.0,<4" importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "flake8-debugger" version = "3.2.1" description = "ipdb/pdb statement checker plugin for flake8" category = "dev" optional = false python-versions = "*" [package.dependencies] flake8 = ">=1.5" pycodestyle = "*" [[package]] name = "flake8-docstrings" version = "1.5.0" description = "Extension for flake8 which uses pydocstyle to check docstrings" category = "dev" optional = false python-versions = "*" [package.dependencies] flake8 = ">=3" pydocstyle = ">=2.1" [[package]] name = "flake8-eradicate" version = "0.3.0" description = "Flake8 plugin to find commented out code" category = "dev" optional = false python-versions = ">=3.6,<4.0" [package.dependencies] attrs = "*" eradicate = ">=1.0,<2.0" flake8 = ">=3.5,<4.0" [[package]] name = "flake8-isort" version = "3.0.1" description = "flake8 plugin that integrates isort ." category = "dev" optional = false python-versions = "*" [package.dependencies] flake8 = ">=3.2.1,<4" isort = {version = ">=4.3.5,<5", extras = ["pyproject"]} testfixtures = ">=6.8.0,<7" [package.extras] test = ["pytest (>=4.0.2,<6)"] [[package]] name = "flake8-plugin-utils" version = "1.3.1" description = "The package provides base classes and utils for flake8 plugin writing" category = "dev" optional = false python-versions = ">=3.6,<4.0" [[package]] name = "flake8-polyfill" version = "1.0.2" description = "Polyfill package for Flake8 plugins" category = "dev" optional = false python-versions = "*" [package.dependencies] flake8 = "*" [[package]] name = "flake8-pytest-style" version = "1.3.0" description = "A flake8 plugin checking common style issues or inconsistencies with pytest-based tests." category = "dev" optional = false python-versions = ">=3.6,<4.0" [package.dependencies] flake8-plugin-utils = ">=1.3.1,<2.0.0" [[package]] name = "flake8-quotes" version = "2.1.2" description = "Flake8 lint for quotes." category = "dev" optional = false python-versions = "*" [package.dependencies] flake8 = "*" [[package]] name = "flake8-rst-docstrings" version = "0.0.12" description = "Python docstring reStructuredText (RST) validator" category = "dev" optional = false python-versions = "*" [package.dependencies] flake8 = ">=3.0.0" restructuredtext_lint = "*" [[package]] name = "flake8-string-format" version = "0.2.3" description = "string format checker, plugin for flake8" category = "dev" optional = false python-versions = "*" [package.dependencies] flake8 = "*" [[package]] name = "gitdb" version = "4.0.5" description = "Git Object Database" category = "dev" optional = false python-versions = ">=3.4" [package.dependencies] smmap = ">=3.0.1,<4" [[package]] name = "gitpython" version = "3.1.11" description = "Python Git Library" category = "dev" optional = false python-versions = ">=3.4" [package.dependencies] gitdb = ">=4.0.1,<5" [[package]] name = "identify" version = "1.5.9" description = "File identification library for Python" category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" [package.extras] license = ["editdistance"] [[package]] name = "idna" version = "2.10" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "imagesize" version = "1.2.0" description = "Getting image size from png/jpeg/jpeg2000/gif file" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" version = "2.0.0" description = "Read metadata from Python packages" category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [package.dependencies] zipp = ">=0.5" [package.extras] docs = ["sphinx", "rst.linker"] testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" version = "1.1.1" description = "iniconfig: brain-dead simple config-ini parsing" category = "dev" optional = false python-versions = "*" [[package]] name = "isort" version = "4.3.21" description = "A Python utility / library to sort Python imports." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.dependencies] toml = {version = "*", optional = true, markers = "extra == \"pyproject\""} [package.extras] pipfile = ["pipreqs", "requirementslib"] pyproject = ["toml"] requirements = ["pipreqs", "pip-api"] xdg_home = ["appdirs (>=1.4.0)"] [[package]] name = "jinja2" version = "2.11.2" description = "A very fast and expressive template engine." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] MarkupSafe = ">=0.23" [package.extras] i18n = ["Babel (>=0.8)"] [[package]] name = "jmespath" version = "0.10.0" description = "JSON Matching Expressions" category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "m2r2" version = "0.2.5" description = "Markdown and reStructuredText in a single file." category = "dev" optional = false python-versions = "*" [package.dependencies] docutils = "*" mistune = "*" [[package]] name = "markupsafe" version = "1.1.1" description = "Safely add untrusted strings to HTML/XML markup." category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" [[package]] name = "marshmallow" version = "3.9.1" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." category = "dev" optional = false python-versions = ">=3.5" [package.extras] dev = ["pytest", "pytz", "simplejson", "mypy (==0.790)", "flake8 (==3.8.4)", "flake8-bugbear (==20.1.4)", "pre-commit (>=2.4,<3.0)", "tox"] docs = ["sphinx (==3.3.0)", "sphinx-issues (==1.2.0)", "alabaster (==0.7.12)", "sphinx-version-warning (==1.1.2)", "autodocsumm (==0.2.1)"] lint = ["mypy (==0.790)", "flake8 (==3.8.4)", "flake8-bugbear (==20.1.4)", "pre-commit (>=2.4,<3.0)"] tests = ["pytest", "pytz", "simplejson"] [[package]] name = "marshmallow-polyfield" version = "5.9" description = "An unofficial extension to Marshmallow to allow for polymorphic fields" category = "dev" optional = false python-versions = ">=3.5" [package.dependencies] marshmallow = ">=3.0.0b10" [[package]] name = "mccabe" version = "0.6.1" description = "McCabe checker, plugin for flake8" category = "dev" optional = false python-versions = "*" [[package]] name = "mistune" version = "0.8.4" description = "The fastest markdown parser in pure Python" category = "dev" optional = false python-versions = "*" [[package]] name = "more-itertools" version = "8.6.0" description = "More routines for operating on iterables, beyond itertools" category = "dev" optional = false python-versions = ">=3.5" [[package]] name = "mypy" version = "0.790" description = "Optional static typing for Python" category = "dev" optional = false python-versions = ">=3.5" [package.dependencies] mypy-extensions = ">=0.4.3,<0.5.0" typed-ast = ">=1.4.0,<1.5.0" typing-extensions = ">=3.7.4" [package.extras] dmypy = ["psutil (>=4.0)"] [[package]] name = "mypy-extensions" version = "0.4.3" description = "Experimental type system extensions for programs checked with the mypy typechecker." category = "dev" optional = false python-versions = "*" [[package]] name = "nitpick" version = "0.23.1" description = "Flake8 plugin to enforce the same lint configuration (flake8, isort, mypy, pylint) across multiple Python projects" category = "dev" optional = false python-versions = ">=3.5,<4.0" [package.dependencies] attrs = "*" click = "*" dictdiffer = "*" flake8 = ">=3.0.0" identify = "*" jmespath = "*" marshmallow = ">=3.0.0b10" marshmallow-polyfield = ">=5.7,<6.0" more-itertools = "*" pluggy = "*" python-slugify = "*" requests = "*" "ruamel.yaml" = "*" sortedcontainers = "*" toml = "*" [package.extras] lint = ["pylint"] test = ["pytest", "responses", "testfixtures"] doc = ["sphinx", "sphinx-rtd-theme"] [[package]] name = "packaging" version = "20.4" description = "Core utilities for Python packages" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.dependencies] pyparsing = ">=2.0.2" six = "*" [[package]] name = "pbr" version = "5.5.1" description = "Python Build Reasonableness" category = "dev" optional = false python-versions = ">=2.6" [[package]] name = "pep8-naming" version = "0.9.1" description = "Check PEP-8 naming conventions, plugin for flake8" category = "dev" optional = false python-versions = "*" [package.dependencies] flake8-polyfill = ">=1.0.2,<2" [[package]] name = "pluggy" version = "0.13.1" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.dependencies] importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} [package.extras] dev = ["pre-commit", "tox"] [[package]] name = "py" version = "1.9.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pycodestyle" version = "2.6.0" description = "Python style guide checker" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pydocstyle" version = "5.1.1" description = "Python docstring style checker" category = "dev" optional = false python-versions = ">=3.5" [package.dependencies] snowballstemmer = "*" [[package]] name = "pyflakes" version = "2.2.0" description = "passive checker of Python programs" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pygments" version = "2.7.2" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false python-versions = ">=3.5" [[package]] name = "pyparsing" version = "2.4.7" description = "Python parsing module" category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "pytest" version = "6.1.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.5" [package.dependencies] atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=17.4.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<1.0" py = ">=1.8.2" toml = "*" [package.extras] checkqa_mypy = ["mypy (==0.780)"] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] [[package]] name = "pytest-cov" version = "2.10.1" description = "Pytest plugin for measuring coverage." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] coverage = ">=4.4" pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests (==2.0.2)", "six", "pytest-xdist", "virtualenv"] [[package]] name = "pytest-randomly" version = "3.5.0" description = "Pytest plugin to randomly order tests and control random.seed." category = "dev" optional = false python-versions = ">=3.5" [package.dependencies] importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} pytest = "*" [[package]] name = "python-slugify" version = "4.0.1" description = "A Python Slugify application that handles Unicode" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] text-unidecode = ">=1.3" [package.extras] unidecode = ["Unidecode (>=1.1.1)"] [[package]] name = "pytz" version = "2020.4" description = "World timezone definitions, modern and historical" category = "dev" optional = false python-versions = "*" [[package]] name = "pyyaml" version = "5.3.1" description = "YAML parser and emitter for Python" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "requests" version = "2.25.0" description = "Python HTTP for Humans." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] certifi = ">=2017.4.17" chardet = ">=3.0.2,<4" idna = ">=2.5,<3" urllib3 = ">=1.21.1,<1.27" [package.extras] security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] [[package]] name = "restructuredtext-lint" version = "1.3.1" description = "reStructuredText linter" category = "dev" optional = false python-versions = "*" [package.dependencies] docutils = ">=0.11,<1.0" [[package]] name = "ruamel.yaml" version = "0.16.12" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" category = "dev" optional = false python-versions = "*" [package.dependencies] "ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.9\""} [package.extras] docs = ["ryd"] jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] name = "ruamel.yaml.clib" version = "0.2.2" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" category = "dev" optional = false python-versions = "*" [[package]] name = "safety" version = "1.9.0" description = "Checks installed dependencies for known vulnerabilities." category = "dev" optional = false python-versions = ">=3.5" [package.dependencies] Click = ">=6.0" dparse = ">=0.5.1" packaging = "*" requests = "*" [[package]] name = "six" version = "1.15.0" description = "Python 2 and 3 compatibility utilities" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "smmap" version = "3.0.4" description = "A pure Python implementation of a sliding window memory map manager" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "snowballstemmer" version = "2.0.0" description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." category = "dev" optional = false python-versions = "*" [[package]] name = "sortedcontainers" version = "2.3.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" category = "dev" optional = false python-versions = "*" [[package]] name = "sphinx" version = "3.2.1" description = "Python documentation generator" category = "dev" optional = false python-versions = ">=3.5" [package.dependencies] alabaster = ">=0.7,<0.8" babel = ">=1.3" colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} docutils = ">=0.12" imagesize = "*" Jinja2 = ">=2.3" packaging = "*" Pygments = ">=2.0" requests = ">=2.5.0" snowballstemmer = ">=1.1" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = "*" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" sphinxcontrib-serializinghtml = "*" [package.extras] docs = ["sphinxcontrib-websupport"] lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.780)", "docutils-stubs"] test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] [[package]] name = "sphinx-autodoc-typehints" version = "1.11.1" description = "Type hints (PEP 484) support for the Sphinx autodoc extension" category = "dev" optional = false python-versions = ">=3.5.2" [package.dependencies] Sphinx = ">=3.0" [package.extras] test = ["pytest (>=3.1.0)", "typing-extensions (>=3.5)", "sphobjinv (>=2.0)", "Sphinx (>=3.2.0)", "dataclasses"] type_comments = ["typed-ast (>=1.4.0)"] [[package]] name = "sphinxcontrib-applehelp" version = "1.0.2" description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" category = "dev" optional = false python-versions = ">=3.5" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" version = "1.0.2" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." category = "dev" optional = false python-versions = ">=3.5" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" version = "1.0.3" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" category = "dev" optional = false python-versions = ">=3.5" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest", "html5lib"] [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" category = "dev" optional = false python-versions = ">=3.5" [package.extras] test = ["pytest", "flake8", "mypy"] [[package]] name = "sphinxcontrib-qthelp" version = "1.0.3" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." category = "dev" optional = false python-versions = ">=3.5" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" version = "1.1.4" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." category = "dev" optional = false python-versions = ">=3.5" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [[package]] name = "sqlparse" version = "0.4.1" description = "A non-validating SQL parser." category = "dev" optional = false python-versions = ">=3.5" [[package]] name = "stevedore" version = "3.2.2" description = "Manage dynamic plugins for Python applications" category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] importlib-metadata = {version = ">=1.7.0", markers = "python_version < \"3.8\""} pbr = ">=2.0.0,<2.1.0 || >2.1.0" [[package]] name = "testfixtures" version = "6.15.0" description = "A collection of helpers and mock objects for unit tests and doc tests." category = "dev" optional = false python-versions = "*" [package.extras] build = ["setuptools-git", "wheel", "twine"] docs = ["sphinx", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"] test = ["pytest (>=3.6)", "pytest-cov", "pytest-django", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"] [[package]] name = "text-unidecode" version = "1.3" description = "The most basic Text::Unidecode port" category = "dev" optional = false python-versions = "*" [[package]] name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomlkit" version = "0.7.0" description = "Style preserving TOML library" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "typed-ast" version = "1.4.1" description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false python-versions = "*" [[package]] name = "typing-extensions" version = "3.7.4.3" description = "Backported and Experimental Type Hints for Python 3.5+" category = "dev" optional = false python-versions = "*" [[package]] name = "urllib3" version = "1.26.2" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] brotli = ["brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "wemake-python-styleguide" version = "0.14.1" description = "The strictest and most opinionated python linter ever" category = "dev" optional = false python-versions = ">=3.6,<4.0" [package.dependencies] astor = ">=0.8,<0.9" attrs = "*" darglint = ">=1.2,<2.0" flake8 = ">=3.7,<4.0" flake8-bandit = ">=2.1,<3.0" flake8-broken-line = ">=0.2,<0.3" flake8-bugbear = ">=19.3,<20.0" flake8-commas = ">=2.0,<3.0" flake8-comprehensions = ">=3.1.0,<4.0.0" flake8-debugger = ">=3.1,<4.0" flake8-docstrings = ">=1.3.1,<2.0.0" flake8-eradicate = ">=0.3,<0.4" flake8-isort = ">=3.0.1,<4" flake8-quotes = ">=2.0.1,<3.0.0" flake8-rst-docstrings = ">=0.0.12,<0.0.13" flake8-string-format = ">=0.2,<0.3" importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} pep8-naming = ">=0.9.1,<0.10.0" pygments = ">=2.4,<3.0" typing_extensions = ">=3.6,<4.0" [[package]] name = "zipp" version = "3.4.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false python-versions = ">=3.6" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [metadata] lock-version = "1.1" python-versions = "^3.6" content-hash = "2e87f0340c15e0a43895cb3e2ebafbef20afab5ca9013779a1b9e26a32410426" [metadata.files] alabaster = [ {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, ] asgiref = [ {file = "asgiref-3.3.1-py3-none-any.whl", hash = "sha256:5ee950735509d04eb673bd7f7120f8fa1c9e2df495394992c73234d526907e17"}, {file = "asgiref-3.3.1.tar.gz", hash = "sha256:7162a3cb30ab0609f1a4c95938fd73e8604f63bdba516a7f7d64b83ff09478f0"}, ] astor = [ {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, ] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, ] attrs = [ {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] babel = [ {file = "Babel-2.9.0-py2.py3-none-any.whl", hash = "sha256:9d35c22fcc79893c3ecc85ac4a56cde1ecf3f19c540bba0922308a6c06ca6fa5"}, {file = "Babel-2.9.0.tar.gz", hash = "sha256:da031ab54472314f210b0adcff1588ee5d1d1d0ba4dbd07b94dba82bde791e05"}, ] bandit = [ {file = "bandit-1.6.2-py2.py3-none-any.whl", hash = "sha256:336620e220cf2d3115877685e264477ff9d9abaeb0afe3dc7264f55fa17a3952"}, {file = "bandit-1.6.2.tar.gz", hash = "sha256:41e75315853507aa145d62a78a2a6c5e3240fe14ee7c601459d0df9418196065"}, ] certifi = [ {file = "certifi-2020.11.8-py2.py3-none-any.whl", hash = "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd"}, {file = "certifi-2020.11.8.tar.gz", hash = "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4"}, ] chardet = [ {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, ] click = [ {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, ] coverage = [ {file = "coverage-5.3-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:bd3166bb3b111e76a4f8e2980fa1addf2920a4ca9b2b8ca36a3bc3dedc618270"}, {file = "coverage-5.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9342dd70a1e151684727c9c91ea003b2fb33523bf19385d4554f7897ca0141d4"}, {file = "coverage-5.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:63808c30b41f3bbf65e29f7280bf793c79f54fb807057de7e5238ffc7cc4d7b9"}, {file = "coverage-5.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4d6a42744139a7fa5b46a264874a781e8694bb32f1d76d8137b68138686f1729"}, {file = "coverage-5.3-cp27-cp27m-win32.whl", hash = "sha256:86e9f8cd4b0cdd57b4ae71a9c186717daa4c5a99f3238a8723f416256e0b064d"}, {file = "coverage-5.3-cp27-cp27m-win_amd64.whl", hash = "sha256:7858847f2d84bf6e64c7f66498e851c54de8ea06a6f96a32a1d192d846734418"}, {file = "coverage-5.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:530cc8aaf11cc2ac7430f3614b04645662ef20c348dce4167c22d99bec3480e9"}, {file = "coverage-5.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:381ead10b9b9af5f64646cd27107fb27b614ee7040bb1226f9c07ba96625cbb5"}, {file = "coverage-5.3-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:71b69bd716698fa62cd97137d6f2fdf49f534decb23a2c6fc80813e8b7be6822"}, {file = "coverage-5.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1d44bb3a652fed01f1f2c10d5477956116e9b391320c94d36c6bf13b088a1097"}, {file = "coverage-5.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1c6703094c81fa55b816f5ae542c6ffc625fec769f22b053adb42ad712d086c9"}, {file = "coverage-5.3-cp35-cp35m-win32.whl", hash = "sha256:cedb2f9e1f990918ea061f28a0f0077a07702e3819602d3507e2ff98c8d20636"}, {file = "coverage-5.3-cp35-cp35m-win_amd64.whl", hash = "sha256:7f43286f13d91a34fadf61ae252a51a130223c52bfefb50310d5b2deb062cf0f"}, {file = "coverage-5.3-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:c851b35fc078389bc16b915a0a7c1d5923e12e2c5aeec58c52f4aa8085ac8237"}, {file = "coverage-5.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:aac1ba0a253e17889550ddb1b60a2063f7474155465577caa2a3b131224cfd54"}, {file = "coverage-5.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2b31f46bf7b31e6aa690d4c7a3d51bb262438c6dcb0d528adde446531d0d3bb7"}, {file = "coverage-5.3-cp36-cp36m-win32.whl", hash = "sha256:c5f17ad25d2c1286436761b462e22b5020d83316f8e8fcb5deb2b3151f8f1d3a"}, {file = "coverage-5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:aef72eae10b5e3116bac6957de1df4d75909fc76d1499a53fb6387434b6bcd8d"}, {file = "coverage-5.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:e8caf961e1b1a945db76f1b5fa9c91498d15f545ac0ababbe575cfab185d3bd8"}, {file = "coverage-5.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:29a6272fec10623fcbe158fdf9abc7a5fa032048ac1d8631f14b50fbfc10d17f"}, {file = "coverage-5.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2d43af2be93ffbad25dd959899b5b809618a496926146ce98ee0b23683f8c51c"}, {file = "coverage-5.3-cp37-cp37m-win32.whl", hash = "sha256:c3888a051226e676e383de03bf49eb633cd39fc829516e5334e69b8d81aae751"}, {file = "coverage-5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9669179786254a2e7e57f0ecf224e978471491d660aaca833f845b72a2df3709"}, {file = "coverage-5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0203acd33d2298e19b57451ebb0bed0ab0c602e5cf5a818591b4918b1f97d516"}, {file = "coverage-5.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:582ddfbe712025448206a5bc45855d16c2e491c2dd102ee9a2841418ac1c629f"}, {file = "coverage-5.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0f313707cdecd5cd3e217fc68c78a960b616604b559e9ea60cc16795c4304259"}, {file = "coverage-5.3-cp38-cp38-win32.whl", hash = "sha256:78e93cc3571fd928a39c0b26767c986188a4118edc67bc0695bc7a284da22e82"}, {file = "coverage-5.3-cp38-cp38-win_amd64.whl", hash = "sha256:8f264ba2701b8c9f815b272ad568d555ef98dfe1576802ab3149c3629a9f2221"}, {file = "coverage-5.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:50691e744714856f03a86df3e2bff847c2acede4c191f9a1da38f088df342978"}, {file = "coverage-5.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9361de40701666b034c59ad9e317bae95c973b9ff92513dd0eced11c6adf2e21"}, {file = "coverage-5.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:c1b78fb9700fc961f53386ad2fd86d87091e06ede5d118b8a50dea285a071c24"}, {file = "coverage-5.3-cp39-cp39-win32.whl", hash = "sha256:cb7df71de0af56000115eafd000b867d1261f786b5eebd88a0ca6360cccfaca7"}, {file = "coverage-5.3-cp39-cp39-win_amd64.whl", hash = "sha256:47a11bdbd8ada9b7ee628596f9d97fbd3851bd9999d398e9436bd67376dbece7"}, {file = "coverage-5.3.tar.gz", hash = "sha256:280baa8ec489c4f542f8940f9c4c2181f0306a8ee1a54eceba071a449fb870a0"}, ] darglint = [ {file = "darglint-1.5.5-py3-none-any.whl", hash = "sha256:cd882c812f28ee3b5577259bfd8d6d25962386dd87fc1f3756eac24370aaa060"}, {file = "darglint-1.5.5.tar.gz", hash = "sha256:2f12ce2ef3d8189279a8f2eb4c53fd215dbacae50e37765542a91310400a9cd6"}, ] dictdiffer = [ {file = "dictdiffer-0.8.1-py2.py3-none-any.whl", hash = "sha256:d79d9a39e459fe33497c858470ca0d2e93cb96621751de06d631856adfd9c390"}, {file = "dictdiffer-0.8.1.tar.gz", hash = "sha256:1adec0d67cdf6166bda96ae2934ddb5e54433998ceab63c984574d187cc563d2"}, ] django = [ {file = "Django-3.1.3-py3-none-any.whl", hash = "sha256:14a4b7cd77297fba516fc0d92444cc2e2e388aa9de32d7a68d4a83d58f5a4927"}, {file = "Django-3.1.3.tar.gz", hash = "sha256:14b87775ffedab2ef6299b73343d1b4b41e5d4e2aa58c6581f114dbec01e3f8f"}, ] doc8 = [ {file = "doc8-0.8.1-py2.py3-none-any.whl", hash = "sha256:4d58a5c8c56cedd2b2c9d6e3153be5d956cf72f6051128f0f2255c66227df721"}, {file = "doc8-0.8.1.tar.gz", hash = "sha256:4d1df12598807cf08ffa9a1d5ef42d229ee0de42519da01b768ff27211082c12"}, ] docutils = [ {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, ] dparse = [ {file = "dparse-0.5.1-py3-none-any.whl", hash = "sha256:e953a25e44ebb60a5c6efc2add4420c177f1d8404509da88da9729202f306994"}, {file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"}, ] eradicate = [ {file = "eradicate-1.0.tar.gz", hash = "sha256:4ffda82aae6fd49dfffa777a857cb758d77502a1f2e0f54c9ac5155a39d2d01a"}, ] flake8 = [ {file = "flake8-3.8.4-py2.py3-none-any.whl", hash = "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839"}, {file = "flake8-3.8.4.tar.gz", hash = "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"}, ] flake8-bandit = [ {file = "flake8_bandit-2.1.2.tar.gz", hash = "sha256:687fc8da2e4a239b206af2e54a90093572a60d0954f3054e23690739b0b0de3b"}, ] flake8-broken-line = [ {file = "flake8-broken-line-0.2.1.tar.gz", hash = "sha256:414477070231a5aa05468d48db2742a594b53fbc1ecba28044646706a11fb861"}, {file = "flake8_broken_line-0.2.1-py3-none-any.whl", hash = "sha256:75858359e3ccd4f1d92a9e7582aa5c9e4485cbc920dd05954703900cf907667e"}, ] flake8-bugbear = [ {file = "flake8-bugbear-19.8.0.tar.gz", hash = "sha256:d8c466ea79d5020cb20bf9f11cf349026e09517a42264f313d3f6fddb83e0571"}, {file = "flake8_bugbear-19.8.0-py35.py36.py37-none-any.whl", hash = "sha256:ded4d282778969b5ab5530ceba7aa1a9f1b86fa7618fc96a19a1d512331640f8"}, ] flake8-commas = [ {file = "flake8-commas-2.0.0.tar.gz", hash = "sha256:d3005899466f51380387df7151fb59afec666a0f4f4a2c6a8995b975de0f44b7"}, {file = "flake8_commas-2.0.0-py2.py3-none-any.whl", hash = "sha256:ee2141a3495ef9789a3894ed8802d03eff1eaaf98ce6d8653a7c573ef101935e"}, ] flake8-comprehensions = [ {file = "flake8-comprehensions-3.3.0.tar.gz", hash = "sha256:355ef47288523cad7977cb9c1bc81b71c82b7091e425cd9fbcd7e5c19a613677"}, {file = "flake8_comprehensions-3.3.0-py3-none-any.whl", hash = "sha256:c1dd6d8a00e9722619a5c5e0e6c5747f5cf23c089032c86eaf614c14a2e40adb"}, ] flake8-debugger = [ {file = "flake8-debugger-3.2.1.tar.gz", hash = "sha256:712d7c1ff69ddf3f0130e94cc88c2519e720760bce45e8c330bfdcb61ab4090d"}, ] flake8-docstrings = [ {file = "flake8-docstrings-1.5.0.tar.gz", hash = "sha256:3d5a31c7ec6b7367ea6506a87ec293b94a0a46c0bce2bb4975b7f1d09b6f3717"}, {file = "flake8_docstrings-1.5.0-py2.py3-none-any.whl", hash = "sha256:a256ba91bc52307bef1de59e2a009c3cf61c3d0952dbe035d6ff7208940c2edc"}, ] flake8-eradicate = [ {file = "flake8-eradicate-0.3.0.tar.gz", hash = "sha256:d0b3d283d85079917acbfe39b9d637385cd82cba3ae3d76c1278c07ddcf0d9b9"}, {file = "flake8_eradicate-0.3.0-py3-none-any.whl", hash = "sha256:e8b32b32300bfb407fe7ef74667c8d2d3a6a81bdf6f09c14a7bcc82b7b870f8b"}, ] flake8-isort = [ {file = "flake8-isort-3.0.1.tar.gz", hash = "sha256:5d976da513cc390232ad5a9bb54aee8a092466a15f442d91dfc525834bee727a"}, {file = "flake8_isort-3.0.1-py2.py3-none-any.whl", hash = "sha256:df1dd6dd73f6a8b128c9c783356627231783cccc82c13c6dc343d1a5a491699b"}, ] flake8-plugin-utils = [ {file = "flake8-plugin-utils-1.3.1.tar.gz", hash = "sha256:6e996bc24ebe327558f24efd106f1be5f0c033c8cbb6eed815631f73d487f1c9"}, {file = "flake8_plugin_utils-1.3.1-py3-none-any.whl", hash = "sha256:efdbf9d15b18f72b7c348dd360f30e7cf3e73aa67ff832d5343eb5aa1115f250"}, ] flake8-polyfill = [ {file = "flake8-polyfill-1.0.2.tar.gz", hash = "sha256:e44b087597f6da52ec6393a709e7108b2905317d0c0b744cdca6208e670d8eda"}, {file = "flake8_polyfill-1.0.2-py2.py3-none-any.whl", hash = "sha256:12be6a34ee3ab795b19ca73505e7b55826d5f6ad7230d31b18e106400169b9e9"}, ] flake8-pytest-style = [ {file = "flake8-pytest-style-1.3.0.tar.gz", hash = "sha256:d141476de2d1a31e491c2090ba7d1e32980b11a2c12e8aa3b3cc844571b19bfa"}, {file = "flake8_pytest_style-1.3.0-py3-none-any.whl", hash = "sha256:5a0bfb30696eb97473bb2078834794e9491848f975f680bdcb0554e5b4efbbfc"}, ] flake8-quotes = [ {file = "flake8-quotes-2.1.2.tar.gz", hash = "sha256:c844c9592940c8926c60f00bc620808912ff2acd34923ab5338f3a5ca618a331"}, ] flake8-rst-docstrings = [ {file = "flake8-rst-docstrings-0.0.12.tar.gz", hash = "sha256:01d38327801781b26c3dfeb71ae37e5a02c5ca1b774a686f63feab8824ca6f9c"}, ] flake8-string-format = [ {file = "flake8-string-format-0.2.3.tar.gz", hash = "sha256:774d56103d9242ed968897455ef49b7d6de272000cfa83de5814273a868832f1"}, {file = "flake8_string_format-0.2.3-py2.py3-none-any.whl", hash = "sha256:68ea72a1a5b75e7018cae44d14f32473c798cf73d75cbaed86c6a9a907b770b2"}, ] gitdb = [ {file = "gitdb-4.0.5-py3-none-any.whl", hash = "sha256:91f36bfb1ab7949b3b40e23736db18231bf7593edada2ba5c3a174a7b23657ac"}, {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"}, ] gitpython = [ {file = "GitPython-3.1.11-py3-none-any.whl", hash = "sha256:6eea89b655917b500437e9668e4a12eabdcf00229a0df1762aabd692ef9b746b"}, {file = "GitPython-3.1.11.tar.gz", hash = "sha256:befa4d101f91bad1b632df4308ec64555db684c360bd7d2130b4807d49ce86b8"}, ] identify = [ {file = "identify-1.5.9-py2.py3-none-any.whl", hash = "sha256:5dd84ac64a9a115b8e0b27d1756b244b882ad264c3c423f42af8235a6e71ca12"}, {file = "identify-1.5.9.tar.gz", hash = "sha256:c9504ba6a043ee2db0a9d69e43246bc138034895f6338d5aed1b41e4a73b1513"}, ] idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, ] imagesize = [ {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, ] importlib-metadata = [ {file = "importlib_metadata-2.0.0-py2.py3-none-any.whl", hash = "sha256:cefa1a2f919b866c5beb7c9f7b0ebb4061f30a8a9bf16d609b000e2dfaceb9c3"}, {file = "importlib_metadata-2.0.0.tar.gz", hash = "sha256:77a540690e24b0305878c37ffd421785a6f7e53c8b5720d211b211de8d0e95da"}, ] iniconfig = [ {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] isort = [ {file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, ] jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, ] jmespath = [ {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"}, ] m2r2 = [ {file = "m2r2-0.2.5-py3-none-any.whl", hash = "sha256:2fe7e03c41e1d2052b9cf3e76359bbfe64960b8fee9d69dfc1fc6e35ccff01e7"}, {file = "m2r2-0.2.5.tar.gz", hash = "sha256:9da08226c7ff0a60c4fce62ad5b60c761d7fd6e8c20bd2b7f9c246bce4dc0685"}, ] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, ] marshmallow = [ {file = "marshmallow-3.9.1-py2.py3-none-any.whl", hash = "sha256:e26763201474b588d144dae9a32bdd945cd26a06c943bc746a6882e850475378"}, {file = "marshmallow-3.9.1.tar.gz", hash = "sha256:73facc37462dfc0b27f571bdaffbef7709e19f7a616beb3802ea425b07843f4e"}, ] marshmallow-polyfield = [ {file = "marshmallow-polyfield-5.9.tar.gz", hash = "sha256:448f4b1ac5cbd671c0fb8a5452e99da7c0e8be924dd2cda2a21ee59457a4748f"}, ] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] mistune = [ {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, ] more-itertools = [ {file = "more-itertools-8.6.0.tar.gz", hash = "sha256:b3a9005928e5bed54076e6e549c792b306fddfe72b2d1d22dd63d42d5d3899cf"}, {file = "more_itertools-8.6.0-py3-none-any.whl", hash = "sha256:8e1a2a43b2f2727425f2b5839587ae37093f19153dc26c0927d1048ff6557330"}, ] mypy = [ {file = "mypy-0.790-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:bd03b3cf666bff8d710d633d1c56ab7facbdc204d567715cb3b9f85c6e94f669"}, {file = "mypy-0.790-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:2170492030f6faa537647d29945786d297e4862765f0b4ac5930ff62e300d802"}, {file = "mypy-0.790-cp35-cp35m-win_amd64.whl", hash = "sha256:e86bdace26c5fe9cf8cb735e7cedfe7850ad92b327ac5d797c656717d2ca66de"}, {file = "mypy-0.790-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e97e9c13d67fbe524be17e4d8025d51a7dca38f90de2e462243ab8ed8a9178d1"}, {file = "mypy-0.790-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0d34d6b122597d48a36d6c59e35341f410d4abfa771d96d04ae2c468dd201abc"}, {file = "mypy-0.790-cp36-cp36m-win_amd64.whl", hash = "sha256:72060bf64f290fb629bd4a67c707a66fd88ca26e413a91384b18db3876e57ed7"}, {file = "mypy-0.790-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:eea260feb1830a627fb526d22fbb426b750d9f5a47b624e8d5e7e004359b219c"}, {file = "mypy-0.790-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c614194e01c85bb2e551c421397e49afb2872c88b5830e3554f0519f9fb1c178"}, {file = "mypy-0.790-cp37-cp37m-win_amd64.whl", hash = "sha256:0a0d102247c16ce93c97066443d11e2d36e6cc2a32d8ccc1f705268970479324"}, {file = "mypy-0.790-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf4e7bf7f1214826cf7333627cb2547c0db7e3078723227820d0a2490f117a01"}, {file = "mypy-0.790-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:af4e9ff1834e565f1baa74ccf7ae2564ae38c8df2a85b057af1dbbc958eb6666"}, {file = "mypy-0.790-cp38-cp38-win_amd64.whl", hash = "sha256:da56dedcd7cd502ccd3c5dddc656cb36113dd793ad466e894574125945653cea"}, {file = "mypy-0.790-py3-none-any.whl", hash = "sha256:2842d4fbd1b12ab422346376aad03ff5d0805b706102e475e962370f874a5122"}, {file = "mypy-0.790.tar.gz", hash = "sha256:2b21ba45ad9ef2e2eb88ce4aeadd0112d0f5026418324176fd494a6824b74975"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] nitpick = [ {file = "nitpick-0.23.1-py3-none-any.whl", hash = "sha256:8102a6ae6ebd716cf796a614e37d9bb7f47851bb53f1c1edbf07675143ed55b9"}, {file = "nitpick-0.23.1.tar.gz", hash = "sha256:f2293781c1357baa8969ada485e1c60503b1097375a73c1f2a3c988552071e6a"}, ] packaging = [ {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, ] pbr = [ {file = "pbr-5.5.1-py2.py3-none-any.whl", hash = "sha256:b236cde0ac9a6aedd5e3c34517b423cd4fd97ef723849da6b0d2231142d89c00"}, {file = "pbr-5.5.1.tar.gz", hash = "sha256:5fad80b613c402d5b7df7bd84812548b2a61e9977387a80a5fc5c396492b13c9"}, ] pep8-naming = [ {file = "pep8-naming-0.9.1.tar.gz", hash = "sha256:a33d38177056321a167decd6ba70b890856ba5025f0a8eca6a3eda607da93caf"}, {file = "pep8_naming-0.9.1-py2.py3-none-any.whl", hash = "sha256:45f330db8fcfb0fba57458c77385e288e7a3be1d01e8ea4268263ef677ceea5f"}, ] pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, ] py = [ {file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"}, {file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"}, ] pycodestyle = [ {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, ] pydocstyle = [ {file = "pydocstyle-5.1.1-py3-none-any.whl", hash = "sha256:aca749e190a01726a4fb472dd4ef23b5c9da7b9205c0a7857c06533de13fd678"}, {file = "pydocstyle-5.1.1.tar.gz", hash = "sha256:19b86fa8617ed916776a11cd8bc0197e5b9856d5433b777f51a3defe13075325"}, ] pyflakes = [ {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"}, {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, ] pygments = [ {file = "Pygments-2.7.2-py3-none-any.whl", hash = "sha256:88a0bbcd659fcb9573703957c6b9cff9fab7295e6e76db54c9d00ae42df32773"}, {file = "Pygments-2.7.2.tar.gz", hash = "sha256:381985fcc551eb9d37c52088a32914e00517e57f4a21609f48141ba08e193fa0"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ {file = "pytest-6.1.2-py3-none-any.whl", hash = "sha256:4288fed0d9153d9646bfcdf0c0428197dba1ecb27a33bb6e031d002fa88653fe"}, {file = "pytest-6.1.2.tar.gz", hash = "sha256:c0a7e94a8cdbc5422a51ccdad8e6f1024795939cc89159a0ae7f0b316ad3823e"}, ] pytest-cov = [ {file = "pytest-cov-2.10.1.tar.gz", hash = "sha256:47bd0ce14056fdd79f93e1713f88fad7bdcc583dcd7783da86ef2f085a0bb88e"}, {file = "pytest_cov-2.10.1-py2.py3-none-any.whl", hash = "sha256:45ec2d5182f89a81fc3eb29e3d1ed3113b9e9a873bcddb2a71faaab066110191"}, ] pytest-randomly = [ {file = "pytest-randomly-3.5.0.tar.gz", hash = "sha256:440cec143fd9b0adeb072006c71e0294402a2bc2ccd08079c2341087ba4cf2d1"}, {file = "pytest_randomly-3.5.0-py3-none-any.whl", hash = "sha256:9db10d160237f3f8ee60cef72e4cb9ea88d2893c9dd5c8aa334b060cdeb67c3a"}, ] python-slugify = [ {file = "python-slugify-4.0.1.tar.gz", hash = "sha256:69a517766e00c1268e5bbfc0d010a0a8508de0b18d30ad5a1ff357f8ae724270"}, ] pytz = [ {file = "pytz-2020.4-py2.py3-none-any.whl", hash = "sha256:5c55e189b682d420be27c6995ba6edce0c0a77dd67bfbe2ae6607134d5851ffd"}, {file = "pytz-2020.4.tar.gz", hash = "sha256:3e6b7dd2d1e0a59084bcee14a17af60c5c562cdc16d828e8eba2e683d3a7e268"}, ] pyyaml = [ {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, ] requests = [ {file = "requests-2.25.0-py2.py3-none-any.whl", hash = "sha256:e786fa28d8c9154e6a4de5d46a1d921b8749f8b74e28bde23768e5e16eece998"}, {file = "requests-2.25.0.tar.gz", hash = "sha256:7f1a0b932f4a60a1a65caa4263921bb7d9ee911957e0ae4a23a6dd08185ad5f8"}, ] restructuredtext-lint = [ {file = "restructuredtext_lint-1.3.1.tar.gz", hash = "sha256:470e53b64817211a42805c3a104d2216f6f5834b22fe7adb637d1de4d6501fb8"}, ] "ruamel.yaml" = [ {file = "ruamel.yaml-0.16.12-py2.py3-none-any.whl", hash = "sha256:012b9470a0ea06e4e44e99e7920277edf6b46eee0232a04487ea73a7386340a5"}, {file = "ruamel.yaml-0.16.12.tar.gz", hash = "sha256:076cc0bc34f1966d920a49f18b52b6ad559fbe656a0748e3535cf7b3f29ebf9e"}, ] "ruamel.yaml.clib" = [ {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:28116f204103cb3a108dfd37668f20abe6e3cafd0d3fd40dba126c732457b3cc"}, {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:daf21aa33ee9b351f66deed30a3d450ab55c14242cfdfcd377798e2c0d25c9f1"}, {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-win32.whl", hash = "sha256:30dca9bbcbb1cc858717438218d11eafb78666759e5094dd767468c0d577a7e7"}, {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-win_amd64.whl", hash = "sha256:f6061a31880c1ed6b6ce341215336e2f3d0c1deccd84957b6fa8ca474b41e89f"}, {file = "ruamel.yaml.clib-0.2.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:73b3d43e04cc4b228fa6fa5d796409ece6fcb53a6c270eb2048109cbcbc3b9c2"}, {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:53b9dd1abd70e257a6e32f934ebc482dac5edb8c93e23deb663eac724c30b026"}, {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:839dd72545ef7ba78fd2aa1a5dd07b33696adf3e68fae7f31327161c1093001b"}, {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win32.whl", hash = "sha256:b1e981fe1aff1fd11627f531524826a4dcc1f26c726235a52fcb62ded27d150f"}, {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4e52c96ca66de04be42ea2278012a2342d89f5e82b4512fb6fb7134e377e2e62"}, {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a873e4d4954f865dcb60bdc4914af7eaae48fb56b60ed6daa1d6251c72f5337c"}, {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ab845f1f51f7eb750a78937be9f79baea4a42c7960f5a94dde34e69f3cce1988"}, {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win32.whl", hash = "sha256:e9f7d1d8c26a6a12c23421061f9022bb62704e38211fe375c645485f38df34a2"}, {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2602e91bd5c1b874d6f93d3086f9830f3e907c543c7672cf293a97c3fabdcd91"}, {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:44c7b0498c39f27795224438f1a6be6c5352f82cb887bc33d962c3a3acc00df6"}, {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8e8fd0a22c9d92af3a34f91e8a2594eeb35cba90ab643c5e0e643567dc8be43e"}, {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win32.whl", hash = "sha256:464e66a04e740d754170be5e740657a3b3b6d2bcc567f0c3437879a6e6087ff6"}, {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:52ae5739e4b5d6317b52f5b040b1b6639e8af68a5b8fd606a8b08658fbd0cab5"}, {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df5019e7783d14b79217ad9c56edf1ba7485d614ad5a385d1b3c768635c81c0"}, {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5254af7d8bdf4d5484c089f929cb7f5bafa59b4f01d4f48adda4be41e6d29f99"}, {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win32.whl", hash = "sha256:74161d827407f4db9072011adcfb825b5258a5ccb3d2cd518dd6c9edea9e30f1"}, {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:058a1cc3df2a8aecc12f983a48bda99315cebf55a3b3a5463e37bb599b05727b"}, {file = "ruamel.yaml.clib-0.2.2.tar.gz", hash = "sha256:2d24bd98af676f4990c4d715bcdc2a60b19c56a3fb3a763164d2d8ca0e806ba7"}, ] safety = [ {file = "safety-1.9.0-py2.py3-none-any.whl", hash = "sha256:86c1c4a031fe35bd624fce143fbe642a0234d29f7cbf7a9aa269f244a955b087"}, {file = "safety-1.9.0.tar.gz", hash = "sha256:23bf20690d4400edc795836b0c983c2b4cbbb922233108ff925b7dd7750f00c9"}, ] six = [ {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, ] smmap = [ {file = "smmap-3.0.4-py2.py3-none-any.whl", hash = "sha256:54c44c197c819d5ef1991799a7e30b662d1e520f2ac75c9efbeb54a742214cf4"}, {file = "smmap-3.0.4.tar.gz", hash = "sha256:9c98bbd1f9786d22f14b3d4126894d56befb835ec90cef151af566c7e19b5d24"}, ] snowballstemmer = [ {file = "snowballstemmer-2.0.0-py2.py3-none-any.whl", hash = "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0"}, {file = "snowballstemmer-2.0.0.tar.gz", hash = "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"}, ] sortedcontainers = [ {file = "sortedcontainers-2.3.0-py2.py3-none-any.whl", hash = "sha256:37257a32add0a3ee490bb170b599e93095eed89a55da91fa9f48753ea12fd73f"}, {file = "sortedcontainers-2.3.0.tar.gz", hash = "sha256:59cc937650cf60d677c16775597c89a960658a09cf7c1a668f86e1e4464b10a1"}, ] sphinx = [ {file = "Sphinx-3.2.1-py3-none-any.whl", hash = "sha256:ce6fd7ff5b215af39e2fcd44d4a321f6694b4530b6f2b2109b64d120773faea0"}, {file = "Sphinx-3.2.1.tar.gz", hash = "sha256:321d6d9b16fa381a5306e5a0b76cd48ffbc588e6340059a729c6fdd66087e0e8"}, ] sphinx-autodoc-typehints = [ {file = "sphinx-autodoc-typehints-1.11.1.tar.gz", hash = "sha256:244ba6d3e2fdb854622f643c7763d6f95b6886eba24bec28e86edf205e4ddb20"}, {file = "sphinx_autodoc_typehints-1.11.1-py3-none-any.whl", hash = "sha256:da049791d719f4c9813642496ee4764203e317f0697eb75446183fa2a68e3f77"}, ] sphinxcontrib-applehelp = [ {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, ] sphinxcontrib-devhelp = [ {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, ] sphinxcontrib-htmlhelp = [ {file = "sphinxcontrib-htmlhelp-1.0.3.tar.gz", hash = "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"}, {file = "sphinxcontrib_htmlhelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f"}, ] sphinxcontrib-jsmath = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, ] sphinxcontrib-qthelp = [ {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, ] sphinxcontrib-serializinghtml = [ {file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"}, {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"}, ] sqlparse = [ {file = "sqlparse-0.4.1-py3-none-any.whl", hash = "sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0"}, {file = "sqlparse-0.4.1.tar.gz", hash = "sha256:0f91fd2e829c44362cbcfab3e9ae12e22badaa8a29ad5ff599f9ec109f0454e8"}, ] stevedore = [ {file = "stevedore-3.2.2-py3-none-any.whl", hash = "sha256:5e1ab03eaae06ef6ce23859402de785f08d97780ed774948ef16c4652c41bc62"}, {file = "stevedore-3.2.2.tar.gz", hash = "sha256:f845868b3a3a77a2489d226568abe7328b5c2d4f6a011cc759dfa99144a521f0"}, ] testfixtures = [ {file = "testfixtures-6.15.0-py2.py3-none-any.whl", hash = "sha256:e17f4f526fc90b0ac9bc7f8ca62b7dec17d9faf3d721f56bda4f0fd94d02f85a"}, {file = "testfixtures-6.15.0.tar.gz", hash = "sha256:409f77cfbdad822d12a8ce5c4aa8fb4d0bb38073f4a5444fede3702716a2cec2"}, ] text-unidecode = [ {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomlkit = [ {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"}, {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, ] typed-ast = [ {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"}, {file = "typed_ast-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919"}, {file = "typed_ast-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01"}, {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"}, {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"}, {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"}, {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"}, {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"}, {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"}, {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"}, {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"}, {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"}, {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"}, {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"}, {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"}, {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"}, {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"}, {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"}, {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"}, {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, ] typing-extensions = [ {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, ] urllib3 = [ {file = "urllib3-1.26.2-py2.py3-none-any.whl", hash = "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473"}, {file = "urllib3-1.26.2.tar.gz", hash = "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08"}, ] wemake-python-styleguide = [ {file = "wemake-python-styleguide-0.14.1.tar.gz", hash = "sha256:e13dc580fa56b7b548de8da170bccb8ddff2d4ab026ca987db8a9893bf8a7b5b"}, {file = "wemake_python_styleguide-0.14.1-py3-none-any.whl", hash = "sha256:73a501e0547275287a2b926515c000cc25026a8bceb9dcc1bf73ef85a223a3c6"}, ] zipp = [ {file = "zipp-3.4.0-py3-none-any.whl", hash = "sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108"}, {file = "zipp-3.4.0.tar.gz", hash = "sha256:ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb"}, ] django-split-settings-1.1.0/pyproject.toml000066400000000000000000000032741375470023100206660ustar00rootroot00000000000000[tool.nitpick] style = "https://raw.githubusercontent.com/wemake-services/wemake-python-styleguide/master/styles/nitpick-style-wemake.toml" [tool.poetry] name = "django-split-settings" version = "1.1.0" description = "Organize Django settings into multiple files and directories. Easily override and modify settings. Use wildcards and optional settings files." authors = [ "sobolevn ", "Visa Kopu", "Antti Kaihola", ] license = "BSD-2-Clause" packages = [ { include = "split_settings" } ] readme = "README.md" repository = "https://github.com/sobolevn/django-split-settings" homepage = "https://django-split-settings.readthedocs.io" keywords = [ "django", "settings", "configuration", "config", ] classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 1.11", "Framework :: Django :: 2.2", "Framework :: Django :: 3.0", "Framework :: Django :: 3.1", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", ] [tool.poetry.dependencies] python = "^3.6" [tool.poetry.dev-dependencies] django = "^3.1" mypy = "^0.790" wemake-python-styleguide = "^0.14" flake8-pytest-style = "^1.3.0" nitpick = "^0.23.1" safety = "^1.9" pytest = "^6.1" pytest-cov = "^2.10" pytest-randomly = "^3.4" sphinx = "<3.3" sphinx-autodoc-typehints = "^1.11" doc8 = "^0.8" tomlkit = "^0.7" m2r2 = "^0.2" [build-system] requires = ["poetry>=1.0"] build-backend = "poetry.masonry.api" django-split-settings-1.1.0/setup.cfg000066400000000000000000000041561375470023100175730ustar00rootroot00000000000000# All configuration for plugins and other utils is defined here. # Read more about `setup.cfg`: # https://docs.python.org/3/distutils/configfile.html [flake8] # Base flake8 configuration: # https://flake8.pycqa.org/en/latest/user/configuration.html format = wemake show-source = True statistics = False doctests = True # Plugins: max-complexity = 6 max-line-length = 80 # Excluding some directories: exclude = .git __pycache__ .venv .eggs *.egg # Exclude some pydoctest checks globally: ignore = D100, D104, D401, W504, RST210, RST213, RST299, RST303, RST304, DAR103, DAR203 per-file-ignores = # Our module is complex, there's nothing we can do: split_settings/tools.py: WPS232 # Tests contain examples with logic in init files: tests/*/__init__.py: WPS412 # There are multiple fixtures, `assert`s, and subprocesses in tests: tests/*.py: S101, S105, S404, S603, S607 [isort] # isort configuration: # https://github.com/timothycrosley/isort/wiki/isort-Settings include_trailing_comma = true use_parentheses = true # See https://github.com/timothycrosley/isort#multi-line-output-modes multi_line_output = 3 default_section = FIRSTPARTY line_length = 80 [darglint] # darglint configuration: # https://github.com/terrencepreilly/darglint strictness = long [tool:pytest] # py.test options: norecursedirs = *.egg .eggs dist build docs .tox .git __pycache__ addopts = --strict --cov=split_settings --cov-branch --cov-report=term-missing:skip-covered --cov-report=html --cov-report=xml --cov-fail-under=100 [mypy] # The mypy configurations: http://bit.ly/2zEl9WI allow_redefinition = False check_untyped_defs = True disallow_untyped_decorators = True disallow_any_explicit = True disallow_any_generics = True disallow_untyped_calls = True ignore_errors = False ignore_missing_imports = True implicit_reexport = False strict_optional = True strict_equality = True local_partial_types = True no_implicit_optional = True warn_unused_ignores = True warn_redundant_casts = True warn_unused_configs = True warn_unreachable = True warn_no_return = True [doc8] ignore-path = docs/_build max-line-length = 80 sphinx = True django-split-settings-1.1.0/split_settings/000077500000000000000000000000001375470023100210175ustar00rootroot00000000000000django-split-settings-1.1.0/split_settings/__init__.py000066400000000000000000000002601375470023100231260ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Organize Django settings into multiple files and directories. Easily override and modify settings. Use wildcards and optional settings files. """ django-split-settings-1.1.0/split_settings/py.typed000066400000000000000000000000001375470023100225040ustar00rootroot00000000000000django-split-settings-1.1.0/split_settings/tools.py000066400000000000000000000072311375470023100225340ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Organize Django settings into multiple files and directories. Easily override and modify settings. Use wildcards and optional settings files. """ import glob import inspect import os import sys from importlib.util import module_from_spec, spec_from_file_location __all__ = ('optional', 'include') # noqa: WPS410 #: Special magic attribute that is sometimes set by `uwsgi` / `gunicord`. _INCLUDED_FILE = '__included_file__' def optional(filename: str) -> str: """ This functions is used for compatibility reasons. It masks the old `optional` class with the name error. Now `invalid-name` is removed from `pylint`. Args: filename: the filename to be optional. Returns: New instance of :class:`_Optional`. """ return _Optional(filename) class _Optional(str): # noqa: WPS600 """ Wrap a file path with this class to mark it as optional. Optional paths don't raise an :class:`IOError` if file is not found. """ def include(*args: str, **kwargs) -> None: # noqa: WPS210, WPS231, C901 """ Used for including Django project settings from multiple files. Usage: .. code:: python from split_settings.tools import optional, include include( 'components/base.py', 'components/database.py', optional('local_settings.py'), scope=globals(), # optional scope ) Args: *args: File paths (``glob`` - compatible wildcards can be used). **kwargs: Settings context: ``scope=globals()`` or ``None``. Raises: IOError: if a required settings file is not found. """ # we are getting globals() from previous frame # globals - it is caller's globals() scope = kwargs.pop('scope', inspect.stack()[1][0].f_globals) scope.setdefault('__included_files__', []) included_files = scope.get('__included_files__') including_file = scope.get( _INCLUDED_FILE, scope['__file__'].rstrip('c'), ) conf_path = os.path.dirname(including_file) for conf_file in args: saved_included_file = scope.get(_INCLUDED_FILE) pattern = os.path.join(conf_path, conf_file) # find files per pattern, raise an error if not found # (unless file is optional) files_to_include = glob.glob(pattern) if not files_to_include and not isinstance(conf_file, _Optional): raise IOError('No such file: {0}'.format(pattern)) for included_file in files_to_include: included_file = os.path.abspath(included_file) # noqa: WPS440 if included_file in included_files: continue included_files.append(included_file) scope[_INCLUDED_FILE] = included_file with open(included_file, 'rb') as to_compile: compiled_code = compile( # noqa: WPS421 to_compile.read(), included_file, 'exec', ) exec(compiled_code, scope) # noqa: S102, WPS421 # Adds dummy modules to sys.modules to make runserver autoreload # work with settings components: rel_path = os.path.relpath(included_file) module_name = '_split_settings.{0}'.format( rel_path[:rel_path.rfind('.')].replace('/', '.'), ) spec = spec_from_file_location( module_name, included_file, ) module = module_from_spec(spec) sys.modules[module_name] = module if saved_included_file: scope[_INCLUDED_FILE] = saved_included_file elif _INCLUDED_FILE in scope: scope.pop(_INCLUDED_FILE) django-split-settings-1.1.0/tests/000077500000000000000000000000001375470023100171065ustar00rootroot00000000000000django-split-settings-1.1.0/tests/__init__.py000066400000000000000000000000301375470023100212100ustar00rootroot00000000000000# -*- coding: utf-8 -*- django-split-settings-1.1.0/tests/conftest.py000066400000000000000000000024721375470023100213120ustar00rootroot00000000000000# -*- coding: utf-8 -*- """This file contains different utils and fixtures.""" import os import pytest class Scope(dict): # noqa: WPS600 """This class emulates `globals()`, but does not share state in tests.""" def __init__(self, *args, **kwargs): """Adding `__file__` to make things work in `tools.py`.""" super().__init__(*args, **kwargs) self['__file__'] = __file__ # Different util functions: @pytest.fixture() def scope(): """This fixture just returns the new instance of the test Scope class.""" return Scope() @pytest.fixture() def fixture_file(): """This fixture return a path to the test fixture file.""" return os.path.join( 'settings', 'basic', 'fixture_to_include.py', ) # Settings files: @pytest.fixture() def merged(): """This fixture returns basic merged settings example.""" from tests.settings import merged as _merged # noqa: WPS433 return _merged @pytest.fixture() def stacked(): """This fixture returns stacked settings example.""" from tests.settings import stacked as _stacked # noqa: WPS433 return _stacked @pytest.fixture() def recursion(): """This fixture returns recursion settings example.""" from tests.settings import recursion as _recursion # noqa: WPS433 return _recursion django-split-settings-1.1.0/tests/settings/000077500000000000000000000000001375470023100207465ustar00rootroot00000000000000django-split-settings-1.1.0/tests/settings/__init__.py000066400000000000000000000000301375470023100230500ustar00rootroot00000000000000# -*- coding: utf-8 -*- django-split-settings-1.1.0/tests/settings/basic/000077500000000000000000000000001375470023100220275ustar00rootroot00000000000000django-split-settings-1.1.0/tests/settings/basic/fixture_to_include.py000066400000000000000000000001611375470023100262720ustar00rootroot00000000000000# -*- coding: utf-8 -*- """This file only serves as a test fixture to be included.""" FIXTURE_VALUE = __file__ django-split-settings-1.1.0/tests/settings/merged/000077500000000000000000000000001375470023100222115ustar00rootroot00000000000000django-split-settings-1.1.0/tests/settings/merged/__init__.py000066400000000000000000000007741375470023100243320ustar00rootroot00000000000000# -*- coding: utf-8 -*- from split_settings.tools import include, optional include( # Components: 'components/base.py', 'components/locale.py', 'components/apps_middleware.py', 'components/static.py', 'components/templates.py', 'components/database.py', 'components/logging.py', # Override settings for testing: optional('components/testing.py'), # Missing file: optional('components/missing_file.py'), # Scope: scope=globals(), # noqa: WPS421 ) django-split-settings-1.1.0/tests/settings/merged/components/000077500000000000000000000000001375470023100243765ustar00rootroot00000000000000django-split-settings-1.1.0/tests/settings/merged/components/__init__.py000066400000000000000000000000301375470023100265000ustar00rootroot00000000000000# -*- coding: utf-8 -*- django-split-settings-1.1.0/tests/settings/merged/components/apps_middleware.py000066400000000000000000000015151375470023100301120ustar00rootroot00000000000000# -*- coding: utf-8 -*- MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', # Uncomment the next line for simple clickjacking protection: # 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', ) django-split-settings-1.1.0/tests/settings/merged/components/base.py000066400000000000000000000011121375470023100256550ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Django settings for example project. DEBUG = True TEMPLATE_DEBUG = DEBUG ADMINS = () MANAGERS = ADMINS # Hosts/domain names that are valid for this site; required if DEBUG is False # See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts ALLOWED_HOSTS = () SITE_ID = 1 # Make this unique, and don't share it with anybody. SECRET_KEY = 'a2j43z$c+s#v@9^7$zlqjty)s--v655_8*lkkvuz7&d-6(9d=v' ROOT_URLCONF = 'example.urls' # Python dotted path to the WSGI application used by Django's runserver. WSGI_APPLICATION = 'example.wsgi.application' django-split-settings-1.1.0/tests/settings/merged/components/database.py000066400000000000000000000002341375470023100265130ustar00rootroot00000000000000# -*- coding: utf-8 -*- DATABASES = { # noqa: WPS407 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'test.db', }, } django-split-settings-1.1.0/tests/settings/merged/components/locale.py000066400000000000000000000014771375470023100262200ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Local time zone for this installation. Choices can be found here: # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name # although not all choices may be available on all operating systems. # In a Windows environment this must be set to your system time zone. TIME_ZONE = 'America/Chicago' # Language code for this installation. All choices can be found here: # http://www.i18nguy.com/unicode/language-identifiers.html LANGUAGE_CODE = 'en-us' # If you set this to False, Django will make some optimizations so as not # to load the internationalization machinery. USE_I18N = True # If you set this to False, Django will not format dates, numbers and # calendars according to the current locale. USE_L10N = True # If you set this to False, Django will not use timezone-aware datetimes. USE_TZ = True django-split-settings-1.1.0/tests/settings/merged/components/logging.py000066400000000000000000000011271375470023100263770ustar00rootroot00000000000000# -*- coding: utf-8 -*- LOGGING = { # noqa: WPS407 'version': 1, 'disable_existing_loggers': False, 'filters': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse', }, }, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler', }, }, 'loggers': { 'django.request': { 'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': True, }, }, } django-split-settings-1.1.0/tests/settings/merged/components/static.py000066400000000000000000000004201375470023100262330ustar00rootroot00000000000000# -*- coding: utf-8 -*- MEDIA_ROOT = '' MEDIA_URL = '' STATIC_ROOT = '' STATIC_URL = '/static/' STATICFILES_DIRS = () STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', ) django-split-settings-1.1.0/tests/settings/merged/components/templates.py000066400000000000000000000007111375470023100267450ustar00rootroot00000000000000# -*- coding: utf-8 -*- # List of callables that know how to import templates from various sources. TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader', ) TEMPLATE_DIRS = ( # Put strings here, like # "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. ) django-split-settings-1.1.0/tests/settings/merged/components/testing.py000066400000000000000000000006131375470023100264250ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os # This settings will override settings in static.py STATIC_ROOT = 'test_folder' class TestingConfiguration(object): """Test class.""" def __init__(self, testing_dir): """Public constructor.""" self.test_path = os.path.join(testing_dir, STATIC_ROOT) def get_path(self): """Returns path.""" return self.test_path django-split-settings-1.1.0/tests/settings/recursion/000077500000000000000000000000001375470023100227575ustar00rootroot00000000000000django-split-settings-1.1.0/tests/settings/recursion/__init__.py000066400000000000000000000001761375470023100250740ustar00rootroot00000000000000# -*- coding: utf-8 -*- from split_settings.tools import include # Includes all python files without scope: include('*.py') django-split-settings-1.1.0/tests/settings/recursion/ok.py000066400000000000000000000000551375470023100237420ustar00rootroot00000000000000# -*- coding: utf-8 -*- RECURSION_OK = True django-split-settings-1.1.0/tests/settings/stacked/000077500000000000000000000000001375470023100223645ustar00rootroot00000000000000django-split-settings-1.1.0/tests/settings/stacked/__init__.py000066400000000000000000000001261375470023100244740ustar00rootroot00000000000000# -*- coding: utf-8 -*- from split_settings.tools import include include('base.py') django-split-settings-1.1.0/tests/settings/stacked/base.py000066400000000000000000000001621375470023100236470ustar00rootroot00000000000000# -*- coding: utf-8 -*- from split_settings.tools import include STACKED_BASE_LOADED = True include('db/*.py') django-split-settings-1.1.0/tests/settings/stacked/db/000077500000000000000000000000001375470023100227515ustar00rootroot00000000000000django-split-settings-1.1.0/tests/settings/stacked/db/__init__.py000066400000000000000000000000301375470023100250530ustar00rootroot00000000000000# -*- coding: utf-8 -*- django-split-settings-1.1.0/tests/settings/stacked/db/persistent.py000066400000000000000000000001401375470023100255160ustar00rootroot00000000000000# -*- coding: utf-8 -*- if STACKED_BASE_LOADED: # noqa: F821 STACKED_DB_PERSISTENT = True django-split-settings-1.1.0/tests/test_import.py000066400000000000000000000006731375470023100220370ustar00rootroot00000000000000# -*- coding: utf-8 -*- from split_settings.tools import __all__ def test_wildcard_import(): """Imports all from all modules.""" assert 'optional' in __all__ assert 'include' in __all__ def test_class_import(merged): """This test case covers #7 issue.""" from tests.settings.merged.components import testing # noqa: WPS433 path = testing.TestingConfiguration('').get_path() assert merged.STATIC_ROOT == path django-split-settings-1.1.0/tests/test_split_settings.py000066400000000000000000000015601375470023100235740ustar00rootroot00000000000000# -*- coding: utf-8 -*- def test_merge(merged): """Test that all values from settings are present.""" assert merged.SECRET_KEY assert merged.STATIC_ROOT def test_override(merged, monkeypatch): """This setting must be overridden in the testing.py.""" monkeypatch.setenv('DJANGO_SETTINGS_MODULE', 'tests.settings.merged') from django.conf import settings # noqa: WPS433 assert merged.STATIC_ROOT == settings.STATIC_ROOT def test_recursion_inclusion(recursion): """ Tests `include` function for inclusion files only once. It protects of infinite recursion. """ assert recursion.RECURSION_OK def test_stacked_settings(stacked): """ Tests `include` function for inclusion files only once. It protects of infinite recursion. """ assert stacked.STACKED_BASE_LOADED assert stacked.STACKED_DB_PERSISTENT django-split-settings-1.1.0/tests/test_tools.py000066400000000000000000000033361375470023100216640ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import pytest import six from split_settings.tools import include _FIXTURE_VALUE = 'FIXTURE_VALUE' def test_missing_file_error(scope): """This test covers the IOError, when file does not exist.""" with pytest.raises(IOError, match='does-not-exist.py'): include('does-not-exist.py', scope=scope) def test_keys_count(scope, fixture_file): """Scope must contain all base python attrs and a custom value.""" include(fixture_file, scope=scope) # Keys: # 'FIXTURE_VALUE', '__file__', '__doc__', # '__builtins__', '__included_files__' assert len(scope.keys()) == 5 def test_included_file_scope(scope, fixture_file): """Test emulates gunicorn behavior with `__included_file__` value.""" base = os.path.dirname(__file__) saved_file = os.path.join(base, 'basic') scope['__included_file__'] = saved_file include(fixture_file, scope=scope) assert _FIXTURE_VALUE in scope assert scope['__included_file__'] == saved_file def test_empty_included_file(scope, fixture_file): """Test when there's no `__included_file__`.""" include(fixture_file, scope=scope) assert _FIXTURE_VALUE in scope assert '__included_file__' not in scope def test_unicode_passed(scope, fixture_file): """Tests the `unicode` filename in `python2`.""" include( six.text_type(fixture_file), # unicode on py2, str on py3 scope=scope, ) assert _FIXTURE_VALUE in scope def test_caller_scope_automatically(fixture_file): """ Tests `include` function for automatic `globals()` extraction. Now you can omit positional argument `scope`. """ include(fixture_file) assert _FIXTURE_VALUE in globals() # noqa: WPS421