tina4-python 3.10.9__tar.gz → 3.10.11__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.11}/PKG-INFO +1 -1
  2. {tina4_python-3.10.9 → tina4_python-3.10.11}/pyproject.toml +1 -1
  3. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/frond/engine.py +18 -7
  4. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/migration/runner.py +45 -16
  5. {tina4_python-3.10.9 → tina4_python-3.10.11}/.gitignore +0 -0
  6. {tina4_python-3.10.9 → tina4_python-3.10.11}/README.md +0 -0
  7. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/CLAUDE.md +0 -0
  8. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/HtmlElement.py +0 -0
  9. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/Testing.py +0 -0
  10. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/__init__.py +0 -0
  11. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/ai/__init__.py +0 -0
  12. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/api/__init__.py +0 -0
  13. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/auth/__init__.py +0 -0
  14. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/cache/__init__.py +0 -0
  15. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/cli/__init__.py +0 -0
  16. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/container/__init__.py +0 -0
  17. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/core/__init__.py +0 -0
  18. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/core/cache.py +0 -0
  19. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/core/constants.py +0 -0
  20. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/core/events.py +0 -0
  21. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/core/middleware.py +0 -0
  22. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/core/request.py +0 -0
  23. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/core/response.py +0 -0
  24. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/core/router.py +0 -0
  25. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/core/server.py +0 -0
  26. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/crud/__init__.py +0 -0
  27. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/database/__init__.py +0 -0
  28. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/database/adapter.py +0 -0
  29. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/database/connection.py +0 -0
  30. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/database/firebird.py +0 -0
  31. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/database/mssql.py +0 -0
  32. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/database/mysql.py +0 -0
  33. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/database/odbc.py +0 -0
  34. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/database/postgres.py +0 -0
  35. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/database/sqlite.py +0 -0
  36. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/debug/__init__.py +0 -0
  37. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/debug/error_overlay.py +0 -0
  38. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/dev_admin/__init__.py +0 -0
  39. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/dev_reload.py +0 -0
  40. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/dotenv/__init__.py +0 -0
  41. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/frond/FROND.md +0 -0
  42. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/frond/__init__.py +0 -0
  43. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/auth/meta.json +0 -0
  44. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/auth/src/routes/api/gallery_auth.py +0 -0
  45. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/database/meta.json +0 -0
  46. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/database/src/routes/api/gallery_db.py +0 -0
  47. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/error-overlay/meta.json +0 -0
  48. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/error-overlay/src/routes/api/gallery_crash.py +0 -0
  49. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/orm/meta.json +0 -0
  50. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/orm/src/orm/Product.py +0 -0
  51. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/orm/src/routes/api/gallery_products.py +0 -0
  52. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/queue/meta.json +0 -0
  53. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/queue/src/routes/api/gallery_queue.py +0 -0
  54. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/rest-api/meta.json +0 -0
  55. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/rest-api/src/routes/api/gallery_hello.py +0 -0
  56. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/templates/meta.json +0 -0
  57. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/templates/src/routes/gallery_page.py +0 -0
  58. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/gallery/templates/src/templates/gallery_page.twig +0 -0
  59. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/graphql/__init__.py +0 -0
  60. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/i18n/__init__.py +0 -0
  61. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/messenger/__init__.py +0 -0
  62. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/migration/__init__.py +0 -0
  63. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/orm/__init__.py +0 -0
  64. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/orm/fields.py +0 -0
  65. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/orm/model.py +0 -0
  66. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/public/css/tina4.css +0 -0
  67. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/public/css/tina4.min.css +0 -0
  68. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/public/favicon.ico +0 -0
  69. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/public/images/logo.svg +0 -0
  70. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/public/images/tina4-logo-icon.webp +0 -0
  71. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/public/js/frond.min.js +0 -0
  72. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/public/js/tina4-dev-admin.min.js +0 -0
  73. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/public/js/tina4.min.js +0 -0
  74. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/public/js/tina4js.min.js +0 -0
  75. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/public/swagger/index.html +0 -0
  76. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/public/swagger/oauth2-redirect.html +0 -0
  77. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/query_builder/__init__.py +0 -0
  78. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/queue/__init__.py +0 -0
  79. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/queue_backends/__init__.py +0 -0
  80. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/queue_backends/kafka_backend.py +0 -0
  81. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/queue_backends/mongo_backend.py +0 -0
  82. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/queue_backends/rabbitmq_backend.py +0 -0
  83. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/__init__.py +0 -0
  84. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/_alerts.scss +0 -0
  85. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/_badges.scss +0 -0
  86. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/_buttons.scss +0 -0
  87. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/_cards.scss +0 -0
  88. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/_forms.scss +0 -0
  89. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/_grid.scss +0 -0
  90. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/_modals.scss +0 -0
  91. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/_nav.scss +0 -0
  92. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/_reset.scss +0 -0
  93. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/_tables.scss +0 -0
  94. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/_typography.scss +0 -0
  95. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/_utilities.scss +0 -0
  96. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/_variables.scss +0 -0
  97. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/base.scss +0 -0
  98. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/colors.scss +0 -0
  99. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/scss/tina4css/tina4.scss +0 -0
  100. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/seeder/__init__.py +0 -0
  101. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/service/__init__.py +0 -0
  102. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/session/__init__.py +0 -0
  103. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/session_handlers/__init__.py +0 -0
  104. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/session_handlers/mongodb_handler.py +0 -0
  105. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/session_handlers/redis_handler.py +0 -0
  106. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/session_handlers/valkey_handler.py +0 -0
  107. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/swagger/__init__.py +0 -0
  108. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/components/crud.twig +0 -0
  109. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/docker/distroless/Dockerfile +0 -0
  110. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/docker/poetry/Dockerfile +0 -0
  111. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/docker/python/Dockerfile +0 -0
  112. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/docker/uv/Dockerfile +0 -0
  113. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/errors/302.twig +0 -0
  114. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/errors/401.twig +0 -0
  115. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/errors/403.twig +0 -0
  116. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/errors/404.twig +0 -0
  117. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/errors/500.twig +0 -0
  118. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/errors/502.twig +0 -0
  119. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/errors/503.twig +0 -0
  120. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/errors/base.twig +0 -0
  121. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/frontend/README.md +0 -0
  122. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/templates/readme.md +0 -0
  123. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/test_client/__init__.py +0 -0
  124. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/translations/af/LC_MESSAGES/messages.mo +0 -0
  125. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/translations/af/LC_MESSAGES/messages.po +0 -0
  126. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/translations/en/LC_MESSAGES/messages.mo +0 -0
  127. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/translations/en/LC_MESSAGES/messages.po +0 -0
  128. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/translations/es/LC_MESSAGES/messages.mo +0 -0
  129. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/translations/es/LC_MESSAGES/messages.po +0 -0
  130. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/translations/fr/LC_MESSAGES/messages.mo +0 -0
  131. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/translations/fr/LC_MESSAGES/messages.po +0 -0
  132. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/translations/ja/LC_MESSAGES/messages.mo +0 -0
  133. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/translations/ja/LC_MESSAGES/messages.po +0 -0
  134. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/translations/zh/LC_MESSAGES/messages.mo +0 -0
  135. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/translations/zh/LC_MESSAGES/messages.po +0 -0
  136. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/validator/__init__.py +0 -0
  137. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/websocket/__init__.py +0 -0
  138. {tina4_python-3.10.9 → tina4_python-3.10.11}/tina4_python/websocket/backplane.py +0 -0
  139. {tina4_python-3.10.9 → tina4_python-3.10.11}/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.11
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.11"
4
4
  description = "Tina4 Python v3 — Zero-dependency, lightweight web framework"
5
5
  authors = [
6
6
  {name = "Andre van Zuydam", email = "andrevanzuydam@gmail.com"}
@@ -269,10 +269,11 @@ def _resolve(expr: str, context: dict):
269
269
  value = context
270
270
  for part in parts:
271
271
  if part.startswith("[") and part.endswith("]"):
272
- idx = part[1:-1].strip("'\"")
272
+ raw_idx = part[1:-1].strip()
273
273
  # Slice syntax: value[1:5], value[:10], value[3:]
274
- if ":" in idx:
275
- slice_parts = idx.split(":", 1)
274
+ if ":" in raw_idx and not ((raw_idx.startswith('"') and raw_idx.endswith('"')) or (raw_idx.startswith("'") and raw_idx.endswith("'"))):
275
+ idx_clean = raw_idx.strip("'\"")
276
+ slice_parts = idx_clean.split(":", 1)
276
277
  s_start = int(slice_parts[0]) if slice_parts[0].strip() else None
277
278
  s_end = int(slice_parts[1]) if slice_parts[1].strip() else None
278
279
  try:
@@ -280,10 +281,20 @@ def _resolve(expr: str, context: dict):
280
281
  except (TypeError, IndexError):
281
282
  return None
282
283
  else:
283
- try:
284
- idx = int(idx)
285
- except ValueError:
286
- pass
284
+ # Resolve the key: string literal, int literal, or variable
285
+ if (raw_idx.startswith('"') and raw_idx.endswith('"')) or \
286
+ (raw_idx.startswith("'") and raw_idx.endswith("'")):
287
+ # String literal: balances["9600.000"]
288
+ idx = raw_idx[1:-1]
289
+ else:
290
+ try:
291
+ # Integer literal: items[0]
292
+ idx = int(raw_idx)
293
+ except ValueError:
294
+ # Variable key: balances[k] or balances[cb.glcode]
295
+ idx = _resolve(raw_idx, context)
296
+ if idx is None:
297
+ return None
287
298
  try:
288
299
  value = value[idx]
289
300
  except (KeyError, IndexError, TypeError):
@@ -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