fabricks 3.0.11__tar.gz → 3.0.13__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 (460) hide show
  1. {fabricks-3.0.11 → fabricks-3.0.13}/PKG-INFO +1 -1
  2. {fabricks-3.0.11 → fabricks-3.0.13}/README.md +0 -4
  3. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/base/merger.py +1 -0
  4. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/base/processor.py +4 -3
  5. fabricks-3.0.13/fabricks/context/config.py +127 -0
  6. fabricks-3.0.13/fabricks/context/helpers.py +58 -0
  7. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/context/runtime.py +18 -42
  8. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/processor.py +3 -1
  9. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/extenders.py +2 -7
  10. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/generator.py +20 -2
  11. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/parsers/get_parser.py +2 -7
  12. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/steps/base.py +16 -8
  13. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/views.py +8 -3
  14. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/table.py +39 -1
  15. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/azure_table.py +23 -22
  16. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/helpers.py +18 -2
  17. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/path.py +8 -2
  18. {fabricks-3.0.11 → fabricks-3.0.13}/format.sh +23 -17
  19. {fabricks-3.0.11 → fabricks-3.0.13}/pyproject.toml +1 -1
  20. fabricks-3.0.13/tests/integration/README.md +16 -0
  21. {fabricks-3.0.11 → fabricks-3.0.13}/uv.lock +1 -1
  22. fabricks-3.0.11/fabricks/context/config/__init__.py +0 -92
  23. fabricks-3.0.11/fabricks/context/config/utils.py +0 -53
  24. {fabricks-3.0.11 → fabricks-3.0.13}/.gitignore +0 -0
  25. {fabricks-3.0.11 → fabricks-3.0.13}/.gitkeep +0 -0
  26. {fabricks-3.0.11 → fabricks-3.0.13}/.python-version +0 -0
  27. {fabricks-3.0.11 → fabricks-3.0.13}/databricks.yml +0 -0
  28. {fabricks-3.0.11 → fabricks-3.0.13}/docs/helpers/init.md +0 -0
  29. {fabricks-3.0.11 → fabricks-3.0.13}/docs/helpers/job.md +0 -0
  30. {fabricks-3.0.11 → fabricks-3.0.13}/docs/helpers/runtime.md +0 -0
  31. {fabricks-3.0.11 → fabricks-3.0.13}/docs/helpers/schedule.md +0 -0
  32. {fabricks-3.0.11 → fabricks-3.0.13}/docs/helpers/step.md +0 -0
  33. {fabricks-3.0.11 → fabricks-3.0.13}/docs/index.md +0 -0
  34. {fabricks-3.0.11 → fabricks-3.0.13}/docs/introduction/layers.md +0 -0
  35. {fabricks-3.0.11 → fabricks-3.0.13}/docs/introduction/overview.md +0 -0
  36. {fabricks-3.0.11 → fabricks-3.0.13}/docs/reference/cdc.md +0 -0
  37. {fabricks-3.0.11 → fabricks-3.0.13}/docs/reference/checks-data-quality.md +0 -0
  38. {fabricks-3.0.11 → fabricks-3.0.13}/docs/reference/extenders-udfs-parsers.md +0 -0
  39. {fabricks-3.0.11 → fabricks-3.0.13}/docs/reference/table-options.md +0 -0
  40. {fabricks-3.0.11 → fabricks-3.0.13}/docs/steps/BRONZE.md +0 -0
  41. {fabricks-3.0.11 → fabricks-3.0.13}/docs/steps/GOLD.md +0 -0
  42. {fabricks-3.0.11 → fabricks-3.0.13}/docs/steps/SILVER.md +0 -0
  43. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/__init__.py +0 -0
  44. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/__init__.py +0 -0
  45. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/cdc/__init__.py +0 -0
  46. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/cdc/nocdc.py +0 -0
  47. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/cdc/scd1.py +0 -0
  48. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/cdc/scd2.py +0 -0
  49. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/context.py +0 -0
  50. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/core.py +0 -0
  51. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/deploy.py +0 -0
  52. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/exceptions.py +0 -0
  53. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/extenders.py +0 -0
  54. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/job_schema.py +0 -0
  55. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/log.py +0 -0
  56. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/masks.py +0 -0
  57. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/metastore/__init__.py +0 -0
  58. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/metastore/database.py +0 -0
  59. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/metastore/table.py +0 -0
  60. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/metastore/view.py +0 -0
  61. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/notebooks/__init__.py +0 -0
  62. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/notebooks/cluster.py +0 -0
  63. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/notebooks/initialize.py +0 -0
  64. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/notebooks/process.py +0 -0
  65. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/notebooks/run.py +0 -0
  66. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/notebooks/schedule.py +0 -0
  67. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/notebooks/terminate.py +0 -0
  68. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/parsers.py +0 -0
  69. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/schedules.py +0 -0
  70. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/udfs.py +0 -0
  71. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/utils.py +0 -0
  72. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/version.py +0 -0
  73. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/views.py +0 -0
  74. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/__init__.py +0 -0
  75. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/base/__init__.py +0 -0
  76. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/base/_types.py +0 -0
  77. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/base/cdc.py +0 -0
  78. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/base/configurator.py +0 -0
  79. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/base/generator.py +0 -0
  80. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/cdc.py +0 -0
  81. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/nocdc.py +0 -0
  82. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/scd.py +0 -0
  83. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/scd1.py +0 -0
  84. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/scd2.py +0 -0
  85. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/__init__.py +0 -0
  86. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/ctes/base.sql.jinja +0 -0
  87. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/ctes/current.sql.jinja +0 -0
  88. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/ctes/deduplicate_hash.sql.jinja +0 -0
  89. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/ctes/deduplicate_key.sql.jinja +0 -0
  90. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/ctes/rectify.sql.jinja +0 -0
  91. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/ctes/slice.sql.jinja +0 -0
  92. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/filter.sql.jinja +0 -0
  93. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/filters/final.sql.jinja +0 -0
  94. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/filters/latest.sql.jinja +0 -0
  95. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/filters/update.sql.jinja +0 -0
  96. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/macros/bactick.sql.jinja +0 -0
  97. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/macros/hash.sql.jinja +0 -0
  98. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/merge.sql.jinja +0 -0
  99. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/merges/nocdc.sql.jinja +0 -0
  100. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/merges/scd1.sql.jinja +0 -0
  101. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/merges/scd2.sql.jinja +0 -0
  102. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/queries/__init__.py +0 -0
  103. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/queries/context.sql.jinja +0 -0
  104. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/queries/final.sql.jinja +0 -0
  105. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/queries/nocdc/complete.sql.jinja +0 -0
  106. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/queries/nocdc/update.sql.jinja +0 -0
  107. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/queries/scd1.sql.jinja +0 -0
  108. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/queries/scd2.sql.jinja +0 -0
  109. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/query.sql.jinja +0 -0
  110. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/context/__init__.py +0 -0
  111. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/context/_types.py +0 -0
  112. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/context/log.py +0 -0
  113. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/context/secret.py +0 -0
  114. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/context/spark_session.py +0 -0
  115. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/context/utils.py +0 -0
  116. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/__init__.py +0 -0
  117. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/__init__.py +0 -0
  118. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/base.py +0 -0
  119. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/generator.py +0 -0
  120. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/log.py +0 -0
  121. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/run.py +0 -0
  122. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/terminator.py +0 -0
  123. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/utils.py +0 -0
  124. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/job_schema.py +0 -0
  125. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/__init__.py +0 -0
  126. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/__init__.py +0 -0
  127. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/_types.py +0 -0
  128. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/checker.py +0 -0
  129. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/configurator.py +0 -0
  130. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/exception.py +0 -0
  131. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/invoker.py +0 -0
  132. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/job.py +0 -0
  133. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/processor.py +0 -0
  134. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/bronze.py +0 -0
  135. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/get_job.py +0 -0
  136. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/get_job_conf.py +0 -0
  137. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/get_job_id.py +0 -0
  138. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/get_jobs.py +0 -0
  139. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/get_schedule.py +0 -0
  140. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/get_schedules.py +0 -0
  141. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/gold.py +0 -0
  142. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/silver.py +0 -0
  143. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/masks.py +0 -0
  144. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/parsers/__init__.py +0 -0
  145. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/parsers/_types.py +0 -0
  146. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/parsers/base.py +0 -0
  147. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/parsers/decorator.py +0 -0
  148. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/parsers/utils.py +0 -0
  149. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/__init__.py +0 -0
  150. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/diagrams.py +0 -0
  151. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/generate.py +0 -0
  152. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/get_schedule.py +0 -0
  153. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/get_schedules.py +0 -0
  154. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/process.py +0 -0
  155. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/run.py +0 -0
  156. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/terminate.py +0 -0
  157. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/views.py +0 -0
  158. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/steps/__init__.py +0 -0
  159. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/steps/_types.py +0 -0
  160. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/steps/get_step.py +0 -0
  161. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/steps/get_step_conf.py +0 -0
  162. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/udfs.py +0 -0
  163. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/views.py +0 -0
  164. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/__init__.py +0 -0
  165. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/masks.py +0 -0
  166. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/notebooks.py +0 -0
  167. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/schedules.py +0 -0
  168. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/tables.py +0 -0
  169. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/udfs.py +0 -0
  170. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/utils.py +0 -0
  171. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/README.md +0 -0
  172. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/__init__.py +0 -0
  173. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/_types.py +0 -0
  174. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/database.py +0 -0
  175. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/dbobject.py +0 -0
  176. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/pyproject.toml +0 -0
  177. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/utils.py +0 -0
  178. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/view.py +0 -0
  179. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/__init__.py +0 -0
  180. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/_types.py +0 -0
  181. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/azure_queue.py +0 -0
  182. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/console.py +0 -0
  183. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/fdict.py +0 -0
  184. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/log.py +0 -0
  185. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/mermaid.py +0 -0
  186. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/pip.py +0 -0
  187. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/pydantic.py +0 -0
  188. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/read/__init__.py +0 -0
  189. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/read/_types.py +0 -0
  190. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/read/read.py +0 -0
  191. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/read/read_excel.py +0 -0
  192. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/read/read_yaml.py +0 -0
  193. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/schema/__init__.py +0 -0
  194. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/schema/get_json_schema_for_type.py +0 -0
  195. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/schema/get_schema_for_type.py +0 -0
  196. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/spark.py +0 -0
  197. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/sqlglot.py +0 -0
  198. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/write/__init__.py +0 -0
  199. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/write/delta.py +0 -0
  200. {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/write/stream.py +0 -0
  201. {fabricks-3.0.11 → fabricks-3.0.13}/mkdocs.sh +0 -0
  202. {fabricks-3.0.11 → fabricks-3.0.13}/mkdocs.yml +0 -0
  203. {fabricks-3.0.11 → fabricks-3.0.13}/tests/__init__.py +0 -0
  204. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/__init__.py +0 -0
  205. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/_types.py +0 -0
  206. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/add_missing_modules.py +0 -0
  207. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/armageddon.py +0 -0
  208. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/compare.py +0 -0
  209. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/king/2022/01/01/0001/king_202201010001.json +0 -0
  210. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/king/2022/01/02/0001/king_202201020001.json +0 -0
  211. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/king__deletelog/2022/02/01/0001/king_202201010001.json +0 -0
  212. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/prince/2022/01/01/0001/prince_202201010001.json +0 -0
  213. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/princess/2022/01/01/0001/princess_202201010001.json +0 -0
  214. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/queen/2022/01/01/0001/queen_202201010001.json +0 -0
  215. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/queen/2022/01/02/0001/queen_202201020001.json +0 -0
  216. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/queen/2022/01/04/0001/queen_202201040001.json +0 -0
  217. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/queen__deletelog/2022/01/03/0001/queen_202201030001.json +0 -0
  218. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/queen__deletelog/2022/01/04/0001/queen_202201040001.json +0 -0
  219. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/too_many_columns/2022/01/01/0001/sample_202201010001.json +0 -0
  220. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job10/king/2022/10/01/0001/king_202210010001.json +0 -0
  221. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job10/king/2022/10/02/0001/king_202210020001.json +0 -0
  222. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job10/king/2022/10/02/0002/king_202210020002.json +0 -0
  223. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job10/king/2022/10/03/0001/king_202210030001.json +0 -0
  224. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job10/queen__deletelog/2022/10/01/0001/queen_202210010001.json +0 -0
  225. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job11/king/2022/11/01/0001/king_202210010001.json +0 -0
  226. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job11/king__deletelog/2022/11/01/0001/king_202211010001.json +0 -0
  227. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job2/king/2022/02/05/0001/king_202202050001.json +0 -0
  228. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job2/prince__deletelog/2022/02/01/0001/prince_202202010001.json +0 -0
  229. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job2/princess/2022/02/05/0001/princess_202202050001.json +0 -0
  230. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job2/queen/2022/02/05/0001/queen_202202050001.json +0 -0
  231. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job3/king/2022/03/01/001234/king_20220301001234.json +0 -0
  232. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job3/king__deletelog/2022/03/01/001234/king_20220301001234.json +0 -0
  233. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job3/queen/2022/03/05/001234/queen_20220305001234.json +0 -0
  234. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job3/queen/2022/03/06/0001/queen_202203060001.json +0 -0
  235. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job4/king/2022/04/01/0001/king_202204010001.json +0 -0
  236. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job4/monarch/2022/04/01/0001/monarch_202204010001.json +0 -0
  237. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job4/queen/2022/04/01/0001/queen_202204010001.json +0 -0
  238. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job4/regent/2022/04/01/0001/regent_202204010001.json +0 -0
  239. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job5/king/2022/05/01/0001/king_202205010001.json +0 -0
  240. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job5/queen/2022/05/01/0001/queen_202205010001.json +0 -0
  241. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job6/king/2022/06/01/0001/king_202206010001.json +0 -0
  242. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job6/queen/2022/06/01/0001/queen_202206010001.json +0 -0
  243. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job7/king/2022/07/01/0001/king_202207010001.json +0 -0
  244. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job7/queen/2022/07/01/0001/queen_202207010001.json +0 -0
  245. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job8/king/2022/08/01/0001/king_202208010001.json +0 -0
  246. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job8/queen/2022/08/01/0001/queen_202208010001.json +0 -0
  247. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king/2022/09/01/0001/king_202209010001.json +0 -0
  248. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king/2022/09/03/0001/king_202209030001.json +0 -0
  249. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king/2022/09/03/0002/king_202209030002.json +0 -0
  250. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king/2022/09/08/0001/king_202209080001.json +0 -0
  251. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king__deletelog/2022/09/02/0001/king_202209020001.json +0 -0
  252. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king__deletelog/2022/09/04/0001/king_202209040001.json +0 -0
  253. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king__deletelog/2022/09/04/0005/king_202209040005.json +0 -0
  254. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king__deletelog/2022/09/04/0009/king_202209040009.json +0 -0
  255. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/queen/2022/09/08/0001/queen_202209080001.json +0 -0
  256. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/queen__deletelog/2022/09/01/0001/queen_202209030001.json +0 -0
  257. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job01.sql +0 -0
  258. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job02.sql +0 -0
  259. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job03.sql +0 -0
  260. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job04.sql +0 -0
  261. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job05.sql +0 -0
  262. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job06.sql +0 -0
  263. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job07.sql +0 -0
  264. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job08.sql +0 -0
  265. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job09.sql +0 -0
  266. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job10.sql +0 -0
  267. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job11.sql +0 -0
  268. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job01.sql +0 -0
  269. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job02.sql +0 -0
  270. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job03.sql +0 -0
  271. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job04.sql +0 -0
  272. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job05.sql +0 -0
  273. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job06.sql +0 -0
  274. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job07.sql +0 -0
  275. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job08.sql +0 -0
  276. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job09.sql +0 -0
  277. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job10.sql +0 -0
  278. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job11.sql +0 -0
  279. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job01.sql +0 -0
  280. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job02.sql +0 -0
  281. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job03.sql +0 -0
  282. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job04.sql +0 -0
  283. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job05.sql +0 -0
  284. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job06.sql +0 -0
  285. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job07.sql +0 -0
  286. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job08.sql +0 -0
  287. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job09.sql +0 -0
  288. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job10.sql +0 -0
  289. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job11.sql +0 -0
  290. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job01.sql +0 -0
  291. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job02.sql +0 -0
  292. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job03.sql +0 -0
  293. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job04.sql +0 -0
  294. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job05.sql +0 -0
  295. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job06.sql +0 -0
  296. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job07.sql +0 -0
  297. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job08.sql +0 -0
  298. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job09.sql +0 -0
  299. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job10.sql +0 -0
  300. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job11.sql +0 -0
  301. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/fabricksconfig.json +0 -0
  302. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/init.sh +0 -0
  303. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/initialize.py +0 -0
  304. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/__init__.py +0 -0
  305. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/__init__.py +0 -0
  306. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_cdc.py +0 -0
  307. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_check.py +0 -0
  308. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_dependency.py +0 -0
  309. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_gold.py +0 -0
  310. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_invoke.py +0 -0
  311. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_overwrite.py +0 -0
  312. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_schedule.py +0 -0
  313. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_semantic.py +0 -0
  314. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_silver.py +0 -0
  315. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job2/__init__.py +0 -0
  316. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job2/test_gold.py +0 -0
  317. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job2/test_run.py +0 -0
  318. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job2/test_semantic.py +0 -0
  319. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job2/test_silver.py +0 -0
  320. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job3/__init__.py +0 -0
  321. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job3/test_gold.py +0 -0
  322. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job3/test_run.py +0 -0
  323. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job3/test_silver.py +0 -0
  324. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job4/__init__.py +0 -0
  325. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job4/test_gold.py +0 -0
  326. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job4/test_run.py +0 -0
  327. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job5/__init__.py +0 -0
  328. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job5/test_step.py +0 -0
  329. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/reset.py +0 -0
  330. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/run.py +0 -0
  331. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runjobs.py +0 -0
  332. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtests.py +0 -0
  333. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/.gitignore +0 -0
  334. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/__init__.py +0 -0
  335. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/bronze/_config.kings.yml +0 -0
  336. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/bronze/_config.memory.yml +0 -0
  337. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/bronze/_config.monarchs.yml +0 -0
  338. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/bronze/_config.princes.yml +0 -0
  339. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/bronze/_config.princesses.yml +0 -0
  340. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/bronze/_config.queens.yml +0 -0
  341. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/bronze/_config.regents.yml +0 -0
  342. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/conf.fabricks.yml +0 -0
  343. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/conf.uc.fabricks.yml +0 -0
  344. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/extenders/__init__.py +0 -0
  345. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/extenders/add_country.py +0 -0
  346. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/extenders/drop__cols.py +0 -0
  347. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/extenders/force_reload.py +0 -0
  348. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/extenders/monarch.py +0 -0
  349. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/masks/dummy.sql +0 -0
  350. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/notebooks/add_missing_modules.py +0 -0
  351. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/notebooks/cluster.py +0 -0
  352. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/notebooks/initialize.py +0 -0
  353. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/notebooks/process.py +0 -0
  354. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/notebooks/run.py +0 -0
  355. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/notebooks/schedule.py +0 -0
  356. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/notebooks/terminate.py +0 -0
  357. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/parsers/__init__.py +0 -0
  358. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/parsers/delete_log.py +0 -0
  359. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/parsers/monarch.py +0 -0
  360. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/requirements.txt +0 -0
  361. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/schedules/schedule.yml +0 -0
  362. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/udfs/__init__.py +0 -0
  363. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/udfs/addition.py +0 -0
  364. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/udfs/identity.py +0 -0
  365. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/udfs/key.sql +0 -0
  366. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/udfs/parse_phone_number.py +0 -0
  367. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/views/monarch.sql +0 -0
  368. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/_config.check.yml +0 -0
  369. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/count_must_equal.sql +0 -0
  370. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/duplicate_identity.sql +0 -0
  371. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/duplicate_key.sql +0 -0
  372. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/fail.pre_run.sql +0 -0
  373. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/fail.sql +0 -0
  374. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/max_rows.sql +0 -0
  375. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/min_rows.sql +0 -0
  376. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/skip.skip.sql +0 -0
  377. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/skip.sql +0 -0
  378. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/warning.post_run.sql +0 -0
  379. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/warning.sql +0 -0
  380. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/dim/_config.dim.yml +0 -0
  381. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/dim/date.sql +0 -0
  382. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/dim/identity.sql +0 -0
  383. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/dim/overwrite.sql +0 -0
  384. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/dim/time.sql +0 -0
  385. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/_config.fact.yml +0 -0
  386. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/add_missing_modules.py +0 -0
  387. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/append.sql +0 -0
  388. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/deduplicate.sql +0 -0
  389. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/dependency_notebook.ipynb +0 -0
  390. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/dependency_sql.sql +0 -0
  391. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/foreign_keys.sql +0 -0
  392. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/manual.sql +0 -0
  393. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/masker_and_commenter.sql +0 -0
  394. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/memory.sql +0 -0
  395. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/no_drop.sql +0 -0
  396. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/notebook.ipynb +0 -0
  397. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/optimize_vacuum.sql +0 -0
  398. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/option.sql +0 -0
  399. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/order_duplicate.sql +0 -0
  400. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/overwrite.sql +0 -0
  401. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/primary_key.sql +0 -0
  402. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/udf.sql +0 -0
  403. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/_config.invoke.yml +0 -0
  404. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/failed_pre_run.sql +0 -0
  405. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/notebook.py +0 -0
  406. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/notebook_without_argument.ipynb +0 -0
  407. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/notebooks.py +0 -0
  408. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/notebooks_failed_pre_run.sql +0 -0
  409. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/post_run/exe.py +0 -0
  410. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/post_run.sql +0 -0
  411. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/pre_run/exe.py +0 -0
  412. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/pre_run/exe_2.py +0 -0
  413. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/timedout.py +0 -0
  414. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/timedout_pre_run.sql +0 -0
  415. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/nocdc/_config.nocdc.yml +0 -0
  416. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/nocdc/deduplicate.sql +0 -0
  417. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/nocdc/update.sql +0 -0
  418. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd1/_config.scd1.yml +0 -0
  419. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd1/complete.sql +0 -0
  420. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd1/identity.sql +0 -0
  421. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd1/last_timestamp.sql +0 -0
  422. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd1/memory.sql +0 -0
  423. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd1/special_char.sql +0 -0
  424. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd1/update.sql +0 -0
  425. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd2/_config.scd2.yml +0 -0
  426. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd2/complete.sql +0 -0
  427. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd2/correct_valid_from.sql +0 -0
  428. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd2/last_timestamp.sql +0 -0
  429. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd2/memory.sql +0 -0
  430. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd2/update.sql +0 -0
  431. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/type_widening/_config.type_widening.yml +0 -0
  432. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/type_widening/merge.sql +0 -0
  433. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/type_widening/overwrite.sql +0 -0
  434. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/transf/fact/_config.transf.yml +0 -0
  435. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/transf/fact/memory.sql +0 -0
  436. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/transf/post_run.py +0 -0
  437. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/job-schema.json +0 -0
  438. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/dim/_config.semantic.yml +0 -0
  439. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/dim/complex_query.sql +0 -0
  440. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/fact/_config.semantic.yml +0 -0
  441. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/fact/job_option.sql +0 -0
  442. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/fact/powerbi.sql +0 -0
  443. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/fact/schema_drift.sql +0 -0
  444. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/fact/step_option.sql +0 -0
  445. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/fact/zstd.sql +0 -0
  446. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/silver/_config.kings_and_queens.yml +0 -0
  447. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/silver/_config.memory.yml +0 -0
  448. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/silver/_config.monarchs.yml +0 -0
  449. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/silver/_config.princes.yml +0 -0
  450. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/silver/_config.princesses.yml +0 -0
  451. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/silver/_config.regents.yml +0 -0
  452. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/uc/bronze/_config.kings.yml +0 -0
  453. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/uc/bronze/_config.memory.yml +0 -0
  454. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/uc/bronze/_config.monarchs.yml +0 -0
  455. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/uc/bronze/_config.princes.yml +0 -0
  456. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/uc/bronze/_config.princesses.yml +0 -0
  457. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/uc/bronze/_config.queens.yml +0 -0
  458. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/uc/bronze/_config.regents.yml +0 -0
  459. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/schedule.py +0 -0
  460. {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fabricks
3
- Version: 3.0.11
3
+ Version: 3.0.13
4
4
  Author-email: BMS DWH Team <bi_support@bmsuisse.ch>
5
5
  Requires-Python: <4,>=3.9
6
6
  Requires-Dist: azure-data-tables<13,>=12.5.0
@@ -271,12 +271,8 @@ with
271
271
  from dates d
272
272
  left join newkey r on d.__timestamp between r.__valid_from and r.__valid_to and d.only_offer_id = r.only_offer_id
273
273
  group by d.only_offer_id, __timestamp, __operation
274
-
275
274
  ```
276
275
 
277
-
278
-
279
-
280
276
  ## 🧾 Conclusion
281
277
 
282
278
  Fabricks helps you define pipelines declaratively in YAML and implement logic in SQL, while handling CDC, dependencies, logging, and table lifecycle. Start from the examples near each step, then evolve to advanced features like checks, UDFs, extenders, and semantic properties.
@@ -89,6 +89,7 @@ class Merger(Processor):
89
89
  sql = sql.replace("{src}", "src")
90
90
  sql = fix_sql(sql)
91
91
  sql = sql.replace("`src`", "{src}")
92
+
92
93
  DEFAULT_LOGGER.debug("merge", extra={"label": self, "sql": sql})
93
94
 
94
95
  except Exception as e:
@@ -390,11 +390,12 @@ class Processor(Generator):
390
390
  try:
391
391
  sql = template.render(**context)
392
392
  if fix:
393
- DEFAULT_LOGGER.debug("fix context", extra={"label": self, "sql": sql})
394
393
  sql = self.fix_sql(sql)
394
+ else:
395
+ DEFAULT_LOGGER.debug("print query", extra={"label": self, "sql": sql})
395
396
 
396
397
  except (Exception, TypeError) as e:
397
- DEFAULT_LOGGER.exception("fail to execute sql query", extra={"label": self, "context": context})
398
+ DEFAULT_LOGGER.exception("fail to render sql query", extra={"label": self, "context": context})
398
399
  raise e
399
400
 
400
401
  row = self.spark.sql(sql).collect()[0]
@@ -425,7 +426,7 @@ class Processor(Generator):
425
426
 
426
427
  except (Exception, TypeError) as e:
427
428
  DEFAULT_LOGGER.debug("context", extra={"label": self, "context": context})
428
- DEFAULT_LOGGER.exception("fail to generate sql query", extra={"label": self, "context": context})
429
+ DEFAULT_LOGGER.exception("fail to render sql query", extra={"label": self, "context": context})
429
430
  raise e
430
431
 
431
432
  return sql
@@ -0,0 +1,127 @@
1
+ import logging
2
+ import os
3
+ from typing import Final
4
+
5
+ from fabricks.context.helpers import get_config_from_file
6
+ from fabricks.utils.log import get_logger
7
+ from fabricks.utils.path import Path
8
+ from fabricks.utils.spark import spark
9
+
10
+ logger, _ = get_logger("logs", level=logging.DEBUG)
11
+ file_path, file_config, origin = get_config_from_file()
12
+
13
+ if file_path:
14
+ logger.debug(f"found {origin} config ({file_path})", extra={"label": "config"})
15
+
16
+ # path to runtime
17
+ runtime = os.environ.get("FABRICKS_RUNTIME", "none")
18
+ runtime = None if runtime.lower() == "none" else runtime
19
+ if runtime is None:
20
+ if runtime := file_config.get("runtime"):
21
+ assert file_path is not None
22
+ runtime = file_path.joinpath(runtime)
23
+ logger.debug(f"resolve runtime from {origin} file", extra={"label": "config"})
24
+ else:
25
+ logger.debug("resolve runtime from env", extra={"label": "config"})
26
+
27
+ if runtime is None:
28
+ if file_path is not None:
29
+ runtime = file_path
30
+ logger.debug(f"resolve runtime from {origin} file", extra={"label": "config"})
31
+ else:
32
+ raise ValueError(
33
+ "could not resolve runtime (could not find pyproject.toml nor fabricksconfig.json nor FABRICKS_RUNTIME)"
34
+ )
35
+
36
+ path_runtime = Path(runtime, assume_git=True)
37
+
38
+ # path to config
39
+ config = os.environ.get("FABRICKS_CONFIG")
40
+ if config is None:
41
+ if config := file_config.get("config"):
42
+ assert file_path is not None
43
+ config = file_path.joinpath(config)
44
+ logger.debug(f"resolve config from {origin} file", extra={"label": "config"})
45
+ else:
46
+ logger.debug("resolve config from env", extra={"label": "config"})
47
+
48
+ if config is None:
49
+ logger.debug("resolve config from default path", extra={"label": "config"})
50
+ config = path_runtime.joinpath(
51
+ "fabricks",
52
+ f"conf.{spark.conf.get('spark.databricks.clusterUsageTags.clusterOwnerOrgId')}.yml",
53
+ ).string
54
+
55
+ path_config = Path(config, assume_git=True)
56
+
57
+ # path to notebooks
58
+ notebooks = os.environ.get("FABRICKS_NOTEBOOKS", "none")
59
+ notebooks = None if notebooks.lower() == "none" else notebooks
60
+ if notebooks is None:
61
+ if notebooks := file_config.get("notebooks"):
62
+ assert file_path is not None
63
+ notebooks = file_path.joinpath(notebooks)
64
+ logger.debug(f"resolve notebooks from {origin} file", extra={"label": "config"})
65
+ else:
66
+ logger.debug("resolve notebooks from env", extra={"label": "config"})
67
+
68
+ if notebooks is None:
69
+ logger.debug("resolve notebooks from default path", extra={"label": "config"})
70
+ notebooks = path_runtime.joinpath("notebooks")
71
+
72
+ path_notebooks = Path(str(notebooks), assume_git=True)
73
+
74
+ # job config from yaml
75
+ is_job_config_from_yaml = os.environ.get("FABRICKS_IS_JOB_CONFIG_FROM_YAML", None)
76
+ if is_job_config_from_yaml is None:
77
+ if is_job_config_from_yaml := file_config.get("job_config_from_yaml"):
78
+ logger.debug(f"resolve job_config_from_yaml from {origin} file", extra={"label": "config"})
79
+ else:
80
+ logger.debug("resolve job_config_from_yaml from env", extra={"label": "config"})
81
+
82
+ # debug mode
83
+ is_debugmode = os.environ.get("FABRICKS_IS_DEBUGMODE", None)
84
+ if is_debugmode is None:
85
+ if is_debugmode := file_config.get("debugmode"):
86
+ logger.debug(f"resolve debugmode from {origin} file", extra={"label": "config"})
87
+ else:
88
+ logger.debug("resolve debugmode from env", extra={"label": "config"})
89
+
90
+ # dev mode
91
+ is_devmode = os.environ.get("FABRICKS_IS_DEVMODE", None)
92
+ if is_devmode is None:
93
+ if is_devmode := file_config.get("devmode"):
94
+ logger.debug(f"resolve devmode from {origin} file", extra={"label": "config"})
95
+ else:
96
+ logger.debug("resolve devmode from env", extra={"label": "config"})
97
+
98
+ # log level
99
+ loglevel = os.environ.get("FABRICKS_LOGLEVEL", None)
100
+ if loglevel is None:
101
+ if loglevel := file_config.get("loglevel"):
102
+ logger.debug(f"resolve loglevel from {origin} file", extra={"label": "config"})
103
+ else:
104
+ logger.debug("resolve loglevel from env", extra={"label": "config"})
105
+
106
+ loglevel = loglevel.upper() if loglevel else "INFO"
107
+ if loglevel == "DEBUG":
108
+ _loglevel = logging.DEBUG
109
+ elif loglevel == "INFO":
110
+ _loglevel = logging.INFO
111
+ elif loglevel == "WARNING":
112
+ _loglevel = logging.WARNING
113
+ elif loglevel == "ERROR":
114
+ _loglevel = logging.ERROR
115
+ elif loglevel == "CRITICAL":
116
+ _loglevel = logging.CRITICAL
117
+ else:
118
+ raise ValueError(f"could not resolve {loglevel} (DEBUG, INFO, WARNING, ERROR or CRITICAL)")
119
+
120
+ # Constants
121
+ PATH_CONFIG: Final[Path] = path_config
122
+ PATH_RUNTIME: Final[Path] = path_runtime
123
+ PATH_NOTEBOOKS: Final[Path] = path_notebooks
124
+ IS_JOB_CONFIG_FROM_YAML: Final[bool] = str(is_job_config_from_yaml).lower() in ("true", "1", "yes")
125
+ IS_DEBUGMODE: Final[bool] = str(is_debugmode).lower() in ("true", "1", "yes")
126
+ IS_DEVMODE: Final[bool] = str(is_devmode).lower() in ("true", "1", "yes")
127
+ LOGLEVEL: Final[int] = _loglevel
@@ -0,0 +1,58 @@
1
+ import os
2
+ import pathlib
3
+ from typing import List
4
+
5
+ from fabricks.utils.path import Path
6
+
7
+
8
+ def get_config_from_file():
9
+ path = pathlib.Path(os.getcwd())
10
+
11
+ while path is not None and (not (path / "pyproject.toml").exists() or (path / "fabricksconfig.json").exists()):
12
+ if path == path.parent:
13
+ break
14
+ path = path.parent
15
+
16
+ if (path / "fabricksconfig.json").exists():
17
+ import json
18
+
19
+ with open((path / "fabricksconfig.json"), "r") as f:
20
+ config = json.load(f)
21
+ return path, config, "json"
22
+
23
+ if (path / "pyproject.toml").exists():
24
+ import sys
25
+
26
+ if sys.version_info >= (3, 11):
27
+ import tomllib
28
+ else:
29
+ import tomli as tomllib # type: ignore
30
+
31
+ with open((path / "pyproject.toml"), "rb") as f:
32
+ config = tomllib.load(f)
33
+ return path, config.get("tool", {}).get("fabricks", {}), "pyproject"
34
+
35
+ return None, {}, None
36
+
37
+
38
+ def get_storage_paths(objects: List[dict], variables: dict) -> dict:
39
+ d = {}
40
+ for o in objects:
41
+ if o:
42
+ name = o.get("name")
43
+ assert name
44
+ uri = o.get("path_options", {}).get("storage")
45
+ assert uri
46
+ d[name] = Path.from_uri(uri, regex=variables)
47
+ return d
48
+
49
+
50
+ def get_runtime_path(objects: List[dict], root: Path) -> dict:
51
+ d = {}
52
+ for o in objects:
53
+ name = o.get("name")
54
+ assert name
55
+ uri = o.get("path_options", {}).get("runtime")
56
+ assert uri
57
+ d[name] = root.joinpath(uri)
58
+ return d
@@ -1,11 +1,12 @@
1
- from typing import Final, List, Optional
1
+ from typing import Final, Optional
2
2
 
3
3
  import yaml
4
4
 
5
- from fabricks.context.config import path_config, path_runtime
5
+ from fabricks.context.config import PATH_CONFIG, PATH_RUNTIME
6
+ from fabricks.context.helpers import get_runtime_path, get_storage_paths
6
7
  from fabricks.utils.path import Path
7
8
 
8
- with open(str(path_config)) as f:
9
+ with open(str(PATH_CONFIG)) as f:
9
10
  data = yaml.safe_load(f)
10
11
 
11
12
  conf: dict = [d["conf"] for d in data][0]
@@ -51,67 +52,42 @@ FABRICKS_STORAGE_CREDENTIAL: Final[Optional[str]] = path_options.get("storage_cr
51
52
 
52
53
  path_udfs = path_options.get("udfs", "fabricks/udfs")
53
54
  assert path_udfs, "path to udfs mandatory"
54
- PATH_UDFS: Final[Path] = path_runtime.joinpath(path_udfs)
55
+ PATH_UDFS: Final[Path] = PATH_RUNTIME.joinpath(path_udfs)
55
56
 
56
57
  path_parsers = path_options.get("parsers", "fabricks/parsers")
57
58
  assert path_parsers, "path to parsers mandatory"
58
- PATH_PARSERS: Final[Path] = path_runtime.joinpath(path_parsers)
59
+ PATH_PARSERS: Final[Path] = PATH_RUNTIME.joinpath(path_parsers)
59
60
 
60
61
  path_extenders = path_options.get("extenders", "fabricks/extenders")
61
62
  assert path_extenders, "path to extenders mandatory"
62
- PATH_EXTENDERS: Final[Path] = path_runtime.joinpath(path_extenders)
63
+ PATH_EXTENDERS: Final[Path] = PATH_RUNTIME.joinpath(path_extenders)
63
64
 
64
65
  path_views = path_options.get("views", "fabricks/views")
65
66
  assert path_views, "path to views mandatory"
66
- PATH_VIEWS: Final[Path] = path_runtime.joinpath(path_views)
67
+ PATH_VIEWS: Final[Path] = PATH_RUNTIME.joinpath(path_views)
67
68
 
68
69
  path_schedules = path_options.get("schedules", "fabricks/schedules")
69
70
  assert path_schedules, "path to schedules mandatory"
70
- PATH_SCHEDULES: Final[Path] = path_runtime.joinpath(path_schedules)
71
+ PATH_SCHEDULES: Final[Path] = PATH_RUNTIME.joinpath(path_schedules)
71
72
 
72
73
  path_requirements = path_options.get("requirements", "fabricks/requirements")
73
74
  assert path_requirements, "path to requirements mandatory"
74
- PATH_REQUIREMENTS: Final[Path] = path_runtime.joinpath(path_requirements)
75
+ PATH_REQUIREMENTS: Final[Path] = PATH_RUNTIME.joinpath(path_requirements)
75
76
 
76
77
  path_masks = path_options.get("masks", "fabricks/masks")
77
78
  assert path_masks, "path to masks mandatory"
78
- PATH_MASKS: Final[Path] = path_runtime.joinpath(path_masks)
79
-
80
-
81
- def _get_storage_paths(objects: List[dict]) -> dict:
82
- d = {}
83
- for o in objects:
84
- if o:
85
- name = o.get("name")
86
- assert name
87
- uri = o.get("path_options", {}).get("storage")
88
- assert uri
89
- d[name] = Path.from_uri(uri, regex=variables)
90
- return d
91
-
79
+ PATH_MASKS: Final[Path] = PATH_RUNTIME.joinpath(path_masks)
92
80
 
93
81
  PATHS_STORAGE: Final[dict[str, Path]] = {
94
82
  "fabricks": FABRICKS_STORAGE,
95
- **_get_storage_paths(BRONZE),
96
- **_get_storage_paths(SILVER),
97
- **_get_storage_paths(GOLD),
98
- **_get_storage_paths(databases),
83
+ **get_storage_paths(BRONZE, variables),
84
+ **get_storage_paths(SILVER, variables),
85
+ **get_storage_paths(GOLD, variables),
86
+ **get_storage_paths(databases, variables),
99
87
  }
100
88
 
101
-
102
- def _get_runtime_path(objects: List[dict]) -> dict:
103
- d = {}
104
- for o in objects:
105
- name = o.get("name")
106
- assert name
107
- uri = o.get("path_options", {}).get("runtime")
108
- assert uri
109
- d[name] = path_runtime.joinpath(uri)
110
- return d
111
-
112
-
113
89
  PATHS_RUNTIME: Final[dict[str, Path]] = {
114
- **_get_runtime_path(BRONZE),
115
- **_get_runtime_path(SILVER),
116
- **_get_runtime_path(GOLD),
90
+ **get_runtime_path(BRONZE, PATH_RUNTIME),
91
+ **get_runtime_path(SILVER, PATH_RUNTIME),
92
+ **get_runtime_path(GOLD, PATH_RUNTIME),
117
93
  }
@@ -10,7 +10,7 @@ from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_ex
10
10
 
11
11
  from fabricks.context import PATH_NOTEBOOKS
12
12
  from fabricks.core.dags.base import BaseDags
13
- from fabricks.core.dags.log import LOGGER
13
+ from fabricks.core.dags.log import LOGGER, TABLE_LOG_HANDLER
14
14
  from fabricks.core.dags.run import run
15
15
  from fabricks.core.jobs.base._types import TStep
16
16
  from fabricks.core.steps.get_step import get_step
@@ -148,7 +148,9 @@ class DagProcessor(BaseDags):
148
148
  finally:
149
149
  j["Status"] = "ok"
150
150
  self.table.upsert(j)
151
+
151
152
  LOGGER.info("end", extra=self.extra(j))
153
+ TABLE_LOG_HANDLER.flush()
152
154
 
153
155
  dependencies = self.table.query(f"PartitionKey eq 'dependencies' and ParentId eq '{j.get('JobId')}'")
154
156
  self.table.delete(dependencies)
@@ -1,8 +1,8 @@
1
- from importlib.util import module_from_spec, spec_from_file_location
2
1
  from typing import Callable
3
2
 
4
3
  from fabricks.context import IS_UNITY_CATALOG, PATH_EXTENDERS
5
4
  from fabricks.context.log import DEFAULT_LOGGER
5
+ from fabricks.utils.helpers import load_module_from_path
6
6
 
7
7
  EXTENDERS: dict[str, Callable] = {}
8
8
 
@@ -14,12 +14,7 @@ def get_extender(name: str) -> Callable:
14
14
  else:
15
15
  DEFAULT_LOGGER.debug(f"could not check if extender exists ({path.string})")
16
16
 
17
- spec = spec_from_file_location(name, path.string)
18
- assert spec, "no valid extender found in {path.string}"
19
- assert spec.loader is not None
20
-
21
- mod = module_from_spec(spec)
22
- spec.loader.exec_module(mod)
17
+ load_module_from_path(name, path)
23
18
  e = EXTENDERS[name]
24
19
 
25
20
  return e
@@ -336,10 +336,10 @@ class Generator(Configurator):
336
336
 
337
337
  comment = self.options.table.get("comment")
338
338
  if comment:
339
- self.table.add_comment(comment=comment)
339
+ self.table.add_table_comment(comment=comment)
340
340
 
341
341
  else:
342
- DEFAULT_LOGGER.debug("table exists, skip creation", extra={"label": self})
342
+ DEFAULT_LOGGER.debug("table already exists, skipped creation", extra={"label": self})
343
343
 
344
344
  def _update_schema(
345
345
  self,
@@ -389,6 +389,24 @@ class Generator(Configurator):
389
389
  def overwrite_schema(self, df: Optional[DataFrame] = None):
390
390
  self._update_schema(df=df, overwrite=True)
391
391
 
392
+ def update_comments(self, table: Optional[bool] = True, columns: Optional[bool] = True):
393
+ if self.virtual:
394
+ return
395
+
396
+ if self.persist:
397
+ self.table.drop_comments()
398
+
399
+ if table:
400
+ comment = self.options.table.get("comment")
401
+ if comment:
402
+ self.table.add_table_comment(comment=comment)
403
+
404
+ if columns:
405
+ comments = self.options.table.get_dict("comments")
406
+ if comments:
407
+ for col, comment in comments.items():
408
+ self.table.add_column_comment(column=col, comment=comment)
409
+
392
410
  def get_differences_with_deltatable(self, df: Optional[DataFrame] = None):
393
411
  if df is None:
394
412
  df = self.get_data(stream=self.stream)
@@ -1,9 +1,9 @@
1
- from importlib.util import module_from_spec, spec_from_file_location
2
1
  from typing import Optional
3
2
 
4
3
  from fabricks.context import PATH_PARSERS
5
4
  from fabricks.core.parsers._types import ParserOptions
6
5
  from fabricks.core.parsers.base import PARSERS, BaseParser
6
+ from fabricks.utils.helpers import load_module_from_path
7
7
 
8
8
 
9
9
  def get_parser(name: str, parser_options: Optional[ParserOptions] = None) -> BaseParser:
@@ -11,12 +11,7 @@ def get_parser(name: str, parser_options: Optional[ParserOptions] = None) -> Bas
11
11
  path = PATH_PARSERS.joinpath(name).append(".py")
12
12
  assert path.exists(), f"parser not found ({path})"
13
13
 
14
- spec = spec_from_file_location(name, path.string)
15
- assert spec, f"parser not found ({path})"
16
- assert spec.loader is not None
17
-
18
- mod = module_from_spec(spec)
19
- spec.loader.exec_module(mod)
14
+ load_module_from_path(name, path)
20
15
  parser = PARSERS[name](parser_options)
21
16
 
22
17
  else:
@@ -228,15 +228,22 @@ class BaseStep:
228
228
  DEFAULT_LOGGER.exception("fail to get jobs", extra={"label": self})
229
229
  raise e
230
230
 
231
- def create_db_objects(self, retry: Optional[bool] = True) -> List[Dict]:
231
+ def create_db_objects(
232
+ self,
233
+ retry: Optional[bool] = True,
234
+ update_lists: Optional[bool] = True,
235
+ incremental: Optional[bool] = False,
236
+ ) -> List[Dict]:
232
237
  DEFAULT_LOGGER.info("create db objects", extra={"label": self})
233
238
 
234
239
  df = self.get_jobs()
235
- table_df = self.database.get_tables()
236
- view_df = self.database.get_views()
237
240
 
238
- df = df.join(table_df, "job_id", how="left_anti")
239
- df = df.join(view_df, "job_id", how="left_anti")
241
+ if incremental:
242
+ table_df = self.database.get_tables()
243
+ view_df = self.database.get_views()
244
+
245
+ df = df.join(table_df, "job_id", how="left_anti")
246
+ df = df.join(view_df, "job_id", how="left_anti")
240
247
 
241
248
  if df:
242
249
  results = run_in_parallel(
@@ -248,15 +255,16 @@ class BaseStep:
248
255
  loglevel=logging.CRITICAL,
249
256
  )
250
257
 
251
- self.update_tables_list()
252
- self.update_views_list()
258
+ if update_lists:
259
+ self.update_tables_list()
260
+ self.update_views_list()
253
261
 
254
262
  errors = [res for res in results if res.get("error")]
255
263
 
256
264
  if errors:
257
265
  if retry:
258
266
  DEFAULT_LOGGER.warning("retry to create jobs", extra={"label": self})
259
- return self.create_db_objects(retry=False)
267
+ return self.create_db_objects(retry=False, update_lists=update_lists, incremental=incremental)
260
268
 
261
269
  return errors
262
270
 
@@ -276,6 +276,7 @@ def create_or_replace_logs_pivot_view():
276
276
  l.step,
277
277
  l.job,
278
278
  l.job_id,
279
+ -- flags
279
280
  collect_set(l.status) as statuses,
280
281
  array_contains(statuses, 'skipped') as skipped,
281
282
  array_contains(statuses, 'warned') as warned,
@@ -283,15 +284,19 @@ def create_or_replace_logs_pivot_view():
283
284
  array_contains(statuses, 'failed') or (not done and not skipped) as failed,
284
285
  not done and not failed and not skipped and array_contains(statuses, 'running') as timed_out,
285
286
  not array_contains(statuses, 'running') as cancelled,
287
+ --
286
288
  max(l.notebook_id) as notebook_id,
289
+ --
290
+ max(l.timestamp) filter (where l.status = 'running') as start_time,
291
+ max(l.timestamp) filter (where l.status in ('done', 'ok')) as end_time,
292
+ --
287
293
  max(l.timestamp) filter (where l.status = 'scheduled' ) as scheduled_time,
288
294
  max(l.timestamp) filter (where l.status = 'waiting' ) as waiting_time,
289
- max(l.timestamp) filter (where l.status = 'running') as start_time,
290
295
  max(l.timestamp) filter (where l.status = 'running' ) as running_time,
291
296
  max(l.timestamp) filter (where l.status = 'done' ) as done_time,
292
297
  max(l.timestamp) filter (where l.status = 'failed' ) as failed_time,
293
- max(l.timestamp) filter(where l.status = 'ok') as end_time,
294
- max(l.timestamp) filter(where l.status = 'ok') as ok_time,
298
+ max(l.timestamp) filter (where l.status = 'ok') as ok_time,
299
+ --
295
300
  max(l.exception) as exception
296
301
  from
297
302
  fabricks.logs l
@@ -666,7 +666,45 @@ class Table(DbObject):
666
666
  """
667
667
  )
668
668
 
669
- def add_comment(self, comment: str):
669
+ def drop_comments(self):
670
+ self.drop_table_comment()
671
+ for col in self.columns:
672
+ self.drop_column_comment(col)
673
+
674
+ def drop_table_comment(self):
675
+ assert self.registered, f"{self} not registered"
676
+
677
+ DEFAULT_LOGGER.debug("drop table comment", extra={"label": self})
678
+ self.spark.sql(
679
+ f"""
680
+ comment on table {self.qualified_name}
681
+ is null;
682
+ """
683
+ )
684
+
685
+ def drop_column_comment(self, column: str):
686
+ assert self.registered, f"{self} not registered"
687
+
688
+ DEFAULT_LOGGER.debug(f"drop comment from column {column}", extra={"label": self})
689
+ self.spark.sql(
690
+ f"""
691
+ comment on column {self.qualified_name}.`{column}`
692
+ is null;
693
+ """
694
+ )
695
+
696
+ def add_column_comment(self, column: str, comment: str):
697
+ assert self.registered, f"{self} not registered"
698
+
699
+ DEFAULT_LOGGER.debug(f"add comment '{comment}' to column {column}", extra={"label": self})
700
+ self.spark.sql(
701
+ f"""
702
+ comment on column {self.qualified_name}.`{column}`
703
+ is '{comment}';
704
+ """
705
+ )
706
+
707
+ def add_table_comment(self, comment: str):
670
708
  assert self.registered, f"{self} not registered"
671
709
 
672
710
  DEFAULT_LOGGER.debug(f"add comment '{comment}'", extra={"label": self})
@@ -1,5 +1,4 @@
1
- import time
2
- from typing import TYPE_CHECKING, List, Optional, Union
1
+ from typing import TYPE_CHECKING, Any, List, Optional, Union
3
2
 
4
3
  from azure.data.tables import TableClient, TableServiceClient
5
4
  from pyspark.sql import DataFrame
@@ -99,27 +98,29 @@ class AzureTable:
99
98
  if self._table_client is not None:
100
99
  self._table_client.close()
101
100
 
102
- def submit(self, operations: List, retry: Optional[bool] = True):
103
- try:
104
- partitions = set()
105
- for d in operations:
106
- partitions.add(d[1]["PartitionKey"])
107
-
108
- for p in partitions:
109
- _operations = [d for d in operations if d[1].get("PartitionKey") == p]
110
- t = 50
111
- if len(_operations) < t:
112
- self.table.submit_transaction(_operations)
113
- else:
114
- transactions = [_operations[i : i + t] for i in range(0, len(_operations), t)]
115
- for transaction in transactions:
116
- self.table.submit_transaction(transaction)
117
- except Exception as e:
118
- if retry:
119
- time.sleep(10)
120
- self.submit(operations, retry=False)
101
+ @retry(
102
+ stop=stop_after_attempt(3),
103
+ wait=wait_exponential(multiplier=1, min=1, max=10),
104
+ retry=retry_if_exception_type((Exception)),
105
+ reraise=True,
106
+ )
107
+ def _submit_with_retry(self, data: Any):
108
+ self.table.submit_transaction(data)
109
+
110
+ def submit(self, operations: List):
111
+ partitions = set()
112
+ for d in operations:
113
+ partitions.add(d[1]["PartitionKey"])
114
+
115
+ for p in partitions:
116
+ _operations = [d for d in operations if d[1].get("PartitionKey") == p]
117
+ t = 50
118
+ if len(_operations) < t:
119
+ self._submit_with_retry(_operations)
121
120
  else:
122
- raise e
121
+ transactions = [_operations[i : i + t] for i in range(0, len(_operations), t)]
122
+ for transaction in transactions:
123
+ self._submit_with_retry(transaction)
123
124
 
124
125
  def delete(self, data: Union[List, DataFrame, dict]):
125
126
  if isinstance(data, DataFrameLike):
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ import sys
2
3
  from functools import reduce
3
4
  from queue import Queue
4
5
  from typing import Any, Callable, Iterable, List, Literal, Optional, Union
@@ -216,13 +217,28 @@ def run_notebook(path: Path, timeout: Optional[int] = None, **kwargs):
216
217
  dbutils.notebook.run(path.get_notebook_path(), timeout, {**kwargs}) # type: ignore
217
218
 
218
219
 
219
- def xxhash64(s: Any):
220
+ def xxhash64(s: Any) -> int:
220
221
  df = spark.sql(f"select xxhash64(cast('{s}' as string)) as xxhash64")
221
222
  return df.collect()[0][0]
222
223
 
223
224
 
224
- def md5(s: Any):
225
+ def md5(s: Any) -> str:
225
226
  from hashlib import md5
226
227
 
227
228
  md5 = md5(str(s).encode())
228
229
  return md5.hexdigest()
230
+
231
+
232
+ def load_module_from_path(name: str, path: Path):
233
+ from importlib.util import module_from_spec, spec_from_file_location
234
+
235
+ sys.path.append(str(path.parent))
236
+
237
+ spec = spec_from_file_location(name, path.string)
238
+ assert spec, f"no valid module found in {path.string}"
239
+ assert spec.loader is not None
240
+
241
+ textwrap_module = module_from_spec(spec)
242
+ spec.loader.exec_module(textwrap_module)
243
+
244
+ return textwrap_module