csu 2.3.0__tar.gz → 2.3.1__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.
Files changed (108) hide show
  1. {csu-2.3.0 → csu-2.3.1}/.bumpversion.cfg +1 -1
  2. {csu-2.3.0 → csu-2.3.1}/.cookiecutterrc +20 -19
  3. {csu-2.3.0 → csu-2.3.1}/.github/workflows/github-actions.yml +7 -19
  4. {csu-2.3.0 → csu-2.3.1}/.pre-commit-config.yaml +9 -5
  5. csu-2.3.1/.tombi.toml +4 -0
  6. {csu-2.3.0 → csu-2.3.1}/LICENSE +1 -1
  7. {csu-2.3.0 → csu-2.3.1}/MANIFEST.in +1 -1
  8. {csu-2.3.0 → csu-2.3.1}/PKG-INFO +9 -17
  9. {csu-2.3.0 → csu-2.3.1}/README.rst +2 -2
  10. {csu-2.3.0 → csu-2.3.1}/ci/bootstrap.py +1 -1
  11. {csu-2.3.0 → csu-2.3.1}/ci/templates/.github/workflows/github-actions.yml +3 -2
  12. csu-2.3.1/pyproject.toml +114 -0
  13. {csu-2.3.0 → csu-2.3.1}/src/csu/__init__.py +1 -1
  14. {csu-2.3.0 → csu-2.3.1}/src/csu/worker/engine.py +3 -3
  15. {csu-2.3.0 → csu-2.3.1}/src/csu.egg-info/PKG-INFO +9 -17
  16. {csu-2.3.0 → csu-2.3.1}/src/csu.egg-info/SOURCES.txt +1 -1
  17. {csu-2.3.0 → csu-2.3.1}/tests/exampleworker.py +1 -1
  18. {csu-2.3.0 → csu-2.3.1}/tests/testproject/settings.py +0 -2
  19. {csu-2.3.0 → csu-2.3.1}/tox.ini +5 -6
  20. csu-2.3.0/.taplo.toml +0 -3
  21. csu-2.3.0/pyproject.toml +0 -125
  22. {csu-2.3.0 → csu-2.3.1}/.coveragerc +0 -0
  23. {csu-2.3.0 → csu-2.3.1}/.editorconfig +0 -0
  24. {csu-2.3.0 → csu-2.3.1}/AUTHORS.rst +0 -0
  25. {csu-2.3.0 → csu-2.3.1}/CHANGELOG.rst +0 -0
  26. {csu-2.3.0 → csu-2.3.1}/CONTRIBUTING.rst +0 -0
  27. {csu-2.3.0 → csu-2.3.1}/ci/requirements.txt +0 -0
  28. {csu-2.3.0 → csu-2.3.1}/pytest.ini +0 -0
  29. {csu-2.3.0 → csu-2.3.1}/setup.cfg +0 -0
  30. {csu-2.3.0 → csu-2.3.1}/src/csu/admin.py +0 -0
  31. {csu-2.3.0 → csu-2.3.1}/src/csu/conf.py +0 -0
  32. {csu-2.3.0 → csu-2.3.1}/src/csu/consts.py +0 -0
  33. {csu-2.3.0 → csu-2.3.1}/src/csu/drf/__init__.py +0 -0
  34. {csu-2.3.0 → csu-2.3.1}/src/csu/drf/auth.py +0 -0
  35. {csu-2.3.0 → csu-2.3.1}/src/csu/drf/fields.py +0 -0
  36. {csu-2.3.0 → csu-2.3.1}/src/csu/drf/forms.py +0 -0
  37. {csu-2.3.0 → csu-2.3.1}/src/csu/drf/perms.py +0 -0
  38. {csu-2.3.0 → csu-2.3.1}/src/csu/drf/phonenumber.py +0 -0
  39. {csu-2.3.0 → csu-2.3.1}/src/csu/drf/serializers.py +0 -0
  40. {csu-2.3.0 → csu-2.3.1}/src/csu/drf/test_auth.py +0 -0
  41. {csu-2.3.0 → csu-2.3.1}/src/csu/drf/test_fields.py +0 -0
  42. {csu-2.3.0 → csu-2.3.1}/src/csu/drf/test_forms.py +0 -0
  43. {csu-2.3.0 → csu-2.3.1}/src/csu/drf/test_phonenumber.py +0 -0
  44. {csu-2.3.0 → csu-2.3.1}/src/csu/drf/test_serializers.py +0 -0
  45. {csu-2.3.0 → csu-2.3.1}/src/csu/drf/views.py +0 -0
  46. {csu-2.3.0 → csu-2.3.1}/src/csu/enums.py +0 -0
  47. {csu-2.3.0 → csu-2.3.1}/src/csu/env.py +0 -0
  48. {csu-2.3.0 → csu-2.3.1}/src/csu/exceptions.py +0 -0
  49. {csu-2.3.0 → csu-2.3.1}/src/csu/export.py +0 -0
  50. {csu-2.3.0 → csu-2.3.1}/src/csu/fixups.py +0 -0
  51. {csu-2.3.0 → csu-2.3.1}/src/csu/forms/__init__.py +0 -0
  52. {csu-2.3.0 → csu-2.3.1}/src/csu/forms/crispy.py +0 -0
  53. {csu-2.3.0 → csu-2.3.1}/src/csu/forms/fields.py +0 -0
  54. {csu-2.3.0 → csu-2.3.1}/src/csu/gettext.py +0 -0
  55. {csu-2.3.0 → csu-2.3.1}/src/csu/gettext_lazy.py +0 -0
  56. {csu-2.3.0 → csu-2.3.1}/src/csu/locale/ro/LC_MESSAGES/django.mo +0 -0
  57. {csu-2.3.0 → csu-2.3.1}/src/csu/locale/ro/LC_MESSAGES/django.po +0 -0
  58. {csu-2.3.0 → csu-2.3.1}/src/csu/logging.py +0 -0
  59. {csu-2.3.0 → csu-2.3.1}/src/csu/management.py +0 -0
  60. {csu-2.3.0 → csu-2.3.1}/src/csu/models.py +0 -0
  61. {csu-2.3.0 → csu-2.3.1}/src/csu/query.py +0 -0
  62. {csu-2.3.0 → csu-2.3.1}/src/csu/routers.py +0 -0
  63. {csu-2.3.0 → csu-2.3.1}/src/csu/service.py +0 -0
  64. {csu-2.3.0 → csu-2.3.1}/src/csu/templates/api_exception.html +0 -0
  65. {csu-2.3.0 → csu-2.3.1}/src/csu/templates/forms/widgets/opaquewidget.html +0 -0
  66. {csu-2.3.0 → csu-2.3.1}/src/csu/test_consts.py +0 -0
  67. {csu-2.3.0 → csu-2.3.1}/src/csu/test_env.py +0 -0
  68. {csu-2.3.0 → csu-2.3.1}/src/csu/test_exceptions.py +0 -0
  69. {csu-2.3.0 → csu-2.3.1}/src/csu/test_logging.py +0 -0
  70. {csu-2.3.0 → csu-2.3.1}/src/csu/test_management.py +0 -0
  71. {csu-2.3.0 → csu-2.3.1}/src/csu/test_service.py +0 -0
  72. {csu-2.3.0 → csu-2.3.1}/src/csu/test_timezones.py +0 -0
  73. {csu-2.3.0 → csu-2.3.1}/src/csu/test_utils.py +0 -0
  74. {csu-2.3.0 → csu-2.3.1}/src/csu/test_xml.py +0 -0
  75. {csu-2.3.0 → csu-2.3.1}/src/csu/timezones.py +0 -0
  76. {csu-2.3.0 → csu-2.3.1}/src/csu/utils.py +0 -0
  77. {csu-2.3.0 → csu-2.3.1}/src/csu/views.py +0 -0
  78. {csu-2.3.0 → csu-2.3.1}/src/csu/worker/__init__.py +0 -0
  79. {csu-2.3.0 → csu-2.3.1}/src/csu/worker/admin.py +0 -0
  80. {csu-2.3.0 → csu-2.3.1}/src/csu/worker/asgi.py +0 -0
  81. {csu-2.3.0 → csu-2.3.1}/src/csu/worker/enums.py +0 -0
  82. {csu-2.3.0 → csu-2.3.1}/src/csu/worker/job.py +0 -0
  83. {csu-2.3.0 → csu-2.3.1}/src/csu/worker/models.py +0 -0
  84. {csu-2.3.0 → csu-2.3.1}/src/csu/worker/registry.py +0 -0
  85. {csu-2.3.0 → csu-2.3.1}/src/csu/wsgi.py +0 -0
  86. {csu-2.3.0 → csu-2.3.1}/src/csu/xml.py +0 -0
  87. {csu-2.3.0 → csu-2.3.1}/src/csu.egg-info/dependency_links.txt +0 -0
  88. {csu-2.3.0 → csu-2.3.1}/src/csu.egg-info/requires.txt +0 -0
  89. {csu-2.3.0 → csu-2.3.1}/src/csu.egg-info/top_level.txt +0 -0
  90. {csu-2.3.0 → csu-2.3.1}/tests/cassettes/test_service/test_custom_context.yaml +0 -0
  91. {csu-2.3.0 → csu-2.3.1}/tests/cassettes/test_service/test_custom_context_0_retries.yaml +0 -0
  92. {csu-2.3.0 → csu-2.3.1}/tests/cassettes/test_service/test_decoding.yaml +0 -0
  93. {csu-2.3.0 → csu-2.3.1}/tests/cassettes/test_service/test_error.yaml +0 -0
  94. {csu-2.3.0 → csu-2.3.1}/tests/cassettes/test_service/test_logging.yaml +0 -0
  95. {csu-2.3.0 → csu-2.3.1}/tests/cassettes/test_service/test_redirects.yaml +0 -0
  96. {csu-2.3.0 → csu-2.3.1}/tests/cassettes/test_service_auth/test_async.yaml +0 -0
  97. {csu-2.3.0 → csu-2.3.1}/tests/cassettes/test_service_auth/test_sync.yaml +0 -0
  98. {csu-2.3.0 → csu-2.3.1}/tests/conftest.py +0 -0
  99. {csu-2.3.0 → csu-2.3.1}/tests/test_exampleworker.py +0 -0
  100. {csu-2.3.0 → csu-2.3.1}/tests/test_models.py +0 -0
  101. {csu-2.3.0 → csu-2.3.1}/tests/test_service.py +0 -0
  102. {csu-2.3.0 → csu-2.3.1}/tests/test_service_auth.py +0 -0
  103. {csu-2.3.0 → csu-2.3.1}/tests/test_views.py +0 -0
  104. {csu-2.3.0 → csu-2.3.1}/tests/test_worker.py +0 -0
  105. {csu-2.3.0 → csu-2.3.1}/tests/testproject/__init__.py +0 -0
  106. {csu-2.3.0 → csu-2.3.1}/tests/testproject/fixtures/testuser.json +0 -0
  107. {csu-2.3.0 → csu-2.3.1}/tests/testproject/models.py +0 -0
  108. {csu-2.3.0 → csu-2.3.1}/tests/testproject/urls.py +0 -0
@@ -1,5 +1,5 @@
1
1
  [bumpversion]
2
- current_version = 2.3.0
2
+ current_version = 2.3.1
3
3
  commit = True
4
4
  tag = True
5
5
 
@@ -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: 'no'
4
+ c_extension_optional: false
5
5
  c_extension_support: 'no'
6
- codacy: 'yes'
6
+ codacy: true
7
7
  codacy_projectid: '[Get ID from https://app.codacy.com/gh/ionelmc/python-csu/settings]'
8
- codeclimate: 'no'
9
- codecov: 'yes'
8
+ codeclimate: false
9
+ codecov: true
10
10
  command_line_interface: 'no'
11
11
  command_line_interface_bin_name: csu
12
- coveralls: 'yes'
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: 'yes'
19
- github_actions_osx: 'no'
20
- github_actions_windows: 'no'
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: 'yes'
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: 'yes'
28
- pypi_disable_upload: 'no'
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
- scrutinizer: 'yes'
36
- setup_py_uses_setuptools_scm: 'no'
37
- sphinx_docs: 'no'
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: 'no'
40
+ sphinx_doctest: false
40
41
  sphinx_theme: furo
41
- test_matrix_separate_coverage: 'no'
42
- tests_inside_package: 'yes'
43
- version: 2.3.0
42
+ test_matrix_separate_coverage: false
43
+ tests_inside_package: true
44
+ version: 2.3.1
44
45
  version_manager: bump2version
45
46
  website: https://blog.ionelmc.ro
46
47
  year_from: '2024'
47
- year_to: '2024'
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: 'py313-dj4 (ubuntu/x64)'
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-dj4'
19
+ tox_env: 'py314'
32
20
  os: 'ubuntu-latest'
33
21
  cover: true
34
- - name: 'py314-dj5 (ubuntu/x64)'
22
+ - name: 'py314 (windows/x64)'
35
23
  python: '3.14'
36
24
  python_arch: 'x64'
37
- tox_env: 'py314-dj5'
38
- os: 'ubuntu-latest'
25
+ tox_env: 'py314'
26
+ os: 'windows-latest'
39
27
  cover: true
40
28
  steps:
41
- - uses: actions/checkout@v5
29
+ - uses: actions/checkout@v6
42
30
  with:
43
31
  fetch-depth: 0
44
- - uses: actions/setup-python@v5
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.4
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/ComPWA/taplo-pre-commit
20
- rev: v0.9.3
20
+ - repo: https://github.com/tombi-toml/tombi-pre-commit
21
+ rev: v0.9.16
21
22
  hooks:
22
- - id: taplo-format
23
- - id: taplo-lint
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.1/.tombi.toml ADDED
@@ -0,0 +1,4 @@
1
+ [format]
2
+ [format.rules]
3
+ indent-sub-tables = true
4
+ indent-width = 4
@@ -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
 
@@ -9,7 +9,7 @@ include .coveragerc
9
9
  include .editorconfig
10
10
  include .github/workflows/github-actions.yml
11
11
  include .pre-commit-config.yaml
12
- include .taplo.toml
12
+ include .tombi.toml
13
13
  include pyproject.toml
14
14
  include pytest.ini
15
15
  include tox.ini
@@ -1,25 +1,17 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: csu
3
- Version: 2.3.0
3
+ Version: 2.3.1
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.0.svg
72
+ .. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.3.1.svg
81
73
  :alt: Commits since latest release
82
- :target: https://github.com/ionelmc/python-csu/compare/v2.3.0...main
74
+ :target: https://github.com/ionelmc/python-csu/compare/v2.3.1...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.0.svg
37
+ .. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.3.1.svg
38
38
  :alt: Commits since latest release
39
- :target: https://github.com/ionelmc/python-csu/compare/v2.3.0...main
39
+ :target: https://github.com/ionelmc/python-csu/compare/v2.3.1...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"], universal_newlines=True).splitlines()
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@v5
39
+ - uses: actions/checkout@v6
39
40
  with:
40
41
  fetch-depth: 0
41
- - uses: actions/setup-python@v5
42
+ - uses: actions/setup-python@v6
42
43
  with:
43
44
  python-version: {{ '${{ matrix.python }}' }}
44
45
  architecture: {{ '${{ matrix.python_arch }}' }}
@@ -0,0 +1,114 @@
1
+ [project]
2
+ name = "csu"
3
+ version = "2.3.1"
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"] }
@@ -2,4 +2,4 @@
2
2
  a.k.a Clean Slate Utils
3
3
  """
4
4
 
5
- __version__ = "2.3.0"
5
+ __version__ = "2.3.1"
@@ -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)
@@ -330,9 +330,9 @@ class AbstractEngine(ABC):
330
330
  if not graceful:
331
331
  self.shutdown_tasks[True].cancel()
332
332
  if graceful in self.shutdown_tasks:
333
- logger.warn("%s.shutdown_handler(%s) already requested", self, sig_name)
333
+ logger.warning("%s.shutdown_handler(%s) already requested", self, sig_name)
334
334
  else:
335
- self.shutdown_tasks[graceful] = asyncio.create_task(self.stop(graceful=graceful))
335
+ self.shutdown_tasks[graceful] = asyncio.create_task(self.stop(graceful=graceful), name=f"{type(self).__name__}.stop(graceful={graceful})")
336
336
  self.shutdown_requested = True
337
337
 
338
338
  async def stop(self, graceful=False):
@@ -1,25 +1,17 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: csu
3
- Version: 2.3.0
3
+ Version: 2.3.1
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.0.svg
72
+ .. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.3.1.svg
81
73
  :alt: Commits since latest release
82
- :target: https://github.com/ionelmc/python-csu/compare/v2.3.0...main
74
+ :target: https://github.com/ionelmc/python-csu/compare/v2.3.1...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/
@@ -3,7 +3,7 @@
3
3
  .coveragerc
4
4
  .editorconfig
5
5
  .pre-commit-config.yaml
6
- .taplo.toml
6
+ .tombi.toml
7
7
  AUTHORS.rst
8
8
  CHANGELOG.rst
9
9
  CONTRIBUTING.rst
@@ -36,7 +36,7 @@ class NoOpTask:
36
36
 
37
37
 
38
38
  @dataclass
39
- class ExampleJob[RequestStruct](Job):
39
+ class ExampleJob(Job):
40
40
  id: int
41
41
 
42
42
 
@@ -62,8 +62,6 @@ LOGGING = {
62
62
  "version": 1,
63
63
  "disable_existing_loggers": False,
64
64
  "loggers": {
65
- "httpcore": {"level": "WARNING"},
66
- "httpx": {"level": "WARNING"},
67
65
  "vcr.stubs": {"level": "WARNING"},
68
66
  },
69
67
  }
@@ -13,7 +13,7 @@ passenv =
13
13
  envlist =
14
14
  clean,
15
15
  check,
16
- py314-{dj5,dj6},
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.16.1
45
- phonenumberslite==9.0.25
44
+ djangorestframework==3.17.1
45
+ phonenumberslite==9.0.28
46
46
  django-phonenumber-field==8.4.0
47
- niquests[brotli,http3]==3.18.1
47
+ niquests[brotli,http3]==3.18.6
48
48
  datetimerange==2.3.2
49
49
  defusedxml==0.7.1
50
50
  django-rosetta
51
- dj5: django==5.2.11
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
@@ -1,3 +0,0 @@
1
- [formatting]
2
- array_auto_collapse = false
3
- indent_string = " "
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