tina4-python 3.10.9__tar.gz → 3.10.10__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 (139) hide show
  1. {tina4_python-3.10.9 → tina4_python-3.10.10}/PKG-INFO +1 -1
  2. {tina4_python-3.10.9 → tina4_python-3.10.10}/pyproject.toml +1 -1
  3. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/migration/runner.py +45 -16
  4. {tina4_python-3.10.9 → tina4_python-3.10.10}/.gitignore +0 -0
  5. {tina4_python-3.10.9 → tina4_python-3.10.10}/README.md +0 -0
  6. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/CLAUDE.md +0 -0
  7. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/HtmlElement.py +0 -0
  8. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/Testing.py +0 -0
  9. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/__init__.py +0 -0
  10. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/ai/__init__.py +0 -0
  11. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/api/__init__.py +0 -0
  12. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/auth/__init__.py +0 -0
  13. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/cache/__init__.py +0 -0
  14. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/cli/__init__.py +0 -0
  15. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/container/__init__.py +0 -0
  16. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/core/__init__.py +0 -0
  17. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/core/cache.py +0 -0
  18. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/core/constants.py +0 -0
  19. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/core/events.py +0 -0
  20. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/core/middleware.py +0 -0
  21. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/core/request.py +0 -0
  22. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/core/response.py +0 -0
  23. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/core/router.py +0 -0
  24. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/core/server.py +0 -0
  25. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/crud/__init__.py +0 -0
  26. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/database/__init__.py +0 -0
  27. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/database/adapter.py +0 -0
  28. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/database/connection.py +0 -0
  29. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/database/firebird.py +0 -0
  30. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/database/mssql.py +0 -0
  31. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/database/mysql.py +0 -0
  32. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/database/odbc.py +0 -0
  33. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/database/postgres.py +0 -0
  34. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/database/sqlite.py +0 -0
  35. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/debug/__init__.py +0 -0
  36. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/debug/error_overlay.py +0 -0
  37. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/dev_admin/__init__.py +0 -0
  38. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/dev_reload.py +0 -0
  39. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/dotenv/__init__.py +0 -0
  40. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/frond/FROND.md +0 -0
  41. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/frond/__init__.py +0 -0
  42. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/frond/engine.py +0 -0
  43. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/auth/meta.json +0 -0
  44. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/auth/src/routes/api/gallery_auth.py +0 -0
  45. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/database/meta.json +0 -0
  46. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/database/src/routes/api/gallery_db.py +0 -0
  47. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/error-overlay/meta.json +0 -0
  48. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/error-overlay/src/routes/api/gallery_crash.py +0 -0
  49. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/orm/meta.json +0 -0
  50. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/orm/src/orm/Product.py +0 -0
  51. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/orm/src/routes/api/gallery_products.py +0 -0
  52. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/queue/meta.json +0 -0
  53. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/queue/src/routes/api/gallery_queue.py +0 -0
  54. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/rest-api/meta.json +0 -0
  55. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/rest-api/src/routes/api/gallery_hello.py +0 -0
  56. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/templates/meta.json +0 -0
  57. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/templates/src/routes/gallery_page.py +0 -0
  58. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/gallery/templates/src/templates/gallery_page.twig +0 -0
  59. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/graphql/__init__.py +0 -0
  60. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/i18n/__init__.py +0 -0
  61. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/messenger/__init__.py +0 -0
  62. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/migration/__init__.py +0 -0
  63. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/orm/__init__.py +0 -0
  64. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/orm/fields.py +0 -0
  65. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/orm/model.py +0 -0
  66. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/public/css/tina4.css +0 -0
  67. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/public/css/tina4.min.css +0 -0
  68. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/public/favicon.ico +0 -0
  69. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/public/images/logo.svg +0 -0
  70. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/public/images/tina4-logo-icon.webp +0 -0
  71. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/public/js/frond.min.js +0 -0
  72. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/public/js/tina4-dev-admin.min.js +0 -0
  73. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/public/js/tina4.min.js +0 -0
  74. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/public/js/tina4js.min.js +0 -0
  75. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/public/swagger/index.html +0 -0
  76. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/public/swagger/oauth2-redirect.html +0 -0
  77. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/query_builder/__init__.py +0 -0
  78. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/queue/__init__.py +0 -0
  79. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/queue_backends/__init__.py +0 -0
  80. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/queue_backends/kafka_backend.py +0 -0
  81. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/queue_backends/mongo_backend.py +0 -0
  82. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/queue_backends/rabbitmq_backend.py +0 -0
  83. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/__init__.py +0 -0
  84. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/_alerts.scss +0 -0
  85. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/_badges.scss +0 -0
  86. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/_buttons.scss +0 -0
  87. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/_cards.scss +0 -0
  88. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/_forms.scss +0 -0
  89. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/_grid.scss +0 -0
  90. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/_modals.scss +0 -0
  91. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/_nav.scss +0 -0
  92. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/_reset.scss +0 -0
  93. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/_tables.scss +0 -0
  94. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/_typography.scss +0 -0
  95. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/_utilities.scss +0 -0
  96. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/_variables.scss +0 -0
  97. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/base.scss +0 -0
  98. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/colors.scss +0 -0
  99. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/scss/tina4css/tina4.scss +0 -0
  100. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/seeder/__init__.py +0 -0
  101. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/service/__init__.py +0 -0
  102. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/session/__init__.py +0 -0
  103. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/session_handlers/__init__.py +0 -0
  104. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/session_handlers/mongodb_handler.py +0 -0
  105. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/session_handlers/redis_handler.py +0 -0
  106. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/session_handlers/valkey_handler.py +0 -0
  107. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/swagger/__init__.py +0 -0
  108. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/components/crud.twig +0 -0
  109. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/docker/distroless/Dockerfile +0 -0
  110. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/docker/poetry/Dockerfile +0 -0
  111. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/docker/python/Dockerfile +0 -0
  112. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/docker/uv/Dockerfile +0 -0
  113. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/errors/302.twig +0 -0
  114. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/errors/401.twig +0 -0
  115. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/errors/403.twig +0 -0
  116. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/errors/404.twig +0 -0
  117. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/errors/500.twig +0 -0
  118. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/errors/502.twig +0 -0
  119. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/errors/503.twig +0 -0
  120. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/errors/base.twig +0 -0
  121. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/frontend/README.md +0 -0
  122. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/templates/readme.md +0 -0
  123. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/test_client/__init__.py +0 -0
  124. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/translations/af/LC_MESSAGES/messages.mo +0 -0
  125. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/translations/af/LC_MESSAGES/messages.po +0 -0
  126. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/translations/en/LC_MESSAGES/messages.mo +0 -0
  127. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/translations/en/LC_MESSAGES/messages.po +0 -0
  128. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/translations/es/LC_MESSAGES/messages.mo +0 -0
  129. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/translations/es/LC_MESSAGES/messages.po +0 -0
  130. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/translations/fr/LC_MESSAGES/messages.mo +0 -0
  131. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/translations/fr/LC_MESSAGES/messages.po +0 -0
  132. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/translations/ja/LC_MESSAGES/messages.mo +0 -0
  133. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/translations/ja/LC_MESSAGES/messages.po +0 -0
  134. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/translations/zh/LC_MESSAGES/messages.mo +0 -0
  135. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/translations/zh/LC_MESSAGES/messages.po +0 -0
  136. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/validator/__init__.py +0 -0
  137. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/websocket/__init__.py +0 -0
  138. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/websocket/backplane.py +0 -0
  139. {tina4_python-3.10.9 → tina4_python-3.10.10}/tina4_python/wsdl/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tina4-python
3
- Version: 3.10.9
3
+ Version: 3.10.10
4
4
  Summary: Tina4 Python v3 — Zero-dependency, lightweight web framework
5
5
  Author-email: Andre van Zuydam <andrevanzuydam@gmail.com>
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tina4-python"
3
- version = "3.10.9"
3
+ version = "3.10.10"
4
4
  description = "Tina4 Python v3 — Zero-dependency, lightweight web framework"
5
5
  authors = [
6
6
  {name = "Andre van Zuydam", email = "andrevanzuydam@gmail.com"}
@@ -24,16 +24,34 @@ def _ensure_tracking_table(db):
24
24
  When detected, adds the missing column and backfills from `description`.
25
25
  """
26
26
  if not db.table_exists("tina4_migration"):
27
- db.execute("""
28
- CREATE TABLE tina4_migration (
29
- id INTEGER PRIMARY KEY AUTOINCREMENT,
30
- migration_id TEXT NOT NULL UNIQUE,
31
- description TEXT,
32
- batch INTEGER NOT NULL DEFAULT 1,
33
- executed_at TEXT NOT NULL,
34
- passed INTEGER NOT NULL DEFAULT 1
35
- )
36
- """)
27
+ if _is_firebird(db):
28
+ # Firebird: no AUTOINCREMENT, no TEXT type, use generator for IDs
29
+ try:
30
+ db.execute("CREATE GENERATOR GEN_TINA4_MIGRATION_ID")
31
+ db.commit()
32
+ except Exception:
33
+ pass # Generator may already exist
34
+ db.execute("""
35
+ CREATE TABLE tina4_migration (
36
+ id INTEGER NOT NULL PRIMARY KEY,
37
+ migration_id VARCHAR(500) NOT NULL UNIQUE,
38
+ description VARCHAR(500),
39
+ batch INTEGER DEFAULT 1 NOT NULL,
40
+ executed_at VARCHAR(50) NOT NULL,
41
+ passed INTEGER DEFAULT 1 NOT NULL
42
+ )
43
+ """)
44
+ else:
45
+ db.execute("""
46
+ CREATE TABLE tina4_migration (
47
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
48
+ migration_id TEXT NOT NULL UNIQUE,
49
+ description TEXT,
50
+ batch INTEGER NOT NULL DEFAULT 1,
51
+ executed_at TEXT NOT NULL,
52
+ passed INTEGER NOT NULL DEFAULT 1
53
+ )
54
+ """)
37
55
  db.commit()
38
56
  return
39
57
 
@@ -43,7 +61,8 @@ def _ensure_tracking_table(db):
43
61
  except Exception:
44
62
  # migration_id column doesn't exist — v2 schema, upgrade it
45
63
  try:
46
- db.execute("ALTER TABLE tina4_migration ADD migration_id TEXT")
64
+ col_type = "VARCHAR(500)" if _is_firebird(db) else "TEXT"
65
+ db.execute(f"ALTER TABLE tina4_migration ADD migration_id {col_type}")
47
66
  db.commit()
48
67
  except Exception:
49
68
  pass # Column may already exist on some engines
@@ -70,7 +89,8 @@ def _ensure_tracking_table(db):
70
89
  db.fetch_one("SELECT executed_at FROM tina4_migration WHERE 1=0")
71
90
  except Exception:
72
91
  try:
73
- db.execute("ALTER TABLE tina4_migration ADD executed_at TEXT DEFAULT ''")
92
+ col_type = "VARCHAR(50)" if _is_firebird(db) else "TEXT"
93
+ db.execute(f"ALTER TABLE tina4_migration ADD executed_at {col_type} DEFAULT ''")
74
94
  db.commit()
75
95
  except Exception:
76
96
  pass
@@ -252,10 +272,19 @@ def migrate(db, migration_folder: str = "migrations", delimiter: str = ";") -> l
252
272
  now = datetime.now(timezone.utc).isoformat()
253
273
  # Extract description from filename (supports both 000001_ and YYYYMMDDHHMMSS_ prefixes)
254
274
  desc = re.sub(r"^\d+_", "", migration_id, count=1).replace("_", " ")
255
- db.execute(
256
- "INSERT INTO tina4_migration (migration_id, description, batch, executed_at, passed) VALUES (?, ?, ?, ?, 1)",
257
- [migration_id, desc, batch, now],
258
- )
275
+ if _is_firebird(db):
276
+ # Firebird: generate ID from sequence
277
+ row = db.fetch_one("SELECT GEN_ID(GEN_TINA4_MIGRATION_ID, 1) AS next_id FROM RDB$DATABASE")
278
+ next_id = row["next_id"] if row else 1
279
+ db.execute(
280
+ "INSERT INTO tina4_migration (id, migration_id, description, batch, executed_at, passed) VALUES (?, ?, ?, ?, ?, 1)",
281
+ [next_id, migration_id, desc, batch, now],
282
+ )
283
+ else:
284
+ db.execute(
285
+ "INSERT INTO tina4_migration (migration_id, description, batch, executed_at, passed) VALUES (?, ?, ?, ?, 1)",
286
+ [migration_id, desc, batch, now],
287
+ )
259
288
  db.commit()
260
289
  ran.append(sql_file.name)
261
290
 
File without changes
File without changes