django-cfg 1.1.64__py3-none-any.whl → 1.1.66__py3-none-any.whl

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.
django_cfg/README.md ADDED
File without changes
django_cfg/__init__.py CHANGED
@@ -38,7 +38,7 @@ default_app_config = "django_cfg.apps.DjangoCfgConfig"
38
38
  from typing import TYPE_CHECKING
39
39
 
40
40
  # Version information
41
- __version__ = "1.1.64"
41
+ __version__ = "1.1.66"
42
42
  __author__ = "Unrealos Team"
43
43
  __email__ = "info@unrealos.com"
44
44
  __license__ = "MIT"
@@ -127,9 +127,8 @@ class Command(BaseCommand):
127
127
  if log_file:
128
128
  process_args.extend(["--log-file", log_file])
129
129
 
130
- # Add broker module first, then task modules
131
- process_args.append("django_cfg.modules.dramatiq_setup") # Broker module
132
- process_args.extend(tasks_modules[1:]) # Skip broker module from tasks_modules
130
+ # Add task modules (broker module is already first in tasks_modules)
131
+ process_args.extend(tasks_modules)
133
132
 
134
133
  self.stdout.write(f"\nCommand that would be executed:")
135
134
  self.stdout.write(f' {" ".join(process_args)}')
@@ -170,9 +169,8 @@ class Command(BaseCommand):
170
169
  if log_file:
171
170
  process_args.extend(["--log-file", log_file])
172
171
 
173
- # Add broker module first, then task modules
174
- process_args.append("django_cfg.modules.dramatiq_setup") # Broker module
175
- process_args.extend(tasks_modules[1:]) # Skip broker module from tasks_modules
172
+ # Add task modules (broker module is already first in tasks_modules)
173
+ process_args.extend(tasks_modules)
176
174
 
177
175
  self.stdout.write(f'Running dramatiq: "{" ".join(process_args)}"\n')
178
176
 
@@ -0,0 +1,370 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "django-cfg"
7
+ version = "1.1.64"
8
+ description = "🚀 Production-ready Django configuration framework with type-safe settings, smart automation, and modern developer experience"
9
+ readme = "README.md"
10
+ license = {text = "MIT"}
11
+ authors = [
12
+ {name = "ReformsAI Team", email = "dev@reforms.ai"},
13
+ ]
14
+ maintainers = [
15
+ {name = "ReformsAI Team", email = "dev@reforms.ai"},
16
+ ]
17
+ keywords = [
18
+ "django",
19
+ "configuration",
20
+ "pydantic",
21
+ "settings",
22
+ "developer-experience",
23
+ "type-safety",
24
+ ]
25
+ classifiers = [
26
+ "Development Status :: 4 - Beta",
27
+ "Framework :: Django",
28
+ "Framework :: Django :: 5.2",
29
+ "Intended Audience :: Developers",
30
+ "License :: OSI Approved :: MIT License",
31
+ "Operating System :: OS Independent",
32
+ "Programming Language :: Python",
33
+ "Programming Language :: Python :: 3",
34
+ "Programming Language :: Python :: 3.10",
35
+ "Programming Language :: Python :: 3.11",
36
+ "Programming Language :: Python :: 3.12",
37
+ "Programming Language :: Python :: 3.13",
38
+ "Topic :: Internet :: WWW/HTTP",
39
+ "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
40
+ "Topic :: Software Development :: Libraries :: Python Modules",
41
+ "Topic :: System :: Systems Administration",
42
+ "Typing :: Typed",
43
+ ]
44
+ requires-python = ">=3.12,<4.0"
45
+
46
+ # Core dependencies - minimal and essential only
47
+ # Note: Django is a peer dependency - users should install it themselves
48
+ dependencies = [
49
+ # Core configuration
50
+ "pydantic>=2.11,<3.0",
51
+ "pydantic[email]>=2.11,<3.0",
52
+ "PyYAML>=6.0",
53
+ "pydantic-yaml>=1.6.0",
54
+
55
+ # CLI and utilities
56
+ "click>=8.2.0",
57
+ "questionary>=2.1.0",
58
+ "rich>=14.1.0",
59
+ "loguru>=0.7.0",
60
+ "colorlog>=6.9.0",
61
+ "cachetools>=6.1.0",
62
+
63
+ # Development tools (Python 3.12+ only)
64
+ "ngrok>=1.5.1; python_version>='3.12'",
65
+
66
+ # Database utilities - using psycopg3 with connection pooling support
67
+ "psycopg[binary,pool]>=3.2.0",
68
+ "dj-database-url>=3.0.0",
69
+
70
+ # Django packages (require Django as peer dependency)
71
+ "whitenoise>=6.8.0",
72
+ "django-cors-headers>=4.7.0",
73
+ "djangorestframework>=3.16.0",
74
+ "djangorestframework-simplejwt>=5.5.0",
75
+ "djangorestframework-simplejwt[token-blacklist]>=5.5.0",
76
+ "drf-nested-routers>=0.94.2",
77
+ "django-filter>=25.0",
78
+ "django-ratelimit (>=4.1.0,<5.0.0)",
79
+ "drf-spectacular>=0.28.0",
80
+ "drf-spectacular-sidecar>=2025.8.1",
81
+ "django-json-widget>=2.0.3",
82
+ "django-extensions>=4.1",
83
+ "django-constance>=4.3.2",
84
+ "django-revolution>=1.0.34",
85
+ "django-unfold>=0.64.0",
86
+ "django-redis>=6.0.0",
87
+ "redis>=6.4.0",
88
+ "hiredis>=2.0.0",
89
+
90
+ # Optional services
91
+ "pyTelegramBotAPI>=4.28.0",
92
+ "coolname>=2.2.0,<3.0.0",
93
+ "django-admin-rangefilter>=0.13.3,<0.14.0",
94
+ "python-json-logger>=3.3.0,<4.0.0",
95
+ "requests (>=2.32.5,<3.0.0)",
96
+ "currencyconverter (>=0.18.9,<0.19.0)",
97
+ "tiktoken (>=0.11.0,<0.12.0)",
98
+ "openai (>=1.107.1,<2.0.0)",
99
+ "twilio (>=9.8.0,<10.0.0)",
100
+ "sendgrid (>=6.12.4,<7.0.0)",
101
+
102
+ # Knowbase
103
+ "beautifulsoup4 (>=4.13.5,<5.0.0)",
104
+ "lxml (>=6.0.1,<7.0.0)",
105
+ "pgvector (>=0.4.1,<0.5.0)",
106
+ "toml (>=0.10.2,<0.11.0)",
107
+ ]
108
+
109
+ [project.optional-dependencies]
110
+
111
+ # Django compatibility - users should install one of these (minimum 5.2)
112
+ django52 = ["django>=5.2,<6.0"]
113
+
114
+ # Development dependencies
115
+ dev = [
116
+ # Django for development
117
+ "django>=5.2,<6.0",
118
+ # Testing
119
+ "pytest>=7.0",
120
+ "pytest-django>=4.5.0",
121
+ "pytest-cov>=4.0.0",
122
+ "pytest-mock>=3.10.0",
123
+ "factory-boy>=3.2.0",
124
+ # Code quality
125
+ "black>=23.0.0",
126
+ "isort>=5.12.0",
127
+ "flake8>=6.0.0",
128
+ "mypy>=1.5.0",
129
+ "pre-commit>=3.0.0",
130
+ # Build and publish tools
131
+ "build>=1.0.0",
132
+ "twine>=4.0.0",
133
+ "tomlkit>=0.13.3",
134
+ "questionary>=2.1.0",
135
+ "rich>=13.0.0",
136
+ # Documentation
137
+ "mkdocs>=1.5.0",
138
+ "mkdocs-material>=9.0.0",
139
+ "mkdocstrings[python]>=0.22.0",
140
+ # Task processing for development
141
+ "dramatiq[redis]>=1.18.0,<2.0",
142
+ "django-dramatiq>=0.14.0,<1.0",
143
+ "redis>=6.4.0,<7.0",
144
+ ]
145
+
146
+
147
+ # Testing dependencies
148
+ test = [
149
+ "django>=5.2,<6.0",
150
+ "pytest>=7.0",
151
+ "pytest-django>=4.5.0",
152
+ "pytest-cov>=4.0.0",
153
+ "pytest-mock>=3.10.0",
154
+ "pytest-xdist>=3.0.0",
155
+ "factory-boy>=3.2.0",
156
+ ]
157
+
158
+ # Documentation dependencies
159
+ docs = [
160
+ "mkdocs>=1.5.0",
161
+ "mkdocs-material>=9.0.0",
162
+ "mkdocstrings[python]>=0.22.0",
163
+ "pymdown-extensions>=10.0.0",
164
+ ]
165
+
166
+ # Background task processing dependencies
167
+ tasks = [
168
+ "dramatiq[redis]>=1.18.0,<2.0",
169
+ "django-dramatiq>=0.14.0,<1.0",
170
+ "redis>=6.4.0,<7.0",
171
+ ]
172
+
173
+ # Full feature set (includes all optional dependencies)
174
+ full = [
175
+ "django>=5.2,<6.0",
176
+ # Task processing
177
+ "dramatiq[redis]>=1.18.0,<2.0",
178
+ "django-dramatiq>=0.14.0,<1.0",
179
+ "redis>=6.4.0,<7.0",
180
+ ]
181
+
182
+ [project.urls]
183
+ Homepage = "https://github.com/markolofsen/django-cfg"
184
+ Documentation = "https://django-cfg.readthedocs.io"
185
+ Repository = "https://github.com/markolofsen/django-cfg.git"
186
+ Issues = "https://github.com/markolofsen/django-cfg/issues"
187
+ Changelog = "https://github.com/markolofsen/django-cfg/blob/main/CHANGELOG.md"
188
+
189
+ [project.scripts]
190
+ django-cfg = "django_cfg.cli.main:main"
191
+
192
+ [tool.hatch.build.targets.wheel]
193
+ packages = ["src/django_cfg"]
194
+ exclude = [
195
+ "django_sample", # Exclude django_sample directory (use archive instead)
196
+ "scripts/", # Exclude scripts from wheel package
197
+ ]
198
+
199
+ [tool.hatch.metadata]
200
+ allow-direct-references = true
201
+
202
+ [tool.hatch.build.targets.sdist]
203
+ include = [
204
+ "src/django_cfg",
205
+ "README.md",
206
+ "LICENSE",
207
+ "CHANGELOG.md",
208
+ "requirements*.txt",
209
+ "MANIFEST.in",
210
+ ]
211
+ exclude = [
212
+ "@*",
213
+ "tests",
214
+ "scripts", # Exclude development scripts
215
+ "*.log",
216
+ ".env*",
217
+ "django_sample", # Exclude django_sample directory (use archive instead)
218
+ ]
219
+
220
+ # Black configuration
221
+ [tool.black]
222
+ line-length = 100
223
+ target-version = ['py39']
224
+ include = '\.pyi?$'
225
+ extend-exclude = '''
226
+ /(
227
+ \.eggs
228
+ | \.git
229
+ | \.hg
230
+ | \.mypy_cache
231
+ | \.tox
232
+ | \.venv
233
+ | _build
234
+ | buck-out
235
+ | build
236
+ | dist
237
+ | migrations
238
+ )/
239
+ '''
240
+
241
+ # isort configuration
242
+ [tool.isort]
243
+ profile = "black"
244
+ line_length = 100
245
+ multi_line_output = 3
246
+ include_trailing_comma = true
247
+ force_grid_wrap = 0
248
+ use_parentheses = true
249
+ ensure_newline_before_comments = true
250
+ known_django = ["django"]
251
+ known_first_party = ["django_cfg"]
252
+ sections = ["FUTURE", "STDLIB", "DJANGO", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"]
253
+
254
+ # MyPy configuration
255
+ [tool.mypy]
256
+ python_version = "3.9"
257
+ check_untyped_defs = true
258
+ ignore_missing_imports = true
259
+ warn_unused_ignores = true
260
+ warn_redundant_casts = true
261
+ warn_unused_configs = true
262
+ disallow_untyped_defs = true
263
+ disallow_incomplete_defs = true
264
+ disallow_untyped_decorators = true
265
+ strict_optional = true
266
+ show_error_codes = true
267
+
268
+ [[tool.mypy.overrides]]
269
+ module = [
270
+ "django.*",
271
+ "rest_framework.*",
272
+ "django_redis.*",
273
+ "yaml.*",
274
+ ]
275
+ ignore_missing_imports = true
276
+
277
+ # Pytest configuration
278
+ [tool.pytest.ini_options]
279
+ addopts = [
280
+ "--cov=django_cfg",
281
+ "--cov-report=term-missing",
282
+ "--cov-report=html",
283
+ "--cov-report=xml",
284
+ "--cov-fail-under=50",
285
+ "--strict-markers",
286
+ "--strict-config",
287
+ "--verbose",
288
+ ]
289
+ testpaths = ["tests"]
290
+ markers = [
291
+ "slow: marks tests as slow (deselect with '-m \"not slow\"')",
292
+ "integration: marks tests as integration tests",
293
+ "unit: marks tests as unit tests",
294
+ "django_db: marks tests that require database access",
295
+ ]
296
+ filterwarnings = [
297
+ "error",
298
+ "ignore::UserWarning",
299
+ "ignore::DeprecationWarning",
300
+ ]
301
+
302
+ # Coverage configuration
303
+ [tool.coverage.run]
304
+ source = ["src/django_cfg"]
305
+ omit = [
306
+ "*/tests/*",
307
+ "*/migrations/*",
308
+ "*/__pycache__/*",
309
+ "*/venv/*",
310
+ "*/.venv/*",
311
+ ]
312
+
313
+ [tool.coverage.report]
314
+ exclude_lines = [
315
+ "pragma: no cover",
316
+ "def __repr__",
317
+ "if self.debug:",
318
+ "if settings.DEBUG",
319
+ "raise AssertionError",
320
+ "raise NotImplementedError",
321
+ "if 0:",
322
+ "if __name__ == .__main__.:",
323
+ "class .*\\bProtocol\\):",
324
+ "@(abc\\.)?abstractmethod",
325
+ ]
326
+
327
+ [tool.coverage.html]
328
+ directory = "htmlcov"
329
+
330
+ # Ruff configuration (alternative to flake8)
331
+ [tool.ruff]
332
+ target-version = "py39"
333
+ line-length = 100
334
+ select = [
335
+ "E", # pycodestyle errors
336
+ "W", # pycodestyle warnings
337
+ "F", # pyflakes
338
+ "I", # isort
339
+ "B", # flake8-bugbear
340
+ "C4", # flake8-comprehensions
341
+ "UP", # pyupgrade
342
+ "N", # pep8-naming
343
+ "S", # bandit
344
+ ]
345
+ ignore = [
346
+ "E501", # line too long, handled by black
347
+ "B008", # do not perform function calls in argument defaults
348
+ "S101", # use of assert
349
+ "S311", # pseudo-random generators are not suitable for cryptographic purposes
350
+ ]
351
+
352
+ [tool.ruff.per-file-ignores]
353
+ "tests/*" = ["S101", "S106"] # Allow assert and hardcoded passwords in tests
354
+ "*/migrations/*" = ["N806"] # Allow non-lowercase variable names in migrations
355
+
356
+ # Bandit security configuration
357
+ [tool.bandit]
358
+ exclude_dirs = ["tests", "migrations"]
359
+ skips = ["B101", "B601"] # Skip assert_used and shell injection (handled by other tools)
360
+
361
+ [tool.poetry.group.dev.dependencies]
362
+ tomlkit = "^0.13.3"
363
+ build = "^1.3.0"
364
+ rich = "^14.1.0"
365
+ questionary = "^2.1.0"
366
+ psutil = "^7.0.0"
367
+ aiohttp = "^3.12.15"
368
+ pytest-asyncio = "^1.2.0"
369
+ pillow = "^11.3.0"
370
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-cfg
3
- Version: 1.1.64
3
+ Version: 1.1.66
4
4
  Summary: 🚀 Production-ready Django configuration framework with type-safe settings, smart automation, and modern developer experience
5
5
  Project-URL: Homepage, https://github.com/markolofsen/django-cfg
6
6
  Project-URL: Documentation, https://django-cfg.readthedocs.io
@@ -1,7 +1,9 @@
1
- django_cfg/__init__.py,sha256=y07sq8IgnY7SBDOPKENJt5CzHEv6lGomZd6AqXWYaZQ,14288
1
+ django_cfg/README.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ django_cfg/__init__.py,sha256=vPe7-Bqe2-tFjSEHPCsd76s1cpXKIJLJlphLXWK0vnM,14288
2
3
  django_cfg/apps.py,sha256=k84brkeXJI7EgKZLEpTkM9YFZofKI4PzhFOn1cl9Msc,1656
3
4
  django_cfg/exceptions.py,sha256=RTQEoU3PfR8lqqNNv5ayd_HY2yJLs3eioqUy8VM6AG4,10378
4
5
  django_cfg/integration.py,sha256=-7hvd-4ohLdzH4eufCZTOe3yTzPoQyB_HCfvsSm9AAw,5218
6
+ django_cfg/pyproject.toml,sha256=l_JhZm2DDUtS_ekHMEflpnfRtqHek3W_ASHMFBmCx7k,9250
5
7
  django_cfg/routers.py,sha256=O954Hm1BKMyN9-tIK2SByxTHafy_SGzbHLjCbBaf4lg,2622
6
8
  django_cfg/version_check.py,sha256=jI4v3YMdQriUEeb_TvRl511sDghy6I75iKRDUaNpucs,4800
7
9
  django_cfg/apps/__init__.py,sha256=JtDmEYt1OcleWM2ZaeX0LKDnRQzPOavfaXBWG4ECB5Q,26
@@ -156,7 +158,7 @@ django_cfg/management/commands/create_token.py,sha256=beHtUTuyFZhG97F9vSkaX-u7ti
156
158
  django_cfg/management/commands/generate.py,sha256=w0BF7IMftxNjxTxFuY8cw5pNKGW-LmTScJ8kZpxHu_8,4248
157
159
  django_cfg/management/commands/list_urls.py,sha256=D8ikInA3uE1LbQGLWmfdLnEqPg7wqrI3caQA6iTe_-0,11009
158
160
  django_cfg/management/commands/migrator.py,sha256=mhMM63uv_Jp9zHVVM7TMwCB90uv3iFZn1vOG-rXyi3s,16191
159
- django_cfg/management/commands/rundramatiq.py,sha256=JmRB_eAexMZcuXu0ln8vqO0CSpWO_7yEMBykKOHCYTE,9190
161
+ django_cfg/management/commands/rundramatiq.py,sha256=jBsZeZzVpcT_YCOoEh77aRZE0lbGsZ4RqEIdMTyB1ZA,8980
160
162
  django_cfg/management/commands/runserver_ngrok.py,sha256=mcTioDIzHgha6sGo5eazlJhdKr8y5-uEQIc3qG3AvCI,5237
161
163
  django_cfg/management/commands/script.py,sha256=I6zOEQEGaED0HoLxl2EqKz39HwbKg9HhdxnGKybfH5s,16974
162
164
  django_cfg/management/commands/show_config.py,sha256=0YJ99P1XvymT3fWritaNmn_HJ-PVb0I-yBy757M_bn8,8337
@@ -252,8 +254,8 @@ django_cfg/templates/emails/base_email.html,sha256=TWcvYa2IHShlF_E8jf1bWZStRO0v8
252
254
  django_cfg/utils/__init__.py,sha256=64wwXJuXytvwt8Ze_erSR2HmV07nGWJ6DV5wloRBvYE,435
253
255
  django_cfg/utils/path_resolution.py,sha256=eML-6-RIGTs5TePktIQN8nxfDUEFJ3JA0AzWBcihAbs,13894
254
256
  django_cfg/utils/smart_defaults.py,sha256=iL6_n3jGDW5812whylWAwXik0xBSYihdLp4IJ26T5eA,20547
255
- django_cfg-1.1.64.dist-info/METADATA,sha256=fpzL6zF9N33CDJwsPPmWdQnNJ6v6l3MBrjmDWFZE_Qk,44084
256
- django_cfg-1.1.64.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
257
- django_cfg-1.1.64.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
258
- django_cfg-1.1.64.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
259
- django_cfg-1.1.64.dist-info/RECORD,,
257
+ django_cfg-1.1.66.dist-info/METADATA,sha256=YvxVxy9UltLeOr1Lly84xllU1vgMtdxlzaeqJdsyyWw,44084
258
+ django_cfg-1.1.66.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
259
+ django_cfg-1.1.66.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
260
+ django_cfg-1.1.66.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
261
+ django_cfg-1.1.66.dist-info/RECORD,,