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.
- {fabricks-3.0.11 → fabricks-3.0.13}/PKG-INFO +1 -1
- {fabricks-3.0.11 → fabricks-3.0.13}/README.md +0 -4
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/base/merger.py +1 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/base/processor.py +4 -3
- fabricks-3.0.13/fabricks/context/config.py +127 -0
- fabricks-3.0.13/fabricks/context/helpers.py +58 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/context/runtime.py +18 -42
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/processor.py +3 -1
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/extenders.py +2 -7
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/generator.py +20 -2
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/parsers/get_parser.py +2 -7
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/steps/base.py +16 -8
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/views.py +8 -3
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/table.py +39 -1
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/azure_table.py +23 -22
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/helpers.py +18 -2
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/path.py +8 -2
- {fabricks-3.0.11 → fabricks-3.0.13}/format.sh +23 -17
- {fabricks-3.0.11 → fabricks-3.0.13}/pyproject.toml +1 -1
- fabricks-3.0.13/tests/integration/README.md +16 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/uv.lock +1 -1
- fabricks-3.0.11/fabricks/context/config/__init__.py +0 -92
- fabricks-3.0.11/fabricks/context/config/utils.py +0 -53
- {fabricks-3.0.11 → fabricks-3.0.13}/.gitignore +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/.gitkeep +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/.python-version +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/databricks.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/helpers/init.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/helpers/job.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/helpers/runtime.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/helpers/schedule.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/helpers/step.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/index.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/introduction/layers.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/introduction/overview.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/reference/cdc.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/reference/checks-data-quality.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/reference/extenders-udfs-parsers.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/reference/table-options.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/steps/BRONZE.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/steps/GOLD.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/docs/steps/SILVER.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/cdc/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/cdc/nocdc.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/cdc/scd1.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/cdc/scd2.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/context.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/core.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/deploy.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/exceptions.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/extenders.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/job_schema.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/log.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/masks.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/metastore/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/metastore/database.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/metastore/table.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/metastore/view.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/notebooks/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/notebooks/cluster.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/notebooks/initialize.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/notebooks/process.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/notebooks/run.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/notebooks/schedule.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/notebooks/terminate.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/parsers.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/schedules.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/udfs.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/utils.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/version.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/api/views.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/base/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/base/_types.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/base/cdc.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/base/configurator.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/base/generator.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/cdc.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/nocdc.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/scd.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/scd1.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/scd2.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/ctes/base.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/ctes/current.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/ctes/deduplicate_hash.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/ctes/deduplicate_key.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/ctes/rectify.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/ctes/slice.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/filter.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/filters/final.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/filters/latest.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/filters/update.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/macros/bactick.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/macros/hash.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/merge.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/merges/nocdc.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/merges/scd1.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/merges/scd2.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/queries/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/queries/context.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/queries/final.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/queries/nocdc/complete.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/queries/nocdc/update.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/queries/scd1.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/queries/scd2.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/cdc/templates/query.sql.jinja +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/context/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/context/_types.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/context/log.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/context/secret.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/context/spark_session.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/context/utils.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/base.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/generator.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/log.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/run.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/terminator.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/dags/utils.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/job_schema.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/_types.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/checker.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/configurator.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/exception.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/invoker.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/job.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/base/processor.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/bronze.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/get_job.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/get_job_conf.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/get_job_id.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/get_jobs.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/get_schedule.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/get_schedules.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/gold.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/jobs/silver.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/masks.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/parsers/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/parsers/_types.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/parsers/base.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/parsers/decorator.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/parsers/utils.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/diagrams.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/generate.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/get_schedule.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/get_schedules.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/process.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/run.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/terminate.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/schedules/views.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/steps/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/steps/_types.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/steps/get_step.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/steps/get_step_conf.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/udfs.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/core/views.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/masks.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/notebooks.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/schedules.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/tables.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/udfs.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/deploy/utils.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/README.md +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/_types.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/database.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/dbobject.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/pyproject.toml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/utils.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/metastore/view.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/_types.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/azure_queue.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/console.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/fdict.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/log.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/mermaid.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/pip.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/pydantic.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/read/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/read/_types.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/read/read.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/read/read_excel.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/read/read_yaml.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/schema/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/schema/get_json_schema_for_type.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/schema/get_schema_for_type.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/spark.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/sqlglot.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/write/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/write/delta.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/fabricks/utils/write/stream.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/mkdocs.sh +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/mkdocs.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/_types.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/add_missing_modules.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/armageddon.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/compare.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/king/2022/01/01/0001/king_202201010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/king/2022/01/02/0001/king_202201020001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/king__deletelog/2022/02/01/0001/king_202201010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/prince/2022/01/01/0001/prince_202201010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/princess/2022/01/01/0001/princess_202201010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/queen/2022/01/01/0001/queen_202201010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/queen/2022/01/02/0001/queen_202201020001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/queen/2022/01/04/0001/queen_202201040001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/queen__deletelog/2022/01/03/0001/queen_202201030001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/queen__deletelog/2022/01/04/0001/queen_202201040001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job1/too_many_columns/2022/01/01/0001/sample_202201010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job10/king/2022/10/01/0001/king_202210010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job10/king/2022/10/02/0001/king_202210020001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job10/king/2022/10/02/0002/king_202210020002.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job10/king/2022/10/03/0001/king_202210030001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job10/queen__deletelog/2022/10/01/0001/queen_202210010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job11/king/2022/11/01/0001/king_202210010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job11/king__deletelog/2022/11/01/0001/king_202211010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job2/king/2022/02/05/0001/king_202202050001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job2/prince__deletelog/2022/02/01/0001/prince_202202010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job2/princess/2022/02/05/0001/princess_202202050001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job2/queen/2022/02/05/0001/queen_202202050001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job3/king/2022/03/01/001234/king_20220301001234.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job3/king__deletelog/2022/03/01/001234/king_20220301001234.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job3/queen/2022/03/05/001234/queen_20220305001234.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job3/queen/2022/03/06/0001/queen_202203060001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job4/king/2022/04/01/0001/king_202204010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job4/monarch/2022/04/01/0001/monarch_202204010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job4/queen/2022/04/01/0001/queen_202204010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job4/regent/2022/04/01/0001/regent_202204010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job5/king/2022/05/01/0001/king_202205010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job5/queen/2022/05/01/0001/queen_202205010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job6/king/2022/06/01/0001/king_202206010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job6/queen/2022/06/01/0001/queen_202206010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job7/king/2022/07/01/0001/king_202207010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job7/queen/2022/07/01/0001/queen_202207010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job8/king/2022/08/01/0001/king_202208010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job8/queen/2022/08/01/0001/queen_202208010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king/2022/09/01/0001/king_202209010001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king/2022/09/03/0001/king_202209030001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king/2022/09/03/0002/king_202209030002.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king/2022/09/08/0001/king_202209080001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king__deletelog/2022/09/02/0001/king_202209020001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king__deletelog/2022/09/04/0001/king_202209040001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king__deletelog/2022/09/04/0005/king_202209040005.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/king__deletelog/2022/09/04/0009/king_202209040009.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/queen/2022/09/08/0001/queen_202209080001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/data/job9/queen__deletelog/2022/09/01/0001/queen_202209030001.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job01.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job02.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job03.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job04.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job05.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job06.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job07.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job08.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job09.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job10.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd1/job11.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job01.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job02.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job03.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job04.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job05.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job06.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job07.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job08.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job09.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job10.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/gold/scd2/job11.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job01.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job02.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job03.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job04.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job05.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job06.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job07.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job08.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job09.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job10.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd1/job11.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job01.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job02.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job03.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job04.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job05.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job06.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job07.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job08.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job09.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job10.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/expected/silver/scd2/job11.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/fabricksconfig.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/init.sh +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/initialize.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_cdc.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_check.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_dependency.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_gold.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_invoke.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_overwrite.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_schedule.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_semantic.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job1/test_silver.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job2/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job2/test_gold.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job2/test_run.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job2/test_semantic.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job2/test_silver.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job3/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job3/test_gold.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job3/test_run.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job3/test_silver.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job4/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job4/test_gold.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job4/test_run.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job5/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/jobs/job5/test_step.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/reset.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/run.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runjobs.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtests.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/.gitignore +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/bronze/_config.kings.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/bronze/_config.memory.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/bronze/_config.monarchs.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/bronze/_config.princes.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/bronze/_config.princesses.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/bronze/_config.queens.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/bronze/_config.regents.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/conf.fabricks.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/conf.uc.fabricks.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/extenders/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/extenders/add_country.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/extenders/drop__cols.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/extenders/force_reload.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/extenders/monarch.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/masks/dummy.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/notebooks/add_missing_modules.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/notebooks/cluster.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/notebooks/initialize.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/notebooks/process.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/notebooks/run.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/notebooks/schedule.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/notebooks/terminate.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/parsers/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/parsers/delete_log.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/parsers/monarch.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/requirements.txt +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/schedules/schedule.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/udfs/__init__.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/udfs/addition.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/udfs/identity.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/udfs/key.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/udfs/parse_phone_number.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/fabricks/views/monarch.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/_config.check.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/count_must_equal.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/duplicate_identity.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/duplicate_key.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/fail.pre_run.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/fail.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/max_rows.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/min_rows.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/skip.skip.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/skip.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/warning.post_run.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/check/warning.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/dim/_config.dim.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/dim/date.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/dim/identity.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/dim/overwrite.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/dim/time.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/_config.fact.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/add_missing_modules.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/append.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/deduplicate.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/dependency_notebook.ipynb +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/dependency_sql.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/foreign_keys.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/manual.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/masker_and_commenter.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/memory.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/no_drop.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/notebook.ipynb +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/optimize_vacuum.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/option.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/order_duplicate.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/overwrite.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/primary_key.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/fact/udf.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/_config.invoke.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/failed_pre_run.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/notebook.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/notebook_without_argument.ipynb +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/notebooks.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/notebooks_failed_pre_run.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/post_run/exe.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/post_run.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/pre_run/exe.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/pre_run/exe_2.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/timedout.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/invoke/timedout_pre_run.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/nocdc/_config.nocdc.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/nocdc/deduplicate.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/nocdc/update.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd1/_config.scd1.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd1/complete.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd1/identity.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd1/last_timestamp.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd1/memory.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd1/special_char.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd1/update.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd2/_config.scd2.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd2/complete.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd2/correct_valid_from.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd2/last_timestamp.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd2/memory.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/scd2/update.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/type_widening/_config.type_widening.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/type_widening/merge.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/gold/type_widening/overwrite.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/transf/fact/_config.transf.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/transf/fact/memory.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/gold/transf/post_run.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/job-schema.json +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/dim/_config.semantic.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/dim/complex_query.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/fact/_config.semantic.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/fact/job_option.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/fact/powerbi.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/fact/schema_drift.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/fact/step_option.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/semantic/fact/zstd.sql +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/silver/_config.kings_and_queens.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/silver/_config.memory.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/silver/_config.monarchs.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/silver/_config.princes.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/silver/_config.princesses.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/silver/_config.regents.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/uc/bronze/_config.kings.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/uc/bronze/_config.memory.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/uc/bronze/_config.monarchs.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/uc/bronze/_config.princes.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/uc/bronze/_config.princesses.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/uc/bronze/_config.queens.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/runtime/uc/bronze/_config.regents.yml +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/schedule.py +0 -0
- {fabricks-3.0.11 → fabricks-3.0.13}/tests/integration/utils.py +0 -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.
|
|
@@ -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
|
|
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
|
|
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,
|
|
1
|
+
from typing import Final, Optional
|
|
2
2
|
|
|
3
3
|
import yaml
|
|
4
4
|
|
|
5
|
-
from fabricks.context.config import
|
|
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(
|
|
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] =
|
|
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] =
|
|
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] =
|
|
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] =
|
|
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] =
|
|
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] =
|
|
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] =
|
|
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
|
-
**
|
|
96
|
-
**
|
|
97
|
-
**
|
|
98
|
-
**
|
|
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
|
-
**
|
|
115
|
-
**
|
|
116
|
-
**
|
|
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
|
-
|
|
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.
|
|
339
|
+
self.table.add_table_comment(comment=comment)
|
|
340
340
|
|
|
341
341
|
else:
|
|
342
|
-
DEFAULT_LOGGER.debug("table exists,
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
239
|
-
|
|
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
|
-
|
|
252
|
-
|
|
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
|
|
294
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
self.
|
|
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
|
-
|
|
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
|