From 61dbaf3bb022db5ceee7080c8f7ac71015e7c3d3 Mon Sep 17 00:00:00 2001 From: "Reuven V. Gonzales" Date: Fri, 17 May 2024 05:05:09 +0000 Subject: [PATCH] More fixes for helm release --- .github/scripts/publish-docker-containers.sh | 68 +++++++++++++++ .../warehouse-publish-docker-containers.yml | 40 +++++++++ a.out | 0 boop.txt | 40 +++++++++ docker/cloudquery/py-base.Dockerfile | 9 ++ docker/cloudquery/py.Dockerfile | 7 ++ docker/cloudquery/ts-base.Dockerfile | 9 ++ docker/cloudquery/ts.Dockerfile | 9 ++ docker/images/cloudflare-tunnel/Dockerfile | 6 ++ .../cloudflare-tunnel/cf-tunnel-wrapper.sh | 9 ++ docker/images/dagster-dask.Dockerfile | 37 +++++++++ ops/helm-charts/oso-dagster/Chart.yaml | 2 +- .../production/custom-helm-values.yaml | 4 +- oso/dbtdag/__init__.py | 0 oso/dbtdag/export.py | 78 ++++++++++++++++++ test_all.sh | 18 ++++ .../ansible-collection/integration/README.md | 3 + .../ansible-collection/integration/galaxy.yml | 75 +++++++++++++++++ .../integration/meta/runtime.yml | 52 ++++++++++++ .../playbooks/setup_postgres_replication.yml | 10 +++ .../integration/plugins/README.md | 31 +++++++ .../integration/roles/postgres/README.md | 31 +++++++ .../roles/postgres/defaults/main.yml | 8 ++ .../roles/postgres/handlers/main.yml | 2 + .../integration/roles/postgres/meta/main.yml | 52 ++++++++++++ .../integration/roles/postgres/tasks/main.yml | 46 +++++++++++ .../roles/postgres/tests/inventory | 2 + .../integration/roles/postgres/tests/test.yml | 5 ++ .../integration/roles/postgres/vars/main.yml | 2 + .../setup_postgres_replication.yml | 13 +++ ...__sqlmesh_example___full_model__4157663659 | Bin 0 -> 1353 bytes ...sh_example___incremental_model__3228797744 | Bin 0 -> 1708 bytes ..._model__1715376661_6757677__3237680129__db | Bin 0 -> 1315 bytes ...l_model__1715376661_6757677__387428011__db | Bin 0 -> 1314 bytes ...el__1715385339_6193233__3914696475__memory | Bin 0 -> 1323 bytes ..._model__1715376661_6757677__3237680129__db | Bin 0 -> 1976 bytes ...l_model__1715376661_6757677__387428011__db | Bin 0 -> 1975 bytes ...el__1715385339_6193233__3914696475__memory | Bin 0 -> 1985 bytes ..._49__sqlmesh_example_full_model_2210254270 | Bin 0 -> 899 bytes ..._49__sqlmesh_example_full_model_3783885124 | Bin 0 -> 904 bytes ...lmesh_example_incremental_model_1662842126 | Bin 0 -> 1087 bytes ...lmesh_example_incremental_model_3679699008 | Bin 0 -> 1088 bytes ...23_15_49__sqlmesh_example_test1_2806289995 | Bin 0 -> 757 bytes ...23_15_49__sqlmesh_example_test1_2848966810 | Bin 0 -> 761 bytes ...23_15_49__sqlmesh_example_test2_2806289995 | Bin 0 -> 757 bytes ...23_15_49__sqlmesh_example_test2_2848966810 | Bin 0 -> 761 bytes warehouse/playground_source/audits/.gitkeep | 0 .../audits/assert_positive_order_ids.sql | 8 ++ warehouse/playground_source/config.py | 23 ++++++ warehouse/playground_source/db.db | Bin 0 -> 536576 bytes warehouse/playground_source/macros/.gitkeep | 0 .../playground_source/macros/__init__.py | 0 warehouse/playground_source/models/.gitkeep | 0 .../playground_source/models/full_model.sql | 14 ++++ .../models/incremental_model.sql | 18 ++++ .../models/playground_models.py | 26 ++++++ .../playground_source/models/seed_model.sql | 12 +++ warehouse/playground_source/old_config.yaml | 10 +++ warehouse/playground_source/seeds/.gitkeep | 0 .../playground_source/seeds/seed_data.csv | 8 ++ warehouse/playground_source/tests/.gitkeep | 0 .../tests/test_full_model.yaml | 21 +++++ 62 files changed, 804 insertions(+), 4 deletions(-) create mode 100644 .github/scripts/publish-docker-containers.sh create mode 100644 .github/workflows/warehouse-publish-docker-containers.yml create mode 100644 a.out create mode 100644 boop.txt create mode 100644 docker/cloudquery/py-base.Dockerfile create mode 100644 docker/cloudquery/py.Dockerfile create mode 100644 docker/cloudquery/ts-base.Dockerfile create mode 100644 docker/cloudquery/ts.Dockerfile create mode 100644 docker/images/cloudflare-tunnel/Dockerfile create mode 100644 docker/images/cloudflare-tunnel/cf-tunnel-wrapper.sh create mode 100644 docker/images/dagster-dask.Dockerfile create mode 100644 oso/dbtdag/__init__.py create mode 100644 oso/dbtdag/export.py create mode 100644 test_all.sh create mode 100644 warehouse/ansible-collection/integration/README.md create mode 100644 warehouse/ansible-collection/integration/galaxy.yml create mode 100644 warehouse/ansible-collection/integration/meta/runtime.yml create mode 100644 warehouse/ansible-collection/integration/playbooks/setup_postgres_replication.yml create mode 100644 warehouse/ansible-collection/integration/plugins/README.md create mode 100644 warehouse/ansible-collection/integration/roles/postgres/README.md create mode 100644 warehouse/ansible-collection/integration/roles/postgres/defaults/main.yml create mode 100644 warehouse/ansible-collection/integration/roles/postgres/handlers/main.yml create mode 100644 warehouse/ansible-collection/integration/roles/postgres/meta/main.yml create mode 100644 warehouse/ansible-collection/integration/roles/postgres/tasks/main.yml create mode 100644 warehouse/ansible-collection/integration/roles/postgres/tests/inventory create mode 100644 warehouse/ansible-collection/integration/roles/postgres/tests/test.yml create mode 100644 warehouse/ansible-collection/integration/roles/postgres/vars/main.yml create mode 100644 warehouse/ansible-collection/integration/setup_postgres_replication.yml create mode 100644 warehouse/playground_source/.cache/model_definition/0_95_23_15_49___db___sqlmesh_example___full_model__4157663659 create mode 100644 warehouse/playground_source/.cache/model_definition/0_95_23_15_49___db___sqlmesh_example___incremental_model__3228797744 create mode 100644 warehouse/playground_source/.cache/model_definition/0_95_23_15_49__models__full_model__1715376661_6757677__3237680129__db create mode 100644 warehouse/playground_source/.cache/model_definition/0_95_23_15_49__models__full_model__1715376661_6757677__387428011__db create mode 100644 warehouse/playground_source/.cache/model_definition/0_95_23_15_49__models__full_model__1715385339_6193233__3914696475__memory create mode 100644 warehouse/playground_source/.cache/model_definition/0_95_23_15_49__models__incremental_model__1715376661_6757677__3237680129__db create mode 100644 warehouse/playground_source/.cache/model_definition/0_95_23_15_49__models__incremental_model__1715376661_6757677__387428011__db create mode 100644 warehouse/playground_source/.cache/model_definition/0_95_23_15_49__models__incremental_model__1715385339_6193233__3914696475__memory create mode 100644 warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_full_model_2210254270 create mode 100644 warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_full_model_3783885124 create mode 100644 warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_incremental_model_1662842126 create mode 100644 warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_incremental_model_3679699008 create mode 100644 warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_test1_2806289995 create mode 100644 warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_test1_2848966810 create mode 100644 warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_test2_2806289995 create mode 100644 warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_test2_2848966810 create mode 100644 warehouse/playground_source/audits/.gitkeep create mode 100644 warehouse/playground_source/audits/assert_positive_order_ids.sql create mode 100644 warehouse/playground_source/config.py create mode 100644 warehouse/playground_source/db.db create mode 100644 warehouse/playground_source/macros/.gitkeep create mode 100644 warehouse/playground_source/macros/__init__.py create mode 100644 warehouse/playground_source/models/.gitkeep create mode 100644 warehouse/playground_source/models/full_model.sql create mode 100644 warehouse/playground_source/models/incremental_model.sql create mode 100644 warehouse/playground_source/models/playground_models.py create mode 100644 warehouse/playground_source/models/seed_model.sql create mode 100644 warehouse/playground_source/old_config.yaml create mode 100644 warehouse/playground_source/seeds/.gitkeep create mode 100644 warehouse/playground_source/seeds/seed_data.csv create mode 100644 warehouse/playground_source/tests/.gitkeep create mode 100644 warehouse/playground_source/tests/test_full_model.yaml diff --git a/.github/scripts/publish-docker-containers.sh b/.github/scripts/publish-docker-containers.sh new file mode 100644 index 000000000..740b127ef --- /dev/null +++ b/.github/scripts/publish-docker-containers.sh @@ -0,0 +1,68 @@ +#!/bin/bash +set -euo pipefail + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cd "${SCRIPT_DIR}/../../" +REPO_DIR=$(pwd) + +# For now if a plugin has both a pyproject.toml and a package.json. The python +# will be used by nature of the order of docker image publishing +python_plugins="$(find ./warehouse/cloudquery-* -type f -name 'pyproject.toml' -exec sh -c 'dirname $0' {} \;)" +ts_plugins="$(find ./warehouse/cloudquery-* -type f -name 'package.json' -exec sh -c 'dirname $0' {} \;)" +tag="$(git rev-parse HEAD)" + +build_base_image() { + language="$1" + tag="$2" + base_image="ghcr.io/opensource-observer/${language}-base:${tag}" + dockerfile_path="./docker/cloudquery/${language}-base.Dockerfile" + docker build -t "${base_image}" -f "${dockerfile_path}" . + echo $base_image +} + +# Build the base images +py_base_image=$(build_base_image py $tag) +ts_base_image=$(build_base_image ts $tag) +prefix="cloudquery-" + +for path in $ts_plugins; do + plugin_name=$(basename $path) + # Remove the cloudquery prefix + plugin_name=${plugin_name#"$prefix"} + + plugin_image="ghcr.io/opensource-observer/cloudquery-${plugin_name}:${tag}" + + echo "Building ${plugin_name} plugin" + docker build -t ${plugin_image} \ + --build-arg PLUGIN_NAME=${plugin_name} \ + --build-arg BASE_IMAGE=${ts_base_image} \ + -f docker/cloudquery/ts.Dockerfile \ + . + echo "Publishing the plugin to ${plugin_image}" + docker push ${plugin_image} +done + +for path in $python_plugins; do + plugin_name=$(basename $path) + # Remove the cloudquery prefix + plugin_name=${plugin_name#"$prefix"} + + plugin_cmd=$(echo $plugin_name | sed "s/-/_/g") + plugin_image="ghcr.io/opensource-observer/cloudquery-${plugin_name}:${tag}" + + # Skip the example + if [[ $plugin_name = "example_plugin" ]]; then + continue + fi + echo "Building ${plugin_name} plugin" + + docker build -t ${plugin_image} \ + --build-arg PLUGIN_NAME=${plugin_name} \ + --build-arg PLUGIN_CMD=${plugin_cmd} \ + --build-arg BASE_IMAGE=${ts_base_image} \ + -f docker/cloudquery/py.Dockerfile \ + . + + echo "Publishing the plugin to ${plugin_image}" + docker push ${plugin_image} +done \ No newline at end of file diff --git a/.github/workflows/warehouse-publish-docker-containers.yml b/.github/workflows/warehouse-publish-docker-containers.yml new file mode 100644 index 000000000..a8b9b7720 --- /dev/null +++ b/.github/workflows/warehouse-publish-docker-containers.yml @@ -0,0 +1,40 @@ +name: warehouse-publish-cloudquery-plugins +env: + X_GITHUB_GRAPHQL_API: ${{ vars.X_GITHUB_GRAPHQL_API }} + X_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + +# This workflow only runs when a commit is completed on main. +on: + # Allows you to run this workflow manually from the Actions tab + push: + branches: + - main + +jobs: + warehouse-publish-docker-containers: + name: warehouse-publish-docker-containers + environment: indexer + runs-on: ubuntu-latest + + permissions: + packages: write + + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 1 + + - name: 'Login to GitHub Container Registry' + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Package and publish cloudquery plugins + run: bash .github/scripts/publish-cloudquery-plugins.sh + + - name: Package and publish other docker containers + run: bash .github/scripts/publish-docker-containers-plugins.sh + \ No newline at end of file diff --git a/a.out b/a.out new file mode 100644 index 000000000..e69de29bb diff --git a/boop.txt b/boop.txt new file mode 100644 index 000000000..b1b3d95ff --- /dev/null +++ b/boop.txt @@ -0,0 +1,40 @@ +01:07:33 Running with dbt=1.7.9 +01:07:33 Registered adapter: bigquery=1.7.6 +01:07:33 Found 112 models, 33 sources, 0 exposures, 0 metrics, 463 macros, 0 groups, 0 semantic models +01:07:33 +01:07:34 Concurrency: 32 threads (target='production') +01:07:34 +01:07:34 Compiled node 'playground__ossd_collections' is: + + +with __dbt__cte__playground__project_filter as ( + + +SELECT * FROM UNNEST([ + "gitcoin", + "opensource-observer", + "uniswap", + "velodrome", + "ethereum-attestation-service", + "zora", + "libp2p", + "rabbit-hole", + "safe-global", + "aave" +]) as project_slug +), filtered_collections as ( + select distinct + collections.collection_name as `name`, + collections.sync_time as `sync_time` + from `opensource-observer`.`oso`.`stg_ossd__current_collections` as collections + cross join UNNEST(collections.projects) as project_name + inner join `opensource-observer`.`oso`.`stg_ossd__current_projects` as projects + on projects.project_name = project_name + where project_name IN (select * from __dbt__cte__playground__project_filter) +) + +select collections.* +from `opensource-observer`.`oso`.`collections_ossd` as collections +inner join filtered_collections as filtered + on filtered.name = collections.name + and collections._cq_sync_time = filtered.sync_time diff --git a/docker/cloudquery/py-base.Dockerfile b/docker/cloudquery/py-base.Dockerfile new file mode 100644 index 000000000..ed89157aa --- /dev/null +++ b/docker/cloudquery/py-base.Dockerfile @@ -0,0 +1,9 @@ +FROM python:3.12-bookworm + +RUN pip install poetry + +COPY . /usr/src/app + +WORKDIR /usr/src/app + +RUN poetry install diff --git a/docker/cloudquery/py.Dockerfile b/docker/cloudquery/py.Dockerfile new file mode 100644 index 000000000..d08df2762 --- /dev/null +++ b/docker/cloudquery/py.Dockerfile @@ -0,0 +1,7 @@ +ARG BASE_IMAGE=ghcr.io/opensource-observer/cloudquery-py-base:latest + +FROM ${BASE_IMAGE} + +ARG PLUGIN_NAME + +ENTRYPOINT [ "${PLUGIN_NAME}" ] \ No newline at end of file diff --git a/docker/cloudquery/ts-base.Dockerfile b/docker/cloudquery/ts-base.Dockerfile new file mode 100644 index 000000000..e5e477c08 --- /dev/null +++ b/docker/cloudquery/ts-base.Dockerfile @@ -0,0 +1,9 @@ +FROM node:20 as build + +RUN npm install -g pnpm@^9.0.0 + +COPY . /usr/src/app + +WORKDIR /usr/src/app + +RUN pnpm install && pnpm build:cloudquery \ No newline at end of file diff --git a/docker/cloudquery/ts.Dockerfile b/docker/cloudquery/ts.Dockerfile new file mode 100644 index 000000000..dcb4c4b46 --- /dev/null +++ b/docker/cloudquery/ts.Dockerfile @@ -0,0 +1,9 @@ +ARG BASE_IMAGE=ghcr.io/opensource-observer/cloudquery-ts-base:latest + +FROM ${BASE_IMAGE} + +ARG PLUGIN_NAME + +WORKDIR /usr/src/app/warehouse/cloudquery-${PLUGIN_NAME} + +ENTRYPOINT [ "pnpm", "node", "--loader", "ts-node/esm", "src/main.ts" ] \ No newline at end of file diff --git a/docker/images/cloudflare-tunnel/Dockerfile b/docker/images/cloudflare-tunnel/Dockerfile new file mode 100644 index 000000000..7ed0f4896 --- /dev/null +++ b/docker/images/cloudflare-tunnel/Dockerfile @@ -0,0 +1,6 @@ +FROM ghcr.io/strrl/cloudflare-tunnel-ingress-controller:latest as binary + +FROM alpine:3.19 +COPY --from=binary /usr/bin/cloudflare-tunnel-ingress-controller /usr/bin/cloudflare-tunnel-ingress-controller +COPY ./cf-tunnel-wrapper.sh /usr/bin/cf-tunnel-wrapper.sh + diff --git a/docker/images/cloudflare-tunnel/cf-tunnel-wrapper.sh b/docker/images/cloudflare-tunnel/cf-tunnel-wrapper.sh new file mode 100644 index 000000000..cdcdd7eee --- /dev/null +++ b/docker/images/cloudflare-tunnel/cf-tunnel-wrapper.sh @@ -0,0 +1,9 @@ +# This is to enable the use of kube-secrets-init +#!/bin/sh +cloudflare-tunnel-ingress-controller \ +--ingress-class=${INGRESS_CLASS} \ +--controller-class=${CONTROLLER_CLASS} \ +--cloudflare-api-token=${CLOUDFLARE_API_TOKEN} \ +--cloudflare-account-id=${CLOUDFLARE_ACCOUNT_ID} \ +--cloudflare-tunnel-name=${CLOUDFLARE_TUNNEL_NAME} \ +--namespace=${NAMESPACE} diff --git a/docker/images/dagster-dask.Dockerfile b/docker/images/dagster-dask.Dockerfile new file mode 100644 index 000000000..ee363fa25 --- /dev/null +++ b/docker/images/dagster-dask.Dockerfile @@ -0,0 +1,37 @@ +FROM ubuntu:jammy + +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && \ + apt-get install -y software-properties-common && \ + add-apt-repository ppa:deadsnakes/ppa && \ + apt-get update && \ + apt-get install -y python3.12 +RUN apt-get install -y curl && \ + curl -o get-pip.py https://bootstrap.pypa.io/get-pip.py && \ + python3.12 get-pip.py +RUN pip3.12 install poetry + + +RUN mkdir -p /usr/bin/app && \ + bash -c "mkdir -p /usr/bin/app/warehouse/{bq2cloudsql,oso_dagster,oso_lets_go,common}" && \ + touch /usr/bin/app/warehouse/bq2cloudsql/__init__.py && \ + touch /usr/bin/app/warehouse/bq2cloudsql/script.py && \ + touch /usr/bin/app/warehouse/oso_dagster/__init__.py && \ + touch /usr/bin/app/warehouse/oso_lets_go/__init__.py && \ + touch /usr/bin/app/warehouse/oso_lets_go/wizard.py && \ + touch /usr/bin/app/warehouse/common/__init__.py + +WORKDIR /usr/bin/app +COPY pyproject.toml poetry.lock /usr/bin/app/ +COPY warehouse/cloudquery-example-plugin /usr/bin/app/warehouse/cloudquery-example-plugin + +# Install everything onto the system path +RUN poetry config virtualenvs.create false && \ + poetry install + +RUN rm -r /usr/bin/app/warehouse + +COPY . /usr/bin/app + +RUN poetry config virtualenvs.create false && \ + poetry install \ No newline at end of file diff --git a/ops/helm-charts/oso-dagster/Chart.yaml b/ops/helm-charts/oso-dagster/Chart.yaml index 1a6b73156..c43899a1c 100644 --- a/ops/helm-charts/oso-dagster/Chart.yaml +++ b/ops/helm-charts/oso-dagster/Chart.yaml @@ -3,7 +3,7 @@ name: oso-dagster description: Extension of the dagster template type: application -version: 0.1.1 +version: 0.1.2 appVersion: "1.16.0" dependencies: - name: dagster diff --git a/ops/k8s-apps/production/custom-helm-values.yaml b/ops/k8s-apps/production/custom-helm-values.yaml index 372f46804..85c6c2f47 100644 --- a/ops/k8s-apps/production/custom-helm-values.yaml +++ b/ops/k8s-apps/production/custom-helm-values.yaml @@ -8,6 +8,4 @@ spec: secretPrefix: "gcp:secretmanager:production-dagster" dagster: global: - serviceAccountName: production-dagster - global: - serviceAccountName: production-dagster \ No newline at end of file + serviceAccountName: production-dagster \ No newline at end of file diff --git a/oso/dbtdag/__init__.py b/oso/dbtdag/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/oso/dbtdag/export.py b/oso/dbtdag/export.py new file mode 100644 index 000000000..351069909 --- /dev/null +++ b/oso/dbtdag/export.py @@ -0,0 +1,78 @@ +# Setup imports +import click +from dbt import flags +from dbt.cli.main import cli, global_flags +from dbt.cli import requires, params as p +from dbt.config.profile import read_user_config +from dbt.tracking import User, active_user +from dbt.task.list import ListTask +from dbt.graph.queue import GraphQueue + + +# We need to initialize a click command in order to parse the arguments. This +# seems to be the easiest method to get all the necessary arguments used to call +# the things we need to call +# +# WARNING: This is not a very stable set of code it seems. We are getting most +# of these from here (from the list() function in this code) +# https://github.com/dbt-labs/dbt-core/blob/e4fe839e4574187b574473596a471092267a9f2e/core/dbt/cli/main.py +# +@cli.command("export_list_task") +@click.pass_context +@global_flags +@p.exclude +@p.indirect_selection +@p.models +@p.output +@p.output_keys +@p.profile +@p.profiles_dir +@p.project_dir +@p.resource_type +@p.raw_select +@p.selector +@p.state +@p.defer_state +@p.deprecated_state +@p.target +@p.target_path +@p.vars +@requires.postflight +@requires.preflight +@requires.profile +@requires.project +@requires.runtime_config +@requires.manifest +def export_list_task(ctx, **kwargs): + print(ctx.obj["flags"]) + task = ListTask(ctx.obj["flags"], ctx.obj["runtime_config"], ctx.obj["manifest"]) + return task, True + + +def call_export_list_task(target, project_dir=None): + args = ["export_list_task", "--target", target] + + if project_dir: + args.append("--project-dir") + args.append(project_dir) + + ctx = cli.make_context( + cli.name, + ["export_list_task", "--target", target], + ) + + ctx.obj = {"manifest": None, "callbacks": []} + results, success = cli.invoke(ctx) + if not success: + raise Exception("invocation was not successful") + return results + + +def get_graph_queue_scores(target, project_dir=None): + task = call_export_list_task(target, project_dir) + + task.compile_manifest() + graph = task.graph.graph + + queue = GraphQueue(graph, task.manifest, ()) + return queue._get_scores(graph) diff --git a/test_all.sh b/test_all.sh new file mode 100644 index 000000000..dc880e198 --- /dev/null +++ b/test_all.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -euxo pipefail + +dagster asset materialize -m oso_dagster.definitions --select base_blocks +dagster asset materialize -m oso_dagster.definitions --select base_transactions +dagster asset materialize -m oso_dagster.definitions --select base_traces +dagster asset materialize -m oso_dagster.definitions --select frax_transactions +dagster asset materialize -m oso_dagster.definitions --select mode_transactions +dagster asset materialize -m oso_dagster.definitions --select pgn_transactions +dagster asset materialize -m oso_dagster.definitions --select frax_blocks +dagster asset materialize -m oso_dagster.definitions --select frax_traces +dagster asset materialize -m oso_dagster.definitions --select mode_blocks +dagster asset materialize -m oso_dagster.definitions --select mode_traces +dagster asset materialize -m oso_dagster.definitions --select pgn_blocks +dagster asset materialize -m oso_dagster.definitions --select pgn_traces +dagster asset materialize -m oso_dagster.definitions --select zora_blocks +dagster asset materialize -m oso_dagster.definitions --select zora_transactions +dagster asset materialize -m oso_dagster.definitions --select zora_traces diff --git a/warehouse/ansible-collection/integration/README.md b/warehouse/ansible-collection/integration/README.md new file mode 100644 index 000000000..90295e8bf --- /dev/null +++ b/warehouse/ansible-collection/integration/README.md @@ -0,0 +1,3 @@ +# Ansible Collection - opensource-observer.integration + +Tools for managing a direct datasore integration into opensource observer. diff --git a/warehouse/ansible-collection/integration/galaxy.yml b/warehouse/ansible-collection/integration/galaxy.yml new file mode 100644 index 000000000..537058b9c --- /dev/null +++ b/warehouse/ansible-collection/integration/galaxy.yml @@ -0,0 +1,75 @@ +### REQUIRED +# The namespace of the collection. This can be a company/brand/organization or product namespace under which all +# content lives. May only contain alphanumeric lowercase characters and underscores. Namespaces cannot start with +# underscores or numbers and cannot contain consecutive underscores +namespace: opensource-observer + +# The name of the collection. Has the same character restrictions as 'namespace' +name: integration + +# The version of the collection. Must be compatible with semantic versioning +version: 0.1.0 + +# The path to the Markdown (.md) readme file. This path is relative to the root of the collection +readme: README.md + +# A list of the collection's content authors. Can be just the name or in the format 'Full Name (url) +# @nicks:irc/im.site#channel' +authors: +- Kariba Labs + + +### OPTIONAL but strongly recommended +# A short summary description of the collection +description: A set of tools to do data integrations with your database + +# Either a single license or a list of licenses for content inside of a collection. Ansible Galaxy currently only +# accepts L(SPDX,https://spdx.org/licenses/) licenses. This key is mutually exclusive with 'license_file' +license: +- Apache-2.0 + +# The path to the license file for the collection. This path is relative to the root of the collection. This key is +# mutually exclusive with 'license' +license_file: 'LICENSE' + +# A list of tags you want to associate with the collection for indexing/searching. A tag name has the same character +# requirements as 'namespace' and 'name' +tags: [ + 'oso', + 'opensource-observer', + 'datascience' +] + +# Collections that this collection requires to be installed for it to be usable. The key of the dict is the +# collection label 'namespace.name'. The value is a version range +# L(specifiers,https://python-semanticversion.readthedocs.io/en/latest/#requirement-specification). Multiple version +# range specifiers can be set and are separated by ',' +dependencies: { + "community.postgresql": ">=2.9.0" +} + +# The URL of the originating SCM repository +repository: http://github.com/opensource-observer/oso + +# The URL to any online docs +documentation: http://docs.example.com + +# The URL to the homepage of the collection/project +homepage: http://example.com + +# The URL to the collection issue tracker +issues: http://example.com/issue/tracker + +# A list of file glob-like patterns used to filter any files or directories that should not be included in the build +# artifact. A pattern is matched from the relative path of the file or directory of the collection directory. This +# uses 'fnmatch' to match the files or directories. Some directories and files like 'galaxy.yml', '*.pyc', '*.retry', +# and '.git' are always filtered. Mutually exclusive with 'manifest' +build_ignore: [] + +# A dict controlling use of manifest directives used in building the collection artifact. The key 'directives' is a +# list of MANIFEST.in style +# L(directives,https://packaging.python.org/en/latest/guides/using-manifest-in/#manifest-in-commands). The key +# 'omit_default_directives' is a boolean that controls whether the default directives are used. Mutually exclusive +# with 'build_ignore' +# manifest: null + diff --git a/warehouse/ansible-collection/integration/meta/runtime.yml b/warehouse/ansible-collection/integration/meta/runtime.yml new file mode 100644 index 000000000..20f709edf --- /dev/null +++ b/warehouse/ansible-collection/integration/meta/runtime.yml @@ -0,0 +1,52 @@ +--- +# Collections must specify a minimum required ansible version to upload +# to galaxy +# requires_ansible: '>=2.9.10' + +# Content that Ansible needs to load from another location or that has +# been deprecated/removed +# plugin_routing: +# action: +# redirected_plugin_name: +# redirect: ns.col.new_location +# deprecated_plugin_name: +# deprecation: +# removal_version: "4.0.0" +# warning_text: | +# See the porting guide on how to update your playbook to +# use ns.col.another_plugin instead. +# removed_plugin_name: +# tombstone: +# removal_version: "2.0.0" +# warning_text: | +# See the porting guide on how to update your playbook to +# use ns.col.another_plugin instead. +# become: +# cache: +# callback: +# cliconf: +# connection: +# doc_fragments: +# filter: +# httpapi: +# inventory: +# lookup: +# module_utils: +# modules: +# netconf: +# shell: +# strategy: +# terminal: +# test: +# vars: + +# Python import statements that Ansible needs to load from another location +# import_redirection: +# ansible_collections.ns.col.plugins.module_utils.old_location: +# redirect: ansible_collections.ns.col.plugins.module_utils.new_location + +# Groups of actions/modules that take a common set of options +# action_groups: +# group_name: +# - module1 +# - module2 diff --git a/warehouse/ansible-collection/integration/playbooks/setup_postgres_replication.yml b/warehouse/ansible-collection/integration/playbooks/setup_postgres_replication.yml new file mode 100644 index 000000000..8b90cd1fa --- /dev/null +++ b/warehouse/ansible-collection/integration/playbooks/setup_postgres_replication.yml @@ -0,0 +1,10 @@ +# Sets up a postgres replication +- hosts: localhost + vars: + postgres_db: postgres + postgres_user: postgres + postgres_password: password + postgres_host: 127.0.0.1 + postgres_oso_user_password: password + roles: + - postgres \ No newline at end of file diff --git a/warehouse/ansible-collection/integration/plugins/README.md b/warehouse/ansible-collection/integration/plugins/README.md new file mode 100644 index 000000000..67a66d4cd --- /dev/null +++ b/warehouse/ansible-collection/integration/plugins/README.md @@ -0,0 +1,31 @@ +# Collections Plugins Directory + +This directory can be used to ship various plugins inside an Ansible collection. Each plugin is placed in a folder that +is named after the type of plugin it is in. It can also include the `module_utils` and `modules` directory that +would contain module utils and modules respectively. + +Here is an example directory of the majority of plugins currently supported by Ansible: + +``` +└── plugins + ├── action + ├── become + ├── cache + ├── callback + ├── cliconf + ├── connection + ├── filter + ├── httpapi + ├── inventory + ├── lookup + ├── module_utils + ├── modules + ├── netconf + ├── shell + ├── strategy + ├── terminal + ├── test + └── vars +``` + +A full list of plugin types can be found at [Working With Plugins](https://docs.ansible.com/ansible-core/2.16/plugins/plugins.html). diff --git a/warehouse/ansible-collection/integration/roles/postgres/README.md b/warehouse/ansible-collection/integration/roles/postgres/README.md new file mode 100644 index 000000000..b282b6504 --- /dev/null +++ b/warehouse/ansible-collection/integration/roles/postgres/README.md @@ -0,0 +1,31 @@ +# Role Name + +A brief description of the role goes here. + +## Requirements + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +## Role Variables + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +## Dependencies + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +## Example Playbook + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +## License + +BSD + +## Author Information + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/warehouse/ansible-collection/integration/roles/postgres/defaults/main.yml b/warehouse/ansible-collection/integration/roles/postgres/defaults/main.yml new file mode 100644 index 000000000..10302bc91 --- /dev/null +++ b/warehouse/ansible-collection/integration/roles/postgres/defaults/main.yml @@ -0,0 +1,8 @@ +--- +# defaults file for postgres +postgres_db: postgres +postgres_port: 5432 +postgres_oso_user_name: oso_replication +postgres_oso_user_expiration: infinity +postgres_oso_replication_slot_name: oso_replication_slot +postgres_oso_publication_name: oso_publication diff --git a/warehouse/ansible-collection/integration/roles/postgres/handlers/main.yml b/warehouse/ansible-collection/integration/roles/postgres/handlers/main.yml new file mode 100644 index 000000000..acc64a600 --- /dev/null +++ b/warehouse/ansible-collection/integration/roles/postgres/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for postgres diff --git a/warehouse/ansible-collection/integration/roles/postgres/meta/main.yml b/warehouse/ansible-collection/integration/roles/postgres/meta/main.yml new file mode 100644 index 000000000..c572acc9f --- /dev/null +++ b/warehouse/ansible-collection/integration/roles/postgres/meta/main.yml @@ -0,0 +1,52 @@ +galaxy_info: + author: your name + description: your role description + company: your company (optional) + + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + + # Choose a valid license ID from https://spdx.org - some suggested licenses: + # - BSD-3-Clause (default) + # - MIT + # - GPL-2.0-or-later + # - GPL-3.0-only + # - Apache-2.0 + # - CC-BY-4.0 + license: license (GPL-2.0-or-later, MIT, etc) + + min_ansible_version: 2.1 + + # If this a Container Enabled role, provide the minimum Ansible Container version. + # min_ansible_container_version: + + # + # Provide a list of supported platforms, and for each platform a list of versions. + # If you don't wish to enumerate all versions for a particular platform, use 'all'. + # To view available platforms and versions (or releases), visit: + # https://galaxy.ansible.com/api/v1/platforms/ + # + # platforms: + # - name: Fedora + # versions: + # - all + # - 25 + # - name: SomePlatform + # versions: + # - all + # - 1.0 + # - 7 + # - 99.99 + + galaxy_tags: [] + # List tags for your role here, one per line. A tag is a keyword that describes + # and categorizes the role. Users find roles by searching for tags. Be sure to + # remove the '[]' above, if you add tags to this list. + # + # NOTE: A tag is limited to a single word comprised of alphanumeric characters. + # Maximum 20 tags per role. + +dependencies: [] + # List your role dependencies here, one per line. Be sure to remove the '[]' above, + # if you add dependencies to this list. diff --git a/warehouse/ansible-collection/integration/roles/postgres/tasks/main.yml b/warehouse/ansible-collection/integration/roles/postgres/tasks/main.yml new file mode 100644 index 000000000..765d0bf3b --- /dev/null +++ b/warehouse/ansible-collection/integration/roles/postgres/tasks/main.yml @@ -0,0 +1,46 @@ +--- +- name: Set the wal_level to logical + community.postgresql.postgresql_set: + db: '{{ postgres_db }}' + login_host: '{{ postgres_host }}' + port: '{{ postgres_port }}' + login_user: '{{ postgres_user }}' + login_password: '{{ postgres_password }}' + name: wal_level + value: "logical" + +- name: Create a user for OSO + community.postgresql.postgresql_user: + db: '{{ postgres_db }}' + login_host: '{{ postgres_host }}' + port: '{{ postgres_port }}' + login_user: '{{ postgres_user }}' + login_password: '{{ postgres_password }}' + name: '{{ postgres_oso_user_name }}' + password: '{{ postgres_oso_user_password }}' + expires: '{{ postgres_oso_user_expiration }}' + role_attr_flags: 'REPLICATION' + state: present + +- name: Create a logical replication slot to the database + community.postgresql.postgresql_slot: + db: '{{ postgres_db }}' + login_host: '{{ postgres_host }}' + port: '{{ postgres_port }}' + login_user: '{{ postgres_user }}' + login_password: '{{ postgres_password }}' + name: '{{ postgres_oso_replication_slot_name }}' + slot_type: logical + state: present + output_plugin: pgoutput + +- name: Create a new publication for all the specified tables + community.postgresql.postgresql_publication: + db: '{{ postgres_db }}' + login_host: '{{ postgres_host }}' + port: '{{ postgres_port }}' + login_user: '{{ postgres_user }}' + login_password: '{{ postgres_password }}' + name: '{{ postgres_oso_publication_name }}' + tables: '{{ postgres_oso_publication_tables }}' + state: present diff --git a/warehouse/ansible-collection/integration/roles/postgres/tests/inventory b/warehouse/ansible-collection/integration/roles/postgres/tests/inventory new file mode 100644 index 000000000..878877b07 --- /dev/null +++ b/warehouse/ansible-collection/integration/roles/postgres/tests/inventory @@ -0,0 +1,2 @@ +localhost + diff --git a/warehouse/ansible-collection/integration/roles/postgres/tests/test.yml b/warehouse/ansible-collection/integration/roles/postgres/tests/test.yml new file mode 100644 index 000000000..728654a51 --- /dev/null +++ b/warehouse/ansible-collection/integration/roles/postgres/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + remote_user: root + roles: + - postgres diff --git a/warehouse/ansible-collection/integration/roles/postgres/vars/main.yml b/warehouse/ansible-collection/integration/roles/postgres/vars/main.yml new file mode 100644 index 000000000..e6e9d7c6d --- /dev/null +++ b/warehouse/ansible-collection/integration/roles/postgres/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for postgres diff --git a/warehouse/ansible-collection/integration/setup_postgres_replication.yml b/warehouse/ansible-collection/integration/setup_postgres_replication.yml new file mode 100644 index 000000000..6d5cde09d --- /dev/null +++ b/warehouse/ansible-collection/integration/setup_postgres_replication.yml @@ -0,0 +1,13 @@ +# Sets up a postgres replication +- hosts: localhost + vars: + postgres_db: postgres + postgres_user: postgres + postgres_password: postgres + postgres_host: 127.0.0.1 + postgres_oso_user_password: password + postgres_oso_publication_tables: + - foo + - bar + roles: + - postgres diff --git a/warehouse/playground_source/.cache/model_definition/0_95_23_15_49___db___sqlmesh_example___full_model__4157663659 b/warehouse/playground_source/.cache/model_definition/0_95_23_15_49___db___sqlmesh_example___full_model__4157663659 new file mode 100644 index 0000000000000000000000000000000000000000..1e4273c4239d888dc6da55b399c2f835d08018bc GIT binary patch literal 1353 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 literal 0 HcmV?d00001 diff --git a/warehouse/playground_source/.cache/model_definition/0_95_23_15_49__models__incremental_model__1715376661_6757677__3237680129__db b/warehouse/playground_source/.cache/model_definition/0_95_23_15_49__models__incremental_model__1715376661_6757677__3237680129__db new file mode 100644 index 0000000000000000000000000000000000000000..ea81276d546e326e1f0f084ea5f037e9b31b1af3 GIT binary patch literal 1976 zcmV;p2S@lHiwFo{m_B9%|1e)UHD59_UokabG&x^iZEs{{Y;#{Mb3Wo>0{bYW~? zZEs{{Y+qk7H!(FcH#RmlF<&+}H8(alH(y^fGBY z)kzad%SWXMTvbuhHZf_X7FAr5CT?k(Y*FeGdI-zdJMrvhKb-wY8lfU0K}FDrOQ$z3 zNFb#C0dPeeIPf9Cfdfb&u3Wi-fHyO1d%bHr4n&c?-Z%5+z2E!zz1_D{kI+*C;_p72 zqG`*~u*vvk%0?Du^t88STG%5hzK5*3iHo{jb+LtQADOCLO|x~^F>uvqbb!&c=OY&` z^A~3?&d$tUfPY3)RoAf@&CF>?H+SK;k7^!UXEdwn$P`<16}`3`kRkd^ zcz&_!xVR_|EDA9_w!&?_2}>1j=|e_O-B1=*ODiR%Jin}7y{ndQtd!K%dF6VEy~|b^ zIYvh5$cE$YAXifz8w}Z}Cp6td6%(s22E%>f8QdQBbqlLi#|$i6z>x{B=?O5XW;%Wm z->btOPj_q&JX?@UAF{K1OcD4Y7hDuqKG8i!#%cbB2Ds@PI(EU_a3ML(9X&(ycpHSO z1~!1Yt-$fI#@-8PrjA??F!DUjf=YE0?=o1P2EXw=rqEo~v3NKJrx_GzIv5RG zGBp?J0OC5wC|wR9%i7_g!%?i)0j}pF;E^+ABJz`CIjC!loZAPl$TFFR1uegn&?66I z*Fm;KW^N8NoNfpY(jSdgc+Qjf5XNm}2AGlS z;1fOBRujz%N{fPM*FlyzTxtv-S=&Stc#D*Xr(*)r7u zr4B(Nmleo=ecR#L&7*0;LM^fo5_|}BGLmX!DqlrlRp+=SfDo+&RAPFx*-qLKgeZ`c z9L5BSZ9M{X#IvwNmV6Mizmag<>i4@@jkxrk*iNX=Jv!I5;T5Lxh43%Z$qKC=BgAJ} zC)g5cn(#dA@gjk;%Q}=hGLxv~=uzEMJ>S*s8gw#n;=@i(j7+weVzQ$_gYmja7$o@x z?D?oY(@CCuB2IqX>Ezs`bxYiL(&P^dxOg ziwN-iEBxOmN>ze)3sErTeNMfFhNtqDXexy%U7L<%#Myi+9l}&hB_L>&U(@+1NW&-M zngn+QVW&kj@8S($1iOkwzaK@W>FlV2JCNxC+h#qzX7fv6gM5A0CyuRRdz^xk1PT3i=c5n z*AxR^H@%`bh0!N{r>>e%B_@~`p0dt>=qyyPLmI1Im0(K{>nN~4BzHJ62-C;vj_1ej zrR7Wmoi=kDi%BQeYR43sB03N}P&v#ZU?dDuitO9{)7)Keaj0~}D=iuH&@-}W#}FOVoO z2}_PM29FF3bTO)bnrmq3!gRbr{?p|UJ}2-n{uSZA26xc(4uR?t!_%6$iaR_`vsbad zgR$L?1*f({N5>fNjs=)$oa!#7Ls0h&xHh-K%lTCl8-w{2EV`JSf?L{*39d9b#PQ0h z5oSz+I1*IQlf$-_&@$6m3jlAN>~3|4y>Yzj?v9l3;C5-bv``jZ9vZFumh~imw77UW ze{J>FidYe+jaDk=*Iq8Imc*jg&cfAFd974Z3Ue*o3iHZhVJ_l-IKmHmPT*Ftd_*97 z(A1zMYhqFld(=-645!GLLVi)muVE{K$$Z|_k$30}lCwA`VPi1~GK?|OJRa=%9&(yS z;`sQKWi0Vc=Y)Q_-?-H^P{vF0gpR|ZF$cmn1P-i@NP`pxye8F08*!V1cY4UB*|A<^ zyv}z>@8sq_y-T#=|KMGFXBG}__Hcklko1suc5tiZpxoT2gUS9+{#2kp{vCeKIhMZs_nfhzCYmV0^(1X;EeqdvXN^BoA%y*FYIm znm<1$!LGfRI KYu7?-6#xJz#I33T literal 0 HcmV?d00001 diff --git a/warehouse/playground_source/.cache/model_definition/0_95_23_15_49__models__incremental_model__1715376661_6757677__387428011__db b/warehouse/playground_source/.cache/model_definition/0_95_23_15_49__models__incremental_model__1715376661_6757677__387428011__db new file mode 100644 index 0000000000000000000000000000000000000000..c6b7c71589adb9131160d1e7d4b51692f87fb4e4 GIT binary patch literal 1975 zcmV;o2T1rIiwFqHlRjny|1e)UHD59_UokabG&x^iZEs{{Y;#{Mb3Wo>0{bYW~? zZEs{{Y+qk7H!(FcH#RmlF<&+}H8(alH(y^fI5#vhI506WUteTm0Hs*XZyQAvPZNLD zNfS!TN2Lf{RZ-G5F=?e1Ra}xLZfTlqQR)(U2+P?KN zY0J^D$@pc;MiyrDw6|qi*dr>whpf7Zi@IHPv4w3PnW|h(vvt=oaMfpYfYG$)BNs07 z7iTZd&dgqbe@0VP*RdJR%xOqBcj32>Y93o>G^^>z6kBr@y|xu#mrFNwTjNHMA^J>s zezEGfxF`-R3Nbyl!fm|?OBHVELq<>CP!?88Dt#hU4xaS5qAu4B4kAG~GiL6RR!;!+qfy+#dFI3#(Pf3@lr~kqNKq2{5Q;I(`w~ ztHT~ocWe(lTaZg1va@?k5%?h&TohM6(LF}SY5s-=xak`@cEQ|mAvw(*Jwx+&8-%I` zHh{XV!11xh-V11^j$9Bh@;uFgN_7+OGFYAlzwte$&|KBAcsM+`POJWI9g7PK`v^{l zTLgK8DZv9)p=qDH3i3g%0-xC`f+#vQkdpHXnO4Y*LW&A`K_RpE1zaAvD0gN6HVZ*m za}#%GCajqWjRgT61>1bx2MDmHR(5$nN2+Gv`PgmV7}M|u3QS*Z93~E@85C$b7!6x8 zH5cgs;yTADT@E12+To$YQLNViuID1)kuzi>@{?mZsB4Uz+Xt`6GMR=2Ex(k|BM)TP zLAFF@ZVoh@ZU_(3AB|Ob&YeEaITAky>gqiBoO{J}>e%&n+ui1#qy;t*#%*Km+u_;GqiMoIEwT_2d*!d=Rt0k#OAV_q$n*xb&UaPN>g4I@h(~6{hlq@GsKI3auU^#AjJ2 z*b-@)@I37CB7w5YI+Qyylc?qBQQcEL-_`9JbTV+_!%j|&OtzR}vZFzR@w!PEB>4sG z`KUe9NuGQnPJZ0!qt2%eB~E>V*K4y+LPms*a*uwsa%-`)9D>e?vk=SlByCQM z2=M$X{NE@_Rf2a5Q849wPQ8VOr}CC)DupRsn~r3}*?cPA4R6=?5Kh}km&*2W<9-T^GjfZe0|p^j;&&QoAcL*q1y&h zEd*{zI?dHlbraP<7l?;l$MIWIItY9-K3A4rCeECKL~pm9Fe z6a!y3y`ngU(IcSF{*!>YiQ}hbi6_S)8!C8C-5--72&=HchK|>f$9>&)0()7J3LOaSFyi? zvE7aZr?x{!#~AO91(<1^>Mo{3Q1=YDHn+md`BfAfgZUIJx|p1TTiT2Xt~5Es@ye+Y zW=w)O5>(KW!?u>tGSgWL0B@Y^Zgq&galGs9j+F4=c4@h^P!?St8m;`6^(23^xOh5$ zZS~fQSP`deo@G;VJm{keBRWNcjyd~vp6SVV=)Obj4{$Y9_;xZa+*fs z`1q7%Eb&d}gnqf-xYadK#!K>qj>Dlb2f{W44y=wygA@k5Ce=q9ahrp8ddQ{Ov0h}n z&UZ-ffp9f{zfd%f`S ztsXw~*X*NeqRqaU3*>St?4{h+*Kp9l! zFK^^NiA#%W*PG8bvO^o3K8?@dBN8-jb04Vu*aH<|sqtk(ukkhCw4@l{!1uoKEqp4* zcl?ukDK+-;()eEN_@S{Q^shMt#Qo!1KZeDz5v&OuuM3&f@ll|;1XOgG1tfey@n3&y J*FtO+004rRt=Iqn literal 0 HcmV?d00001 diff --git a/warehouse/playground_source/.cache/model_definition/0_95_23_15_49__models__incremental_model__1715385339_6193233__3914696475__memory b/warehouse/playground_source/.cache/model_definition/0_95_23_15_49__models__incremental_model__1715385339_6193233__3914696475__memory new file mode 100644 index 0000000000000000000000000000000000000000..71e5398429bc1dd249cdfc2cd24adec25c8e18f0 GIT binary patch literal 1985 zcmV;y2R`^8iwFn+v_578|1e)UHD59_UokabG&x^iZEs{{Y;#{Mb3Wo>0{bYW~? zZEs{{Y+qk7H!(FcI5jgfIbSw0IWsadGhbgbIWaUgIW{ymHD6zCWo>VAc>twY&2Jk; z6i*Y|ahy0@ zxO98tf&@b99{^Xxfdd~B95{dk;>wjP2zYO1ZLfE2$AKua*ZXGPy!U$_zqk8#=8^tX zpZL2UPVlVdXw(exGGh~qhWwPbX|a9Ox8ePMcP`aJxHJX3KUJLI_;jp*hM{Ps!J3s*xvsOiKMTk~srbu*wYN;h;{ zLnGJ#eEd5(k!qm>*d}TW`Qp1ucCT@{`w=0gQq`qkxGy||+e5x?QMKZjfn^Iga?v$E z4hB_C$1l-)HQ3|nj_rYGb8_j!@XT(g2>gf(E{ZFk>0Zc2dEvSSxasRUb-~BKMJ<_x(^UgOEX{`|Pp*Y^F0NHaf0NH6a7W;{K_Ul^6&hCL{ zY>`dEf~Idu5s=NI_Gu|=Nw9&1GRMye9ph(IyLJ0JFRY` zCs~0FgmR0R0S(zT@QI&jsf$JxWkpf6>R<~9mzuyw);H4x-XblMDVc)wSi1Hj&)p85 zvx_MuBZ-Dm4-%@l*d|Eqk^(iLZ#kIZ7)=uvYO#fodcvXA?{~7Ap!A)@PN>mcKGU)36(QM5;Orw_PhjmZ&d{?)t(9OV!58F90JlE?WS zF#;XQvzW;AG<8mj2w?sd|8EqfD#5+QIGFN2(r>Zusk|kcN^wHhCSw_KrqE1>C>1j) z2P@QI`*!5=}?X$dd5bRAg1u29kMj}p^#wpGC&#Poo12R*%N<0Y^`p|;~Q z$5yGmg&a0)=(a&ri+~%FQu8%Z*&tQW1>zysar~x~4*@-|!F1xR8AARv3@pH^>ROFny%vcz)tuR?aohX>+%zn06Aac0}PBrUS_Xox?l=M#3&HV-u>qK)u zN6|bm%?(0jTWXU_fA8Utbo1E9i8fvGj~>oR^#sbZrf%toV`klTEF2~>SMj0+a6oA@ z(IZlQ+oLeSK%&4jEIH2TKh)RP!KmJ8uCAp6(_w@Br^6vQCtw)=ig90^J9u`RL3N4Y z>5jNcIy}k;uTX!RQo9ukq_zV`#~AI51(<1^>@4O3Q1>BlZGH*M`Bjn_g>e!VT})2G zO>M>)Doqb@SUFV|8si|21r_wG@c-PvQg@YSi9KZ;&F7oycZZ;j1n|pLH-T&F2 z3iQXnV-Y-XuNOYP)y0S2ntfbNyxBK$fn7?bapS=_3U*|~rC8Hz?3M_@D}@z&bZb+U z;CCXAps&U`O&Iv7i=P-vX+km_4J)vq-`qz+ibc!-nyB7wx>?caW;{^YH#<1>e}Tur<0n z%8%5ArDz4u%+IbwZ?YEPnb?LGR`7~wkLSdD0et_HgL!mahqpo)7-@m=1sc+%%?9@D zG7L!`S;yBwIa0xwIC7uFrAfD|jb|L$r46J|<1_e(1r2TP0hJ%Spdu_azD(&gzQ#=p zit!D6?-}31r(%4EpXjC3*v(7hd$Hq(`i{uI#vqXN54C;_ixXp5130V;nbgT~ps@s0 Tw3!Dad_n17;1`oVbQJ&q2-3m` literal 0 HcmV?d00001 diff --git a/warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_full_model_2210254270 b/warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_full_model_2210254270 new file mode 100644 index 0000000000000000000000000000000000000000..ed3f5670f9633c5653dc31e81750bfcd4d74662a GIT binary patch literal 899 zcmV-}1AP1+iwFqHlRjny|1e)UHD59_UokabG&x^ib8&2KWpij>Wq4t2aBO8?W_4_A zUu|z>Wo%zEGBGeRH8e6eFaWJq&rcIU6h`c}w2Gn}^dL|gV+tYb!NeN}D9|+E)X)+& zku=-xv@>ykl$~7zCM0^$)HsPGj7RVO1O6o@9{g*3Gu@VD+iDehn(mvK_rC9a@7sNw z_;Q+_P`_ir@49WD+Vl-JYaVt??7`w7z}}JIv+TfXS+1|+!?uSRqprgQPgbyn8@@Od zOYa0a7I~g9ycQF3buGGcU*yRo*VZg*u(RDHrH=T7G6CUa!LBSB`kMgiBMKzyp<+BR%pu-0n+ zQ5&m;jeP^kheyOJ}E{PKZ*~4VT@bPQ%0U7Q?F9u8A!{?sWn(M`p=9 zc|aBr$s)3dNbXpW`|2(koQB{`F9_hKHVogW$_n~Ch8Z9@-3#jB4xU^u6-%fp-iuv9 z(ugM=%p~ZKJo(zN0xS_Fp-D{&I3XV*^Qe~%NIk)pU}sKyKc>@yp}l9jLa?jm}G z4gmCsr}oe`DnCQ2G&W9VNrwiPrpdzggd&SPl!bAvNgcxy9oDP%dL&t1X+kTw0W^3B zXHy%L`OuqKkfiqoxgEPF-qT6YQHb_sv`^6{LTh8k$a3V&$i_b(f;7YjVw)qCXu>$X zkH;cZVw9vp(?g8`=EZ-!izghz#?XX9c@Kov@4;#uHqSVLU2{FK3Yg%o^kwFe8Yzwi zBC3ijT~+uIxniDZdaf-kBe5kH=Oob8MpaGhxqwtntZjdo;FCUqFu`&D#)H8p&HA8e z+yp1JF(Wm6XxMFOD_!1X!mp!dYs`eH1~`f3wg$7RQqB^6yI3M&G{Wmz@&K{l#005-ove^It literal 0 HcmV?d00001 diff --git a/warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_full_model_3783885124 b/warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_full_model_3783885124 new file mode 100644 index 0000000000000000000000000000000000000000..9044c9ff6e193cc4cc96a1f21ccc9a97df54d85d GIT binary patch literal 904 zcmV;319$u%iwFn+v_578|1e)UHD59_UokabG&x^ib8&2KWpij>Wq4t2aBO8?W_4_A zUu|z>Wo%zFH#jpmI5jacGyttu&rcIU6h`cBX%$5|=s}<~#uP)=gNZi|P@rkRsi7rm zqG^`yv@>ykl$~7zCM0^$)HsPGjwj>Yf55-Q#Djm0Z>HO_Y+J2DPt$!f^WOKp?|r+k zQ=h+NCe-gp@S9#cpbmY7t-6n03;VFx53zqJ_$=GETecS%_@M1$#;E5q!SyP(aU&3) z#L^pqjzoc{Ouxm1TwRLqd@c%Pl549rHQC8-l2%6oLYaWDUi9qHaT9Se1EFl$!frsD z6#D~Vo~8kI>ePaI_Cqhgmgt0BZ<~N25M-98p{Du^d??5a*C^mR5QtATJja0z4Axpb zIBa9JaByHk`S6ICj0hCI6MI|>%sm?maw9^i>W0g%QMch^d5dY+9nZqHAh$XpnIp4g zp4=e|h~yAiL?nMC$Zd6(3{FFErWXWoQ|o46)?@{J9-|BpobCmUXb0EV%B3=@iML`$ zkPPCwi-mA=e8QX{3Y zK*UvXp{t4@CRfZ;P2Y2*Wu!Lc;*=TnU|vCi2Dc_{FUFlB;=)s5|qVlA74U-Xf%to|rtE3B8R zwK6K!a@1PNtyXg<|aFtRcL literal 0 HcmV?d00001 diff --git a/warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_incremental_model_1662842126 b/warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_incremental_model_1662842126 new file mode 100644 index 0000000000000000000000000000000000000000..57e6ef6d94210c43852f99ccf1d3d74eb089d797 GIT binary patch literal 1087 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 literal 0 HcmV?d00001 diff --git a/warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_test1_2848966810 b/warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_test1_2848966810 new file mode 100644 index 0000000000000000000000000000000000000000..6b0854905e2a494260576cb84d99a60903af3191 GIT binary patch literal 761 zcmVWq4t2aBO8?bY*jN zF<&w`G&ngnHaIab0IgL)PZLoP)~4M8iV`{KK|va$=%F4ss0R)xN(k|3w8j%@7It7Z z?sm(*w**X@Xrcy^muPgj_y@fE2mEW!+iu}?m&O{})9cQgneY2%-pq&c(WkL<>90fj zTGUp4=)VWA8AHp1m=8M%#QUVDng)(zJqX;LfuPU-8)vJf-Y~xQD}x%`I$NNJz{3bv#ya2jy{9oU%+1+ zBtHiV$o|9ijV^f`#i4bXhj<7Qo3Q7GZ8O%oEnpJ<8uZSGOjzCIffhvD#jH*UVZ=Mc zO7{C~$+)__5>kOr*(gPkkKg*Avn$Kb7L8sbXt1NvpfLmW``HAwH^w^QT;Hqxchl)h rS!31HZ7Jz1@BcfsZryA3TCVNPm*eeOqi-_XPO|$fp literal 0 HcmV?d00001 diff --git a/warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_test2_2806289995 b/warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_test2_2806289995 new file mode 100644 index 0000000000000000000000000000000000000000..512b03028733a90e4868c739cb2fc0b3045771d1 GIT binary patch literal 757 zcmVfiwFq2nm%R(|1e)UHD59_UokabG&x^ib8&2KWpij>Wq4t2aBO8?bY*jN zGG8({Fg7wcIXO8s0IgNQZqq;zEm7jMg+fFRaDbKugjx>f&;xMjp-`xziUmOsr^<5b zO~%5G6Ysi85s}~kYNeGxFum{t-1z~1jakQO9lH@hO->un&dhsnW@kPYk3Y=L#J@hO z>p@4lzWbg#R><2959!d2czA$nQFOhQ7f6%$Iw2Rr4cY>g@tS*lPvQ?;`-H5ItEy;+ zErI%UF@19vSD~Ovo1SZn)7wyvT_m^y$!t6cyvT27>`)=oe9hr)={8*+=FF<#Is~N~ z1(G{>7%8J;6MTuVsLBM#ddCkCDyrlXr5-XhyBGLAT@Z9GS@NL6mF&0}Ic8eTgpmflF$@D{N&@1tuF7xN4tw#I#i+z2NwpFs3OWbN zJ2SCPa6g3!E~QeeQjV*c|Jf>(UCDjx6!6Qm%IOkNVKTmOFCnRY#+L1QI^ZbQjci1f zMWda^%D4UBf?b$`VDo&R8sBnkNj*Ji+aOJGLd~?#Sk1h2z>%)eC0$p=tJ( z`4UlOX&uDkp0Q2x0-wC|Kj&AKo-AmsrqEo+(?O$$>G$&qn%)+>2rDBm_TLSsE+$SK9rzt4^b8Rx|CUznpB%Dt;5mRubl4vRowahX?=w_iAcw literal 0 HcmV?d00001 diff --git a/warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_test2_2848966810 b/warehouse/playground_source/.cache/optimized_query/0_95_23_15_49__sqlmesh_example_test2_2848966810 new file mode 100644 index 0000000000000000000000000000000000000000..549ddf4ea79308794295817b9446d796ff3ae943 GIT binary patch literal 761 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�UCHomwORg`&S+1$3xx6Hhwx%uF-mH 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