django-cfg 1.4.7__py3-none-any.whl → 1.4.9__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.
@@ -63,27 +63,31 @@ def extract_template(archive_path: Path, target_path: Path) -> None:
63
63
  if not root_folder:
64
64
  raise ValueError("Archive structure is invalid")
65
65
 
66
- # Path to django project in archive: django-cfg-main/libs/django_cfg_example/django/
67
- template_prefix = f"{root_folder}/libs/django_cfg_example/django/"
66
+ # Path to examples directory: django-cfg-main/examples/
67
+ examples_prefix = f"{root_folder}/examples/"
68
68
 
69
- # Extract only files from the django/ folder
69
+ # Extract files from examples/ folder (preserving django/ and docker/ subdirectories)
70
70
  extracted_files = 0
71
71
  for member in members:
72
- # Skip if not in template path
73
- if not member.startswith(template_prefix):
72
+ # Skip if not in examples path
73
+ if not member.startswith(examples_prefix):
74
74
  continue
75
75
 
76
- # Skip the django_cfg folder (local package)
77
- if f"{root_folder}/libs/django_cfg_example/django_cfg/" in member:
78
- continue
79
-
80
- # Calculate relative path (remove template_prefix)
81
- relative_path = member[len(template_prefix):]
76
+ # Calculate relative path (remove examples_prefix, keep django/ and docker/)
77
+ relative_path = member[len(examples_prefix):]
82
78
 
83
79
  # Skip empty paths (directory markers)
84
80
  if not relative_path:
85
81
  continue
86
82
 
83
+ # Skip docker volumes directory
84
+ if relative_path.startswith("docker/volumes/"):
85
+ continue
86
+
87
+ # Skip .gitignore files
88
+ if relative_path.endswith(".gitignore"):
89
+ continue
90
+
87
91
  # Target file path
88
92
  target_file = target_path / relative_path
89
93
 
@@ -142,16 +146,20 @@ def create_project(path: str, force: bool):
142
146
  django-cfg create-project --force
143
147
  """
144
148
 
145
- # Determine target path
146
- target_path = Path(path).resolve()
149
+ # Determine parent path and project folder name
150
+ parent_path = Path(path).resolve()
147
151
 
148
- # Check if target directory exists and has files
149
- if target_path.exists() and any(target_path.iterdir()):
152
+ # Create django-project folder inside the specified path
153
+ target_path = parent_path / "django-project"
154
+
155
+ # Check if django-project directory already exists
156
+ if target_path.exists():
150
157
  if not force:
151
- click.echo(f"❌ Directory '{target_path}' is not empty. Use --force to overwrite.", err=True)
158
+ click.echo(f"❌ Directory '{target_path}' already exists. Use --force to overwrite.", err=True)
152
159
  return
153
160
  else:
154
- click.echo(f"⚠️ Directory is not empty, files will be overwritten...")
161
+ click.echo(f"⚠️ Directory '{target_path}' exists and will be overwritten...")
162
+ shutil.rmtree(target_path)
155
163
 
156
164
  temp_archive = None
157
165
 
@@ -176,12 +184,15 @@ def create_project(path: str, force: bool):
176
184
  # Show next steps
177
185
  click.echo()
178
186
  click.echo("📋 Next steps:")
179
- if target_path != Path.cwd():
180
- click.echo(f" cd {target_path}")
187
+ click.echo(f" cd {target_path}/django")
181
188
  click.echo(" poetry install # or: pip install -r requirements.txt")
182
189
  click.echo(" python manage.py migrate")
183
190
  click.echo(" python manage.py createsuperuser")
184
191
  click.echo(" python manage.py runserver")
192
+ click.echo()
193
+ click.echo("🐳 Docker deployment:")
194
+ click.echo(f" cd {target_path}/docker")
195
+ click.echo(" docker-compose up -d")
185
196
 
186
197
  click.echo()
187
198
  click.echo("💡 Features included:")
django_cfg/pyproject.toml CHANGED
@@ -4,13 +4,13 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "django-cfg"
7
- version = "1.4.7"
7
+ version = "1.4.9"
8
8
  description = "Django AI framework with built-in agents, type-safe Pydantic v2 configuration, and 8 enterprise apps. Replace settings.py, validate at startup, 90% less code. Production-ready AI workflows for Django."
9
9
  readme = "README.md"
10
10
  keywords = [ "django", "configuration", "pydantic", "settings", "type-safety", "pydantic-settings", "django-environ", "startup-validation", "ide-autocomplete", "ai-agents", "enterprise-django", "django-settings", "type-safe-config",]
11
11
  classifiers = [ "Development Status :: 4 - Beta", "Framework :: Django", "Framework :: Django :: 5.2", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Systems Administration", "Typing :: Typed",]
12
12
  requires-python = ">=3.12,<4.0"
13
- dependencies = [ "pydantic>=2.11.0,<3.0", "pydantic[email]>=2.11.0,<3.0", "PyYAML>=6.0,<7.0", "pydantic-yaml>=1.6.0,<2.0", "click>=8.2.0,<9.0", "questionary>=2.1.0,<3.0", "rich>=14.0.0,<15.0", "cloudflare>=4.3.0,<5.0", "loguru>=0.7.0,<1.0", "colorlog>=6.9.0,<7.0", "cachetools>=5.3.0,<7.0", "toml>=0.10.2,<0.11.0", "ngrok>=1.5.1; python_version>='3.12'", "psycopg[binary,pool]>=3.2.0,<4.0", "dj-database-url>=3.0.0,<4.0", "whitenoise>=6.8.0,<7.0", "django-cors-headers>=4.7.0,<5.0", "djangorestframework>=3.16.0,<4.0", "djangorestframework-simplejwt>=5.5.0,<6.0", "djangorestframework-simplejwt[token-blacklist]>=5.5.0,<6.0", "drf-nested-routers>=0.94.0,<1.0", "django-filter>=25.0,<26.0", "django-ratelimit>=4.1.0,<5.0.0", "drf-spectacular>=0.28.0,<1.0", "drf-spectacular-sidecar>=2025.8.0,<2026.0", "django-json-widget>=2.0.0,<3.0", "django-import-export>=4.3.0,<5.0", "django-extensions>=4.1.0,<5.0", "django-constance>=4.3.0,<5.0", "django-unfold>=0.64.0,<1.0", "django-redis>=6.0.0,<7.0", "redis>=6.4.0,<7.0", "hiredis>=2.0.0,<4.0", "dramatiq[redis]>=1.18.0,<2.0", "django-dramatiq>=0.14.0,<1.0", "pyTelegramBotAPI>=4.28.0,<5.0", "coolname>=2.2.0,<3.0", "django-admin-rangefilter>=0.13.0,<1.0", "python-json-logger>=3.3.0,<4.0", "requests>=2.32.0,<3.0", "tiktoken>=0.11.0,<1.0", "openai>=1.107.0,<2.0", "twilio>=9.8.0,<10.0", "sendgrid>=6.12.0,<7.0", "beautifulsoup4>=4.13.0,<5.0", "lxml>=6.0.0,<7.0", "pgvector>=0.4.0,<1.0", "pydantic-ai>=1.0.10,<2.0", "django-revolution>=1.0.44,<2.0", "tenacity>=9.1.2,<10.0.0", "mypy (>=1.18.2,<2.0.0)", "django-tailwind[reload] (>=4.2.0,<5.0.0)",]
13
+ dependencies = [ "pydantic>=2.11.0,<3.0", "pydantic[email]>=2.11.0,<3.0", "PyYAML>=6.0,<7.0", "pydantic-yaml>=1.6.0,<2.0", "click>=8.2.0,<9.0", "questionary>=2.1.0,<3.0", "rich>=14.0.0,<15.0", "cloudflare>=4.3.0,<5.0", "loguru>=0.7.0,<1.0", "colorlog>=6.9.0,<7.0", "cachetools>=5.3.0,<7.0", "toml>=0.10.2,<0.11.0", "ngrok>=1.5.1; python_version>='3.12'", "psycopg[binary,pool]>=3.2.0,<4.0", "dj-database-url>=3.0.0,<4.0", "whitenoise>=6.8.0,<7.0", "django-cors-headers>=4.7.0,<5.0", "djangorestframework>=3.16.0,<4.0", "djangorestframework-simplejwt>=5.5.0,<6.0", "djangorestframework-simplejwt[token-blacklist]>=5.5.0,<6.0", "drf-nested-routers>=0.94.0,<1.0", "django-filter>=25.0,<26.0", "django-ratelimit>=4.1.0,<5.0.0", "drf-spectacular>=0.28.0,<1.0", "drf-spectacular-sidecar>=2025.8.0,<2026.0", "django-json-widget>=2.0.0,<3.0", "django-import-export>=4.3.0,<5.0", "django-extensions>=4.1.0,<5.0", "django-constance>=4.3.0,<5.0", "django-unfold>=0.64.0,<1.0", "django-redis>=6.0.0,<7.0", "redis>=6.4.0,<7.0", "hiredis>=2.0.0,<4.0", "dramatiq[redis]>=1.18.0,<2.0", "django-dramatiq>=0.14.0,<1.0", "pyTelegramBotAPI>=4.28.0,<5.0", "coolname>=2.2.0,<3.0", "django-admin-rangefilter>=0.13.0,<1.0", "python-json-logger>=3.3.0,<4.0", "requests>=2.32.0,<3.0", "tiktoken>=0.11.0,<1.0", "openai>=1.107.0,<2.0", "twilio>=9.8.0,<10.0", "sendgrid>=6.12.0,<7.0", "beautifulsoup4>=4.13.0,<5.0", "lxml>=6.0.0,<7.0", "pgvector>=0.4.0,<1.0", "pydantic-ai>=1.0.10,<2.0", "django-revolution>=1.0.45", "tenacity>=9.1.2,<10.0.0", "mypy (>=1.18.2,<2.0.0)", "django-tailwind[reload] (>=4.2.0,<5.0.0)",]
14
14
  [[project.authors]]
15
15
  name = "Django-CFG Team"
16
16
  email = "info@djangocfg.com"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-cfg
3
- Version: 1.4.7
3
+ Version: 1.4.9
4
4
  Summary: Django AI framework with built-in agents, type-safe Pydantic v2 configuration, and 8 enterprise apps. Replace settings.py, validate at startup, 90% less code. Production-ready AI workflows for Django.
5
5
  Project-URL: Homepage, https://djangocfg.com
6
6
  Project-URL: Documentation, https://djangocfg.com
@@ -45,7 +45,7 @@ Requires-Dist: django-import-export<5.0,>=4.3.0
45
45
  Requires-Dist: django-json-widget<3.0,>=2.0.0
46
46
  Requires-Dist: django-ratelimit<5.0.0,>=4.1.0
47
47
  Requires-Dist: django-redis<7.0,>=6.0.0
48
- Requires-Dist: django-revolution<2.0,>=1.0.44
48
+ Requires-Dist: django-revolution>=1.0.45
49
49
  Requires-Dist: django-tailwind[reload]<5.0.0,>=4.2.0
50
50
  Requires-Dist: django-unfold<1.0,>=0.64.0
51
51
  Requires-Dist: djangorestframework-simplejwt<6.0,>=5.5.0
@@ -544,7 +544,7 @@ django_cfg/cli/__init__.py,sha256=i3ksFngCqZCBvaimQcBD1P2_gr5PiM--4efLScCjvvU,15
544
544
  django_cfg/cli/main.py,sha256=GOmMubPoMpcA0XcRJn4VG2cX9tuhE0i_ioy_d3ujzRQ,883
545
545
  django_cfg/cli/utils.py,sha256=YGXWw7MjX-zAUDKrbJ4q_sxH54at2Oqhrcm7udVozU4,5810
546
546
  django_cfg/cli/commands/__init__.py,sha256=EKLXDAx-QttnGmdjsmVANAfhxWplxl2V_2I0SZaJOoI,98
547
- django_cfg/cli/commands/create_project.py,sha256=AMM1BDOEb7zF4phdclJ-d3Qj9wQXhxhb7ZlJdzvoFRg,7185
547
+ django_cfg/cli/commands/create_project.py,sha256=A1LImURJY6GUq5PUM3L0vCgBsPFLYJE8-M91tkrptQg,7578
548
548
  django_cfg/cli/commands/info.py,sha256=AaLbFFOjHwqiIzZChPxfD3ASZZs1IAD-0RJQaLo2PC0,4925
549
549
  django_cfg/core/__init__.py,sha256=Gooxx3nhVT53LcCF_nburLh1r2ZC3iFv9Bf4wiVK6dI,1784
550
550
  django_cfg/core/config.py,sha256=CWYqlXONdyLE71OSVMg_Htglsa9tTzankMrm_1PhnOo,679
@@ -950,9 +950,9 @@ django_cfg/utils/version_check.py,sha256=jI4v3YMdQriUEeb_TvRl511sDghy6I75iKRDUaN
950
950
  django_cfg/CHANGELOG.md,sha256=jtT3EprqEJkqSUh7IraP73vQ8PmKUMdRtznQsEnqDZk,2052
951
951
  django_cfg/CONTRIBUTING.md,sha256=DU2kyQ6PU0Z24ob7O_OqKWEYHcZmJDgzw-lQCmu6uBg,3041
952
952
  django_cfg/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
953
- django_cfg/pyproject.toml,sha256=iHxb5y1vf2rBAMFn10U_JhKS9YMAI5yjFNi2guXam3M,8329
954
- django_cfg-1.4.7.dist-info/METADATA,sha256=oAn4eWmJcby2cXPo2jT8TJz07k6AqY8xni4LaEwnGdI,22542
955
- django_cfg-1.4.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
956
- django_cfg-1.4.7.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
957
- django_cfg-1.4.7.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
958
- django_cfg-1.4.7.dist-info/RECORD,,
953
+ django_cfg/pyproject.toml,sha256=j2QoIkoE3RGWGo-YlRMTHzWXI2FmGXrd_0FiYbcm1FQ,8324
954
+ django_cfg-1.4.9.dist-info/METADATA,sha256=2D80sSVn5guEWZ4Tqu6iCED7e1Fvmwu4MxU4605hYpI,22537
955
+ django_cfg-1.4.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
956
+ django_cfg-1.4.9.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
957
+ django_cfg-1.4.9.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
958
+ django_cfg-1.4.9.dist-info/RECORD,,