tai-sql 0.7.12__tar.gz → 0.7.14__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 (227) hide show
  1. {tai_sql-0.7.12 → tai_sql-0.7.14}/PKG-INFO +1 -1
  2. {tai_sql-0.7.12 → tai_sql-0.7.14}/pyproject.toml +1 -1
  3. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_schema/schemas/chatbot.py +13 -8
  4. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/context.py +6 -0
  5. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/domain/dtos.py.jinja2 +12 -2
  6. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/domain/model.py.jinja2 +8 -1
  7. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/rules/static/modelo.md +3 -0
  8. {tai_sql-0.7.12 → tai_sql-0.7.14}/LICENSE +0 -0
  9. {tai_sql-0.7.12 → tai_sql-0.7.14}/README.md +0 -0
  10. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/__init__.py +0 -0
  11. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/__init__.py +0 -0
  12. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_backup/__init__.py +0 -0
  13. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_backup/main.py +0 -0
  14. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_deploy/__init__.py +0 -0
  15. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_deploy/config.py +0 -0
  16. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_deploy/local.py +0 -0
  17. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_deploy/main.py +0 -0
  18. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_deploy/workflow.py +0 -0
  19. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_feed/__init__.py +0 -0
  20. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_feed/main.py +0 -0
  21. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_generate/__init__.py +0 -0
  22. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_generate/funcs.py +0 -0
  23. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_generate/main.py +0 -0
  24. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_hash_migrate/__init__.py +0 -0
  25. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_hash_migrate/main.py +0 -0
  26. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_info/__init__.py +0 -0
  27. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_info/main.py +0 -0
  28. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_info/status.py +0 -0
  29. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_init/__init__.py +0 -0
  30. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_init/main.py +0 -0
  31. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_init/model.py +0 -0
  32. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_install/__init__.py +0 -0
  33. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_install/main.py +0 -0
  34. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_ping/__init__.py +0 -0
  35. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_ping/main.py +0 -0
  36. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_pull/__init__.py +0 -0
  37. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_pull/funcs.py +0 -0
  38. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_pull/main.py +0 -0
  39. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_restore/__init__.py +0 -0
  40. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_restore/main.py +0 -0
  41. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_rules/__init__.py +0 -0
  42. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_rules/main.py +0 -0
  43. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_schema/__init__.py +0 -0
  44. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_schema/model.py +0 -0
  45. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_schema/new.py +0 -0
  46. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_schema/schemas/__init__.py +0 -0
  47. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_schema/schemas/auth.py +0 -0
  48. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_schema/schemas/base.py +0 -0
  49. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_schema/schemas/default.py +0 -0
  50. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/cmd_schema/set_default.py +0 -0
  51. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/prompts.py +0 -0
  52. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/utils/__init__.py +0 -0
  53. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/utils/connectivity.py +0 -0
  54. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/utils/create.py +0 -0
  55. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/utils/github/__init__.py +0 -0
  56. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/utils/github/auth.py +0 -0
  57. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/utils/github/client.py +0 -0
  58. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/commands/utils/github/models.py +0 -0
  59. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/errors.py +0 -0
  60. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/main.py +0 -0
  61. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/preamble.py +0 -0
  62. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/services/__init__.py +0 -0
  63. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/cli/services/backup.py +0 -0
  64. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/connection/README.md +0 -0
  65. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/connection/__init__.py +0 -0
  66. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/connection/provider.py +0 -0
  67. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/connection/recipe.py +0 -0
  68. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/connection/session.py +0 -0
  69. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/connection/sources.py +0 -0
  70. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/crypto.py +0 -0
  71. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/drivers/__init__.py +0 -0
  72. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/drivers/base.py +0 -0
  73. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/drivers/bigquery.py +0 -0
  74. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/drivers/capabilities.py +0 -0
  75. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/drivers/mysql.py +0 -0
  76. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/drivers/postgresql.py +0 -0
  77. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/drivers/sqlserver.py +0 -0
  78. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/errors/README.md +0 -0
  79. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/errors/__init__.py +0 -0
  80. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/errors/collector.py +0 -0
  81. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/errors/render.py +0 -0
  82. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/errors/types.py +0 -0
  83. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/feed/README.md +0 -0
  84. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/feed/__init__.py +0 -0
  85. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/feed/collect.py +0 -0
  86. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/feed/executor.py +0 -0
  87. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/feed/feeder.py +0 -0
  88. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/feed/plan.py +0 -0
  89. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/feed/presenter.py +0 -0
  90. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/feed/records.py +0 -0
  91. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/feed/transform.py +0 -0
  92. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/__init__.py +0 -0
  93. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/base.py +0 -0
  94. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/diagram/README.md +0 -0
  95. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/diagram/__init__.py +0 -0
  96. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/diagram/assets/README.md +0 -0
  97. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/diagram/assets/cytoscape.min.js +0 -0
  98. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/diagram/builder.py +0 -0
  99. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/diagram/generator.py +0 -0
  100. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/diagram/graphviz_render.py +0 -0
  101. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/diagram/html_render.py +0 -0
  102. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/diagram/layout.py +0 -0
  103. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/diagram/model.py +0 -0
  104. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/diagram/templates/er.html.jinja2 +0 -0
  105. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/diagram/themes.py +0 -0
  106. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/__init__.py +0 -0
  107. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/calculated.py +0 -0
  108. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/base.py.jinja2 +0 -0
  109. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/domain/__init__.py.jinja2 +0 -0
  110. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/domain/dao.py.jinja2 +0 -0
  111. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/facade.py.jinja2 +0 -0
  112. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/macros/aggregation.jinja2 +0 -0
  113. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/macros/dataframe.jinja2 +0 -0
  114. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/macros/filters.jinja2 +0 -0
  115. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/macros/hierarchy.jinja2 +0 -0
  116. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/macros/read.jinja2 +0 -0
  117. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/macros/triggers.jinja2 +0 -0
  118. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/macros/upsert.jinja2 +0 -0
  119. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/macros/vector.jinja2 +0 -0
  120. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/macros/write.jinja2 +0 -0
  121. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/session.py.jinja2 +0 -0
  122. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/shared/__init__.py.jinja2 +0 -0
  123. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/shared/aggregation.py.jinja2 +0 -0
  124. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/shared/context.py.jinja2 +0 -0
  125. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/shared/utils/__init__.py.jinja2 +0 -0
  126. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/shared/utils/encoders.py.jinja2 +0 -0
  127. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/shared/utils/funcs.py.jinja2 +0 -0
  128. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/shared/utils/hierarchy.py.jinja2 +0 -0
  129. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/shared/utils/rls.py.jinja2 +0 -0
  130. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/templates/shared/vector.py.jinja2 +0 -0
  131. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/triggers/__init__.py +0 -0
  132. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/triggers/analyzer.py +0 -0
  133. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/triggers/renderer.py +0 -0
  134. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/triggers/steps.py +0 -0
  135. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/python_client/triggers/transformer.py +0 -0
  136. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/rules/__init__.py +0 -0
  137. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/generators/rules/templates/schema.md.jinja2 +0 -0
  138. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/introspect/README.md +0 -0
  139. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/introspect/__init__.py +0 -0
  140. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/introspect/blueprint.py +0 -0
  141. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/introspect/build.py +0 -0
  142. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/introspect/defaults.py +0 -0
  143. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/introspect/naming.py +0 -0
  144. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/introspect/reader.py +0 -0
  145. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/introspect/templates/schema.py.jinja2 +0 -0
  146. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/introspect/types.py +0 -0
  147. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/introspect/writer.py +0 -0
  148. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/README.md +0 -0
  149. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/__init__.py +0 -0
  150. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/analysis/README.md +0 -0
  151. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/analysis/__init__.py +0 -0
  152. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/analysis/calculated.py +0 -0
  153. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/analysis/collector.py +0 -0
  154. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/analysis/column_analyzer.py +0 -0
  155. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/analysis/constraints.py +0 -0
  156. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/analysis/hints.py +0 -0
  157. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/analysis/relation_analyzer.py +0 -0
  158. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/analysis/schema_analyzer.py +0 -0
  159. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/README.md +0 -0
  160. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/__init__.py +0 -0
  161. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/annotations.py +0 -0
  162. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/base.py +0 -0
  163. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/calculated.py +0 -0
  164. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/columns.py +0 -0
  165. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/constraints.py +0 -0
  166. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/datasource.py +0 -0
  167. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/descriptors.py +0 -0
  168. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/encoders.py +0 -0
  169. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/enumerations.py +0 -0
  170. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/relations.py +0 -0
  171. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/table.py +0 -0
  172. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/trigger_api.py +0 -0
  173. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/triggers.py +0 -0
  174. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/declarative/view.py +0 -0
  175. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/mapping/README.md +0 -0
  176. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/mapping/__init__.py +0 -0
  177. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/mapping/sqlalchemy_mapper.py +0 -0
  178. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/model/README.md +0 -0
  179. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/model/__init__.py +0 -0
  180. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/model/column.py +0 -0
  181. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/model/constraints.py +0 -0
  182. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/model/entity.py +0 -0
  183. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/model/enumeration.py +0 -0
  184. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/model/relation.py +0 -0
  185. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/model/schema.py +0 -0
  186. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/model/trigger.py +0 -0
  187. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/naming.py +0 -0
  188. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/ordering.py +0 -0
  189. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/registry.py +0 -0
  190. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/orm/types.py +0 -0
  191. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/project/README.md +0 -0
  192. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/project/__init__.py +0 -0
  193. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/project/config.py +0 -0
  194. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/project/context.py +0 -0
  195. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/project/manager.py +0 -0
  196. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/project/paths.py +0 -0
  197. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/rules/README.md +0 -0
  198. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/rules/__init__.py +0 -0
  199. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/rules/catalog.py +0 -0
  200. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/rules/installer.py +0 -0
  201. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/rules/meta.py +0 -0
  202. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/rules/service.py +0 -0
  203. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/rules/staleness.py +0 -0
  204. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/rules/static/comandos.md +0 -0
  205. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/rules/static/errores.md +0 -0
  206. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/schema.py +0 -0
  207. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/README.md +0 -0
  208. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/__init__.py +0 -0
  209. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/diff/__init__.py +0 -0
  210. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/diff/constraints.py +0 -0
  211. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/diff/indexes.py +0 -0
  212. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/diff/tables.py +0 -0
  213. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/diff/views.py +0 -0
  214. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/executor.py +0 -0
  215. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/ownership.py +0 -0
  216. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/plan/__init__.py +0 -0
  217. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/plan/planner.py +0 -0
  218. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/plan/statements.py +0 -0
  219. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/presenter.py +0 -0
  220. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/report.py +0 -0
  221. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/safety.py +0 -0
  222. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/state/__init__.py +0 -0
  223. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/state/local.py +0 -0
  224. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/state/model.py +0 -0
  225. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/state/normalize.py +0 -0
  226. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/state/remote.py +0 -0
  227. {tai_sql-0.7.12 → tai_sql-0.7.14}/tai_sql/sync/synchronizer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tai-sql
3
- Version: 0.7.12
3
+ Version: 0.7.14
4
4
  Summary: SQL database management and code generation tool
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tai-sql"
3
- version = "0.7.12"
3
+ version = "0.7.14"
4
4
  description = "SQL database management and code generation tool"
5
5
  license = "MIT"
6
6
  license-files = ["LICENSE"]
@@ -59,9 +59,12 @@ class ChatbotSchema(SchemaTemplate):
59
59
  title: col[str] = column(description='Título de la conversación')
60
60
  username: col[str] = column(description='ID del usuario propietario del chat')
61
61
  is_active: col[bool] = column(default=True, description='Estado activo del chat')
62
+
63
+ visible: col[bool] = column(default=True, index=True, description='Si no, la conversación no se lista')
62
64
  last_message_timestamp: col[datetime | None] = column(description='Timestamp del último mensaje del chat')
63
65
 
64
66
  messages: onetomany[Mensaje] # Relación one-to-many con la tabla Mensaje
67
+ token_usage: onetomany[TokenUsage] # El consumo de la conversación, tenga mensaje o no
65
68
 
66
69
 
67
70
  class Feedback(Enum):
@@ -118,11 +121,13 @@ class ChatbotSchema(SchemaTemplate):
118
121
 
119
122
  username: col[str] = column(index=True, description='Usuario que consumió')
120
123
  message_id: col[bigint | None] = column(description='Mensaje que lo generó; vacío si se borró la conversación')
124
+ chat_id: col[bigint | None] = column(index=True, description='Conversación en la que se consumió; vacío si no es de ninguna')
121
125
 
122
126
  tarifa_id: col[bigint | None] = column(index=True, description='Tarifa con la que se valora')
123
127
  bolsa_id: col[bigint | None] = column(index=True, description='Bolsa a la que se carga; vacío si no hay bolsas')
124
128
 
125
129
  message: manytoone[Mensaje] = relation(fields=['message_id'], references=['id'], backref='token_usage', onDelete='set null')
130
+ chat: manytoone[Chat] = relation(fields=['chat_id'], references=['id'], backref='token_usage', onDelete='set null')
126
131
 
127
132
 
128
133
  class ToolCall(Table):
@@ -351,10 +356,10 @@ class ChatbotSchema(SchemaTemplate):
351
356
  con_tarifa: col[bool]
352
357
 
353
358
 
354
- class UsuarioFacturacion(View):
355
- """Vista que muestra los usuarios a los que se factura"""
356
- __tablename__ = "usuario_facturacion"
357
- __query__ = query('usuario_facturacion.sql')
359
+ class UsuarioConsumo(View):
360
+ """Vista que muestra los usuarios a los que se mide el consumo"""
361
+ __tablename__ = "usuario_consumo"
362
+ __query__ = query('usuario_consumo.sql')
358
363
 
359
364
  username: col[str]
360
365
  realm_name: col[str]
@@ -434,7 +439,7 @@ class ChatbotSchema(SchemaTemplate):
434
439
  SUM(ROUND(((tu.prompt_tokens * t.precio_input_eur_millon
435
440
  + tu.completion_tokens * t.precio_output_eur_millon)
436
441
  * t.margen / 1000000)::numeric, 8))::double precision as total_cost_eur,
437
- COUNT(DISTINCT me.chat_id) as chat_count,
442
+ COUNT(DISTINCT COALESCE(tu.chat_id, me.chat_id)) as chat_count,
438
443
  COUNT(*) as message_count
439
444
  FROM token_usage tu
440
445
  JOIN tarifa t ON t.id = tu.tarifa_id
@@ -609,8 +614,8 @@ class ChatbotSchema(SchemaTemplate):
609
614
  tm.active_days;
610
615
  ''').rstrip()
611
616
 
612
- usuario_facturacion_sql = dedent('''\
613
- -- Vista con los usuarios a los que se factura. Es la que leen las pantallas de facturación:
617
+ usuario_consumo_sql = dedent('''\
618
+ -- Vista con los usuarios a los que se mide el consumo. Es la que leen sus pantallas:
614
619
  -- /rbac/{realm}/user pide administración del realm y la contraseña no sale de aquí
615
620
  SELECT
616
621
  u.username,
@@ -634,4 +639,4 @@ class ChatbotSchema(SchemaTemplate):
634
639
  (views_dir / 'tarifa_vigente.sql').write_text(tarifa_vigente_sql, encoding='utf-8')
635
640
  (views_dir / 'tokens_mensaje.sql').write_text(tokens_mensaje_sql, encoding='utf-8')
636
641
  (views_dir / 'user_stats.sql').write_text(user_stats_sql, encoding='utf-8')
637
- (views_dir / 'usuario_facturacion.sql').write_text(usuario_facturacion_sql, encoding='utf-8')
642
+ (views_dir / 'usuario_consumo.sql').write_text(usuario_consumo_sql, encoding='utf-8')
@@ -225,6 +225,12 @@ class TemplateContextBuilder:
225
225
  'is_operative': column.is_operative,
226
226
  'is_calculated': column.is_calculated,
227
227
  'self_reference': column.self_reference,
228
+ # La rellena la base de datos (NOW()): no es obligatoria al crear. Faltaba, y las
229
+ # plantillas que la miraban la leían siempre como falsa.
230
+ 'server_now': column.server_now,
231
+ # El tamaño máximo de un texto (`column(length=n)`), para quien valide antes de
232
+ # escribir —los esquemas de formulario de tai-api—. `None` si no se declaró.
233
+ 'max_length': column.length if column.type == 'str' else None,
228
234
  }
229
235
 
230
236
  if column.is_vector:
@@ -247,7 +247,7 @@ class {{ model.name }}Read(PrettyModel):
247
247
  class {{ model.name }}Create(PrettyModel):
248
248
  """DTO de escritura para {{ model.name }}."""
249
249
  {% for column in model.columns -%}
250
- {% if not column.constraints.get('autoincrement', False) and column.default is none and not column.nullable and not column.is_foreign_key and not column.is_operative and not column.has_encoder|default(false) and not column.is_calculated %}
250
+ {% if not column.constraints.get('autoincrement', False) and column.default is none and not column.nullable and not column.is_foreign_key and not column.is_operative and not column.has_encoder|default(false) and not column.is_calculated and not column.server_now %}
251
251
  {{ column.name }}: {{ column.pydantic_type }}
252
252
  {% endif %}
253
253
  {% endfor %}
@@ -257,6 +257,9 @@ class {{ model.name }}Create(PrettyModel):
257
257
  {{ column.name }}: Optional[{{ column.pydantic_type }}] = None
258
258
  {% elif column.is_foreign_key %}
259
259
  {{ column.name }}: Optional[{{ column.pydantic_type }}] = None
260
+ {% elif column.server_now %}
261
+ {# La rellena la base de datos con NOW() si no llega: no es obligatoria. #}
262
+ {{ column.name }}: Optional[{{ column.pydantic_type }}] = None
260
263
  {% elif column.default is none and column.nullable %}
261
264
  {{ column.name }}: Optional[{{ column.pydantic_type }}] = None
262
265
  {% elif column.default is not none %}
@@ -295,11 +298,18 @@ class {{ model.name }}Create(PrettyModel):
295
298
  def to_instance(self) -> {{ model.name }}:
296
299
  model = {{ model.name }}(
297
300
  {% for column in model.columns %}
298
- {% if not column.constraints.get('autoincrement', False) and not column.is_operative and not column.is_calculated %}
301
+ {% if not column.constraints.get('autoincrement', False) and not column.is_operative and not column.is_calculated and not column.server_now %}
299
302
  {{ column.name }}=self.{{ column.name }},
300
303
  {% endif %}
301
304
  {% endfor %}
302
305
  )
306
+ {% for column in model.columns %}
307
+ {% if column.server_now and not column.is_operative and not column.is_calculated %}
308
+ # Solo si llega: asignarle None mandaría un NULL, y no dejaría a la base de datos poner NOW().
309
+ if self.{{ column.name }} is not None:
310
+ model.{{ column.name }} = self.{{ column.name }}
311
+ {% endif %}
312
+ {% endfor %}
303
313
  {% for col in operative_str_cols %}
304
314
  model.{{ col.name }} = get_username()
305
315
  {% endfor %}
@@ -83,6 +83,9 @@ from pgvector.sqlalchemy import Vector
83
83
  {% if column.sa_type and column.sa_type not in sa_imports %}
84
84
  {% set _ = sa_imports.append(column.sa_type) %}
85
85
  {% endif %}
86
+ {% if column.server_now and 'func' not in sa_imports %}
87
+ {% set _ = sa_imports.append('func') %}
88
+ {% endif %}
86
89
  {% endfor %}
87
90
  {% if sa_imports %}
88
91
  from sqlalchemy import {{ sa_imports | sort | join(', ') }}
@@ -165,7 +168,7 @@ class {{ model.name }}(Base):
165
168
  {% set mapped_type = 'Optional[' + py_type + ']' if column.nullable else py_type %}
166
169
  {# Determine if mapped_column() call is needed #}
167
170
  {% set has_constraints = column.constraints.values() | select | list | length > 0 %}
168
- {% set needs_mapped_column = has_constraints or column.encrypt or column.hash or column.is_calculated or column.sa_type is not none or column.type == 'vector' %}
171
+ {% set needs_mapped_column = has_constraints or column.encrypt or column.hash or column.is_calculated or column.sa_type is not none or column.type == 'vector' or column.server_now %}
169
172
  {% if needs_mapped_column %}
170
173
  {% set mc_args = [] %}
171
174
  {% if column.type == 'vector' %}{% set _ = mc_args.append('Vector(' + column.dimensions|string + ')') %}
@@ -185,6 +188,10 @@ class {{ model.name }}(Base):
185
188
  {% endfor %}
186
189
  {% endif %}
187
190
  {% if column.encrypt or column.hash %}{% set _ = mc_args.append('name="' + column.name + '"') %}{% endif %}
191
+ {# La pone la base de datos. Sin declararlo aquí, SQLAlchemy la enviaba como NULL —rellena
192
+ con None lo que no tiene valor para poder agrupar el INSERT— y la base de datos no llegaba
193
+ a poner NOW(). #}
194
+ {% if column.server_now %}{% set _ = mc_args.append('server_default=func.now()') %}{% endif %}
188
195
  {% if column.is_calculated %}{% set _ = mc_args.append('name="' + column.name + '"') %}{% endif %}
189
196
  {{ col_attr }}: Mapped[{{ mapped_type }}] = mapped_column({{ mc_args | join(', ') }})
190
197
  {% else %}
@@ -138,6 +138,9 @@ column(
138
138
 
139
139
  Una columna sin `column()` es una columna normal: `nombre: col[str]` basta.
140
140
 
141
+ `server_now=True` la rellena la base de datos con `NOW()`: en el `Create` es opcional, y si no se
142
+ envía, el cliente no la manda y el motor pone la fecha.
143
+
141
144
  ### Tipos disponibles
142
145
 
143
146
  `int`, `bigint`, `smallint`, `float`, `numeric`, `str`, `text`, `bool`, `datetime`,
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