├── pytest.ini ├── {{cookiecutter.repo_name}} ├── tests │ └── __init__.py ├── requirements │ ├── base.txt │ ├── prod.txt │ └── dev.txt ├── {{cookiecutter.package_name}} │ ├── __init__.py │ ├── static │ │ └── css │ │ │ └── style.css │ ├── templates │ │ ├── 404.html │ │ ├── 500.html │ │ ├── index.html │ │ └── base.html │ ├── assets │ │ └── sass │ │ │ └── style.scss │ ├── handlers │ │ ├── __init__.py │ │ └── base.py │ ├── locale │ │ ├── en_US │ │ │ └── LC_MESSAGES │ │ │ │ └── {{ cookiecutter.package_name }}.po │ │ └── {{ cookiecutter.package_name }}.pot │ ├── version.py │ └── urls.py ├── .dockerignore ├── robots.txt ├── CHANGELOG.md ├── bootstrap.sh ├── pytest.ini ├── requirements.txt ├── docker-compose.yml ├── MANIFEST.in ├── .gitignore ├── AUTHORS.rst ├── .isort.cfg ├── README.rst ├── .editorconfig ├── Dockerfile ├── Vagrantfile ├── docs │ ├── source │ │ ├── index.rst │ │ └── conf.py │ ├── Makefile │ └── make.bat ├── run.py ├── settings.py ├── tox.ini ├── setup.cfg ├── fabfile.py ├── setup.py └── LICENSE ├── setup.cfg ├── .flake8 ├── CONTRIBUTORS ├── .gitignore ├── tox.ini ├── .editorconfig ├── pyproject.toml ├── hooks ├── pre_gen_project.py └── post_gen_project.py ├── cookiecutter.json ├── LICENSE.rst ├── setup.py ├── .github └── workflows │ └── test.yml ├── CHANGELOG.md ├── tests └── test_bake_project.py ├── README.rst └── poetry.lock /pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | testpaths = tests/ 3 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | description-file = README.md 3 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/requirements/base.txt: -------------------------------------------------------------------------------- 1 | tornado>=6.1 2 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/{{cookiecutter.package_name}}/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/{{cookiecutter.package_name}}/static/css/style.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/{{cookiecutter.package_name}}/templates/404.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/{{cookiecutter.package_name}}/templates/500.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/{{cookiecutter.package_name}}/assets/sass/style.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/.dockerignore: -------------------------------------------------------------------------------- 1 | .* 2 | !.coveragerc 3 | !.env 4 | !.pylintrc 5 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/{{cookiecutter.package_name}}/handlers/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/{{cookiecutter.package_name}}/locale/en_US/LC_MESSAGES/{{ cookiecutter.package_name }}.po: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/robots.txt: -------------------------------------------------------------------------------- 1 | # www.robotstxt.org/ 2 | 3 | # Allow crawling of all content 4 | User-agent: * 5 | Disallow: 6 | -------------------------------------------------------------------------------- /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | max-line-length = 120 3 | extend-exclude = 4 | get-poetry.py, 5 | ./{{cookiecutter.repo_name}}/*, 6 | .venv/*, 7 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/{{cookiecutter.package_name}}/version.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | __version__ = '{{ cookiecutter.version }}' 4 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## Development 4 | 5 | ## {{ cookiecutter.version }} ({% now 'local' %}) 6 | 7 | Initial release 8 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/requirements/prod.txt: -------------------------------------------------------------------------------- 1 | # Production specific requirements go here (they should not vary from the base 2 | # requirements) 3 | -r base.txt 4 | -------------------------------------------------------------------------------- /CONTRIBUTORS: -------------------------------------------------------------------------------- 1 | bwrsandman 2 | Dectinc 3 | Henning Kage 4 | Stephen Wolff 5 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | apk --update add --no-cache python3 6 | 7 | pip3 install --upgrade pip 8 | pip3 install -r requirements.txt 9 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/{{cookiecutter.package_name}}/templates/index.html: -------------------------------------------------------------------------------- 1 | {% raw %} 2 | {% extends "base.html" %} 3 | 4 | {% block title %}A sample index page{% end %} 5 | {% endraw %} 6 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/{{cookiecutter.package_name}}/urls.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from .handlers import base 4 | 5 | 6 | url_patterns = [ 7 | (r'/', base.MainHandler), 8 | ] -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | testpaths = tests {{ cookiecutter.package_name }} 3 | pep8ignore = 4 | tests/*.py ALL 5 | pep8maxlinelength = {{ cookiecutter.max_line_length }} 6 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/requirements.txt: -------------------------------------------------------------------------------- 1 | # This file is here because many Platforms as a Service look for 2 | # requirements.txt in the root directory of a project. 3 | -r requirements/prod.txt 4 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | services: 3 | {{ cookiecutter.package_name }}: 4 | build: . 5 | command: python /app/run.py 6 | ports: 7 | - "8000:8000" 8 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE 2 | include README.rst 3 | include CHANGELOG.md 4 | 5 | recursive-include {{ cookiecutter.package_name }} *.html *.js *.css *.png *.gif *.jpg *.jpeg *.svg *.po *.mo 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Python 2 | *.egg-info 3 | *.egg 4 | *.pyc 5 | .cache 6 | build 7 | dist 8 | 9 | # Translations 10 | *.mo 11 | 12 | # Vagrant 13 | .vagrant 14 | .bash_history 15 | 16 | .idea 17 | .vscode 18 | 19 | .tox 20 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/.gitignore: -------------------------------------------------------------------------------- 1 | # Python 2 | *.egg-info 3 | *.egg 4 | *.pyc 5 | .cache 6 | build 7 | dist 8 | 9 | # Translations 10 | *.mo 11 | 12 | # Testing 13 | .tox 14 | 15 | # Vagrant 16 | .vagrant 17 | .bash_history 18 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/AUTHORS.rst: -------------------------------------------------------------------------------- 1 | ======= 2 | Credits 3 | ======= 4 | 5 | Development Lead 6 | ---------------- 7 | 8 | * {{ cookiecutter.author_name }} <{{ cookiecutter.email }}> 9 | 10 | Contributors 11 | ------------ 12 | 13 | None yet. Why not be the first? 14 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/requirements/dev.txt: -------------------------------------------------------------------------------- 1 | # Local development dependencies go here 2 | -r base.txt 3 | 4 | coverage 5 | flake8 6 | mock 7 | pydocstyle 8 | pylint 9 | {%- if cookiecutter.use_pytest == "Yes" %} 10 | pytest 11 | pytest-cov 12 | pytest-pep8 13 | {%- endif %} 14 | Sphinx 15 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/{{cookiecutter.package_name}}/handlers/base.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import tornado.web 4 | 5 | 6 | class MainHandler(tornado.web.RequestHandler): 7 | 8 | # @tornado.web.authenticated 9 | def get(self): 10 | self.render('index.html') 11 | -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | envlist = py36, py37, py38, py39, py310 docs 3 | skipsdist = true 4 | 5 | [testenv:docs] 6 | basepython=python 7 | changedir=docs 8 | deps=sphinx 9 | commands= 10 | sphinx-build -b html -d {envtmpdir}/doctrees . {envtmpdir}/html 11 | 12 | [testenv] 13 | whitelist_externals = bash 14 | deps = 15 | -rrequirements_dev.txt 16 | commands = 17 | py.test 18 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/{{cookiecutter.package_name}}/locale/{{ cookiecutter.package_name }}.pot: -------------------------------------------------------------------------------- 1 | # Translations template for {{ cookiecutter.project_name }}. 2 | # Copyright (C) {% now 'local', '%Y' %}, {{ cookiecutter.author_name }} 3 | # This file is distributed under the same license as the {{ cookiecutter.repo_name }} project. 4 | # {{ cookiecutter.author_name }} {{ cookiecutter.email }}, {% now 'local', '%Y' %}. 5 | # 6 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/.isort.cfg: -------------------------------------------------------------------------------- 1 | [settings] 2 | line_length = {{ cookiecutter.max_line_length }} 3 | multi_line_output=5 4 | include_trailing_comma=true 5 | combine_as_imports=true 6 | 7 | sections=FUTURE,STDLIB,THIRDPARTY,FIRSTPARTY,{{ cookiecutter.package_name|upper|replace('_', '') }},LOCALFOLDER 8 | default_section=THIRDPARTY 9 | known_{{ cookiecutter.package_name|lower|replace('_', '') }}={{ cookiecutter.package_name }} 10 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/README.rst: -------------------------------------------------------------------------------- 1 | {{cookiecutter.project_name}} 2 | {{ '=' * cookiecutter.project_name|length }} 3 | 4 | {{cookiecutter.description}} 5 | 6 | Credits 7 | ------- 8 | 9 | Tools used in rendering this package: 10 | 11 | * Cookiecutter_ 12 | * `cookiecutter-tornado`_ 13 | 14 | .. _Cookiecutter: https://github.com/audreyr/cookiecutter 15 | .. _`cookiecutter-tornado`: https://github.com/hkage/cookiecutter-tornado 16 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.{py,rst,ini}] 12 | indent_style = space 13 | indent_size = 4 14 | 15 | [*.{html,css,scss,json,yml}] 16 | indent_style = space 17 | indent_size = 2 18 | 19 | [*.md] 20 | trim_trailing_whitespace = false 21 | 22 | [Makefile] 23 | indent_style = tab 24 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.{py,rst,ini}] 12 | indent_style = space 13 | indent_size = 4 14 | 15 | [*.{html,css,scss,json,yml}] 16 | indent_style = space 17 | indent_size = 2 18 | 19 | [*.md] 20 | trim_trailing_whitespace = false 21 | 22 | [Makefile] 23 | indent_style = tab 24 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/Dockerfile: -------------------------------------------------------------------------------- 1 | {%- set python_versions = cookiecutter.python_versions.split(",") -%} 2 | FROM python:{{ python_versions[-1] }}-alpine 3 | 4 | LABEL maintainer="{{ cookiecutter.author_name }} <{{ cookiecutter.email }}>" 5 | 6 | USER root 7 | 8 | WORKDIR /app 9 | ADD . /app/ 10 | 11 | RUN apk --update add --no-cache git \ 12 | && pip install wheel \ 13 | && pip install -r requirements.txt \ 14 | && rm -rf /var/lib/apt/lists/* \ 15 | && rm -rf /var/cache/apk/* 16 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/Vagrantfile: -------------------------------------------------------------------------------- 1 | # -*- mode: ruby -*- 2 | # vi: set ft=ruby : 3 | 4 | Vagrant.configure("2") do |config| 5 | config.vm.define "{{ cookiecutter.package_name }}" 6 | config.vm.box = "maier/alpine-3.8-x86_64" 7 | config.vm.box_version = '3.8.1' 8 | config.vm.network :forwarded_port, guest: 8000, host: 8000, id: "{{ cookiecutter.package_name }}" 9 | config.vm.synced_folder ".", "/home/vagrant" 10 | config.vm.provider "virtualbox" do |vb| 11 | vb.memory = 256 12 | vb.cpus = 1 13 | end 14 | config.vm.provision :shell, :path => "bootstrap.sh" 15 | end 16 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/docs/source/index.rst: -------------------------------------------------------------------------------- 1 | .. {{ cookiecutter.project_name }} documentation master file, created by 2 | sphinx-quickstart on Fri Aug 26 11:29:39 2016. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to {{ cookiecutter.project_name }}'s documentation! 7 | =========================================================== 8 | 9 | Contents: 10 | 11 | .. toctree:: 12 | :maxdepth: 2 13 | 14 | 15 | 16 | Indices and tables 17 | ================== 18 | 19 | * :ref:`genindex` 20 | * :ref:`modindex` 21 | * :ref:`search` 22 | 23 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "cookiecutter-tornado" 3 | version = "0.3.0" 4 | description = "Cookiecutter template for Tornado based projects" 5 | authors = ["Henning Kage "] 6 | license = "MIT" 7 | readme = "README.rst" 8 | homepage = "https://github.com/hkage/cookiecutter-tornado" 9 | repository = "https://github.com/hkage/cookiecutter-tornado.git" 10 | 11 | [tool.poetry.dependencies] 12 | python = "^3.7" 13 | 14 | [tool.poetry.dev-dependencies] 15 | cookiecutter = "^2.1.1" 16 | flake8 = "^4.0.1" 17 | pytest = ">=7.1.2" 18 | pytest-cookies = "^0.6.1" 19 | 20 | [build-system] 21 | requires = ["poetry>=1.14"] 22 | build-backend = "poetry.masonry.api" 23 | -------------------------------------------------------------------------------- /hooks/pre_gen_project.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """Pre generation script""" 4 | 5 | import logging 6 | import os 7 | import sys 8 | 9 | logging.basicConfig(level=logging.DEBUG) 10 | logger = logging.getLogger('pre_gen_project') 11 | 12 | 13 | PROJECT_DIRECTORY = os.path.realpath(os.path.curdir) 14 | SUPPORTED_PYTHON_VERSIONS = ('3.6', '3.7', '3.8', '3.9', '3.10') 15 | 16 | python_versions = [version.strip() for version in '{{ cookiecutter.python_versions }}'.split(',')] 17 | 18 | 19 | for version in python_versions: 20 | if version not in SUPPORTED_PYTHON_VERSIONS: 21 | logger.error('Python %s is not supported (options are: %s)', version, ', '.join(SUPPORTED_PYTHON_VERSIONS)) 22 | sys.exit(1) 23 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/run.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """Basic run script""" 5 | 6 | import tornado.httpserver 7 | import tornado.ioloop 8 | import tornado.options 9 | import tornado.web 10 | import tornado.autoreload 11 | from tornado.options import options 12 | import tornado.web 13 | 14 | from settings import settings 15 | from {{ cookiecutter.package_name }}.urls import url_patterns 16 | 17 | 18 | class TornadoApplication(tornado.web.Application): 19 | 20 | def __init__(self): 21 | tornado.web.Application.__init__(self, url_patterns, **settings) 22 | 23 | 24 | def main(): 25 | app = TornadoApplication() 26 | app.listen(options.port) 27 | tornado.ioloop.IOLoop.current().start() 28 | 29 | 30 | if __name__ == "__main__": 31 | main() 32 | -------------------------------------------------------------------------------- /cookiecutter.json: -------------------------------------------------------------------------------- 1 | { 2 | "author_name": "Your name", 3 | "email": "Your e-mail", 4 | "project_name": "project_name", 5 | "repo_name": "{{ cookiecutter.project_name|lower|replace(' ', '-') }}", 6 | "package_name": "{{ cookiecutter.repo_name|lower|replace('-', '_') }}", 7 | "github_username": "yourname", 8 | "description": "A short description of the project", 9 | "version": "0.1.0", 10 | "python_versions": "3.6,3.7,3.8,3.9,3.10", 11 | "use_pytest": ["Yes", "No"], 12 | "use_tox": ["Yes", "No"], 13 | "use_docker": ["Yes", "No"], 14 | "use_vagrant": ["Yes", "No"], 15 | "use_i18n": ["Yes", "No"], 16 | "max_line_length": 120, 17 | "open_source_license": ["MIT license", "BSD license", "ISC license", "Apache Software License 2.0", "GNU General Public License v3", "Not open source"] 18 | } 19 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/settings.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """Global settings for the project""" 4 | 5 | import os.path 6 | 7 | from tornado.options import define 8 | 9 | 10 | define("port", default=8000, help="run on the given port", type=int) 11 | define("config", default=None, help="tornado config file") 12 | define("debug", default=False, help="debug mode") 13 | 14 | __BASE_PACKAGE__ = "{{ cookiecutter.package_name }}" 15 | 16 | settings = {} 17 | 18 | settings["debug"] = True 19 | settings["cookie_secret"] = "!!CHANGEME!!" 20 | settings["login_url"] = "/login" 21 | settings["static_path"] = os.path.join(os.path.dirname(__file__), __BASE_PACKAGE__, "static") 22 | settings["template_path"] = os.path.join(os.path.dirname(__file__), __BASE_PACKAGE__, "templates") 23 | settings["xsrf_cookies"] = False 24 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/tox.ini: -------------------------------------------------------------------------------- 1 | {%- set python_versions = cookiecutter.python_versions.split(",") -%} 2 | [tox] 3 | envlist = flake8{% for version in python_versions %},py{{ version|trim|replace(".", "") }}{% endfor %} 4 | 5 | [testenv:flake8] 6 | deps=flake8 7 | commands=flake8 {{ cookiecutter.package_name }} 8 | 9 | [testenv] 10 | setenv = 11 | PYTHONPATH = {toxinidir} 12 | deps = 13 | -r{toxinidir}/requirements/dev.txt 14 | commands = 15 | pip install -U pip 16 | py.test --basetemp={envtmpdir} 17 | 18 | ; If you want to make tox run the tests with the same versions, create a 19 | ; requirements.txt with the pinned versions and uncomment the following lines: 20 | ; deps = 21 | ; -r{toxinidir}/requirements.txt 22 | 23 | [flake8] 24 | exclude = docs,.tox,.git,.eggs 25 | max-line-length = {{ cookiecutter.max_line_length }} 26 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/{{cookiecutter.package_name}}/templates/base.html: -------------------------------------------------------------------------------- 1 | {% raw %} 2 | 3 | 4 | 5 | {% block title %}{% end %} 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 |

Hello world! This is HTML5 Boilerplate.

16 | 17 | 18 | {% endraw %} 19 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/setup.cfg: -------------------------------------------------------------------------------- 1 | [aliases] 2 | release = sdist bdist_wheel 3 | test = pytest 4 | 5 | [wheel] 6 | universal = 1 7 | 8 | {%- if cookiecutter.use_i18n == "Yes" %} 9 | [extract_messages] 10 | input_dirs = {{ cookiecutter.package_name }} 11 | output-file = {{ cookiecutter.package_name }}/locale/{{ cookiecutter.package_name }}.pot 12 | width = 120 13 | 14 | [init_catalog] 15 | domain = {{ cookiecutter.package_name }} 16 | input-file = {{ cookiecutter.package_name }}/locale/{{ cookiecutter.package_name }}.pot 17 | output_dir = {{ cookiecutter.package_name }}/locale 18 | 19 | [update_catalog] 20 | domain = {{ cookiecutter.package_name }} 21 | input-file = {{ cookiecutter.package_name }}/locale/{{ cookiecutter.package_name }}.pot 22 | output_dir = {{ cookiecutter.package_name }}/locale 23 | 24 | [compile_catalog] 25 | directory = {{ cookiecutter.package_name }}/locale 26 | domain = {{ cookiecutter.package_name }} 27 | statistics = True 28 | {%- endif %} 29 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/fabfile.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | import os 5 | import sys 6 | sys.path.insert(0, os.getcwd()) 7 | 8 | from fabric.api import * # noqa 9 | 10 | 11 | CMD_PYLINT = 'pylint' 12 | 13 | 14 | @task 15 | def vagrant(): 16 | """Vagrant environment""" 17 | env.environment = 'local' 18 | env.user = 'vagrant' 19 | env.hosts = ['127.0.0.1:2222'] 20 | result = local('vagrant ssh-config | grep IdentityFile', capture=True) 21 | env.key_filename = result.split()[1] 22 | 23 | 24 | @task 25 | def clean(): 26 | """Remove temporary files.""" 27 | for root, dirs, files in os.walk('.'): 28 | for name in files: 29 | if name.endswith('.pyc') or name.endswith('~'): 30 | os.remove(os.path.join(root, name)) 31 | 32 | 33 | @task 34 | def devserver(port=8888, logging='error'): 35 | """Start the server in development mode.""" 36 | run('python3 run.py --port=%s --logging=%s' % (port, logging)) 37 | -------------------------------------------------------------------------------- /LICENSE.rst: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016-2022, Henning Kage 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software is furnished to do so, 8 | subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 15 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 16 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 17 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 18 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 19 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # !/usr/bin/env python 2 | 3 | from distutils.core import setup 4 | 5 | setup( 6 | name='cookiecutter-tornado', 7 | packages=[], 8 | version='0.3.0', 9 | description='Cookiecutter template for Tornado based projects', 10 | author='Henning Kage', 11 | author_email='henning.kage@gmail.com', 12 | url='https://github.com/hkage/cookiecutter-tornado', 13 | keywords=['cookiecutter', 'template', 'tornado', ], 14 | classifiers=[ 15 | 'Development Status :: 4 - Beta', 16 | 'Environment :: Console', 17 | 'Intended Audience :: Developers', 18 | 'Natural Language :: English', 19 | 'License :: OSI Approved :: MIT License', 20 | 'Programming Language :: Python', 21 | 'Programming Language :: Python :: 3', 22 | 'Programming Language :: Python :: 3.6', 23 | 'Programming Language :: Python :: 3.7', 24 | 'Programming Language :: Python :: 3.8', 25 | 'Programming Language :: Python :: 3.9', 26 | 'Programming Language :: Python :: 3.10', 27 | 'Programming Language :: Python :: Implementation :: CPython', 28 | 'Programming Language :: Python :: Implementation :: PyPy', 29 | 'Topic :: Software Development', 30 | ], 31 | ) 32 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | 3 | on: [push] 4 | 5 | jobs: 6 | 7 | testing: 8 | runs-on: ubuntu-latest 9 | strategy: 10 | max-parallel: 4 11 | matrix: 12 | python-version: ['3.6', '3.7', '3.8', '3.9', '3.10'] 13 | 14 | steps: 15 | - uses: actions/checkout@v1 16 | 17 | - name: Set up Python ${{ matrix.python-version }} 18 | uses: actions/setup-python@v2 19 | with: 20 | python-version: ${{ matrix.python-version }} 21 | 22 | - name: Install poetry 23 | run: | 24 | curl -fsS -o get-poetry.py https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py 25 | python get-poetry.py -y 26 | 27 | - name: Configure poetry 28 | run: | 29 | source $HOME/.poetry/env 30 | poetry config virtualenvs.in-project true 31 | 32 | - name: Set up cache 33 | uses: actions/cache@v1 34 | id: cache 35 | with: 36 | path: .venv 37 | key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }} 38 | 39 | - name: Ensure cache is healthy 40 | if: steps.cache.outputs.cache-hit == 'true' 41 | run: poetry run pip --version >/dev/null 2>&1 || rm -rf .venv 42 | 43 | - name: Install dependencies 44 | run: | 45 | source $HOME/.poetry/env 46 | poetry install 47 | 48 | - name: Test with pytest 49 | run: | 50 | source $HOME/.poetry/env 51 | poetry run pytest -q tests 52 | 53 | - name: Lint with flake8 54 | run: | 55 | source $HOME/.poetry/env 56 | poetry run flake8 57 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | Changelog 2 | === 3 | 4 | Development 5 | --- 6 | 7 | 0.3.0 (2021-xx-xx) 8 | --- 9 | * Bumped Tornado version to 6 10 | * Dropped Python 2.7 support 11 | * Dropped Python 3.5 support 12 | * Use [poetry](https://python-poetry.org/) for requirement management 13 | * Added isort configuration 14 | * Added changelog and manifest file 15 | * Added internalization (i18n) support 16 | * Removed bumpversion support 17 | 18 | 0.2.5 (2019-06-06) 19 | --- 20 | * Remove duplicated classifiers entry in setup parameters (thanks to stephendwolff) 21 | 22 | 0.2.4 (2018-03-18) 23 | --- 24 | * Fixed project description for GPL projects (thanks to bwrsandman) 25 | 26 | 0.2.3 (2017-11-07) 27 | --- 28 | * Bumped Tornado version to 4.5.2 29 | 30 | 0.2.2 (2017-05-12) 31 | --- 32 | * Bumped Tornado version to 4.5.1 33 | * Made copyright for the Sphix documentation variable 34 | * Remove all Docker related files 35 | * Refactored some tests 36 | * Make bumpversion optional within the setup.cfg 37 | * Remove bootstrap.sh if Vagrant support has been disabled 38 | 39 | 0.2.1 (2017-03-15) 40 | --- 41 | * Made pytest optional within the template's setup.py 42 | * Added classifiers to the setup.py 43 | * Made the license dynamic within the setup.py's classifiers 44 | 45 | 0.2.0 (2017-03-14) 46 | --- 47 | * #2: Changed the boilerplate to a Cookiecutter template 48 | * Added tox file for testing 49 | * Added .editorconfig 50 | * Added Sphinx documentation 51 | * Added bumpversion support 52 | * Added docker-compose file 53 | * Fixed Vagrant setup 54 | 55 | 0.1.1 (2016-01-11) 56 | --- 57 | 58 | * #1: Added Docker support 59 | * Added changelog file 60 | * Updated the HTML boilerplate code 61 | 62 | 0.1.0 (2016-01-07) 63 | --- 64 | * Initial release 65 | -------------------------------------------------------------------------------- /hooks/post_gen_project.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """Post generation script""" 4 | 5 | import os 6 | import random 7 | import shutil 8 | import string 9 | 10 | PROJECT_DIRECTORY = os.path.realpath(os.path.curdir) 11 | DOCKER_FILES = ('Dockerfile', '.dockerignore', 'docker-compose.yml') 12 | VAGRANT_FILES = ('Vagrantfile', 'bootstrap.sh') 13 | 14 | 15 | def generate_random_string(length=25, allowed_chars=string.ascii_letters + string.digits): 16 | """ 17 | Generate a random string. 18 | 19 | :param length: The length of the desired string 20 | :type length: int 21 | :param allowed_chars: The set of allowed characters 22 | :type allowed_chars: str 23 | :returns: Random string 24 | :rtype: str 25 | """ 26 | return ''.join(map(lambda x: random.choice(allowed_chars), range(length))) 27 | 28 | 29 | def remove_file(filepath): 30 | """ 31 | Remove a file with the given path. 32 | 33 | :param str filepath: Path of the file. 34 | """ 35 | os.remove(os.path.join(PROJECT_DIRECTORY, filepath)) 36 | 37 | 38 | def set_cookie_secret(project_directory): 39 | """ 40 | Open the settings and generate a secure cookie secret. 41 | 42 | :param str project_directory: Path of the project directory. 43 | """ 44 | project_settings_file = os.path.join(project_directory, 'settings.py') 45 | with open(project_settings_file) as f: 46 | file_ = f.read() 47 | file_ = file_.replace('!!CHANGEME!!', generate_random_string()) 48 | with open(project_settings_file, 'w') as f: 49 | f.write(file_) 50 | 51 | 52 | if __name__ == '__main__': 53 | if '{{ cookiecutter.use_docker }}' != 'Yes': 54 | for filename in DOCKER_FILES: 55 | remove_file(filename) 56 | 57 | if '{{ cookiecutter.use_vagrant }}' != 'Yes': 58 | for filename in VAGRANT_FILES: 59 | remove_file(filename) 60 | 61 | if '{{ cookiecutter.use_tox }}' != 'Yes': 62 | remove_file('tox.ini') 63 | 64 | if '{{ cookiecutter.use_pytest }}' != 'Yes': 65 | remove_file('pytest.ini') 66 | 67 | if '{{ cookiecutter.use_i18n }}' != 'Yes': 68 | shutil.rmtree('{{ cookiecutter.package_name }}/locale', ignore_errors=True) 69 | 70 | # Replace the cookie secret 71 | set_cookie_secret(PROJECT_DIRECTORY) 72 | -------------------------------------------------------------------------------- /tests/test_bake_project.py: -------------------------------------------------------------------------------- 1 | """Tests for the cookiecutter template.""" 2 | 3 | from contextlib import contextmanager 4 | 5 | import pytest 6 | from cookiecutter.utils import rmtree 7 | 8 | 9 | YES_NO_CHOICES = [ 10 | ('Yes', True), 11 | ('No', False), 12 | ] 13 | 14 | 15 | @contextmanager 16 | def bake_in_temp_dir(cookies, *args, **kwargs): 17 | extra_context = kwargs.setdefault('extra_context', {}) 18 | extra_context.setdefault('project_name', 'myproject') 19 | result = cookies.bake(*args, **kwargs) 20 | try: 21 | yield result 22 | finally: 23 | rmtree(str(result.project_path)) 24 | 25 | 26 | def test_bake_project_with_defaults(cookies): 27 | with bake_in_temp_dir(cookies) as result: 28 | assert result.exit_code == 0 29 | assert result.exception is None 30 | assert result.project_path.is_dir() 31 | found_toplevel_files = [f.name for f in result.project_path.iterdir()] 32 | assert 'setup.py' in found_toplevel_files 33 | assert 'tox.ini' in found_toplevel_files 34 | assert 'Dockerfile' in found_toplevel_files 35 | assert 'tests' in found_toplevel_files 36 | 37 | 38 | @pytest.mark.parametrize('with_docker_support, expected_result', YES_NO_CHOICES) 39 | def test_docker_support(cookies, with_docker_support, expected_result): 40 | with bake_in_temp_dir(cookies, extra_context={'use_docker': with_docker_support}) as result: 41 | found_toplevel_files = [f.name for f in result.project_path.iterdir()] 42 | assert ('Dockerfile' in found_toplevel_files) == expected_result 43 | 44 | 45 | @pytest.mark.parametrize('with_vagrant_support, expected_result', YES_NO_CHOICES) 46 | def test_vagrant_support(cookies, with_vagrant_support, expected_result): 47 | with bake_in_temp_dir(cookies, extra_context={'use_vagrant': with_vagrant_support}) as result: 48 | found_toplevel_files = [f.name for f in result.project_path.iterdir()] 49 | assert ('Vagrantfile' in found_toplevel_files) == expected_result 50 | 51 | 52 | @pytest.mark.parametrize('with_pytest_support, expected_result', YES_NO_CHOICES) 53 | def test_pytest_support(cookies, with_pytest_support, expected_result): 54 | with bake_in_temp_dir(cookies, extra_context={'use_pytest': with_pytest_support}) as result: 55 | found_toplevel_files = [f.name for f in result.project_path.iterdir()] 56 | assert ('pytest.ini' in found_toplevel_files) == expected_result 57 | 58 | 59 | @pytest.mark.parametrize('with_tox_support, expected_result', YES_NO_CHOICES) 60 | def test_tox_support(cookies, with_tox_support, expected_result): 61 | with bake_in_temp_dir(cookies, extra_context={'use_tox': with_tox_support}) as result: 62 | found_toplevel_files = [f.name for f in result.project_path.iterdir()] 63 | assert ('tox.ini' in found_toplevel_files) == expected_result 64 | 65 | 66 | def test_cookie_secret_has_been_generated(cookies): 67 | with bake_in_temp_dir(cookies) as result: 68 | settings_file = result.project_path.joinpath('settings.py') 69 | settings_lines = settings_file.read_text() 70 | assert '!!CHANGEME!!' not in settings_lines 71 | 72 | 73 | def test_without_internationalization(cookies): 74 | with bake_in_temp_dir( 75 | cookies, 76 | extra_context={'use_i18n': 'No'} 77 | ) as result: 78 | assert result.project_path.joinpath('myproject/locale').is_dir() is False 79 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | Tornado Cookiecutter template 2 | ============================= 3 | 4 | .. class:: no-web no-pdf 5 | 6 | |license| |build| 7 | 8 | .. contents:: 9 | 10 | .. section-numbering:: 11 | 12 | This is my cookiecutter template to build a simple, fast and rock solid website based upon 13 | the Tornado_ framework. There are quite many Tornado templates out there, 14 | but I wanted to start something from scratch, that fits my needs and evolves out 15 | of years of experiences (positive and negative alike) with other Python based webframeworks 16 | like Turbogears and Django. 17 | 18 | Of course this template is not designed for larger data structures. The main 19 | focus is on scalability, fast data access and small library dependencies. 20 | 21 | Features 22 | -------- 23 | 24 | * Configurable as a Cookiecutter_ template 25 | * Basic HTML5 Boilerplate_ 26 | * (Optional) pytest 27 | * (Optional) tox 28 | * (Optional) Docker support 29 | * (Optional) Vagrant support 30 | * (Optional) Internationalization (i18n) support 31 | 32 | Usage 33 | ----- 34 | 35 | Install Cookiecutter_ :: 36 | 37 | $ pip install cookiecutter 38 | 39 | Initialize the project with cookiecutter and answer some questions for the newly started project:: 40 | 41 | $ cookiecutter https://github.com/hkage/cookiecutter-tornado 42 | 43 | Template development 44 | ----------------------- 45 | 46 | If you decide to contribute to this cookiecutter template, feel free to fork it and make a pull request. To start with 47 | the development of this template, you need to install some Python requirements:: 48 | 49 | [sudo] pip install poetry 50 | 51 | After that simply let pipenv install all requirements:: 52 | 53 | $ poetry install 54 | 55 | To activate the virtual environment, simply call:: 56 | 57 | $ poetry shell 58 | 59 | Now you are able to run the tests for this template:: 60 | 61 | $ py.test 62 | 63 | In addition to that you can install tox to test the template against different Python versions:: 64 | 65 | $ [sudo] pip install tox 66 | 67 | And then run the tests with:: 68 | 69 | $ tox 70 | 71 | Tornado project development 72 | --------------------------- 73 | 74 | Testing 75 | ~~~~~~~ 76 | 77 | All tests will be added to the `tests` directory, whether you are using pytest for testing or other tools like nose- or unittests. 78 | 79 | pytest 80 | ****** 81 | 82 | With pytest you will be able to run the tests with:: 83 | 84 | $ py.test 85 | 86 | Running the application 87 | ~~~~~~~~~~~~~~~~~~~~~~~ 88 | 89 | To start the final application, just run the following fabric command:: 90 | 91 | $ fab devserver 92 | 93 | This will tell Tornado to start the application with the default port 8888. If 94 | you want to use another port, just type:: 95 | 96 | $ fab devserver:port=8000 97 | 98 | In addition to that, see the fabfile.py Script for other parameters and 99 | commands. 100 | 101 | Vagrant 102 | ******* 103 | 104 | To run the server within a Vagrant VM, you need to install Vagrant 1.7.x and the 105 | Vagrant Alpine plugin:: 106 | 107 | $ vagrant plugin install vagrant-alpine 108 | 109 | After that you can start the development server with the following command:: 110 | 111 | $ vagrant up 112 | $ fab vagrant devserver 113 | 114 | You can now access your application via `http://localhost:8000` 115 | 116 | Docker 117 | ****** 118 | 119 | Install docker and docker compose in the latest version. Then start the tornado 120 | project with docker-compose:: 121 | 122 | $ docker-compose up 123 | 124 | You can now access your application via `http://localhost:8000` 125 | 126 | .. _Tornado: http://www.tornadoweb.org/ 127 | .. _Cookiecutter: https://github.com/audreyr/cookiecutter 128 | .. _Boilerplate: https://html5boilerplate.com/ 129 | 130 | .. |license| image:: https://img.shields.io/badge/license-MIT-green.svg 131 | :target: https://github.com/hkage/cookiecutter-tornado/blob/development/LICENSE.rst 132 | 133 | .. |build| image:: https://github.com/hkage/cookiecutter-tornado//workflows/Test/badge.svg 134 | :target: https://github.com/hkage/cookiecutter-tornado//actions 135 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/setup.py: -------------------------------------------------------------------------------- 1 | {%- set python_versions = cookiecutter.python_versions.split(",") -%} 2 | #!/usr/bin/env python 3 | 4 | # -*- coding: utf-8 -*- 5 | 6 | from __future__ import unicode_literals 7 | 8 | import distutils 9 | import subprocess 10 | from os.path import dirname, join 11 | 12 | from setuptools import find_packages, setup 13 | {%- if cookiecutter.use_i18n == "Yes" %} 14 | from setuptools.command.sdist import sdist 15 | from wheel.bdist_wheel import bdist_wheel 16 | {%- endif %} 17 | 18 | 19 | def read(*args): 20 | return open(join(dirname(__file__), *args)).read() 21 | 22 | {%- if cookiecutter.use_tox == "Yes" %} 23 | 24 | class ToxTestCommand(distutils.cmd.Command): 25 | """Distutils command to run tests via tox with 'python setup.py test'. 26 | 27 | Please note that in our standard configuration tox uses the dependencies in 28 | `requirements/dev.txt`, the list of dependencies in `tests_require` in 29 | `setup.py` is ignored! 30 | 31 | See https://docs.python.org/3/distutils/apiref.html#creating-a-new-distutils-command 32 | for more documentation on custom distutils commands. 33 | """ 34 | description = "Run tests via 'tox'." 35 | user_options = [] 36 | 37 | def initialize_options(self): 38 | pass 39 | 40 | def finalize_options(self): 41 | pass 42 | 43 | def run(self): 44 | self.announce("Running tests with 'tox'...", level=distutils.log.INFO) 45 | return subprocess.call(['tox']) 46 | {%- endif %} 47 | 48 | {%- if cookiecutter.use_i18n == "Yes" %} 49 | 50 | 51 | def compile_translations(self): 52 | """ 53 | Wrapper around the `run` method of distutils or setuptools commands. 54 | 55 | The method creates the compiled translation files before the `run` method of the superclass is run. 56 | """ 57 | self.announce("Compiling translations", level=distutils.log.INFO) 58 | self.run_command('compile_catalog') 59 | super(self.__class__, self).run() 60 | 61 | 62 | def command_factory(name, base_class, wrapper_method): 63 | """Factory method to create a distutils or setuptools command with a patched `run` method.""" 64 | return type(str(name), (base_class, object), {'run': wrapper_method}) 65 | {%- endif %} 66 | 67 | 68 | exec(open('{{ cookiecutter.package_name }}/version.py').read()) 69 | 70 | {%- set license_classifiers = { 71 | 'MIT license': 'License :: OSI Approved :: MIT License', 72 | 'BSD license': 'License :: OSI Approved :: BSD License', 73 | 'ISC license': 'License :: OSI Approved :: ISC License (ISCL)', 74 | 'Apache Software License 2.0': 'License :: OSI Approved :: Apache Software License', 75 | 'GNU General Public License v3': 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)' 76 | } %} 77 | 78 | install_requires = [ 79 | ] 80 | 81 | tests_require = [ 82 | 'coverage', 83 | 'flake8', 84 | 'pydocstyle', 85 | 'pylint', 86 | {% if cookiecutter.use_pytest == "Yes" -%} 87 | 'pytest-pep8', 88 | 'pytest-cov', 89 | # for pytest-runner to work, it is important that pytest comes last in 90 | # this list: https://github.com/pytest-dev/pytest-runner/issues/11 91 | 'pytest'{%- endif %} 92 | ] 93 | 94 | exec(read('{{ cookiecutter.package_name }}', 'version.py')) 95 | 96 | 97 | setup(name='{{ cookiecutter.project_name }}', 98 | version=__version__, # noqa 99 | description='{{ cookiecutter.description }}', 100 | long_description=read('README.rst'), 101 | author='{{ cookiecutter.author_name }}', 102 | author_email='{{ cookiecutter.email }}', 103 | url='https://github.com/{{ cookiecutter.github_username }}/{{ cookiecutter.repo_name }}', 104 | classifiers=[ 105 | 'Development Status :: 2 - Alpha', 106 | 'Intended Audience :: Developers', 107 | {%- if cookiecutter.open_source_license in license_classifiers %} 108 | '{{ license_classifiers[cookiecutter.open_source_license] }}', 109 | {%- endif %} 110 | 'Natural Language :: English', 111 | 'Programming Language :: Python', 112 | {% for version in python_versions -%} 113 | 'Programming Language :: Python :: {{ version|trim }}', 114 | {% endfor -%} 115 | 'Topic :: Internet' 116 | ], 117 | include_package_data=True, 118 | install_requires=install_requires, 119 | packages=find_packages(include=['{{ cookiecutter.package_name }}*']), 120 | test_suite='tests', 121 | setup_requires=['pytest-runner'], 122 | tests_require=tests_require, 123 | cmdclass={ 124 | {%- if cookiecutter.use_tox == "Yes" %} 125 | 'test': ToxTestCommand, 126 | {%- endif %} 127 | {%- if cookiecutter.use_i18n == "Yes" %} 128 | 'sdist': command_factory('SDistCommand', sdist, compile_translations), 129 | 'bdist_wheel': command_factory('BDistWheelCommand', bdist_wheel, compile_translations), 130 | {%- endif %} 131 | } 132 | ) 133 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/LICENSE: -------------------------------------------------------------------------------- 1 | {% if cookiecutter.open_source_license == 'MIT license' %} 2 | MIT License 3 | 4 | Copyright (c) {% now 'local', '%Y' %}, {{ cookiecutter.author_name }} 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 7 | 8 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 9 | 10 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 11 | {% elif cookiecutter.open_source_license == 'BSD license' %} 12 | BSD License 13 | 14 | Copyright (c) {% now 'local', '%Y' %}, {{ cookiecutter.author_name }} 15 | All rights reserved. 16 | 17 | Redistribution and use in source and binary forms, with or without modification, 18 | are permitted provided that the following conditions are met: 19 | 20 | * Redistributions of source code must retain the above copyright notice, this 21 | list of conditions and the following disclaimer. 22 | 23 | * Redistributions in binary form must reproduce the above copyright notice, this 24 | list of conditions and the following disclaimer in the documentation and/or 25 | other materials provided with the distribution. 26 | 27 | * Neither the name of the copyright holder nor the names of its 28 | contributors may be used to endorse or promote products derived from this 29 | software without specific prior written permission. 30 | 31 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 32 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 33 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 34 | IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 35 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 36 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 37 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 38 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 39 | OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 40 | OF THE POSSIBILITY OF SUCH DAMAGE. 41 | {% elif cookiecutter.open_source_license == 'ISC license' %} 42 | ISC License 43 | 44 | Copyright (c) {% now 'local', '%Y' %}, {{ cookiecutter.author_name }} 45 | 46 | Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. 47 | 48 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 49 | {% elif cookiecutter.open_source_license == 'Apache Software License 2.0' %} 50 | Apache Software License 2.0 51 | 52 | Copyright (c) {% now 'local', '%Y' %}, {{ cookiecutter.author_name }} 53 | 54 | Licensed under the Apache License, Version 2.0 (the "License"); 55 | you may not use this file except in compliance with the License. 56 | You may obtain a copy of the License at 57 | 58 | http://www.apache.org/licenses/LICENSE-2.0 59 | 60 | Unless required by applicable law or agreed to in writing, software 61 | distributed under the License is distributed on an "AS IS" BASIS, 62 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 63 | See the License for the specific language governing permissions and 64 | limitations under the License. 65 | {% elif cookiecutter.open_source_license == 'GNU General Public License v3' %} 66 | GNU GENERAL PUBLIC LICENSE 67 | Version 3, 29 June 2007 68 | 69 | {{ cookiecutter.description }} 70 | Copyright (C) {% now 'local', '%Y' %} {{ cookiecutter.author_name }} 71 | 72 | This program is free software: you can redistribute it and/or modify 73 | it under the terms of the GNU General Public License as published by 74 | the Free Software Foundation, either version 3 of the License, or 75 | (at your option) any later version. 76 | 77 | This program is distributed in the hope that it will be useful, 78 | but WITHOUT ANY WARRANTY; without even the implied warranty of 79 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 80 | GNU General Public License for more details. 81 | 82 | You should have received a copy of the GNU General Public License 83 | along with this program. If not, see . 84 | 85 | Also add information on how to contact you by electronic and paper mail. 86 | 87 | You should also get your employer (if you work as a programmer) or school, 88 | if any, to sign a "copyright disclaimer" for the program, if necessary. 89 | For more information on this, and how to apply and follow the GNU GPL, see 90 | . 91 | 92 | The GNU General Public License does not permit incorporating your program 93 | into proprietary programs. If your program is a subroutine library, you 94 | may consider it more useful to permit linking proprietary applications with 95 | the library. If this is what you want to do, use the GNU Lesser General 96 | Public License instead of this License. But first, please read 97 | . 98 | 99 | {% endif %} 100 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/docs/Makefile: -------------------------------------------------------------------------------- 1 | # Makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | PAPER = 8 | BUILDDIR = build 9 | 10 | # Internal variables. 11 | PAPEROPT_a4 = -D latex_paper_size=a4 12 | PAPEROPT_letter = -D latex_paper_size=letter 13 | ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source 14 | # the i18n builder cannot share the environment and doctrees with the others 15 | I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source 16 | 17 | .PHONY: help 18 | help: 19 | @echo "Please use \`make ' where is one of" 20 | @echo " html to make standalone HTML files" 21 | @echo " dirhtml to make HTML files named index.html in directories" 22 | @echo " singlehtml to make a single large HTML file" 23 | @echo " pickle to make pickle files" 24 | @echo " json to make JSON files" 25 | @echo " htmlhelp to make HTML files and a HTML help project" 26 | @echo " qthelp to make HTML files and a qthelp project" 27 | @echo " applehelp to make an Apple Help Book" 28 | @echo " devhelp to make HTML files and a Devhelp project" 29 | @echo " epub to make an epub" 30 | @echo " epub3 to make an epub3" 31 | @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" 32 | @echo " latexpdf to make LaTeX files and run them through pdflatex" 33 | @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" 34 | @echo " text to make text files" 35 | @echo " man to make manual pages" 36 | @echo " texinfo to make Texinfo files" 37 | @echo " info to make Texinfo files and run them through makeinfo" 38 | @echo " gettext to make PO message catalogs" 39 | @echo " changes to make an overview of all changed/added/deprecated items" 40 | @echo " xml to make Docutils-native XML files" 41 | @echo " pseudoxml to make pseudoxml-XML files for display purposes" 42 | @echo " linkcheck to check all external links for integrity" 43 | @echo " doctest to run all doctests embedded in the documentation (if enabled)" 44 | @echo " coverage to run coverage check of the documentation (if enabled)" 45 | @echo " dummy to check syntax errors of document sources" 46 | 47 | .PHONY: clean 48 | clean: 49 | rm -rf $(BUILDDIR)/* 50 | 51 | .PHONY: html 52 | html: 53 | $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html 54 | @echo 55 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." 56 | 57 | .PHONY: dirhtml 58 | dirhtml: 59 | $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml 60 | @echo 61 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." 62 | 63 | .PHONY: singlehtml 64 | singlehtml: 65 | $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml 66 | @echo 67 | @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." 68 | 69 | .PHONY: pickle 70 | pickle: 71 | $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle 72 | @echo 73 | @echo "Build finished; now you can process the pickle files." 74 | 75 | .PHONY: json 76 | json: 77 | $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json 78 | @echo 79 | @echo "Build finished; now you can process the JSON files." 80 | 81 | .PHONY: htmlhelp 82 | htmlhelp: 83 | $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp 84 | @echo 85 | @echo "Build finished; now you can run HTML Help Workshop with the" \ 86 | ".hhp project file in $(BUILDDIR)/htmlhelp." 87 | 88 | .PHONY: qthelp 89 | qthelp: 90 | $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp 91 | @echo 92 | @echo "Build finished; now you can run "qcollectiongenerator" with the" \ 93 | ".qhcp project file in $(BUILDDIR)/qthelp, like this:" 94 | @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/project_name.qhcp" 95 | @echo "To view the help file:" 96 | @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/project_name.qhc" 97 | 98 | .PHONY: applehelp 99 | applehelp: 100 | $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp 101 | @echo 102 | @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." 103 | @echo "N.B. You won't be able to view it unless you put it in" \ 104 | "~/Library/Documentation/Help or install it in your application" \ 105 | "bundle." 106 | 107 | .PHONY: devhelp 108 | devhelp: 109 | $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp 110 | @echo 111 | @echo "Build finished." 112 | @echo "To view the help file:" 113 | @echo "# mkdir -p $$HOME/.local/share/devhelp/project_name" 114 | @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/project_name" 115 | @echo "# devhelp" 116 | 117 | .PHONY: epub 118 | epub: 119 | $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub 120 | @echo 121 | @echo "Build finished. The epub file is in $(BUILDDIR)/epub." 122 | 123 | .PHONY: epub3 124 | epub3: 125 | $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 126 | @echo 127 | @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." 128 | 129 | .PHONY: latex 130 | latex: 131 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 132 | @echo 133 | @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." 134 | @echo "Run \`make' in that directory to run these through (pdf)latex" \ 135 | "(use \`make latexpdf' here to do that automatically)." 136 | 137 | .PHONY: latexpdf 138 | latexpdf: 139 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 140 | @echo "Running LaTeX files through pdflatex..." 141 | $(MAKE) -C $(BUILDDIR)/latex all-pdf 142 | @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." 143 | 144 | .PHONY: latexpdfja 145 | latexpdfja: 146 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 147 | @echo "Running LaTeX files through platex and dvipdfmx..." 148 | $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja 149 | @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." 150 | 151 | .PHONY: text 152 | text: 153 | $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text 154 | @echo 155 | @echo "Build finished. The text files are in $(BUILDDIR)/text." 156 | 157 | .PHONY: man 158 | man: 159 | $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man 160 | @echo 161 | @echo "Build finished. The manual pages are in $(BUILDDIR)/man." 162 | 163 | .PHONY: texinfo 164 | texinfo: 165 | $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo 166 | @echo 167 | @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." 168 | @echo "Run \`make' in that directory to run these through makeinfo" \ 169 | "(use \`make info' here to do that automatically)." 170 | 171 | .PHONY: info 172 | info: 173 | $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo 174 | @echo "Running Texinfo files through makeinfo..." 175 | make -C $(BUILDDIR)/texinfo info 176 | @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." 177 | 178 | .PHONY: gettext 179 | gettext: 180 | $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale 181 | @echo 182 | @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." 183 | 184 | .PHONY: changes 185 | changes: 186 | $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes 187 | @echo 188 | @echo "The overview file is in $(BUILDDIR)/changes." 189 | 190 | .PHONY: linkcheck 191 | linkcheck: 192 | $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck 193 | @echo 194 | @echo "Link check complete; look for any errors in the above output " \ 195 | "or in $(BUILDDIR)/linkcheck/output.txt." 196 | 197 | .PHONY: doctest 198 | doctest: 199 | $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest 200 | @echo "Testing of doctests in the sources finished, look at the " \ 201 | "results in $(BUILDDIR)/doctest/output.txt." 202 | 203 | .PHONY: coverage 204 | coverage: 205 | $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage 206 | @echo "Testing of coverage in the sources finished, look at the " \ 207 | "results in $(BUILDDIR)/coverage/python.txt." 208 | 209 | .PHONY: xml 210 | xml: 211 | $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml 212 | @echo 213 | @echo "Build finished. The XML files are in $(BUILDDIR)/xml." 214 | 215 | .PHONY: pseudoxml 216 | pseudoxml: 217 | $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml 218 | @echo 219 | @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." 220 | 221 | .PHONY: dummy 222 | dummy: 223 | $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy 224 | @echo 225 | @echo "Build finished. Dummy builder generates no files." 226 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | REM Command file for Sphinx documentation 4 | 5 | if "%SPHINXBUILD%" == "" ( 6 | set SPHINXBUILD=sphinx-build 7 | ) 8 | set BUILDDIR=build 9 | set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source 10 | set I18NSPHINXOPTS=%SPHINXOPTS% source 11 | if NOT "%PAPER%" == "" ( 12 | set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% 13 | set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% 14 | ) 15 | 16 | if "%1" == "" goto help 17 | 18 | if "%1" == "help" ( 19 | :help 20 | echo.Please use `make ^` where ^ is one of 21 | echo. html to make standalone HTML files 22 | echo. dirhtml to make HTML files named index.html in directories 23 | echo. singlehtml to make a single large HTML file 24 | echo. pickle to make pickle files 25 | echo. json to make JSON files 26 | echo. htmlhelp to make HTML files and a HTML help project 27 | echo. qthelp to make HTML files and a qthelp project 28 | echo. devhelp to make HTML files and a Devhelp project 29 | echo. epub to make an epub 30 | echo. epub3 to make an epub3 31 | echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter 32 | echo. text to make text files 33 | echo. man to make manual pages 34 | echo. texinfo to make Texinfo files 35 | echo. gettext to make PO message catalogs 36 | echo. changes to make an overview over all changed/added/deprecated items 37 | echo. xml to make Docutils-native XML files 38 | echo. pseudoxml to make pseudoxml-XML files for display purposes 39 | echo. linkcheck to check all external links for integrity 40 | echo. doctest to run all doctests embedded in the documentation if enabled 41 | echo. coverage to run coverage check of the documentation if enabled 42 | echo. dummy to check syntax errors of document sources 43 | goto end 44 | ) 45 | 46 | if "%1" == "clean" ( 47 | for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i 48 | del /q /s %BUILDDIR%\* 49 | goto end 50 | ) 51 | 52 | 53 | REM Check if sphinx-build is available and fallback to Python version if any 54 | %SPHINXBUILD% 1>NUL 2>NUL 55 | if errorlevel 9009 goto sphinx_python 56 | goto sphinx_ok 57 | 58 | :sphinx_python 59 | 60 | set SPHINXBUILD=python -m sphinx.__init__ 61 | %SPHINXBUILD% 2> nul 62 | if errorlevel 9009 ( 63 | echo. 64 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 65 | echo.installed, then set the SPHINXBUILD environment variable to point 66 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 67 | echo.may add the Sphinx directory to PATH. 68 | echo. 69 | echo.If you don't have Sphinx installed, grab it from 70 | echo.http://sphinx-doc.org/ 71 | exit /b 1 72 | ) 73 | 74 | :sphinx_ok 75 | 76 | 77 | if "%1" == "html" ( 78 | %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html 79 | if errorlevel 1 exit /b 1 80 | echo. 81 | echo.Build finished. The HTML pages are in %BUILDDIR%/html. 82 | goto end 83 | ) 84 | 85 | if "%1" == "dirhtml" ( 86 | %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml 87 | if errorlevel 1 exit /b 1 88 | echo. 89 | echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. 90 | goto end 91 | ) 92 | 93 | if "%1" == "singlehtml" ( 94 | %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml 95 | if errorlevel 1 exit /b 1 96 | echo. 97 | echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. 98 | goto end 99 | ) 100 | 101 | if "%1" == "pickle" ( 102 | %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle 103 | if errorlevel 1 exit /b 1 104 | echo. 105 | echo.Build finished; now you can process the pickle files. 106 | goto end 107 | ) 108 | 109 | if "%1" == "json" ( 110 | %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json 111 | if errorlevel 1 exit /b 1 112 | echo. 113 | echo.Build finished; now you can process the JSON files. 114 | goto end 115 | ) 116 | 117 | if "%1" == "htmlhelp" ( 118 | %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp 119 | if errorlevel 1 exit /b 1 120 | echo. 121 | echo.Build finished; now you can run HTML Help Workshop with the ^ 122 | .hhp project file in %BUILDDIR%/htmlhelp. 123 | goto end 124 | ) 125 | 126 | if "%1" == "qthelp" ( 127 | %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp 128 | if errorlevel 1 exit /b 1 129 | echo. 130 | echo.Build finished; now you can run "qcollectiongenerator" with the ^ 131 | .qhcp project file in %BUILDDIR%/qthelp, like this: 132 | echo.^> qcollectiongenerator %BUILDDIR%\qthelp\project_name.qhcp 133 | echo.To view the help file: 134 | echo.^> assistant -collectionFile %BUILDDIR%\qthelp\project_name.ghc 135 | goto end 136 | ) 137 | 138 | if "%1" == "devhelp" ( 139 | %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp 140 | if errorlevel 1 exit /b 1 141 | echo. 142 | echo.Build finished. 143 | goto end 144 | ) 145 | 146 | if "%1" == "epub" ( 147 | %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub 148 | if errorlevel 1 exit /b 1 149 | echo. 150 | echo.Build finished. The epub file is in %BUILDDIR%/epub. 151 | goto end 152 | ) 153 | 154 | if "%1" == "epub3" ( 155 | %SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3 156 | if errorlevel 1 exit /b 1 157 | echo. 158 | echo.Build finished. The epub3 file is in %BUILDDIR%/epub3. 159 | goto end 160 | ) 161 | 162 | if "%1" == "latex" ( 163 | %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex 164 | if errorlevel 1 exit /b 1 165 | echo. 166 | echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. 167 | goto end 168 | ) 169 | 170 | if "%1" == "latexpdf" ( 171 | %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex 172 | cd %BUILDDIR%/latex 173 | make all-pdf 174 | cd %~dp0 175 | echo. 176 | echo.Build finished; the PDF files are in %BUILDDIR%/latex. 177 | goto end 178 | ) 179 | 180 | if "%1" == "latexpdfja" ( 181 | %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex 182 | cd %BUILDDIR%/latex 183 | make all-pdf-ja 184 | cd %~dp0 185 | echo. 186 | echo.Build finished; the PDF files are in %BUILDDIR%/latex. 187 | goto end 188 | ) 189 | 190 | if "%1" == "text" ( 191 | %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text 192 | if errorlevel 1 exit /b 1 193 | echo. 194 | echo.Build finished. The text files are in %BUILDDIR%/text. 195 | goto end 196 | ) 197 | 198 | if "%1" == "man" ( 199 | %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man 200 | if errorlevel 1 exit /b 1 201 | echo. 202 | echo.Build finished. The manual pages are in %BUILDDIR%/man. 203 | goto end 204 | ) 205 | 206 | if "%1" == "texinfo" ( 207 | %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo 208 | if errorlevel 1 exit /b 1 209 | echo. 210 | echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. 211 | goto end 212 | ) 213 | 214 | if "%1" == "gettext" ( 215 | %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale 216 | if errorlevel 1 exit /b 1 217 | echo. 218 | echo.Build finished. The message catalogs are in %BUILDDIR%/locale. 219 | goto end 220 | ) 221 | 222 | if "%1" == "changes" ( 223 | %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes 224 | if errorlevel 1 exit /b 1 225 | echo. 226 | echo.The overview file is in %BUILDDIR%/changes. 227 | goto end 228 | ) 229 | 230 | if "%1" == "linkcheck" ( 231 | %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck 232 | if errorlevel 1 exit /b 1 233 | echo. 234 | echo.Link check complete; look for any errors in the above output ^ 235 | or in %BUILDDIR%/linkcheck/output.txt. 236 | goto end 237 | ) 238 | 239 | if "%1" == "doctest" ( 240 | %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest 241 | if errorlevel 1 exit /b 1 242 | echo. 243 | echo.Testing of doctests in the sources finished, look at the ^ 244 | results in %BUILDDIR%/doctest/output.txt. 245 | goto end 246 | ) 247 | 248 | if "%1" == "coverage" ( 249 | %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage 250 | if errorlevel 1 exit /b 1 251 | echo. 252 | echo.Testing of coverage in the sources finished, look at the ^ 253 | results in %BUILDDIR%/coverage/python.txt. 254 | goto end 255 | ) 256 | 257 | if "%1" == "xml" ( 258 | %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml 259 | if errorlevel 1 exit /b 1 260 | echo. 261 | echo.Build finished. The XML files are in %BUILDDIR%/xml. 262 | goto end 263 | ) 264 | 265 | if "%1" == "pseudoxml" ( 266 | %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml 267 | if errorlevel 1 exit /b 1 268 | echo. 269 | echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. 270 | goto end 271 | ) 272 | 273 | if "%1" == "dummy" ( 274 | %SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy 275 | if errorlevel 1 exit /b 1 276 | echo. 277 | echo.Build finished. Dummy builder generates no files. 278 | goto end 279 | ) 280 | 281 | :end 282 | -------------------------------------------------------------------------------- /{{cookiecutter.repo_name}}/docs/source/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # {{ cookiecutter.project_name }} documentation build configuration file, created by 4 | # sphinx-quickstart on Fri Aug 26 11:29:39 2016. 5 | # 6 | # This file is execfile()d with the current directory set to its 7 | # containing dir. 8 | # 9 | # Note that not all possible configuration values are present in this 10 | # autogenerated file. 11 | # 12 | # All configuration values have a default; values that are commented out 13 | # serve to show the default. 14 | 15 | # If extensions (or modules to document with autodoc) are in another directory, 16 | # add these directories to sys.path here. If the directory is relative to the 17 | # documentation root, use os.path.abspath to make it absolute, like shown here. 18 | # 19 | # import os 20 | # import sys 21 | # sys.path.insert(0, os.path.abspath('.')) 22 | 23 | # -- General configuration ------------------------------------------------ 24 | 25 | # If your documentation needs a minimal Sphinx version, state it here. 26 | # 27 | # needs_sphinx = '1.0' 28 | 29 | # Add any Sphinx extension module names here, as strings. They can be 30 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 31 | # ones. 32 | extensions = [ 33 | 'sphinx.ext.autodoc', 34 | 'sphinx.ext.doctest', 35 | 'sphinx.ext.todo', 36 | 'sphinx.ext.viewcode', 37 | ] 38 | 39 | # Add any paths that contain templates here, relative to this directory. 40 | templates_path = ['_templates'] 41 | 42 | # The suffix(es) of source filenames. 43 | # You can specify multiple suffix as a list of string: 44 | # 45 | # source_suffix = ['.rst', '.md'] 46 | source_suffix = '.rst' 47 | 48 | # The encoding of source files. 49 | # 50 | # source_encoding = 'utf-8-sig' 51 | 52 | # The master toctree document. 53 | master_doc = 'index' 54 | 55 | # General information about the project. 56 | project = u'{{ cookiecutter.project_name }}' 57 | copyright = u'{% now 'local', '%Y' %}, {{ cookiecutter.author_name }}' 58 | author = u'{{ cookiecutter.author_name }}' 59 | 60 | # The version info for the project you're documenting, acts as replacement for 61 | # |version| and |release|, also used in various other places throughout the 62 | # built documents. 63 | # 64 | # The short X.Y version. 65 | version = u'{{ cookiecutter.version }}' 66 | # The full version, including alpha/beta/rc tags. 67 | release = u'{{ cookiecutter.version }}' 68 | 69 | # The language for content autogenerated by Sphinx. Refer to documentation 70 | # for a list of supported languages. 71 | # 72 | # This is also used if you do content translation via gettext catalogs. 73 | # Usually you set "language" from the command line for these cases. 74 | language = None 75 | 76 | # There are two options for replacing |today|: either, you set today to some 77 | # non-false value, then it is used: 78 | # 79 | # today = '' 80 | # 81 | # Else, today_fmt is used as the format for a strftime call. 82 | # 83 | # today_fmt = '%B %d, %Y' 84 | 85 | # List of patterns, relative to source directory, that match files and 86 | # directories to ignore when looking for source files. 87 | # This patterns also effect to html_static_path and html_extra_path 88 | exclude_patterns = [] 89 | 90 | # The reST default role (used for this markup: `text`) to use for all 91 | # documents. 92 | # 93 | # default_role = None 94 | 95 | # If true, '()' will be appended to :func: etc. cross-reference text. 96 | # 97 | # add_function_parentheses = True 98 | 99 | # If true, the current module name will be prepended to all description 100 | # unit titles (such as .. function::). 101 | # 102 | # add_module_names = True 103 | 104 | # If true, sectionauthor and moduleauthor directives will be shown in the 105 | # output. They are ignored by default. 106 | # 107 | # show_authors = False 108 | 109 | # The name of the Pygments (syntax highlighting) style to use. 110 | pygments_style = 'sphinx' 111 | 112 | # A list of ignored prefixes for module index sorting. 113 | # modindex_common_prefix = [] 114 | 115 | # If true, keep warnings as "system message" paragraphs in the built documents. 116 | # keep_warnings = False 117 | 118 | # If true, `todo` and `todoList` produce output, else they produce nothing. 119 | todo_include_todos = True 120 | 121 | 122 | # -- Options for HTML output ---------------------------------------------- 123 | 124 | # The theme to use for HTML and HTML Help pages. See the documentation for 125 | # a list of builtin themes. 126 | # 127 | html_theme = 'alabaster' 128 | 129 | # Theme options are theme-specific and customize the look and feel of a theme 130 | # further. For a list of options available for each theme, see the 131 | # documentation. 132 | # 133 | # html_theme_options = {} 134 | 135 | # Add any paths that contain custom themes here, relative to this directory. 136 | # html_theme_path = [] 137 | 138 | # The name for this set of Sphinx documents. 139 | # " v documentation" by default. 140 | # 141 | # html_title = u'{{ cookiecutter.project_name }} v{{ cookiecutter.version }}' 142 | 143 | # A shorter title for the navigation bar. Default is the same as html_title. 144 | # 145 | # html_short_title = None 146 | 147 | # The name of an image file (relative to this directory) to place at the top 148 | # of the sidebar. 149 | # 150 | # html_logo = None 151 | 152 | # The name of an image file (relative to this directory) to use as a favicon of 153 | # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 154 | # pixels large. 155 | # 156 | # html_favicon = None 157 | 158 | # Add any paths that contain custom static files (such as style sheets) here, 159 | # relative to this directory. They are copied after the builtin static files, 160 | # so a file named "default.css" will overwrite the builtin "default.css". 161 | html_static_path = ['_static'] 162 | 163 | # Add any extra paths that contain custom files (such as robots.txt or 164 | # .htaccess) here, relative to this directory. These files are copied 165 | # directly to the root of the documentation. 166 | # 167 | # html_extra_path = [] 168 | 169 | # If not None, a 'Last updated on:' timestamp is inserted at every page 170 | # bottom, using the given strftime format. 171 | # The empty string is equivalent to '%b %d, %Y'. 172 | # 173 | # html_last_updated_fmt = None 174 | 175 | # If true, SmartyPants will be used to convert quotes and dashes to 176 | # typographically correct entities. 177 | # 178 | # html_use_smartypants = True 179 | 180 | # Custom sidebar templates, maps document names to template names. 181 | # 182 | # html_sidebars = {} 183 | 184 | # Additional templates that should be rendered to pages, maps page names to 185 | # template names. 186 | # 187 | # html_additional_pages = {} 188 | 189 | # If false, no module index is generated. 190 | # 191 | # html_domain_indices = True 192 | 193 | # If false, no index is generated. 194 | # 195 | # html_use_index = True 196 | 197 | # If true, the index is split into individual pages for each letter. 198 | # 199 | # html_split_index = False 200 | 201 | # If true, links to the reST sources are added to the pages. 202 | # 203 | # html_show_sourcelink = True 204 | 205 | # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. 206 | # 207 | # html_show_sphinx = True 208 | 209 | # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. 210 | # 211 | # html_show_copyright = True 212 | 213 | # If true, an OpenSearch description file will be output, and all pages will 214 | # contain a tag referring to it. The value of this option must be the 215 | # base URL from which the finished HTML is served. 216 | # 217 | # html_use_opensearch = '' 218 | 219 | # This is the file name suffix for HTML files (e.g. ".xhtml"). 220 | # html_file_suffix = None 221 | 222 | # Language to be used for generating the HTML full-text search index. 223 | # Sphinx supports the following languages: 224 | # 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' 225 | # 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' 226 | # 227 | # html_search_language = 'en' 228 | 229 | # A dictionary with options for the search language support, empty by default. 230 | # 'ja' uses this config value. 231 | # 'zh' user can custom change `jieba` dictionary path. 232 | # 233 | # html_search_options = {'type': 'default'} 234 | 235 | # The name of a javascript file (relative to the configuration directory) that 236 | # implements a search results scorer. If empty, the default will be used. 237 | # 238 | # html_search_scorer = 'scorer.js' 239 | 240 | # Output file base name for HTML help builder. 241 | htmlhelp_basename = 'project_namedoc' 242 | 243 | # -- Options for LaTeX output --------------------------------------------- 244 | 245 | latex_elements = { 246 | # The paper size ('letterpaper' or 'a4paper'). 247 | # 248 | # 'papersize': 'letterpaper', 249 | 250 | # The font size ('10pt', '11pt' or '12pt'). 251 | # 252 | # 'pointsize': '10pt', 253 | 254 | # Additional stuff for the LaTeX preamble. 255 | # 256 | # 'preamble': '', 257 | 258 | # Latex figure (float) alignment 259 | # 260 | # 'figure_align': 'htbp', 261 | } 262 | 263 | # Grouping the document tree into LaTeX files. List of tuples 264 | # (source start file, target name, title, 265 | # author, documentclass [howto, manual, or own class]). 266 | latex_documents = [ 267 | (master_doc, 'project_name.tex', u'\\{\\{ project\\_name \\}\\} Documentation', 268 | u'\\{\\{ author\\_name \\}\\}', 'manual'), 269 | ] 270 | 271 | # The name of an image file (relative to this directory) to place at the top of 272 | # the title page. 273 | # 274 | # latex_logo = None 275 | 276 | # For "manual" documents, if this is true, then toplevel headings are parts, 277 | # not chapters. 278 | # 279 | # latex_use_parts = False 280 | 281 | # If true, show page references after internal links. 282 | # 283 | # latex_show_pagerefs = False 284 | 285 | # If true, show URL addresses after external links. 286 | # 287 | # latex_show_urls = False 288 | 289 | # Documents to append as an appendix to all manuals. 290 | # 291 | # latex_appendices = [] 292 | 293 | # It false, will not define \strong, \code, itleref, \crossref ... but only 294 | # \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added 295 | # packages. 296 | # 297 | # latex_keep_old_macro_names = True 298 | 299 | # If false, no module index is generated. 300 | # 301 | # latex_domain_indices = True 302 | 303 | 304 | # -- Options for manual page output --------------------------------------- 305 | 306 | # One entry per manual page. List of tuples 307 | # (source start file, name, description, authors, manual section). 308 | man_pages = [ 309 | (master_doc, 'project_name', u'{{ cookiecutter.project_name }} Documentation', 310 | [author], 1) 311 | ] 312 | 313 | # If true, show URL addresses after external links. 314 | # 315 | # man_show_urls = False 316 | 317 | 318 | # -- Options for Texinfo output ------------------------------------------- 319 | 320 | # Grouping the document tree into Texinfo files. List of tuples 321 | # (source start file, target name, title, author, 322 | # dir menu entry, description, category) 323 | texinfo_documents = [ 324 | (master_doc, 'project_name', u'{{ cookiecutter.project_name }} Documentation', 325 | author, 'project_name', 'One line description of project.', 326 | 'Miscellaneous'), 327 | ] 328 | 329 | # Documents to append as an appendix to all manuals. 330 | # 331 | # texinfo_appendices = [] 332 | 333 | # If false, no module index is generated. 334 | # 335 | # texinfo_domain_indices = True 336 | 337 | # How to display URL addresses: 'footnote', 'no', or 'inline'. 338 | # 339 | # texinfo_show_urls = 'footnote' 340 | 341 | # If true, do not generate a @detailmenu in the "Top" node's menu. 342 | # 343 | # texinfo_no_detailmenu = False 344 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "arrow" 3 | version = "1.2.2" 4 | description = "Better dates & times for Python" 5 | category = "dev" 6 | optional = false 7 | python-versions = ">=3.6" 8 | 9 | [package.dependencies] 10 | python-dateutil = ">=2.7.0" 11 | typing-extensions = {version = "*", markers = "python_version < \"3.8\""} 12 | 13 | [[package]] 14 | name = "atomicwrites" 15 | version = "1.4.0" 16 | description = "Atomic file writes." 17 | category = "dev" 18 | optional = false 19 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 20 | 21 | [[package]] 22 | name = "attrs" 23 | version = "21.4.0" 24 | description = "Classes Without Boilerplate" 25 | category = "dev" 26 | optional = false 27 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 28 | 29 | [package.extras] 30 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] 31 | docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] 32 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] 33 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] 34 | 35 | [[package]] 36 | name = "binaryornot" 37 | version = "0.4.4" 38 | description = "Ultra-lightweight pure Python package to check if a file is binary or text." 39 | category = "dev" 40 | optional = false 41 | python-versions = "*" 42 | 43 | [package.dependencies] 44 | chardet = ">=3.0.2" 45 | 46 | [[package]] 47 | name = "certifi" 48 | version = "2022.5.18.1" 49 | description = "Python package for providing Mozilla's CA Bundle." 50 | category = "dev" 51 | optional = false 52 | python-versions = ">=3.6" 53 | 54 | [[package]] 55 | name = "chardet" 56 | version = "4.0.0" 57 | description = "Universal encoding detector for Python 2 and 3" 58 | category = "dev" 59 | optional = false 60 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 61 | 62 | [[package]] 63 | name = "charset-normalizer" 64 | version = "2.0.12" 65 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 66 | category = "dev" 67 | optional = false 68 | python-versions = ">=3.5.0" 69 | 70 | [package.extras] 71 | unicode_backport = ["unicodedata2"] 72 | 73 | [[package]] 74 | name = "click" 75 | version = "8.1.3" 76 | description = "Composable command line interface toolkit" 77 | category = "dev" 78 | optional = false 79 | python-versions = ">=3.7" 80 | 81 | [package.dependencies] 82 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 83 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 84 | 85 | [[package]] 86 | name = "colorama" 87 | version = "0.4.4" 88 | description = "Cross-platform colored terminal text." 89 | category = "dev" 90 | optional = false 91 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 92 | 93 | [[package]] 94 | name = "cookiecutter" 95 | version = "2.1.1" 96 | description = "A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template." 97 | category = "dev" 98 | optional = false 99 | python-versions = ">=3.7" 100 | 101 | [package.dependencies] 102 | binaryornot = ">=0.4.4" 103 | click = ">=7.0,<9.0.0" 104 | Jinja2 = ">=2.7,<4.0.0" 105 | jinja2-time = ">=0.2.0" 106 | python-slugify = ">=4.0.0" 107 | pyyaml = ">=5.3.1" 108 | requests = ">=2.23.0" 109 | 110 | [[package]] 111 | name = "flake8" 112 | version = "4.0.1" 113 | description = "the modular source code checker: pep8 pyflakes and co" 114 | category = "dev" 115 | optional = false 116 | python-versions = ">=3.6" 117 | 118 | [package.dependencies] 119 | importlib-metadata = {version = "<4.3", markers = "python_version < \"3.8\""} 120 | mccabe = ">=0.6.0,<0.7.0" 121 | pycodestyle = ">=2.8.0,<2.9.0" 122 | pyflakes = ">=2.4.0,<2.5.0" 123 | 124 | [[package]] 125 | name = "idna" 126 | version = "3.3" 127 | description = "Internationalized Domain Names in Applications (IDNA)" 128 | category = "dev" 129 | optional = false 130 | python-versions = ">=3.5" 131 | 132 | [[package]] 133 | name = "importlib-metadata" 134 | version = "4.2.0" 135 | description = "Read metadata from Python packages" 136 | category = "dev" 137 | optional = false 138 | python-versions = ">=3.6" 139 | 140 | [package.dependencies] 141 | typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} 142 | zipp = ">=0.5" 143 | 144 | [package.extras] 145 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 146 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] 147 | 148 | [[package]] 149 | name = "iniconfig" 150 | version = "1.1.1" 151 | description = "iniconfig: brain-dead simple config-ini parsing" 152 | category = "dev" 153 | optional = false 154 | python-versions = "*" 155 | 156 | [[package]] 157 | name = "jinja2" 158 | version = "3.1.2" 159 | description = "A very fast and expressive template engine." 160 | category = "dev" 161 | optional = false 162 | python-versions = ">=3.7" 163 | 164 | [package.dependencies] 165 | MarkupSafe = ">=2.0" 166 | 167 | [package.extras] 168 | i18n = ["Babel (>=2.7)"] 169 | 170 | [[package]] 171 | name = "jinja2-time" 172 | version = "0.2.0" 173 | description = "Jinja2 Extension for Dates and Times" 174 | category = "dev" 175 | optional = false 176 | python-versions = "*" 177 | 178 | [package.dependencies] 179 | arrow = "*" 180 | jinja2 = "*" 181 | 182 | [[package]] 183 | name = "markupsafe" 184 | version = "2.1.1" 185 | description = "Safely add untrusted strings to HTML/XML markup." 186 | category = "dev" 187 | optional = false 188 | python-versions = ">=3.7" 189 | 190 | [[package]] 191 | name = "mccabe" 192 | version = "0.6.1" 193 | description = "McCabe checker, plugin for flake8" 194 | category = "dev" 195 | optional = false 196 | python-versions = "*" 197 | 198 | [[package]] 199 | name = "packaging" 200 | version = "21.3" 201 | description = "Core utilities for Python packages" 202 | category = "dev" 203 | optional = false 204 | python-versions = ">=3.6" 205 | 206 | [package.dependencies] 207 | pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" 208 | 209 | [[package]] 210 | name = "pluggy" 211 | version = "1.0.0" 212 | description = "plugin and hook calling mechanisms for python" 213 | category = "dev" 214 | optional = false 215 | python-versions = ">=3.6" 216 | 217 | [package.dependencies] 218 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 219 | 220 | [package.extras] 221 | dev = ["pre-commit", "tox"] 222 | testing = ["pytest", "pytest-benchmark"] 223 | 224 | [[package]] 225 | name = "py" 226 | version = "1.11.0" 227 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 228 | category = "dev" 229 | optional = false 230 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 231 | 232 | [[package]] 233 | name = "pycodestyle" 234 | version = "2.8.0" 235 | description = "Python style guide checker" 236 | category = "dev" 237 | optional = false 238 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 239 | 240 | [[package]] 241 | name = "pyflakes" 242 | version = "2.4.0" 243 | description = "passive checker of Python programs" 244 | category = "dev" 245 | optional = false 246 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 247 | 248 | [[package]] 249 | name = "pyparsing" 250 | version = "3.0.9" 251 | description = "pyparsing module - Classes and methods to define and execute parsing grammars" 252 | category = "dev" 253 | optional = false 254 | python-versions = ">=3.6.8" 255 | 256 | [package.extras] 257 | diagrams = ["railroad-diagrams", "jinja2"] 258 | 259 | [[package]] 260 | name = "pytest" 261 | version = "7.1.2" 262 | description = "pytest: simple powerful testing with Python" 263 | category = "dev" 264 | optional = false 265 | python-versions = ">=3.7" 266 | 267 | [package.dependencies] 268 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} 269 | attrs = ">=19.2.0" 270 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 271 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 272 | iniconfig = "*" 273 | packaging = "*" 274 | pluggy = ">=0.12,<2.0" 275 | py = ">=1.8.2" 276 | tomli = ">=1.0.0" 277 | 278 | [package.extras] 279 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] 280 | 281 | [[package]] 282 | name = "pytest-cookies" 283 | version = "0.6.1" 284 | description = "The pytest plugin for your Cookiecutter templates. 🍪" 285 | category = "dev" 286 | optional = false 287 | python-versions = ">=3.6" 288 | 289 | [package.dependencies] 290 | cookiecutter = ">=1.4.0" 291 | pytest = ">=3.3.0" 292 | 293 | [[package]] 294 | name = "python-dateutil" 295 | version = "2.8.2" 296 | description = "Extensions to the standard Python datetime module" 297 | category = "dev" 298 | optional = false 299 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 300 | 301 | [package.dependencies] 302 | six = ">=1.5" 303 | 304 | [[package]] 305 | name = "python-slugify" 306 | version = "6.1.2" 307 | description = "A Python slugify application that also handles Unicode" 308 | category = "dev" 309 | optional = false 310 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 311 | 312 | [package.dependencies] 313 | text-unidecode = ">=1.3" 314 | 315 | [package.extras] 316 | unidecode = ["Unidecode (>=1.1.1)"] 317 | 318 | [[package]] 319 | name = "pyyaml" 320 | version = "6.0" 321 | description = "YAML parser and emitter for Python" 322 | category = "dev" 323 | optional = false 324 | python-versions = ">=3.6" 325 | 326 | [[package]] 327 | name = "requests" 328 | version = "2.28.0" 329 | description = "Python HTTP for Humans." 330 | category = "dev" 331 | optional = false 332 | python-versions = ">=3.7, <4" 333 | 334 | [package.dependencies] 335 | certifi = ">=2017.4.17" 336 | charset-normalizer = ">=2.0.0,<2.1.0" 337 | idna = ">=2.5,<4" 338 | urllib3 = ">=1.21.1,<1.27" 339 | 340 | [package.extras] 341 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 342 | use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] 343 | 344 | [[package]] 345 | name = "six" 346 | version = "1.16.0" 347 | description = "Python 2 and 3 compatibility utilities" 348 | category = "dev" 349 | optional = false 350 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 351 | 352 | [[package]] 353 | name = "text-unidecode" 354 | version = "1.3" 355 | description = "The most basic Text::Unidecode port" 356 | category = "dev" 357 | optional = false 358 | python-versions = "*" 359 | 360 | [[package]] 361 | name = "tomli" 362 | version = "2.0.1" 363 | description = "A lil' TOML parser" 364 | category = "dev" 365 | optional = false 366 | python-versions = ">=3.7" 367 | 368 | [[package]] 369 | name = "typing-extensions" 370 | version = "4.2.0" 371 | description = "Backported and Experimental Type Hints for Python 3.7+" 372 | category = "dev" 373 | optional = false 374 | python-versions = ">=3.7" 375 | 376 | [[package]] 377 | name = "urllib3" 378 | version = "1.26.9" 379 | description = "HTTP library with thread-safe connection pooling, file post, and more." 380 | category = "dev" 381 | optional = false 382 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" 383 | 384 | [package.extras] 385 | brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] 386 | secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] 387 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 388 | 389 | [[package]] 390 | name = "zipp" 391 | version = "3.8.0" 392 | description = "Backport of pathlib-compatible object wrapper for zip files" 393 | category = "dev" 394 | optional = false 395 | python-versions = ">=3.7" 396 | 397 | [package.extras] 398 | docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] 399 | testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] 400 | 401 | [metadata] 402 | lock-version = "1.1" 403 | python-versions = "^3.7" 404 | content-hash = "9847b09c92b09cc77ba7943cd56d81d220f20bc145bc4fb8813573858b944920" 405 | 406 | [metadata.files] 407 | arrow = [ 408 | {file = "arrow-1.2.2-py3-none-any.whl", hash = "sha256:d622c46ca681b5b3e3574fcb60a04e5cc81b9625112d5fb2b44220c36c892177"}, 409 | {file = "arrow-1.2.2.tar.gz", hash = "sha256:05caf1fd3d9a11a1135b2b6f09887421153b94558e5ef4d090b567b47173ac2b"}, 410 | ] 411 | atomicwrites = [ 412 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, 413 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, 414 | ] 415 | attrs = [ 416 | {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, 417 | {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, 418 | ] 419 | binaryornot = [ 420 | {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"}, 421 | {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"}, 422 | ] 423 | certifi = [ 424 | {file = "certifi-2022.5.18.1-py3-none-any.whl", hash = "sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a"}, 425 | {file = "certifi-2022.5.18.1.tar.gz", hash = "sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7"}, 426 | ] 427 | chardet = [ 428 | {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, 429 | {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, 430 | ] 431 | charset-normalizer = [ 432 | {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, 433 | {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, 434 | ] 435 | click = [ 436 | {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, 437 | {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, 438 | ] 439 | colorama = [ 440 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 441 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 442 | ] 443 | cookiecutter = [ 444 | {file = "cookiecutter-2.1.1-py2.py3-none-any.whl", hash = "sha256:9f3ab027cec4f70916e28f03470bdb41e637a3ad354b4d65c765d93aad160022"}, 445 | {file = "cookiecutter-2.1.1.tar.gz", hash = "sha256:f3982be8d9c53dac1261864013fdec7f83afd2e42ede6f6dd069c5e149c540d5"}, 446 | ] 447 | flake8 = [ 448 | {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, 449 | {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, 450 | ] 451 | idna = [ 452 | {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, 453 | {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, 454 | ] 455 | importlib-metadata = [ 456 | {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, 457 | {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, 458 | ] 459 | iniconfig = [ 460 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, 461 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, 462 | ] 463 | jinja2 = [ 464 | {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, 465 | {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, 466 | ] 467 | jinja2-time = [ 468 | {file = "jinja2-time-0.2.0.tar.gz", hash = "sha256:d14eaa4d315e7688daa4969f616f226614350c48730bfa1692d2caebd8c90d40"}, 469 | {file = "jinja2_time-0.2.0-py2.py3-none-any.whl", hash = "sha256:d3eab6605e3ec8b7a0863df09cc1d23714908fa61aa6986a845c20ba488b4efa"}, 470 | ] 471 | markupsafe = [ 472 | {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, 473 | {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, 474 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, 475 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, 476 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, 477 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, 478 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, 479 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, 480 | {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, 481 | {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, 482 | {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, 483 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, 484 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, 485 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, 486 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, 487 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, 488 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, 489 | {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, 490 | {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, 491 | {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, 492 | {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, 493 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, 494 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, 495 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, 496 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, 497 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, 498 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, 499 | {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, 500 | {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, 501 | {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, 502 | {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, 503 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, 504 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, 505 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, 506 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, 507 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, 508 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, 509 | {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, 510 | {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, 511 | {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, 512 | ] 513 | mccabe = [ 514 | {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, 515 | {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, 516 | ] 517 | packaging = [ 518 | {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, 519 | {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, 520 | ] 521 | pluggy = [ 522 | {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, 523 | {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, 524 | ] 525 | py = [ 526 | {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, 527 | {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, 528 | ] 529 | pycodestyle = [ 530 | {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, 531 | {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, 532 | ] 533 | pyflakes = [ 534 | {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, 535 | {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, 536 | ] 537 | pyparsing = [ 538 | {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, 539 | {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, 540 | ] 541 | pytest = [ 542 | {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, 543 | {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, 544 | ] 545 | pytest-cookies = [ 546 | {file = "pytest-cookies-0.6.1.tar.gz", hash = "sha256:94c41ad914d420b57bc31d58ab2c0b103322c11d07d13b8d245c85fa9b069714"}, 547 | {file = "pytest_cookies-0.6.1-py3-none-any.whl", hash = "sha256:2e2383c12a321753676c8944fb75b3c8ccac70fce58e27d6b201e1a3ff3dab27"}, 548 | ] 549 | python-dateutil = [ 550 | {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, 551 | {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, 552 | ] 553 | python-slugify = [ 554 | {file = "python-slugify-6.1.2.tar.gz", hash = "sha256:272d106cb31ab99b3496ba085e3fea0e9e76dcde967b5e9992500d1f785ce4e1"}, 555 | {file = "python_slugify-6.1.2-py2.py3-none-any.whl", hash = "sha256:7b2c274c308b62f4269a9ba701aa69a797e9bca41aeee5b3a9e79e36b6656927"}, 556 | ] 557 | pyyaml = [ 558 | {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, 559 | {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, 560 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, 561 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, 562 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, 563 | {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, 564 | {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, 565 | {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, 566 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, 567 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, 568 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, 569 | {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, 570 | {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, 571 | {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, 572 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, 573 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, 574 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, 575 | {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, 576 | {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, 577 | {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, 578 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, 579 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, 580 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, 581 | {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, 582 | {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, 583 | {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, 584 | {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, 585 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, 586 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, 587 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, 588 | {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, 589 | {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, 590 | {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, 591 | ] 592 | requests = [ 593 | {file = "requests-2.28.0-py3-none-any.whl", hash = "sha256:bc7861137fbce630f17b03d3ad02ad0bf978c844f3536d0edda6499dafce2b6f"}, 594 | {file = "requests-2.28.0.tar.gz", hash = "sha256:d568723a7ebd25875d8d1eaf5dfa068cd2fc8194b2e483d7b1f7c81918dbec6b"}, 595 | ] 596 | six = [ 597 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 598 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 599 | ] 600 | text-unidecode = [ 601 | {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, 602 | {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, 603 | ] 604 | tomli = [ 605 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 606 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 607 | ] 608 | typing-extensions = [ 609 | {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, 610 | {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, 611 | ] 612 | urllib3 = [ 613 | {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, 614 | {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, 615 | ] 616 | zipp = [ 617 | {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, 618 | {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, 619 | ] 620 | --------------------------------------------------------------------------------