csu 2.3.0__tar.gz → 2.3.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {csu-2.3.0 → csu-2.3.2}/.bumpversion.cfg +1 -1
- {csu-2.3.0 → csu-2.3.2}/.cookiecutterrc +20 -19
- {csu-2.3.0 → csu-2.3.2}/.github/workflows/github-actions.yml +7 -19
- {csu-2.3.0 → csu-2.3.2}/.pre-commit-config.yaml +9 -5
- csu-2.3.2/.tombi.toml +4 -0
- {csu-2.3.0 → csu-2.3.2}/LICENSE +1 -1
- {csu-2.3.0 → csu-2.3.2}/MANIFEST.in +1 -1
- {csu-2.3.0 → csu-2.3.2}/PKG-INFO +9 -17
- {csu-2.3.0 → csu-2.3.2}/README.rst +2 -2
- {csu-2.3.0 → csu-2.3.2}/ci/bootstrap.py +1 -1
- {csu-2.3.0 → csu-2.3.2}/ci/templates/.github/workflows/github-actions.yml +3 -2
- csu-2.3.2/pyproject.toml +114 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/__init__.py +1 -1
- {csu-2.3.0 → csu-2.3.2}/src/csu/worker/engine.py +8 -6
- {csu-2.3.0 → csu-2.3.2}/src/csu.egg-info/PKG-INFO +9 -17
- {csu-2.3.0 → csu-2.3.2}/src/csu.egg-info/SOURCES.txt +1 -1
- {csu-2.3.0 → csu-2.3.2}/tests/exampleworker.py +1 -1
- {csu-2.3.0 → csu-2.3.2}/tests/testproject/settings.py +0 -2
- {csu-2.3.0 → csu-2.3.2}/tox.ini +5 -6
- csu-2.3.0/.taplo.toml +0 -3
- csu-2.3.0/pyproject.toml +0 -125
- {csu-2.3.0 → csu-2.3.2}/.coveragerc +0 -0
- {csu-2.3.0 → csu-2.3.2}/.editorconfig +0 -0
- {csu-2.3.0 → csu-2.3.2}/AUTHORS.rst +0 -0
- {csu-2.3.0 → csu-2.3.2}/CHANGELOG.rst +0 -0
- {csu-2.3.0 → csu-2.3.2}/CONTRIBUTING.rst +0 -0
- {csu-2.3.0 → csu-2.3.2}/ci/requirements.txt +0 -0
- {csu-2.3.0 → csu-2.3.2}/pytest.ini +0 -0
- {csu-2.3.0 → csu-2.3.2}/setup.cfg +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/admin.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/conf.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/consts.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/drf/__init__.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/drf/auth.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/drf/fields.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/drf/forms.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/drf/perms.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/drf/phonenumber.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/drf/serializers.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/drf/test_auth.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/drf/test_fields.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/drf/test_forms.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/drf/test_phonenumber.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/drf/test_serializers.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/drf/views.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/enums.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/env.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/exceptions.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/export.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/fixups.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/forms/__init__.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/forms/crispy.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/forms/fields.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/gettext.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/gettext_lazy.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/locale/ro/LC_MESSAGES/django.mo +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/locale/ro/LC_MESSAGES/django.po +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/logging.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/management.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/models.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/query.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/routers.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/service.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/templates/api_exception.html +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/templates/forms/widgets/opaquewidget.html +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/test_consts.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/test_env.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/test_exceptions.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/test_logging.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/test_management.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/test_service.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/test_timezones.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/test_utils.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/test_xml.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/timezones.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/utils.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/views.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/worker/__init__.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/worker/admin.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/worker/asgi.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/worker/enums.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/worker/job.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/worker/models.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/worker/registry.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/wsgi.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu/xml.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu.egg-info/dependency_links.txt +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu.egg-info/requires.txt +0 -0
- {csu-2.3.0 → csu-2.3.2}/src/csu.egg-info/top_level.txt +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/cassettes/test_service/test_custom_context.yaml +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/cassettes/test_service/test_custom_context_0_retries.yaml +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/cassettes/test_service/test_decoding.yaml +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/cassettes/test_service/test_error.yaml +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/cassettes/test_service/test_logging.yaml +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/cassettes/test_service/test_redirects.yaml +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/cassettes/test_service_auth/test_async.yaml +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/cassettes/test_service_auth/test_sync.yaml +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/conftest.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/test_exampleworker.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/test_models.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/test_service.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/test_service_auth.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/test_views.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/test_worker.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/testproject/__init__.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/testproject/fixtures/testuser.json +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/testproject/models.py +0 -0
- {csu-2.3.0 → csu-2.3.2}/tests/testproject/urls.py +0 -0
|
@@ -1,47 +1,48 @@
|
|
|
1
1
|
# Generated by cookiepatcher, a small shim around cookiecutter (pip install cookiepatcher)
|
|
2
2
|
|
|
3
3
|
default_context:
|
|
4
|
-
c_extension_optional:
|
|
4
|
+
c_extension_optional: false
|
|
5
5
|
c_extension_support: 'no'
|
|
6
|
-
codacy:
|
|
6
|
+
codacy: true
|
|
7
7
|
codacy_projectid: '[Get ID from https://app.codacy.com/gh/ionelmc/python-csu/settings]'
|
|
8
|
-
codeclimate:
|
|
9
|
-
codecov:
|
|
8
|
+
codeclimate: false
|
|
9
|
+
codecov: true
|
|
10
10
|
command_line_interface: 'no'
|
|
11
11
|
command_line_interface_bin_name: csu
|
|
12
|
-
coveralls:
|
|
12
|
+
coveralls: true
|
|
13
13
|
distribution_name: csu
|
|
14
14
|
email: contact@ionelmc.ro
|
|
15
15
|
formatter_quote_style: double
|
|
16
16
|
full_name: Ionel Cristian Mărieș
|
|
17
17
|
function_name: compute
|
|
18
|
-
github_actions:
|
|
19
|
-
github_actions_osx:
|
|
20
|
-
github_actions_windows:
|
|
18
|
+
github_actions: true
|
|
19
|
+
github_actions_osx: false
|
|
20
|
+
github_actions_windows: true
|
|
21
21
|
license: BSD 2-Clause License
|
|
22
22
|
module_name: core
|
|
23
23
|
package_name: csu
|
|
24
|
-
pre_commit:
|
|
24
|
+
pre_commit: true
|
|
25
25
|
project_name: CSU
|
|
26
26
|
project_short_description: Clean Slate Utils - bunch of utility code, mostly Django/DRF specific.
|
|
27
|
-
pypi_badge:
|
|
28
|
-
pypi_disable_upload:
|
|
27
|
+
pypi_badge: true
|
|
28
|
+
pypi_disable_upload: false
|
|
29
29
|
release_date: today
|
|
30
30
|
repo_hosting: github.com
|
|
31
31
|
repo_hosting_domain: github.com
|
|
32
32
|
repo_main_branch: main
|
|
33
33
|
repo_name: python-csu
|
|
34
34
|
repo_username: ionelmc
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
ruff_unsafe_fixes: true
|
|
36
|
+
scrutinizer: true
|
|
37
|
+
setup_py_uses_setuptools_scm: false
|
|
38
|
+
sphinx_docs: false
|
|
38
39
|
sphinx_docs_hosting: https://python-csu.readthedocs.io/
|
|
39
|
-
sphinx_doctest:
|
|
40
|
+
sphinx_doctest: false
|
|
40
41
|
sphinx_theme: furo
|
|
41
|
-
test_matrix_separate_coverage:
|
|
42
|
-
tests_inside_package:
|
|
43
|
-
version: 2.3.
|
|
42
|
+
test_matrix_separate_coverage: false
|
|
43
|
+
tests_inside_package: true
|
|
44
|
+
version: 2.3.2
|
|
44
45
|
version_manager: bump2version
|
|
45
46
|
website: https://blog.ionelmc.ro
|
|
46
47
|
year_from: '2024'
|
|
47
|
-
year_to:
|
|
48
|
+
year_to: current
|
|
@@ -13,35 +13,23 @@ jobs:
|
|
|
13
13
|
python: '3.13'
|
|
14
14
|
tox_env: 'check'
|
|
15
15
|
os: 'ubuntu-latest'
|
|
16
|
-
- name: '
|
|
17
|
-
python: '3.13'
|
|
18
|
-
python_arch: 'x64'
|
|
19
|
-
tox_env: 'py313-dj4'
|
|
20
|
-
os: 'ubuntu-latest'
|
|
21
|
-
cover: true
|
|
22
|
-
- name: 'py313-dj5 (ubuntu/x64)'
|
|
23
|
-
python: '3.13'
|
|
24
|
-
python_arch: 'x64'
|
|
25
|
-
tox_env: 'py313-dj5'
|
|
26
|
-
os: 'ubuntu-latest'
|
|
27
|
-
cover: true
|
|
28
|
-
- name: 'py314-dj4 (ubuntu/x64)'
|
|
16
|
+
- name: 'py314 (ubuntu/x64)'
|
|
29
17
|
python: '3.14'
|
|
30
18
|
python_arch: 'x64'
|
|
31
|
-
tox_env: 'py314
|
|
19
|
+
tox_env: 'py314'
|
|
32
20
|
os: 'ubuntu-latest'
|
|
33
21
|
cover: true
|
|
34
|
-
- name: 'py314
|
|
22
|
+
- name: 'py314 (windows/x64)'
|
|
35
23
|
python: '3.14'
|
|
36
24
|
python_arch: 'x64'
|
|
37
|
-
tox_env: 'py314
|
|
38
|
-
os: '
|
|
25
|
+
tox_env: 'py314'
|
|
26
|
+
os: 'windows-latest'
|
|
39
27
|
cover: true
|
|
40
28
|
steps:
|
|
41
|
-
- uses: actions/checkout@
|
|
29
|
+
- uses: actions/checkout@v6
|
|
42
30
|
with:
|
|
43
31
|
fetch-depth: 0
|
|
44
|
-
- uses: actions/setup-python@
|
|
32
|
+
- uses: actions/setup-python@v6
|
|
45
33
|
with:
|
|
46
34
|
python-version: ${{ matrix.python }}
|
|
47
35
|
architecture: ${{ matrix.python_arch }}
|
|
@@ -11,16 +11,20 @@ repos:
|
|
|
11
11
|
- id: django-upgrade
|
|
12
12
|
args: [ --target-version, "5.2" ]
|
|
13
13
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
14
|
-
rev: v0.15.
|
|
14
|
+
rev: v0.15.10
|
|
15
15
|
hooks:
|
|
16
16
|
- id: ruff
|
|
17
|
+
# Using --unsafe-fixes can change code behavior
|
|
17
18
|
args: [--fix, --exit-non-zero-on-fix, --show-fixes, --unsafe-fixes]
|
|
18
19
|
- id: ruff-format
|
|
19
|
-
- repo: https://github.com/
|
|
20
|
-
rev: v0.9.
|
|
20
|
+
- repo: https://github.com/tombi-toml/tombi-pre-commit
|
|
21
|
+
rev: v0.9.16
|
|
21
22
|
hooks:
|
|
22
|
-
- id:
|
|
23
|
-
|
|
23
|
+
- id: tombi-format
|
|
24
|
+
# args: [ "--offline" ]
|
|
25
|
+
- id: tombi-lint
|
|
26
|
+
# args: [ "--offline" ]
|
|
27
|
+
# Should you use this offline, uncomment those args
|
|
24
28
|
- repo: https://github.com/rtts/djhtml
|
|
25
29
|
rev: 3.0.10
|
|
26
30
|
hooks:
|
csu-2.3.2/.tombi.toml
ADDED
{csu-2.3.0 → csu-2.3.2}/LICENSE
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
BSD 2-Clause License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2024, Ionel Cristian Mărieș. All rights reserved.
|
|
3
|
+
Copyright (c) 2024-2026, Ionel Cristian Mărieș. All rights reserved.
|
|
4
4
|
|
|
5
5
|
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
|
6
6
|
|
{csu-2.3.0 → csu-2.3.2}/PKG-INFO
RENAMED
|
@@ -1,25 +1,17 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: csu
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.2
|
|
4
4
|
Summary: Clean Slate Utils - bunch of utility code, mostly Django/DRF specific.
|
|
5
5
|
Author-email: Ionel Cristian Mărieș <contact@ionelmc.ro>
|
|
6
6
|
License-Expression: BSD-2-Clause
|
|
7
|
-
Project-URL: Sources, https://github.com/ionelmc/python-csu
|
|
8
|
-
Project-URL: Changelog, https://github.com/ionelmc/python-csu/blob/master/CHANGELOG.rst
|
|
9
|
-
Project-URL: Issue Tracker, https://github.com/ionelmc/python-csu/issues
|
|
10
7
|
Classifier: Development Status :: 5 - Production/Stable
|
|
11
8
|
Classifier: Intended Audience :: Developers
|
|
12
|
-
Classifier: Operating System :: Unix
|
|
13
|
-
Classifier: Operating System :: POSIX
|
|
14
9
|
Classifier: Operating System :: Microsoft :: Windows
|
|
10
|
+
Classifier: Operating System :: POSIX
|
|
11
|
+
Classifier: Operating System :: Unix
|
|
15
12
|
Classifier: Programming Language :: Python
|
|
16
13
|
Classifier: Programming Language :: Python :: 3
|
|
17
14
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
23
15
|
Classifier: Programming Language :: Python :: 3.14
|
|
24
16
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
25
17
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
@@ -27,18 +19,18 @@ Classifier: Topic :: Utilities
|
|
|
27
19
|
Requires-Python: >=3.14
|
|
28
20
|
Description-Content-Type: text/x-rst
|
|
29
21
|
License-File: LICENSE
|
|
30
|
-
Provides-Extra: http
|
|
31
|
-
Requires-Dist: niquests[brotli,http3]; extra == "http"
|
|
32
|
-
Provides-Extra: xml
|
|
33
|
-
Requires-Dist: defusedxml; extra == "xml"
|
|
34
22
|
Provides-Extra: django
|
|
35
23
|
Requires-Dist: django; extra == "django"
|
|
36
24
|
Requires-Dist: djangorestframework; extra == "django"
|
|
37
25
|
Requires-Dist: django-crispy-forms; extra == "django"
|
|
38
26
|
Requires-Dist: django-import-export; extra == "django"
|
|
27
|
+
Provides-Extra: http
|
|
28
|
+
Requires-Dist: niquests[brotli,http3]; extra == "http"
|
|
39
29
|
Provides-Extra: phonenumber
|
|
40
30
|
Requires-Dist: phonenumberslite; extra == "phonenumber"
|
|
41
31
|
Requires-Dist: django-phonenumber-field; extra == "phonenumber"
|
|
32
|
+
Provides-Extra: xml
|
|
33
|
+
Requires-Dist: defusedxml; extra == "xml"
|
|
42
34
|
Dynamic: license-file
|
|
43
35
|
|
|
44
36
|
========
|
|
@@ -77,9 +69,9 @@ Overview
|
|
|
77
69
|
.. |supported-implementations| image:: https://img.shields.io/pypi/implementation/csu.svg
|
|
78
70
|
:alt: Supported implementations
|
|
79
71
|
:target: https://pypi.org/project/csu
|
|
80
|
-
.. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.3.
|
|
72
|
+
.. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.3.2.svg
|
|
81
73
|
:alt: Commits since latest release
|
|
82
|
-
:target: https://github.com/ionelmc/python-csu/compare/v2.3.
|
|
74
|
+
:target: https://github.com/ionelmc/python-csu/compare/v2.3.2...main
|
|
83
75
|
.. |scrutinizer| image:: https://img.shields.io/scrutinizer/quality/g/ionelmc/python-csu/main.svg
|
|
84
76
|
:alt: Scrutinizer Status
|
|
85
77
|
:target: https://scrutinizer-ci.com/g/ionelmc/python-csu/
|
|
@@ -34,9 +34,9 @@ Overview
|
|
|
34
34
|
.. |supported-implementations| image:: https://img.shields.io/pypi/implementation/csu.svg
|
|
35
35
|
:alt: Supported implementations
|
|
36
36
|
:target: https://pypi.org/project/csu
|
|
37
|
-
.. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.3.
|
|
37
|
+
.. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.3.2.svg
|
|
38
38
|
:alt: Commits since latest release
|
|
39
|
-
:target: https://github.com/ionelmc/python-csu/compare/v2.3.
|
|
39
|
+
:target: https://github.com/ionelmc/python-csu/compare/v2.3.2...main
|
|
40
40
|
.. |scrutinizer| image:: https://img.shields.io/scrutinizer/quality/g/ionelmc/python-csu/main.svg
|
|
41
41
|
:alt: Scrutinizer Status
|
|
42
42
|
:target: https://scrutinizer-ci.com/g/ionelmc/python-csu/
|
|
@@ -57,7 +57,7 @@ def main():
|
|
|
57
57
|
# This uses sys.executable the same way that the call in
|
|
58
58
|
# cookiecutter-pylibrary/hooks/post_gen_project.py
|
|
59
59
|
# invokes this bootstrap.py itself.
|
|
60
|
-
for line in subprocess.check_output([sys.executable, "-m", "tox", "--listenvs"],
|
|
60
|
+
for line in subprocess.check_output([sys.executable, "-m", "tox", "--listenvs"], text=True).splitlines()
|
|
61
61
|
]
|
|
62
62
|
tox_environments = [line for line in tox_environments if line.startswith("py")]
|
|
63
63
|
for template in templates_path.rglob("*"):
|
|
@@ -25,6 +25,7 @@ jobs:
|
|
|
25
25
|
{% endif %}
|
|
26
26
|
{% for os, python_arch in [
|
|
27
27
|
['ubuntu', 'x64'],
|
|
28
|
+
['windows', 'x64'],
|
|
28
29
|
] %}
|
|
29
30
|
- name: '{{ env }} ({{ os }}/{{ python_arch }})'
|
|
30
31
|
python: '{{ python }}'
|
|
@@ -35,10 +36,10 @@ jobs:
|
|
|
35
36
|
{% endfor %}
|
|
36
37
|
{% endfor %}
|
|
37
38
|
steps:
|
|
38
|
-
- uses: actions/checkout@
|
|
39
|
+
- uses: actions/checkout@v6
|
|
39
40
|
with:
|
|
40
41
|
fetch-depth: 0
|
|
41
|
-
- uses: actions/setup-python@
|
|
42
|
+
- uses: actions/setup-python@v6
|
|
42
43
|
with:
|
|
43
44
|
python-version: {{ '${{ matrix.python }}' }}
|
|
44
45
|
architecture: {{ '${{ matrix.python_arch }}' }}
|
csu-2.3.2/pyproject.toml
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "csu"
|
|
3
|
+
version = "2.3.2"
|
|
4
|
+
description = "Clean Slate Utils - bunch of utility code, mostly Django/DRF specific."
|
|
5
|
+
requires-python = ">=3.14"
|
|
6
|
+
license = "BSD-2-Clause"
|
|
7
|
+
license-files = ["LICENSE"]
|
|
8
|
+
authors = [
|
|
9
|
+
{ name = "Ionel Cristian Mărieș", email = "contact@ionelmc.ro" },
|
|
10
|
+
]
|
|
11
|
+
keywords = [
|
|
12
|
+
# eg: "keyword1", "keyword2", "keyword3",
|
|
13
|
+
]
|
|
14
|
+
classifiers = [
|
|
15
|
+
# complete classifier list: http://pypi.python.org/pypi?%3Aaction=list_classifiers
|
|
16
|
+
"Development Status :: 5 - Production/Stable",
|
|
17
|
+
"Intended Audience :: Developers",
|
|
18
|
+
"Operating System :: Microsoft :: Windows",
|
|
19
|
+
"Operating System :: POSIX",
|
|
20
|
+
"Operating System :: Unix",
|
|
21
|
+
"Programming Language :: Python",
|
|
22
|
+
"Programming Language :: Python :: 3",
|
|
23
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
24
|
+
"Programming Language :: Python :: 3.14",
|
|
25
|
+
"Programming Language :: Python :: Implementation :: CPython",
|
|
26
|
+
"Programming Language :: Python :: Implementation :: PyPy",
|
|
27
|
+
# uncomment if you test on these interpreters:
|
|
28
|
+
# "Programming Language :: Python :: Implementation :: IronPython",
|
|
29
|
+
# "Programming Language :: Python :: Implementation :: Jython",
|
|
30
|
+
# "Programming Language :: Python :: Implementation :: Stackless",
|
|
31
|
+
"Topic :: Utilities",
|
|
32
|
+
]
|
|
33
|
+
dependencies = []
|
|
34
|
+
dynamic = [
|
|
35
|
+
"readme",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
[project.optional-dependencies]
|
|
39
|
+
django = [
|
|
40
|
+
"django",
|
|
41
|
+
"djangorestframework",
|
|
42
|
+
"django-crispy-forms",
|
|
43
|
+
"django-import-export",
|
|
44
|
+
]
|
|
45
|
+
http = [
|
|
46
|
+
"niquests[brotli,http3]",
|
|
47
|
+
]
|
|
48
|
+
phonenumber = [
|
|
49
|
+
"phonenumberslite",
|
|
50
|
+
"django-phonenumber-field",
|
|
51
|
+
]
|
|
52
|
+
xml = [
|
|
53
|
+
"defusedxml",
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
[build-system]
|
|
57
|
+
requires = [
|
|
58
|
+
"setuptools>=80",
|
|
59
|
+
]
|
|
60
|
+
build-backend = "setuptools.build_meta"
|
|
61
|
+
|
|
62
|
+
[tool.ruff]
|
|
63
|
+
extend-exclude = ["static", "ci/templates"]
|
|
64
|
+
line-length = 160
|
|
65
|
+
src = ["src", "tests"]
|
|
66
|
+
target-version = "py314"
|
|
67
|
+
|
|
68
|
+
[tool.ruff.lint]
|
|
69
|
+
ignore = [
|
|
70
|
+
"RUF001", # ruff-specific rules ambiguous-unicode-character-string
|
|
71
|
+
"RUF012", # ruff-specific rules mutable-class-default
|
|
72
|
+
"S101", # flake8-bandit assert
|
|
73
|
+
"S308", # flake8-bandit suspicious-mark-safe-usage
|
|
74
|
+
"S603", # flake8-bandit subprocess-without-shell-equals-true
|
|
75
|
+
"S607", # flake8-bandit start-process-with-partial-path
|
|
76
|
+
"E501", # pycodestyle line-too-long
|
|
77
|
+
]
|
|
78
|
+
select = [
|
|
79
|
+
"B", # flake8-bugbear
|
|
80
|
+
"C4", # flake8-comprehensions
|
|
81
|
+
"DTZ", # flake8-datetimez
|
|
82
|
+
"E", # pycodestyle errors
|
|
83
|
+
"EXE", # flake8-executable
|
|
84
|
+
"F", # pyflakes
|
|
85
|
+
"I", # isort
|
|
86
|
+
"INT", # flake8-gettext
|
|
87
|
+
"PIE", # flake8-pie
|
|
88
|
+
"PLC", # pylint convention
|
|
89
|
+
"PLE", # pylint errors
|
|
90
|
+
"PT", # flake8-pytest-style
|
|
91
|
+
"PTH", # flake8-use-pathlib
|
|
92
|
+
"RSE", # flake8-raise
|
|
93
|
+
"RUF", # ruff-specific rules
|
|
94
|
+
"S", # flake8-bandit
|
|
95
|
+
"UP", # pyupgrade
|
|
96
|
+
"W", # pycodestyle warnings
|
|
97
|
+
]
|
|
98
|
+
|
|
99
|
+
[tool.ruff.lint.per-file-ignores]
|
|
100
|
+
"ci/*" = ["S"]
|
|
101
|
+
|
|
102
|
+
[tool.ruff.lint.flake8-pytest-style]
|
|
103
|
+
fixture-parentheses = false
|
|
104
|
+
mark-parentheses = false
|
|
105
|
+
|
|
106
|
+
[tool.ruff.lint.isort]
|
|
107
|
+
forced-separate = ["conftest"]
|
|
108
|
+
force-single-line = true
|
|
109
|
+
|
|
110
|
+
[tool.ruff.format]
|
|
111
|
+
quote-style = "double"
|
|
112
|
+
|
|
113
|
+
[tool.setuptools.dynamic]
|
|
114
|
+
readme = { file = ["README.rst", "CHANGELOG.rst"] }
|
|
@@ -64,7 +64,7 @@ class AbstractWorker(ABC):
|
|
|
64
64
|
cls = type(self)
|
|
65
65
|
cls.id_counter += 1
|
|
66
66
|
self.id = cls.id_counter
|
|
67
|
-
self.runner = asyncio.create_task(self.run())
|
|
67
|
+
self.runner = asyncio.create_task(self.run(), name=f"{type(self).__name__}({self.id}).runner")
|
|
68
68
|
# noinspection PyTypeChecker
|
|
69
69
|
self.runner.add_done_callback(self.on_exit)
|
|
70
70
|
logger.info("%s started.", self)
|
|
@@ -271,11 +271,13 @@ class AbstractEngine(ABC):
|
|
|
271
271
|
workers: list[AbstractWorker]
|
|
272
272
|
queue: Queue = None
|
|
273
273
|
queue_sem: Semaphore
|
|
274
|
-
shutdown_on: Iterable[signal.Signals]
|
|
274
|
+
shutdown_on: Iterable[signal.Signals]
|
|
275
|
+
if sys.platform == "win32":
|
|
276
|
+
shutdown_on = signal.SIGINT, signal.SIGBREAK
|
|
277
|
+
else:
|
|
278
|
+
shutdown_on = signal.SIGINT, signal.SIGTERM
|
|
275
279
|
shutdown_requested = False
|
|
276
280
|
shutdown_tasks: ClassVar[dict[bool, asyncio.Task]] = {}
|
|
277
|
-
if sys.platform == "win32":
|
|
278
|
-
shutdown_on += (signal.SIGBREAK,)
|
|
279
281
|
|
|
280
282
|
def __init__(self):
|
|
281
283
|
self.workers = []
|
|
@@ -330,9 +332,9 @@ class AbstractEngine(ABC):
|
|
|
330
332
|
if not graceful:
|
|
331
333
|
self.shutdown_tasks[True].cancel()
|
|
332
334
|
if graceful in self.shutdown_tasks:
|
|
333
|
-
logger.
|
|
335
|
+
logger.warning("%s.shutdown_handler(%s) already requested", self, sig_name)
|
|
334
336
|
else:
|
|
335
|
-
self.shutdown_tasks[graceful] = asyncio.create_task(self.stop(graceful=graceful))
|
|
337
|
+
self.shutdown_tasks[graceful] = asyncio.create_task(self.stop(graceful=graceful), name=f"{type(self).__name__}.stop(graceful={graceful})")
|
|
336
338
|
self.shutdown_requested = True
|
|
337
339
|
|
|
338
340
|
async def stop(self, graceful=False):
|
|
@@ -1,25 +1,17 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: csu
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.2
|
|
4
4
|
Summary: Clean Slate Utils - bunch of utility code, mostly Django/DRF specific.
|
|
5
5
|
Author-email: Ionel Cristian Mărieș <contact@ionelmc.ro>
|
|
6
6
|
License-Expression: BSD-2-Clause
|
|
7
|
-
Project-URL: Sources, https://github.com/ionelmc/python-csu
|
|
8
|
-
Project-URL: Changelog, https://github.com/ionelmc/python-csu/blob/master/CHANGELOG.rst
|
|
9
|
-
Project-URL: Issue Tracker, https://github.com/ionelmc/python-csu/issues
|
|
10
7
|
Classifier: Development Status :: 5 - Production/Stable
|
|
11
8
|
Classifier: Intended Audience :: Developers
|
|
12
|
-
Classifier: Operating System :: Unix
|
|
13
|
-
Classifier: Operating System :: POSIX
|
|
14
9
|
Classifier: Operating System :: Microsoft :: Windows
|
|
10
|
+
Classifier: Operating System :: POSIX
|
|
11
|
+
Classifier: Operating System :: Unix
|
|
15
12
|
Classifier: Programming Language :: Python
|
|
16
13
|
Classifier: Programming Language :: Python :: 3
|
|
17
14
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
23
15
|
Classifier: Programming Language :: Python :: 3.14
|
|
24
16
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
25
17
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
@@ -27,18 +19,18 @@ Classifier: Topic :: Utilities
|
|
|
27
19
|
Requires-Python: >=3.14
|
|
28
20
|
Description-Content-Type: text/x-rst
|
|
29
21
|
License-File: LICENSE
|
|
30
|
-
Provides-Extra: http
|
|
31
|
-
Requires-Dist: niquests[brotli,http3]; extra == "http"
|
|
32
|
-
Provides-Extra: xml
|
|
33
|
-
Requires-Dist: defusedxml; extra == "xml"
|
|
34
22
|
Provides-Extra: django
|
|
35
23
|
Requires-Dist: django; extra == "django"
|
|
36
24
|
Requires-Dist: djangorestframework; extra == "django"
|
|
37
25
|
Requires-Dist: django-crispy-forms; extra == "django"
|
|
38
26
|
Requires-Dist: django-import-export; extra == "django"
|
|
27
|
+
Provides-Extra: http
|
|
28
|
+
Requires-Dist: niquests[brotli,http3]; extra == "http"
|
|
39
29
|
Provides-Extra: phonenumber
|
|
40
30
|
Requires-Dist: phonenumberslite; extra == "phonenumber"
|
|
41
31
|
Requires-Dist: django-phonenumber-field; extra == "phonenumber"
|
|
32
|
+
Provides-Extra: xml
|
|
33
|
+
Requires-Dist: defusedxml; extra == "xml"
|
|
42
34
|
Dynamic: license-file
|
|
43
35
|
|
|
44
36
|
========
|
|
@@ -77,9 +69,9 @@ Overview
|
|
|
77
69
|
.. |supported-implementations| image:: https://img.shields.io/pypi/implementation/csu.svg
|
|
78
70
|
:alt: Supported implementations
|
|
79
71
|
:target: https://pypi.org/project/csu
|
|
80
|
-
.. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.3.
|
|
72
|
+
.. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.3.2.svg
|
|
81
73
|
:alt: Commits since latest release
|
|
82
|
-
:target: https://github.com/ionelmc/python-csu/compare/v2.3.
|
|
74
|
+
:target: https://github.com/ionelmc/python-csu/compare/v2.3.2...main
|
|
83
75
|
.. |scrutinizer| image:: https://img.shields.io/scrutinizer/quality/g/ionelmc/python-csu/main.svg
|
|
84
76
|
:alt: Scrutinizer Status
|
|
85
77
|
:target: https://scrutinizer-ci.com/g/ionelmc/python-csu/
|
{csu-2.3.0 → csu-2.3.2}/tox.ini
RENAMED
|
@@ -13,7 +13,7 @@ passenv =
|
|
|
13
13
|
envlist =
|
|
14
14
|
clean,
|
|
15
15
|
check,
|
|
16
|
-
py314
|
|
16
|
+
py314,
|
|
17
17
|
report
|
|
18
18
|
ignore_basepython_conflict = true
|
|
19
19
|
|
|
@@ -41,15 +41,14 @@ deps =
|
|
|
41
41
|
hunter
|
|
42
42
|
django-crispy-forms==2.6
|
|
43
43
|
django-import-export==4.4.0
|
|
44
|
-
djangorestframework==3.
|
|
45
|
-
phonenumberslite==9.0.
|
|
44
|
+
djangorestframework==3.17.1
|
|
45
|
+
phonenumberslite==9.0.28
|
|
46
46
|
django-phonenumber-field==8.4.0
|
|
47
|
-
niquests[brotli,http3]==3.18.
|
|
47
|
+
niquests[brotli,http3]==3.18.6
|
|
48
48
|
datetimerange==2.3.2
|
|
49
49
|
defusedxml==0.7.1
|
|
50
50
|
django-rosetta
|
|
51
|
-
|
|
52
|
-
dj6: django==6.0.2
|
|
51
|
+
django==6.0.4
|
|
53
52
|
commands =
|
|
54
53
|
{posargs:pytest --cov --cov-report=term-missing --cov-report=xml -vv}
|
|
55
54
|
|
csu-2.3.0/.taplo.toml
DELETED
csu-2.3.0/pyproject.toml
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
[build-system]
|
|
2
|
-
requires = [
|
|
3
|
-
"setuptools>=80",
|
|
4
|
-
]
|
|
5
|
-
build-backend = "setuptools.build_meta"
|
|
6
|
-
|
|
7
|
-
[tool.setuptools.dynamic]
|
|
8
|
-
readme = { file = ["README.rst", "CHANGELOG.rst"] }
|
|
9
|
-
|
|
10
|
-
[project]
|
|
11
|
-
dynamic = [
|
|
12
|
-
"readme",
|
|
13
|
-
]
|
|
14
|
-
name = "csu"
|
|
15
|
-
version = "2.3.0"
|
|
16
|
-
license = "BSD-2-Clause"
|
|
17
|
-
license-files = ["LICENSE"]
|
|
18
|
-
description = "Clean Slate Utils - bunch of utility code, mostly Django/DRF specific."
|
|
19
|
-
authors = [
|
|
20
|
-
{ name = "Ionel Cristian Mărieș", email = "contact@ionelmc.ro" },
|
|
21
|
-
]
|
|
22
|
-
classifiers = [
|
|
23
|
-
# complete classifier list: http://pypi.python.org/pypi?%3Aaction=list_classifiers
|
|
24
|
-
"Development Status :: 5 - Production/Stable",
|
|
25
|
-
"Intended Audience :: Developers",
|
|
26
|
-
"Operating System :: Unix",
|
|
27
|
-
"Operating System :: POSIX",
|
|
28
|
-
"Operating System :: Microsoft :: Windows",
|
|
29
|
-
"Programming Language :: Python",
|
|
30
|
-
"Programming Language :: Python :: 3",
|
|
31
|
-
"Programming Language :: Python :: 3 :: Only",
|
|
32
|
-
"Programming Language :: Python :: 3.9",
|
|
33
|
-
"Programming Language :: Python :: 3.10",
|
|
34
|
-
"Programming Language :: Python :: 3.11",
|
|
35
|
-
"Programming Language :: Python :: 3.12",
|
|
36
|
-
"Programming Language :: Python :: 3.13",
|
|
37
|
-
"Programming Language :: Python :: 3.14",
|
|
38
|
-
"Programming Language :: Python :: Implementation :: CPython",
|
|
39
|
-
"Programming Language :: Python :: Implementation :: PyPy",
|
|
40
|
-
# uncomment if you test on these interpreters:
|
|
41
|
-
# "Programming Language :: Python :: Implementation :: IronPython",
|
|
42
|
-
# "Programming Language :: Python :: Implementation :: Jython",
|
|
43
|
-
# "Programming Language :: Python :: Implementation :: Stackless",
|
|
44
|
-
"Topic :: Utilities",
|
|
45
|
-
]
|
|
46
|
-
keywords = [
|
|
47
|
-
# eg: "keyword1", "keyword2", "keyword3",
|
|
48
|
-
]
|
|
49
|
-
requires-python = ">=3.14"
|
|
50
|
-
dependencies = [
|
|
51
|
-
]
|
|
52
|
-
|
|
53
|
-
[project.optional-dependencies]
|
|
54
|
-
http = [
|
|
55
|
-
"niquests[brotli,http3]",
|
|
56
|
-
]
|
|
57
|
-
xml = [
|
|
58
|
-
"defusedxml",
|
|
59
|
-
]
|
|
60
|
-
django = [
|
|
61
|
-
"django",
|
|
62
|
-
"djangorestframework",
|
|
63
|
-
"django-crispy-forms",
|
|
64
|
-
"django-import-export",
|
|
65
|
-
]
|
|
66
|
-
phonenumber = [
|
|
67
|
-
"phonenumberslite",
|
|
68
|
-
"django-phonenumber-field",
|
|
69
|
-
]
|
|
70
|
-
|
|
71
|
-
[project.urls]
|
|
72
|
-
"Sources" = "https://github.com/ionelmc/python-csu"
|
|
73
|
-
"Changelog" = "https://github.com/ionelmc/python-csu/blob/master/CHANGELOG.rst"
|
|
74
|
-
"Issue Tracker" = "https://github.com/ionelmc/python-csu/issues"
|
|
75
|
-
|
|
76
|
-
[tool.ruff]
|
|
77
|
-
extend-exclude = ["static", "ci/templates"]
|
|
78
|
-
line-length = 160
|
|
79
|
-
src = ["src", "tests"]
|
|
80
|
-
target-version = "py314"
|
|
81
|
-
|
|
82
|
-
[tool.ruff.lint.per-file-ignores]
|
|
83
|
-
"ci/*" = ["S"]
|
|
84
|
-
|
|
85
|
-
[tool.ruff.lint]
|
|
86
|
-
ignore = [
|
|
87
|
-
"RUF001", # ruff-specific rules ambiguous-unicode-character-string
|
|
88
|
-
"RUF012", # ruff-specific rules mutable-class-default
|
|
89
|
-
"S101", # flake8-bandit assert
|
|
90
|
-
"S308", # flake8-bandit suspicious-mark-safe-usage
|
|
91
|
-
"S603", # flake8-bandit subprocess-without-shell-equals-true
|
|
92
|
-
"S607", # flake8-bandit start-process-with-partial-path
|
|
93
|
-
"E501", # pycodestyle line-too-long
|
|
94
|
-
]
|
|
95
|
-
select = [
|
|
96
|
-
"B", # flake8-bugbear
|
|
97
|
-
"C4", # flake8-comprehensions
|
|
98
|
-
"DTZ", # flake8-datetimez
|
|
99
|
-
"E", # pycodestyle errors
|
|
100
|
-
"EXE", # flake8-executable
|
|
101
|
-
"F", # pyflakes
|
|
102
|
-
"I", # isort
|
|
103
|
-
"INT", # flake8-gettext
|
|
104
|
-
"PIE", # flake8-pie
|
|
105
|
-
"PLC", # pylint convention
|
|
106
|
-
"PLE", # pylint errors
|
|
107
|
-
"PT", # flake8-pytest-style
|
|
108
|
-
"PTH", # flake8-use-pathlib
|
|
109
|
-
"RSE", # flake8-raise
|
|
110
|
-
"RUF", # ruff-specific rules
|
|
111
|
-
"S", # flake8-bandit
|
|
112
|
-
"UP", # pyupgrade
|
|
113
|
-
"W", # pycodestyle warnings
|
|
114
|
-
]
|
|
115
|
-
|
|
116
|
-
[tool.ruff.lint.flake8-pytest-style]
|
|
117
|
-
fixture-parentheses = false
|
|
118
|
-
mark-parentheses = false
|
|
119
|
-
|
|
120
|
-
[tool.ruff.lint.isort]
|
|
121
|
-
forced-separate = ["conftest"]
|
|
122
|
-
force-single-line = true
|
|
123
|
-
|
|
124
|
-
[tool.ruff.format]
|
|
125
|
-
quote-style = "double"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|