diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index ea5d104e..00487d8a 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -11,20 +11,11 @@ jobs: uses: actions/checkout@v3 - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: "3.10" - cache: "pip" - cache-dependency-path: requirements.*.txt - - - name: Install Python dependencies - run: | - python -m pip install --upgrade pip - pip install -r requirements.prod.txt -r requirements.dev.txt + uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2 - name: Run pre-commit run: | - pre-commit run --all-files --show-diff-on-failure + uv run pre-commit run --all-files --show-diff-on-failure - name: Run Python tests run: | diff --git a/.python-version b/.python-version new file mode 100644 index 00000000..c8cfe395 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.10 diff --git a/Makefile b/Makefile index 86fcac0e..d598f8b5 100644 --- a/Makefile +++ b/Makefile @@ -4,30 +4,20 @@ help: @echo " make test: runs the tests." @echo " make build: install as for a deployed environment." @echo " make run-prod: run webserver as in deployed environment." - @echo " make compile: compile the requirements specs." - -_uv: - # ensure uv is installed - pip install uv test: - coverage run -m pytest -vvv - coverage report + uv run coverage run -m pytest -vvv + uv run coverage report mypy: - mypy . | mypy-json-report > mypy-ratchet.json + uv run mypy . | uv run mypy-json-report > mypy-ratchet.json git diff --exit-code mypy-ratchet.json -build: _uv - uv pip install -r requirements.prod.txt -r requirements.dev.txt - python manage.py collectstatic --no-input +build: + uv run manage.py collectstatic --no-input rm -f ccbv.sqlite - python manage.py migrate - python manage.py load_all_django_versions + uv run manage.py migrate + uv run manage.py load_all_django_versions run-prod: gunicorn core.wsgi --log-file - - -compile: _uv - uv pip compile requirements.prod.in --output-file=requirements.prod.txt - uv pip compile requirements.dev.in --output-file=requirements.dev.txt diff --git a/README.markdown b/README.markdown index db5fe5e5..e383fec2 100644 --- a/README.markdown +++ b/README.markdown @@ -52,24 +52,24 @@ e.g. (inside your virtualenv or whatever) Prepare the database (assuming you've got required database) - python manage.py migrate cbv + uv run manage.py migrate cbv Populate the database with fixtures, either all at once: - python manage.py load_all_django_versions + uv run manage.py load_all_django_versions or one at a time, for example: - python manage.py loaddata cbv/fixtures/1.8.json - python manage.py loaddata cbv/fixtures/1.9.json + uv run manage.py loaddata cbv/fixtures/1.8.json + uv run manage.py loaddata cbv/fixtures/1.9.json Collect static files (CSS & JS) - python manage.py collectstatic + uv run manage.py collectstatic Run server and play around - python manage.py runserver + uv run manage.py runserver If you hope to contribute any code, please install `pre-commit` before committing. @@ -77,26 +77,32 @@ If you hope to contribute any code, please install `pre-commit` before committin ## Updating Requirements -Add or remove the dependency from either `requirements.prod.in` or `requirements.dev.in` as appropriate. +Add a dependency with: -Run `make compile` and appropriate txt file will be updated. + uv add [--dev] + +Remove a dependency with: + + uv remove [--dev] + +Update a single dependency with: + + uv add [--dev] --upgrade-package ## Updating for New Versions of Django The procedure for updating for a new version of Django is as simple as: -1. Update the `requirements.in` file to pin the required version of Django; -2. Use `pip-compile` to freshen requirements for the new version of Django; -3. Use `pip-sync` to update your virtual environment to match the newly compiled - `requirements.txt` file; -4. Update the project's code to run under the target version of Django, as +1. Update Django with `uv add --upgrade-package django cbv/fixtures/x.xx.json`; +1. Export the new Django version into a fixture with: `uv run manage.py cbv_dumpversion x.xx > cbv/fixtures/x.xx.json`; ## Testing diff --git a/pyproject.toml b/pyproject.toml index d37213ce..276f8bed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,35 @@ +[project] +name = "ccbv" +version = "1.0.0" +description = "Tool to view class hierarchies" +requires-python = ">=3.10" +dependencies = [ + "attrs>=21.4.0", + "blessings>=1.7", + "django~=3.1.14", + "django-extensions>=3.1.3", + "django-pygmy>=0.1.5", + "django-sans-db>=1.2.0", + "environs[django]>=9.5.0", + "gunicorn>=20.1.0", + "requests>=2.32.3", + "sphinx>=8.1.3", + "werkzeug>=2.0.2", + "whitenoise>=5.3.0", +] + +[dependency-groups] +dev = [ + "coverage[toml]>=6.5.0", + "factory-boy>=3.2.0", + "mypy>=0.931", + "mypy-json-report>=0.1.3", + "pre-commit>=2.15.0", + "pytest>=7.1.2", + "pytest-django>=4.5.2", + "types-requests>=2.27.7", +] + [tool.coverage.run] branch = true dynamic_context = "test_function" @@ -54,3 +86,6 @@ extend-ignore = [ [tool.ruff.lint.isort] lines-after-imports = 2 + +[tool.uv] +required-version = ">=0.6.16" diff --git a/requirements.dev.in b/requirements.dev.in deleted file mode 100644 index c7e549f3..00000000 --- a/requirements.dev.in +++ /dev/null @@ -1,11 +0,0 @@ ---constraint requirements.prod.txt - -coverage[toml] -factory_boy -mypy -mypy-json-report>=0.1.3 -pre-commit -pytest -pytest-django -pytest-subtests -types-requests diff --git a/requirements.dev.txt b/requirements.dev.txt deleted file mode 100644 index 25676463..00000000 --- a/requirements.dev.txt +++ /dev/null @@ -1,83 +0,0 @@ -# This file was autogenerated by uv via the following command: -# uv pip compile requirements.dev.in --output-file=requirements.dev.txt -attrs==21.4.0 - # via - # -c requirements.prod.txt - # pytest -backports-entry-points-selectable==1.2.0 - # via virtualenv -cfgv==3.3.1 - # via pre-commit -coverage==6.5.0 - # via -r requirements.dev.in -distlib==0.3.3 - # via virtualenv -factory-boy==3.2.0 - # via -r requirements.dev.in -faker==9.3.1 - # via factory-boy -filelock==3.3.0 - # via virtualenv -identify==2.3.0 - # via pre-commit -iniconfig==1.1.1 - # via pytest -mypy==0.931 - # via -r requirements.dev.in -mypy-extensions==0.4.3 - # via mypy -mypy-json-report==0.1.3 - # via -r requirements.dev.in -nodeenv==1.6.0 - # via pre-commit -packaging==21.3 - # via - # -c requirements.prod.txt - # pytest -platformdirs==2.4.0 - # via virtualenv -pluggy==1.0.0 - # via pytest -pre-commit==2.15.0 - # via -r requirements.dev.in -py==1.11.0 - # via pytest -pyparsing==3.0.6 - # via - # -c requirements.prod.txt - # packaging -pytest==7.1.2 - # via - # -r requirements.dev.in - # pytest-django - # pytest-subtests -pytest-django==4.5.2 - # via -r requirements.dev.in -pytest-subtests==0.8.0 - # via -r requirements.dev.in -python-dateutil==2.8.2 - # via faker -pyyaml==6.0.1 - # via pre-commit -six==1.16.0 - # via - # -c requirements.prod.txt - # python-dateutil - # virtualenv -text-unidecode==1.3 - # via faker -toml==0.10.2 - # via pre-commit -tomli==2.0.0 - # via - # coverage - # mypy - # pytest -types-requests==2.27.7 - # via -r requirements.dev.in -types-urllib3==1.26.7 - # via types-requests -typing-extensions==4.0.1 - # via mypy -virtualenv==20.8.1 - # via pre-commit diff --git a/requirements.prod.in b/requirements.prod.in deleted file mode 100644 index 1c2ebfa2..00000000 --- a/requirements.prod.in +++ /dev/null @@ -1,13 +0,0 @@ -attrs>=21.4.0 -blessings -django~=3.1.14 -django-extensions -django-pygmy -django-sans-db>=1.2.0 -environs[django] -gunicorn -requests -# New versions aren't supported yet -sphinx==1.2.2 -werkzeug -whitenoise diff --git a/requirements.prod.txt b/requirements.prod.txt deleted file mode 100644 index 5278f029..00000000 --- a/requirements.prod.txt +++ /dev/null @@ -1,70 +0,0 @@ -# This file was autogenerated by uv via the following command: -# uv pip compile requirements.prod.in --output-file=requirements.prod.txt -asgiref==3.4.1 - # via django -attrs==21.4.0 - # via -r requirements.prod.in -blessings==1.7 - # via -r requirements.prod.in -certifi==2022.12.7 - # via requests -charset-normalizer==2.0.7 - # via requests -dj-database-url==0.5.0 - # via environs -dj-email-url==1.0.6 - # via environs -django==3.1.14 - # via - # -r requirements.prod.in - # django-extensions -django-cache-url==3.4.2 - # via environs -django-extensions==3.1.3 - # via -r requirements.prod.in -django-pygmy==0.1.5 - # via -r requirements.prod.in -django-sans-db==1.2.0 - # via -r requirements.prod.in -docutils==0.17.1 - # via sphinx -environs==9.5.0 - # via -r requirements.prod.in -gunicorn==20.1.0 - # via -r requirements.prod.in -idna==3.3 - # via requests -jinja2==3.0.2 - # via sphinx -markupsafe==2.0.1 - # via jinja2 -marshmallow==3.18.0 - # via environs -packaging==21.3 - # via marshmallow -pygments==2.10.0 - # via - # django-pygmy - # sphinx -pyparsing==3.0.6 - # via packaging -python-dotenv==0.21.0 - # via environs -pytz==2021.3 - # via django -requests==2.26.0 - # via -r requirements.prod.in -setuptools==70.0.0 - # via gunicorn -six==1.16.0 - # via blessings -sphinx==1.2.2 - # via -r requirements.prod.in -sqlparse==0.4.2 - # via django -urllib3==1.26.7 - # via requests -werkzeug==2.0.2 - # via -r requirements.prod.in -whitenoise==5.3.0 - # via -r requirements.prod.in diff --git a/tests/_page_snapshots/fuzzy-klass-detail-old.html b/tests/_page_snapshots/fuzzy-klass-detail-old.html index fcd531ac..b6317f23 100644 --- a/tests/_page_snapshots/fuzzy-klass-detail-old.html +++ b/tests/_page_snapshots/fuzzy-klass-detail-old.html @@ -673,7 +673,7 @@

Constructor. Called in the URLconf; can contain helpful extra
 keyword arguments, and other things.
-
38
+                                    
38
 39
 40
 41
@@ -681,8 +681,8 @@ 

43 44 45 -46

def __init__(self, **kwargs):
-    """
+46
def __init__(self, **kwargs):
+    """
     Constructor. Called in the URLconf; can contain helpful extra
     keyword arguments, and other things.
     """
@@ -690,8 +690,8 @@ 

# instance, or raise an error. for key, value in kwargs.items(): setattr(self, key, value) -

-
+
+ @@ -720,11 +720,11 @@

-
114
-115
def _allowed_methods(self):
+                                    
114
+115
def _allowed_methods(self):
     return [m.upper() for m in self.http_method_names if hasattr(self, m)]
-
-
+
+ @@ -753,7 +753,7 @@

Main entry point for a request-response process.
-
48
+                                    
48
 49
 50
 51
@@ -782,9 +782,9 @@ 

74 75 76 -77

@classonlymethod
-def as_view(cls, **initkwargs):
-    """Main entry point for a request-response process."""
+77
@classonlymethod
+def as_view(cls, **initkwargs):
+    """Main entry point for a request-response process."""
     for key in initkwargs:
         if key in cls.http_method_names:
             raise TypeError(
@@ -795,7 +795,7 @@ 

raise TypeError("%s() received an invalid keyword %r. as_view " "only accepts arguments that are already " "attributes of the class." % (cls.__name__, key)) - def view(request, *args, **kwargs): + def view(request, *args, **kwargs): self = cls(**initkwargs) self.setup(request, *args, **kwargs) if not hasattr(self, 'request'): @@ -812,8 +812,8 @@

# like csrf_exempt from dispatch update_wrapper(view, cls.dispatch, assigned=()) return view -

-
+
+ @@ -842,7 +842,7 @@

-
90
+                                    
90
 91
 92
 93
@@ -850,7 +850,7 @@ 

95 96 97 -98

def dispatch(self, request, *args, **kwargs):
+98
def dispatch(self, request, *args, **kwargs):
     # Try to dispatch to the right method; if a method doesn't exist,
     # defer to the error handler. Also defer to the error handler if the
     # request method isn't on the approved list.
@@ -859,8 +859,8 @@ 

else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs) -

-
+
+ @@ -889,13 +889,13 @@

If the form is invalid, render the invalid form.
-
59
+                                    
59
 60
-61
def form_invalid(self, form):
-    """If the form is invalid, render the invalid form."""
+61
def form_invalid(self, form):
+    """If the form is invalid, render the invalid form."""
     return self.render_to_response(self.get_context_data(form=form))
-
-
+
+ @@ -924,13 +924,13 @@

If the form is valid, redirect to the supplied URL.
-
55
+                                    
55
 56
-57
def form_valid(self, form):
-    """If the form is valid, redirect to the supplied URL."""
+57
def form_valid(self, form):
+    """If the form is valid, redirect to the supplied URL."""
     return HttpResponseRedirect(self.get_success_url())
-
-
+
+ @@ -959,13 +959,13 @@

Handle GET requests: instantiate a blank version of the form.
-
131
+                                    
131
 132
-133
def get(self, request, *args, **kwargs):
-    """Handle GET requests: instantiate a blank version of the form."""
+133
def get(self, request, *args, **kwargs):
+    """Handle GET requests: instantiate a blank version of the form."""
     return self.render_to_response(self.get_context_data())
-
-
+
+ @@ -998,17 +998,17 @@

FormMixin

Insert the form into the context dict.
-
63
+                                                
63
 64
 65
 66
-67
def get_context_data(self, **kwargs):
-    """Insert the form into the context dict."""
+67
def get_context_data(self, **kwargs):
+    """Insert the form into the context dict."""
     if 'form' not in kwargs:
         kwargs['form'] = self.get_form()
     return super().get_context_data(**kwargs)
-
-
+
+
@@ -1022,17 +1022,17 @@

ContextMixin

-
23
+                                                
23
 24
 25
 26
-27
def get_context_data(self, **kwargs):
+27
def get_context_data(self, **kwargs):
     kwargs.setdefault('view', self)
     if self.extra_context is not None:
         kwargs.update(self.extra_context)
     return kwargs
-
-
+
+
@@ -1068,17 +1068,17 @@

Return an instance of the form to be used in this view.
-
29
+                                    
29
 30
 31
 32
-33
def get_form(self, form_class=None):
-    """Return an instance of the form to be used in this view."""
+33
def get_form(self, form_class=None):
+    """Return an instance of the form to be used in this view."""
     if form_class is None:
         form_class = self.get_form_class()
     return form_class(**self.get_form_kwargs())
-
-
+
+ @@ -1107,13 +1107,13 @@

Return the form class to use.
-
25
+                                    
25
 26
-27
def get_form_class(self):
-    """Return the form class to use."""
+27
def get_form_class(self):
+    """Return the form class to use."""
     return self.form_class
-
-
+
+ @@ -1142,7 +1142,7 @@

Return the keyword arguments for instantiating the form.
-
35
+                                    
35
 36
 37
 38
@@ -1153,8 +1153,8 @@ 

43 44 45 -46

def get_form_kwargs(self):
-    """Return the keyword arguments for instantiating the form."""
+46
def get_form_kwargs(self):
+    """Return the keyword arguments for instantiating the form."""
     kwargs = {
         'initial': self.get_initial(),
         'prefix': self.get_prefix(),
@@ -1165,8 +1165,8 @@ 

'files': self.request.FILES, }) return kwargs -

-
+
+ @@ -1195,13 +1195,13 @@

Return the initial data to use for forms on this view.
-
17
+                                    
17
 18
-19
def get_initial(self):
-    """Return the initial data to use for forms on this view."""
+19
def get_initial(self):
+    """Return the initial data to use for forms on this view."""
     return self.initial.copy()
-
-
+
+ @@ -1230,13 +1230,13 @@

Return the prefix to use for forms.
-
21
+                                    
21
 22
-23
def get_prefix(self):
-    """Return the prefix to use for forms."""
+23
def get_prefix(self):
+    """Return the prefix to use for forms."""
     return self.prefix
-
-
+
+ @@ -1265,17 +1265,17 @@

Return the URL to redirect to after processing a valid form.
-
49
+                                    
49
 50
 51
 52
-53
def get_success_url(self):
-    """Return the URL to redirect to after processing a valid form."""
+53
def get_success_url(self):
+    """Return the URL to redirect to after processing a valid form."""
     if not self.success_url:
         raise ImproperlyConfigured("No URL to redirect to. Provide a success_url.")
     return str(self.success_url)  # success_url may be lazy
-
-
+
+ @@ -1305,7 +1305,7 @@

Return a list of template names to be used for the request. Must return
 a list. May not be called if render_to_response() is overridden.
-
141
+                                    
141
 142
 143
 144
@@ -1315,8 +1315,8 @@ 

148 149 150 -151

def get_template_names(self):
-    """
+151
def get_template_names(self):
+    """
     Return a list of template names to be used for the request. Must return
     a list. May not be called if render_to_response() is overridden.
     """
@@ -1326,8 +1326,8 @@ 

"'template_name' or an implementation of 'get_template_names()'") else: return [self.template_name] -

-
+
+ @@ -1356,19 +1356,19 @@

-
100
+                                    
100
 101
 102
 103
 104
-105
def http_method_not_allowed(self, request, *args, **kwargs):
+105
def http_method_not_allowed(self, request, *args, **kwargs):
     logger.warning(
         'Method Not Allowed (%s): %s', request.method, request.path,
         extra={'status_code': 405, 'request': request}
     )
     return HttpResponseNotAllowed(self._allowed_methods())
-
-
+
+ @@ -1397,19 +1397,19 @@

Handle responding to requests for the OPTIONS HTTP verb.
-
107
+                                    
107
 108
 109
 110
 111
-112
def options(self, request, *args, **kwargs):
-    """Handle responding to requests for the OPTIONS HTTP verb."""
+112
def options(self, request, *args, **kwargs):
+    """Handle responding to requests for the OPTIONS HTTP verb."""
     response = HttpResponse()
     response.headers['Allow'] = ', '.join(self._allowed_methods())
     response.headers['Content-Length'] = '0'
     return response
-
-
+
+ @@ -1439,7 +1439,7 @@

Handle POST requests: instantiate a form instance with the passed
 POST variables and then check if it's valid.
-
135
+                                    
135
 136
 137
 138
@@ -1448,8 +1448,8 @@ 

141 142 143 -144

def post(self, request, *args, **kwargs):
-    """
+144
def post(self, request, *args, **kwargs):
+    """
     Handle POST requests: instantiate a form instance with the passed
     POST variables and then check if it's valid.
     """
@@ -1458,8 +1458,8 @@ 

return self.form_valid(form) else: return self.form_invalid(form) -

-
+
+ @@ -1488,11 +1488,11 @@

-
148
-149
def put(self, *args, **kwargs):
+                                    
148
+149
def put(self, *args, **kwargs):
     return self.post(*args, **kwargs)
-
-
+
+ @@ -1524,7 +1524,7 @@

template rendered with the given context. Pass response_kwargs to the constructor of the response class. -
125
+                                    
125
 126
 127
 128
@@ -1537,8 +1537,8 @@ 

135 136 137 -138

def render_to_response(self, context, **response_kwargs):
-    """
+138
def render_to_response(self, context, **response_kwargs):
+    """
     Return a response, using the `response_class` for this view, with a
     template rendered with the given context.
     Pass response_kwargs to the constructor of the response class.
@@ -1551,8 +1551,8 @@ 

using=self.template_engine, **response_kwargs ) -

-
+
+ @@ -1581,21 +1581,21 @@

Initialize attributes shared by all view methods.
-
82
+                                    
82
 83
 84
 85
 86
 87
-88
def setup(self, request, *args, **kwargs):
-    """Initialize attributes shared by all view methods."""
+88
def setup(self, request, *args, **kwargs):
+    """Initialize attributes shared by all view methods."""
     if hasattr(self, 'get') and not hasattr(self, 'head'):
         self.head = self.get
     self.request = request
     self.args = args
     self.kwargs = kwargs
-
-
+
+ diff --git a/tests/_page_snapshots/fuzzy-klass-detail.html b/tests/_page_snapshots/fuzzy-klass-detail.html index c64becb8..1761d459 100644 --- a/tests/_page_snapshots/fuzzy-klass-detail.html +++ b/tests/_page_snapshots/fuzzy-klass-detail.html @@ -673,7 +673,7 @@

Constructor. Called in the URLconf; can contain helpful extra
 keyword arguments, and other things.
-
37
+                                    
37
 38
 39
 40
@@ -681,8 +681,8 @@ 

42 43 44 -45

def __init__(self, **kwargs):
-    """
+45
def __init__(self, **kwargs):
+    """
     Constructor. Called in the URLconf; can contain helpful extra
     keyword arguments, and other things.
     """
@@ -690,8 +690,8 @@ 

# instance, or raise an error. for key, value in kwargs.items(): setattr(self, key, value) -

-
+
+ @@ -720,11 +720,11 @@

-
117
-118
def _allowed_methods(self):
+                                    
117
+118
def _allowed_methods(self):
     return [m.upper() for m in self.http_method_names if hasattr(self, m)]
-
-
+
+ @@ -753,7 +753,7 @@

Main entry point for a request-response process.
-
47
+                                    
47
 48
 49
 50
@@ -786,9 +786,9 @@ 

77 78 79 -80

@classonlymethod
-def as_view(cls, **initkwargs):
-    """Main entry point for a request-response process."""
+80
@classonlymethod
+def as_view(cls, **initkwargs):
+    """Main entry point for a request-response process."""
     for key in initkwargs:
         if key in cls.http_method_names:
             raise TypeError(
@@ -799,7 +799,7 @@ 

raise TypeError("%s() received an invalid keyword %r. as_view " "only accepts arguments that are already " "attributes of the class." % (cls.__name__, key)) - def view(request, *args, **kwargs): + def view(request, *args, **kwargs): self = cls(**initkwargs) self.setup(request, *args, **kwargs) if not hasattr(self, 'request'): @@ -820,8 +820,8 @@

# the dispatch method. view.__dict__.update(cls.dispatch.__dict__) return view -

-
+
+ @@ -850,7 +850,7 @@

-
 93
+                                    
 93
  94
  95
  96
@@ -858,7 +858,7 @@ 

98 99 100 -101

def dispatch(self, request, *args, **kwargs):
+101
def dispatch(self, request, *args, **kwargs):
     # Try to dispatch to the right method; if a method doesn't exist,
     # defer to the error handler. Also defer to the error handler if the
     # request method isn't on the approved list.
@@ -867,8 +867,8 @@ 

else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs) -

-
+
+ @@ -897,13 +897,13 @@

If the form is invalid, render the invalid form.
-
61
+                                    
61
 62
-63
def form_invalid(self, form):
-    """If the form is invalid, render the invalid form."""
+63
def form_invalid(self, form):
+    """If the form is invalid, render the invalid form."""
     return self.render_to_response(self.get_context_data(form=form))
-
-
+
+ @@ -932,13 +932,13 @@

If the form is valid, redirect to the supplied URL.
-
57
+                                    
57
 58
-59
def form_valid(self, form):
-    """If the form is valid, redirect to the supplied URL."""
+59
def form_valid(self, form):
+    """If the form is valid, redirect to the supplied URL."""
     return HttpResponseRedirect(self.get_success_url())
-
-
+
+ @@ -967,13 +967,13 @@

Handle GET requests: instantiate a blank version of the form.
-
133
+                                    
133
 134
-135
def get(self, request, *args, **kwargs):
-    """Handle GET requests: instantiate a blank version of the form."""
+135
def get(self, request, *args, **kwargs):
+    """Handle GET requests: instantiate a blank version of the form."""
     return self.render_to_response(self.get_context_data())
-
-
+
+ @@ -1006,17 +1006,17 @@

FormMixin

Insert the form into the context dict.
-
65
+                                                
65
 66
 67
 68
-69
def get_context_data(self, **kwargs):
-    """Insert the form into the context dict."""
+69
def get_context_data(self, **kwargs):
+    """Insert the form into the context dict."""
     if 'form' not in kwargs:
         kwargs['form'] = self.get_form()
     return super().get_context_data(**kwargs)
-
-
+
+
@@ -1030,17 +1030,17 @@

ContextMixin

-
22
+                                                
22
 23
 24
 25
-26
def get_context_data(self, **kwargs):
+26
def get_context_data(self, **kwargs):
     kwargs.setdefault('view', self)
     if self.extra_context is not None:
         kwargs.update(self.extra_context)
     return kwargs
-
-
+
+
@@ -1076,17 +1076,17 @@

Return an instance of the form to be used in this view.
-
31
+                                    
31
 32
 33
 34
-35
def get_form(self, form_class=None):
-    """Return an instance of the form to be used in this view."""
+35
def get_form(self, form_class=None):
+    """Return an instance of the form to be used in this view."""
     if form_class is None:
         form_class = self.get_form_class()
     return form_class(**self.get_form_kwargs())
-
-
+
+ @@ -1115,13 +1115,13 @@

Return the form class to use.
-
27
+                                    
27
 28
-29
def get_form_class(self):
-    """Return the form class to use."""
+29
def get_form_class(self):
+    """Return the form class to use."""
     return self.form_class
-
-
+
+ @@ -1150,7 +1150,7 @@

Return the keyword arguments for instantiating the form.
-
37
+                                    
37
 38
 39
 40
@@ -1161,8 +1161,8 @@ 

45 46 47 -48

def get_form_kwargs(self):
-    """Return the keyword arguments for instantiating the form."""
+48
def get_form_kwargs(self):
+    """Return the keyword arguments for instantiating the form."""
     kwargs = {
         'initial': self.get_initial(),
         'prefix': self.get_prefix(),
@@ -1173,8 +1173,8 @@ 

'files': self.request.FILES, }) return kwargs -

-
+
+ @@ -1203,13 +1203,13 @@

Return the initial data to use for forms on this view.
-
19
+                                    
19
 20
-21
def get_initial(self):
-    """Return the initial data to use for forms on this view."""
+21
def get_initial(self):
+    """Return the initial data to use for forms on this view."""
     return self.initial.copy()
-
-
+
+ @@ -1238,13 +1238,13 @@

Return the prefix to use for forms.
-
23
+                                    
23
 24
-25
def get_prefix(self):
-    """Return the prefix to use for forms."""
+25
def get_prefix(self):
+    """Return the prefix to use for forms."""
     return self.prefix
-
-
+
+ @@ -1273,17 +1273,17 @@

Return the URL to redirect to after processing a valid form.
-
51
+                                    
51
 52
 53
 54
-55
def get_success_url(self):
-    """Return the URL to redirect to after processing a valid form."""
+55
def get_success_url(self):
+    """Return the URL to redirect to after processing a valid form."""
     if not self.success_url:
         raise ImproperlyConfigured("No URL to redirect to. Provide a success_url.")
     return str(self.success_url)  # success_url may be lazy
-
-
+
+ @@ -1313,7 +1313,7 @@

Return a list of template names to be used for the request. Must return
 a list. May not be called if render_to_response() is overridden.
-
144
+                                    
144
 145
 146
 147
@@ -1323,8 +1323,8 @@ 

151 152 153 -154

def get_template_names(self):
-    """
+154
def get_template_names(self):
+    """
     Return a list of template names to be used for the request. Must return
     a list. May not be called if render_to_response() is overridden.
     """
@@ -1334,8 +1334,8 @@ 

"'template_name' or an implementation of 'get_template_names()'") else: return [self.template_name] -

-
+
+ @@ -1364,19 +1364,19 @@

-
103
+                                    
103
 104
 105
 106
 107
-108
def http_method_not_allowed(self, request, *args, **kwargs):
+108
def http_method_not_allowed(self, request, *args, **kwargs):
     logger.warning(
         'Method Not Allowed (%s): %s', request.method, request.path,
         extra={'status_code': 405, 'request': request}
     )
     return HttpResponseNotAllowed(self._allowed_methods())
-
-
+
+ @@ -1405,19 +1405,19 @@

Handle responding to requests for the OPTIONS HTTP verb.
-
110
+                                    
110
 111
 112
 113
 114
-115
def options(self, request, *args, **kwargs):
-    """Handle responding to requests for the OPTIONS HTTP verb."""
+115
def options(self, request, *args, **kwargs):
+    """Handle responding to requests for the OPTIONS HTTP verb."""
     response = HttpResponse()
     response.headers['Allow'] = ', '.join(self._allowed_methods())
     response.headers['Content-Length'] = '0'
     return response
-
-
+
+ @@ -1447,7 +1447,7 @@

Handle POST requests: instantiate a form instance with the passed
 POST variables and then check if it's valid.
-
137
+                                    
137
 138
 139
 140
@@ -1456,8 +1456,8 @@ 

143 144 145 -146

def post(self, request, *args, **kwargs):
-    """
+146
def post(self, request, *args, **kwargs):
+    """
     Handle POST requests: instantiate a form instance with the passed
     POST variables and then check if it's valid.
     """
@@ -1466,8 +1466,8 @@ 

return self.form_valid(form) else: return self.form_invalid(form) -

-
+
+ @@ -1496,11 +1496,11 @@

-
150
-151
def put(self, *args, **kwargs):
+                                    
150
+151
def put(self, *args, **kwargs):
     return self.post(*args, **kwargs)
-
-
+
+ @@ -1532,7 +1532,7 @@

template rendered with the given context. Pass response_kwargs to the constructor of the response class. -
128
+                                    
128
 129
 130
 131
@@ -1545,8 +1545,8 @@ 

138 139 140 -141

def render_to_response(self, context, **response_kwargs):
-    """
+141
def render_to_response(self, context, **response_kwargs):
+    """
     Return a response, using the `response_class` for this view, with a
     template rendered with the given context.
     Pass response_kwargs to the constructor of the response class.
@@ -1559,8 +1559,8 @@ 

using=self.template_engine, **response_kwargs ) -

-
+
+ @@ -1589,21 +1589,21 @@

Initialize attributes shared by all view methods.
-
85
+                                    
85
 86
 87
 88
 89
 90
-91
def setup(self, request, *args, **kwargs):
-    """Initialize attributes shared by all view methods."""
+91
def setup(self, request, *args, **kwargs):
+    """Initialize attributes shared by all view methods."""
     if hasattr(self, 'get') and not hasattr(self, 'head'):
         self.head = self.get
     self.request = request
     self.args = args
     self.kwargs = kwargs
-
-
+
+ diff --git a/tests/_page_snapshots/klass-detail-old.html b/tests/_page_snapshots/klass-detail-old.html index d2d0f4c9..aa994913 100644 --- a/tests/_page_snapshots/klass-detail-old.html +++ b/tests/_page_snapshots/klass-detail-old.html @@ -669,7 +669,7 @@

Constructor. Called in the URLconf; can contain helpful extra
 keyword arguments, and other things.
-
38
+                                    
38
 39
 40
 41
@@ -677,8 +677,8 @@ 

43 44 45 -46

def __init__(self, **kwargs):
-    """
+46
def __init__(self, **kwargs):
+    """
     Constructor. Called in the URLconf; can contain helpful extra
     keyword arguments, and other things.
     """
@@ -686,8 +686,8 @@ 

# instance, or raise an error. for key, value in kwargs.items(): setattr(self, key, value) -

-
+
+ @@ -716,11 +716,11 @@

-
114
-115
def _allowed_methods(self):
+                                    
114
+115
def _allowed_methods(self):
     return [m.upper() for m in self.http_method_names if hasattr(self, m)]
-
-
+
+ @@ -749,7 +749,7 @@

Main entry point for a request-response process.
-
48
+                                    
48
 49
 50
 51
@@ -778,9 +778,9 @@ 

74 75 76 -77

@classonlymethod
-def as_view(cls, **initkwargs):
-    """Main entry point for a request-response process."""
+77
@classonlymethod
+def as_view(cls, **initkwargs):
+    """Main entry point for a request-response process."""
     for key in initkwargs:
         if key in cls.http_method_names:
             raise TypeError(
@@ -791,7 +791,7 @@ 

raise TypeError("%s() received an invalid keyword %r. as_view " "only accepts arguments that are already " "attributes of the class." % (cls.__name__, key)) - def view(request, *args, **kwargs): + def view(request, *args, **kwargs): self = cls(**initkwargs) self.setup(request, *args, **kwargs) if not hasattr(self, 'request'): @@ -808,8 +808,8 @@

# like csrf_exempt from dispatch update_wrapper(view, cls.dispatch, assigned=()) return view -

-
+
+ @@ -838,7 +838,7 @@

-
90
+                                    
90
 91
 92
 93
@@ -846,7 +846,7 @@ 

95 96 97 -98

def dispatch(self, request, *args, **kwargs):
+98
def dispatch(self, request, *args, **kwargs):
     # Try to dispatch to the right method; if a method doesn't exist,
     # defer to the error handler. Also defer to the error handler if the
     # request method isn't on the approved list.
@@ -855,8 +855,8 @@ 

else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs) -

-
+
+ @@ -885,13 +885,13 @@

If the form is invalid, render the invalid form.
-
59
+                                    
59
 60
-61
def form_invalid(self, form):
-    """If the form is invalid, render the invalid form."""
+61
def form_invalid(self, form):
+    """If the form is invalid, render the invalid form."""
     return self.render_to_response(self.get_context_data(form=form))
-
-
+
+ @@ -920,13 +920,13 @@

If the form is valid, redirect to the supplied URL.
-
55
+                                    
55
 56
-57
def form_valid(self, form):
-    """If the form is valid, redirect to the supplied URL."""
+57
def form_valid(self, form):
+    """If the form is valid, redirect to the supplied URL."""
     return HttpResponseRedirect(self.get_success_url())
-
-
+
+ @@ -955,13 +955,13 @@

Handle GET requests: instantiate a blank version of the form.
-
131
+                                    
131
 132
-133
def get(self, request, *args, **kwargs):
-    """Handle GET requests: instantiate a blank version of the form."""
+133
def get(self, request, *args, **kwargs):
+    """Handle GET requests: instantiate a blank version of the form."""
     return self.render_to_response(self.get_context_data())
-
-
+
+ @@ -994,17 +994,17 @@

FormMixin

Insert the form into the context dict.
-
63
+                                                
63
 64
 65
 66
-67
def get_context_data(self, **kwargs):
-    """Insert the form into the context dict."""
+67
def get_context_data(self, **kwargs):
+    """Insert the form into the context dict."""
     if 'form' not in kwargs:
         kwargs['form'] = self.get_form()
     return super().get_context_data(**kwargs)
-
-
+
+
@@ -1018,17 +1018,17 @@

ContextMixin

-
23
+                                                
23
 24
 25
 26
-27
def get_context_data(self, **kwargs):
+27
def get_context_data(self, **kwargs):
     kwargs.setdefault('view', self)
     if self.extra_context is not None:
         kwargs.update(self.extra_context)
     return kwargs
-
-
+
+
@@ -1064,17 +1064,17 @@

Return an instance of the form to be used in this view.
-
29
+                                    
29
 30
 31
 32
-33
def get_form(self, form_class=None):
-    """Return an instance of the form to be used in this view."""
+33
def get_form(self, form_class=None):
+    """Return an instance of the form to be used in this view."""
     if form_class is None:
         form_class = self.get_form_class()
     return form_class(**self.get_form_kwargs())
-
-
+
+ @@ -1103,13 +1103,13 @@

Return the form class to use.
-
25
+                                    
25
 26
-27
def get_form_class(self):
-    """Return the form class to use."""
+27
def get_form_class(self):
+    """Return the form class to use."""
     return self.form_class
-
-
+
+ @@ -1138,7 +1138,7 @@

Return the keyword arguments for instantiating the form.
-
35
+                                    
35
 36
 37
 38
@@ -1149,8 +1149,8 @@ 

43 44 45 -46

def get_form_kwargs(self):
-    """Return the keyword arguments for instantiating the form."""
+46
def get_form_kwargs(self):
+    """Return the keyword arguments for instantiating the form."""
     kwargs = {
         'initial': self.get_initial(),
         'prefix': self.get_prefix(),
@@ -1161,8 +1161,8 @@ 

'files': self.request.FILES, }) return kwargs -

-
+
+ @@ -1191,13 +1191,13 @@

Return the initial data to use for forms on this view.
-
17
+                                    
17
 18
-19
def get_initial(self):
-    """Return the initial data to use for forms on this view."""
+19
def get_initial(self):
+    """Return the initial data to use for forms on this view."""
     return self.initial.copy()
-
-
+
+ @@ -1226,13 +1226,13 @@

Return the prefix to use for forms.
-
21
+                                    
21
 22
-23
def get_prefix(self):
-    """Return the prefix to use for forms."""
+23
def get_prefix(self):
+    """Return the prefix to use for forms."""
     return self.prefix
-
-
+
+ @@ -1261,17 +1261,17 @@

Return the URL to redirect to after processing a valid form.
-
49
+                                    
49
 50
 51
 52
-53
def get_success_url(self):
-    """Return the URL to redirect to after processing a valid form."""
+53
def get_success_url(self):
+    """Return the URL to redirect to after processing a valid form."""
     if not self.success_url:
         raise ImproperlyConfigured("No URL to redirect to. Provide a success_url.")
     return str(self.success_url)  # success_url may be lazy
-
-
+
+ @@ -1301,7 +1301,7 @@

Return a list of template names to be used for the request. Must return
 a list. May not be called if render_to_response() is overridden.
-
141
+                                    
141
 142
 143
 144
@@ -1311,8 +1311,8 @@ 

148 149 150 -151

def get_template_names(self):
-    """
+151
def get_template_names(self):
+    """
     Return a list of template names to be used for the request. Must return
     a list. May not be called if render_to_response() is overridden.
     """
@@ -1322,8 +1322,8 @@ 

"'template_name' or an implementation of 'get_template_names()'") else: return [self.template_name] -

-
+
+ @@ -1352,19 +1352,19 @@

-
100
+                                    
100
 101
 102
 103
 104
-105
def http_method_not_allowed(self, request, *args, **kwargs):
+105
def http_method_not_allowed(self, request, *args, **kwargs):
     logger.warning(
         'Method Not Allowed (%s): %s', request.method, request.path,
         extra={'status_code': 405, 'request': request}
     )
     return HttpResponseNotAllowed(self._allowed_methods())
-
-
+
+ @@ -1393,19 +1393,19 @@

Handle responding to requests for the OPTIONS HTTP verb.
-
107
+                                    
107
 108
 109
 110
 111
-112
def options(self, request, *args, **kwargs):
-    """Handle responding to requests for the OPTIONS HTTP verb."""
+112
def options(self, request, *args, **kwargs):
+    """Handle responding to requests for the OPTIONS HTTP verb."""
     response = HttpResponse()
     response.headers['Allow'] = ', '.join(self._allowed_methods())
     response.headers['Content-Length'] = '0'
     return response
-
-
+
+ @@ -1435,7 +1435,7 @@

Handle POST requests: instantiate a form instance with the passed
 POST variables and then check if it's valid.
-
135
+                                    
135
 136
 137
 138
@@ -1444,8 +1444,8 @@ 

141 142 143 -144

def post(self, request, *args, **kwargs):
-    """
+144
def post(self, request, *args, **kwargs):
+    """
     Handle POST requests: instantiate a form instance with the passed
     POST variables and then check if it's valid.
     """
@@ -1454,8 +1454,8 @@ 

return self.form_valid(form) else: return self.form_invalid(form) -

-
+
+ @@ -1484,11 +1484,11 @@

-
148
-149
def put(self, *args, **kwargs):
+                                    
148
+149
def put(self, *args, **kwargs):
     return self.post(*args, **kwargs)
-
-
+
+ @@ -1520,7 +1520,7 @@

template rendered with the given context. Pass response_kwargs to the constructor of the response class. -
125
+                                    
125
 126
 127
 128
@@ -1533,8 +1533,8 @@ 

135 136 137 -138

def render_to_response(self, context, **response_kwargs):
-    """
+138
def render_to_response(self, context, **response_kwargs):
+    """
     Return a response, using the `response_class` for this view, with a
     template rendered with the given context.
     Pass response_kwargs to the constructor of the response class.
@@ -1547,8 +1547,8 @@ 

using=self.template_engine, **response_kwargs ) -

-
+
+ @@ -1577,21 +1577,21 @@

Initialize attributes shared by all view methods.
-
82
+                                    
82
 83
 84
 85
 86
 87
-88
def setup(self, request, *args, **kwargs):
-    """Initialize attributes shared by all view methods."""
+88
def setup(self, request, *args, **kwargs):
+    """Initialize attributes shared by all view methods."""
     if hasattr(self, 'get') and not hasattr(self, 'head'):
         self.head = self.get
     self.request = request
     self.args = args
     self.kwargs = kwargs
-
-
+
+ diff --git a/tests/_page_snapshots/klass-detail.html b/tests/_page_snapshots/klass-detail.html index dd2b7947..6565802b 100644 --- a/tests/_page_snapshots/klass-detail.html +++ b/tests/_page_snapshots/klass-detail.html @@ -669,7 +669,7 @@

Constructor. Called in the URLconf; can contain helpful extra
 keyword arguments, and other things.
-
37
+                                    
37
 38
 39
 40
@@ -677,8 +677,8 @@ 

42 43 44 -45

def __init__(self, **kwargs):
-    """
+45
def __init__(self, **kwargs):
+    """
     Constructor. Called in the URLconf; can contain helpful extra
     keyword arguments, and other things.
     """
@@ -686,8 +686,8 @@ 

# instance, or raise an error. for key, value in kwargs.items(): setattr(self, key, value) -

-
+
+ @@ -716,11 +716,11 @@

-
117
-118
def _allowed_methods(self):
+                                    
117
+118
def _allowed_methods(self):
     return [m.upper() for m in self.http_method_names if hasattr(self, m)]
-
-
+
+ @@ -749,7 +749,7 @@

Main entry point for a request-response process.
-
47
+                                    
47
 48
 49
 50
@@ -782,9 +782,9 @@ 

77 78 79 -80

@classonlymethod
-def as_view(cls, **initkwargs):
-    """Main entry point for a request-response process."""
+80
@classonlymethod
+def as_view(cls, **initkwargs):
+    """Main entry point for a request-response process."""
     for key in initkwargs:
         if key in cls.http_method_names:
             raise TypeError(
@@ -795,7 +795,7 @@ 

raise TypeError("%s() received an invalid keyword %r. as_view " "only accepts arguments that are already " "attributes of the class." % (cls.__name__, key)) - def view(request, *args, **kwargs): + def view(request, *args, **kwargs): self = cls(**initkwargs) self.setup(request, *args, **kwargs) if not hasattr(self, 'request'): @@ -816,8 +816,8 @@

# the dispatch method. view.__dict__.update(cls.dispatch.__dict__) return view -

-
+
+ @@ -846,7 +846,7 @@

-
 93
+                                    
 93
  94
  95
  96
@@ -854,7 +854,7 @@ 

98 99 100 -101

def dispatch(self, request, *args, **kwargs):
+101
def dispatch(self, request, *args, **kwargs):
     # Try to dispatch to the right method; if a method doesn't exist,
     # defer to the error handler. Also defer to the error handler if the
     # request method isn't on the approved list.
@@ -863,8 +863,8 @@ 

else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs) -

-
+
+ @@ -893,13 +893,13 @@

If the form is invalid, render the invalid form.
-
61
+                                    
61
 62
-63
def form_invalid(self, form):
-    """If the form is invalid, render the invalid form."""
+63
def form_invalid(self, form):
+    """If the form is invalid, render the invalid form."""
     return self.render_to_response(self.get_context_data(form=form))
-
-
+
+ @@ -928,13 +928,13 @@

If the form is valid, redirect to the supplied URL.
-
57
+                                    
57
 58
-59
def form_valid(self, form):
-    """If the form is valid, redirect to the supplied URL."""
+59
def form_valid(self, form):
+    """If the form is valid, redirect to the supplied URL."""
     return HttpResponseRedirect(self.get_success_url())
-
-
+
+ @@ -963,13 +963,13 @@

Handle GET requests: instantiate a blank version of the form.
-
133
+                                    
133
 134
-135
def get(self, request, *args, **kwargs):
-    """Handle GET requests: instantiate a blank version of the form."""
+135
def get(self, request, *args, **kwargs):
+    """Handle GET requests: instantiate a blank version of the form."""
     return self.render_to_response(self.get_context_data())
-
-
+
+ @@ -1002,17 +1002,17 @@

FormMixin

Insert the form into the context dict.
-
65
+                                                
65
 66
 67
 68
-69
def get_context_data(self, **kwargs):
-    """Insert the form into the context dict."""
+69
def get_context_data(self, **kwargs):
+    """Insert the form into the context dict."""
     if 'form' not in kwargs:
         kwargs['form'] = self.get_form()
     return super().get_context_data(**kwargs)
-
-
+
+
@@ -1026,17 +1026,17 @@

ContextMixin

-
22
+                                                
22
 23
 24
 25
-26
def get_context_data(self, **kwargs):
+26
def get_context_data(self, **kwargs):
     kwargs.setdefault('view', self)
     if self.extra_context is not None:
         kwargs.update(self.extra_context)
     return kwargs
-
-
+
+
@@ -1072,17 +1072,17 @@

Return an instance of the form to be used in this view.
-
31
+                                    
31
 32
 33
 34
-35
def get_form(self, form_class=None):
-    """Return an instance of the form to be used in this view."""
+35
def get_form(self, form_class=None):
+    """Return an instance of the form to be used in this view."""
     if form_class is None:
         form_class = self.get_form_class()
     return form_class(**self.get_form_kwargs())
-
-
+
+ @@ -1111,13 +1111,13 @@

Return the form class to use.
-
27
+                                    
27
 28
-29
def get_form_class(self):
-    """Return the form class to use."""
+29
def get_form_class(self):
+    """Return the form class to use."""
     return self.form_class
-
-
+
+ @@ -1146,7 +1146,7 @@

Return the keyword arguments for instantiating the form.
-
37
+                                    
37
 38
 39
 40
@@ -1157,8 +1157,8 @@ 

45 46 47 -48

def get_form_kwargs(self):
-    """Return the keyword arguments for instantiating the form."""
+48
def get_form_kwargs(self):
+    """Return the keyword arguments for instantiating the form."""
     kwargs = {
         'initial': self.get_initial(),
         'prefix': self.get_prefix(),
@@ -1169,8 +1169,8 @@ 

'files': self.request.FILES, }) return kwargs -

-
+
+ @@ -1199,13 +1199,13 @@

Return the initial data to use for forms on this view.
-
19
+                                    
19
 20
-21
def get_initial(self):
-    """Return the initial data to use for forms on this view."""
+21
def get_initial(self):
+    """Return the initial data to use for forms on this view."""
     return self.initial.copy()
-
-
+
+ @@ -1234,13 +1234,13 @@

Return the prefix to use for forms.
-
23
+                                    
23
 24
-25
def get_prefix(self):
-    """Return the prefix to use for forms."""
+25
def get_prefix(self):
+    """Return the prefix to use for forms."""
     return self.prefix
-
-
+
+ @@ -1269,17 +1269,17 @@

Return the URL to redirect to after processing a valid form.
-
51
+                                    
51
 52
 53
 54
-55
def get_success_url(self):
-    """Return the URL to redirect to after processing a valid form."""
+55
def get_success_url(self):
+    """Return the URL to redirect to after processing a valid form."""
     if not self.success_url:
         raise ImproperlyConfigured("No URL to redirect to. Provide a success_url.")
     return str(self.success_url)  # success_url may be lazy
-
-
+
+ @@ -1309,7 +1309,7 @@

Return a list of template names to be used for the request. Must return
 a list. May not be called if render_to_response() is overridden.
-
144
+                                    
144
 145
 146
 147
@@ -1319,8 +1319,8 @@ 

151 152 153 -154

def get_template_names(self):
-    """
+154
def get_template_names(self):
+    """
     Return a list of template names to be used for the request. Must return
     a list. May not be called if render_to_response() is overridden.
     """
@@ -1330,8 +1330,8 @@ 

"'template_name' or an implementation of 'get_template_names()'") else: return [self.template_name] -

-
+
+ @@ -1360,19 +1360,19 @@

-
103
+                                    
103
 104
 105
 106
 107
-108
def http_method_not_allowed(self, request, *args, **kwargs):
+108
def http_method_not_allowed(self, request, *args, **kwargs):
     logger.warning(
         'Method Not Allowed (%s): %s', request.method, request.path,
         extra={'status_code': 405, 'request': request}
     )
     return HttpResponseNotAllowed(self._allowed_methods())
-
-
+
+ @@ -1401,19 +1401,19 @@

Handle responding to requests for the OPTIONS HTTP verb.
-
110
+                                    
110
 111
 112
 113
 114
-115
def options(self, request, *args, **kwargs):
-    """Handle responding to requests for the OPTIONS HTTP verb."""
+115
def options(self, request, *args, **kwargs):
+    """Handle responding to requests for the OPTIONS HTTP verb."""
     response = HttpResponse()
     response.headers['Allow'] = ', '.join(self._allowed_methods())
     response.headers['Content-Length'] = '0'
     return response
-
-
+
+ @@ -1443,7 +1443,7 @@

Handle POST requests: instantiate a form instance with the passed
 POST variables and then check if it's valid.
-
137
+                                    
137
 138
 139
 140
@@ -1452,8 +1452,8 @@ 

143 144 145 -146

def post(self, request, *args, **kwargs):
-    """
+146
def post(self, request, *args, **kwargs):
+    """
     Handle POST requests: instantiate a form instance with the passed
     POST variables and then check if it's valid.
     """
@@ -1462,8 +1462,8 @@ 

return self.form_valid(form) else: return self.form_invalid(form) -

-
+
+ @@ -1492,11 +1492,11 @@

-
150
-151
def put(self, *args, **kwargs):
+                                    
150
+151
def put(self, *args, **kwargs):
     return self.post(*args, **kwargs)
-
-
+
+ @@ -1528,7 +1528,7 @@

template rendered with the given context. Pass response_kwargs to the constructor of the response class. -
128
+                                    
128
 129
 130
 131
@@ -1541,8 +1541,8 @@ 

138 139 140 -141

def render_to_response(self, context, **response_kwargs):
-    """
+141
def render_to_response(self, context, **response_kwargs):
+    """
     Return a response, using the `response_class` for this view, with a
     template rendered with the given context.
     Pass response_kwargs to the constructor of the response class.
@@ -1555,8 +1555,8 @@ 

using=self.template_engine, **response_kwargs ) -

-
+
+ @@ -1585,21 +1585,21 @@

Initialize attributes shared by all view methods.
-
85
+                                    
85
 86
 87
 88
 89
 90
-91
def setup(self, request, *args, **kwargs):
-    """Initialize attributes shared by all view methods."""
+91
def setup(self, request, *args, **kwargs):
+    """Initialize attributes shared by all view methods."""
     if hasattr(self, 'get') and not hasattr(self, 'head'):
         self.head = self.get
     self.request = request
     self.args = args
     self.kwargs = kwargs
-
-
+
+ diff --git a/tests/test_page_snapshots.py b/tests/test_page_snapshots.py index c0d49f18..85e9f065 100644 --- a/tests/test_page_snapshots.py +++ b/tests/test_page_snapshots.py @@ -6,10 +6,9 @@ from django.urls import reverse from pytest_django.asserts import assertHTMLEqual, assertNumQueries from pytest_django.fixtures import SettingsWrapper -from pytest_subtests import SubTests -RENDERED_VIEWS = [ +parameters = [ ( "homepage.html", 5, @@ -94,9 +93,27 @@ ] +@pytest.mark.parametrize( + ["filename", "num_queries", "url"], + parameters, + ids=[ + "homepage", + "version-detail.html", + "module-detail.html", + "klass-detail.html", + "klass-detail-old.html", + "fuzzy-module-detail.html", + "fuzzy-klas-detail.html", + "fuzzy-klass-detail-old.html", + ], +) @pytest.mark.django_db def test_page_html( - client: Client, settings: SettingsWrapper, subtests: SubTests + client: Client, + settings: SettingsWrapper, + filename: str, + num_queries: int, + url: str, ) -> None: """ Checks that the pages in the array above match the reference files in tests/_page_snapshots/. @@ -118,22 +135,20 @@ def test_page_html( # ValueError: Missing staticfiles manifest entry for 'bootstrap.css' settings.STATICFILES_STORAGE = None - for filename, num_queries, url in RENDERED_VIEWS: - with subtests.test(url=url): - with assertNumQueries(num_queries): - response = client.get(url) + with assertNumQueries(num_queries): + response = client.get(url) - html = response.rendered_content - path = Path("tests/_page_snapshots", filename) + html = response.rendered_content + path = Path("tests/_page_snapshots", filename) - # Uncomment the below to re-generate the reference files - # when they need to change for a legitimate reason. - # DO NOT commit this uncommented! - # path.write_text(html) + # Uncomment the below to re-generate the reference files when they need to + # change for a legitimate reason. + # DO NOT commit this uncommented! + # path.write_text(html) - expected = path.read_text() + expected = path.read_text() - # This forces a useful error in the case of a mismatch. - # We have to ignore the type because accessing __wrapped__ is pretty odd. - assertHTMLEqual.__wrapped__.__self__.maxDiff = None # type: ignore - assertHTMLEqual(html, expected) + # This forces a useful error in the case of a mismatch. We have to ignore + # the type because accessing __wrapped__ is pretty odd. + assertHTMLEqual.__wrapped__.__self__.maxDiff = None # type: ignore + assertHTMLEqual(html, expected) diff --git a/uv.lock b/uv.lock new file mode 100644 index 00000000..c75a66bd --- /dev/null +++ b/uv.lock @@ -0,0 +1,892 @@ +version = 1 +revision = 2 +requires-python = ">=3.10" +resolution-markers = [ + "python_full_version >= '3.11'", + "python_full_version < '3.11'", +] + +[[package]] +name = "alabaster" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload_time = "2024-07-26T18:15:03.762Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload_time = "2024-07-26T18:15:02.05Z" }, +] + +[[package]] +name = "asgiref" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/93/3618b68b4ba6b54bc97b5fd7d90e4981471edfaf51c8321a29a3c76cf47c/asgiref-3.4.1.tar.gz", hash = "sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9", size = 32529, upload_time = "2021-07-01T16:17:42.656Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/66/577f32b54c50dcd8dec38447258e82ed327ecb86820d67ae7b3dea784f13/asgiref-3.4.1-py3-none-any.whl", hash = "sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214", size = 25019, upload_time = "2021-07-01T16:17:40.824Z" }, +] + +[[package]] +name = "atomicwrites" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/c6/53da25344e3e3a9c01095a89f16dbcda021c609ddb42dd6d7c0528236fb2/atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11", size = 14227, upload_time = "2022-07-08T18:31:40.459Z" } + +[[package]] +name = "attrs" +version = "21.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/77/ebb15fc26d0f815839ecd897b919ed6d85c050feeb83e100e020df9153d2/attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd", size = 201839, upload_time = "2021-12-29T13:15:09.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/be/7abce643bfdf8ca01c48afa2ddf8308c2308b0c3b239a44e57d020afa0ef/attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4", size = 60567, upload_time = "2021-12-29T13:15:06.703Z" }, +] + +[[package]] +name = "babel" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload_time = "2025-02-01T15:17:41.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload_time = "2025-02-01T15:17:37.39Z" }, +] + +[[package]] +name = "backports-entry-points-selectable" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/bf/2a7a454f330177a075a69ecfd56b4af66c086145f33fe25860597fecebb1/backports.entry_points_selectable-1.2.0.tar.gz", hash = "sha256:4706f59179657ca7c1d325a543ee1370f8f46331f432bcac62fab242fdf0afa5", size = 9179, upload_time = "2022-10-02T00:31:58.544Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/9f/1f2b0064c8dc23da29c7973bf07ada730bcb6b52e1cd1f3decb6b711d643/backports.entry_points_selectable-1.2.0-py3-none-any.whl", hash = "sha256:ae81aeef71c2de28818b26a588e4a4d98d94c6d8e738525aec827a6e2974753d", size = 6170, upload_time = "2022-10-02T00:31:56.869Z" }, +] + +[[package]] +name = "blessings" +version = "1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/f8/9f5e69a63a9243448350b44c87fae74588aa634979e6c0c501f26a4f6df7/blessings-1.7.tar.gz", hash = "sha256:98e5854d805f50a5b58ac2333411b0482516a8210f23f43308baeb58d77c157d", size = 28194, upload_time = "2018-06-21T14:00:25.518Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/74/489f85a78247609c6b4f13733cbf3ba0d864b11aa565617b645d6fdf2a4a/blessings-1.7-py3-none-any.whl", hash = "sha256:b1fdd7e7a675295630f9ae71527a8ebc10bfefa236b3d6aa4932ee4462c17ba3", size = 18460, upload_time = "2018-06-21T14:00:24.412Z" }, +] + +[[package]] +name = "ccbv" +version = "1.0.0" +source = { virtual = "." } +dependencies = [ + { name = "attrs" }, + { name = "blessings" }, + { name = "django" }, + { name = "django-extensions" }, + { name = "django-pygmy" }, + { name = "django-sans-db" }, + { name = "environs", extra = ["django"] }, + { name = "gunicorn" }, + { name = "requests" }, + { name = "sphinx" }, + { name = "werkzeug" }, + { name = "whitenoise" }, +] + +[package.dev-dependencies] +dev = [ + { name = "coverage", extra = ["toml"] }, + { name = "factory-boy" }, + { name = "mypy" }, + { name = "mypy-json-report" }, + { name = "pre-commit" }, + { name = "pytest" }, + { name = "pytest-django" }, + { name = "types-requests" }, +] + +[package.metadata] +requires-dist = [ + { name = "attrs", specifier = ">=21.4.0" }, + { name = "blessings", specifier = ">=1.7" }, + { name = "django", specifier = "~=3.1.14" }, + { name = "django-extensions", specifier = ">=3.1.3" }, + { name = "django-pygmy", specifier = ">=0.1.5" }, + { name = "django-sans-db", specifier = ">=1.2.0" }, + { name = "environs", extras = ["django"], specifier = ">=9.5.0" }, + { name = "gunicorn", specifier = ">=20.1.0" }, + { name = "requests", specifier = ">=2.32.3" }, + { name = "sphinx", specifier = ">=8.1.3" }, + { name = "werkzeug", specifier = ">=2.0.2" }, + { name = "whitenoise", specifier = ">=5.3.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "coverage", extras = ["toml"], specifier = ">=6.5.0" }, + { name = "factory-boy", specifier = ">=3.2.0" }, + { name = "mypy", specifier = ">=0.931" }, + { name = "mypy-json-report", specifier = ">=0.1.3" }, + { name = "pre-commit", specifier = ">=2.15.0" }, + { name = "pytest", specifier = ">=7.1.2" }, + { name = "pytest-django", specifier = ">=4.5.2" }, + { name = "types-requests", specifier = ">=2.27.7" }, +] + +[[package]] +name = "certifi" +version = "2022.12.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/37/f7/2b1b0ec44fdc30a3d31dfebe52226be9ddc40cd6c0f34ffc8923ba423b69/certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", size = 156897, upload_time = "2022-12-07T20:13:22.081Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/4c/3db2b8021bd6f2f0ceb0e088d6b2d49147671f25832fb17970e9b583d742/certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18", size = 155255, upload_time = "2022-12-07T20:13:19.428Z" }, +] + +[[package]] +name = "cfgv" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/bf/d0d622b660d414a47dc7f0d303791a627663f554345b21250e39e7acb48b/cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736", size = 7864, upload_time = "2021-08-25T14:18:49.905Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/82/0a0ebd35bae9981dea55c06f8e6aaf44a49171ad798795c72c6f64cba4c2/cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426", size = 7312, upload_time = "2021-08-25T14:18:47.77Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "2.0.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/c5/334c019f92c26e59637bb42bd14a190428874b2b2de75a355da394cf16c1/charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0", size = 362802, upload_time = "2021-10-11T21:28:28.918Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/c8/820b1546c68efcbbe3c1b10dd925fbd84a0dda7438bc18db0ef1fa567733/charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b", size = 38247, upload_time = "2021-10-11T21:28:25.641Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload_time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "coverage" +version = "6.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/66/38d1870cb7cf62da49add1d6803fdbcdef632b2808b5c80bcac35b7634d8/coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84", size = 775224, upload_time = "2022-09-29T20:05:58.509Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/8d/5ec7d08f4601d2d792563fe31db5e9322c306848fec1e65ec8885927f739/coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53", size = 185264, upload_time = "2022-09-29T20:04:39.481Z" }, + { url = "https://files.pythonhosted.org/packages/89/a2/cbf599e50bb4be416e0408c4cf523c354c51d7da39935461a9687e039481/coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660", size = 185482, upload_time = "2022-09-29T20:04:41.703Z" }, + { url = "https://files.pythonhosted.org/packages/15/b0/3639d84ee8a900da0cf6450ab46e22517e4688b6cec0ba8ab6f8166103a2/coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4", size = 214083, upload_time = "2022-09-29T20:04:43.294Z" }, + { url = "https://files.pythonhosted.org/packages/13/f3/c6025ba30f2ce21d20d5332c3819880fe8afdfc008c2e2f9c075c7b67543/coverage-6.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04", size = 212396, upload_time = "2022-09-29T20:04:44.809Z" }, + { url = "https://files.pythonhosted.org/packages/3c/7d/d5211ea782b193ab8064b06dc0cc042cf1a4ca9c93a530071459172c550f/coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0", size = 213270, upload_time = "2022-09-29T20:04:46.291Z" }, + { url = "https://files.pythonhosted.org/packages/10/9e/68e384940179713640743a010ac7f7c813d1087c8730a9c0bdfa73bdffd7/coverage-6.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae", size = 219188, upload_time = "2022-09-29T20:04:47.728Z" }, + { url = "https://files.pythonhosted.org/packages/2f/8b/ca3fe3cfbd66d63181f6e6a06b8b494bb327ba8222d2fa628b392b9ad08a/coverage-6.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466", size = 217430, upload_time = "2022-09-29T20:04:49.098Z" }, + { url = "https://files.pythonhosted.org/packages/c0/18/2a0a9b3c29376ce04ceb7ca2948559dad76409a2c9b3f664756581101e16/coverage-6.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a", size = 218646, upload_time = "2022-09-29T20:04:50.582Z" }, + { url = "https://files.pythonhosted.org/packages/11/9e/7afba355bdabc550b3b2669e3432e71aec87d79400372d7686c09aab0acf/coverage-6.5.0-cp310-cp310-win32.whl", hash = "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32", size = 187602, upload_time = "2022-09-29T20:04:52.509Z" }, + { url = "https://files.pythonhosted.org/packages/ae/a3/f45cb5d32de0751863945d22083c15eb8854bb53681b2e792f2066c629b9/coverage-6.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e", size = 188510, upload_time = "2022-09-29T20:04:54.421Z" }, + { url = "https://files.pythonhosted.org/packages/50/cf/455930004231fa87efe8be06d13512f34e070ddfee8b8bf5a050cdc47ab3/coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795", size = 185433, upload_time = "2022-09-29T20:04:55.856Z" }, + { url = "https://files.pythonhosted.org/packages/36/f3/5cbd79cf4cd059c80b59104aca33b8d05af4ad5bf5b1547645ecee716378/coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75", size = 217736, upload_time = "2022-09-29T20:04:57.242Z" }, + { url = "https://files.pythonhosted.org/packages/89/58/5ec19b43a6511288511f64fc4763d95af8403f5926e7e4556e6b29b03a26/coverage-6.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b", size = 215313, upload_time = "2022-09-29T20:04:58.661Z" }, + { url = "https://files.pythonhosted.org/packages/6a/63/8e82513b7e4a1b8d887b4e85c1c2b6c9b754a581b187c0b084f3330ac479/coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91", size = 217115, upload_time = "2022-09-29T20:05:00.194Z" }, + { url = "https://files.pythonhosted.org/packages/ac/bc/c9d4fd6b3494d2cc1e26f4b98eb19206b92a59094617ad02d5689ac9d3c4/coverage-6.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4", size = 226072, upload_time = "2022-09-29T20:05:01.635Z" }, + { url = "https://files.pythonhosted.org/packages/78/98/253ce0cfcc3b352d3072940940ed44a035614f2abe781477f77038d21d9f/coverage-6.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa", size = 224486, upload_time = "2022-09-29T20:05:03.158Z" }, + { url = "https://files.pythonhosted.org/packages/4b/66/6e588f5dfc93ccedd06d6785c8143f17bb92b89247d50128d8789e9588d0/coverage-6.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b", size = 225537, upload_time = "2022-09-29T20:05:04.646Z" }, + { url = "https://files.pythonhosted.org/packages/ff/27/339089b558672f04e62d0cd2d49b9280270bad3bc95de24e7eb03deb4638/coverage-6.5.0-cp311-cp311-win32.whl", hash = "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578", size = 187586, upload_time = "2022-09-29T20:05:06.22Z" }, + { url = "https://files.pythonhosted.org/packages/e6/24/7fe8ededb4060dd8c3f1d86cb624fcb3452f66fbef5051ed7fab126c5c0c/coverage-6.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b", size = 188604, upload_time = "2022-09-29T20:05:09.007Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version <= '3.11'" }, +] + +[[package]] +name = "distlib" +version = "0.3.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/56/ed/9c876a62efda9901863e2cc8825a13a7fcbda75b4b498103a4286ab1653b/distlib-0.3.3.zip", hash = "sha256:d982d0751ff6eaaab5e2ec8e691d949ee80eddf01a62eaa96ddb11531fe16b05", size = 743791, upload_time = "2021-09-22T07:14:07.449Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/36/4bdfb663826d6deedc30b179a7b7876a86943cec9fcfc3f1638489fd8b09/distlib-0.3.3-py2.py3-none-any.whl", hash = "sha256:c8b54e8454e5bf6237cc84c20e8264c3e991e824ef27e8f1e81049867d861e31", size = 496107, upload_time = "2021-09-22T07:13:59.24Z" }, +] + +[[package]] +name = "dj-database-url" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/c4/98fbf678e810029be8078419f7bba626aafa2e81bc38748757db954c477c/dj-database-url-0.5.0.tar.gz", hash = "sha256:4aeaeb1f573c74835b0686a2b46b85990571159ffc21aa57ecd4d1e1cb334163", size = 5482, upload_time = "2018-03-01T18:39:51.842Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/a6/4b8578c1848690d0c307c7c0596af2077536c9ef2a04d42b00fabaa7e49d/dj_database_url-0.5.0-py2.py3-none-any.whl", hash = "sha256:851785365761ebe4994a921b433062309eb882fedd318e1b0fcecc607ed02da9", size = 5502, upload_time = "2018-03-01T18:39:49.412Z" }, +] + +[[package]] +name = "dj-email-url" +version = "1.0.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/14/ef/8eb478accd9b0369d46a98d1b43027ee0c254096149265c78e6b2e2fa3b0/dj-email-url-1.0.6.tar.gz", hash = "sha256:55ffe3329e48f54f8a75aa36ece08f365e09d61f8a209773ef09a1d4760e699a", size = 15590, upload_time = "2022-09-24T11:04:50.281Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/f9/fcb9745099d821f9a26092d3d6f4df8f10049885045c3a93ff726d2e40a6/dj_email_url-1.0.6-py2.py3-none-any.whl", hash = "sha256:cbd08327fbb08b104eac160fb4703f375532e4c0243eb230f5b960daee7a96db", size = 6296, upload_time = "2022-09-24T11:04:47.191Z" }, +] + +[[package]] +name = "django" +version = "3.1.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref" }, + { name = "pytz" }, + { name = "sqlparse" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/59/b774fbaf743e675e9a808406a39814effb723c7c0b1d4a5b3b2e794ce077/Django-3.1.14.tar.gz", hash = "sha256:72a4a5a136a214c39cf016ccdd6b69e2aa08c7479c66d93f3a9b5e4bb9d8a347", size = 9659386, upload_time = "2021-12-07T07:35:00.76Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/2e/b031dc0789840ebc108d4654c134e86a9f6593ce9c58ce39328c142b24b8/Django-3.1.14-py3-none-any.whl", hash = "sha256:0fabc786489af16ad87a8c170ba9d42bfd23f7b699bd5ef05675864e8d012859", size = 7835424, upload_time = "2021-12-07T07:34:46.584Z" }, +] + +[[package]] +name = "django-cache-url" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/5d/d6f6c608c23fbeaf32b9c2cc2a7294f5675f40a15c8c3076c3e7a257768a/django-cache-url-3.4.2.tar.gz", hash = "sha256:6cc9901a99a99751f5458aa7de08ce06e48c1441b1a94c9457d78af74fab9a26", size = 5429, upload_time = "2022-05-30T14:00:57.266Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/ad/3f0777fc12c04217e82692e6bd96a05cb69b6ff79d0ee506fca725d749d3/django_cache_url-3.4.2-py2.py3-none-any.whl", hash = "sha256:c4a62634cffc9d636073cef597a44576d67b07660ab2ef1f02b160ee7ecf0e98", size = 4727, upload_time = "2022-05-30T14:00:55.755Z" }, +] + +[[package]] +name = "django-extensions" +version = "3.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/40/22ff745aea0468dcefba8b165d010e5260d3058862ea280c2ce5212c8560/django-extensions-3.1.3.tar.gz", hash = "sha256:5f0fea7bf131ca303090352577a9e7f8bfbf5489bd9d9c8aea9401db28db34a0", size = 614094, upload_time = "2021-04-19T17:44:19.918Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/40/c94fde79735d0c3578ed7d595593bd52c5633d8a02e53a2ef9346f93e2db/django_extensions-3.1.3-py3-none-any.whl", hash = "sha256:50de8977794a66a91575dd40f87d5053608f679561731845edbd325ceeb387e3", size = 223440, upload_time = "2021-04-19T17:44:17.876Z" }, +] + +[[package]] +name = "django-pygmy" +version = "0.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b8/80/efcf3a44c55d3afe3df6af9bc77050a7327ded21546f41517c77213b6f6c/django-pygmy-0.1.5.tar.gz", hash = "sha256:d32a39cb80cf377d89e7a17e49b98f3daa3b8d443ccfa06946bb6bf333841ad1", size = 3602, upload_time = "2013-06-19T12:39:25.358Z" } + +[[package]] +name = "django-sans-db" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/50/0d/565b09458d08128c852f815db3361fbb101437d5381eb7f0e87d536386f7/django_sans_db-1.2.0.tar.gz", hash = "sha256:81fa58e8aab4a48e19d8cd8a0b92ede96ae61a46bdc7b46c57eb3a089679e2ef", size = 4852, upload_time = "2022-10-23T17:16:21.051Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/09/00c8d4c1475a8c92936c2b18b497a122e2fa824ab3b5972577232f481107/django_sans_db-1.2.0-py3-none-any.whl", hash = "sha256:c83dc0342fc070bf7d77205db323e81c6e8ea14546cd4d3608c9bc8259f5252d", size = 5860, upload_time = "2022-10-23T17:16:19.645Z" }, +] + +[[package]] +name = "docutils" +version = "0.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload_time = "2024-04-23T18:57:18.24Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload_time = "2024-04-23T18:57:14.835Z" }, +] + +[[package]] +name = "environs" +version = "9.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "marshmallow" }, + { name = "python-dotenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d4/e3/c3c6c76f3dbe3e019e9a451b35bf9f44690026a5bb1232f7b77097b72ff5/environs-9.5.0.tar.gz", hash = "sha256:a76307b36fbe856bdca7ee9161e6c466fd7fcffc297109a118c59b54e27e30c9", size = 20795, upload_time = "2022-01-30T18:07:56.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/5e/f0f217dc393372681bfe05c50f06a212e78d0a3fee907a74ab451ec1dcdb/environs-9.5.0-py2.py3-none-any.whl", hash = "sha256:1e549569a3de49c05f856f40bce86979e7d5ffbbc4398e7f338574c220189124", size = 12548, upload_time = "2022-01-30T18:07:54.874Z" }, +] + +[package.optional-dependencies] +django = [ + { name = "dj-database-url" }, + { name = "dj-email-url" }, + { name = "django-cache-url" }, +] + +[[package]] +name = "factory-boy" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "faker" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7e/37/b046abce36a5fc19827e3662fd6c63ae3489b93f96dbd099cd412bbff6c3/factory_boy-3.2.0.tar.gz", hash = "sha256:401cc00ff339a022f84d64a4339503d1689e8263a4478d876e58a3295b155c5b", size = 153844, upload_time = "2020-12-28T08:48:34.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/62/41a5a7ed8a474072d491521562ffbeb18a869c090c21506f890298433fab/factory_boy-3.2.0-py2.py3-none-any.whl", hash = "sha256:1d3db4b44b8c8c54cdd8b83ae4bdb9aeb121e464400035f1f03ae0e1eade56a4", size = 35313, upload_time = "2020-12-28T08:48:32.646Z" }, +] + +[[package]] +name = "faker" +version = "9.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "text-unidecode" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8f/fe/43a071b6aeb6d41e00856c286de24e91312dde292f87259a547b52d60449/Faker-9.3.1.tar.gz", hash = "sha256:cdd9e9af2fba5c96ee2ec4ac8419bba458e26b58a2b98c1f6467ee66096bee52", size = 1169930, upload_time = "2021-10-11T19:39:07.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/01/0a08bb86b33fa0813401d05b5b624bafad0ff93a551008da949b4e016a7b/Faker-9.3.1-py3-none-any.whl", hash = "sha256:429a91d73dbac02609d6b616ef15bd4c3f22ed6532dcfceb46f3b8c28c78257a", size = 1192590, upload_time = "2021-10-11T19:39:03.32Z" }, +] + +[[package]] +name = "filelock" +version = "3.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/6e/665a6cb363bee26e40954ee812e4e733fd7cafd84c06e0c7c2357641abd6/filelock-3.3.0.tar.gz", hash = "sha256:8c7eab13dc442dc249e95158bcc12dec724465919bdc9831fdbf0660f03d1785", size = 203528, upload_time = "2021-10-03T00:58:05.074Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/db/9e43f26de87abc2462e0ef416c450d8ea3791316b0ca3817b7512be4f50e/filelock-3.3.0-py3-none-any.whl", hash = "sha256:bbc6a0382fe8ec4744ecdf6683a2e07f65eb10ff1aff53fc02a202565446cde0", size = 9717, upload_time = "2021-10-03T00:58:03.441Z" }, +] + +[[package]] +name = "gunicorn" +version = "20.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/5b/0d1f0296485a6af03366604142ea8f19f0833894db3512a40ed07b2a56dd/gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8", size = 370601, upload_time = "2021-03-27T01:54:37.202Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/dd/5b190393e6066286773a67dfcc2f9492058e9b57c4867a95f1ba5caf0a83/gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e", size = 79531, upload_time = "2021-04-27T12:16:23.375Z" }, +] + +[[package]] +name = "identify" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/a1/6af22b63fdf647df031404b75bf2d733308dd6f32d2a282ee3057d4c0979/identify-2.3.0.tar.gz", hash = "sha256:fd08c97f23ceee72784081f1ce5125c8f53a02d3f2716dde79a6ab8f1039fea5", size = 98585, upload_time = "2021-10-02T00:03:39.732Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/9f/ca0f0299263e41f837b25830d957f437d8e44a73d7e66e3170adfb5845ce/identify-2.3.0-py2.py3-none-any.whl", hash = "sha256:d1e82c83d063571bb88087676f81261a4eae913c492dafde184067c584bc7c05", size = 98245, upload_time = "2021-10-02T00:03:36.88Z" }, +] + +[[package]] +name = "idna" +version = "3.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/62/08/e3fc7c8161090f742f504f40b1bccbfc544d4a4e09eb774bf40aafce5436/idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d", size = 286689, upload_time = "2021-10-12T23:33:41.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/a2/d918dcd22354d8958fe113e1a3630137e0fc8b44859ade3063982eacd2a4/idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", size = 61160, upload_time = "2021-10-12T23:33:38.02Z" }, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload_time = "2022-07-01T12:21:05.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload_time = "2022-07-01T12:21:02.467Z" }, +] + +[[package]] +name = "iniconfig" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/a2/97899f6bd0e873fed3a7e67ae8d3a08b21799430fb4da15cfedf10d6e2c2/iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32", size = 8104, upload_time = "2020-10-14T10:20:18.572Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/dd/b3c12c6d707058fa947864b67f0c4e0c39ef8610988d7baea9578f3c48f3/iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", size = 4990, upload_time = "2020-10-16T17:37:23.05Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "markupsafe" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/10/ff66fea6d1788c458663a84d88787bae15d45daa16f6b3ef33322a51fc7e/MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a", size = 18596, upload_time = "2021-05-18T17:18:22.856Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/8b/f28eac2790d49dde61f89ae9e007ac65002edc90bb2dd63c3b9e653820d2/MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53", size = 18330, upload_time = "2021-08-11T18:10:38.104Z" }, + { url = "https://files.pythonhosted.org/packages/21/84/e090d999105fe0f3e1d955725ed2c9aeebc649ee83edab0e73d353d47e5d/MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38", size = 14005, upload_time = "2021-08-11T18:10:39.711Z" }, + { url = "https://files.pythonhosted.org/packages/e6/57/e9d243b12918f22bc3aa1392db7821dcb643a120e87b3f8c9bc7e1ad33f1/MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad", size = 26830, upload_time = "2021-08-11T18:10:41.209Z" }, + { url = "https://files.pythonhosted.org/packages/5a/98/3303496a5d19aabba67c443ba1df6ee1bec94549b3f8976f90c06a6942e6/MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d", size = 30410, upload_time = "2021-08-11T18:10:43.44Z" }, + { url = "https://files.pythonhosted.org/packages/53/e8/601efa63c4058311a8bda7984a2fe554b9da574044967d7aee253661ee46/MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646", size = 30770, upload_time = "2021-08-11T18:10:44.873Z" }, + { url = "https://files.pythonhosted.org/packages/a4/c8/9d2161b2080cb69c8834d1c34a399685347523acbfc923b203ad27bf1215/MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b", size = 31170, upload_time = "2021-10-22T17:36:49.118Z" }, + { url = "https://files.pythonhosted.org/packages/51/c3/7154db2b7d5b24875e1f1c42bab87a46af688bd6a5c89a90c60053cb6b33/MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a", size = 30127, upload_time = "2021-10-22T17:36:51.271Z" }, + { url = "https://files.pythonhosted.org/packages/04/69/c31e837e4bb5532b02d297152464b2cb8a0edeb9bef762c015e9b4e95e16/MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a", size = 30553, upload_time = "2021-10-22T17:36:53.02Z" }, + { url = "https://files.pythonhosted.org/packages/c1/39/9df65c006a88fce7bbd5ec3195b949b79477b1a325564f486c611c367893/MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28", size = 14331, upload_time = "2021-08-11T18:10:46.98Z" }, + { url = "https://files.pythonhosted.org/packages/93/28/d42b954fb9189cf4b78b0b0a025cff9b2583f93b37d1a345768ade29e5dd/MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134", size = 15042, upload_time = "2021-08-11T18:10:48.832Z" }, +] + +[[package]] +name = "marshmallow" +version = "3.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b8/b9/b1da16dac90ed19806ea466636ae387957eec8cd429ac3b763e21b99a77d/marshmallow-3.18.0.tar.gz", hash = "sha256:6804c16114f7fce1f5b4dadc31f4674af23317fcc7f075da21e35c1a35d781f7", size = 182746, upload_time = "2022-09-15T20:27:14.362Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/06/e0300cb5f9b5ff9b6d0accdd3536c01bd2300f8154781455914752ab8903/marshmallow-3.18.0-py3-none-any.whl", hash = "sha256:35e02a3a06899c9119b785c12a22f4cda361745d66a71ab691fd7610202ae104", size = 48752, upload_time = "2022-09-15T20:27:12.356Z" }, +] + +[[package]] +name = "mypy" +version = "0.931" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "tomli" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/b2/9c71fd84086e96518b1d7a940788d704d3a67aead3e3a7ff9bf8e9b5746d/mypy-0.931.tar.gz", hash = "sha256:0038b21890867793581e4cb0d810829f5fd4441aa75796b53033af3aa30430ce", size = 2729650, upload_time = "2022-01-07T17:04:47.995Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/c8/d1293c4c68ac282eb4ee51f7615da1b66eb763aecd0e8dd8e1529296b5c5/mypy-0.931-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c5b42d0815e15518b1f0990cff7a705805961613e701db60387e6fb663fe78a", size = 10253560, upload_time = "2022-01-07T17:04:44.621Z" }, + { url = "https://files.pythonhosted.org/packages/e2/29/af6be24e64af18963f024991d496126aa3bcfa8bf867108d0886dcebaabc/mypy-0.931-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c89702cac5b302f0c5d33b172d2b55b5df2bede3344a2fbed99ff96bddb2cf00", size = 9454488, upload_time = "2022-01-07T17:03:15.331Z" }, + { url = "https://files.pythonhosted.org/packages/d5/34/90916998d6d8f3a944d16c30c705be9153343f5c6de2e420557fdda173ad/mypy-0.931-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:300717a07ad09525401a508ef5d105e6b56646f7942eb92715a1c8d610149714", size = 16611125, upload_time = "2022-01-07T17:04:35.992Z" }, + { url = "https://files.pythonhosted.org/packages/37/bf/5729b25e84b0048f4ca249a10f5d5c1cc9210b40a7496435b4b872b874b6/mypy-0.931-cp310-cp310-win_amd64.whl", hash = "sha256:7b3f6f557ba4afc7f2ce6d3215d5db279bcf120b3cfd0add20a5d4f4abdae5bc", size = 8284467, upload_time = "2022-01-07T17:04:19.993Z" }, + { url = "https://files.pythonhosted.org/packages/a2/ef/0f26513203a3970386833be42be104ff0c8b3b3ea39e3f3b4fe30f9e2adc/mypy-0.931-py3-none-any.whl", hash = "sha256:1171f2e0859cfff2d366da2c7092b06130f232c636a3f7301e3feb8b41f6377d", size = 2411311, upload_time = "2022-01-07T17:04:23.288Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/63/60/0582ce2eaced55f65a4406fc97beba256de4b7a95a0034c6576458c6519f/mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8", size = 4252, upload_time = "2019-10-17T22:38:58.685Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/eb/975c7c080f3223a5cdaff09612f3a5221e4ba534f7039db34c35d95fa6a5/mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", size = 4470, upload_time = "2019-10-17T22:38:56.922Z" }, +] + +[[package]] +name = "mypy-json-report" +version = "0.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/94/58aade6e82c556e6db1c05d3178558a1cdf1c8ee0c94c6bf459deadafd5e/mypy-json-report-0.1.3.tar.gz", hash = "sha256:162caa9753a809ae6e26e375cc67a9e05267684c7cf0b7797070b37b5df69fe2", size = 7095, upload_time = "2022-09-07T11:08:16.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/f9/d7a3375e17ffc691b78dc1c06b55f8b767f2c1f2eaac3abc7616db09758e/mypy_json_report-0.1.3-py3-none-any.whl", hash = "sha256:bf46f98514f413fb98006a45d0b40c37d9b719df4b4d5d3544ff71c21c9f2a5a", size = 7591, upload_time = "2022-09-07T11:08:17.541Z" }, +] + +[[package]] +name = "nodeenv" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/75/8d/14c4ac588711f8de0dd02a11460ed72f48cab65a998994ca20f40c6e1a8f/nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b", size = 34047, upload_time = "2021-04-09T08:13:15.419Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/73/56c89b343befb9c63e8117294d265458f0ff726fa2abcdc6bb5ec5e66a1a/nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7", size = 21561, upload_time = "2021-04-09T08:13:13.229Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload_time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload_time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "platformdirs" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/96/d70b9462671fbeaacba4639ff866fb4e9e558580853fc5d6e698d0371ad4/platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2", size = 24051, upload_time = "2021-09-25T20:46:06.59Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/78/dcfd84d3aabd46a9c77260fb47ea5d244806e4daef83aa6fe5d83adb182c/platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d", size = 14400, upload_time = "2021-09-25T20:46:05.161Z" }, +] + +[[package]] +name = "pluggy" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/16/db2d7de3474b6e37cbb9c008965ee63835bba517e22cdb8c35b5116b5ce1/pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", size = 51510, upload_time = "2021-08-25T16:26:02.196Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/01/f38e2ff29715251cf25532b9082a1589ab7e4f571ced434f98d0139336dc/pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3", size = 13667, upload_time = "2021-08-25T16:25:59.674Z" }, +] + +[[package]] +name = "pre-commit" +version = "2.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "toml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/9e/f139fe6176b417e8c725f0ecfe5021e2edc88c5e00358aacbf812f3224ed/pre_commit-2.15.0.tar.gz", hash = "sha256:3c25add78dbdfb6a28a651780d5c311ac40dd17f160eb3954a0c59da40a505a7", size = 167146, upload_time = "2021-09-03T00:33:47.836Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/f1/40ce9ec975e5b6b2825239bdf7bb48c767b1a8ed3912a71d80e9c911cce3/pre_commit-2.15.0-py2.py3-none-any.whl", hash = "sha256:a4ed01000afcb484d9eb8d504272e642c4c4099bbad3a6b27e519bd6a3e928a6", size = 191528, upload_time = "2021-09-03T00:33:45.408Z" }, +] + +[[package]] +name = "py" +version = "1.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/ff/fec109ceb715d2a6b4c4a85a61af3b40c723a961e8828319fbcb15b868dc/py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", size = 207796, upload_time = "2021-11-04T17:17:01.377Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378", size = 98708, upload_time = "2021-11-04T17:17:00.152Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload_time = "2025-01-06T17:26:30.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload_time = "2025-01-06T17:26:25.553Z" }, +] + +[[package]] +name = "pytest" +version = "7.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "atomicwrites", marker = "sys_platform == 'win32'" }, + { name = "attrs" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "py" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/1f/34657c6ac56f3c58df650ba41f8ffb2620281ead8e11bcdc7db63cf72a78/pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45", size = 1256241, upload_time = "2022-04-23T14:35:57.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/d0/bae533985f2338c5d02184b4a7083b819f6b3fc101da792e0d96e6e5299d/pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c", size = 297031, upload_time = "2022-04-23T14:35:55.107Z" }, +] + +[[package]] +name = "pytest-django" +version = "4.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/42/6d6563165b82289d4a30ea477f85c04386303e51cf4e4e4651d4f9910830/pytest-django-4.5.2.tar.gz", hash = "sha256:d9076f759bb7c36939dbdd5ae6633c18edfc2902d1a69fdbefd2426b970ce6c2", size = 79949, upload_time = "2021-12-07T14:26:58.991Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/21/b65ecd6686da400e2f6e3c49c2a428325abd979c9670cd97e1671f53296e/pytest_django-4.5.2-py3-none-any.whl", hash = "sha256:c60834861933773109334fe5a53e83d1ef4828f2203a1d6a0fa9972f4f75ab3e", size = 20752, upload_time = "2021-12-07T14:26:57.714Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/c4/13b4776ea2d76c115c1d1b84579f3764ee6d57204f6be27119f13a61d0a9/python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", size = 357324, upload_time = "2021-07-14T08:19:19.783Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9", size = 247702, upload_time = "2021-07-14T08:19:18.161Z" }, +] + +[[package]] +name = "python-dotenv" +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/8d/ab7352188f605e3f663f34692b2ed7457da5985857e9e4c2335cd12fb3c9/python-dotenv-0.21.0.tar.gz", hash = "sha256:b77d08274639e3d34145dfa6c7008e66df0f04b7be7a75fd0d5292c191d79045", size = 34984, upload_time = "2022-09-03T15:16:14.39Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/10/ff4f2f5b2a420fd09e1331d63cc87cf4367c5745c0a4ce99cea92b1cbacb/python_dotenv-0.21.0-py3-none-any.whl", hash = "sha256:1684eb44636dd462b66c3ee016599815514527ad99965de77f43e0944634a7e5", size = 18818, upload_time = "2022-09-03T15:16:12.291Z" }, +] + +[[package]] +name = "pytz" +version = "2021.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/8e/1cde9d002f48a940b9d9d38820aaf444b229450c0854bdf15305ce4a3d1a/pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326", size = 320512, upload_time = "2021-10-02T03:56:32.818Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/e3/d9f046b5d1c94a3aeab15f1f867aa414f8ee9d196fae6865f1d6a0ee1a0b/pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c", size = 503471, upload_time = "2021-10-02T03:56:30.247Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/e5/af35f7ea75cf72f2cd079c95ee16797de7cd71f29ea7c68ae5ce7be1eda0/PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", size = 125201, upload_time = "2023-07-18T00:00:23.308Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/06/4beb652c0fe16834032e54f0956443d4cc797fe645527acee59e7deaa0a2/PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", size = 189447, upload_time = "2023-07-17T23:57:04.325Z" }, + { url = "https://files.pythonhosted.org/packages/5b/07/10033a403b23405a8fc48975444463d3d10a5c2736b7eb2550b07b367429/PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f", size = 169264, upload_time = "2023-07-17T23:57:07.787Z" }, + { url = "https://files.pythonhosted.org/packages/f1/26/55e4f21db1f72eaef092015d9017c11510e7e6301c62a6cfee91295d13c6/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", size = 677003, upload_time = "2023-07-17T23:57:13.144Z" }, + { url = "https://files.pythonhosted.org/packages/ba/91/090818dfa62e85181f3ae23dd1e8b7ea7f09684864a900cab72d29c57346/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", size = 699070, upload_time = "2023-07-17T23:57:19.402Z" }, + { url = "https://files.pythonhosted.org/packages/29/61/bf33c6c85c55bc45a29eee3195848ff2d518d84735eb0e2d8cb42e0d285e/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", size = 705525, upload_time = "2023-07-17T23:57:25.272Z" }, + { url = "https://files.pythonhosted.org/packages/07/91/45dfd0ef821a7f41d9d0136ea3608bb5b1653e42fd56a7970532cb5c003f/PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", size = 707514, upload_time = "2023-08-28T18:43:20.945Z" }, + { url = "https://files.pythonhosted.org/packages/b6/a0/b6700da5d49e9fed49dc3243d3771b598dad07abb37cc32e524607f96adc/PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", size = 130488, upload_time = "2023-07-17T23:57:28.144Z" }, + { url = "https://files.pythonhosted.org/packages/24/97/9b59b43431f98d01806b288532da38099cc6f2fea0f3d712e21e269c0279/PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", size = 145338, upload_time = "2023-07-17T23:57:31.118Z" }, + { url = "https://files.pythonhosted.org/packages/ec/0d/26fb23e8863e0aeaac0c64e03fd27367ad2ae3f3cccf3798ee98ce160368/PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", size = 187867, upload_time = "2023-07-17T23:57:34.35Z" }, + { url = "https://files.pythonhosted.org/packages/28/09/55f715ddbf95a054b764b547f617e22f1d5e45d83905660e9a088078fe67/PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", size = 167530, upload_time = "2023-07-17T23:57:36.975Z" }, + { url = "https://files.pythonhosted.org/packages/5e/94/7d5ee059dfb92ca9e62f4057dcdec9ac08a9e42679644854dc01177f8145/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", size = 732244, upload_time = "2023-07-17T23:57:43.774Z" }, + { url = "https://files.pythonhosted.org/packages/06/92/e0224aa6ebf9dc54a06a4609da37da40bb08d126f5535d81bff6b417b2ae/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", size = 752871, upload_time = "2023-07-17T23:57:51.921Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5e/efd033ab7199a0b2044dab3b9f7a4f6670e6a52c089de572e928d2873b06/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", size = 757729, upload_time = "2023-07-17T23:57:59.865Z" }, + { url = "https://files.pythonhosted.org/packages/03/5c/c4671451b2f1d76ebe352c0945d4cd13500adb5d05f5a51ee296d80152f7/PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", size = 748528, upload_time = "2023-08-28T18:43:23.207Z" }, + { url = "https://files.pythonhosted.org/packages/73/9c/766e78d1efc0d1fca637a6b62cea1b4510a7fb93617eb805223294fef681/PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", size = 130286, upload_time = "2023-07-17T23:58:02.964Z" }, + { url = "https://files.pythonhosted.org/packages/b3/34/65bb4b2d7908044963ebf614fe0fdb080773fc7030d7e39c8d3eddcd4257/PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", size = 144699, upload_time = "2023-07-17T23:58:05.586Z" }, + { url = "https://files.pythonhosted.org/packages/bc/06/1b305bf6aa704343be85444c9d011f626c763abb40c0edc1cad13bfd7f86/PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", size = 178692, upload_time = "2023-08-28T18:43:24.924Z" }, + { url = "https://files.pythonhosted.org/packages/84/02/404de95ced348b73dd84f70e15a41843d817ff8c1744516bf78358f2ffd2/PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", size = 165622, upload_time = "2023-08-28T18:43:26.54Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4c/4a2908632fc980da6d918b9de9c1d9d7d7e70b2672b1ad5166ed27841ef7/PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", size = 696937, upload_time = "2024-01-18T20:40:22.92Z" }, + { url = "https://files.pythonhosted.org/packages/b4/33/720548182ffa8344418126017aa1d4ab4aeec9a2275f04ce3f3573d8ace8/PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", size = 724969, upload_time = "2023-08-28T18:43:28.56Z" }, + { url = "https://files.pythonhosted.org/packages/4f/78/77b40157b6cb5f2d3d31a3d9b2efd1ba3505371f76730d267e8b32cf4b7f/PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", size = 712604, upload_time = "2023-08-28T18:43:30.206Z" }, + { url = "https://files.pythonhosted.org/packages/2e/97/3e0e089ee85e840f4b15bfa00e4e63d84a3691ababbfea92d6f820ea6f21/PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", size = 126098, upload_time = "2023-08-28T18:43:31.835Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/fbade56564ad486809c27b322d0f7e6a89c01f6b4fe208402e90d4443a99/PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", size = 138675, upload_time = "2023-08-28T18:43:33.613Z" }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload_time = "2024-05-29T15:37:49.536Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload_time = "2024-05-29T15:37:47.027Z" }, +] + +[[package]] +name = "setuptools" +version = "70.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/60/5db2249526c9b453c5bb8b9f6965fcab0ddb7f40ad734420b3b421f7da44/setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0", size = 2265182, upload_time = "2024-05-21T10:28:18.891Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/88/70c5767a0e43eb4451c2200f07d042a4bcd7639276003a9c54a68cfcc1f8/setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", size = 863432, upload_time = "2024-05-21T10:28:12.781Z" }, +] + +[[package]] +name = "six" +version = "1.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", size = 34041, upload_time = "2021-05-05T14:18:18.379Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", size = 11053, upload_time = "2021-05-05T14:18:17.237Z" }, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", size = 86699, upload_time = "2021-11-16T18:38:38.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", size = 93002, upload_time = "2021-11-16T18:38:34.792Z" }, +] + +[[package]] +name = "sphinx" +version = "8.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload_time = "2024-10-13T20:27:13.93Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125, upload_time = "2024-10-13T20:27:10.448Z" }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload_time = "2024-07-29T01:09:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload_time = "2024-07-29T01:08:58.99Z" }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload_time = "2024-07-29T01:09:23.417Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload_time = "2024-07-29T01:09:21.945Z" }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload_time = "2024-07-29T01:09:37.889Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload_time = "2024-07-29T01:09:36.407Z" }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload_time = "2019-01-21T16:10:16.347Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload_time = "2019-01-21T16:10:14.333Z" }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload_time = "2024-07-29T01:09:56.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload_time = "2024-07-29T01:09:54.885Z" }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload_time = "2024-07-29T01:10:09.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload_time = "2024-07-29T01:10:08.203Z" }, +] + +[[package]] +name = "sqlparse" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/32/fe/8a8575debfd924c8160295686a7ea661107fc34d831429cce212b6442edb/sqlparse-0.4.2.tar.gz", hash = "sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae", size = 67771, upload_time = "2021-09-10T06:51:58.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/40/d836d55fb3f467243ee839ab7b814822fda522cd395fa41e282684e71ee5/sqlparse-0.4.2-py3-none-any.whl", hash = "sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d", size = 42309, upload_time = "2021-09-10T06:51:56.892Z" }, +] + +[[package]] +name = "text-unidecode" +version = "1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload_time = "2019-08-30T21:36:45.405Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload_time = "2019-08-30T21:37:03.543Z" }, +] + +[[package]] +name = "toml" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload_time = "2020-11-01T01:40:22.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload_time = "2020-11-01T01:40:20.672Z" }, +] + +[[package]] +name = "tomli" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload_time = "2024-11-27T22:38:36.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload_time = "2024-11-27T22:37:54.956Z" }, + { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload_time = "2024-11-27T22:37:56.698Z" }, + { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload_time = "2024-11-27T22:37:57.63Z" }, + { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload_time = "2024-11-27T22:37:59.344Z" }, + { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload_time = "2024-11-27T22:38:00.429Z" }, + { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload_time = "2024-11-27T22:38:02.094Z" }, + { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload_time = "2024-11-27T22:38:03.206Z" }, + { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload_time = "2024-11-27T22:38:04.217Z" }, + { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload_time = "2024-11-27T22:38:05.908Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload_time = "2024-11-27T22:38:06.812Z" }, + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload_time = "2024-11-27T22:38:07.731Z" }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload_time = "2024-11-27T22:38:09.384Z" }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload_time = "2024-11-27T22:38:10.329Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload_time = "2024-11-27T22:38:11.443Z" }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload_time = "2024-11-27T22:38:13.099Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload_time = "2024-11-27T22:38:14.766Z" }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload_time = "2024-11-27T22:38:15.843Z" }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload_time = "2024-11-27T22:38:17.645Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload_time = "2024-11-27T22:38:19.159Z" }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload_time = "2024-11-27T22:38:20.064Z" }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload_time = "2024-11-27T22:38:21.659Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload_time = "2024-11-27T22:38:22.693Z" }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload_time = "2024-11-27T22:38:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload_time = "2024-11-27T22:38:26.081Z" }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload_time = "2024-11-27T22:38:27.921Z" }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload_time = "2024-11-27T22:38:29.591Z" }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload_time = "2024-11-27T22:38:30.639Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload_time = "2024-11-27T22:38:31.702Z" }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload_time = "2024-11-27T22:38:32.837Z" }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload_time = "2024-11-27T22:38:34.455Z" }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload_time = "2024-11-27T22:38:35.385Z" }, +] + +[[package]] +name = "types-requests" +version = "2.27.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "types-urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/ed/76de4c42bf515069c8d47306539a57f8d46cbed6d0c714b70fe7ec28a10d/types-requests-2.27.7.tar.gz", hash = "sha256:f38bd488528cdcbce5b01dc953972f3cead0d060cfd9ee35b363066c25bab13c", size = 9654, upload_time = "2022-01-13T21:15:51.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/58/2b348b3b4eaba4cc80ee8365458bbccdf8f911d196fed0f5cfefc38cf678/types_requests-2.27.7-py3-none-any.whl", hash = "sha256:2e0e100dd489f83870d4f61949d3a7eae4821e7bfbf46c57e463c38f92d473d4", size = 11847, upload_time = "2022-01-13T21:15:49.956Z" }, +] + +[[package]] +name = "types-urllib3" +version = "1.26.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/5c/4b5702a5987787167605e36fa75351ad20377532e81e357f73d5ba6f9e38/types-urllib3-1.26.7.tar.gz", hash = "sha256:cfd1fbbe4ba9a605ed148294008aac8a7b8b7472651d1cc357d507ae5962e3d2", size = 8304, upload_time = "2022-01-13T15:19:23.362Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/6a/586a85769ebb9e408a8f56789f5d98cf7f1727fa9d1bd9a3ca38670c69d1/types_urllib3-1.26.7-py3-none-any.whl", hash = "sha256:3adcf2cb5981809091dbff456e6999fe55f201652d8c360f99997de5ac2f556e", size = 13189, upload_time = "2022-01-13T15:19:22.296Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/4a/60ba3706797b878016f16edc5fbaf1e222109e38d0fa4d7d9312cb53f8dd/typing_extensions-4.0.1.tar.gz", hash = "sha256:4ca091dea149f945ec56afb48dae714f21e8692ef22a395223bcd328961b6a0e", size = 22706, upload_time = "2021-12-01T01:45:39.576Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e4/baf0031e39cf545f0c9edd5b1a2ea12609b7fcba2d58e118b11753d68cf0/typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b", size = 22816, upload_time = "2021-12-01T01:45:37.772Z" }, +] + +[[package]] +name = "urllib3" +version = "1.26.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/80/be/3ee43b6c5757cabea19e75b8f46eaf05a2f5144107d7db48c7cf3a864f73/urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece", size = 291350, upload_time = "2021-09-22T18:01:18.331Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/f4/524415c0744552cce7d8bf3669af78e8a069514405ea4fcbd0cc44733744/urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844", size = 138764, upload_time = "2021-09-22T18:01:15.93Z" }, +] + +[[package]] +name = "virtualenv" +version = "20.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "backports-entry-points-selectable" }, + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/40/9bc1b32521f78c293c1f8ca423c725737dfa9d09640dbeec61cebca7c5f2/virtualenv-20.8.1.tar.gz", hash = "sha256:bcc17f0b3a29670dd777d6f0755a4c04f28815395bca279cdcb213b97199a6b8", size = 8708080, upload_time = "2021-09-24T10:37:17.318Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/45/3c419850680999c43f5e3d005e2f54bb3a24184255ebc5244369e49674bd/virtualenv-20.8.1-py2.py3-none-any.whl", hash = "sha256:10062e34c204b5e4ec5f62e6ef2473f8ba76513a9a617e873f1f8fb4a519d300", size = 5303026, upload_time = "2021-09-24T10:37:15.059Z" }, +] + +[[package]] +name = "werkzeug" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/3c/ecdb36f49ab06defb0d5a466cfeb4ae90a55d02cfef379f781da2801a45d/Werkzeug-2.0.2.tar.gz", hash = "sha256:aa2bb6fc8dee8d6c504c0ac1e7f5f7dc5810a9903e793b6f715a9f015bdadb9a", size = 895061, upload_time = "2021-10-06T00:27:12.986Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/73/51137805d1b8d97367a8a77cae4a792af14bb7ce58fbd071af294c740cf0/Werkzeug-2.0.2-py3-none-any.whl", hash = "sha256:63d3dc1cf60e7b7e35e97fa9861f7397283b75d765afcaefd993d6046899de8f", size = 288921, upload_time = "2021-10-06T00:27:10.617Z" }, +] + +[[package]] +name = "whitenoise" +version = "5.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/78/29/84c808294f76d854e9983a18cb6129c1d72a99609aef1853f8e6399de07f/whitenoise-5.3.0.tar.gz", hash = "sha256:d234b871b52271ae7ed6d9da47ffe857c76568f11dd30e28e18c5869dbd11e12", size = 46338, upload_time = "2021-07-16T16:59:54.296Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/1e/ec69984d05e570ec7c61d28cbce51b8f4623e4121ca57ac6ad76e4f5ffe8/whitenoise-5.3.0-py2.py3-none-any.whl", hash = "sha256:d963ef25639d1417e8a247be36e6aedd8c7c6f0a08adcb5a89146980a96b577c", size = 19822, upload_time = "2021-07-16T16:59:52.113Z" }, +]