From 61fdb9ca30f95f168ac1443389cc2f49b45c2fbd Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 1 Dec 2023 11:46:24 -0500 Subject: [PATCH 001/121] Adding multi cell --- .../cloud/about-cloud/regions-ip-addresses.md | 17 +++++++++++++++-- website/sidebars.js | 2 +- .../static/img/docs/dbt-cloud/find-account.png | Bin 0 -> 149254 bytes 3 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 website/static/img/docs/dbt-cloud/find-account.png diff --git a/website/docs/docs/cloud/about-cloud/regions-ip-addresses.md b/website/docs/docs/cloud/about-cloud/regions-ip-addresses.md index cc1c2531f56..641078f7602 100644 --- a/website/docs/docs/cloud/about-cloud/regions-ip-addresses.md +++ b/website/docs/docs/cloud/about-cloud/regions-ip-addresses.md @@ -1,6 +1,7 @@ --- -title: "Regions & IP addresses" -id: "regions-ip-addresses" +title: "Access, Regions, & IP addresses" +sidebar: "Access, Regions, & IP Addresses" +id: "access-regions-ip-addresses" description: "Available regions and ip addresses" --- @@ -20,6 +21,18 @@ dbt Cloud is [hosted](/docs/cloud/about-cloud/architecture) in multiple regions [^1]: These regions support [multi-tenant](/docs/cloud/about-cloud/tenancy) deployment environments hosted by dbt Labs. +## Accessing your account + +To login to dbt Cloud, use the URL that applies to your environment. Your access URL used will depend on a few factors including location and tenancy: +- **US multi-tenant:** Use your unique URL that starts with your account prefix, followed by `us1.dbt.com`. For example, `abc123.us1.dbt.com`. + - If you are unsure of your access URL, navigate to `us1.dbt.com` and enter your credentials. If you are a member of a single account, you will be logged in and your URL will be displayed in the browser. If you are a member of muliple accounts, you will be presented with a list of options, along with the appropriate login URLs for each + + + +- **EMEA multi-tenant:** Use the URL `emea.dbt.com`. +- **APAC multi-tenant:** Use the URL `au.dbt.com`. +- **Worldwide single-tenant and VPC:** Use the vanity URL provided during your onboarding. + ### Locating your dbt Cloud IP addresses There are two ways to view your dbt Cloud IP addresses: diff --git a/website/sidebars.js b/website/sidebars.js index 473dfe85e04..d02370efe30 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -28,7 +28,7 @@ const sidebarSettings = { "docs/cloud/about-cloud/dbt-cloud-features", "docs/cloud/about-cloud/architecture", "docs/cloud/about-cloud/tenancy", - "docs/cloud/about-cloud/regions-ip-addresses", + "docs/cloud/about-cloud/access-regions-ip-addresses", "docs/cloud/about-cloud/browsers", ], }, // About dbt Cloud directory diff --git a/website/static/img/docs/dbt-cloud/find-account.png b/website/static/img/docs/dbt-cloud/find-account.png new file mode 100644 index 0000000000000000000000000000000000000000..8d9bb5c21d21122ed667404b04c5d59f5f31b7a8 GIT binary patch literal 149254 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Ν!Y!X98 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 Date: Fri, 1 Dec 2023 14:26:50 -0500 Subject: [PATCH 002/121] Updating links to access --- contributing/content-style-guide.md | 6 +++--- website/docs/docs/build/metrics.md | 2 +- website/docs/docs/cloud/billing.md | 2 +- website/docs/docs/cloud/cloud-cli-installation.md | 2 +- .../docs/cloud/connect-data-platform/about-connections.md | 2 +- .../connect-redshift-postgresql-alloydb.md | 2 +- .../docs/docs/cloud/dbt-cloud-ide/develop-in-the-cloud.md | 2 +- website/docs/docs/cloud/git/connect-gitlab.md | 2 +- website/docs/docs/cloud/git/setup-azure.md | 4 ++-- website/docs/docs/cloud/manage-access/invite-users.md | 2 +- .../docs/docs/cloud/manage-access/set-up-bigquery-oauth.md | 2 +- .../docs/cloud/manage-access/set-up-databricks-oauth.md | 2 +- .../docs/docs/cloud/manage-access/set-up-snowflake-oauth.md | 6 +++--- .../docs/cloud/manage-access/set-up-sso-google-workspace.md | 2 +- website/docs/docs/cloud/manage-access/set-up-sso-okta.md | 4 ++-- website/docs/docs/dbt-cloud-apis/discovery-querying.md | 4 ++-- website/docs/docs/dbt-cloud-apis/migrating-to-v2.md | 2 +- website/docs/docs/dbt-cloud-apis/sl-jdbc.md | 2 +- .../release-notes/03-Oct-2023/api-v2v3-limit.md | 2 +- .../docs/dbt-versions/release-notes/03-Oct-2023/sl-ga.md | 2 +- .../release-notes/05-Aug-2023/sl-revamp-beta.md | 2 +- .../dbt-versions/release-notes/07-June-2023/admin-api-rn.md | 2 +- .../release-notes/09-April-2023/api-endpoint-restriction.md | 2 +- .../dbt-versions/release-notes/10-Mar-2023/apiv2-limit.md | 2 +- .../release-notes/11-Feb-2023/feb-ide-updates.md | 2 +- .../26-Sept-2022/liststeps-endpoint-deprecation.md | 2 +- website/docs/docs/deploy/dashboard-status-tiles.md | 6 +++--- website/docs/docs/deploy/run-visibility.md | 2 +- website/docs/docs/deploy/webhooks.md | 4 ++-- .../docs/docs/running-a-dbt-project/using-the-dbt-ide.md | 2 +- website/docs/docs/use-dbt-semantic-layer/tableau.md | 2 +- website/docs/faqs/API/rotate-token.md | 4 ++-- website/docs/faqs/Accounts/transfer-account.md | 4 ++-- ...how-to-use-databricks-workflows-to-run-dbt-cloud-jobs.md | 2 +- website/docs/guides/starburst-galaxy-qs.md | 2 +- website/snippets/_new-sl-setup.md | 2 +- website/snippets/_sl-connect-and-query-api.md | 2 +- website/snippets/_sl-plan-info.md | 2 +- website/snippets/_v2-sl-prerequisites.md | 6 +++--- website/snippets/login_url_note.md | 2 +- website/snippets/sl-public-preview-banner.md | 2 +- website/vercel.json | 2 +- 42 files changed, 56 insertions(+), 56 deletions(-) diff --git a/contributing/content-style-guide.md b/contributing/content-style-guide.md index 0d2bf243d45..ac8bc8192fa 100644 --- a/contributing/content-style-guide.md +++ b/contributing/content-style-guide.md @@ -544,14 +544,14 @@ The file or URL paths begin with: - /reference/ - /community/ -Let's use the Regions & IP Addresses URL as an example: https://docs.getdbt.com/docs/cloud/about-cloud/regions-ip-addresses +Let's use the Regions & IP Addresses URL as an example: https://docs.getdbt.com/docs/cloud/about-cloud/access-regions-ip-addresses If we need to reference this on another page, we can remove the domain entirely: -`For more information about server availability, please refer to our [Regions & IP Addresses page](/docs/cloud/about-cloud/regions-ip-addresses)` +`For more information about server availability, please refer to our [Regions & IP Addresses page](/docs/cloud/about-cloud/access-regions-ip-addresses)` The reader will see: -For more information about server availability, please refer to our [Regions & IP Addresses page](/docs/cloud/about-cloud/regions-ip-addresses) +For more information about server availability, please refer to our [Regions & IP Addresses page](/docs/cloud/about-cloud/access-regions-ip-addresses) You can link to a specific section of the doc with a `#` at the end of the path. Enter the section’s title after the `#`, with individual words separated by hyphens. Let's use the incremental models page, https://docs.getdbt.com/docs/build/incremental-models, as an example: diff --git a/website/docs/docs/build/metrics.md b/website/docs/docs/build/metrics.md index 7afcb41c2e4..87470ba3265 100644 --- a/website/docs/docs/build/metrics.md +++ b/website/docs/docs/build/metrics.md @@ -20,7 +20,7 @@ The dbt Semantic Layer has undergone a [significant revamp](https://www.getdbt.c The dbt_metrics package has been [deprecated](https://docs.getdbt.com/blog/deprecating-dbt-metrics) and replaced with [MetricFlow](/docs/build/about-metricflow?version=1.6), a new framework for defining metrics in dbt. This means dbt_metrics is no longer supported after dbt v1.5 and won't receive any code fixes. We will also remove the dbt_metrics spec and docs when it's fully deprecated. **Who does this affect?**

-Anyone who uses the dbt_metrics package or is integrated with the legacy Semantic Layer. The new Semantic Layer is available to [Team or Enterprise](https://www.getdbt.com/pricing/) multi-tenant dbt Cloud plans [hosted in North America](/docs/cloud/about-cloud/regions-ip-addresses). You must be on dbt v1.6 or higher to access it. All users can define metrics using MetricFlow. Users on dbt Cloud Developer plans or dbt Core can only use it to define and test metrics locally, but can't dynamically query them with integrated tools. +Anyone who uses the dbt_metrics package or is integrated with the legacy Semantic Layer. The new Semantic Layer is available to [Team or Enterprise](https://www.getdbt.com/pricing/) multi-tenant dbt Cloud plans [hosted in North America](/docs/cloud/about-cloud/access-regions-ip-addresses). You must be on dbt v1.6 or higher to access it. All users can define metrics using MetricFlow. Users on dbt Cloud Developer plans or dbt Core can only use it to define and test metrics locally, but can't dynamically query them with integrated tools. **What should you do?**

If you've defined metrics using dbt_metrics or integrated with the legacy Semantic Layer, we **highly** recommend you [upgrade your dbt version](/docs/dbt-versions/upgrade-core-in-cloud) to dbt v1.6 or higher to use MetricFlow or the new dbt Semantic Layer. To migrate to the new Semantic Layer, refer to the dedicated [migration guide](/guides/sl-migration) for more info. diff --git a/website/docs/docs/cloud/billing.md b/website/docs/docs/cloud/billing.md index 31b7689ceb9..e88a2a2d8dd 100644 --- a/website/docs/docs/cloud/billing.md +++ b/website/docs/docs/cloud/billing.md @@ -7,7 +7,7 @@ pagination_next: null pagination_prev: null --- -dbt Cloud offers a variety of [plans and pricing](https://www.getdbt.com/pricing/) to fit your organization’s needs. With flexible billing options that appeal to large enterprises and small businesses and [server availability](/docs/cloud/about-cloud/regions-ip-addresses) worldwide, dbt Cloud is the fastest and easiest way to begin transforming your data. +dbt Cloud offers a variety of [plans and pricing](https://www.getdbt.com/pricing/) to fit your organization’s needs. With flexible billing options that appeal to large enterprises and small businesses and [server availability](/docs/cloud/about-cloud/access-regions-ip-addresses) worldwide, dbt Cloud is the fastest and easiest way to begin transforming your data. ## How does dbt Cloud pricing work? diff --git a/website/docs/docs/cloud/cloud-cli-installation.md b/website/docs/docs/cloud/cloud-cli-installation.md index f3294477611..eaee8b6246b 100644 --- a/website/docs/docs/cloud/cloud-cli-installation.md +++ b/website/docs/docs/cloud/cloud-cli-installation.md @@ -23,7 +23,7 @@ dbt commands are run against dbt Cloud's infrastructure and benefit from: ## Prerequisites -The dbt Cloud CLI is available in all [deployment regions](/docs/cloud/about-cloud/regions-ip-addresses) and for both multi-tenant and single-tenant accounts (Azure single-tenant not supported at this time). +The dbt Cloud CLI is available in all [deployment regions](/docs/cloud/about-cloud/access-regions-ip-addresses) and for both multi-tenant and single-tenant accounts (Azure single-tenant not supported at this time). - Ensure you are using dbt version 1.5 or higher. Refer to [dbt Cloud versions](/docs/dbt-versions/upgrade-core-in-cloud) to upgrade. - Note that SSH tunneling for [Postgres and Redshift](/docs/cloud/connect-data-platform/connect-redshift-postgresql-alloydb) connections and [Single sign-on (SSO)](/docs/cloud/manage-access/sso-overview) doesn't support the dbt Cloud CLI yet. diff --git a/website/docs/docs/cloud/connect-data-platform/about-connections.md b/website/docs/docs/cloud/connect-data-platform/about-connections.md index 93bbf83584f..d388bae4549 100644 --- a/website/docs/docs/cloud/connect-data-platform/about-connections.md +++ b/website/docs/docs/cloud/connect-data-platform/about-connections.md @@ -28,7 +28,7 @@ These connection instructions provide the basic fields required for configuring ## IP Restrictions -dbt Cloud will always connect to your data platform from the IP addresses specified in the [Regions & IP addresses](/docs/cloud/about-cloud/regions-ip-addresses) page. +dbt Cloud will always connect to your data platform from the IP addresses specified in the [Regions & IP addresses](/docs/cloud/about-cloud/access-regions-ip-addresses) page. Be sure to allow traffic from these IPs in your firewall, and include them in any database grants. diff --git a/website/docs/docs/cloud/connect-data-platform/connect-redshift-postgresql-alloydb.md b/website/docs/docs/cloud/connect-data-platform/connect-redshift-postgresql-alloydb.md index 06b9dd62f1a..03303ea8d52 100644 --- a/website/docs/docs/cloud/connect-data-platform/connect-redshift-postgresql-alloydb.md +++ b/website/docs/docs/cloud/connect-data-platform/connect-redshift-postgresql-alloydb.md @@ -46,7 +46,7 @@ Make sure the location of the instance is the same Virtual Private Cloud (VPC) a To configure the SSH tunnel in dbt Cloud, you'll need to provide the hostname/IP of your bastion server, username, and port, of your choosing, that dbt Cloud will connect to. Review the following steps: -- Verify the bastion server has its network security rules set up to accept connections from the [dbt Cloud IP addresses](/docs/cloud/about-cloud/regions-ip-addresses) on whatever port you configured. +- Verify the bastion server has its network security rules set up to accept connections from the [dbt Cloud IP addresses](/docs/cloud/about-cloud/access-regions-ip-addresses) on whatever port you configured. - Set up the user account by using the bastion servers instance's CLI, The following example uses the username `dbtcloud:` ```shell diff --git a/website/docs/docs/cloud/dbt-cloud-ide/develop-in-the-cloud.md b/website/docs/docs/cloud/dbt-cloud-ide/develop-in-the-cloud.md index 9fc382f0217..b3df77a140e 100644 --- a/website/docs/docs/cloud/dbt-cloud-ide/develop-in-the-cloud.md +++ b/website/docs/docs/cloud/dbt-cloud-ide/develop-in-the-cloud.md @@ -105,7 +105,7 @@ The IDE uses developer credentials to connect to your data platform. These devel Set up your developer credentials: -1. Navigate to your **Credentials** under **Your Profile** settings, which you can access at `https://YOUR_ACCESS_URL/settings/profile#credentials`, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan. +1. Navigate to your **Credentials** under **Your Profile** settings, which you can access at `https://YOUR_ACCESS_URL/settings/profile#credentials`, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan. 2. Select the relevant project in the list. 3. Click **Edit** on the bottom right of the page. 4. Enter the details under **Development Credentials**. diff --git a/website/docs/docs/cloud/git/connect-gitlab.md b/website/docs/docs/cloud/git/connect-gitlab.md index e55552e2d86..f68f09ae73d 100644 --- a/website/docs/docs/cloud/git/connect-gitlab.md +++ b/website/docs/docs/cloud/git/connect-gitlab.md @@ -63,7 +63,7 @@ In GitLab, when creating your Group Application, input the following: | **Confidential** | ✔️ | | **Scopes** | ✔️ api | -Replace `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan. +Replace `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan. The application form in GitLab should look as follows when completed: diff --git a/website/docs/docs/cloud/git/setup-azure.md b/website/docs/docs/cloud/git/setup-azure.md index 843371be6ea..ab75ee40ada 100644 --- a/website/docs/docs/cloud/git/setup-azure.md +++ b/website/docs/docs/cloud/git/setup-azure.md @@ -31,7 +31,7 @@ Once the Azure AD app is added to dbt Cloud and the service user is connected, t 4. Provide a name for your app. We recommend using, "dbt Labs Azure DevOps App". 5. Select **Accounts in any organizational directory (Any Azure AD directory - Multitenant)** as the Supported Account Types. Many customers ask why they need to select Multitenant instead of Single tenant, and they frequently get this step wrong. Microsoft considers Azure DevOps (formerly called Visual Studio) and Azure Active Directory as separate tenants, and in order for this Active Directory application to work properly, you must select Multitenant. -6. Add a redirect URI by selecting **Web** and, in the field, entering `https://YOUR_ACCESS_URL/complete/azure_active_directory`, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan. +6. Add a redirect URI by selecting **Web** and, in the field, entering `https://YOUR_ACCESS_URL/complete/azure_active_directory`, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan. 7. Click **Register**. @@ -59,7 +59,7 @@ You also need to add another redirect URI to your Azure AD application. This red 1. Navigate to your Azure AD application. 2. Select the link next to **Redirect URIs** -3. Click **Add URI** and add the URI, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan: +3. Click **Add URI** and add the URI, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan: `https://YOUR_ACCESS_URL/complete/azure_active_directory_service_user` 4. Click **Save**. diff --git a/website/docs/docs/cloud/manage-access/invite-users.md b/website/docs/docs/cloud/manage-access/invite-users.md index 21be7010a30..bf44decfdcc 100644 --- a/website/docs/docs/cloud/manage-access/invite-users.md +++ b/website/docs/docs/cloud/manage-access/invite-users.md @@ -35,7 +35,7 @@ You must have proper permissions to invite new users: ## User experience -dbt Cloud generates and sends emails from `support@getdbt.com` to the specified addresses. Make sure traffic from the `support@getdbt.com` email is allowed in your settings to avoid emails from going to spam or being blocked. This is the originating email address for all [instances worldwide](/docs/cloud/about-cloud/regions-ip-addresses). +dbt Cloud generates and sends emails from `support@getdbt.com` to the specified addresses. Make sure traffic from the `support@getdbt.com` email is allowed in your settings to avoid emails from going to spam or being blocked. This is the originating email address for all [instances worldwide](/docs/cloud/about-cloud/access-regions-ip-addresses). The email contains a link to create an account. When the user clicks on this they will be brought to one of two screens depending on whether SSO is configured or not. diff --git a/website/docs/docs/cloud/manage-access/set-up-bigquery-oauth.md b/website/docs/docs/cloud/manage-access/set-up-bigquery-oauth.md index 87018b14d56..a6b8808ccaa 100644 --- a/website/docs/docs/cloud/manage-access/set-up-bigquery-oauth.md +++ b/website/docs/docs/cloud/manage-access/set-up-bigquery-oauth.md @@ -34,7 +34,7 @@ On the **Credentials** page, you can see your existing keys, client IDs, and ser Set up an [OAuth consent screen](https://support.google.com/cloud/answer/6158849) if you haven't already. Then, click **+ Create Credentials** at the top of the page and select **OAuth client ID**. -Fill in the application, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan: +Fill in the application, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan: | Config | Value | | ------ | ----- | diff --git a/website/docs/docs/cloud/manage-access/set-up-databricks-oauth.md b/website/docs/docs/cloud/manage-access/set-up-databricks-oauth.md index 679133b7844..e790c234696 100644 --- a/website/docs/docs/cloud/manage-access/set-up-databricks-oauth.md +++ b/website/docs/docs/cloud/manage-access/set-up-databricks-oauth.md @@ -45,7 +45,7 @@ These parameters and descriptions will help you authenticate with your username | **USERNAME** | Your Databricks username (account admin level) | | **PASSWORD** | Your Databricks password (account admin level) | | **ACCOUNT_ID** | Your Databricks [account ID](https://docs.databricks.com/en/administration-guide/account-settings/index.html#locate-your-account-id) | -| **YOUR_ACCESS_URL** | The [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your dbt Cloud account region and plan | +| **YOUR_ACCESS_URL** | The [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your dbt Cloud account region and plan | | **NAME** | The integration name (i.e 'databricks-dbt-cloud') After running the `curl`, you'll get an API response that includes the `client_id` and `client_secret` required in the following section. At this time, this is the only way to retrieve the secret. If you lose the secret, then the integration needs to be [deleted](https://docs.databricks.com/api/account/customappintegration/delete) and re-created. diff --git a/website/docs/docs/cloud/manage-access/set-up-snowflake-oauth.md b/website/docs/docs/cloud/manage-access/set-up-snowflake-oauth.md index 5b9abb6058a..444374cc47e 100644 --- a/website/docs/docs/cloud/manage-access/set-up-snowflake-oauth.md +++ b/website/docs/docs/cloud/manage-access/set-up-snowflake-oauth.md @@ -17,7 +17,7 @@ To enable Snowflake OAuth, you will need to create a [security integration](http ### Create a security integration -In Snowflake, execute a query to create a security integration. Please find the complete documentation on creating a security integration for custom clients [here](https://docs.snowflake.net/manuals/sql-reference/sql/create-security-integration.html#syntax). In the following example `create or replace security integration` query, replace `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan. +In Snowflake, execute a query to create a security integration. Please find the complete documentation on creating a security integration for custom clients [here](https://docs.snowflake.net/manuals/sql-reference/sql/create-security-integration.html#syntax). In the following example `create or replace security integration` query, replace `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan. ``` CREATE OR REPLACE SECURITY INTEGRATION DBT_CLOUD @@ -42,7 +42,7 @@ CREATE OR REPLACE SECURITY INTEGRATION DBT_CLOUD | ENABLED | Required | | OAUTH_CLIENT | Required | | OAUTH_CLIENT_TYPE | Required | -| OAUTH_REDIRECT_URI | Required. Use the access URL that corresponds to your server [region](/docs/cloud/about-cloud/regions-ip-addresses). If dbt Cloud is deployed on-premises, use the domain name of your application instead of the access URL. | +| OAUTH_REDIRECT_URI | Required. Use the access URL that corresponds to your server [region](/docs/cloud/about-cloud/access-regions-ip-addresses). If dbt Cloud is deployed on-premises, use the domain name of your application instead of the access URL. | | OAUTH_ISSUE_REFRESH_TOKENS | Required | | OAUTH_REFRESH_TOKEN_VALIDITY | Required. This configuration dictates the number of seconds that a refresh token is valid for. Use a smaller value to force users to re-authenticate with Snowflake more frequently. | @@ -103,7 +103,7 @@ This error might be because of a configuration issue in the Snowflake OAuth flow * In the Snowflake OAuth flow, `role` in the profile config is not optional, as it does not inherit from the project connection config. So each user must supply their role, regardless of whether it is provided in the project connection. #### Server error 500 -If you experience a 500 server error when redirected from Snowflake to dbt Cloud, double-check that you have allow listed [dbt Cloud's IP addresses](/docs/cloud/about-cloud/regions-ip-addresses) on a Snowflake account level. +If you experience a 500 server error when redirected from Snowflake to dbt Cloud, double-check that you have allow listed [dbt Cloud's IP addresses](/docs/cloud/about-cloud/access-regions-ip-addresses) on a Snowflake account level. Enterprise customers who have single-tenant deployments will have a different range of IP addresses (network CIDR ranges) to allow list. diff --git a/website/docs/docs/cloud/manage-access/set-up-sso-google-workspace.md b/website/docs/docs/cloud/manage-access/set-up-sso-google-workspace.md index 19779baf615..e4ff998015c 100644 --- a/website/docs/docs/cloud/manage-access/set-up-sso-google-workspace.md +++ b/website/docs/docs/cloud/manage-access/set-up-sso-google-workspace.md @@ -96,7 +96,7 @@ Settings. account using GSuite auth. Optionally, you may specify a CSV of domains which are _all_ authorized to access your dbt Cloud account (eg. `dbtlabs.com, fishtowndata.com`) - **Slug**: Enter your desired login slug. Users will be able to log into dbt - Cloud by navigating to `https://YOUR_ACCESS_URL/enterprise-login/LOGIN-SLUG`, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan. The `LOGIN-SLUG` must + Cloud by navigating to `https://YOUR_ACCESS_URL/enterprise-login/LOGIN-SLUG`, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan. The `LOGIN-SLUG` must be unique across all dbt Cloud accounts, so pick a slug that uniquely identifies your company. diff --git a/website/docs/docs/cloud/manage-access/set-up-sso-okta.md b/website/docs/docs/cloud/manage-access/set-up-sso-okta.md index 4079cc488c4..53986513ce2 100644 --- a/website/docs/docs/cloud/manage-access/set-up-sso-okta.md +++ b/website/docs/docs/cloud/manage-access/set-up-sso-okta.md @@ -61,7 +61,7 @@ Click **Next** to continue. ### Configure SAML Settings -The SAML Settings page configures how Okta and dbt Cloud communicate. You will want to use an [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan. +The SAML Settings page configures how Okta and dbt Cloud communicate. You will want to use an [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan. To complete this section, you will need a _login slug_. This slug controls the URL where users on your account can log into your application via Okta. Login @@ -172,7 +172,7 @@ configured in the steps above. | **Identity Provider SSO Url** | Paste the **Identity Provider Single Sign-On URL** shown in the Okta setup instructions | | **Identity Provider Issuer** | Paste the **Identity Provider Issuer** shown in the Okta setup instructions | | **X.509 Certificate** | Paste the **X.509 Certificate** shown in the Okta setup instructions;
**Note:** When the certificate expires, an Okta admin will have to generate a new one to be pasted into dbt Cloud for uninterrupted application access. | -| **Slug** | Enter your desired login slug. Users will be able to log into dbt Cloud by navigating to `https://YOUR_ACCESS_URL/enterprise-login/LOGIN-SLUG`, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan. Login slugs must be unique across all dbt Cloud accounts, so pick a slug that uniquely identifies your company. | +| **Slug** | Enter your desired login slug. Users will be able to log into dbt Cloud by navigating to `https://YOUR_ACCESS_URL/enterprise-login/LOGIN-SLUG`, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan. Login slugs must be unique across all dbt Cloud accounts, so pick a slug that uniquely identifies your company. | " }` * `VARIABLES` with a dictionary of your GraphQL query variables, such as a job ID or a filter. diff --git a/website/docs/docs/dbt-cloud-apis/migrating-to-v2.md b/website/docs/docs/dbt-cloud-apis/migrating-to-v2.md index 3e6ac2c3577..72616f4b19c 100644 --- a/website/docs/docs/dbt-cloud-apis/migrating-to-v2.md +++ b/website/docs/docs/dbt-cloud-apis/migrating-to-v2.md @@ -10,7 +10,7 @@ In an attempt to provide an improved dbt Cloud Administrative API experience, th ## Key differences -When using the [List runs](/dbt-cloud/api-v2-legacy#tag/Runs) endpoint, you can include triggered runs and sort by ID. You can use the following request in v2 to get a similar response as v4, replacing the `{accountId}` with your own and `{YOUR_ACCESS_URL}` with the appropriate [Access URL](https://docs.getdbt.com/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan: +When using the [List runs](/dbt-cloud/api-v2-legacy#tag/Runs) endpoint, you can include triggered runs and sort by ID. You can use the following request in v2 to get a similar response as v4, replacing the `{accountId}` with your own and `{YOUR_ACCESS_URL}` with the appropriate [Access URL](https://docs.getdbt.com/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan: ```shell GET https://{YOUR_ACCESS_URL}/api/v2/accounts/{accountId}/runs/?include_related=[%22trigger%22]&order_by=-id diff --git a/website/docs/docs/dbt-cloud-apis/sl-jdbc.md b/website/docs/docs/dbt-cloud-apis/sl-jdbc.md index aba309566f8..9f61f488c4a 100644 --- a/website/docs/docs/dbt-cloud-apis/sl-jdbc.md +++ b/website/docs/docs/dbt-cloud-apis/sl-jdbc.md @@ -50,7 +50,7 @@ jdbc:arrow-flight-sql://semantic-layer.cloud.getdbt.com:443?&environmentId=20233 | JDBC parameter | Description | Example | | -------------- | ----------- | ------- | | `jdbc:arrow-flight-sql://` | The protocol for the JDBC driver. | `jdbc:arrow-flight-sql://` | -| `semantic-layer.cloud.getdbt.com` | The [access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your account's dbt Cloud region. You must always add the `semantic-layer` prefix before the access URL. | For dbt Cloud deployment hosted in North America, use `semantic-layer.cloud.getdbt.com` | +| `semantic-layer.cloud.getdbt.com` | The [access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your account's dbt Cloud region. You must always add the `semantic-layer` prefix before the access URL. | For dbt Cloud deployment hosted in North America, use `semantic-layer.cloud.getdbt.com` | | `environmentId` | The unique identifier for the dbt production environment, you can retrieve this from the dbt Cloud URL
when you navigate to **Environments** under **Deploy**. | If your URL ends with `.../environments/222222`, your `environmentId` is `222222`

| | `SERVICE_TOKEN` | dbt Cloud [service token](/docs/dbt-cloud-apis/service-tokens) with “Semantic Layer Only” and "Metadata Only" permissions. Create a new service token on the **Account Settings** page. | `token=SERVICE_TOKEN` | diff --git a/website/docs/docs/dbt-versions/release-notes/03-Oct-2023/api-v2v3-limit.md b/website/docs/docs/dbt-versions/release-notes/03-Oct-2023/api-v2v3-limit.md index 9768886d5fb..fb27e8e1727 100644 --- a/website/docs/docs/dbt-versions/release-notes/03-Oct-2023/api-v2v3-limit.md +++ b/website/docs/docs/dbt-versions/release-notes/03-Oct-2023/api-v2v3-limit.md @@ -10,6 +10,6 @@ tags: [Oct-2023, API] Beginning December 1, 2023, the [Administrative API](/docs/dbt-cloud-apis/admin-cloud-api) v2 and v3 will expect you to limit all "list" or `GET` API methods to 100 results per API request. This limit enhances the efficiency and stability of our services. If you need to handle more than 100 results, then use the `limit` and `offset` query parameters to paginate those results; otherwise, you will receive an error. -This maximum limit applies to [multi-tenant instances](/docs/cloud/about-cloud/regions-ip-addresses) only, and _does not_ apply to single tenant instances. +This maximum limit applies to [multi-tenant instances](/docs/cloud/about-cloud/access-regions-ip-addresses) only, and _does not_ apply to single tenant instances. Refer to the [API v3 Pagination](https://docs.getdbt.com/dbt-cloud/api-v3#/) or [API v2 Pagination](https://docs.getdbt.com/dbt-cloud/api-v2#/) sections for more information on how to paginate your API responses. diff --git a/website/docs/docs/dbt-versions/release-notes/03-Oct-2023/sl-ga.md b/website/docs/docs/dbt-versions/release-notes/03-Oct-2023/sl-ga.md index a81abec5d42..1cae19c69c4 100644 --- a/website/docs/docs/dbt-versions/release-notes/03-Oct-2023/sl-ga.md +++ b/website/docs/docs/dbt-versions/release-notes/03-Oct-2023/sl-ga.md @@ -17,7 +17,7 @@ It aims to bring the best of modeling and semantics to downstream applications b - Brand new [integrations](/docs/use-dbt-semantic-layer/avail-sl-integrations) such as Tableau, Google Sheets, Hex, Mode, and Lightdash. - New [Semantic Layer APIs](/docs/dbt-cloud-apis/sl-api-overview) using GraphQL and JDBC to query metrics and build integrations. -- dbt Cloud [multi-tenant regional](/docs/cloud/about-cloud/regions-ip-addresses) support for North America, EMEA, and APAC. Single-tenant support coming soon. +- dbt Cloud [multi-tenant regional](/docs/cloud/about-cloud/access-regions-ip-addresses) support for North America, EMEA, and APAC. Single-tenant support coming soon. - Use the APIs to call an export (a way to build tables in your data platform), then access them in your preferred BI tool. Starting from dbt v1.7 or higher, you will be able to schedule exports as part of your dbt job. diff --git a/website/docs/docs/dbt-versions/release-notes/05-Aug-2023/sl-revamp-beta.md b/website/docs/docs/dbt-versions/release-notes/05-Aug-2023/sl-revamp-beta.md index f44fd57aa4a..77ba9030038 100644 --- a/website/docs/docs/dbt-versions/release-notes/05-Aug-2023/sl-revamp-beta.md +++ b/website/docs/docs/dbt-versions/release-notes/05-Aug-2023/sl-revamp-beta.md @@ -44,7 +44,7 @@ By bringing these enhancements to the dbt Semantic Layer, we enable organization The dbt Semantic Layer is currently available as a public beta, which means: -- **Who** — To experience the new dbt Semantic Layer, you must be on a dbt Cloud [Team and Enterprise](https://www.getdbt.com/pricing/) multi-tenant dbt Cloud plan, [hosted](/docs/cloud/about-cloud/regions-ip-addresses) in North America and on dbt v1.6 and higher. Look out for announcements on removing the location requirement soon. +- **Who** — To experience the new dbt Semantic Layer, you must be on a dbt Cloud [Team and Enterprise](https://www.getdbt.com/pricing/) multi-tenant dbt Cloud plan, [hosted](/docs/cloud/about-cloud/access-regions-ip-addresses) in North America and on dbt v1.6 and higher. Look out for announcements on removing the location requirement soon. - Developer plans or dbt Core users can use MetricFlow to define and test metrics using the dbt MetricFlow CLI only. diff --git a/website/docs/docs/dbt-versions/release-notes/07-June-2023/admin-api-rn.md b/website/docs/docs/dbt-versions/release-notes/07-June-2023/admin-api-rn.md index 2008331ebe6..b486c90b881 100644 --- a/website/docs/docs/dbt-versions/release-notes/07-June-2023/admin-api-rn.md +++ b/website/docs/docs/dbt-versions/release-notes/07-June-2023/admin-api-rn.md @@ -11,5 +11,5 @@ dbt Labs updated the docs for the [dbt Cloud Administrative API](/docs/dbt-cloud - Now using Spotlight for improved UI and UX. - All endpoints are now documented for v2 and v3. Added automation to the docs so they remain up to date. - Documented many of the request and response bodies. -- You can now test endpoints directly from within the API docs. And, you can choose which [regional server](/docs/cloud/about-cloud/regions-ip-addresses) to use (North America, APAC, or EMEA). +- You can now test endpoints directly from within the API docs. And, you can choose which [regional server](/docs/cloud/about-cloud/access-regions-ip-addresses) to use (North America, APAC, or EMEA). - With the new UI, you can more easily generate code for any endpoint. diff --git a/website/docs/docs/dbt-versions/release-notes/09-April-2023/api-endpoint-restriction.md b/website/docs/docs/dbt-versions/release-notes/09-April-2023/api-endpoint-restriction.md index 8507fe3dbbb..04b669f75ba 100644 --- a/website/docs/docs/dbt-versions/release-notes/09-April-2023/api-endpoint-restriction.md +++ b/website/docs/docs/dbt-versions/release-notes/09-April-2023/api-endpoint-restriction.md @@ -16,7 +16,7 @@ We recommend that you change your API requests to https:///api/ :::info Access URLs -dbt Cloud is hosted in multiple regions around the world, and each region has a different access URL. Users on Enterprise plans can choose to have their account hosted in any one of these regions. For a complete list of available dbt Cloud access URLs, refer to [Regions & IP addresses](/docs/cloud/about-cloud/regions-ip-addresses). +dbt Cloud is hosted in multiple regions around the world, and each region has a different access URL. Users on Enterprise plans can choose to have their account hosted in any one of these regions. For a complete list of available dbt Cloud access URLs, refer to [Regions & IP addresses](/docs/cloud/about-cloud/access-regions-ip-addresses). ::: diff --git a/website/docs/docs/dbt-versions/release-notes/10-Mar-2023/apiv2-limit.md b/website/docs/docs/dbt-versions/release-notes/10-Mar-2023/apiv2-limit.md index 85c4af48b54..12509bf77f7 100644 --- a/website/docs/docs/dbt-versions/release-notes/10-Mar-2023/apiv2-limit.md +++ b/website/docs/docs/dbt-versions/release-notes/10-Mar-2023/apiv2-limit.md @@ -9,6 +9,6 @@ tags: [Mar-2023, API] To make the API more scalable and reliable, we've implemented a maximum limit of `100` for all API requests to our `list` endpoints. If API requests exceed the maximum limit parameter of `100`, a user will receive an API error message. -This maximum limit applies to [multi-tenant instances](/docs/cloud/about-cloud/regions-ip-addresses) only, and _does not_ apply to single tenant instances. +This maximum limit applies to [multi-tenant instances](/docs/cloud/about-cloud/access-regions-ip-addresses) only, and _does not_ apply to single tenant instances. Refer to the [Pagination](https://docs.getdbt.com/dbt-cloud/api-v2-legacy#section/Pagination) section for more information on this change. diff --git a/website/docs/docs/dbt-versions/release-notes/11-Feb-2023/feb-ide-updates.md b/website/docs/docs/dbt-versions/release-notes/11-Feb-2023/feb-ide-updates.md index 64fa2026d04..7020868197a 100644 --- a/website/docs/docs/dbt-versions/release-notes/11-Feb-2023/feb-ide-updates.md +++ b/website/docs/docs/dbt-versions/release-notes/11-Feb-2023/feb-ide-updates.md @@ -19,7 +19,7 @@ Learn more about the [February changes](https://getdbt.slack.com/archives/C03SAH - Rename files by double-clicking on files in the file tree and the editor tabs - Right-clicking on file tabs has new options and will now open at your cursor instead of in the middle of the tab - The git branch name above **Version Control** links to the repo for specific git providers - * Currently available for all [multi-tenant](/docs/cloud/about-cloud/regions-ip-addresses) instances using GitHub or GitLab providers + * Currently available for all [multi-tenant](/docs/cloud/about-cloud/access-regions-ip-addresses) instances using GitHub or GitLab providers ## Product refinements diff --git a/website/docs/docs/dbt-versions/release-notes/26-Sept-2022/liststeps-endpoint-deprecation.md b/website/docs/docs/dbt-versions/release-notes/26-Sept-2022/liststeps-endpoint-deprecation.md index 545847efd90..9cae773ea3e 100644 --- a/website/docs/docs/dbt-versions/release-notes/26-Sept-2022/liststeps-endpoint-deprecation.md +++ b/website/docs/docs/dbt-versions/release-notes/26-Sept-2022/liststeps-endpoint-deprecation.md @@ -10,6 +10,6 @@ On October 14th, 2022 dbt Labs is deprecating the [List Steps](https://docs.getd dbt Labs will continue to maintain the [Get Run](https://docs.getdbt.com/dbt-cloud/api-v2-legacy#tag/Runs/operation/getRunById) endpoint, which is a viable alternative depending on the use case. -You can fetch run steps for an individual run with a GET request to the following URL, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan: +You can fetch run steps for an individual run with a GET request to the following URL, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan: `https://YOUR_ACCESS_URL/api/v2/accounts/{accountId}/runs/{runId}/?include_related=["run_steps"]` diff --git a/website/docs/docs/deploy/dashboard-status-tiles.md b/website/docs/docs/deploy/dashboard-status-tiles.md index 67aa1a93c33..d3944fc5877 100644 --- a/website/docs/docs/deploy/dashboard-status-tiles.md +++ b/website/docs/docs/deploy/dashboard-status-tiles.md @@ -36,7 +36,7 @@ You can insert these three fields into the following iFrame, and then embed it * :::tip Replace `YOUR_ACCESS_URL` with your region and plan's Access URL -dbt Cloud is hosted in multiple regions in the world and each region has a different access URL. Replace `YOUR_ACCESS_URL` with the appropriate [Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan. For example, if your account is hosted in the EMEA region, you would use the following iFrame code: +dbt Cloud is hosted in multiple regions in the world and each region has a different access URL. Replace `YOUR_ACCESS_URL` with the appropriate [Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan. For example, if your account is hosted in the EMEA region, you would use the following iFrame code: ``` @@ -71,7 +71,7 @@ https://metadata.YOUR_ACCESS_URL/exposure-tile?name=&jobId=&jobId=&token= @@ -91,7 +91,7 @@ https://metadata.YOUR_ACCESS_URL/exposure-tile?name=&jobId=&jobId=&token= diff --git a/website/docs/docs/deploy/run-visibility.md b/website/docs/docs/deploy/run-visibility.md index ff9abfa5b0b..0ace26eb5ed 100644 --- a/website/docs/docs/deploy/run-visibility.md +++ b/website/docs/docs/deploy/run-visibility.md @@ -26,7 +26,7 @@ You can view or download in-progress and historical logs for your dbt runs. This ## Model timing -> Available on [multi-tenant](/docs/cloud/about-cloud/regions-ip-addresses) dbt Cloud accounts on the [Team or Enterprise plans](https://www.getdbt.com/pricing/). +> Available on [multi-tenant](/docs/cloud/about-cloud/access-regions-ip-addresses) dbt Cloud accounts on the [Team or Enterprise plans](https://www.getdbt.com/pricing/). The model timing dashboard on dbt Cloud displays the composition, order, and time taken by each model in a job run. The visualization appears for successful jobs and highlights the top 1% of model durations. This helps you identify bottlenecks in your runs, so you can investigate them and potentially make changes to improve their performance. diff --git a/website/docs/docs/deploy/webhooks.md b/website/docs/docs/deploy/webhooks.md index f6c766ab201..e036444c304 100644 --- a/website/docs/docs/deploy/webhooks.md +++ b/website/docs/docs/deploy/webhooks.md @@ -35,7 +35,7 @@ You can also check out the free [dbt Fundamentals course](https://courses.getdbt ## Create a webhook subscription {#create-a-webhook-subscription} -From your **Account Settings** in dbt Cloud (using the gear menu in the top right corner), click **Create New Webhook** in the **Webhooks** section. You can find the appropriate dbt Cloud access URL for your region and plan with [Regions & IP addresses](/docs/cloud/about-cloud/regions-ip-addresses). +From your **Account Settings** in dbt Cloud (using the gear menu in the top right corner), click **Create New Webhook** in the **Webhooks** section. You can find the appropriate dbt Cloud access URL for your region and plan with [Regions & IP addresses](/docs/cloud/about-cloud/access-regions-ip-addresses). To configure your new webhook: @@ -167,7 +167,7 @@ An example of a webhook payload for an errored run: You can use the dbt Cloud API to create new webhooks that you want to subscribe to, get detailed information about your webhooks, and to manage the webhooks that are associated with your account. The following sections describe the API endpoints you can use for this. :::info Access URLs -dbt Cloud is hosted in multiple regions in the world and each region has a different access URL. People on Enterprise plans can choose to have their account hosted in any one of these regions. For a complete list of available dbt Cloud access URLs, refer to [Regions & IP addresses](/docs/cloud/about-cloud/regions-ip-addresses). +dbt Cloud is hosted in multiple regions in the world and each region has a different access URL. People on Enterprise plans can choose to have their account hosted in any one of these regions. For a complete list of available dbt Cloud access URLs, refer to [Regions & IP addresses](/docs/cloud/about-cloud/access-regions-ip-addresses). ::: ### List all webhook subscriptions diff --git a/website/docs/docs/running-a-dbt-project/using-the-dbt-ide.md b/website/docs/docs/running-a-dbt-project/using-the-dbt-ide.md index f41bceab12d..c772ae89fab 100644 --- a/website/docs/docs/running-a-dbt-project/using-the-dbt-ide.md +++ b/website/docs/docs/running-a-dbt-project/using-the-dbt-ide.md @@ -32,7 +32,7 @@ New dbt Cloud accounts should have developer credentials created automatically a New users on existing accounts *might not* have their development credentials already configured. To manage your development credentials: -1. Navigate to your **Credentials** under **Your Profile** settings, which you can access at `https://YOUR_ACCESS_URL/settings/profile#credentials`, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan. +1. Navigate to your **Credentials** under **Your Profile** settings, which you can access at `https://YOUR_ACCESS_URL/settings/profile#credentials`, replacing `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan. 2. Select the relevant project in the list. After entering your developer credentials, you'll be able to access the dbt IDE. diff --git a/website/docs/docs/use-dbt-semantic-layer/tableau.md b/website/docs/docs/use-dbt-semantic-layer/tableau.md index a5c1b6edd04..0f202cd4a2c 100644 --- a/website/docs/docs/use-dbt-semantic-layer/tableau.md +++ b/website/docs/docs/use-dbt-semantic-layer/tableau.md @@ -21,7 +21,7 @@ This integration provides a live connection to the dbt Semantic Layer through Ta - Note that Tableau Online does not currently support custom connectors natively. If you use Tableau Online, you will only be able to access the connector in Tableau Desktop. - Log in to Tableau Desktop (with Online or Server credentials) or a license to Tableau Server - You need your dbt Cloud host, [Environment ID](/docs/use-dbt-semantic-layer/setup-sl#set-up-dbt-semantic-layer) and [service token](/docs/dbt-cloud-apis/service-tokens) to log in. This account should be set up with the dbt Semantic Layer. -- You must have a dbt Cloud Team or Enterprise [account](https://www.getdbt.com/pricing) and multi-tenant [deployment](/docs/cloud/about-cloud/regions-ip-addresses). (Single-Tenant coming soon) +- You must have a dbt Cloud Team or Enterprise [account](https://www.getdbt.com/pricing) and multi-tenant [deployment](/docs/cloud/about-cloud/access-regions-ip-addresses). (Single-Tenant coming soon) ## Installing the Connector diff --git a/website/docs/faqs/API/rotate-token.md b/website/docs/faqs/API/rotate-token.md index 144c834ea8a..edddc77c2d9 100644 --- a/website/docs/faqs/API/rotate-token.md +++ b/website/docs/faqs/API/rotate-token.md @@ -34,7 +34,7 @@ curl --location --request POST 'https://YOUR_ACCESS_URL/api/v2/users/YOUR_USER_I * Find your `YOUR_USER_ID` by reading [How to find your user ID](/faqs/Accounts/find-user-id). * Find your `YOUR_CURRENT_TOKEN` by going to **Profile Settings** -> **API Access** and copying the API key. -* Find [`YOUR_ACCESS_URL`](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan. +* Find [`YOUR_ACCESS_URL`](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan. :::info Example @@ -53,7 +53,7 @@ curl --location --request POST 'https://cloud.getdbt.com/api/v2/users/123/apikey ### dbt Cloud deployments -If your [dbt Cloud deployment](/docs/cloud/about-cloud/regions-ip-addresses) uses a different access URL, replace `cloud.getdbt.com` with the URL of your instance. +If your [dbt Cloud deployment](/docs/cloud/about-cloud/access-regions-ip-addresses) uses a different access URL, replace `cloud.getdbt.com` with the URL of your instance. For example, if your deployment is Virtual Private dbt: diff --git a/website/docs/faqs/Accounts/transfer-account.md b/website/docs/faqs/Accounts/transfer-account.md index d82dfbf505a..56b87155444 100644 --- a/website/docs/faqs/Accounts/transfer-account.md +++ b/website/docs/faqs/Accounts/transfer-account.md @@ -10,10 +10,10 @@ You can transfer your dbt Cloud [access control](/docs/cloud/manage-access/about | Account plan| Steps | | ------ | ---------- | -| **Developer** | You can transfer ownership by changing the email directly on your dbt Cloud profile page, which you can access using this URL when you replace `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan: `https://YOUR_ACCESS_URL/settings/profile` | +| **Developer** | You can transfer ownership by changing the email directly on your dbt Cloud profile page, which you can access using this URL when you replace `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan: `https://YOUR_ACCESS_URL/settings/profile` | | **Team** | Existing account admins with account access can add users to, or remove users from the owner group. | | **Enterprise** | Account admins can add users to, or remove users from a group with Account Admin permissions. | -| **If all account owners left the company** | If the account owner has left your organization, you will need to work with _your_ IT department to have incoming emails forwarded to the new account owner. Once your IT department has redirected the emails, you can request to reset the user password. Once you log in, you can change the email on the Profile page when you replace `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan: `https://YOUR_ACCESS_URL/settings/profile`. | +| **If all account owners left the company** | If the account owner has left your organization, you will need to work with _your_ IT department to have incoming emails forwarded to the new account owner. Once your IT department has redirected the emails, you can request to reset the user password. Once you log in, you can change the email on the Profile page when you replace `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan: `https://YOUR_ACCESS_URL/settings/profile`. | When you make any account owner and email changes: diff --git a/website/docs/guides/how-to-use-databricks-workflows-to-run-dbt-cloud-jobs.md b/website/docs/guides/how-to-use-databricks-workflows-to-run-dbt-cloud-jobs.md index 30221332355..f6e59c7b1a8 100644 --- a/website/docs/guides/how-to-use-databricks-workflows-to-run-dbt-cloud-jobs.md +++ b/website/docs/guides/how-to-use-databricks-workflows-to-run-dbt-cloud-jobs.md @@ -134,7 +134,7 @@ if __name__ == '__main__': 3. Replace **``** and **``** with the values you used [previously](#set-up-a-databricks-secret-scope) -4. Replace **``** and **``** with the correct values of your environment and [Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan. +4. Replace **``** and **``** with the correct values of your environment and [Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan. :::tip To find these values, navigate to **dbt Cloud**, select **Deploy -> Jobs**. Select the Job you want to run and copy the URL. For example: `https://cloud.getdbt.com/deploy/000000/projects/111111/jobs/222222` diff --git a/website/docs/guides/starburst-galaxy-qs.md b/website/docs/guides/starburst-galaxy-qs.md index 1822c83fa90..c928d37ae1a 100644 --- a/website/docs/guides/starburst-galaxy-qs.md +++ b/website/docs/guides/starburst-galaxy-qs.md @@ -28,7 +28,7 @@ You can also watch the [Build Better Data Pipelines with dbt and Starburst](http ### Prerequisites -- You have a [multi-tenant](/docs/cloud/about-cloud/regions-ip-addresses) deployment in [dbt Cloud](https://www.getdbt.com/signup/). For more information, refer to [Tenancy](/docs/cloud/about-cloud/tenancy). +- You have a [multi-tenant](/docs/cloud/about-cloud/access-regions-ip-addresses) deployment in [dbt Cloud](https://www.getdbt.com/signup/). For more information, refer to [Tenancy](/docs/cloud/about-cloud/tenancy). - You have a [Starburst Galaxy account](https://www.starburst.io/platform/starburst-galaxy/). If you don't, you can start a free trial. Refer to the [getting started guide](https://docs.starburst.io/starburst-galaxy/get-started.html) in the Starburst Galaxy docs for further setup details. - You have an AWS account with permissions to upload data to an S3 bucket. - For Amazon S3 authentication, you will need either an AWS access key and AWS secret key with access to the bucket, or you will need a cross account IAM role with access to the bucket. For details, refer to these Starburst Galaxy docs: diff --git a/website/snippets/_new-sl-setup.md b/website/snippets/_new-sl-setup.md index 3cb6e09eb4c..66cbeb1ef86 100644 --- a/website/snippets/_new-sl-setup.md +++ b/website/snippets/_new-sl-setup.md @@ -1,6 +1,6 @@ You can set up the dbt Semantic Layer in dbt Cloud at the environment and project level. Before you begin: -- You must have a dbt Cloud Team or Enterprise [multi-tenant](/docs/cloud/about-cloud/regions-ip-addresses) deployment. Single-tenant coming soon. +- You must have a dbt Cloud Team or Enterprise [multi-tenant](/docs/cloud/about-cloud/access-regions-ip-addresses) deployment. Single-tenant coming soon. - You must be part of the Owner group, and have the correct [license](/docs/cloud/manage-access/seats-and-users) and [permissions](/docs/cloud/manage-access/self-service-permissions) to configure the Semantic Layer: * Enterprise plan — Developer license with Account Admin permissions. Or Owner with a Developer license, assigned Project Creator, Database Admin, or Admin permissions. * Team plan — Owner with a Developer license. diff --git a/website/snippets/_sl-connect-and-query-api.md b/website/snippets/_sl-connect-and-query-api.md index 429f41c3bf6..180561a978e 100644 --- a/website/snippets/_sl-connect-and-query-api.md +++ b/website/snippets/_sl-connect-and-query-api.md @@ -1,6 +1,6 @@ You can query your metrics in a JDBC-enabled tool or use existing first-class integrations with the dbt Semantic Layer. -You must have a dbt Cloud Team or Enterprise [multi-tenant](/docs/cloud/about-cloud/regions-ip-addresses) deployment. Single-tenant coming soon. +You must have a dbt Cloud Team or Enterprise [multi-tenant](/docs/cloud/about-cloud/access-regions-ip-addresses) deployment. Single-tenant coming soon. - To learn how to use the JDBC or GraphQL API and what tools you can query it with, refer to [dbt Semantic Layer APIs](/docs/dbt-cloud-apis/sl-api-overview). diff --git a/website/snippets/_sl-plan-info.md b/website/snippets/_sl-plan-info.md index 083ab2209bc..0e982b1bf0d 100644 --- a/website/snippets/_sl-plan-info.md +++ b/website/snippets/_sl-plan-info.md @@ -1,2 +1,2 @@ -To define and query metrics with the {props.product}, you must be on a {props.plan} multi-tenant plan .


+To define and query metrics with the {props.product}, you must be on a {props.plan} multi-tenant plan .


diff --git a/website/snippets/_v2-sl-prerequisites.md b/website/snippets/_v2-sl-prerequisites.md index c80db4d1c8f..d3f7887a6bd 100644 --- a/website/snippets/_v2-sl-prerequisites.md +++ b/website/snippets/_v2-sl-prerequisites.md @@ -1,7 +1,7 @@ -- Have a dbt Cloud Team or Enterprise [multi-tenant](/docs/cloud/about-cloud/regions-ip-addresses) deployment. Single-tenant coming soon. +- Have a dbt Cloud Team or Enterprise [multi-tenant](/docs/cloud/about-cloud/access-regions-ip-addresses) deployment. Single-tenant coming soon. - Have both your production and development environments running dbt version 1.6 or higher. Refer to [upgrade in dbt Cloud](/docs/dbt-versions/upgrade-core-in-cloud) for more info. - Use Snowflake, BigQuery, Databricks, or Redshift. - Create a successful run in the environment where you configure the Semantic Layer. @@ -16,7 +16,7 @@ -- Have a multi-tenant dbt Cloud instance, hosted in North America
+- Have a multi-tenant dbt Cloud instance, hosted in North America
- Have both your production and development environments running dbt version 1.3 or higher
- Use Snowflake data platform
- Install the dbt metrics package version >=1.3.0, <1.4.0 in your dbt project
@@ -28,7 +28,7 @@ -- Have a multi-tenant dbt Cloud instance, hosted in North America
+- Have a multi-tenant dbt Cloud instance, hosted in North America
- Have both your production and development environments running dbt version 1.2
- Use Snowflake data platform
- Install the dbt metrics package version >=0.3.0, <0.4.0 in your dbt project
diff --git a/website/snippets/login_url_note.md b/website/snippets/login_url_note.md index a46648ea9c6..65c1b6c16ca 100644 --- a/website/snippets/login_url_note.md +++ b/website/snippets/login_url_note.md @@ -1,5 +1,5 @@ :::success Logging in -Users can now log into the dbt Cloud by navigating to the following URL, replacing `LOGIN-SLUG` with the value used in the previous steps and `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/regions-ip-addresses) for your region and plan: +Users can now log into the dbt Cloud by navigating to the following URL, replacing `LOGIN-SLUG` with the value used in the previous steps and `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan: `https://YOUR_ACCESS_URL/enterprise-login/LOGIN-SLUG` ::: diff --git a/website/snippets/sl-public-preview-banner.md b/website/snippets/sl-public-preview-banner.md index e97527d356d..41a724c22be 100644 --- a/website/snippets/sl-public-preview-banner.md +++ b/website/snippets/sl-public-preview-banner.md @@ -1,6 +1,6 @@ :::info 📌 -The dbt Semantic Layer is currently available in Public Preview for multi-tenant dbt Cloud accounts hosted in North America. If you log in via https://cloud.getdbt.com/, you can access the Semantic Layer. If you log in with [another URL](/docs/cloud/about-cloud/regions-ip-addresses), the dbt Semantic Layer will be available in the future. +The dbt Semantic Layer is currently available in Public Preview for multi-tenant dbt Cloud accounts hosted in North America. If you log in via https://cloud.getdbt.com/, you can access the Semantic Layer. If you log in with [another URL](/docs/cloud/about-cloud/access-regions-ip-addresses), the dbt Semantic Layer will be available in the future. For more info, review the [Prerequisites](/docs/use-dbt-semantic-layer/dbt-semantic-layer#prerequisites), [Public Preview](/docs/use-dbt-semantic-layer/quickstart-semantic-layer#public-preview), and [Product architecture](/docs/use-dbt-semantic-layer/dbt-semantic-layer#product-architecture) sections. diff --git a/website/vercel.json b/website/vercel.json index 3377b49278d..2877da61da9 100644 --- a/website/vercel.json +++ b/website/vercel.json @@ -1279,7 +1279,7 @@ }, { "source": "/docs/deploy/regions-ip-addresses", - "destination": "/docs/cloud/about-cloud/regions-ip-addresses", + "destination": "/docs/cloud/about-cloud/access-regions-ip-addresses", "permanent": true }, { From b242461a8720492b98f52833491d4af002e302bd Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Wed, 6 Dec 2023 16:34:21 -0500 Subject: [PATCH 003/121] Adding reference page for unit tests --- .../resource-properties/unit-tests.md | 51 +++++++++++++++++++ website/sidebars.js | 1 + 2 files changed, 52 insertions(+) create mode 100644 website/docs/reference/resource-properties/unit-tests.md diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md new file mode 100644 index 00000000000..02753803964 --- /dev/null +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -0,0 +1,51 @@ +--- +title: "About unit tests property" +sidebar_label: "unit tests" +resource_types: [models] +datatype: test +--- + + + +```yml +unit-tests: + - name: # this is the unique name of the test + model: + config: + meta: {dictionary} + tags: | [] + given: + - input: # optional for seeds + format: dict | csv + # if format csv, either define dictionary of rows or name of fixture + rows: + - {dictionary} + fixture: + - input: ... # declare additional inputs + expect: + format: dict | csv + # if format csv, either define dictionary of rows or name of fixture + rows: + - {dictionary} + fixture: + overrides: # optional: configuration for the dbt execution environment + macros: + is_incremental: true | false + dbt_utils.current_timestamp: str + # ... any other jinja function from https://docs.getdbt.com/reference/dbt-jinja-functions + # ... any other context property + vars: {dictionary} + env_vars: {dictionary} + - name: ... # declare additional unit tests + + ``` + + + + +## Definition + +Unit tests validate your modeling logic on a small set of static inputs before you materialize your full model in production. Unit tests enable test-driven development, with benefits for developer efficiency and code reliability. + +To run just your unit tests: +`dbt test —-select test_type:unit` \ No newline at end of file diff --git a/website/sidebars.js b/website/sidebars.js index 598fffc7f0d..11795e62704 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -744,6 +744,7 @@ const sidebarSettings = { "reference/resource-properties/include-exclude", "reference/resource-properties/quote", "reference/resource-properties/tests", + "reference/resource-properties/unit-tests", "reference/resource-properties/versions", ], }, From 840eed465aa011cb22c9e8fd191c38086670f1a4 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Wed, 6 Dec 2023 16:49:05 -0500 Subject: [PATCH 004/121] Unit tests --- website/dbt-versions.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/website/dbt-versions.js b/website/dbt-versions.js index be55c893041..86580584fed 100644 --- a/website/dbt-versions.js +++ b/website/dbt-versions.js @@ -26,6 +26,10 @@ exports.versions = [ ] exports.versionedPages = [ + { + "page": "reference/resource-properties/unit-tests", + "firstVersion": "1.7", + }, { "page": "reference/resource-configs/store_failures_as", "firstVersion": "1.7", From 6ce45ff065db68007f9a0c2f0add1a4626954ae7 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 9 Jan 2024 13:42:06 -0500 Subject: [PATCH 005/121] Update website/docs/reference/resource-properties/unit-tests.md Co-authored-by: Grace Goheen <53586774+graciegoheen@users.noreply.github.com> --- website/docs/reference/resource-properties/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 02753803964..a8b7512cd07 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -8,7 +8,7 @@ datatype: test ```yml -unit-tests: +unit_tests: - name: # this is the unique name of the test model: config: From 214eb6f9db0f3f3759ae0418fb44e64cc0cf3b83 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 9 Jan 2024 14:14:40 -0500 Subject: [PATCH 006/121] Update website/dbt-versions.js --- website/dbt-versions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/dbt-versions.js b/website/dbt-versions.js index 86580584fed..c5b5245cebe 100644 --- a/website/dbt-versions.js +++ b/website/dbt-versions.js @@ -28,7 +28,7 @@ exports.versions = [ exports.versionedPages = [ { "page": "reference/resource-properties/unit-tests", - "firstVersion": "1.7", + "firstVersion": "1.8", }, { "page": "reference/resource-configs/store_failures_as", From 12fbe42149c97616a3ee08ddc757abbbc6ca0c10 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 9 Jan 2024 14:29:44 -0500 Subject: [PATCH 007/121] Fixing spacing changes --- website/dbt-versions.js | 4 --- .../resource-properties/unit-tests.md | 25 ++++++++++--------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/website/dbt-versions.js b/website/dbt-versions.js index c5b5245cebe..be55c893041 100644 --- a/website/dbt-versions.js +++ b/website/dbt-versions.js @@ -26,10 +26,6 @@ exports.versions = [ ] exports.versionedPages = [ - { - "page": "reference/resource-properties/unit-tests", - "firstVersion": "1.8", - }, { "page": "reference/resource-configs/store_failures_as", "firstVersion": "1.7", diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index a8b7512cd07..7d4b1c44c17 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -8,34 +8,35 @@ datatype: test ```yml + unit_tests: - name: # this is the unique name of the test model: config: - meta: {dictionary} - tags: | [] - given: + meta: {dictionary} + tags: | [] + given: - input: # optional for seeds - format: dict | csv + format: dict | csv # if format csv, either define dictionary of rows or name of fixture rows: - {dictionary} fixture: - - input: ... # declare additional inputs + - input: ... # declare additional inputs expect: - format: dict | csv + format: dict | csv # if format csv, either define dictionary of rows or name of fixture - rows: - - {dictionary} + rows: + - {dictionary} fixture: overrides: # optional: configuration for the dbt execution environment macros: is_incremental: true | false dbt_utils.current_timestamp: str - # ... any other jinja function from https://docs.getdbt.com/reference/dbt-jinja-functions - # ... any other context property - vars: {dictionary} - env_vars: {dictionary} + # ... any other jinja function from https://docs.getdbt.com/reference/dbt-jinja-functions + # ... any other context property + vars: {dictionary} + env_vars: {dictionary} - name: ... # declare additional unit tests ``` From 8eee9342fc7186403277d39d341b643d02811ba4 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Wed, 10 Jan 2024 11:20:10 -0500 Subject: [PATCH 008/121] Update website/docs/reference/resource-properties/unit-tests.md --- website/docs/reference/resource-properties/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 7d4b1c44c17..973ec6b56dc 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -48,5 +48,5 @@ unit_tests: Unit tests validate your modeling logic on a small set of static inputs before you materialize your full model in production. Unit tests enable test-driven development, with benefits for developer efficiency and code reliability. -To run just your unit tests: +To run only your unit tests, use the command: `dbt test —-select test_type:unit` \ No newline at end of file From a79096259b7bbd984a97ffefdbbf31e66a0494c4 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Wed, 10 Jan 2024 11:21:37 -0500 Subject: [PATCH 009/121] Update website/docs/reference/resource-properties/unit-tests.md Co-authored-by: mirnawong1 <89008547+mirnawong1@users.noreply.github.com> --- website/docs/reference/resource-properties/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 973ec6b56dc..aa49d2d25c2 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -49,4 +49,4 @@ unit_tests: Unit tests validate your modeling logic on a small set of static inputs before you materialize your full model in production. Unit tests enable test-driven development, with benefits for developer efficiency and code reliability. To run only your unit tests, use the command: -`dbt test —-select test_type:unit` \ No newline at end of file +`dbt test --select test_type:unit` \ No newline at end of file From b6d8ed62f4012e74f54af61c4fc3fd12d389740c Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:27:11 -0500 Subject: [PATCH 010/121] Update website/docs/reference/resource-properties/unit-tests.md Co-authored-by: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> --- website/docs/reference/resource-properties/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index aa49d2d25c2..c8832e7fbab 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -46,7 +46,7 @@ unit_tests: ## Definition -Unit tests validate your modeling logic on a small set of static inputs before you materialize your full model in production. Unit tests enable test-driven development, with benefits for developer efficiency and code reliability. +Unit tests validate your SQL modeling logic on a small set of static inputs before you materialize your full model in production. They support a test-driven development approach, improving both the efficiency of developers and code reliability. To run only your unit tests, use the command: `dbt test --select test_type:unit` \ No newline at end of file From 9772609638f4b59b488e0dd6f7bac0e200a37abe Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Wed, 7 Feb 2024 15:34:26 -0500 Subject: [PATCH 011/121] Adding /docs page for unit tests --- website/docs/docs/build/unit-tests.md | 138 ++++++++++++++++++++++++++ website/sidebars.js | 1 + 2 files changed, 139 insertions(+) create mode 100644 website/docs/docs/build/unit-tests.md diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md new file mode 100644 index 00000000000..e8cbc257852 --- /dev/null +++ b/website/docs/docs/build/unit-tests.md @@ -0,0 +1,138 @@ +--- +title: "Unit tests" +sidebar_label: "Unit tests" +description: "Read this tutorial to learn how to use unit tests on your SQL models." +search_weight: "heavy" +id: "unit-tests" +keywords: + - unit test, unit tests, unit testing, dag +--- +:::note closed beta + +Unit testing is currently in closed beta for dbt Cloud accounts that have updated to a [versionless environment](/docs/dbt-versions/upgrade-core-in-cloud). + +It is available now as an alpha feature for dbt Core v1.8 users. + +::: + +Historically, the test coverage capabilities of dbt were limited to “data” tests ‐ testing the quality of input data or the shape of the resulting datasets — that could only be executed *after* a model had been built. + +Now, we are introducing a new type of test to dbt - unit tests. In software programming, unit tests validate small portions of your functional code, and they work much the same way here. Unit tests allow you to validate your SQL modeling logic on a small set of static inputs _before_ you materialize your full model in production. Unit tests enable test-driven development, benefiting developer efficiency and code reliability. + +Let’s say you’re creating a new `dim_customers` model with a field `is_valid_email_address`, that calculates whether or not the customer’s email is valid: + +```sql +with customers as ( + + select * from {{ ref('stg_customers') }} + +), + +accepted_email_domains as ( + + select * from {{ ref('top_level_email_domains') }} + +), + +check_valid_emails as ( + + select + customers.customer_id, + customers.first_name, + customers.last_name, + coalesce (regexp_like( + customers.email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$' + ) + = true + and accepted_email_domains.tld is not null, + false) as is_valid_email_address + from customers + left join accepted_email_domains + on customers.email_top_level_domain = lower(accepted_email_domains.tld) + +) + +select * from check_valid_emails +``` + +This type of logic can be challenging to validate. Let’s add a unit test to this model to ensure our `is_valid_email_address` logic captures all known edge cases: emails without `.`, emails without `@`, and emails from invalid domains. + +```yaml +unit_tests: + - name: test_is_valid_email_address # this is the unique name of the test + description: Check my is_valid_email_address logic captures all known edge cases - emails without ., emails without @, and emails from invalid domains. + model: dim_customers # name of the model you're unit testing + given: # the mock data for your inputs + - input: ref('stg_customers') + rows: + - {customer_id: 1, email: cool@example.com, email_top_level_domain: example.com} + - {customer_id: 2, email: cool@unknown.com, email_top_level_domain: unknown.com} + - {customer_id: 3, email: badgmail.com, email_top_level_domain: gmail.com} + - {customer_id: 4, email: missingdot@gmailcom, email_top_level_domain: gmail.com} + - input: ref('top_level_email_domains') + rows: + - {tld: example.com} + - {tld: gmail.com} + expect: # the expected output given the inputs above + rows: + - {customer_id: 1, is_valid_email_address: true} + - {customer_id: 2, is_valid_email_address: false} + - {customer_id: 3, is_valid_email_address: false} + - {customer_id: 4, is_valid_email_address: false} +``` + +The above example defines the mock data using the inline `dict` format, but there are a handful of different options for how you format your mock data. + +You’ll notice that we _only_ had to define the mock data for the columns we care about. This enables you to write succinct and _specific_ unit tests. + +:::note + +The direct parents of the model that you’re unit testing (in this example `stg_customers` and `top_level_email_domains`) need to exist in the warehouse before you’re able to execute the unit test. + +Use the `—-empty` flag to build an empty version of those models to save warehouse spend. + +```bash + +`dbt run —-select "stg_customers top_level_email_domains" --empty`. + +``` + +Alternatively, use `dbt build` to, in lineage order: + +- Run the unit tests on your model. +- Materialize your model in the warehouse. +- Run the data tests on your model. + +::: + +Now we’re ready to run this unit test! We have a couple of options for commands depending on how specific we want to be: + +- `dbt test —-select dim_customers` runs _all_ of the tests on `dim_customers`. +- `dbt test —-select "dim_customers,test_type:unit"` runs all of the _unit_ tests on `dim_customers`. +- `dbt test —-select test_is_valid_email_address` runs the test named `test_is_valid_email_address`. + +[add screenshot] + +It looks like our clever regex statement wasn’t as clever as we thought as our model is incorrectly flagging `missingdot@gmailcom` as a valid email address. + +Updating our regex logic to `'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'` (those darn escape characters!) and running the unit test again does the trick: + +[to add screenshot of example logs] + +Your model is now ready for production! Adding this unit test helped us catch an issue with the SQL logic _before_ you materialized `dim_customers` in your warehouse and will better ensure the reliability of this model in the future. + +### Best practices for “when to add a unit test to your model”: + +- when your SQL contains complex logic: + - Regex + - Date math + - Window functions + - `case when` statements when many `when`s + - Truncation + - Recursion +- Add a unit test for anything that feels like writing a function. For example, it involves your own logic processing the input. + - You wouldn't need to prioritize unit testing just calling `min()`, for example. That's already tested extensively by the warehouse and if something unexpected happens it's going to be a result of issues in the underlying data, so your fixture data in the unit test isn't going to help you. +- Logic for which you had bugs reported before. +- Edge cases not yet seen in your actual data that you want to handle. +- Prior to refactoring the transformation logic (especially if the refactor is significant). +- Models with high “criticality” (public, contracted models or models directly upstream of an exposure). \ No newline at end of file diff --git a/website/sidebars.js b/website/sidebars.js index 00b464a0277..79f8911aaa6 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -278,6 +278,7 @@ const sidebarSettings = { "docs/build/snapshots", "docs/build/seeds", "docs/build/tests", + "docs/build/unit-tests", "docs/build/jinja-macros", "docs/build/sources", "docs/build/exposures", From 19fd46385c5fffa0e878cc377d7581e8d4883b9c Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Wed, 7 Feb 2024 16:04:38 -0500 Subject: [PATCH 012/121] fixing spacing on YML --- website/docs/docs/build/unit-tests.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index e8cbc257852..4a09d24eccc 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -60,7 +60,7 @@ This type of logic can be challenging to validate. Let’s add a unit test to th ```yaml unit_tests: - name: test_is_valid_email_address # this is the unique name of the test - description: Check my is_valid_email_address logic captures all known edge cases - emails without ., emails without @, and emails from invalid domains. + description: Check my is_valid_email_address logic captures all known edge cases - emails without ., emails without @, and emails from invalid domains. model: dim_customers # name of the model you're unit testing given: # the mock data for your inputs - input: ref('stg_customers') @@ -73,12 +73,12 @@ unit_tests: rows: - {tld: example.com} - {tld: gmail.com} - expect: # the expected output given the inputs above - rows: - - {customer_id: 1, is_valid_email_address: true} - - {customer_id: 2, is_valid_email_address: false} - - {customer_id: 3, is_valid_email_address: false} - - {customer_id: 4, is_valid_email_address: false} + expect: # the expected output given the inputs above + rows: + - {customer_id: 1, is_valid_email_address: true} + - {customer_id: 2, is_valid_email_address: false} + - {customer_id: 3, is_valid_email_address: false} + - {customer_id: 4, is_valid_email_address: false} ``` The above example defines the mock data using the inline `dict` format, but there are a handful of different options for how you format your mock data. From f044ff17c2df7ad50b30a94ba2e5abe6b4b19d65 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Wed, 7 Feb 2024 16:11:14 -0500 Subject: [PATCH 013/121] Update unit-tests.md Fixing yml spacing --- website/docs/docs/build/unit-tests.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 4a09d24eccc..09c28dbbfe7 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -60,7 +60,7 @@ This type of logic can be challenging to validate. Let’s add a unit test to th ```yaml unit_tests: - name: test_is_valid_email_address # this is the unique name of the test - description: Check my is_valid_email_address logic captures all known edge cases - emails without ., emails without @, and emails from invalid domains. + description: Check my is_valid_email_address logic captures all known edge cases - emails without ., emails without @, and emails from invalid domains. model: dim_customers # name of the model you're unit testing given: # the mock data for your inputs - input: ref('stg_customers') @@ -73,12 +73,12 @@ unit_tests: rows: - {tld: example.com} - {tld: gmail.com} - expect: # the expected output given the inputs above - rows: - - {customer_id: 1, is_valid_email_address: true} - - {customer_id: 2, is_valid_email_address: false} - - {customer_id: 3, is_valid_email_address: false} - - {customer_id: 4, is_valid_email_address: false} + - expect: # the expected output given the inputs above + rows: + - {customer_id: 1, is_valid_email_address: true} + - {customer_id: 2, is_valid_email_address: false} + - {customer_id: 3, is_valid_email_address: false} + - {customer_id: 4, is_valid_email_address: false} ``` The above example defines the mock data using the inline `dict` format, but there are a handful of different options for how you format your mock data. @@ -135,4 +135,4 @@ Your model is now ready for production! Adding this unit test helped us catch an - Logic for which you had bugs reported before. - Edge cases not yet seen in your actual data that you want to handle. - Prior to refactoring the transformation logic (especially if the refactor is significant). -- Models with high “criticality” (public, contracted models or models directly upstream of an exposure). \ No newline at end of file +- Models with high “criticality” (public, contracted models or models directly upstream of an exposure). From 56db5cafc6af98d32923bff9927595742e8c0586 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Wed, 7 Feb 2024 16:16:04 -0500 Subject: [PATCH 014/121] Update unit-tests.md FIXING SPACING AGAIN --- website/docs/docs/build/unit-tests.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 09c28dbbfe7..442803f5b42 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -61,7 +61,7 @@ This type of logic can be challenging to validate. Let’s add a unit test to th unit_tests: - name: test_is_valid_email_address # this is the unique name of the test description: Check my is_valid_email_address logic captures all known edge cases - emails without ., emails without @, and emails from invalid domains. - model: dim_customers # name of the model you're unit testing + model: dim_customers # name of the model I'm unit testing given: # the mock data for your inputs - input: ref('stg_customers') rows: @@ -73,12 +73,12 @@ unit_tests: rows: - {tld: example.com} - {tld: gmail.com} - - expect: # the expected output given the inputs above - rows: - - {customer_id: 1, is_valid_email_address: true} - - {customer_id: 2, is_valid_email_address: false} - - {customer_id: 3, is_valid_email_address: false} - - {customer_id: 4, is_valid_email_address: false} + expect: # the expected output given the inputs above + rows: + - {customer_id: 1, is_valid_email_address: true} + - {customer_id: 2, is_valid_email_address: false} + - {customer_id: 3, is_valid_email_address: false} + - {customer_id: 4, is_valid_email_address: false} ``` The above example defines the mock data using the inline `dict` format, but there are a handful of different options for how you format your mock data. From 6112e01753b0369e4b6ba8e9c3225f7de46cf6a5 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Wed, 7 Feb 2024 16:20:45 -0500 Subject: [PATCH 015/121] Update unit-tests.md --- website/docs/docs/build/unit-tests.md | 31 ++++++++++++++------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 442803f5b42..322dedf747d 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -59,26 +59,27 @@ This type of logic can be challenging to validate. Let’s add a unit test to th ```yaml unit_tests: - - name: test_is_valid_email_address # this is the unique name of the test - description: Check my is_valid_email_address logic captures all known edge cases - emails without ., emails without @, and emails from invalid domains. - model: dim_customers # name of the model I'm unit testing - given: # the mock data for your inputs + - name: test_is_valid_email_address + description: "Check my is_valid_email_address logic captures all known edge cases - emails without ., emails without @, and emails from invalid domains." + model: dim_customers + given: - input: ref('stg_customers') rows: - - {customer_id: 1, email: cool@example.com, email_top_level_domain: example.com} - - {customer_id: 2, email: cool@unknown.com, email_top_level_domain: unknown.com} - - {customer_id: 3, email: badgmail.com, email_top_level_domain: gmail.com} - - {customer_id: 4, email: missingdot@gmailcom, email_top_level_domain: gmail.com} + - {customer_id: 1, email: cool@example.com, email_top_level_domain: example.com} + - {customer_id: 2, email: cool@unknown.com, email_top_level_domain: unknown.com} + - {customer_id: 3, email: badgmail.com, email_top_level_domain: gmail.com} + - {customer_id: 4, email: missingdot@gmailcom, email_top_level_domain: gmail.com} - input: ref('top_level_email_domains') rows: - - {tld: example.com} - - {tld: gmail.com} - expect: # the expected output given the inputs above + - {tld: example.com} + - {tld: gmail.com} + expect: rows: - - {customer_id: 1, is_valid_email_address: true} - - {customer_id: 2, is_valid_email_address: false} - - {customer_id: 3, is_valid_email_address: false} - - {customer_id: 4, is_valid_email_address: false} + - {customer_id: 1, is_valid_email_address: true} + - {customer_id: 2, is_valid_email_address: false} + - {customer_id: 3, is_valid_email_address: false} + - {customer_id: 4, is_valid_email_address: false} + ``` The above example defines the mock data using the inline `dict` format, but there are a handful of different options for how you format your mock data. From 440c660ce7174f5c5da69bb2708060415349200a Mon Sep 17 00:00:00 2001 From: Ly Nguyen Date: Fri, 9 Feb 2024 10:21:07 -0800 Subject: [PATCH 016/121] latest version --- .../dbt-versions/upgrade-core-in-cloud.md | 18 +++++++++++++++--- .../example-environment-settings.png | Bin 0 -> 70852 bytes 2 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 website/static/img/docs/dbt-cloud/cloud-configuring-dbt-cloud/choosing-dbt-version/example-environment-settings.png diff --git a/website/docs/docs/dbt-versions/upgrade-core-in-cloud.md b/website/docs/docs/dbt-versions/upgrade-core-in-cloud.md index 0fc4585be34..b567b3ebe57 100644 --- a/website/docs/docs/dbt-versions/upgrade-core-in-cloud.md +++ b/website/docs/docs/dbt-versions/upgrade-core-in-cloud.md @@ -7,11 +7,23 @@ In dbt Cloud, both [jobs](/docs/deploy/jobs) and [environments](/docs/dbt-cloud- ## Environments -Navigate to the settings page of an environment, then click **edit**. Click the **dbt Version** dropdown bar and make your selection. From this list, you can select an available version of Core to associate with this environment. +Navigate to the settings page of an environment, then click **Edit**. Click the **dbt version** dropdown bar and make your selection. You can select either the [Keep on latest version](#keep-on-latest-version) setting or an available version of Core to associate with this environment. Be sure to save your changes before navigating away. - + + +### Keep on latest version + +With the **Keep on latest version** setting, you allow dbt Labs to manage the environment's dbt version on your behalf. When enabled, you never need to manually upgrade the Core version to get the latest dbt features, fixes, and updates. dbt Labs handles that automatically for you. + +You can upgrade to **Keep on latest version** only after you successfully upgrade to 1.7. Use the [Override dbt version](#override-dbt-version) feature to test a dbt version on your user account before safely upgrading to it. + + +:::tip Join our beta + +If you're interested in joining our beta, please contact us. We would love to hear what you think! + +::: -Be sure to save your changes before navigating away. ### Override dbt version diff --git a/website/static/img/docs/dbt-cloud/cloud-configuring-dbt-cloud/choosing-dbt-version/example-environment-settings.png b/website/static/img/docs/dbt-cloud/cloud-configuring-dbt-cloud/choosing-dbt-version/example-environment-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..89e3dfba17559e094ff9a02096b455a7601c11fd GIT binary patch literal 70852 zcmeFZXH-*Nw+1Rj5EKy+5s;!FNLP9XrFZEy6zMfmLQfD;K~Z{#03yBjP5?!aj(~Is z(pv~Uw7}iG-}%aU58V6jjQis-Mo8Iv?YZ{cYt8b^XRQw})Z|Hssfn*#xk93-AftKZ z%GIVTS8yTM2!LM>H9iAha5U_srC%sYOEbK11zX!WT3xwvFUBdnQTe&~oi_hi^A9hi zrJn@`3MIT1smPPYziKT@Ke2a2vApNXpDzAY!0 zy4+&P^nJ&#gv6e_PG1ui4IfdG^W&N|L5{kMn#^0^vv9qqsLTnnD82e&Q~cPpJfJ6W z&(2|F-s0;@E@%i{)G4?E^*;n7(85u<>1;dF^E!~P_yS?C9J4cwI9^VMe|<~J(d&LN zIx7>@H=YpVrF~%NrP9Nu_{Z1WG`+oV_mxC-A#BPFgjTZ4?-~|QXT3{w`{n0HD+_1F zIq(ooDI3Z_P996vKg=AVYN64aV$^Ifzi&9!G7s{R$VN!xa|&yuS;@fOZTS~bbS!jr zDNFcrn3)q@y&DVJsz!q*Duj5n9m(#2B zCRfC~M1YS@R_^8uUQUkAZX#ad5C1wt1o(XZGxtM=zfN&?5Pztz`hr0k>}tgz!1aXd z$wLWZ1_lN(S4(RVO&PiWY7Tr8e`xFO{z`}tdPR9IM;`w0&>4-Y4B z2B(|1v%9$$r?VU5KQ8jm>&RHSS-9H0a<>CJGn`-7{3RITF8=W0xuAdj{iB~&UUvVM zlx1i-;Bvy7k2QxT?-gNcvIsT zwb#jal03NVoLeW0z860m;FcMNiEf>QLc*eHo?mtj!$A+`;>Qo%vQz;%!vXCY9joBm z%gzA?0Q$0rd*%NJ13>B%G3@yGxQmmUduwY8T0lBGpX(O3=kupAz8XWjMxL@`@lAYn z2eSoj=#vnOO%A;HMm4x+sD4QwIDBW`s-0upnr)BzL^Yrsx^BRvINM6*ngH=XW5;{% z$EZr(z(umwME3wHQ9w>Y+-FdunerH<-I<{06*8B;#G;%cQ)bg+?>F$Sy56kM;dfC| zvZ(*FMeNf@qjRKrpK^SMPQz#=A0!EY$w{>1I1E&_7kl^8y583!o(&GW9xOjKC^gGs zQoQ{Xsbx-w&vNm|mHKomcyk6b^XIFq4MTlg8`!R-F0?g-vaeC3dxH7}bn=ly>W;nEy z;{LumRqL~mH{@4|a7S$-8V=j?_cs$EYnjS@5tv&!RW1{U@@2v$jwkQZ>8;>sUB;jDDfCE@#2G95A~VbZW^Q|dkB zySuX!g}{41etZvu(u-u1C8ok+Nh2R%vE>u+EfGQJ>A<5}uRrONb*KgHj$ADpCwQ^Z z$D{zLZ*3^y)V1;K3PH*}!W#ReqU05{_HiCQ>Az#VSgQN%|IHijt)+Q*VA*dB_L zX@py~pCIhxeF;}%SIe%4sByli+dn>znr&`^+Y~F=D6AF|o90j6DQhyAI>E^)^oZBFb4p?A7dNA_bR!On+=m;@eh3(v}M?&oL@y6~cmvzg+B<}Y7)T)Iol zj)`-(H3GknSJy4CTR}6GK7+aV1#GZdVIe71L~sCZ69$Li10EPIj_i;Nqo2ROxcN54+aEp+M4 zAAP3LEU-1tHO_tG<<%Njio8kc-ecgl*mdwhvU7_(J7b%7Ayd70LqN4tURiucFk));gaIRP4ldi?Fss_ou(;| z29PL%TQ=klF`tRY#io{Fk@&5D-mAxGgTR>;)ig}!LcYLj-_1>p!L(O3G+s#x*S{2tR9V+5_Bf%A0T zqdsk~0fGQg2%4Sx4(#YdSyeIc1WT7pc(D$>n;gsv_ovfa%zLnfyv=8gNd%7?pesJdhP)V273KCa`nR?Ab*KL`xNS@^`4Ic0x9>pY)7)5M^y1+@ftcc%k!ZL>g=%Bp3 zR*%Flj!Q$ub*U3(T1PeEa<_yfJaGgPD6dS?-q zxHHOe#blwS_eN!1%A?F|hLnc5w*n#Imi zDK17Gl$Tg23fu^Z9iy1uWJz%8K&C2ZeYYcs^SfMVj4rBfthst4RowF#(or!|=nHhj z51F9Sd7XsX^eOL;z*t7+;AAG3mwF~Evz~*xLIJyiDz`v*D2KE0$LzYrg1JIs8Q-+5 z0zJrAp>R}TIRdg@9rciDhz04iyf(*pwTEM)y8BybB23n%x}K86&q3JzARanGdM#Nq zUH@5qZF{$|#H-EVDJ~s0hRl$`MGYkV0^MNJ$@F&ue=c^)9szoj2F~ohmCa6h2JD|dG@E2tI>!){aWEVzl3`f^wj=Ir5x^%~)S!!J^%UhPj zYTZT+rl&-kz}7;Po{CJ0k)z$4)9d3SByem2tBU)3_dIP@Jla88IKSWGy6}X5-Vkfg zr)B9X)oHO>lrLcC9Sx(eD(j6q*xTPx@7tW({)+z&W!4>M*%8^f$&I^hBnlz*=`+Wz zHM~hje9d)jKLzWF=GMEZClc}9GjQJLM5F8L^w-{;;bvD|@_zIfN}5+08l@__FUpYU&N&FBd59w=0}~ZhZe)B z1GDhzOe|rcBYon>Oz6bjff{r11fD%TDt_xXD)HMPenTsPPe6ff7YDt!pjW?962X3A zZ4)D&T7PMy$UiH~6|V4Z_rM8g&$Ip_-SZneRl~Zi+o-3?z?TdEF_~pWu2)=6$r1DR z!|k!1%CeIvtMyVqXLo%j5pKl|=5NyZ^TippvU|dd8jq5wrWRTi12sGFYb%#=qbgH; zb(0&AfM>7VGskY{Jo{5(qCVk}*6^yukGXgcXNC7wO@=^=f6t-QT94x^_>Urb;^mj| zi6Yib2}DKL-@dOFTNURrt(7zM?;l&l!VuQ{wXgn^k@(s4Mr)MWblDGl9x7=;s~_Kp zJOU4w@*>ES433K%jg3B1+>HMvF)>fn7r~hnEy!D;9M4b}n=7f#3k6jOH-2{ouL+zu z*tk`L2fuMN7`AeFtk}7QvnVHOyBA2Fp45}T)(9UP-cCRZUXo(9(gi3G!5s1;02?+D z%~W^o<%F)Pj1A0z)f_j19y%%~2bEN8Q#~0QUg%2d;+nDb?56ZLl}vbYs8^qFCn+*T zl1#}JZ#s~r=(J<9_GwuT+{mR@WD@5c68mBCc)0l$rk7p;Atnqjny-wrADgMpl4mt& z2+o(NpkYym`_5~#^j3;(aGfr%ORhJb*-T}4o|y|Q7dn+E{t%HwVZf#DSvTa9IhC*4Fr+%$6HaE&?UNUl%RA^5S4m7DOcY3$)7~&6SU5C zG>xYMg_SbliOw@5jx-+s;8iYOOBL?+u+(tOIHa`QKFJJPUXADanb5xb=EW&ttA2o& zNp&OktNpHsmayGGD-hD&7JbXlEQo3T!r1d^vQBd;bIGa5RyE|0$q5##%C+Jq&{v(E z9VDL7;sH|Oh1T(HsG|1URE-vR$)$#`K1mYrnM2Hd$?czcHOzs-`&N2TB7I`A0ix`; zaiGu{&APER-rlYU46%nR16eK$2t={QW44Feblk~J42s=^WW8>XriRqi)DARkS}eb! zhymet0z^IJ3{A{byp!d_z9HOOOjb|qz{xvreCeNV`zAPQCZ6!wee#M&M=8f~DMoop zJ}F<>=}MNwm2m%sAb+I7l;|4t=Hf)9RGC538Wt4$xW=q9g{BX`CW@KlS}-9>nNqMj zQrIHRUKQtd1vfbAZf3hppk-=D6kxcKK649FOK+`M*zk}dYBVx8Q@-Pe?@bTBU+{S2 zL=%C@;jN|D=0jFxJtr!%y(MDHAOgwLZsCX8PHkziEC69)*$BtYM0R-V#uUaOt zdVMbm7+G|4^g92Y1e@i%+dS}{UO zZRyGNwsrFHYP&~q+$IrW5*rp^85=*((~?5a0gpA3>Z|<4aYg?%8N2bQ{u|)}*TnK( z7k4~B{~<%6M5ajt}4= zqWX8)F7_=zXJ3{9fJFSs?mf|qM=y|amjIAKpw*Y#m!wTn|JRNG4DkQgw2{&>toh;M zDfi2y8Htn}4||$L`oyHcE6n}6*w@W1@w|GIm>JK5b>Zt5J<5Q`<;JBrWE$tXy8lbGpM4IB+J|9 zBQ{CX-go3F9TSZdls=lF5zC03!AQRr`gDe*iL^Nv#^g^+HzK9J0v=}o(NkqU9} z>FQrctpX;2`~cQ)vRb&2XwRH+e_Ab%+}clmaz{g1m7YBEIIu`=^Y|Ih(1o-1)@OXa zgKS|0|8Js&t?N1UM?rVq{W2SC3&@Obx=JfN{OPQ zcpldr?~-=Ga)7mwK73MSQqN_2lYYS-bk;LM1gqz}#B$@{r^iWU;5SLGPinzZC3r_g zdt!L&@36(2ZZCDQTqT~55rLS*$`FwgOvEZ(Y;Dh7!Z#rCYe9=nPm|v7iul?tYZ?+; zP~z048vpPsf{N|kbqcQ;;rkc+j`JH~;5bKJZgyQcov4)08}ZX=`+R6<;!~=tua?Pq ziDA9Pel_n72SaMZ?we&_1*_)C!-2Ct?+5%J%G>FbH;=1LVc{GGJRtxkSnIWwzCK!O z#H@PS(R;;n-WNmlxYAxX4xfmwD?GVtJM^Mqeg(Hwe`c}J$aStwwIf^t^r^0^A0M&z zz5=v>d$@2|jQF5|!3Yr?>p$$NbzO+QKUQA5k*)b-d!Pgc^4_Yfo}X#?UUfRO!dnJy z_t&gaQLOg|Qu(dz?XroK6e1>rvJ8)j<6hdswPF(2?Rh&^&5X2YE}d_~_5Q-{%fSFJ zp}+-%8!NmSQMiZON*j~HQ%P@Y3hfL$5~x=6icMm^y}Lese<39$>>XRHi_5KxhC@K` zoqN3Id8i`QkhT_&i9C=XtIaHgRD^C_(UTntg)THr9b48XTuWk?7w}GZWL1n_-YUjc zn{5#%2rURE@IqfIeE;mxo=k;&(6hd=w;fV6_UF1NAN8p2=P$W z$Rm1=MZH67L8%MIiz5K4|~I8X+gO z9hQ?3qv6Wx$Cyg6GX0S_2gGPS5qF->>D6O=IY(TV3ACAFAd5q-!myE%JA*| zjI?sN<|n`H8NzEM#ut}+Hcwu*)o-55V;S#sYW{iEb#wBtKbhKMyfv&dVq>(Hy?=q% zruU95a_ra8W0d6j;(Fb5*QBcVcAsQYAc-F(r{>S!!(;uhD(8tm>*JnS$@w6-?Tg zj0rS13njM$_6H9XHf(t~cxSb(@yzF==aUsp3lV7X;cL^aWLK6n1!HD?b51>8+IG+Pu3g6awM}Jdtll5^CW4Oy{hR_ zua2iSy~=f*tYLjIRq_C9)z|xZdnEBkne*PmT+Ld|w7K;Qivzce@F($RsPRY4yu5Ic ztEIkuFq&Pia7pzNG0%;IpNdh?FM8FaR4oT*P&fSC^#|cqp%x*8p*J`pgHB&hV zli?k8#N*m6Bkaw_VDxGHOzArXjH`h+p87jy#8W*+ARDf}BS0OO*-wYSi%P1ky734Z|PvcUu?qiN~ zo(yN6V^Qim>xo_pp@{KR^>c5_;*9)R@OgCa@HHvVZiZm$W0rc=#hWBK;Pu~HkxVKK zs{ZjzgJ)ArAp74H&vvBXl5Ozz+b1Tq_JtgV4aSSzpvQB}DzTVxkLZy#ej@iI$XWx3 z0o{|G2|J-3f5{F}Rhq;TDLa(%&U=RxbmQ?&Ayp>0K_z5J&@@rwkU&rZSRN%FSZc}(Sf*gcee{Z^`frp(qu5C1>u zRz*HjwtLPq&36!W zg6l~tw*aIzIwX#Z@b=!5^5Dv4->gq73qZ16-_)aG>-2(~fx(%51NQ5P*QT#))+*ol z_Xm|10#z|OzL<{JwL2)Ml>&6h{J~B8FCoVJiBBgGWj=^zx7+mdr6w=_Y* zNGaS>6>g{&Z$pk$xvd80%SFB1-KN+E&B;}%E*bLAw>g0gs(iz4IhSW-h}Xax!E(+FoM>lWPcT5TNMAL@85>HTUy1V3uYD2#&DxZmz2 z628ON9`5@qVGeNXp2aU|E_B-Z>@(+)`Tc_J_Vq)a{h;QR2)NrD#8OvO*CM%KhX5{ZXDWA?7}k4z%{{Yn;Np;NDR#qpE0V z|kEpR{p^Q5lDVNxbU0-%#DfQ5D^`o{G!N?r3Rr|3M8Pe~~AZe@wj_ z&6NQ(I>#$P_AW%gv(DXazO`eJ$MbaHg{Nty>(%;ui`|lxovKl9EEZPx%FxZ`xf**^ z3F4lm35Sh_4ULTpHHtkhGyP-}#l3VRRnfkIcdUHJHr5WkXiDWfac-U# znTaFE-M<|KoD`F6@)h>^Fn4Q)sOG3&`ybmyfv38Q==r!As*ehKjDECtucq!g^X8hn zeqd3Je^K|l2!c-6DB07uhN&k%8Tb3RGb1J$=89Yy$h_`;^e!Y07bPmX6gXtV#~x;{ zI9J7!yOApFX@Y!wp~Yz>3LxZk&c%5}5*n24jvmszoiMWm6c8PiqAV4of)|&1fjB-x zA;Q?Y2gDSU;tO*BX8+l~@8<`tY?M_p|G{i~*ixM%ZXbS;6G@)K$wn8MMFzULc>NIX z*ga09Sd4p#%a{-HU6nfKwG^fuH1VMqD2QgH(FSs*kL7tY>X|-u`3?bpyE@KY7wc&{Crle6xi{IatGvC@U;hSm9P?k4p zYUeP?TgW?nF(=Er=G#W-WTh5F>IhE}b?DM{86WLzKUgTmZ(`hm@!0g<%Q>bM^-wCL z*1`L|(!1{@iuc>9Cvj|J?TiTWrANz?e&F2><@y=bo8CL5?mVIwYYaC)fRj4Ni;`6I zG%X5J1&O;^nCW(`>pG2}Ihd*Hu+G64l|M+(_Slm7G zDNlC~NPh)$9eqVFR$@{sy=H`Ps_MFaD4j)qh-C+dO))6$`bcqoBDB#m!LP}+a{dW< z5C$&1mggxjydlY;I9}!H0Yc|vP;tAo^$JDxeG4TYD&?%aIqcLQ?hvHrYCm{^v1n7{ zBih6}qx#Ojv&oD-a7*)`V4v=KkRk|9k!pt>L*>$-Q^G!c3^qMb!kmkfumH2Gd{5vH zpdxxR6O9@o&Lu4QueW)W9IQ9kJL7R*Bp#|Q4FjGBFN;|1;KMb4N zyQf=d!v07}FB+(=TqX7qC3z3~)i+jwE*|lgMI0R&3A^sr-_xQV}Ne)O_mjkPHo&c9*Hy*h<88p638Ok|zENN$t_Sd}I zb1dB%%LzelvBj`=M7}GZkD+{nK1PsV@^Aq+6Ri1PAi6t##H+3A))c>_gTgv>%AebH z&UZWtGx(*m;~!LI+~}&~ff{p20^)sr&DIjjgD;Kh;}u9l6@XATagO<7=zB2uY9nobHd!I;o zMU6-v9VMVl&GN>hOX89w|FzT&vf$_nmZ$U6RLmEi^HiyM@Vm61pWn-&c#AHx-ykf# z?rop8&cim+dX$1Vor%^PWWBdsqo(C!W=36!)t=mU7fFnkA%IC3OMx3*b+Z+INy+N1a9RVcMM8bc&0}r@_N(e;sMd~|L=8$M z91_1Uhm)%LuJ{Ks7($5r{|g4!gMV^zB4bL8Z(8P8=s32Ynk)j*_3M^+^zy2^OBVpk zjGxOj3Y^}WYp*U2FPcC7Bv+`sMK5TGVLw*MWcR%xnTq2b8U3{ zhGEMkqfN#Xhvb_`%QKR^+xnjyY%+T{iu+AI*xWJ9otdajTJ!L_-h$rjbfLR&9BMGl z;1d%0$)Dm~18>II?ArDL0yp#?9iWO@1TJjxRDt0k?%Su!9v1U2yyY}7qqFi;nYBC@ zp8MA=M=%1#2v_43ii?Kw`ELxwSFge3A4tT>U06mrw*&V9{$s?PQt^d4Jhw&~j{zaX zTeW^6d5c1rQ>+{9f z9KfU$27pe+_85~(g`~d#gxr~Rv%7HG0X2t!pJV_TQn+aM#oPYCiV_ zGNC~I=ch}i-lakw-vNZYJ20lc^r^W5oKX2t_Qr?j7re;l$b12WJZ@bYxbWzCi~k!M z|Dm`4t)Y<;;qBxv33x#axxXoy87VZ3p1X$GJTIhTraG*+ z*tS8`9G7%UW&Xj|9B+r1iu(IYSQ@XT?%xIqFXZ&}rdxw{96EY>S;)&_3 zq+m`FDN^!vwPYdlRu2{Mr6Z-(q`9lh$WQgjXUt5vV#L=((9KK z+XLh&`n}5A;NP`^wS(k8yZvX$@xR%z^h#i^*EaYnuu>+Q5(}0dp*Bo%`^5M}Hl5y-0vcF0YRy8;byJ%Sq!OQ^hFe$~&CK zPaf81abN7Cf~9d?Bo3f!v2g_^^(Hsz#hGC+7{KTwJ61~Iku5k9IPjfgUKv7Z`KtRD z8{TpXL~3QJMM(e@Y!|NNouoSeL0ngy(3#-knMxNXm3$M%ZBV5t;(jPogsgE%-4Dk} zRSXndo77X6UA`&@6Er!UYEY&AUCdr-uTA3qa)Pw}18lQ@DJqP~v*>=2#SzY1EdZi{ zt4?3y>jRz;wT>kt9fq--=&F@vV!x&C2vEvnqw#km;F&nrjmfJc5;W$N`UuxT4x`fX z-aJo9Aog@y;;w23SU$5bg+#tQZVNdWYm+K1cc#*v>+YY<(I|$xYsLsyo%f*!CZTka zRG{~*LjS{TFa%2_Cm&*w8;t`w1~keMTp&X#NuQc%cB9S>WR15L!HrWT6WEt5%b(#~ z*W!YUi&NL9%k=yBr1&tduCClE=#5FGfFhnwy(rPbIm>+(R=G zcXH?|zoK6w^xtRN72Ggo1~q~v7VJStm*;v8Hz)vHs1nPUdt?3h!&*)Gmw?e?xzLC$ za(~yJyM2+uQM+qXpp;^b9y?}={3a$!F5`;wI7&_fF8}VtH4)wFUS%G~7m_r0JlQZP z$;b52Nnjnq*oL+uD)INi8aH7LZiTonX*lvMo)aYDXBx?(%m(c#aOZ@NH?b5q9Yy+y z?h_vFVG@dVAku@MZqN+rX=W-><(!&}(wvSlp)1dRP6rO^+L&Rm74^}apl`aMCYZFu zQARPm5mmwJ?3x*NU!os>-mNP-6&7UzB@_;_{JE*IpGm=;KuY00T&=Y#=xisLuUE(s z)dpiMU+gB0PBQ)+mXHQppe`Qu*s(c%C@z8GHmXLu*M&dBN<>uC47s5kULb7Hrvd9A z!k+h`km*mUC_<{KZfH)S@5*RVWrfr4$ptj*6R;d2_z+iJT*EL=+plw4!E40xv0=?? zjzs?7Ct^)!-+7h->zA1zE87$XO)ljP2Y!36t~Pz06PIN%ZTlN>?Uwk}ShXf0PO63Y5d#ISbX1S6YI_Il8~i-{wtJSFO$I}c{A ztV|z5S_!_JhkT04x=kyL0kSva_oih|Y|y9Z&u7m3{yLE=hJ1ErxP3SyLsjZY zS5DegC%R47jKc}`OkzBfh6MdN-Bd&{%Qi>ey4HP0Oh=SYX(eqR?A+xlx5zWBeY3m1 zjlg=EFC^~q_^eyj`Yj}Cvze;-K-SE(N|q0O!2VqN_Pt@;@QLckfkz>VYx`5Ez;(%a z8dm31)IE`z>7WMEI?P)l^3EE?rcvJkgB^-gE}OQ&fk{*QwM>7I+m8(YF{{%$MadWa zb4c|A#Yh%)Ht|m(CYac`xLx{_&y6D$cAAPKq{t|i&gf52r1m7)f1lt|6?d-v#3SPj zx+@$waHj8hw}wNvB7E&(qMXH#JV<~EiyA@3(rB4e5c}p-p_}MfjdjHOflZ8JteZcG4eL_^jDMUu7+&K?N#7vRi8x|TYT`FDTLZ+%_g8gru@ zpQ*_&9qVtd$udk3$I6eD?{VkqW=2+kCp4)A3s?XSdt{G4XN>AvY>lhcnHY)`Ge}?8 zIE`OHN+z*ejG4%N-4Ug_0$>MFwW1Ops(FnTPI(hLd48T4Z_O$&-P`p>SI$i~F8(~eVCg@Hc zvB?kc=WO)#AZwhCtQ|xlU@OzLjVERss$F4{XU<4=G3;9oz#~I@4j_>#)Pe(9Ql*54 z!0aqlGbI7pfd~}WiqNl^Ef<I(P)@R6>WeaZ|M@<9Qq{(* zO1RCN`Qj!`6{YhU=N7_Eo`8hL>GTcDJ8iGL0uE4V z+exxG8{tjbQfwTT!6Z~E5!h%B;BPd>-ZtM6fhGdbfSHj|XR3qcH4Y@~Py&G%3 z-;avNoR+!*H$a1GQwS7ik4oMhlJxw(=ez=(KB3fh9}Bmw9RZvB5^v$N3KF1D^J4C7 zjwq~_{1$>u?%`P^8A)vLwq}*N7WMoO+GYgnttFt4U-q5VP7~Q>h3(5K9H>|z3@~BW zE3Q;M<8M#aJo`K{pOrwBlPR~ywhtX#blRW7Dt|qKIK41*Gj=e%LvqtW7`j*h9WfZL zyO$CBKFg`|4(og#(Y_a7b_%Svl&GF zj$})H2mH4R%D0~zxh^!sefJw3L5^v2Bobt8IB?fmrxhbNi%~@{53@7gCZLKe)M9ut zwV_p!g~%=BM!yM{F^Vq@l>1F9y$E2vPy7yod3}-9$`H!5jdo+I%&x0`G6#^DjK2<^1$%17*%FgtwlQt0MN=$nzulcg zX+(@fY$dd9Tx6Zdk@$~Y;w~JRj~5eT$l)yK_?~G43A1g z)VQl|k0#@Q9H+$}vqsCudz-PmW@)4+_EGtorsqc8-JfyoI)WDaeo4dDXD#20?*Fms z4!W*px79mQ<~7D9dVE^mM;L-I6aaI;MJrsO`hO}GXaV|in3QT%N-NPQfu~;GLD5~3 z>DBe6asHGT;hnfq(zacjeqM@{=@tskq1CT-q~*8hRLjmGq@zf3#3rH9KlcIv)>(FrL;Smpfj9zY z`T|Hh_KB8*-1E`B--gAe6U#+2(nDlU!NYz#Ei-5VJv8WTCSZTZ(`I-1As_=Az!zTgY z2#<^twp2n^dy|E2+|ov%dsl%4kx`QkRN=EfgilL6A&)g5H>nP4)|g3jL~w>A^FXuI zR5y>!J?{Ul>K1%2pqXqec!hTyquI2PZ=JQvL^E@W{3Hyl7ZQ08dia4S({khFM^#U@ zcwMlsPxvkM8-L6KPP{?#sXPI35AY=1P(dDZi5(<}EY;0^kCUWxa}tp=hadW@5V=QfF>MAV)T$~y20hjr)U{)nY^?DQUpb|+ zZ88C^&&B`|-XjqsKysd+jU|Rf|!uy$xyekDd^)5vEeeR1&BX%C9lf|n|3x}=tOEIt>Tk|uCs!u(*^AY zFANMOx-^N|@Bl&jCszRqU3rgEJRc8rL-v0FpMT-Un?m?N_+9Tk_@2kD*RTHdygWT7 zCMvr({&kz1fPd9u0mAk!mmBxSv;MxOd(5fsYfOn2MtJ$x<2d5t>__-of?nX`Pm26D z`0+bmx5~T89}CUWE;Q~SNQPJ+r8FL+W^GzBgD>g~|Nw7192A$+nxvKytX_STYQJG^ZouJ24Wk7j@U3t7Ab)(kTjjJHvMBDq`hjQG z=5${2p|#

%nf?S#Qd^tcKK0J(BShE6H?oOL>qFP%9z-F&H}<3(XyMVSM~TF!+~-xh*Z0iYZ+#4c~yy$6?oR>}a!U)fAEKCX3a&;@1V?G)lU1*_}b-H&HKk;`jw0A&5RY zCRXs79Knfpfo`O19{)2ZAy;hZFp2OfN5E9KXk zQ@WpNXT*oDjnxUUQFbQ3_Di#Hl~>@Pa7C+Ar@(wopxBg|I_KAx;}il|s+{T=xM!sl z7oN%tvzZX|t?wM_txl}jmdFl%S?-osCE1zX;g@kM5-ndm_J2CL=A=)Py>LsKj;|qZJR}*brt5TCX!dKIVi$ce+@=635LAa{5vY+HHmAURCH1! zPx)bFaAupnNu}btnEmE(V>ExjC^9Rwy1WH`6pAubMyG(f(_i8^0o;b(X^*}hc>jFZ z@7WcylO^IU)mOu;W93#cE0XHr)W1_Jb*M{z!}!ytGJYj_kg1AqrWq_4O2T$u<-QUO ztL#M#yR${L5zJrll+;6yD5BFxh@8zk`+PCsf~rdQI7M!v)RiZOdooq?tv!rvWMGo^ z@qEtueW6-LPAsbE$AV+#;Vg&q z3hazDk#>XZEX5%y7A*uCy>e`79nt&SVPwMn3B3naMgk@Hvs;3j=_}&s8@~k0W?}hn z{}eIip^&$AT&)EEJ-hm6wMmBkALIZ=dzor5G6GltcU6)x57`dzBHWf1#`o4Dd3^2c{*EnegAcPbNDExz7_)lF8?9nDSKmNXp-YF7Z?yE@2V)!^c@+;f>;o z>&A(9N2*{So=wd0(NRa~982rSCsv2pZp=c5#}P&_SE&M?n%ZR9m%=|<@d$t&U1#T6 zk6F+nb0%6iLO&)Zj6&f;tP-An>nb|{uqhh!4U6zaOXTjkLVZt%=n*mV%!Ea8adEav zaptD}Hi1Xf?q}c~>Jk2;`1^lYKBs1ZiNYH583q16K>k63Vfc0xSSG>x;r6@xx?`2h*0m3w$dDpZ{S^(&z}#gO2NsB;0%})% z10v_G@CX5{^9VYWdQcPj#QZr>U-x_!^bJ(~YKz#n$WTIS%kI~j!!L%D^BgS@nfUTY zV+N1^Kr#3KnDYOqjqq)+*Zrq2R0NKur?o<5I}ucyf?C4 zWUv|iH{j);<-<~=*A*aqZus9fQa9Wf3D_w#Bk^ z#Y9rti?idmSYUP*H~xx-fWAQcqDB8&!xwB80Pq<)Jm>slITCmjezPs~q}L1o7>rur zei)wsod1tvPJk`T%-kF!kXXi0pcBcZ0TIa=o+|^gy>#+rqz!nM0Xgbs**vWy5cEH4Wjs0b;lvg0~ zBs$EXFX7i;<=eN?&5Drp^NLy!Uii7~`b)_H`b=p}q^sz6iNs+LvzNaD7j%I`0cL=T z2m_x}oKH&t8tp&J8LP2NQia^E-}qGjZ~524US~BAB1wsWs#Dl`4na14QTGwo> zGqdBriq9?vQk3E&NYXuw%wLz1TBiV7`KEGuzW=Ae_*=-)Y5o+y&R>>t3&|0p99lV|m1$B4zKB_JdT4hvH+Y0vemc`ebj zCg?2D@PPB58vE~KlVO;+b!7%KK;bYCtXaVop9Inqg)WaN5CktMG_qLkvnQ$^>^E8% z)_^frU-=ErS)cNJK`j904!TM22EM)SF*ppj1R~`YI#JKlbUwS^8vFEOx7W8u^>Y_F zr_X-kpFkPs_jeC_lFOewKT0RRq)?K8oAT6cG)%%CUMRlV^(&Ig$^Ou()6;z8Mc|O= z=>+32G;D{nxL*)-I-+`QVO-=r-AzRpvAz~4Mh?Vi_=+(GVe7t-X!tN?kB7= zA{BOA+!Cg$z$*F`wdFW0O8W#SwU45LCuc5(t0(NkT zS#{B4P+R}MF2or5<^MY zxmB4^Oa1vdNzkfwrVj`niaTbC5#(UBCVSSBhSI*X`unkR+l>{F6Ca@m zV22d!qI4IQ=;aax`V>3wbb#97pFzI+ii2|Cp9dP!>swzK5uP_Y02tlr*6E&}eaB`% z>i8A!Y&vX)e#9H=tfMQe@siay==pnpPmk63>?Iz)Hv4>1Z&mO2tGZrHYfF)8zemUb zvC2)(fqpDr?`IY`GvTpbmVM*Y{u5T}i*I%n;3-mE0Y757Gu9#(2EFSj)tM1a=FdLFgHhu88 zUX+ny%A_!`^MQjRz(Tc}%PI^QU+Hal*M)LKTZ2cUfD(~%)O!fXNlXlvuCH`1Tc&#L zx3{8e!YkJ+cV6dTuN^-lCT|$tYQk(xMDoh( z+D*@M`l3gQK%R;9)8b-cmam$^fVI1~BiXEoj~@ht7Q1((Z(G)CZd;CN3fwCy?}M~? z?zDlGes@wh0-IDGYAD&ZH`t?)!&zt+IBI>*2Vzn&9OmlOd+uo_uMQW0xOW!0tGK5^ zm!Lev|t+lp-MPQ+$v(nn5By|WpK5SLS5;#)>Vp8>T;8bN0zI6+}D8@bqixCM*aSTt*qQu&u> zuAp1mT`q3MHrincn^Dj)r5)M8Gn?L&^7c1bYA)k%m&7Y9hDoW*ta==A&s;W)gvAQZ zw_W>l>!6~KLD>KF&3sp!ya0IY|6%XT!=db>zsr*pNgG0zR$C}Sc2a4ReP1JF&pNgl zp;FmW_FcBDV;wOVQiSY`WiTP@82ii^W6XOG)zj1Sd*18)V-{pMI z`J8h;=iCTb$k@~%4j?)#UN&z@pV-&qOmeTRn;Chl%a0crh3;P!DjB58aTy$D{tjXn(| zG)@pdVCae_;q6rkONKV__D8^!hO?`t!CXa?N|LJyw9=LAK|=`D*BdK;S;x>h9v^|k zd}VX=NMv!o3$)cb(05%y{Z`zifQ2zoSI03X_pXJjVuR4?c3}cxjcIrxfOI;n%B%a@ zJMV6fLoO~QU3BkUfLWZ;PO}QRu=)T_Sm;dP*UGs)6XA2ax5@c7*P7n-2*Z!7Wg8mM z&%{58FrUr`bg3v4u?#^Sv2277IezoHAJM<9sd5`$7f4VUsU4}~EdF4*T~pN_7(Xx-i?*rau5%`_l^vM^dh4-SZPt3t zmDVnWQN~ik&(FS;E;H;+1tJpMrQ@kW5)qZcS919+ugn&d_1JV6@Fe`TmDyrK3O0D! z%Wsz#;vpo;bloxsSPR~MP!KivL@31)>Tc9;VKNAQ!`XtmD!eLW?D#s6_|jQ(0fce z)720Sn(sGyHQ#*|Tg8+se7t<@-yE!f;DeuXzg2b|HU;Vj+t;v%GeQ*RzfPUE9&bDL znI08C&hCy}?K__3SPUXJwJ+v;fK85$imn_n0<5(&X%nBn?K*aGcCge$(!1{daiZtQ z2{=!-gn&tDTyg_;%EKs6Czpr)1M-Fd+KVJt7T{YKpjvnhOCE~77v-BH&$i+sJz~ zNenzKJ5!92`(V&V_VI|3wVw9sln=_9&UbEW2Gg}QG^#8}sdDs-0YU5+!r4QaIw~(& z(UAvdSFxKO4+qA`J!wO9rPEOVOo!Zw)24#umK{m_8SS}6gyox)gnM1!0OD(&!uWo! zjm@Hvk^o>EWZ%`7GVcvJHzR4QUhV)SO0PH}n>zMUh|MmppZq=$S}|eg922gHI^(bK zYhU8oQ)g*YPtyRFr(C;mpJ;G1eB&AmW+Y7;3$|s$`w4gdLwd z&A*s!;W9i&qGC;;I{QK@$dE9vi1L8|HsPF7;J$!)<>79F!IrnY6=i+OcC71h`?3AE z) z@#d?3cMwR39NkN1D^Tb)svzlK2xmJs4KLDN6YoZp@@v$*-&$L;mh$@^=e{(oR2?51 zV@$kzI}z~mZ7Rb({Xc%n?J2b3mU8h5CW6kEkR{U|zg%5)Dyy8z=)j&+YY^?J1Tonn z%hMedERn{x#Ia!4@pTBi^Y6Z20nKN-YE&iJB<<4349jU0N0QggdYv7Jd`<8%Zdmnp z6yLgwS`PYZ>>8?S<@H$5{xoHJ>EONyE;p9sL&L)MG4}%UG;qGzkb+f|@JAhW|aBh0!&W}a>?kVJHd1)8=E(~5<#@PEHD z19*sk;Q2GRznRL1-m2a++N2r))G5hdQsy;Xsb>py) z8SU!K+jb*ZJi>FugR_Ti@>#pjk%T;c@TNPpM_`fVzY8>ekdp_lqVt8n6ET_HE@ON5 z05|ug>Ce}JmBA4wrLWyjl@~;Z6C1McY)c_?H@mGm996Sm@2JYVW%D{)< zPn>^pewR-I?wZ2>hr-me!gB;pD=RB&Ecu>a)%|oExBsT}& z*=R||6t3$rR5s}><%>^JbpxEsqatk1@cX6bo2h%y^(s3hx$|@mQHRqBnY8%!fmE zXZ7O9&-xGGM7Dgm-Fwb{I`milhmX(AFXFTNc7qd?G7$H&hPFL-bL!JQrxj;w31>KI zHI6Kp6cffuD(#ni`Umn&+bRfSpT`(@IIq7xb4%}4kI}6IQ*xB!7aU?n+b`_9C4p$< zZCQ*Gv#Aq@*h{dPUA@G^MYfY)$Ty25YNxfBty;$zyw2M{=4|Udxw^;_uZQst_Ra%Ccz&bye@uIe9{Yf+Dy%E24T2kDm zsjjjL+Vm*!jUDxCs!ZYKG8#1 zVUTlA6xGo(8}WPKpM-Zd>N_EI9kOCRsb3f~lUD8z&Hi+}38U0L5l^O9N>ax_AK^k2h>as`e+ z*493A!k@n0&k)#kAo!I0LM0mfKlb7RR^(0)?|%$4EecSc!c)9^;Jc#xIG{g&V3+|~ zXV1V&)>@7>__qP^e5KfWe~6xAH*9Fm%1~gC_#oEAO(jL6uTZOP5x!O}+dBa?^mvnn zUt2Cg)~Vjj*Q@lD&0pxTl5iS%6rn)Q;{^99Au~0CWG&+fGc=^-w@_?pNJp`#RqOZo z=6?mn?oeBwz480e`b;qZ$htkUABB4^V|0qNOX@N9&sf^oQ4DHh&Mhq{$P>G@>GqhY zDDC$UP~V+=-NKTC2-S+ZTHou3AogR=8962oLs*-^BO0FTAwOk*ci+`rsRBM?+5BZk zwCGQ#)#K!S317;l%S7s|;^PfsBI9lSzs6Z|g6u8->Qrc#C$IXZj+4LDO6uRa^9qc^ z9wBYQPkTTdSi(P;J$j01^2L79WD$dMprk!A94711zOTGFT;Jq!;O!{tIoI~ey zmLJ9%qFzPkJ4|HSLaMlfLmxMw4PoAE7qr--zZP6n025#7;OAJ;MxAoigSVSGAE?O_ zs+s%*XGcG1fPLq11jp7TG1pkmt+hue1lkmt>GBu1x!&?s8Q-8Kx4{=BNXqhGJ zAC!Pz!6Oryib|kaCCY4#btu(eXq{Z?ri5iMzO)s4@GUk3>fdVOzdm@-bL5FK879B6 zAt-28l!U|f_9`q5*r>^Dy(Vv2g6;JYMHOyYMt%3Cw)tX@qPuCQQH}?{id2S%dW>ax z;)eV3+qbyA^eA@2X5J=V9W7(ak-Vnms)-UrZ@(R#{Y#}DQ8d>B zI`NO`tU9n#HH>-efhZ5Q5uF}E60~%xbviuVutLDI^`OeoWfjheoc5Hp9R69O^lN!x z>}&Z#W_3Mu{-mc?VRW2)M#ce4xjl6##Cs!_44Jv)kIKTM~ks_!_ zX@g3khVyMes;gLwN(H*ALn}@uo@;x_jKU|2E_zyhP)nBR)iwi${49ipE`Ry>Keg+g z0FyI{LvKw!cHG=Ks-DsHV@0wp8o}I0Jl3XQ`#woJ=8lfqK;`bSp@kA8@q1?$O{50{ zpZPnN)wP1(=W@XU5v?C|wW>~tTX_aonj0DN*3hn9sWl!-;;D_%nyxUkv-9STQ+SLR zlYfNeeeTBq;}+#F3bwUnE&y(|U=tfqbZ=w2=-xdapDahD2|^yVWK)bVOw-J|LdnwP zixy-pO4*d)u%P+#JUlzWvj%_txM0V&tBcY`S;;wVougz8_Y=kY>GZyBHmcRZI*N2b zkAU}ZR9m%1tr(zyEEX)XNV^5IbZ9li!zJtPt9Ks5g@sGjxP%I1zKWjx@P~Af&SUvY z!xeTLL&qVcQ5F${7@KbC3j56&#FlhRtXKD2<-;S*Hq~u5W_kkW%fs9amNS~R=gVpn z#T~zkcD8NqshW?F1aD zZtlY`Wf2sa=?(Tis3p+wjG#36Ejzk_{&vg>S@#H-eBHu3G3<75D$Hgi?21mxb*p>Y z7tTFOZ`M~K{yZ(1mslzw09{=SHjA70&8OrG%QeSxYH&Af8Vy{|H!aNLw*(jG zgXCSmdiid4`v$ff#D-%Fostc+Hz)FhAjFtNeF5_#cC~IA>*Dh{l&8pPjm)s|(B0yD#{Ccz2hc zC|VpW@R0nh?S0HDh}A=@>gZ@_8KA})7~PwP!<~BKCz{?}ekO_2X&E)v68|VBR<_WJ zS;FsKTN_ms@0X{{tN8kN#o`BpDp5_U9AwW%QWvA>+c$3uuG!gbTuk{B38_B{(8(7o z@FNxyu&*l5iXtYXEu?nMH$9(v_vk)X6>-{{e4Rqgv_%iC)<>#J?iGNBFCQ3V|4xH% z@qE{IiOKoSHKrKG)EuARAn1=1^eO}}rW3B`PSWj)=4Zt;myG?MV+OpN1xsC<(|}zq zP7u#0COWVLJrMoZ3tCp0(-v;mUBCEKzyAxG6zA`wH^QIu)?G7UTU_EZ z*!<7h-a#t>{ealyIR4zLUtZpz2K9=li{$@&%z|h@lnKmAVz<3yz3?&p^-fJAm|t{Z z+t!_%Q%$jXRIJ-IBO3$$53Io{ATRn3PeO^7w-q8_F@jBbz_HmZ-Y?E?& z=jS{nRIH0%v0B=B5bVJ01(lJJH@$m*-CL1n(?5ONf7c(ml4K7FP^n@ynKpH`A^@2$7P@9F&n+XAK>=Yee=z7TbQs|@0&MY z^YrqaDlmN|u2ZedE&Jsu3tECkup~~mg_0XR+{r(DlE0y9Jq(yzrTBv%`FDwjU(8X( zE*a5+Mo3Zc5!n_`G?)pMp%S5)BL?2Q!XalDmF&66mgR&VdhkoucUC>%jUZq|-}o+^ zl-k+l!z_>bOQVzB7QH>YZ?GC=G=({Sjq8@M=~&>b>7N)N=jr4-j8=c0ki2yBr+0SV z)O_PbH*rx}w(UFWAj8gBqwee#{cY{(&%8Fy4&`+D6p7z*>l}VD-dJecYYoA#g4)w+T-O=b!5De%v7INp~dG{5EI&OIq*6)IouWBxzDTxS~(pO zE))A$lT2ssmMv7GxA9Y~sfjd59LJSn<-_uyT640eWyY%9ruC;<=kU#;3I+FE*)T(8 zIUe&PLrvjqmX^(76{^Av+f_EH75j@i8xJeUPCzal{VBS9FP;PrHz#{#o4EC#U&QnP zjndb@9LIN^rIZoS-kond;DTzx@O*#1Tw^90 zQl^n{(-24qg3V=nX;W3gPEE}ew&~m4jk)Ne^!=gC2yHv_r4&)CQXwGj!|@Toi$g}v zb>k%LfU}wXP+qiZ+@%J(p=ifCm&yI4e%jt33GbeB`8s9U{&}t!0f{JG90d`~C|l&p z+BLipGEc{zRdxyc*AjhH{*>exEd$G7sa4y;x1hr?0iFE8<)e*cA9ghpy(MGTJ%?qN z6)_t0ZFOD;>V7!IijfR_afS7jfhc;{;7Xq5LaPIQ!I)9ofmLW+E^FL8BBx57?` z^$>KvtRYdt-dfzgpI)L}?dL%;hto!_aPsfrV&4dlVXhnH$oY%>W8V(56lr8U_kaHl7C2@XvTgc3XvD|3&`>

onc|lioaTDiO+T=0$)n&42czv$7zyl-U`So)1aC6Z9A<|MUMx`fBNm-_T z)L8V9<1nnEL3zKCp^lI7Atp~hqOHR)}+5z8||#+)l9md%5S z&NYje7pdTmDyhVYUlkAyOT(NEzAK}EP-mel4$*6p>|pgcpOIVQt9wujgGlwD&E1@woSEFug;wSFpV8-f zm%eAdr{>{N&FsMBNS~Gu^Qv4NEmVm}NiU<{y4vG4iM=jaU!Y%N;dDF3YrygcK0TtC zc9nih!sfuvoXG+0Nyz4gHq3I?xZPdYQAwCtEt)-o^<+e@8U$olm87GRD9OA8dD;Coav|L z1Lm%<1wvFwa8Hc0qO@&5dgv_4(@FI53`}Y3^6806EG$Ns$u=98I z%>Sl6slTFKrzrgccPieoSmN>x-hn&yx&bVz9D`q_)*MZ&WB7Y{3$F=Oa8<4@|9UCp zE&aXy8@dN&!N=4CoXLpSJ8t#s4Vv5W2AGhAMKc3~p%_ysp_TqYlPYX4)13Scy~g-)V<2est{cy%&^HG4!hj3 z@<{X^x|>F34Kx-$7OPLjR1^)!?)obM*MZ1)@~lc6dFQY$(;(DRZGksag=|E}$6F~J zX0xpvBR{@gxUj(JIf-Q&2FNRCI?!y#Q+*a0eTg_G&!%kH(9Mg9jx1vx2c`F;DOY3{ zO<68(p^6Z=01MFgM8Bj$IYn;GaD=4MMVsoqqUt*pX5uD)!o2`)N1Rx$9@Qb44r1pk zu2`&Zd@NcV5S+EYI^1-%IiuzKy;L!R2ppg7PYox2Hho=1%Q6^`SfiKyaK`w-_qY|$ z(RKp!g9!H>YU~rm6(Cz-A{)Vwv7;;bECRYMc?Wq@{bvv<{zOh+Y+;0Js)$jE=rr=p z+qVUGqFbqcWLz8eOZ?nibb*E8GwkpuUv9{QCBNk%Ph3OmffKssADy+ZMI>&Kg?U<2 z=+zo02HDvIg0pXr`~|RzkOilE6=>8-;>*iAmjJkD=;LE`_cp(l!y$UHBOOa0-#ePj zEYhVEuN=SNoLqnQhinYq{`)K-5hOpSET96&&+a`f@g;o-#O0ihWJ-k{U0_=_lm zK^|Yr#*GT_X2A}bOFn)1-W(ssl(s|4Qy}ew9E}DN;=`i*w95izs6VrZ8 z63Z?4p0v*3JiN|URtUtMW0ImC0(6IV6X7=z;VWSv*+(|XJ_R20T}Y99OTz415md6I znQgQ{))2>%Uy_kiPN%8wpe-+B@wowzSBS^rCpTd(KSgdJX_CG@f|LSL!`Na#s)b!G zVpImjmU9Ygc6`_=6Wm>uQ>ys(f?6fJc%IW5dyoAcs8D}g?fjJtEJa z^4TbvAxn`KRm{FiHA(xYfL9#hBv?M#{vPLi+}v9(X|-!+mF#G3(4w9v^yL!dlyy$3 zY<;!IoOx&MI*b-N6@*{14CXF{a_bdf?evtx|bt3BAWuZ0S9Y}-8&Syu7gCohE z!_E6~n9XgV!RK4J5ct*izT=xSb^FCTl$qu+&EozIXk>q_TGCuch*g{3U}FU0+kl=_ zWNWnGuw13dWU2}&23@6|;iHp?4aYdY%`upKjvMt1ZvihI*u3}!BQk7%brzG8em1!U z1hbeDuVp)a{^^FDP96l58V*0(Zx zy(WY70^x~dAUlHkj;4HZThTdRyv~lnjxllheK+9VGvNJxt;A{6a8dkfd-nZATT0!e zVg78=yJU2UDb!VDmS_?;03C}xn~Y8c6NCKG{g<74^Wu~J@wXSraNx}`-_VI4{X4Nk z8TMZZ3y+{;wM8FMKw52qs5e$}G^5Gc&1s(N_)3i=)B}M^bxXaHH~}On&|`AsrRA+~ zomo<&A)zHALY_F>6q-0offlP&-rpv?HfNqYnWnkgKI2n z`9IC8#p8KET21$Szb#@+9%DX?d~;a*xY*ER)duEVSu~Lu^w3Lk7SGcw<4yII10BT? z3K**S)$Mg~sNhneL|J`DWNPAa^)MDJd#htWt>`;n1@~Bds3}c0Dk{6bNo` z?%P;9^hHkNn~~B(+RnO7&liL~QTkO6(B2Lir@D`HT&6x)@(71rliMkqjs%;(!moBM z*5T~9Z~2TzgBm5V&3*)m+;~J)_>?X0;o?IeVOpVt2%1wm0($s>3G<=TjWD{@7?)_23v4~I2J zIPDzHyeQ2z>o98C*j+N*XgWw^sx=z7bb1&ci~hczmDX!Qkelud;egf-hF^WCz^$)k z;wmmgYUSV_-b-3^WKD4^4FjcKkIWKw-~_T^h_AW4xXLm$g)xP2yikgp5^GSDxL<$P z%wTJOKKXO{^7aIn{Mm;wUyYL$I}o`zQav{u0CSzPBhAB4L)@gfs`+Byys?lpc8lbH zpJNUcmVPQpydk4Y4AX(Fq@ammAe&Tlp~*MU@VY_Ol1;UG-sN(~(U0zs`M{6Q!#Lz( zJ5-`!d4}iZBoDB+-xK`gQ)>rN>TqULA#onTc$}EqLViXw$#1usJ%KNEV78X3%IUrD zLTr5_A)U4(C1Yh7wH@WAUcL5WQv6aARcxKUWgSDPB{H;~WFG+M^9(nEtQb`7-MZB* zFiZ*xT;3doGVG}|_0OFH)w7yWW`lk4bIrt5(qdT-rPj3UWd9Wk+E8%=B}Zt2xfPkOE558SN_F&h3pw}6%VLx+gxXknHCz|pQR9kqjL?$7dn2U z%^?T*)2eU%fCLhO62OLm?x5E{Ip`?MfszZav>-976)>2IwhP(-q+=` zrC4uH>IWRB)l*Isjfl<~ey=2#YETfmvU2=gY~Vpo--4A-^PsOH$I1F4wabSTbgf(k z)S=nZF!JVtEt;vLikKy89?e;_FmnrQrf2%CEQk5Mu9n1mL;u*h!h2(Rb91_IPeujD zp1!$l8%VPT8bqZ5dI=_jeq^5U{{UrKsc3T0l7?TiA%s@ zXoeyaN;y4TZbMtL7L$5hWSVKCaMJQH%IWQjoRjW+r+@YWNF03zyM%YT-H;jMuDA$=%}WSqtuJ;_q43C~jf0oiH zdUYmrvQQ@^TmD0iTEcY!CFYu@Go1NeP3%j=WHi-mjb`h(`JdL3wAa;oY4Mjpv<}8C!!FL(#WpD(!IjWGVl29T(PzIFjn*A;)e==jXK)&N&a3 zVbJo`iK;mWZxd;(0FCo$H0%76Us9DR@__@I{d#GSpscGj~me>{CJh zd>NNMS%4fQb6<h-&#J3TA?`WjLt9tO zSmm#oF$l1}trDK`IAU*B?lkLDVybK?QT}9=N& zA6CkZ>~fqf=?F77UK^o3TY)s{V35;&a(n0t{Rvv3VNY=dt2XbPW`VY}(2le@Z)@vt zqvArDMevn4tp9vqI4aNol!J=e!#d%Qz7b}Znt=24Z22-KDWq@0n>eB7IYbXUxd6B40TD*VDb5*f9iS$kI^y%rzxb z8)-?KuSt_*iJ%ZntpW5##dAj2R<37@8C)vTx{+ht5{`B=ZRvAbg1AxMkLxM#7?vUp z3(y>QV}uElPSe7#dUr*N&ykwNLLIg7--#5!j1=Sb_28ukTl0J;h6aq~CRi7`=_>bw z&NwQ1c=fY8L)Ht!dl^EkSJsa%i2@?P z2s`Qn!5o+0)DEGZ~hn-B#*s=*XW)V(TLX1{u|6LI{Gj)uViVb?!O& zqmbzs=Z2D3>)Xq7v1k%HfG`FL^Iz(!N^`yIJscC_QPPx+F5Bz_f^_L>bw7fQe5y3v zS|WGe(vWsLM=K`L&^yiE)MH@TcGNNP%yzPit&n$}&ZM!WAK_11!~3QZ3wm!gXgC^X zar6-|&P=P^(c8fmZG0p(|1A~!5-L88PUzB)9xAx#*1xWM)Ay0q z(8+=(Po9bPe7KcpvjQJJ99$ zR6)1)u~i_(BXgk4low#a3=O0lHuLmNr9)}96A{xQuF#w?2>>xp%uDbc&2T&Sxc6$R z*Ji(?sN$p)tA(Ss!O+l<5t?JwcSn;j9`M*cO!O}I@6^bKJGq{`Qae^5(mKqvSdtc^ zWS2hU^^FyyKP8DYPb`5QKu{HZFA?40SC39jyw>AbRE;E?r6n9q6;5Z-< zjO>7K#aJ1tO09ZU_JF+7(NK}$r7ACUSrEj6+*c(9`3Re_hAg!!r2;QT#y41#?+-{p zdrW*HUiAf9GS88fpx(7=bMKN`rJs$_DTC*d;$(45gzC|6!ovoAXbzv$J}|3$nOQ&M zz-OmX?$eKe=30YqMM&Vo*(2zovZteKqf@9TaJrLg#e7Lui&4M-sc!aql}(a4v<{b!s7jsAg;XV!#(Ib~h7^7H zjK`qb?kf-_m- zLm3SVAVF9a>86IwycKcD+r1)wn|M(HkRb0%f@cyp7*(I zG*bxoGDtqi!&Uk~_Vg(@YDCq98?xXH$1Mhv4<%#r;2fcn?tZsn{r7Q1X5+s0`E}fP z|D{#j>t?ca3*L38I8T!6iqten_-VM*`qg}<{@4MGG3)UYkK2}Tv1t2^*MAXKSjSHc zB2{Vnwd<6{+k^0cKeQ2Y#-~%O)*TyUxFN-b(YGb)TQXMkm!^|AeZE?Rfl%@=uCutR zvz^Z11SO@uj1jp*fh?gi>mEma9M)tIYbb6<-f{(sER*r2H-k$IkxjXloaM`Fq<3y= zE0Xg4q{IZ%-gE#@1mNJ8>8k2sok#VQg!+)&`Fu-En*4Pe!UTD<{VEt2V9&dwOX-cZ^6(TR6R@nNK^`^W)`UQsUIqkbaU{AHwN`ZnxC4 z%B}E>7(JM4Lfb;P_RS0B3fLKd73)WQ(`Ct8eeYaq7cr8{ek*T<9ddtm>u&yQ!k~%_ zh~8KDCcE0D!b_xg9v<6sXRc?u>8>%LphzKyUS7V3xjcR0PSp?c@=kmw7}9eC9t$@VqUX3Xk`TBURS z8g0zBzqLuu)!q^BX+*z0lROC+(HcueH2M}WKgk}~$n0qR4pQ%0Gb-{aQsdNdXAQTk zxP_RR0C$G>J6}>`LrFU~cB%qS&e*8}j;%gkj@FpFD-_-X**8dRSn_Ev^7YNpQh+7n zZ+9oFERe(kt2z-3pkz1-{O%RsiV_4or)rNf%gK>917w>ryhnJaeq0@Ci1%oeFYT;WPPu zze5U%N|+J;#&v!5U^4fd%N1@~hDM`;Z3Z{t=LGIeStRUQEQ5a%8k1d2e(s#Z)0vS> zpq)EAW~J;L!@eYKDC{1Zmjx|o*N=JTacGR2eswd%GkiZOr~W}EA;TO}?j6~&q8@Bc z4h$97=S6mIHF4OF>Nj7S98sP#^~Av;c{avz}oiMpPtoXmBcX*TZ9P>Q*OU=lqomk+RbLEAETzIK4mn; z?X2Ic+9#r)wds6(6X%^3@O^^Y8R$F}Bg2GJB$o$Hh4}@1Ww>U_;!cQ?2G&L+Ipl^o z*X9r;K+HHk`6eUA(O*TwXOInwxMOQeTX*TC?FSjlf=F1~Z^bchPE&bEE=ecPQ}`7HQ*^@+E|)bgXB87u0itXpZtR%);@$IKHCO7eIA7j zoB^_AA5I-?`mLPm_nQH=Iu8Ma9TNH`d>3&4O2Ga7^-sR!ALF5pHxl4m2#em4{*&|d zD`mzfOnpjQr1`0T|N6&xZd?F{`h{=qS7!6ip`?8P-i9J9tP<$*&jtDIjwj-QZ1b6n z%%4e{KX0+;|1ZcNnb!Za1>wJeJkGhx6#*nrMxUBrTLAJqm&n>cc}FeD&c-Iib>#4v z=;$B0;HWFq6f5?{Wz${3ypvnsFFBUXv3~f#iG55o#iWe!u&Ei5yKsir)8KWH2owTR1 z(i(D)cL)liLcT`F4kvN2TB)T)j*S!J)_8~&4H5Rr4lCGV9MGVE6T`yx=sY65S zI2^(_`YVk_<0u9-SMnO#pokf~Wx3hk`ROV4KlkYZwsCfmoTf}N$C=Fw&?e~UZ~4_a6VDY_iJaO-{tQT#m*tn{UGHU5}= zcTMi7do!hK&*PwxCoA=9YL)W7xGxo2^*|SZrQ&{jvQ9zlIl}ODhjQ<6q726CX_lMDxiz}8|Jey_Ey2@--_8a1}Q-PRj z^|U>BE8!RZ^>wwD;m#j3bA|OsJLp<+$d`Kom$-OtqOm^TX~hygnVoOE$3J# zri5$O>shSw%L>`GzirRXr#q>DR__6Q9kK*YGC+;a%*-4NQImTl@V3OOMb!7(c#hw6 zIZZK8$zvUDas;&XsRef0H>lHESHkOV?8^cq6eI#1GL53dd2_+I!ab|$bojEyYo(RJ z&isFAHqjz^?z+_4_#7jnCW6EfI46&_n)$+TSPUV zIAVr?)N*p=~e$29)k?^hXO7x(d(hVS5-l+#8nmBI_LO6D7{t zZ~%mi@z_*MX(228N!4&BfA5wW7(Q2h7Yh`=8HUa4fcIBzhFYhk`9=%O=~ii;M?sfN z<@Hn18^VZI42s^FDBt4=CLdiM>3FopB@-CHu)OWwphS%qv*{sUI?grxgV@>Gbxx z4U9M>x^ZKaTwUMzo0eRACfkcU_rcc6(2y35?pEQnpj$$8O0-#7TW#8o<35#{ESnSp z{7i3%HN1MV`9ocl$2Jfh+_<=U>%3NLtjNp&LtWN$SteK(`JNhdf#6o@Sr~M~%|AOv z&BI{Gn;MtiVcxRMPdLrhdk5nGmqqegFu z@yWa+HkvR#?qAj|CJTes?l>ZV%#8ejtq=Koi=M!cz`Ipypk$NFLhW2NGZzZyQ6)tu zUKwTPGrI zi>&Dd1Z51BEc&Mwdu%1qW{-*uvJ~ALRjl6S=dx5ayz`?vW~XL|nbE|E_@NA{7@%@hK3Be0;QboU~F z2uE9dmbR`!FnT2H=HuH}feC0yHfgsx`;{`GbIfG`k_;nP)7EWI z&^@l7#MhsD@bmys4-nX}!%y71&ok;t>4)ZR(FW;7q=bdKECM@!GZx@s)Oxr|dOH9$ z(~yv*bz(`Aq;2aJqe|gk{Op)_PDBXfA1E@)FW{p!JpMUx>#VkDlea^|@ z7k0`_e$M;1=e#barjzkqrIvsE^5@rog2&%}32g1|HRlQd{r6O^eBtEpqW#;I>ONGL zcFeN#M+*DbFMnNgP!MQ6@PJ9^$5JS6(NK%W0jgpX;#$&OVW1{kR22ES%6Xy%DkrNDrAwZMh5 z7AODl*!m)X30aGY*n4(omj`dtKx>HUwRofozMIz!CC4QD0AT$&!v89x*0n{iw*r;% z<&F4j@xAPr1o0bh<4yX=*kVqR22KQFoE6_emx?Wy<1>O4WWm=iozMDuA2l65_*z(f z)Ppjq0k1>VIyI}so$`ydAezL!ns$cAE)M$OWWKbWULah7-9l2 znY`0I!JS+ts%A2!g+SW?4AN>CD2WJpD0XAiEb@>*gS5eVr^Q_%Ge{0r2WYpk0OJrw z*`iPy9ELEzEFq9t_wW{N$i=b)@+C(L{j+~}w}2u|Knx2eTgG-a^bhL%aqRc{*D)Rcq5K3u zOe1O^fnaXmvHho9UU#;37$U~Pr5E-fB190|b&_&G348%%obG!OhhvRM-DXPvd((bv zxa(PjYD!G=-R7x*ms((MY58Wxt5*nv`#4oFdWV0|`G%Q-RP>+qX@g3pFJb!262Y6F z2@*tt!ou@>5&G(qoD|@U+#O_NCN9eV6#z_sBdawOu_B>0seO_XD ztGA}C!;SN=_!?3->vr!U5&_l5i8#BpT}K+9*-omW@(WjFG3Eb@x3>(7vissj6$t?a z3waa~6ai`JE)|hhYUn}fMr!CX5hbJ>NvT0{7#fu>=@?*8N*IQrhZ;Ed3>MG-Jm)$e z-s|NPQ}3@6!rY|CM7@iyAU`;ePL4mZT$g!wtxJoFPSMSE=9d<1zXk z6DK&Q=CwAi=KWx4LL9o$7cXFMOtx4B^V{qGo>}WBS+|@RVYl~%O~`YMSlS_ovMa~7 zu?|}Km0Jpbma7z>(zLcp>qManW#JvBDK4A zqvWw2j}A!MHDFRYR0{Jn7>0C*qv7(j(u2lvK%=}w0PlhW5l%>*lIEt^WY+=0)k(Vy zo}*-KcnAuc2ZbRxtRK&|*b=>X>58loiRl0ze~I_4(t`FyxG5 z;|&h7r1O;`PL1^?`42yPa=+Sp4=yXK3gflg;l$*VSJtPQA_}6AQ(5F_JU}EmBB9~Mw4dv zx=ttI9?dKWL(Fr1q#08lkC`&Z9TCg6=y40oRVfYafR!9>ew_l1m*w0aeDejZA9N2< zg9f*@$Tc{*3IYY~5+i)Z%e5#0-$7C5lMw{PchYu_dR+jPqFY8)wJS$*e{S!2?Zs_g z9Q9_y7vtUV9m-j&YKjYPmdH_0?C5w_cP!eXan$G|)Hh_?EUkOEcKs8-_p#Mf-0s#B zlJ+mF1AL<|ox4OP01T6bl7aSUl_!__H3A2m{X#AY_mB-lHRcsjRZj}^6}K&GrE0}Z zjz*7GtVHZpe?7K703;Tk=sgi4@s-DUDUMZVsHvI-D7?%CpH?W z1k_v$m|tI4tVK@h`{LLmz{fX!Ww@0jMZw2_Or?XI6XT^?Km|S;cIvtyNf6De7zNG} z<8ezMwF)(+MOqn>7d;?%#fR;f5lodUB?@XL{}wmU4HBvidEV6k_v?a{aqBRY+7yZ) zQ`Sy|w1|=dg$(mXtONOO=*v=G2FHC0=tc!p3W^X6lG?g)zCN3!7_zys2d*QlH2det zJaHr{%prgZ*c$pUy0X65V{Nvg>7VsOKi@A`=S?_Kq$C@>IV7BLU0w+A=ab3P%vtnO z_vdaOI6v6Q{4{Ho&brOs2gndbtHwMjNKNF^pwT>K2bhY>vLoGfJ3VBM%^?S!G55#~ z@6BijY8O~n7PPmmszurDbp$)?EY4iyHWBgqOv)evpbp?fyWeV{L%bMHCoP`vYkQ$} z3_voF5`23nplvEts-J9Tjq}Pk1;ykdt(A* zldmYmM71oHM!cb}DanhPKD_Zc z;-kFr0?<{zh=eSX5PX!^h%ZcEk+M!iPYALGSJ|WWq|QL|5zASpo|v6NnR}~A?8fKm z?*&TkOb#-_qk)Qo7u_B7fI*p)Rl@fmeITC-bKnP6Bl*tYwd@8ItK~~>AuT@B7IiMA z#24ER0NKCnc^F0CXTo-%I0TcS`Em)A#rZR-t52AKH$1g&dH!4X8p7zKw-T+tHXE(k zAUh-d#N+K3JXH-O2U)~ zPh>M_y0!C({lt^Lq=P5N`&HZmIl5EJvpJBd3C#FhjRJ5Anm@<&>3xzZO%5I5l>7xg zg9OyQ5EQIaGl|zZgy+2z0j_D^C!+A}m8*NfLdIsNhae*zdPV``(gt8z$~Nf_rca~s zUeNAnpZPK@?lg(8?XabZ-*zVt)C`~GLVb$kydjPxuA^s%GE08znIVe>BUar*g`YEZP(&LIDJ2SP(^m2l%eefsIQU2Zq60-(r^YWwYOzcM?c^I z(qKDdb|2OBs#4S{FIok+9_S0Oa?y^4`Oc}BGU!yMGaEkF1^6)%k9t%WWbptgR(fzh zbd5i_RP|A|mHw#1KphxvT~??9brws`+Cj6^WW+BlFjccL84BlU`FI)bJCf@Ms4Pe^q#xp8&6b3o9Lt7 zH5GPhjzz`E+8GR4^YKlt%{ldXASM~bud-oK_W5bFsXhZ%`ui~;x*)u`r{u7XdKRtu zu+x$Rg|CM?z-K%ZBgWnmGq@eE)W`S^L$cAOw%^(^O)V1aFXR-nT6Y?x8VPpX(a+cy zkhW5)aXfHGef7R2I=UIS`j4KxZbhy%bh4`U!iRy1K+a{$+FYNj0wnn~dyy+~OD|r@ zI)VhN%G4@*(yZ-JFW&RiZYFnc4HQ>C%3R1IL#N`rb{D+>cZ_9&NMPlU1{dM_v6t_u zSLqxCcs6=q5H;yRd@@T+ttf6f-MI<~asSwUPZP*H2VK0nSf$3puqC~)e8P#9to`|t zz9rb{joHP@e6iCz?c@GlAJKgJb1%3H?dG!z#H1>ZrDau4i@j)Y@@Se50e=;%FmstO z@apr~&$hosH%cY>p|EDHVXk()9Z)mpZOS0%v5A!QwjYBaOZ^}Av7R$^OPdicYhRVR zq&uZU1n-gbxSmyz7QA>w4n-Oe96#aG5&Exu+S=OO1R47%idgavE#e2>#F1M0j1@#x zvbv|=s$Lq5haS^E^M#UrqdCRTV#;u~xGmjwxS~P3(8wlKYNNPLVTPGD@oJ^zm*zH8 z!zp`;59c_-0~QLf6{gzp5G+uo7{HfMV$ z=Z)dOhmdlHaPPXUS=Qafb_Va9Q)al_7v+JY?^QMdHFJ7!XHdd0@_~@=*2)7zyMeoP z*bp0Br~I8=wjWdXr`~2$M@c^Pu}b3kwwty=iExlWgp?@@l<1%?xFwfoCghWDj7*{B z?Q=PV4Z938BuaC>1lxOWZSJP%?Ur-F#Fqf2z^)FbAN>Uom4ZrRrg(qTz?7(otU@uaQS&82vZ$ zh7vEd*|<6l9a~zb$CJ;k-rvBj0lmyXE!0u=DrBvEF*{9AG!9oxp(C206M~ne-rha1aelu1@(=JP5c+W z%Kv;bjEE4}#1sGEOu)kua|DV>9x-XvXSdnQT>fY(D=@#SI8&K1Q@L0$?_u9gxs_cu zdgQaGkb`y`@v!0FWDRQ(%A|#92bxNXi@9o?^d7p(9~N|+T)Y*~nGn1jBz`*KxuL&Gc&6`yx5G3Ia4`pQ7-^%^7+Nvaw&0yki)1cPz45n z@H_^~QuEc)f%43GlAUq|bF@BNYpGySjdT(`%Z$3$t`WO5C=}K-a%hi?H7cPKg^?dU z+GFT0O_D!xA0gnu{?xnypv*^4kz>nF*;lR#5o+E)=8*`&84HP!Y;Eq)FumLpNU@6) zdvhWg?zG!?ZE{!WBgGz0R%t}s8~muMf($h>n9C-|*dMTR9*v%SVFOrE_2xxFfi+-5P%N0|x36ZZDlQoeLb=1NO7C(N&Z6H-=eUf6_#ZkaHvZWfS3l_&NyC!XG;^{_`Kr$^dE5 zgHP-cQ}X=p#2ywRwnoz{r+%TNo-;6RTIk%I8|^G-LD)L;j)G_=KWGl-KWw~Vqbr(y zMV|Na)jNOsEgjOI0nl;#Q_-)h`3vhux2GdNm=ib~8>4I@m5N``biCGhr5mv2O4oVO ze42R9t6#bN^&T}_?bCMkBLYH(_aXpG!z(3n>Q|ZknFo{N1}$ z3`D1tRs(kKI$ALN?JhV5V2uGeNTn&q7k@Sm5`Q3*sp`a63z@w4`XlP{Oh+haD(hc@ zF%l2v#k{-4>vN8`s{$z139sf@bqTg zLfj4lsAjy`>pL)VatIPyD?cpG;H@|9(|7GiDB{5tV)fUb8UHzP_->ipKIS2v zn5|~=wPe@PAh*qV*4emnjuhKb0|TchO6W48qi%7%D!Kf1&Wv3_yVFu{ZV(Pt`nkZT z52#j;kw!2%_|44a%-P$;kG{3I@@T_Gn;*UQ*}=z(;q=ux;n7kfm8y-!TB73~SdL1oK5s>>i03<1*7uvgEeQHudF6!?Y9Jte_ za#QzuSd%Pb3|-1ki>w+;C$rB-6?l|1X{UP*+zt(;IeN^$bIQy@o=AzkA#9^@3}yA+ zPL?WO|f@*XWDGdAG2@R1S$z5}^5g#q= z%No=sY{zLPeHX^ZBtN@P2(T?}4(2}t++$;;b z+#3DBB~dnfPD3@=PgAxXl#tQPW_n9(-A&JgAzxhytRYK#aWrH;06cyeC7)R558} z;~ou-xo2;PPwP~DuS6)%@bvSQ6fY(QLyG~Ead^q^2f6s-kG{nh`k1n~lDXNcC5H&0 z7c&)u;2?MHDk&2C&a52`WB`5a>#FIO1|b2TQ8)s0UE+g!Q6T+DRbHoI>6bxhds~Up zKp)4bl;P;`B1tfAUAXqDy~Wj0gtc~oZ7X-eZsZAUso*7Dp-&`V?&yz1@|8oHwcS4L zOQN55zj)Tg{;qi-SGx#6j2-c3qAJ%=lNiNrBc^jUQD0i!K3$?koWbS<@ORbqR-%1A zynoZ+_wc@{}r8HoX`S;mt{QHPj-bMt*bY5+>eDnZiCP z!7%kEfBn4PfR?dC2iE0=863%lznMslV$)!8x1_jkpK}!B4nXtjyBXDraVon+u%usBey| zxbU88X^i2eNSvF4gAxc@WR^Fm7wXpO3=s#gC3akGEHq|0TaqsBq^ivgN_|MKdDJ{6 zp+1!&WfF}v1wik)m`swWslZRh(Rgj2)W|W5(#fINnFl@y0Finj3c(I}nnh`nD;@2d zTYWsc8&b~A*Z}!tKpz`%i|0rxcI-jEuQEQUNQDt~HN0g973fW+*yvkROYM}RP|OEg z-`7;J!ZHOQSowSerFDV6Ak4Q0TS`Hr?%WI;ODeI(O7CT`RT#nSxgcGTV%Zd5J0Scx z;&Ro&1w6XMq$c42fT5KGnRp{WsvLlkF|mePJu32Vh7k4dafir1=Ox@U7bpXyVPnI^ zQ}%W^_sHi3#x7rdcNR{>Xo-I!Yv~q8T}Z*{!`0<>Ln&qUd7aD4tj0g_jAm+(d2Q{B zdl$^}a^C@gt&0XXC@UN!-7t@-$DH%JZ3j!KC%h+wDkjkxY;}lkrhB`_o|bIE#x?IY z*Dz*z`B*uu&QraCd>ExV60$-LFN3po#ae{c9Tc2Sy4BewnO4}nsV!qr;MCYJQI*^A zgv5ra>_W_OsCNHGPn2!}AM1Hmm5offO4lW0z=v8Ip6<7TKmcIJUVHDoI7LNUo77@$ zOU%1VB0|L5pmm<9bSQJgT&l_9IJH!f5|2c?)WHr}T~}Y|goR3iKye5faW|i1iI!rw z+!yDmF<7BkSdAU+v-i?>z7is_D6_ly^8FwLlkC>Jg2TnX*G1@I4-i$<%Qthm{HIvo z$}qZQ2+O{{kO`VUsdMHdBm2#p>{5$0lqYpQKDu-E;a!;qQuVuGX#!_y&RhsH%6Lh9 za^Az)KGrN^@kOLc@dyrywKJdXN)m_omSCKnoJ9Fi32^lqJ+rv2E)Mg${cwx@Pt3(W z&GtE(Ie|HSsawxhOgd|H%?wj~Zyr%j{9!v1*vAH_&E&>hi~G^u_Rn z!Oar~bnL+~`<(I7ciW@w5S^=W;XDbMxGA80vpPsU5c%z!9DTspYnt}<**cBhG*g%S z+BXlB60|$%0~}P+SL11Pz!mOsksSI>6oIUdI5Mz0($|>_T(AY;VV&Mzb&Op9V zXZ4x2%!g`9Q=}X8Q`BYZQC}LHMavBfOkEZ+e)jhvEu}oQLIIeUOI1oxc=5|>sr?h% z_V$XZt1fSSK7LQGHJoXaH;NEUfGOn#+qAwN*K7aKifknd9cM99eAZsd0BZGXR=uy! zQ3rGG5n!!z7-#Og2z}S=0PppPkslP-v$~t?ZR(!2lWWyEJGff7!E<7O?rDmn>LOhYYlBsE=X7PSlnw7_*dYO}4Nu}>+^QyL@Q)1$j5<=V) z59g|ZCL+uwa5I}W24|PgRQ;$^EuNa>vPOAn7U)?l+ErL$3&82HVSI0mc#b@hCND8ZFOAlK>}$43IkwQ2vrf$ECWiE9 z&V;>d`aa#N!SVw)rPfa0d7CnGx_P1s>rdVv!=*7=)Qte;L$oTnx~ddkylnLu0&|;4 zB{6|R;c81i#uZd`c^a!Xb6_*28@KOuo|pR8)1clKZ&k=#zpyn=Z62qFyBsy0qhA=! zfiPOwH1H@&2f~dkT&=7c7O(dMOy{7I+EQETvu1Je=69W~Y?gO}=9&~y7gfwgW7xL8 zp^N5iZMiUdJXyAnYy7p=o+C0Xdv3uy+Bgc~6%5|q&s@;`T{|EOj_DEBB}m3(-0tVc zs8EraOu3SNDlvos0CF>@H7ggBsTg@nqiJjH7Z!kMU7n8La*oXmIfPaK*4=sTZ!77{ z@;yMopKu5La~`j^`VXBnm?%sCkw0>&q&6ZnyW`eWZzPkNv|AlH)X1PP}b_ESd1*LthE2~f*W z$y{9AkINr;Zf1Uat~Hh=aj8GgC%63vvLNb5GdK14u*MRM=(|OJ;y`15jEGnajN$T+ z>Np#et^#k`!8_yCXG6-4yH6D~I%A=wy%`eQmTes?_DKkRI6S7kO%OE=Lkho|T}bA~ z$jdJzM0avOA+9(uIEZOI4?Vto4CSZS6ykn6`O z?)$9I_h?h?%zfE^8YKF4hj;dQ^UTP@Ddn&FDDJXA)F{}|@m7NaT@ayu<(FgW!p#8x z*x?FOwYMTdLPoFkONxIAME77BC#T{YEG&B4k)a9-9D?^$UuVVMf29`o-D2%YHX7yr zg`7i0@e!MWi0c_4J8=*~S5#Z$@eifbuIA38=N`R%e_yD{@%n0pX6}P~0<5S(BIS^~luzl!8Xg4+yh>fZ1T} znrK@72yQ1(^>lOoN!?G*^P<9 zp(f!kZrG*ra;O4xa+a;)$m}H+A1`aq^E~Z^0*_FtZ;2N+CG;pMcGJ2K#vNRW`tM&xCO&`v#yqEL;B!*}-=S^k(_U9c6stb4IWE~TL-nQwS>U8?_QP@Z~99?E^mX^O+C0dq|o?7KHd5wMDBH68I1(^YNs z0v$7$bGHd`P;veA#-VVZomb=t>5NK%1E%DQ96pB}f5Wsu{Yj(Axh+7UQ-5DMz(>XG z^>wJu+<(wVEW5u&LbZ|qBy0$Io%Gc&PXE_@8N;-I3G33NOCGX?FUy%Lv8xqfk%^qG zgD(SRREgKcGmy+&n-C6G+!M~fd53XQ6?nM#r3J$1-inMOBKOaoJLj_yFX76&kS4XH z*aY2cSJ zAdofnxFPNWhu+}2hcEgiiRs;6 zwtOfqsJNz4ExhMmNLPg_=26oRE=`aJ55mZOZH`H#J8f)1%zBUqu`Do{J=2MJ!H70y z#rvrVsUG)yin{%X*Jq;Rr}Q;*f*VRqB`(?p}b=zXCB{6dOU^*26JG=jCrTG z`)D3bgM|VLRF(Ss!_IR70z{XW-S#s^(839Bz7Ae-QIy~spO?ypxI9iorIs7LBn$cA z8&3+NCE~yW>5u(4_3w!d=9tWE*|Qbc82*5=ZTwBGzrPZ|sOF@HaivF~A^u@8+uilMXmgz$iXsIseb!qT+Aa!dQnNBt~NHKU+Su2m(tAzo*pv zpMz{O1B28}iypae{+2#6P{3u|C8#I%U!4QawD16fY%_Oz{HJ_#QUT5&w5ON%h%EWN z6o6mY7e5G(N7sKsyoT8Ta>DuT&)~z~tME&`UsVDI@ojbfSsD1hUkNZc5A2#vsSCj^ zKiNq{>8HnS(o|#eqGA>%ZT4kYcv@Lmxt7{vKU8UEjiQ&a-m7U)ZM ziQv(dDJK@Pn*fX~=&fdZBwRnba7*j^_wRihnX;=`>G*i46pY>1pxU4|q3RZ_G8_Ew zr|sQi9Cm<4QXXy~<9VXi*4A@p&P-au&Cw~vXk-%KVu=0~S5ZR+FRHnHBf8!EHI{$Z z@1A4~Qvo($UTx2`(p%E2 zmY9UJRRy=(qA~<#5{F=-UMBy;CcIvyn5BH62t_$(USPj)oxd*5rpZ|s5xv@Bf^8cf znus`{y7~^*{8j*`8o&D7o8K$o1`D%d;ZoA{L={=W>~edc(bSobpHof;y<7^veeHQKIWY;D zK7Tb?TTn~HY7Z-a29WHlUa3jWcGakZILSu4a6u&N;Zx7zogw55V3#;8xRmA_l&D@d zG#DbTvFM2By5m4+Ow=18m2^$N9DR#TD=oh~BD*URK{kFlUyF;eUoLet;Az522l3|7^PnxSaM82i^xl;a4d*ipBl=Jga zn{k8v;g78p?4X!)%&(Q)iyqI$sxvEzgaGYx^?Y^9w6&r8o%s-qQygFrCQ!B&qk;k$hq$TO8!#m2h zsHl{Jv1zyYiETdqrv}aWX3brao7~a=mL^*@$E?)$_BoE>#pomhk=sQ~+9SCxuLjhLWEVSAcAQdbXPihoK^y!u|WVRDxf=Oqfv-UJnOAKt-sA z;->X(-?=lhrZ6RE5#+bBfnCJ~Hm+`zQq!YdpL83$qDcKUP~1%EAtldh$q)MDE73gMD1IRDB8?!D(YgJ@8y7D<;0|< zicyL*)05wrSX>oc*5fpr4F>WO;;uo_UTzrM%`)qre&Q~r3q0mdE<+!*UJu6VDkw%L5E{?j`;lQtVbRp#rME5U3=V(QQ zlNR^vtPUgaG66In)Zu9^mP6{%`c`+eb*vNxZu)$`8wtOfL<23!_0ucAEp$-QS-rfv z&B}0V*Awgk_sE%+q?Y2so~FA#WH2)RD0RCMnIO_=Yr{^%b;4nh188L)0mvb1DQ2aM z!rL{Ss;HNe2?i%d;#a4G3uj{m*nlrtI0YlnE*{PYwZ-iVN?^|%IdHj0_g7hSLqFo- zz7cxC{C_X4zdzTZisQ#bPePDxAUDk_v@Rlrl>!X2+V z{iEn4n|@X#lRLT^IpAqvP@NbOa&b=L8+24I@m1ux#?PIc&Y;~gZWb2pcLfJl`wmAv z6TqVFvz&3|8&zbu{BEY5Wh=>ykLsvs{!3c4a0D!p*0pXYfgrEe{)hZuj53X{?w3fP zz574R^J|Md@V8@OhA8!aUR=rei;Le{^{CSM*N|Z#;Nn_SjQ{^4L&h;VDd_xR9B`6^ z$SYL7g{(cgeXmZawfxRYW+~nt%6pAx{>;xwgYm}A``qk)0qfSoGD{1?vboXRQ3=`U z4ulJa=j_Q>L2s2d`*j|hOl7*e$7WZiGaOz$6707;8WrJwJ25PihH3ZDiqg<=1Su$7 zl_WdtWJ@62Jw@h$aq0!i(@`z_7I#m4b2wcgOA50=`J6C2Tq#dgD)8i-{966!f4g;4ekH(B8cv z`Y?s|1QC%8VLHpQz*R2gt^vP6xXb&AcGUFBmYv%Bxor>G1Ah+KQ@fu7oAz!s@<$_ush<|O=K)UDcM4GzeRf^`gbWjkBEz%q%Rk-kp47br6hEkM4q7j}6dvp_GJC8C>3>J6(AgiWxOHg>w$n<5}0s}ycCaZUAt?~rdMkDLM51ngJsjA z^&RuM%a_?tkWnc^-pmf$kCx^{a_aJpOPwzD+eO1zPAg6|y`57i2WZn-o`MZQCZkf1@N8^SIt1?cz^C%_Rudw2Jv zMKNTdUqRrb>hI&edPnBzXwB|8Cr>CHW^=t#4RPieMCl6^f!I@kNo3*wnfp-O@o}Vj zG$1`uT$hAwV~NSgvc+wYwLa?U_ujf}=)DJ`6#Kgl=kt>#y~;1}7#SFO%+T}!?UJtY zw(sM1+t<3Kc>oCH2($L+R+CUkmZxOY(U zK7Ib23Dokd=V^0Ae3IL>1lonnm#Akd7JFgsOS*pRdyIu7qh)r?p^{E1)sIOk3`y$C zRIyfcc1nlyW6UF(_Y?27rY`-}5_%gALjtZ4?Mj#V@9HMq$&%`DC$pGcfi2v0gj&4M zE*295)Nr*5BfU+`orSIYTl#@^SNe+^qRzATfyrjt3_;CPx@HF%w^C)Fc9ds{ke@mw zV5j_i3Dc=c4+61L z_4k|x6<;6b&1(xx;sEYw87?x(1OQiAws6azsjC+6Q1@S2xco8uw_w_4GbV$fk5z;; zCa>6G+Phbt*b_E75U4G!nw${7M{w*+$`R2C+edOhD?XuL<$?gTXeNZ#NTq9D+;%~Z zs^{h+o4DKJEuLl<`-H^A#o_87X~B1$--TWlYg=-*aUuo=@)SxA^l0 z!OjeoKFgD`5ma(RzjaF)Uy5N_d+}q?9M#3jy(_eH1e5sYFwyj1PS5Fg_2EqN%G`En zsq5E2<)ebx1PeD`ongO^*oPTl99NeQvbJ`hTunB4!%-TaZ_|JPn(m0> zHwOVil)k~bbEW_X%n(s-$MKw!R@HT@KH!AeV7~6GT$HDgoiHFE*N8eUa_PlhnnMj1 z@SA*PglBy_KGMX;#wx#ociFD9}5IqB7MGAAZGwl<@y z8bpA}1O)Qn^-jnV^5NXF=b>(+L*@0&@$j%qu%_lneOglR2=4`)=$rSO#Y!r5iXO8x zyJ?H{`NeYogC7u9;VkvM4eV$X$D0?L-KubRLb@2_k{mZR= zoY-5|A5e5Y8BSj&Y(2#@|E%jC%ME0m!K`auZsA$7Ju!~zzqsO;S7{mVTCVl9fFH`t z!V5pXzJCgOlLyFPBVH=f|49$FCpX0*ZRZB>|M*Yu*RkW&fLgqH=EnH%V|+wY04^W* zP(a?C-~) zWHe5u+}M7Qa{f>P)B+L*0l{#A2!;KQ+NtuNNzZxAzNud8Q&;|LRd01a-|_y?9dx)o zNC2b>U4@P2ASBOyBqkyvnub!v#QF7By0mM1*z~AX{26hp$X|+j!TEibM9{Yi-o2Zi0&BP30e8LI z`f``;VaBV(*Kecl<|Y5pTqhAkJ5EZSD+RI+Nh<{bm}_W+Vyc$f;nRH&c^)v*0?zGq z@m(S#%BPx5>i`dsnHZO8|>|1qO8Z3>~J8#7%Y zF$x=eKnFyNkPvNPoBTmQj_T%XL_H&6t*Z?gMMZTJr6;6}nhtwg;Z>T+OUFCW=)D!? z!gT_@VYEaer+vxh8Yh40bQ9N&4?d+Icl@Kj0}kY6C#8c*B*A|yvz&k-C`bNaisj%? z@Pr%pgvgf5fOj*X}V6v*f`4`wV?^DonbIQtA?|kC0KlSwYkzAEw@TC@J2{fFP}pAX4^N%V6;#SUT=e{-ibN(5@}>au{g* zD(NAI0;@M2>`&T2Fw)Q#a)yWE%v%k(&oJW}Py*Or{W-^dl6%hHHo50}6PE{m&*IF3 zUt*v%cx^4+u$d5-2ZEMin;E}DkdwC=(LCJbT9 z_oasq!_QsR?xzS$5!Xy%Qh4gr^;8g;LuxAJt+lFDq-+x*88=Lk(QZ;7!otj)Y5n={ ztZ4Sh1<{^?wHtZ_jv&zhT-OcN4sQsYR{z|;3an{>Q=j_onEQL}i1(E1$DPxv<`ku; zzBvJW6+pxTXh8MI+uQ`clOY+y1%8KK#Z&Q%5jE?_*V3vy`w8z*gy22b&V~OFY#5n~ zBwNp!gN+4#shPxkn*MY5q-$0TgaGML4TzkSx<&&$%L2wF)K|9%LK)@EoEmJLPf55Qh_T@wOc) zHp_5BQ)as4ybHmlD93RFCCo7gr>n*vHvf_zTQGkq9#UfBe~9N?^&7R4YC;Jq3;qy* z5fD`v>U4tKZwc_H-%?dnY?I}=5+9B?xu$1jA(eLLXc>4g)!6Vcr@oD>&JvzCQ6tW@ z8P;_`O$Xe0_-RO`F1R!L5mxFtrura!ir;lK1|T`jj+E*u3&wBjNu{UcW(_$*0*-dT zftv~Jt@U{7yK+?mnE~q*68FHx;J1cQ@2gsxLU;C1M04S#(;#lz8qXJXv>*MRC{(Qz zE4O(ws;y6p`&^N5(b-%QpWF}h)% zO~|=y@9~E!08z{Ig0&)KXB^L+7ZV&}lzYilFJt4rizSmtb4E{qHe9ZJ{=Hz)GI#Gj zyCUK!la`*|`5gFD$W)BV0BqTLZp{=r*ICG@S>+4O!)rqXAeFX4zsaA#T(-x>>+Kw> z^v%l+N2dUl>@iWc8GC`k7Uo#=kM;WlrV@#H7dB9n`4z)z=ljz3j7z+0AL?W5dc2_B0a z4sEH|u(3EUglkNSpRO53s3eKiTV$job#P^VWtV!7wY&D#z1*SNFIQkD&D`={prJHz zh~B(><;Ef_04Z+@Rcgk~ZjsMc#DRTSdER)BWN`MN=mgCZ)1|%4a65I=uan0YRYEx- z`fQr}Th31Q}t8hNzSt-}LGnsF~jX25D`dnsBP#Dg}i?)24ofoBbUq06V~7 ze|wGrCCTvcU09g0R3+54vKwx?Dau=dPTVy=EDkvUa=PXYB#jSS$X-2ne^*Ii6rG>Q za_!o~9i;cm#gQuT#jagNBlk_-o=bP#Myed@48|e;0ydsOd&Mrv0`~p&#DRjsuFqF# zTVnX@iV|LTNpb5IKWml5eUBZQMmf~QgtAn#Vcz;_vG|E~QcP!2<)Q*EPu5goR0er7 zO(zz4GVGHgkCoScd>Bkx++4FC;({4fnC;$Hx7IFXfsEn&M=UUYJMbQ-AVFwh-JWK- zEe>>9xJDTW1DK6koS#7g5ee256=C$aVerx$SnpHIRNd~4?=9Ig0bUp(*(FIYY^xc1 zw1uXoG9hl<;SC+&{a$j|ao#W5K%&*hFDE$bVs|~aodzKx-SOZdQH&7E69@L;Z(e!g zd-lhe2jyGH(_oYWjGNwU6PwfbAp@Q7g;jN0=(iGe`SEH*tIXPLq}CY(WZ3_VJo|^9 z{PD&C(l}mQ+WpoFHohTG$jksvec0xgKd1hM{~8ZR7fN^Dx_!_tjlU4YnZUELU}Q># z?u9?~_?BtUX;7-!7R_cC*s$Z90SJ~m@ns9Powvl;gf}s)Sjnwt)qI;IY?>d!loOpY*G>ewDi zp79O2!}Z4EU5@)+UrrL_gTYBt<_}3x<(oM!S*6jVW!$BC>RiIMTS{)|362dqm|H(B zhjxFz;Y2}1j{fGFBAdlbywoyMmj8~PvkB_dG;8uzE2+%@Xm6n9B(8YVPI*!vG0$U~ zBvu+BZP;;c2nUq24L!HrvngTPqCa=;@xr>ihmFuqE$%?HoTnl+aXY(SFTAJh0{0c` z5OOM257V#5N@hDkLfj6NGN*0~wq43IyuS>8@}pMvgo8lN{YAIS9lp~mbBih^{l*8h zeJq)|eQ$xZ-~?$!%gXaU^JdSY6z>fU zhV0=lrwxg=j7CxghZWXrMzlxt{u0#hFy*Hjh>OD@%s#7UDy%v|80e2E&x{IYLer!_HrMF$wNd`))Jl z{@kXRlA(ngf`2>-Yi8loRn3qQ?fUloglG(SuZUG%XK-ztw2oCR&b+s2n7iix{4J~iP!q?mp78eadf?$m4EN9}Axi#pS`tX~4RZVYYk zZd|+8;PlybsD*Bjk_iMgvN7__!QD#~d9+DJN}|{?;=(vu*LBWsen5C;vf=aU#Iw-O z{MDs#aq+Gd)F@IV{(RDDTwBEo%Rk_5xzvd#{s~cQhQSG+mCH!eT%)T)cv)Cj4EyxT ztaY~Au~~W2V7a?@Gva0nhO!tsk3;1wyub*owbkhKx#qb_Ur_rSo;o4Fn_q>p)#MYr z(&1lTp7zt3)t@&MAbD%(rq93mS1O$hNv{;YId=Q33PJb70BH_rAMCTUhkCRQV^v-K z8;=!T-Ss{`c!n++e0#7eBQ7di{K0u|{h9AOu4X$xZR5roPi9vm*Yu}K6|=T}o-0g4 zrSy%TKQk{(D-hJ9{S6Q}^4_5BkG$PeVU+Acf;f9b`R7H9ai(b8ej}*(@yzAEgE(M-^OcC>y;mZu8%B2 zl_w3U5AjzHZa?qJR8B;!gXt zW*NoctVW9?XiSmZ2|@=<@pWVH^&b_b-ZEm1?Hd8VB zzC|j$L6B!BjRYK=1!~2lmGtw}eb?Kzm|Ac#>BJO0@%^dfw!E5XMR;6NWk3frhC#aZ7P6J0K_D@$^o)JH8o z4(*=kn&-n)-XCLJ$#;^HQ=vpQ{_V*i73{&l`jg4 zG3;!a1>W-$58}OAMXDPDd4G}g+JB9oDZs9l22YU#IdF-?mRLdf2XAHi?|-^YP@E6# zs`@@62@6lX$bGzlQw`YeNwA5;qZK#54X`sZjMVrXt>b(Ix9cG@{q-r{P;1c#{BItp z&Jn_=P7nS4qT_=rTnNTA-Wu8pKh_=P>rw*O1jL>d@Lee%FZj`1)L-@`5r|tWhFcTH_d7p) z!KW9=9f$gzrnYxGH3MwGOiQ@B!sr1V-$MSa$sZE_^?9R_Aa7 zfoA|2P!Fg6`G1=+;k`oqv8~)hyKllFELrmoX%hj!4g!Dh0Ix_Wnz}k9kpdUH@ z9Q9vB053<*0_;F981fgp{9ZP~E-YIEgc|vH{d46P>HmI+j2k|J^?!Le!kh#6ff(!h z*YHHh^qgekYcV#&!HApD^L%&K8#h|M9Z)Gge*E2I*VR5OF_9DHhZ~2#c0Ib*Kr$$C zU7!EQLv_TTYq>eMtk@50uo-|;DXRynW(cVG#G-$T#IyKCvIt5Tr0w2?Ihs|bdz#KVSCKe>_O8Q{Gk zdXn(Z4Lsujktj=ww-y)=P5Ua0sui*(!sO;d*6U{LpS$mO-$Tzdse;;987^8_BbWDK z?H!@gF^`6*-civCg_GIWDp4&RbU(>oYx^!L-9lgEz&GdayJg}uJ$bF!9&OQD%`g*= z*tgiM+g!91y>w}27-P-M#-=daxud!d!5KR*S-g?<$BQGl*DN|O(m#!U zBe9_;c&xzOx`4k3>9HaR&yoYJZBIt6yo-#zv0E@%6SA=tZZf}frGH9~!>*N6qfolE zAnU$vk$W8PVC`6^Clbiw>-~S)yYhc1*RY=@lH|lGm8}v&ne1DkQ?_i8$X>_3j*PJn zNsfauWgBGZ5V9|08_Q6#kFjPQM%j%ql6`%jA)S+RdjEj;^ZJSTc<#BMd%5oKbzR@@ zbz_YA8w&h$4f(Z?!)nSLxV^dY(O5kBWEi4?BQX5S$8_bUVke(?I4%Q_7CuQ*18cXGkqCkHs@XNe3>dhWmaLuWG(Mt%Je^b!J)^d%0mzu68XGg$wE9*2lbItTx(_7QyglJg8cN z#9#FVlOXSP+d3x}#9TRF_AAIx*JSA-d^9P_Q zBXr1Bf(B*;l|^P+g8!H2GF2s8Hnn_fi=+_I&FSFriHCvXwFZQkz>VX5wUEmmV1ht& zCi0ag#-c^iZYZP5cXdc_8cO<@>>t}s{xd5gZX?ISRpJkx9nJ`r)Z5KM+|^gwDkX38 zRc^*)n{NbM`^6clo%c`uhIawWh3FR!`=>k!@BDG-tulbAWt)vNg@?O2Hjbu zt2VxDq|O9M+`4;5FH^scmQQTJhFf9r(tIju2NPpR!_M~uUj>Eh$%}3cl zQwYLgUJni=V&id2G<|G(+2`2I2UJ55g69={x2hPwYP**|MdAIDmA!pWbLaugM z)~=)+8ja#`0jK^gvR1|&baF~L;Whhs{Hr|HEi=8hx=r2S`^4dG-<6HJm3lO=b%;0> zaO(%+w3a71V7zl3Rlte~?G4yb<=pNQ-ujTP#%`0ltm{~Tkmwc^UG zN3>psj;45i<~Yv5Sq(bBZR*1*gEA#K4Cmg5 zH#A*tB99;y8#j%!yZ#$vaJ+kMlGlf^8`U|zOnmd(BY*O1x=5PxYn>d*L%)9`98zdq z077+s=yt%@cn(l~d4{#`&K;l1P$6WEy&YeA68%T2Wt^^Sp2VrGn@=DGn;K>Xbt{GQMC~{(i_;!b2 z$8URJ2+Qa2&u<`yIldHT?<{#(aImrS^M|YS1*^HJ=6|TGm;H~W?J_4d0fA62pE>Z>oB=FXg#P4Q~N2W6B) zjvphQjxPoCYGXt%++!bVcjM5mlGUB_oAo=hf(={1&#PE9Gn>b`<6zRI>L)sCDkbysXitukpiFwqXXW*r^L0D0`PO3!UXwHnLj!fo&ZwddJbK(54csYx zx74XiLASx%E*1Bzv5YOJIl@tyuyRGaZ20u-3)0UO_|94&%V_wBz)wj zhw*7j5S+HTsIl8b<-~mtVfq{qyQ|3W-oZCiX!f{>e_HeHp1G(w|A1bN}hm3FkFf0*F6ZIwBi^)d5d z>IFk^t6zA5^{)+T4T(b<@xLI~at7nwmF`B_ntj!-_rJ7}6U8q3wOlK3UEg0oCa-Jx zlP@*2n`7MESG?}cwduaBtbXJfu}QxP+-48VB>0%`|AZ z?ZtA5y=Oa7a6F_0xUO2eTmd7^-6s13FdbIS6UjxEivw_t(Zxt}WR#gh~t< z)Ek4!uQ^t|n2&LWrK%%OiGC^e(6}A?;Yk>aQ;)n-DOFrllNE?`5;Xrzsh9N~C13eADQ4{Q>x&77eXooDzsqI)5<9t7@@) zOjN++jcVr2@})Um9scC81v)3onT<$|*X!ZIb0VOgS^es0eBZP^t6PsAdqX(KODd#~ zdip>sc9s}yt`QfVPy*NE&zCGW62n31yeo1!Q!S@;tv#%<33*G{3|p_w6fk8cALJp}6p#M>C9Kd1aVVyr|=!GU*UwpJ(TR=!7JY4>KHGw`eGj zu8tREDkHcPkQ3u^ro@t{kLvzv(Q|eEgLAb*Tk?d{fGJk(*{*E%t*(ck<$oTZPP<-g z&QwNZlyflCYmsOAQKNo{ihnmh4^aal-7Re-C_>lZV5`YH-<*nbUDS4W?EzMnx@j*Q zb8F#^MD3bON7S{Caq?=X&d#)4C@yP`BiWl%U|@$xo6$SMacjw9%ze=m3S-So)s8+? z%%12>n7*5y(?1XrE~1S5GwOm;Emj@W#g$^M!ps>1*jQE{$#UGHyx(GMl%Vl|PI|*M zcJfG;*&rQVBIAdO86J`s-l;+q@=>2mE~r(>Srp>ccs+QJy+X^TKX`h{$UnAGtHW>{ zW&}krS0e>wQKn(I@Lr$0MfY`3q|MrXxvZ5zG`DFlWJ+C0qV*XhPHfb{5bcS6hFnd9 zNPJVctRfYg{=6h$FlVw}b}vic%C;Q{ZJ-oHMLUh?R6RXKzH+4aN0lfHjNrL5?rLAn zCu;IvZ-WeFY#e$U>yEPw(gog0ioBh5ONL zv<#d26ymL%hsY1LuRR!-1ILelaoP7`_blHCh{6X($hAT#t;k<|jWR=qRgo&Yp<820 z1FVw;`FojF%2O{&f&XnX2IDBSma$+!$+2(~3Hh5mbHGjZOg$u1UA0hh_0o_2-``$y zKmtJ2z=d!%{BLc%1Lsv4-@pFvP5`dED~0#V@6GX3UD`-A^*b{eLAs#b33wcQ z`0UdlpL|;di9?5eL95-mp;x9-{&%Eho-SbPgwF8QWA(e;7zv`rZZ5xn_5Q`rJ3tWu z+W2vN4+k9_3ZMZj$7rQs>vVLi|1cJx*t?2aE#%H#ny1$-Z{urr^+dr2zYT z%^RPsLI{VeVN1&EW2KQ{l&;{9^aVKklveajm9Wd(6kQAaQ$rPfHr`z(a@ELio0Wn5q6ns zf7qY@C=!i*`t%mS(tW1Z7Gd6-Gr40`H?t{w{aw?tWU0cuW^;@%!(1 zGhGwk%3DfEjg^q+&!Jw}U~bKq?>vr4ZJ2pERqAE*t8Nc0!dptbbk@2elE&j5z%Ky; z^JLxhJ`w8gne?J8a_v|dhTYJ@jbHDV_y*yjZ8!O(VH?O5bk$SsbPYs2H2%%TwfV-b z>2MjCtdV^DW*k6TV6rv`h&<(zbAmCKx0Gfi9eH2v41dm5OPeu=k(}&$GEpf`rNDW6 zzaUxEYUY>Ch7} z6!@m5l(uZZnHD;%m^HZD+P-C|ua$XL&F z?nDZCuSgNk9_d|I)*N_c_=!ik>h}R64v=X^Qlq* zCL(JLeZr#E8$O5ByyLf$c-{IH_uqqiM4BFhF!6_(B}71WcM%Xqeg{@4?>70p`|b!vh+?wL}d1vzS^%I4{cWo56s~M{RGj zGP%hiiUP=5_cEo)dt8P?0UV6;mJM^oL7K^yx-=d3_NV|LF5G`p)9>zOX?B#t7h*U{u#0t8S1L0@$H zZ$V?ICi1H-SRVJq91!ume=fnc#B}S(@uQ+2J8W=e1Dc%sApQjpm0W7b#Bz_}hYdB1 z!!S+pOWPwnZL#aGQ31|XbQK)(zTMe9nTECh(4cr~DBAc8Qn?_ha)WA08$9=}?5%kY zELf?ldb_6tz_P-q>V9?7-t-I&=(9cyCv6TIJ*w?T=+5=~2*0QTn>QaL0hO#O>avW} zOJ?!Kg9X)kO%c{xy~V_fSI>4DThFRJlT?dMnD z&DtdT-WP{aSV^iK$q)H#ohD~6*)aC6zqc5gw*lPr3gd7tIbm+hPMQe>3SwQH10Nn+ z3PMzPkVV#N)T1s5ui#hS+QN8Vg8g+*8OERcWBCH5LC!+i&a_m!!%zg+r-8c@rWCN4G0)R#9m3nc0Q zmBa|ex8j?QP+3zy(UNSR6xvAHfDU=tNhZvYoc2%x8bpzudi(3E#%O=Qk}pR-`i7k@ zynA=U@VIZ5aa?Drv1k`_Jryy0QBJCJASl-aWq#1!Obm~x40g@VLkZh z_cp;m-3*eZM_|FhN57+TPl_@{<@EH=WdT3da69W4($?p`?9l&XeC6mZ>f(#lcEohl_Rzga`C?YM@q`Ryx(F2e?$W1Y&A*Td=l zwbp@ZHt*2A64&<}yF2-ZW!-K0*S#jUp4mKV15USrBKz|b+1sun$T;pYCz2;5C)V+iIiV6StcpGsHXWmd+@n)=V+_fSoT)Oi<<$@ zUv0-Q^Z8xi_7}b9XS@<@(wQCTyG2@&nT@X9vtNI2K1IN{2LcY?;{y*E01XP_IBBr4 z454xs&ImB9r_FtNx7JO9zH1=9Z_lwvpub-k61(<%p>V~NKbCkee11Cm1h`D~0=uNM zyCdq~_Q?xi%FB^kWq9^x?u4}4R6fTw&%S5Nt6z?w5&=Fi!1rGm;n8kcNHU0rRprg_ z5^#z9jBHl`DPMT=q?olDLW{)Mcu!R0plS1^uqD952D_{@#TpuFHuFw>%K4*(l)VC1 zka(XB2Iztb*Pyy-8e0G#9bKQ0iaI&PwYC{4x;RJw#w?|Wg`Hgp6z*G3!}FT)VDms( zF(BN65^8v~I|K3{m)VhO=e$Q7F;KqV(xDOmT4zMXAH#h77kE+~<2v0X4h9neehEKd z?AB=8>~<&OXo+GI3vZ{XqKnHf0c1D9J)ZTqZB98qUMNuS&@*dNg-~J5TMhv~YD!wS Ka({d9 Date: Fri, 9 Feb 2024 15:17:49 -0500 Subject: [PATCH 017/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Grace Goheen <53586774+graciegoheen@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 322dedf747d..e8e2b2092f3 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -94,7 +94,7 @@ Use the `—-empty` flag to build an empty version of those models to save wareh ```bash -`dbt run —-select "stg_customers top_level_email_domains" --empty`. +dbt run —-select "stg_customers top_level_email_domains" --empty ``` From a18b387265fc5c1c01dc5ac581bf1f167d01cf9c Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 15:45:25 -0500 Subject: [PATCH 018/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Grace Goheen <53586774+graciegoheen@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index e8e2b2092f3..f959171b9ad 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -114,7 +114,7 @@ Now we’re ready to run this unit test! We have a couple of options for command [add screenshot] -It looks like our clever regex statement wasn’t as clever as we thought as our model is incorrectly flagging `missingdot@gmailcom` as a valid email address. +It looks like our clever regex statement wasn’t as clever as we thought as our model is incorrectly flagging `cool@example.com` as an invalid email address. Updating our regex logic to `'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'` (those darn escape characters!) and running the unit test again does the trick: From 5ffa00b68f458c63786be4fd2ae595ecd208421f Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 15:46:57 -0500 Subject: [PATCH 019/121] Updates --- website/docs/docs/build/tests.md | 2 +- website/docs/docs/build/unit-tests.md | 56 +++++++ website/docs/reference/commands/test.md | 45 ++++++ .../resource-properties/unit-tests.md | 150 +++++++++++++++++- website/sidebars.js | 19 ++- 5 files changed, 267 insertions(+), 5 deletions(-) diff --git a/website/docs/docs/build/tests.md b/website/docs/docs/build/tests.md index 3d86dc6a81b..678468ca504 100644 --- a/website/docs/docs/build/tests.md +++ b/website/docs/docs/build/tests.md @@ -1,6 +1,6 @@ --- title: "Add tests to your DAG" -sidebar_label: "Tests" +sidebar_label: "Data tests" description: "Read this tutorial to learn how to use tests when building in dbt." search_weight: "heavy" id: "tests" diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 322dedf747d..11697a1150b 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -19,6 +19,15 @@ Historically, the test coverage capabilities of dbt were limited to “data” t Now, we are introducing a new type of test to dbt - unit tests. In software programming, unit tests validate small portions of your functional code, and they work much the same way here. Unit tests allow you to validate your SQL modeling logic on a small set of static inputs _before_ you materialize your full model in production. Unit tests enable test-driven development, benefiting developer efficiency and code reliability. +:::note Before you begin + +- We currently only support unit testing SQL models. +- We currently only support adding unit tests to models in your _current_ project. +- If your model has multiple versions, be default the unit test will run on *all* versions of your model. Read [unit testing versioned models for more information](#unit-testing-versioned-models). + +Read the [refernce doc](/reference/resource-properties/unit-tests) for more details about formatting your unit tests. +::: + Let’s say you’re creating a new `dim_customers` model with a field `is_valid_email_address`, that calculates whether or not the customer’s email is valid: ```sql @@ -122,6 +131,53 @@ Updating our regex logic to `'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'` Your model is now ready for production! Adding this unit test helped us catch an issue with the SQL logic _before_ you materialized `dim_customers` in your warehouse and will better ensure the reliability of this model in the future. +### Unit testing versioned models + +When a unit test is added to a model, with no supplied version, the unit test will run on all versions of the model. +Using the example on this page, if you have version 1, 2, and 3 of `my_model`, `my test_is_valid_email_address` unit test will run on all 3 versions. + +To to only unit test a specific version (or versions) of a model, you can include the desired version(s) in the model config: + +```yml + +unit-tests: + - name: test_is_valid_email_address # this is the unique name of the test + model: my_model # name of the model I'm unit testing + versions: + include: + - 2 + given: # optional: list of inputs to provide as fixtures + +``` + +In this scenario, if you have version 1, 2, and 3 of `my_model`, `my test_is_valid_email_address` unit test will run on _only_ version 2. + +To to unit test all versions except a specific version (or versions) of a model, you can exclude the relevant version(s) in the model config: + +```yml + +unit-tests: + - name: test_is_valid_email_address # this is the unique name of the test + model: my_model # name of the model I'm unit testing + versions: + exclude: + - 1 + given: # optional: list of inputs to provide as fixtures + +``` +So if you have version 1, 2, and 3 of `my_model`, your `test_is_valid_email_address` unit test will run on _only_ version 2 and 3. + +If you want to unit test a model that references a pinned version of model, you should specify that in the ref of your input: + +```yml + +unit-tests: + - name: test_is_valid_email_address # this is the unique name of the test + model: my_model # name of the model I'm unit testing + given: # optional: list of inputs to provide as fixtures + +``` + ### Best practices for “when to add a unit test to your model”: - when your SQL contains complex logic: diff --git a/website/docs/reference/commands/test.md b/website/docs/reference/commands/test.md index c050d82a0ab..0b60cc87941 100644 --- a/website/docs/reference/commands/test.md +++ b/website/docs/reference/commands/test.md @@ -3,6 +3,7 @@ title: "About dbt test command" sidebar_label: "test" id: "test" --- + `dbt test` runs tests defined on models, sources, snapshots, and seeds. It expects that you have already created those resources through the appropriate commands. @@ -29,3 +30,47 @@ dbt test --select "one_specific_model,test_type:generic" ``` For more information on writing tests, see the [Testing Documentation](/docs/build/tests). + + + + + +`dbt test` runs data tests and unit tests defined on models, sources, snapshots, and seeds. It expects that you have already created those resources through the appropriate commands. + +The tests to run can be selected using the `--select` flag discussed [here](/reference/node-selection/syntax). + +```bash +# run data and unit tests +dbt test + +# run only data tests +dbt test --select test_type:data + +# run only unit tests +dbt test --select test_type:unit + +# run tests for one_specific_model +dbt test --select "one_specific_model" + +# run tests for all models in package +dbt test --select "some_package.*" + +# run only tests defined singularly +dbt test --select "test_type:singular" + +# run only tests defined generically +dbt test --select "test_type:generic" + +# run singular tests limited to one_specific_model +dbt test --select "one_specific_model,test_type:singular" + +# run generic tests limited to one_specific_model +dbt test --select "one_specific_model,test_type:generic" +``` + +For more information on writing tests, read the [data testing](/docs/build/tests) and [unit testing](/docs/build/unit-tests) documentation. + + + + + diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index c8832e7fbab..c0e4eead166 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -1,6 +1,6 @@ --- title: "About unit tests property" -sidebar_label: "unit tests" +sidebar_label: "Unit tests" resource_types: [models] datatype: test --- @@ -12,6 +12,9 @@ datatype: test unit_tests: - name: # this is the unique name of the test model: + versions: #optional + include: #optional + exclude: #optional config: meta: {dictionary} tags: | [] @@ -49,4 +52,147 @@ unit_tests: Unit tests validate your SQL modeling logic on a small set of static inputs before you materialize your full model in production. They support a test-driven development approach, improving both the efficiency of developers and code reliability. To run only your unit tests, use the command: -`dbt test --select test_type:unit` \ No newline at end of file +`dbt test --select test_type:unit` + +### About writing unit tests + +Unit tests are currently limited to testing SQL models and only models in your current project. When writing your unit tests, keep the following in mind: +- If your model has multiple versions, be default the unit test will run on *all* versions of your model. To specify version(s) of your model to unit test, `include` or `exclude` the desired versions in your model versions config: + + ```yaml +# my test_is_valid_email_address unit test will run on all 3 versions +unit-tests: + - name: test_is_valid_email_address + model: my_model +... + +# my test_is_valid_email_address unit test will run on ONLY version 2 +unit-tests: + - name: test_is_valid_email_address + model: my_model + versions: + include: + - 2 +... + +# my test_is_valid_email_address unit test will run on ONLY version 2 and 3 +unit-tests: + - name: test_is_valid_email_address + model: my_model + versions: + exclude: + - 1 +... + +``` + +-When using `format: dict` you must supply an in-line dictionary for `rows:` (this is the default, if you don’t specify a `format`) + +```yml + +unit_tests: + - name: test_my_model + model: my_model + given: + - input: ref('my_model_a') + format: dict + rows: + - {id: 1, name: gerda} + - {id: 2, b: michelle} + +``` + +- When `format: csv`, can either supply: + - An inline csv string for `rows:` + + ```yaml + unit_tests: + - name: test_my_model + model: my_model + given: + - input: ref('my_model_a') + format: csv + rows: | + id,name + 1,gerda + 2,michelle + + ... + ``` + + - The name of a csv file in the `tests/fixtures` directory in your project (or the directory configured for [test-paths](https://docs.getdbt.com/reference/project-configs/test-paths)) for `fixture`: + + ```yaml + unit_tests: + - name: test_my_model + model: my_model + given: + - input: ref('my_model_a') + format: csv + fixture: my_model_a_fixture + ... + ``` + + ```yaml + # tests/fixtures/my_model_a_fixture.csv + 1,gerda + 2,michelle + ``` + +- `input:` string that represents a `ref` or `source` call: + - `ref('my_model')` or `ref('my_model', v='2')` or `ref('dougs_project', 'users')` + - `source('source_schema', 'source_name')` +- `input:` is optional for seeds: + - If you don’t supply an input for a seed, we will use the seed *as* the input. + - If you do supply an input for a seed, we will use that input instead. +- You can also have “empty” inputs, by setting rows to an empty list `rows: []`: + +Examples: +```yml + +unit_tests: + - name: test_is_valid_email_address # this is the unique name of the test + model: my_model # name of the model I'm unit testing + given: # the mock data for your inputs + - input: ref('users') + rows: + - {user_id: 1, email: cool@example.com, email_top_level_domain: example.com} + - {user_id: 2, email: cool@unknown.com, email_top_level_domain: unknown.com} + - {user_id: 3, email: badgmail.com, email_top_level_domain: gmail.com} + - {user_id: 4, email: missingdot@gmailcom, email_top_level_domain: gmail.com} + - input: ref('top_level_domains') + rows: + - {tld: example.com} + - {tld: gmail.com} + expect: # the expected output given the inputs above + rows: + - {user_id: 1, is_valid_email_address: true} + - {user_id: 2, is_valid_email_address: false} + - {user_id: 3, is_valid_email_address: false} + - {user_id: 4, is_valid_email_address: false} + +``` + +```yml + +unit_tests: + - name: test_is_valid_email_address # this is the unique name of the test + model: my_model # name of the model I'm unit testing + given: # the mock data for your inputs + - input: ref('users') + rows: + - {user_id: 1, email: cool@example.com, email_top_level_domain: example.com} + - {user_id: 2, email: cool@unknown.com, email_top_level_domain: unknown.com} + - {user_id: 3, email: badgmail.com, email_top_level_domain: gmail.com} + - {user_id: 4, email: missingdot@gmailcom, email_top_level_domain: gmail.com} + - input: ref('top_level_domains') + format: csv + rows: | + tld + example.com + gmail.com + expect: # the expected output given the inputs above + format: csv + fixture: my_model_fixture + +``` \ No newline at end of file diff --git a/website/sidebars.js b/website/sidebars.js index 79f8911aaa6..ce1fa2d513b 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -275,6 +275,15 @@ const sidebarSettings = { "docs/build/python-models", ], }, + { + type: "category", + label: "Tests", + link: { type: "doc", id: "docs/build/models" }, + items: [ + "docs/build/tests", + "docs/build/unit-tests", + ], + }, "docs/build/snapshots", "docs/build/seeds", "docs/build/tests", @@ -745,7 +754,6 @@ const sidebarSettings = { "reference/resource-properties/include-exclude", "reference/resource-properties/quote", "reference/resource-properties/tests", - "reference/resource-properties/unit-tests", "reference/resource-properties/versions", ], }, @@ -809,7 +817,7 @@ const sidebarSettings = { }, { type: "category", - label: "For tests", + label: "For data tests", items: [ "reference/test-configs", "reference/resource-configs/fail_calc", @@ -820,6 +828,13 @@ const sidebarSettings = { "reference/resource-configs/where", ], }, + { + type: "category", + label: "For unit tests", + items: [ + "reference/resource-properties/unit-tests", + ], + }, { type: "category", label: "For sources", From 2329f3fbb108310b44eb5bbd6a034cbb659d00ac Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 15:47:02 -0500 Subject: [PATCH 020/121] Updates from feedback --- website/docs/docs/build/unit-tests.md | 62 ++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 11697a1150b..b2433c2511e 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -64,7 +64,7 @@ check_valid_emails as ( select * from check_valid_emails ``` -This type of logic can be challenging to validate. Let’s add a unit test to this model to ensure our `is_valid_email_address` logic captures all known edge cases: emails without `.`, emails without `@`, and emails from invalid domains. +This type of logic can be challenging to validate. You can add a unit test to this model to ensure your `is_valid_email_address` logic captures all known edge cases: emails without `.`, emails without `@`, and emails from invalid domains. ```yaml unit_tests: @@ -93,7 +93,7 @@ unit_tests: The above example defines the mock data using the inline `dict` format, but there are a handful of different options for how you format your mock data. -You’ll notice that we _only_ had to define the mock data for the columns we care about. This enables you to write succinct and _specific_ unit tests. +You’ll notice that you only_had to define the mock data for the columns you care about. This enables you to write succinct and _specific_ unit tests. :::note @@ -121,13 +121,63 @@ Now we’re ready to run this unit test! We have a couple of options for command - `dbt test —-select "dim_customers,test_type:unit"` runs all of the _unit_ tests on `dim_customers`. - `dbt test —-select test_is_valid_email_address` runs the test named `test_is_valid_email_address`. -[add screenshot] +```bash + +dbt test --select test_is_valid_email_address +16:03:49 Running with dbt=1.8.0-a1 +16:03:49 Registered adapter: postgres=1.8.0-a1 +16:03:50 Found 6 models, 5 seeds, 4 data tests, 0 sources, 0 exposures, 0 metrics, 410 macros, 0 groups, 0 semantic models, 1 unit test +16:03:50 +16:03:50 Concurrency: 5 threads (target='postgres') +16:03:50 +16:03:50 1 of 1 START unit_test dim_customers::test_is_valid_email_address ................... [RUN] +16:03:51 1 of 1 FAIL 1 dim_customers::test_is_valid_email_address ............................ [FAIL 1 in 0.26s] +16:03:51 +16:03:51 Finished running 1 unit_test in 0 hours 0 minutes and 0.67 seconds (0.67s). +16:03:51 +16:03:51 Completed with 1 error and 0 warnings: +16:03:51 +16:03:51 Failure in unit_test test_is_valid_email_address (models/marts/unit_tests.yml) +16:03:51 + +actual differs from expected: + +@@ ,customer_id,is_valid_email_address +→ ,1 ,True→False + ,2 ,False +...,... ,... + + +16:03:51 +16:03:51 compiled Code at models/marts/unit_tests.yml +16:03:51 +16:03:51 Done. PASS=0 WARN=0 ERROR=1 SKIP=0 TOTAL=1 + +``` -It looks like our clever regex statement wasn’t as clever as we thought as our model is incorrectly flagging `missingdot@gmailcom` as a valid email address. +It looks like the clever regex statement wasn’t as clever as we thought as the model is incorrectly flagging `missingdot@gmailcom` as a valid email address. -Updating our regex logic to `'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'` (those darn escape characters!) and running the unit test again does the trick: +Updating the regex logic to `'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'` (those darn escape characters!) and running the unit test again solves the problem: -[to add screenshot of example logs] +```bash + +dbt test --select test_is_valid_email_address +16:09:11 Running with dbt=1.8.0-a1 +16:09:12 Registered adapter: postgres=1.8.0-a1 +16:09:12 Found 6 models, 5 seeds, 4 data tests, 0 sources, 0 exposures, 0 metrics, 410 macros, 0 groups, 0 semantic models, 1 unit test +16:09:12 +16:09:13 Concurrency: 5 threads (target='postgres') +16:09:13 +16:09:13 1 of 1 START unit_test dim_wizards::test_is_valid_email_address ................... [RUN] +16:09:13 1 of 1 PASS dim_wizards::test_is_valid_email_address .............................. [PASS in 0.26s] +16:09:13 +16:09:13 Finished running 1 unit_test in 0 hours 0 minutes and 0.75 seconds (0.75s). +16:09:13 +16:09:13 Completed successfully +16:09:13 +16:09:13 Done. PASS=1 WARN=0 ERROR=0 SKIP=0 TOTAL=1 + +``` Your model is now ready for production! Adding this unit test helped us catch an issue with the SQL logic _before_ you materialized `dim_customers` in your warehouse and will better ensure the reliability of this model in the future. From 829c40ce5ea6d6a95c0131c004bbab59495caaf0 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:10:25 -0500 Subject: [PATCH 021/121] Reverting changes --- website/docs/faqs/Accounts/transfer-account.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/website/docs/faqs/Accounts/transfer-account.md b/website/docs/faqs/Accounts/transfer-account.md index 3d602ba11d1..f12a6ab209a 100644 --- a/website/docs/faqs/Accounts/transfer-account.md +++ b/website/docs/faqs/Accounts/transfer-account.md @@ -3,22 +3,20 @@ title: How do I transfer account ownership to another user? description: "Instructions on how to transfer your dbt Cloud user account to another user" sidebar_label: 'How to transfer dbt Cloud account?' id: transfer-account - --- You can transfer your dbt Cloud [access control](/docs/cloud/manage-access/about-user-access) to another user by following the steps below, depending on your dbt Cloud account plan: | Account plan| Steps | | ------ | ---------- | -| **Developer** | You can transfer ownership by changing the email directly on your dbt Cloud profile page, which you can access using this URL when you replace `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan: `https://YOUR_ACCESS_URL/settings/profile` | +| **Developer** | You can transfer ownership by changing the email directly on your dbt Cloud profile page, which you can access using this URL when you replace `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan: `https://YOUR_ACCESS_URL/settings/profile`. Before doing this, please ensure that you unlink your GitHub profile. | | **Team** | Existing account admins with account access can add users to, or remove users from the owner group. | | **Enterprise** | Account admins can add users to, or remove users from a group with Account Admin permissions. | | **If all account owners left the company** | If the account owner has left your organization, you will need to work with _your_ IT department to have incoming emails forwarded to the new account owner. Once your IT department has redirected the emails, you can request to reset the user password. Once you log in, you can change the email on the Profile page when you replace `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan: `https://YOUR_ACCESS_URL/settings/profile`. | -| **If all account owners left the company** | If the account owner has left your organization, you will need to work with _your_ IT department to have incoming emails forwarded to the new account owner. Once your IT department has redirected the emails, you can request to reset the user password. Once you log in, you can change the email on the Profile page when you replace `YOUR_ACCESS_URL` with the [appropriate Access URL](/docs/cloud/about-cloud/access-regions-ip-addresses) for your region and plan: `https://YOUR_ACCESS_URL/settings/profile`. | When you make any account owner and email changes: - The new email address _must_ be verified through our email verification process. - You can update any billing email address or [Notifications Settings](/docs/deploy/job-notifications) to reflect the new account owner changes, if applicable. - When transferring account ownership, please ensure you [unlink](/faqs/Accounts/git-account-in-use) your GitHub account in dbt Cloud. This is because you can only have your Git account linked to one dbt Cloud user account. - + \ No newline at end of file From 7547ecb44c92087231c5dd76f512a5eb8ff51143 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:12:28 -0500 Subject: [PATCH 022/121] fixing edits --- .../docs/docs/dbt-versions/release-notes/76-Oct-2023/sl-ga.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/dbt-versions/release-notes/76-Oct-2023/sl-ga.md b/website/docs/docs/dbt-versions/release-notes/76-Oct-2023/sl-ga.md index 35ef60bb125..06818042539 100644 --- a/website/docs/docs/dbt-versions/release-notes/76-Oct-2023/sl-ga.md +++ b/website/docs/docs/dbt-versions/release-notes/76-Oct-2023/sl-ga.md @@ -18,7 +18,7 @@ It aims to bring the best of modeling and semantics to downstream applications b - Brand new [integrations](/docs/use-dbt-semantic-layer/avail-sl-integrations) such as Tableau, Google Sheets, Hex, Mode, and Lightdash. - New [Semantic Layer APIs](/docs/dbt-cloud-apis/sl-api-overview) using GraphQL and JDBC to query metrics and build integrations. - dbt Cloud [multi-tenant regional](/docs/cloud/about-cloud/access-regions-ip-addresses) support for North America, EMEA, and APAC. Single-tenant support coming soon. -- Use the APIs to call an export (a way to build tables in your data platform), then access them in your preferred BI tool. Starting from dbt v1.7 or higher, you will be able to schedule exports as part of your dbt job. +- Coming soon — Schedule exports (a way to build tables in your data platform) as part of your dbt Cloud job. Use the APIs to call an export, then access them in your preferred BI tool. From ada59190f1c6599ebfab3609e2e6223cf43bf7b1 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:14:17 -0500 Subject: [PATCH 023/121] fixing --- website/snippets/_v2-sl-prerequisites.md | 29 +----------------------- 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/website/snippets/_v2-sl-prerequisites.md b/website/snippets/_v2-sl-prerequisites.md index 432480e9a21..18f228ad3fe 100644 --- a/website/snippets/_v2-sl-prerequisites.md +++ b/website/snippets/_v2-sl-prerequisites.md @@ -7,31 +7,4 @@ - Set up the [Semantic Layer API](/docs/dbt-cloud-apis/sl-api-overview) in the integrated tool to import metric definitions. - dbt Core or Developer accounts can define metrics but won't be able to dynamically query them.
- Understand [MetricFlow's](/docs/build/about-metricflow) key concepts, which powers the latest dbt Semantic Layer. -- Note that SSH tunneling for [Postgres and Redshift](/docs/cloud/connect-data-platform/connect-redshift-postgresql-alloydb) connections, [PrivateLink](/docs/cloud/secure/about-privatelink), and [Single sign-on (SSO)](/docs/cloud/manage-access/sso-overview) doesn't supported the dbt Semantic Layer yet. - - - - - - -- Have a multi-tenant dbt Cloud instance, hosted in North America
-- Have both your production and development environments running dbt version 1.3 or higher
-- Use Snowflake data platform
-- Install the dbt metrics package version >=1.3.0, <1.4.0 in your dbt project
- * **Note** — After installing the dbt metrics package and updating the `packages.yml` file, make sure you run at least one model. -- Set up the Discovery API in the integrated tool to import metric definitions - * Developer accounts will be able to query the Proxy Server using SQL, but will not be able to browse pre-populated dbt metrics in external tools, which requires access to the Discovery API
- -
- - - -- Have a multi-tenant dbt Cloud instance, hosted in North America
-- Have both your production and development environments running dbt version 1.2
-- Use Snowflake data platform
-- Install the dbt metrics package version >=0.3.0, <0.4.0 in your dbt project
- * **Note** — After installing the dbt metrics package and updating the `packages.yml` file, make sure you run at least one model. -- Set up the Discovery API in the integrated tool to import metric definitions - * Developer accounts will be able to query the Proxy Server using SQL, but will not be able to browse pre-populated dbt metrics in external tools, which requires access to the Discovery API
- -
+- Note that SSH tunneling for [Postgres and Redshift](/docs/cloud/connect-data-platform/connect-redshift-postgresql-alloydb) connections, [PrivateLink](/docs/cloud/secure/about-privatelink), and [Single sign-on (SSO)](/docs/cloud/manage-access/sso-overview) doesn't support the dbt Semantic Layer yet. From 59cbb84b40cb1606c00683cfa6ac7da81524da7a Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:15:24 -0500 Subject: [PATCH 024/121] fixing --- website/docs/faqs/Accounts/transfer-account.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/website/docs/faqs/Accounts/transfer-account.md b/website/docs/faqs/Accounts/transfer-account.md index f12a6ab209a..693061c55c6 100644 --- a/website/docs/faqs/Accounts/transfer-account.md +++ b/website/docs/faqs/Accounts/transfer-account.md @@ -3,6 +3,7 @@ title: How do I transfer account ownership to another user? description: "Instructions on how to transfer your dbt Cloud user account to another user" sidebar_label: 'How to transfer dbt Cloud account?' id: transfer-account + --- You can transfer your dbt Cloud [access control](/docs/cloud/manage-access/about-user-access) to another user by following the steps below, depending on your dbt Cloud account plan: @@ -19,4 +20,4 @@ When you make any account owner and email changes: - The new email address _must_ be verified through our email verification process. - You can update any billing email address or [Notifications Settings](/docs/deploy/job-notifications) to reflect the new account owner changes, if applicable. - When transferring account ownership, please ensure you [unlink](/faqs/Accounts/git-account-in-use) your GitHub account in dbt Cloud. This is because you can only have your Git account linked to one dbt Cloud user account. - \ No newline at end of file + From 4fb38a29b5d5716067dbd3d6c253a3d619b219a1 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:16:57 -0500 Subject: [PATCH 025/121] Updating sidebar folders --- website/sidebars.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/website/sidebars.js b/website/sidebars.js index d6913088963..2220de7b331 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -282,14 +282,12 @@ const sidebarSettings = { label: "Tests", link: { type: "doc", id: "docs/build/models" }, items: [ - "docs/build/tests", + "docs/build/data-tests", "docs/build/unit-tests", ], }, "docs/build/snapshots", "docs/build/seeds", - "docs/build/data-tests", - "docs/build/unit-tests", "docs/build/jinja-macros", "docs/build/sources", "docs/build/exposures", From 6fe72ffebe743e288bee66b598dbf910e931caae Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:18:22 -0500 Subject: [PATCH 026/121] Fixing errors --- .../docs/cloud/about-cloud/regions-ip-addresses.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/website/docs/docs/cloud/about-cloud/regions-ip-addresses.md b/website/docs/docs/cloud/about-cloud/regions-ip-addresses.md index 844714b7fbf..72ab367d6de 100644 --- a/website/docs/docs/cloud/about-cloud/regions-ip-addresses.md +++ b/website/docs/docs/cloud/about-cloud/regions-ip-addresses.md @@ -23,17 +23,17 @@ dbt Cloud is [hosted](/docs/cloud/about-cloud/architecture) in multiple regions ## Accessing your account -To login to dbt Cloud, use the URL that applies to your environment. Your access URL used will depend on a few factors including location and tenancy: -- **US multi-tenant:** Use your unique URL that starts with your account prefix, followed by `us1.dbt.com`. For example, `abc123.us1.dbt.com`. - - If you are unsure of your access URL, navigate to `us1.dbt.com` and enter your credentials. If you are a member of a single account, you will be logged in and your URL will be displayed in the browser. If you are a member of muliple accounts, you will be presented with a list of options, along with the appropriate login URLs for each +To log into dbt Cloud, use the URL that applies to your environment. Your access URL used will depend on a few factors, including location and tenancy: +- **US multi-tenant:** Use your unique URL that starts with your account prefix, followed by `us1.dbt.com`. For example, `abc123.us1.dbt.com`. You can also use `cloud.getdbt.com`, but this URL will be removed in the future. + - If you are unsure of your access URL, navigate to `us1.dbt.com` and enter your dbt Cloud credentials. If you are a member of a single account, you will be logged in, and your URL will be displayed in the browser. If you are a member of multiple accounts, you will be presented with a list of options, along with the appropriate login URLs for each. -- **EMEA multi-tenant:** Use the URL `emea.dbt.com`. -- **APAC multi-tenant:** Use the URL `au.dbt.com`. +- **EMEA multi-tenant:** Use `emea.dbt.com`. +- **APAC multi-tenant:** Use `au.dbt.com`. - **Worldwide single-tenant and VPC:** Use the vanity URL provided during your onboarding. -### Locating your dbt Cloud IP addresses +## Locating your dbt Cloud IP addresses There are two ways to view your dbt Cloud IP addresses: - If no projects exist in the account, create a new project, and the IP addresses will be displayed during the **Configure your environment** steps. From d621b2b2622d3c583c02a2adeee9504152846cfa Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:23:41 -0500 Subject: [PATCH 027/121] Update unit-tests.md Fixing spacing --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 385aa6a4ba6..72f6bd372aa 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -49,7 +49,7 @@ check_valid_emails as ( customers.customer_id, customers.first_name, customers.last_name, - coalesce (regexp_like( + coalesce (regexp_like( customers.email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$' ) = true From b6376c164812a496b656899082f92fd87d4d2ed6 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:26:37 -0500 Subject: [PATCH 028/121] fixing yet another merge error --- website/vercel.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/vercel.json b/website/vercel.json index 158d43cdc0b..9da721dc112 100644 --- a/website/vercel.json +++ b/website/vercel.json @@ -1324,7 +1324,7 @@ }, { "source": "/docs/deploy/regions-ip-addresses", - "destination": "/docs/cloud/about-cloud/access-regions-ip-addresses", + "destination": "/docs/cloud/about-cloud/regions-ip-addresses", "permanent": true }, { From 688aeded52a44e100dd02f6991b3914491641931 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:33:24 -0500 Subject: [PATCH 029/121] Update unit-tests.md Fixing code spacing --- .../docs/reference/resource-properties/unit-tests.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index c0e4eead166..20e21d5602f 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -165,11 +165,11 @@ unit_tests: - {tld: example.com} - {tld: gmail.com} expect: # the expected output given the inputs above - rows: - - {user_id: 1, is_valid_email_address: true} - - {user_id: 2, is_valid_email_address: false} - - {user_id: 3, is_valid_email_address: false} - - {user_id: 4, is_valid_email_address: false} + rows: + - {user_id: 1, is_valid_email_address: true} + - {user_id: 2, is_valid_email_address: false} + - {user_id: 3, is_valid_email_address: false} + - {user_id: 4, is_valid_email_address: false} ``` @@ -195,4 +195,4 @@ unit_tests: format: csv fixture: my_model_fixture -``` \ No newline at end of file +``` From 80ec818f9746ad49169be56565dd0fa793914798 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:35:29 -0500 Subject: [PATCH 030/121] Update unit-tests.md Fixing spacing --- website/docs/reference/resource-properties/unit-tests.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 20e21d5602f..4232c1cae9a 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -13,8 +13,8 @@ unit_tests: - name: # this is the unique name of the test model: versions: #optional - include: #optional - exclude: #optional + include: #optional + exclude: #optional config: meta: {dictionary} tags: | [] From ed9e312ed63bcca57a99ad02fa3cf9c35269621e Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:38:22 -0500 Subject: [PATCH 031/121] Updating based on feedback --- website/docs/docs/build/unit-tests.md | 2 ++ .../reference/resource-properties/unit-tests.md | 14 +++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 72f6bd372aa..8bc5a0f246f 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -30,6 +30,8 @@ Read the [refernce doc](/reference/resource-properties/unit-tests) for more deta Let’s say you’re creating a new `dim_customers` model with a field `is_valid_email_address`, that calculates whether or not the customer’s email is valid: + + ```sql with customers as ( diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index c0e4eead166..3a5b8334ff4 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -5,6 +5,13 @@ resource_types: [models] datatype: test --- +## Definition + +Unit tests validate your SQL modeling logic on a small set of static inputs before you materialize your full model in production. They support a test-driven development approach, improving both the efficiency of developers and code reliability. + +To run only your unit tests, use the command: +`dbt test --select test_type:unit` + ```yml @@ -47,13 +54,6 @@ unit_tests: -## Definition - -Unit tests validate your SQL modeling logic on a small set of static inputs before you materialize your full model in production. They support a test-driven development approach, improving both the efficiency of developers and code reliability. - -To run only your unit tests, use the command: -`dbt test --select test_type:unit` - ### About writing unit tests Unit tests are currently limited to testing SQL models and only models in your current project. When writing your unit tests, keep the following in mind: From 420e2f1fd3a8cac90fef505cfd04fe74c10b2041 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:39:49 -0500 Subject: [PATCH 032/121] Update website/docs/docs/build/unit-tests.md --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 8bc5a0f246f..22f9196aeb0 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -101,7 +101,7 @@ You’ll notice that you only_had to define the mock data for the columns you ca The direct parents of the model that you’re unit testing (in this example `stg_customers` and `top_level_email_domains`) need to exist in the warehouse before you’re able to execute the unit test. -Use the `—-empty` flag to build an empty version of those models to save warehouse spend. +Use the `--empty` flag to build an empty version of those models to save warehouse spend. ```bash From 75ca6f57c685e998d5115511f8957e6454f00a78 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:40:58 -0500 Subject: [PATCH 033/121] Update website/docs/docs/build/unit-tests.md --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 22f9196aeb0..9af51e6559f 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -30,7 +30,7 @@ Read the [refernce doc](/reference/resource-properties/unit-tests) for more deta Let’s say you’re creating a new `dim_customers` model with a field `is_valid_email_address`, that calculates whether or not the customer’s email is valid: - + ```sql with customers as ( From 4281976bedb8acd0f4a239c70e00bbe0d291a535 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:41:55 -0500 Subject: [PATCH 034/121] Update unit-tests.md Adding filename --- website/docs/docs/build/unit-tests.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 9af51e6559f..f145e681e4b 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -68,6 +68,8 @@ select * from check_valid_emails This type of logic can be challenging to validate. You can add a unit test to this model to ensure your `is_valid_email_address` logic captures all known edge cases: emails without `.`, emails without `@`, and emails from invalid domains. + + ```yaml unit_tests: - name: test_is_valid_email_address From 9dbb79a1a34ee0134ab95b0eec4fd81752707f69 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:46:46 -0500 Subject: [PATCH 035/121] Update unit-tests.md Fixing spacing errors --- website/docs/reference/resource-properties/unit-tests.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index dbd7c867ad9..265edbe61e9 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -186,13 +186,13 @@ unit_tests: - {user_id: 3, email: badgmail.com, email_top_level_domain: gmail.com} - {user_id: 4, email: missingdot@gmailcom, email_top_level_domain: gmail.com} - input: ref('top_level_domains') - format: csv - rows: | - tld + format: csv + rows: | + tld example.com gmail.com expect: # the expected output given the inputs above - format: csv + format: csv fixture: my_model_fixture ``` From 8b708c1a0d15dc268a52397234ea03b0b019c92c Mon Sep 17 00:00:00 2001 From: Ly Nguyen Date: Fri, 9 Feb 2024 15:12:16 -0800 Subject: [PATCH 036/121] More updates --- website/blog/2021-11-23-how-to-upgrade-dbt-versions.md | 6 ++++++ .../docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md | 6 ++++++ website/docs/docs/dbt-versions/core-versions.md | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md b/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md index 3aa9368a2ca..b44f6545ae1 100644 --- a/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md +++ b/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md @@ -16,6 +16,12 @@ As we get closer to dbt v1.0 shipping in December, it's a perfect time to get yo Even with all the new shinies on offer, upgrading can be daunting – you rely on dbt to power your analytics workflow and can’t afford to change things just to discover that your daily run doesn’t work anymore. I’ve been there. This is the checklist I wish I had when I owned my last company’s dbt project. +:::tip Beta for Keep on latest version + +You can upgrade your version in dbt Cloud by using the **Keep on latest version** setting. No more manual upgrades and you no longer have to "create a second sandbox project" for your experimentation. For details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). + +::: + This guide covers the steps to safely upgrade, using a hypothetical project as a case study. The project uses dbt v0.16.0 and is relatively mature. It contains a couple of hundred models and uses a wide swathe of dbt functionality - custom tests, macros from dbt-utils, and snapshots to capture changes in critical business data. diff --git a/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md b/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md index 211ce054820..11aff019958 100644 --- a/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md +++ b/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md @@ -12,6 +12,12 @@ displayed_sidebar: "docs" - [Cloud upgrade guide](/docs/dbt-versions/upgrade-core-in-cloud) - Release schedule (coming soon) +:::tip Beta for Keep on latest version + +With dbt Cloud, you can upgrade by using the **Keep on latest version** setting. Let dbt Labs handle version upgrades for you. For details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). + +::: + ## What to know before upgrading dbt Labs is committed to providing backward compatibility for all versions 1.x, with the exception of any changes explicitly mentioned below. If you encounter an error upon upgrading, please let us know by [opening an issue](https://github.com/dbt-labs/dbt-core/issues/new). diff --git a/website/docs/docs/dbt-versions/core-versions.md b/website/docs/docs/dbt-versions/core-versions.md index 3ebf988c136..51cfafa1d93 100644 --- a/website/docs/docs/dbt-versions/core-versions.md +++ b/website/docs/docs/dbt-versions/core-versions.md @@ -8,6 +8,12 @@ pagination_prev: null dbt Core releases follow [semantic versioning](https://semver.org/) guidelines. For more on how we use semantic versions, see [How dbt Core uses semantic versioning](#how-dbt-core-uses-semantic-versioning). +:::tip Coming soon + +Currently, dbt Labs is running a beta for the **Keep on latest version** setting in dbt Cloud — no more manual upgrades and easier access to new dbt features. For further details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). + +::: + dbt Labs provides different support levels for different versions, which may include new features, bug fixes, or security patches: From 0de14e732535024a306f048a96ac96b1f9b4e235 Mon Sep 17 00:00:00 2001 From: Doug Beatty <44704949+dbeatty10@users.noreply.github.com> Date: Fri, 9 Feb 2024 17:31:07 -0700 Subject: [PATCH 037/121] Apply suggestions from code review --- website/docs/docs/build/unit-tests.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index f145e681e4b..247a0154a22 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -23,14 +23,14 @@ Now, we are introducing a new type of test to dbt - unit tests. In software prog - We currently only support unit testing SQL models. - We currently only support adding unit tests to models in your _current_ project. -- If your model has multiple versions, be default the unit test will run on *all* versions of your model. Read [unit testing versioned models for more information](#unit-testing-versioned-models). +- If your model has multiple versions, by default the unit test will run on *all* versions of your model. Read [unit testing versioned models for more information](#unit-testing-versioned-models). -Read the [refernce doc](/reference/resource-properties/unit-tests) for more details about formatting your unit tests. +Read the [reference doc](/reference/resource-properties/unit-tests) for more details about formatting your unit tests. ::: Let’s say you’re creating a new `dim_customers` model with a field `is_valid_email_address`, that calculates whether or not the customer’s email is valid: - + ```sql with customers as ( From b94fb0aeb54f842aab8eea6635b4f6b1af89d3d7 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 19:34:11 -0500 Subject: [PATCH 038/121] Apply suggestions from code review --- website/docs/docs/build/unit-tests.md | 35 +++++++++++++-------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 247a0154a22..107f9ddd436 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -97,13 +97,13 @@ unit_tests: The above example defines the mock data using the inline `dict` format, but there are a handful of different options for how you format your mock data. -You’ll notice that you only_had to define the mock data for the columns you care about. This enables you to write succinct and _specific_ unit tests. +Notice that you only have to define the mock data for the columns you care about. This enables you to write succinct and _specific_ unit tests. :::note -The direct parents of the model that you’re unit testing (in this example `stg_customers` and `top_level_email_domains`) need to exist in the warehouse before you’re able to execute the unit test. +The direct parents of the model that you’re unit testing (in this example, `stg_customers` and `top_level_email_domains`) need to exist in the warehouse before you can execute the unit test. -Use the `--empty` flag to build an empty version of those models to save warehouse spend. +Use the `--empty` flag to build an empty version of the models to save warehouse spend. ```bash @@ -117,9 +117,8 @@ Alternatively, use `dbt build` to, in lineage order: - Materialize your model in the warehouse. - Run the data tests on your model. -::: -Now we’re ready to run this unit test! We have a couple of options for commands depending on how specific we want to be: +Now you’re ready to run this unit test. You have a couple of options for commands depending on how specific you want to be: - `dbt test —-select dim_customers` runs _all_ of the tests on `dim_customers`. - `dbt test —-select "dim_customers,test_type:unit"` runs all of the _unit_ tests on `dim_customers`. @@ -159,9 +158,9 @@ actual differs from expected: ``` -It looks like the clever regex statement wasn’t as clever as we thought as the model is incorrectly flagging `missingdot@gmailcom` as a valid email address. +The clever regex statement wasn’t as clever as initially thought, as the model incorrectly flagged `missingdot@gmailcom` as a valid email address. -Updating the regex logic to `'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'` (those darn escape characters!) and running the unit test again solves the problem: +Updating the regex logic to `'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'` (those pesky escape characters) and rerunning the unit test solves the problem: ```bash @@ -183,14 +182,14 @@ dbt test --select test_is_valid_email_address ``` -Your model is now ready for production! Adding this unit test helped us catch an issue with the SQL logic _before_ you materialized `dim_customers` in your warehouse and will better ensure the reliability of this model in the future. +Your model is now ready for production! Adding this unit test helped catch an issue with the SQL logic _before_ you materialized `dim_customers` in your warehouse and will better ensure the reliability of this model in the future. ### Unit testing versioned models -When a unit test is added to a model, with no supplied version, the unit test will run on all versions of the model. -Using the example on this page, if you have version 1, 2, and 3 of `my_model`, `my test_is_valid_email_address` unit test will run on all 3 versions. +When a unit test is added to a model, it will run on all versions of the model by default. +Using the example in this article, if you have versions 1, 2, and 3 of `my_model`, the `my test_is_valid_email_address` unit test will run on all 3 versions. -To to only unit test a specific version (or versions) of a model, you can include the desired version(s) in the model config: +To only unit test a specific version (or versions) of a model, include the desired version(s) in the model config: ```yml @@ -206,7 +205,7 @@ unit-tests: In this scenario, if you have version 1, 2, and 3 of `my_model`, `my test_is_valid_email_address` unit test will run on _only_ version 2. -To to unit test all versions except a specific version (or versions) of a model, you can exclude the relevant version(s) in the model config: +To unit test all versions except a specific version (or versions) of a model, you can exclude the relevant version(s) in the model config: ```yml @@ -219,9 +218,9 @@ unit-tests: given: # optional: list of inputs to provide as fixtures ``` -So if you have version 1, 2, and 3 of `my_model`, your `test_is_valid_email_address` unit test will run on _only_ version 2 and 3. +So, if you have versions 1, 2, and 3 of `my_model`, your `test_is_valid_email_address` unit test will run on _only_ versions 2 and 3. -If you want to unit test a model that references a pinned version of model, you should specify that in the ref of your input: +If you want to unit test a model that references the pinned version of the model, you should specify that in the `ref` of your input: ```yml @@ -232,9 +231,9 @@ unit-tests: ``` -### Best practices for “when to add a unit test to your model”: - -- when your SQL contains complex logic: +### When to add a unit test to your model +There are a number of scenarios where unit testing a mode is appropriate, including: +- When your SQL contains complex logic: - Regex - Date math - Window functions @@ -242,7 +241,7 @@ unit-tests: - Truncation - Recursion - Add a unit test for anything that feels like writing a function. For example, it involves your own logic processing the input. - - You wouldn't need to prioritize unit testing just calling `min()`, for example. That's already tested extensively by the warehouse and if something unexpected happens it's going to be a result of issues in the underlying data, so your fixture data in the unit test isn't going to help you. + - For example, you wouldn't need to prioritize unit testing just calling `min()`. That's already been tested extensively by the warehouse. If something unexpected happens, it's going to be a result of issues in the underlying data, so your fixture data in the unit test isn't going to help you. - Logic for which you had bugs reported before. - Edge cases not yet seen in your actual data that you want to handle. - Prior to refactoring the transformation logic (especially if the refactor is significant). From 353c4f34267d19da2c9038ecb267b20fb7027c6c Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 19:43:28 -0500 Subject: [PATCH 039/121] Update unit-tests.md Spacing --- website/docs/docs/build/unit-tests.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 107f9ddd436..f8f99b50791 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -237,7 +237,7 @@ There are a number of scenarios where unit testing a mode is appropriate, includ - Regex - Date math - Window functions - - `case when` statements when many `when`s + - `case when` statements when there are many `when`s - Truncation - Recursion - Add a unit test for anything that feels like writing a function. For example, it involves your own logic processing the input. @@ -246,3 +246,4 @@ There are a number of scenarios where unit testing a mode is appropriate, includ - Edge cases not yet seen in your actual data that you want to handle. - Prior to refactoring the transformation logic (especially if the refactor is significant). - Models with high “criticality” (public, contracted models or models directly upstream of an exposure). + From 5bfff10e7c3652bd92408163c8a28ad3563d6bf6 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 20:03:18 -0500 Subject: [PATCH 040/121] updating spacing --- website/docs/docs/build/unit-tests.md | 1 + 1 file changed, 1 insertion(+) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index f8f99b50791..ad778642451 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -232,6 +232,7 @@ unit-tests: ``` ### When to add a unit test to your model + There are a number of scenarios where unit testing a mode is appropriate, including: - When your SQL contains complex logic: - Regex From 37df470f7c01a3db586cbc021e6c5fdcdcc1e8eb Mon Sep 17 00:00:00 2001 From: "Leona B. Campbell" <3880403+runleonarun@users.noreply.github.com> Date: Fri, 9 Feb 2024 17:05:02 -0800 Subject: [PATCH 041/121] Update website/docs/reference/resource-properties/unit-tests.md --- website/docs/reference/resource-properties/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 265edbe61e9..c5c765c21eb 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -20,7 +20,7 @@ unit_tests: - name: # this is the unique name of the test model: versions: #optional - include: #optional + include: #optional exclude: #optional config: meta: {dictionary} From 39b83aaca973d9678570029d60f4168c24a7f81e Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 20:05:31 -0500 Subject: [PATCH 042/121] Update website/docs/reference/commands/test.md --- website/docs/reference/commands/test.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/commands/test.md b/website/docs/reference/commands/test.md index 0b60cc87941..1bcbd315eb2 100644 --- a/website/docs/reference/commands/test.md +++ b/website/docs/reference/commands/test.md @@ -35,7 +35,7 @@ For more information on writing tests, see the [Testing Documentation](/docs/bui -`dbt test` runs data tests and unit tests defined on models, sources, snapshots, and seeds. It expects that you have already created those resources through the appropriate commands. +`dbt test` runs data tests defined on models, sources, snapshots, and seeds and unit tests defined on SQL models. It expects that you have already created those resources through the appropriate commands. The tests to run can be selected using the `--select` flag discussed [here](/reference/node-selection/syntax). From 90526f6dcfe746d5e2f19929d2a7b79fed84be3a Mon Sep 17 00:00:00 2001 From: "Leona B. Campbell" <3880403+runleonarun@users.noreply.github.com> Date: Fri, 9 Feb 2024 17:05:52 -0800 Subject: [PATCH 043/121] Update website/docs/reference/resource-properties/unit-tests.md --- website/docs/reference/resource-properties/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index c5c765c21eb..d1be1d8baad 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -21,7 +21,7 @@ unit_tests: model: versions: #optional include: #optional - exclude: #optional + exclude: #optional config: meta: {dictionary} tags: | [] From ab28f995fc2e8976c985be2a97bd8bcf19e6c2cd Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 20:10:05 -0500 Subject: [PATCH 044/121] Apply suggestions from code review Co-authored-by: Grace Goheen <53586774+graciegoheen@users.noreply.github.com> --- website/docs/reference/commands/test.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/website/docs/reference/commands/test.md b/website/docs/reference/commands/test.md index 1bcbd315eb2..c62e0071484 100644 --- a/website/docs/reference/commands/test.md +++ b/website/docs/reference/commands/test.md @@ -55,16 +55,16 @@ dbt test --select "one_specific_model" # run tests for all models in package dbt test --select "some_package.*" -# run only tests defined singularly +# run only data tests defined singularly dbt test --select "test_type:singular" -# run only tests defined generically +# run only data tests defined generically dbt test --select "test_type:generic" -# run singular tests limited to one_specific_model +# run singular data tests limited to one_specific_model dbt test --select "one_specific_model,test_type:singular" -# run generic tests limited to one_specific_model +# run generic data tests limited to one_specific_model dbt test --select "one_specific_model,test_type:generic" ``` From f5753a70581ed31283339b970f715eb3b524410a Mon Sep 17 00:00:00 2001 From: "Leona B. Campbell" <3880403+runleonarun@users.noreply.github.com> Date: Fri, 9 Feb 2024 17:14:42 -0800 Subject: [PATCH 045/121] Update website/docs/docs/build/unit-tests.md --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index ad778642451..1430b4fd8d7 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -246,5 +246,5 @@ There are a number of scenarios where unit testing a mode is appropriate, includ - Logic for which you had bugs reported before. - Edge cases not yet seen in your actual data that you want to handle. - Prior to refactoring the transformation logic (especially if the refactor is significant). -- Models with high “criticality” (public, contracted models or models directly upstream of an exposure). +- Models with high "criticality" (public, contracted models or models directly upstream of an exposure). From 3872aaab5c0699be9418135d52fc613a5617e95a Mon Sep 17 00:00:00 2001 From: "Leona B. Campbell" <3880403+runleonarun@users.noreply.github.com> Date: Fri, 9 Feb 2024 17:28:34 -0800 Subject: [PATCH 046/121] Update website/docs/docs/build/unit-tests.md --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 1430b4fd8d7..c3e15bb98ed 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -226,7 +226,7 @@ If you want to unit test a model that references the pinned version of the model unit-tests: - name: test_is_valid_email_address # this is the unique name of the test - model: my_model # name of the model I'm unit testing + model: my_model # name of the model I am unit testing given: # optional: list of inputs to provide as fixtures ``` From 567ef1590faac92f15af7a3249de93a2eefdeac3 Mon Sep 17 00:00:00 2001 From: "Leona B. Campbell" <3880403+runleonarun@users.noreply.github.com> Date: Fri, 9 Feb 2024 17:30:37 -0800 Subject: [PATCH 047/121] Update website/docs/docs/build/unit-tests.md --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index c3e15bb98ed..c6aa58e850c 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -104,7 +104,7 @@ Notice that you only have to define the mock data for the columns you care about The direct parents of the model that you’re unit testing (in this example, `stg_customers` and `top_level_email_domains`) need to exist in the warehouse before you can execute the unit test. Use the `--empty` flag to build an empty version of the models to save warehouse spend. - +::: ```bash dbt run —-select "stg_customers top_level_email_domains" --empty From 57cbfe11c720c4aafacfd521e366a810b232baa5 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 20:33:08 -0500 Subject: [PATCH 048/121] Update unit-tests.md --- website/docs/docs/build/unit-tests.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index c6aa58e850c..673e217e33a 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -104,7 +104,7 @@ Notice that you only have to define the mock data for the columns you care about The direct parents of the model that you’re unit testing (in this example, `stg_customers` and `top_level_email_domains`) need to exist in the warehouse before you can execute the unit test. Use the `--empty` flag to build an empty version of the models to save warehouse spend. -::: + ```bash dbt run —-select "stg_customers top_level_email_domains" --empty @@ -117,6 +117,7 @@ Alternatively, use `dbt build` to, in lineage order: - Materialize your model in the warehouse. - Run the data tests on your model. +::: Now you’re ready to run this unit test. You have a couple of options for commands depending on how specific you want to be: From 1a7d70d564355446b8e9ddc668345a28dea2333a Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 20:45:08 -0500 Subject: [PATCH 049/121] Apply suggestions from code review Co-authored-by: Grace Goheen <53586774+graciegoheen@users.noreply.github.com> --- website/docs/reference/resource-properties/unit-tests.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index d1be1d8baad..3cf0858e4b4 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -60,13 +60,13 @@ Unit tests are currently limited to testing SQL models and only models in your c - If your model has multiple versions, be default the unit test will run on *all* versions of your model. To specify version(s) of your model to unit test, `include` or `exclude` the desired versions in your model versions config: ```yaml -# my test_is_valid_email_address unit test will run on all 3 versions +# my test_is_valid_email_address unit test will run on all versions of my_model unit-tests: - name: test_is_valid_email_address model: my_model ... -# my test_is_valid_email_address unit test will run on ONLY version 2 +# my test_is_valid_email_address unit test will run on ONLY version 2 of my_model unit-tests: - name: test_is_valid_email_address model: my_model @@ -75,7 +75,7 @@ unit-tests: - 2 ... -# my test_is_valid_email_address unit test will run on ONLY version 2 and 3 +# my test_is_valid_email_address unit test will run on all versions EXCEPT 1 of my_model unit-tests: - name: test_is_valid_email_address model: my_model From 0d6b78a5b3f587757dffb58fccd2b1782420c1e0 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 9 Feb 2024 20:45:48 -0500 Subject: [PATCH 050/121] Update unit-tests.md --- website/docs/docs/build/unit-tests.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 673e217e33a..2ac12d4763d 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -65,6 +65,7 @@ check_valid_emails as ( select * from check_valid_emails ``` + This type of logic can be challenging to validate. You can add a unit test to this model to ensure your `is_valid_email_address` logic captures all known edge cases: emails without `.`, emails without `@`, and emails from invalid domains. @@ -94,6 +95,7 @@ unit_tests: - {customer_id: 4, is_valid_email_address: false} ``` + The above example defines the mock data using the inline `dict` format, but there are a handful of different options for how you format your mock data. From 6d1e37c58af00f28d63b6a54c1d93994f993d28a Mon Sep 17 00:00:00 2001 From: Jeremy Cohen Date: Mon, 12 Feb 2024 16:31:15 +0100 Subject: [PATCH 051/121] jerco first round edits --- .../2021-11-23-how-to-upgrade-dbt-versions.md | 12 ++++++++---- .../core-upgrade/01-upgrading-to-v1.8.md | 10 +++++++--- .../docs/docs/dbt-versions/core-versions.md | 6 ++++-- .../dbt-versions/upgrade-core-in-cloud.md | 19 +++++++++++++------ 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md b/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md index b44f6545ae1..38c7dfddbef 100644 --- a/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md +++ b/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md @@ -12,16 +12,20 @@ date: 2021-11-29 is_featured: true --- -As we get closer to dbt v1.0 shipping in December, it's a perfect time to get your installation up to scratch. dbt 1.0 represents the culmination of over five years of development and refinement to the analytics engineering experience - smoothing off sharp edges, speeding up workflows and enabling whole new classes of work. +:::tip **February 2024 Update!** -Even with all the new shinies on offer, upgrading can be daunting – you rely on dbt to power your analytics workflow and can’t afford to change things just to discover that your daily run doesn’t work anymore. I’ve been there. This is the checklist I wish I had when I owned my last company’s dbt project. +It's been a few years since dbt-core turned 1.0! Since then, we've committed to zero breaking changes whenever possible, and it's become much easier to upgrade dbt-core versions. -:::tip Beta for Keep on latest version +Now, we're taking it one step further, by introducing **Keep on latest version** in dbt Cloud (currently available to select customers). No more manual upgrades, and no more need for a "a second sandbox project." For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). -You can upgrade your version in dbt Cloud by using the **Keep on latest version** setting. No more manual upgrades and you no longer have to "create a second sandbox project" for your experimentation. For details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). +We're leaving the rest of this post as-is, so we can all remember how it used to be. Enjoy a stroll down memory lane. ::: +As we get closer to dbt v1.0 shipping in December, it's a perfect time to get your installation up to scratch. dbt 1.0 represents the culmination of over five years of development and refinement to the analytics engineering experience - smoothing off sharp edges, speeding up workflows and enabling whole new classes of work. + +Even with all the new shinies on offer, upgrading can be daunting – you rely on dbt to power your analytics workflow and can’t afford to change things just to discover that your daily run doesn’t work anymore. I’ve been there. This is the checklist I wish I had when I owned my last company’s dbt project. + This guide covers the steps to safely upgrade, using a hypothetical project as a case study. The project uses dbt v0.16.0 and is relatively mature. It contains a couple of hundred models and uses a wide swathe of dbt functionality - custom tests, macros from dbt-utils, and snapshots to capture changes in critical business data. diff --git a/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md b/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md index 11aff019958..5851cbbf1af 100644 --- a/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md +++ b/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md @@ -1,5 +1,5 @@ --- -title: "Upgrading to v1.8 (alpha)" +title: "Upgrading to v1.8 (beta)" id: upgrading-to-v1.8 description: New features and changes in dbt Core v1.8 displayed_sidebar: "docs" @@ -12,9 +12,13 @@ displayed_sidebar: "docs" - [Cloud upgrade guide](/docs/dbt-versions/upgrade-core-in-cloud) - Release schedule (coming soon) -:::tip Beta for Keep on latest version +:::tip In dbt Cloud, simply "Keep on latest version" -With dbt Cloud, you can upgrade by using the **Keep on latest version** setting. Let dbt Labs handle version upgrades for you. For details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). +_Is it Core? Is it Cloud? From now on, it's just dbt._ + +Starting this year, let dbt Labs handle version upgrades for you. As a dbt Cloud customer, you get early access to new functionality before it lands in the final release of dbt Core v1.8, and without the hassle of managing your own version upgrades. For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). + +"Keep on latest version" is currently available in beta for select dbt Cloud customers. The first beta release of dbt-core v1.8 is planned for February 28. ::: diff --git a/website/docs/docs/dbt-versions/core-versions.md b/website/docs/docs/dbt-versions/core-versions.md index 51cfafa1d93..23bf6ab7020 100644 --- a/website/docs/docs/dbt-versions/core-versions.md +++ b/website/docs/docs/dbt-versions/core-versions.md @@ -8,9 +8,11 @@ pagination_prev: null dbt Core releases follow [semantic versioning](https://semver.org/) guidelines. For more on how we use semantic versions, see [How dbt Core uses semantic versioning](#how-dbt-core-uses-semantic-versioning). -:::tip Coming soon +:::tip In dbt Cloud, simply "keep on latest version" -Currently, dbt Labs is running a beta for the **Keep on latest version** setting in dbt Cloud — no more manual upgrades and easier access to new dbt features. For further details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). +_Is it Core? Is it Cloud? From now on, it's just dbt._ + +As a dbt Cloud customer, you get early access to new functionality before it lands in final releases of dbt Core, without the hassle of managing your own version upgrades. For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). ::: diff --git a/website/docs/docs/dbt-versions/upgrade-core-in-cloud.md b/website/docs/docs/dbt-versions/upgrade-core-in-cloud.md index b567b3ebe57..586aa6ed21d 100644 --- a/website/docs/docs/dbt-versions/upgrade-core-in-cloud.md +++ b/website/docs/docs/dbt-versions/upgrade-core-in-cloud.md @@ -5,22 +5,29 @@ id: "upgrade-core-in-cloud" In dbt Cloud, both [jobs](/docs/deploy/jobs) and [environments](/docs/dbt-cloud-environments) are configured to use a specific version of dbt Core. The version can be upgraded at any time. +:::tip New in 2024! In dbt Cloud, simply "Keep on latest version" + +_Is it Core? Is it Cloud? From now on, it's just dbt._ + +As a dbt Cloud customer, you get early access to new functionality before it lands in final releases of dbt Core, without the hassle of managing your own version upgrades. + +::: + ## Environments -Navigate to the settings page of an environment, then click **Edit**. Click the **dbt version** dropdown bar and make your selection. You can select either the [Keep on latest version](#keep-on-latest-version) setting or an available version of Core to associate with this environment. Be sure to save your changes before navigating away. +Navigate to the settings page of an environment, then click **Edit**. Click the **dbt version** dropdown bar and make your selection. You can select a previous release of dbt Core, or (new!) ["Keep on latest version"](#keep-on-latest-version). Be sure to save your changes before navigating away. ### Keep on latest version -With the **Keep on latest version** setting, you allow dbt Labs to manage the environment's dbt version on your behalf. When enabled, you never need to manually upgrade the Core version to get the latest dbt features, fixes, and updates. dbt Labs handles that automatically for you. - -You can upgrade to **Keep on latest version** only after you successfully upgrade to 1.7. Use the [Override dbt version](#override-dbt-version) feature to test a dbt version on your user account before safely upgrading to it. +By choosing to **Keep on latest version**, you always get the latest fixes, and early access to new functionality for your dbt project. dbt Labs will handle upgrades behind-the-scenes, as part of testing and redeploying the dbt Cloud application—just like other capabilities of dbt Cloud, and the other SaaS tools you're using. +You can upgrade to **Keep on latest version** no matter which version of dbt you currently have selected. That said, we recommend testing the upgrade in development first. Use the personal [Override dbt version](#override-dbt-version) settuing to try _your_ project on **"latest"**, before upgrading your deployment environments and the default development environment for all your colleagues. -:::tip Join our beta +:::tip Interested? Let us know! -If you're interested in joining our beta, please contact us. We would love to hear what you think! +In February 2024, "Keep on latest version" will be available to select customers. Do you want early access to new features? Contact your account team. ::: From f8f3256a337832f2cb1b0a30f0c3b0bb2bc3642c Mon Sep 17 00:00:00 2001 From: Jeremy Cohen Date: Mon, 12 Feb 2024 18:58:49 +0100 Subject: [PATCH 052/121] Update version-related docs --- website/docs/reference/commands/version.md | 31 +++++++++++++++++++ website/docs/reference/dbt-commands.md | 1 + .../global-configs/version-compatibility.md | 14 +++++++-- website/sidebars.js | 1 + 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 website/docs/reference/commands/version.md diff --git a/website/docs/reference/commands/version.md b/website/docs/reference/commands/version.md new file mode 100644 index 00000000000..7f26352c635 --- /dev/null +++ b/website/docs/reference/commands/version.md @@ -0,0 +1,31 @@ +--- +title: "About dbt --version" +sidebar_label: "version" +id: "version" +--- + +The `--version` CLI option returns information about the currently installed version of dbt Core or the dbt Cloud CLI. + +This option is not supported when invoking dbt in other dbt Cloud runtimes (IDE or scheduled runs). + + + +```text +$ dbt --version +Core: + - installed: 1.7.6 + - latest: 1.7.6 - Up to date! +Plugins: + - snowflake: 1.7.1 - Up to date! +``` + + + + + +```text +$ dbt --version +dbt Cloud CLI - 0.35.7 (fae78a6f5f6f2d7dff3cab3305fe7f99bd2a36f3 2024-01-18T22:34:52Z) +``` + + diff --git a/website/docs/reference/dbt-commands.md b/website/docs/reference/dbt-commands.md index 2e534049dce..4c4c142ee0d 100644 --- a/website/docs/reference/dbt-commands.md +++ b/website/docs/reference/dbt-commands.md @@ -41,6 +41,7 @@ You can run dbt commands in your specific tool by prefixing them with `dbt`. Fo | [snapshot](/reference/commands/snapshot) | Executes "snapshot" jobs defined in a project | All | All [supported versions](/docs/dbt-versions/core) | | [source](/reference/commands/source) | Provides tools for working with source data (including validating that sources are "fresh") | All | All [supported versions](/docs/dbt-versions/core) | | [test](/reference/commands/test) | Executes tests defined in a project | All | All [supported versions](/docs/dbt-versions/core) | +| [--version](/reference/commands/version) | Displays the currently installed version of dbt CLI | dbt Core
dbt Cloud CLI | All [supported versions](/docs/dbt-versions/core) | diff --git a/website/docs/reference/global-configs/version-compatibility.md b/website/docs/reference/global-configs/version-compatibility.md index c7a1227adaf..37d2cb6c0ee 100644 --- a/website/docs/reference/global-configs/version-compatibility.md +++ b/website/docs/reference/global-configs/version-compatibility.md @@ -4,7 +4,17 @@ id: "version-compatibility" sidebar: "Version compatibility" --- -Projects are recommended to set [dbt version requirements](/reference/project-configs/require-dbt-version), especially if they use features that are newer, or which may break in future versions of dbt Core. By default, if you run a project with an incompatible dbt version, dbt will raise an error. +In the first several years of dbt Core's development, breaking changes were more common. For this reason, we encouraged users to set [dbt version requirements](/reference/project-configs/require-dbt-version) for their projects or packages — especially if they use features that are newer, or which might break in future versions of dbt Core. + +In December 2021, we released dbt Core v1.0, which promised stability for the code in dbt projects and packages, and backwards compatibility in all new versions of dbt-core. + +Starting in 2024, if you select **Keep on latest version** , dbt Cloud will ignore version checking. Instead of using this configuration, we recommend: +- **Writing defensive code.** If you developing dbt code that may be run in a variety of execution contexts (such as a package), and you depend on newer dbt functionality, you can add conditional logic that checks for the presence of other packages or macros. +- **Pinning packages.** If you are maintaining a dbt project that installs third-party packages, and you are concerned about the potential for breaking changes in those packages, you should pin the package to a specific revision or `version` boundary. Since v1.7, this is also the default dbt behavior, by "locking" the version/revision of Hub/git packages in development in order to guarantee predictable builds in production. + +### Legacy behavior + +In older versions of dbt-core, if you run a project with an incompatible dbt version, dbt will raise an error. You can use the `VERSION_CHECK` config to disable this check and suppress the error message: @@ -12,4 +22,4 @@ You can use the `VERSION_CHECK` config to disable this check and suppress the er dbt --no-version-check run Running with dbt=1.0.0 Found 13 models, 2 tests, 1 archives, 0 analyses, 204 macros, 2 operations.... -``` \ No newline at end of file +``` diff --git a/website/sidebars.js b/website/sidebars.js index 60606cc8dd4..8a13295c12d 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -902,6 +902,7 @@ const sidebarSettings = { "reference/commands/snapshot", "reference/commands/source", "reference/commands/test", + "reference/commands/version", ], }, { From eb780ecacf291dc0d7189dc06a5d157eae700338 Mon Sep 17 00:00:00 2001 From: Jeremy Cohen Date: Mon, 12 Feb 2024 18:59:08 +0100 Subject: [PATCH 053/121] Update docs on deps + package-lock --- website/docs/reference/commands/deps.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/website/docs/reference/commands/deps.md b/website/docs/reference/commands/deps.md index 900e4ae0041..c707a5eafeb 100644 --- a/website/docs/reference/commands/deps.md +++ b/website/docs/reference/commands/deps.md @@ -60,26 +60,31 @@ Update your versions in packages.yml, then run dbt deps -dbt generates the `package-lock.yml` file in the _project_root_ where `packages.yml` is recorded, which contains all the resolved packages, the first time you run `dbt deps`. Each subsequent run records the packages installed in this file. If the subsequent `dbt deps` runs contain no updated packages in `dependencies.yml` or `packages.yml`, dbt-core installs from `package-lock.yml`. +### "Locking" packages for predictable installs -When you update the package spec and run `dbt deps` again, the `package-lock.yml` and `packages.yml` files update accordingly. +Starting in dbt Core v1.7, dbt generates an additional `package-lock.yml` file, in the root of your project. This contains the full set of resolved packages, based on the `packages` configuration (in `dependencies.yml` or `packages.yml`). Each subsequent invocation of `dbt deps` will install from the "locked" set of packages specified in this file. This ensures predictable installs in production, and ensures consistency across all developers and environments, by storing the full set of required packages (with pinned versions) in version-controlled code. -There are two flags related to `package-lock.yml`: -- `dbt deps --lock` — creates or updates the `package-lock.yml` file but does not install the packages. -- `dbt deps --upgrade` — creates or updates the `package-lock.yml` file with the most recent dependencies from `packages.yml`. Also install the packages unless the `--lock` flag is also passed. +The `package-lock.yml` file includes a `sha1_hash` of the `packages` config. This enables dbt to detect if the `packages` config has updated, and to rerun dependency resolution. If you want to only check for changes to the `packages` config, and update the lock file accordingly, without actually installing those packages, you can provide the `--lock` option: `dbt deps --lock`. -Examples of the `--add-package` flag: +It is also possible to force package resolution to rerun, even if the `packages` config has not changed, by running `dbt deps --upgrade`. For example, this enables you to always get the latest commits from the `main` branch of an internally maintained `git` package, while accepting the risk of unpredictable builds. An alternative to always running `dbt deps --upgrade` in production is to "ignore" the lock file, by adding `package-lock.yml` to your project's `.gitignore` file. If you pursue either approach, we strongly recommend adding version pins for third-party packages within your `packages` config. + +### Adding specific packages + +Have trouble remembering the exact syntax for package configurations? `dbt deps` is also capable of adding or updating an existing package configuration. It's easiest for Hub packages (default): ```shell -# add package from hub (--source arg defaults to "hub") dbt deps --add-package dbt-labs/dbt_utils@1.0.0 -# add package from hub with semantic version range +# with semantic version range dbt deps --add-package dbt-labs/snowplow@">=0.7.0,<0.8.0" +``` +The command also supports git and local packages, via the `--source` option: +```shell # add package from git dbt deps --add-package https://github.com/fivetran/dbt_amplitude@v0.3.0 --source git # add package from local dbt deps --add-package /opt/dbt/redshift --source local ``` + From 2abce3bd3c9d95bb5bd2d7564c608476e8cf3a74 Mon Sep 17 00:00:00 2001 From: Jeremy Cohen Date: Mon, 12 Feb 2024 20:57:12 +0100 Subject: [PATCH 054/121] Try using a snippet --- .../reference/global-configs/version-compatibility.md | 8 +------- .../docs/reference/project-configs/require-dbt-version.md | 3 +++ website/snippets/_config-dbt-version-check.md | 7 +++++++ 3 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 website/snippets/_config-dbt-version-check.md diff --git a/website/docs/reference/global-configs/version-compatibility.md b/website/docs/reference/global-configs/version-compatibility.md index 37d2cb6c0ee..4de6fe48834 100644 --- a/website/docs/reference/global-configs/version-compatibility.md +++ b/website/docs/reference/global-configs/version-compatibility.md @@ -4,13 +4,7 @@ id: "version-compatibility" sidebar: "Version compatibility" --- -In the first several years of dbt Core's development, breaking changes were more common. For this reason, we encouraged users to set [dbt version requirements](/reference/project-configs/require-dbt-version) for their projects or packages — especially if they use features that are newer, or which might break in future versions of dbt Core. - -In December 2021, we released dbt Core v1.0, which promised stability for the code in dbt projects and packages, and backwards compatibility in all new versions of dbt-core. - -Starting in 2024, if you select **Keep on latest version** , dbt Cloud will ignore version checking. Instead of using this configuration, we recommend: -- **Writing defensive code.** If you developing dbt code that may be run in a variety of execution contexts (such as a package), and you depend on newer dbt functionality, you can add conditional logic that checks for the presence of other packages or macros. -- **Pinning packages.** If you are maintaining a dbt project that installs third-party packages, and you are concerned about the potential for breaking changes in those packages, you should pin the package to a specific revision or `version` boundary. Since v1.7, this is also the default dbt behavior, by "locking" the version/revision of Hub/git packages in development in order to guarantee predictable builds in production. + ### Legacy behavior diff --git a/website/docs/reference/project-configs/require-dbt-version.md b/website/docs/reference/project-configs/require-dbt-version.md index 6b17bb46120..96a6bc89330 100644 --- a/website/docs/reference/project-configs/require-dbt-version.md +++ b/website/docs/reference/project-configs/require-dbt-version.md @@ -3,6 +3,9 @@ datatype: version-range | [version-range] description: "Read this guide to understand the require-dbt-version configuration in dbt." default_value: None --- + + + ```yml diff --git a/website/snippets/_config-dbt-version-check.md b/website/snippets/_config-dbt-version-check.md new file mode 100644 index 00000000000..9977577f15e --- /dev/null +++ b/website/snippets/_config-dbt-version-check.md @@ -0,0 +1,7 @@ +In the first several years of dbt Core's development, breaking changes were more common. For this reason, we encouraged users to set [dbt version requirements](/reference/project-configs/require-dbt-version) for their projects or packages — especially if they use features that are newer, or which might break in future versions of dbt Core. + +In December 2021, we released dbt Core v1.0, which promised stability for the code in dbt projects and packages, and backwards compatibility in all new versions of dbt-core. + +Starting in 2024, if you select **Keep on latest version** , dbt Cloud will ignore version checking. Instead of using this configuration, we recommend: +- **Writing defensive code.** If you developing dbt code that may be run in a variety of execution contexts (such as a package), and you depend on newer dbt functionality, you can add conditional logic that checks for the presence of other packages or macros. +- **Pinning packages.** If you are maintaining a dbt project that installs third-party packages, and you are concerned about the potential for breaking changes in those packages, you should pin the package to a specific revision or `version` boundary. Since v1.7, this is also the default dbt behavior, by "locking" the version/revision of Hub/git packages in development in order to guarantee predictable builds in production. From e44c35fb9f83dab4608f5b16d4ce1aaf585dc4da Mon Sep 17 00:00:00 2001 From: Ly Nguyen Date: Mon, 12 Feb 2024 23:12:52 -0800 Subject: [PATCH 055/121] Feedback --- .../2021-11-23-how-to-upgrade-dbt-versions.md | 8 ++++---- .../core-upgrade/01-upgrading-to-v1.8.md | 8 ++++---- website/docs/docs/dbt-versions/core-versions.md | 6 +++--- .../docs/dbt-versions/upgrade-core-in-cloud.md | 16 ++++------------ website/docs/reference/commands/deps.md | 17 ++++++++++------- website/docs/reference/commands/version.md | 4 ++-- 6 files changed, 27 insertions(+), 32 deletions(-) diff --git a/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md b/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md index 38c7dfddbef..517fbcf6b85 100644 --- a/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md +++ b/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md @@ -12,13 +12,13 @@ date: 2021-11-29 is_featured: true --- -:::tip **February 2024 Update!** +:::tip February 2024 Update -It's been a few years since dbt-core turned 1.0! Since then, we've committed to zero breaking changes whenever possible, and it's become much easier to upgrade dbt-core versions. +It's been a few years since dbt-core turned 1.0! Since then, we've committed to releasing zero breaking changes whenever possible and it's become much easier to upgrade dbt Core versions. -Now, we're taking it one step further, by introducing **Keep on latest version** in dbt Cloud (currently available to select customers). No more manual upgrades, and no more need for a "a second sandbox project." For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). +Now, we're taking it one step further by introducing **Keep on latest version** in dbt Cloud (currently available to select customers). No more manual upgrades and no more need for "a second sandbox project." For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). -We're leaving the rest of this post as-is, so we can all remember how it used to be. Enjoy a stroll down memory lane. +We're leaving the rest of this post as is, so we can all remember how it used to be. Enjoy a stroll down memory lane. ::: diff --git a/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md b/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md index 5851cbbf1af..e5604bf9e88 100644 --- a/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md +++ b/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md @@ -12,13 +12,13 @@ displayed_sidebar: "docs" - [Cloud upgrade guide](/docs/dbt-versions/upgrade-core-in-cloud) - Release schedule (coming soon) -:::tip In dbt Cloud, simply "Keep on latest version" +:::tip Keep on latest version, always -_Is it Core? Is it Cloud? From now on, it's just dbt._ +_Is it dbt Core? Is it dbt Cloud? From now on, it's just dbt._ -Starting this year, let dbt Labs handle version upgrades for you. As a dbt Cloud customer, you get early access to new functionality before it lands in the final release of dbt Core v1.8, and without the hassle of managing your own version upgrades. For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). +Starting this year, let dbt Labs handle version upgrades for you. With dbt Cloud, you can get early access to new functionality before it lands in the final release of dbt Core v1.8 and without the need of managing your own version upgrades. For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). -"Keep on latest version" is currently available in beta for select dbt Cloud customers. The first beta release of dbt-core v1.8 is planned for February 28. +The **Keep on latest version** setting is currently available in beta for select dbt Cloud customers. The first beta release of dbt-core v1.8 is planned for February 28. ::: diff --git a/website/docs/docs/dbt-versions/core-versions.md b/website/docs/docs/dbt-versions/core-versions.md index 23bf6ab7020..e4ed594d29f 100644 --- a/website/docs/docs/dbt-versions/core-versions.md +++ b/website/docs/docs/dbt-versions/core-versions.md @@ -8,11 +8,11 @@ pagination_prev: null dbt Core releases follow [semantic versioning](https://semver.org/) guidelines. For more on how we use semantic versions, see [How dbt Core uses semantic versioning](#how-dbt-core-uses-semantic-versioning). -:::tip In dbt Cloud, simply "keep on latest version" +:::tip Keep on latest version, always -_Is it Core? Is it Cloud? From now on, it's just dbt._ +_Did you know that you can always be working on the latest version?_ -As a dbt Cloud customer, you get early access to new functionality before it lands in final releases of dbt Core, without the hassle of managing your own version upgrades. For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). +With dbt Cloud, you can get early access to new functionality before it becomes available in dbt Core and without the need of managing your own version upgrades. Refer to the [Keep on latest version](/docs/dbt-versions/upgrade-core-in-cloud#keep-on-latest-version) setting for details. ::: diff --git a/website/docs/docs/dbt-versions/upgrade-core-in-cloud.md b/website/docs/docs/dbt-versions/upgrade-core-in-cloud.md index 586aa6ed21d..58b703c6fc2 100644 --- a/website/docs/docs/dbt-versions/upgrade-core-in-cloud.md +++ b/website/docs/docs/dbt-versions/upgrade-core-in-cloud.md @@ -5,29 +5,21 @@ id: "upgrade-core-in-cloud" In dbt Cloud, both [jobs](/docs/deploy/jobs) and [environments](/docs/dbt-cloud-environments) are configured to use a specific version of dbt Core. The version can be upgraded at any time. -:::tip New in 2024! In dbt Cloud, simply "Keep on latest version" - -_Is it Core? Is it Cloud? From now on, it's just dbt._ - -As a dbt Cloud customer, you get early access to new functionality before it lands in final releases of dbt Core, without the hassle of managing your own version upgrades. - -::: - ## Environments -Navigate to the settings page of an environment, then click **Edit**. Click the **dbt version** dropdown bar and make your selection. You can select a previous release of dbt Core, or (new!) ["Keep on latest version"](#keep-on-latest-version). Be sure to save your changes before navigating away. +Navigate to the settings page of an environment, then click **Edit**. Click the **dbt version** dropdown bar and make your selection. You can select a previous release of dbt Core or [Keep on latest version](#keep-on-latest-version). Be sure to save your changes before navigating away. ### Keep on latest version -By choosing to **Keep on latest version**, you always get the latest fixes, and early access to new functionality for your dbt project. dbt Labs will handle upgrades behind-the-scenes, as part of testing and redeploying the dbt Cloud application—just like other capabilities of dbt Cloud, and the other SaaS tools you're using. +By choosing to **Keep on latest version**, you always get the latest fixes and early access to new functionality for your dbt project. dbt Labs will handle upgrades for you, as part of testing and redeploying the dbt Cloud SaaS application. -You can upgrade to **Keep on latest version** no matter which version of dbt you currently have selected. That said, we recommend testing the upgrade in development first. Use the personal [Override dbt version](#override-dbt-version) settuing to try _your_ project on **"latest"**, before upgrading your deployment environments and the default development environment for all your colleagues. +You can upgrade to **Keep on latest version** no matter which version of dbt you currently have selected. As a best practice, dbt Labs recommends that you test the upgrade in development first; use the [Override dbt version](#override-dbt-version) setting to test _your_ project on the latest dbt version before upgrading your deployment environments and the default development environment for all your colleagues. :::tip Interested? Let us know! -In February 2024, "Keep on latest version" will be available to select customers. Do you want early access to new features? Contact your account team. +Currently, this feature is available as a beta to select customers. Are you interested? Please contact your account team to join! ::: diff --git a/website/docs/reference/commands/deps.md b/website/docs/reference/commands/deps.md index c707a5eafeb..d9f823dd76e 100644 --- a/website/docs/reference/commands/deps.md +++ b/website/docs/reference/commands/deps.md @@ -60,17 +60,20 @@ Update your versions in packages.yml, then run dbt deps -### "Locking" packages for predictable installs +## Predictable package installs -Starting in dbt Core v1.7, dbt generates an additional `package-lock.yml` file, in the root of your project. This contains the full set of resolved packages, based on the `packages` configuration (in `dependencies.yml` or `packages.yml`). Each subsequent invocation of `dbt deps` will install from the "locked" set of packages specified in this file. This ensures predictable installs in production, and ensures consistency across all developers and environments, by storing the full set of required packages (with pinned versions) in version-controlled code. +Starting in dbt Core v1.7, dbt generates an additional `package-lock.yml` file in the root of your project. This contains the full set of resolved packages, based on the `packages` configuration (in `dependencies.yml` or `packages.yml`). Each subsequent invocation of `dbt deps` will install from the _locked_ set of packages specified in this file. By storing the full set of required packages (with pinned versions) in version-controlled code, it ensures predictable installs in production and consistency across all developers and environments. -The `package-lock.yml` file includes a `sha1_hash` of the `packages` config. This enables dbt to detect if the `packages` config has updated, and to rerun dependency resolution. If you want to only check for changes to the `packages` config, and update the lock file accordingly, without actually installing those packages, you can provide the `--lock` option: `dbt deps --lock`. +The `package-lock.yml` file includes a `sha1_hash` of the `packages` config. This enables dbt to detect if the `packages` config has updated, and to rerun dependency resolution. If you want to only check for changes to the `packages` config and update the lock file accordingly (without actually installing those packages), you can provide the `--lock` option (that is, `dbt deps --lock`). -It is also possible to force package resolution to rerun, even if the `packages` config has not changed, by running `dbt deps --upgrade`. For example, this enables you to always get the latest commits from the `main` branch of an internally maintained `git` package, while accepting the risk of unpredictable builds. An alternative to always running `dbt deps --upgrade` in production is to "ignore" the lock file, by adding `package-lock.yml` to your project's `.gitignore` file. If you pursue either approach, we strongly recommend adding version pins for third-party packages within your `packages` config. +It's also possible to force package resolution to rerun, even if the `packages` config hasn't changed, by running `dbt deps --upgrade`. For example, this enables you to always get the latest commits from the `main` branch of an internally maintained `git` package while accepting the risk of unpredictable builds. An alternative to always running `dbt deps --upgrade` in production is to "ignore" the lock file by adding `package-lock.yml` to your project's `.gitignore` file. If you pursue either approach, we strongly recommend adding version pins for third-party packages within your `packages` config. -### Adding specific packages +## Add specific packages + +You can use the `dbt deps` command to add or update an existing package configuration — no need to remember the exact syntax for package configurations. + +For Hub packages (default), which are the easiest to install: -Have trouble remembering the exact syntax for package configurations? `dbt deps` is also capable of adding or updating an existing package configuration. It's easiest for Hub packages (default): ```shell dbt deps --add-package dbt-labs/dbt_utils@1.0.0 @@ -78,7 +81,7 @@ dbt deps --add-package dbt-labs/dbt_utils@1.0.0 dbt deps --add-package dbt-labs/snowplow@">=0.7.0,<0.8.0" ``` -The command also supports git and local packages, via the `--source` option: +For Git or local packages, use the `--source` option: ```shell # add package from git dbt deps --add-package https://github.com/fivetran/dbt_amplitude@v0.3.0 --source git diff --git a/website/docs/reference/commands/version.md b/website/docs/reference/commands/version.md index 7f26352c635..79923d5e90f 100644 --- a/website/docs/reference/commands/version.md +++ b/website/docs/reference/commands/version.md @@ -4,9 +4,9 @@ sidebar_label: "version" id: "version" --- -The `--version` CLI option returns information about the currently installed version of dbt Core or the dbt Cloud CLI. +The `--version` command-line option returns information about the currently installed version of dbt Core or the dbt Cloud CLI. -This option is not supported when invoking dbt in other dbt Cloud runtimes (IDE or scheduled runs). +This option is not supported when invoking dbt in other dbt Cloud runtimes (like, the IDE or scheduled runs). From 6a5814b2eb3b1ae96e050bb735303039337d57f6 Mon Sep 17 00:00:00 2001 From: Ly Nguyen <107218380+nghi-ly@users.noreply.github.com> Date: Tue, 13 Feb 2024 09:25:21 -0800 Subject: [PATCH 056/121] Update website/docs/reference/commands/deps.md --- website/docs/reference/commands/deps.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/commands/deps.md b/website/docs/reference/commands/deps.md index d9f823dd76e..edafd62da40 100644 --- a/website/docs/reference/commands/deps.md +++ b/website/docs/reference/commands/deps.md @@ -81,7 +81,7 @@ dbt deps --add-package dbt-labs/dbt_utils@1.0.0 dbt deps --add-package dbt-labs/snowplow@">=0.7.0,<0.8.0" ``` -For Git or local packages, use the `--source` option: +For other package types, use the `--source` option: ```shell # add package from git dbt deps --add-package https://github.com/fivetran/dbt_amplitude@v0.3.0 --source git From 3a78316fc466c44e629383fdc53f9c3a4d903b20 Mon Sep 17 00:00:00 2001 From: Ly Nguyen Date: Tue, 13 Feb 2024 11:51:19 -0800 Subject: [PATCH 057/121] Reviewed snippet --- .../reference/global-configs/version-compatibility.md | 11 ++++++----- .../reference/project-configs/require-dbt-version.md | 8 +++++++- website/snippets/_config-dbt-version-check.md | 9 ++++----- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/website/docs/reference/global-configs/version-compatibility.md b/website/docs/reference/global-configs/version-compatibility.md index 4de6fe48834..697717deb32 100644 --- a/website/docs/reference/global-configs/version-compatibility.md +++ b/website/docs/reference/global-configs/version-compatibility.md @@ -4,11 +4,7 @@ id: "version-compatibility" sidebar: "Version compatibility" --- - - -### Legacy behavior - -In older versions of dbt-core, if you run a project with an incompatible dbt version, dbt will raise an error. +Projects are recommended to set [dbt version requirements](/reference/project-configs/require-dbt-version), especially if they use features that are newer, or which may break in future versions of dbt Core. By default, if you run a project with an incompatible dbt version, dbt will raise an error. You can use the `VERSION_CHECK` config to disable this check and suppress the error message: @@ -17,3 +13,8 @@ dbt --no-version-check run Running with dbt=1.0.0 Found 13 models, 2 tests, 1 archives, 0 analyses, 204 macros, 2 operations.... ``` + +:::info Keep with latest version + + +::: diff --git a/website/docs/reference/project-configs/require-dbt-version.md b/website/docs/reference/project-configs/require-dbt-version.md index 96a6bc89330..dd020412b8e 100644 --- a/website/docs/reference/project-configs/require-dbt-version.md +++ b/website/docs/reference/project-configs/require-dbt-version.md @@ -4,7 +4,7 @@ description: "Read this guide to understand the require-dbt-version configuratio default_value: None --- - + @@ -22,6 +22,12 @@ When you set this configuration, dbt sends a helpful error message for any user If this configuration is not specified, no version check will occur. +:::info Keep on latest version + + + +::: + ### YAML quoting This configuration needs to be interpolated by the YAML parser as a string. As such, you should quote the value of the configuration, taking care to avoid whitespace. For example: diff --git a/website/snippets/_config-dbt-version-check.md b/website/snippets/_config-dbt-version-check.md index 9977577f15e..cff9d9c7bf7 100644 --- a/website/snippets/_config-dbt-version-check.md +++ b/website/snippets/_config-dbt-version-check.md @@ -1,7 +1,6 @@ -In the first several years of dbt Core's development, breaking changes were more common. For this reason, we encouraged users to set [dbt version requirements](/reference/project-configs/require-dbt-version) for their projects or packages — especially if they use features that are newer, or which might break in future versions of dbt Core. -In December 2021, we released dbt Core v1.0, which promised stability for the code in dbt projects and packages, and backwards compatibility in all new versions of dbt-core. +Starting in 2024, when you select **Keep on latest version** in dbt Cloud, it will ignore version checking. However, if you're not using this configuration, dbt Labs recommends: +- **Writing defensive code** — If you're developing dbt code that could be run in a variety of execution contexts (such as a package) and you depend on newer dbt functionality, you can add conditional logic that checks for the presence of other packages or macros. +- **Pinning packages** — If you're maintaining a dbt project that installs third-party packages and are concerned about the potential for breaking changes in those packages, you should pin the package to a specific revision or `version` boundary. Since v1.7, this is the default dbt behavior, by _locking_ the version/revision of packages in development in order to guarantee predictable builds in production. -Starting in 2024, if you select **Keep on latest version** , dbt Cloud will ignore version checking. Instead of using this configuration, we recommend: -- **Writing defensive code.** If you developing dbt code that may be run in a variety of execution contexts (such as a package), and you depend on newer dbt functionality, you can add conditional logic that checks for the presence of other packages or macros. -- **Pinning packages.** If you are maintaining a dbt project that installs third-party packages, and you are concerned about the potential for breaking changes in those packages, you should pin the package to a specific revision or `version` boundary. Since v1.7, this is also the default dbt behavior, by "locking" the version/revision of Hub/git packages in development in order to guarantee predictable builds in production. +To learn more, refer to [Keep on latest version](/docs/dbt-versions/upgrade-core-in-cloud##keep-on-latest-version) which is available as a beta. \ No newline at end of file From 5c50489b4391e66746fadda8cd47d5bc32175cf1 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 15:39:27 -0500 Subject: [PATCH 058/121] Update website/docs/docs/build/unit-tests.md --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 2ac12d4763d..31495c2b023 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -15,7 +15,7 @@ It is available now as an alpha feature for dbt Core v1.8 users. ::: -Historically, the test coverage capabilities of dbt were limited to “data” tests ‐ testing the quality of input data or the shape of the resulting datasets — that could only be executed *after* a model had been built. +Historically, the test coverage capabilities of dbt were limited to [“data” tests](/docs/build/data-tests) ‐ testing the quality of input data or the shape of the resulting datasets — that could only be executed _after_ a model had been built. Now, we are introducing a new type of test to dbt - unit tests. In software programming, unit tests validate small portions of your functional code, and they work much the same way here. Unit tests allow you to validate your SQL modeling logic on a small set of static inputs _before_ you materialize your full model in production. Unit tests enable test-driven development, benefiting developer efficiency and code reliability. From 92b55c0626b2f97aa115f0118a61f6c172dadedb Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 15:47:11 -0500 Subject: [PATCH 059/121] Update website/docs/reference/resource-properties/unit-tests.md Co-authored-by: Grace Goheen <53586774+graciegoheen@users.noreply.github.com> --- website/docs/reference/resource-properties/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 3cf0858e4b4..34b9b17f58b 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -133,7 +133,7 @@ unit_tests: ... ``` - ```yaml + ```csv # tests/fixtures/my_model_a_fixture.csv 1,gerda 2,michelle From 810180dd44315674ddf87e51b96a7045aaed4a56 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 15:50:11 -0500 Subject: [PATCH 060/121] Update website/docs/docs/build/unit-tests.md --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 31495c2b023..b981930bf1d 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -97,7 +97,7 @@ unit_tests: ``` -The above example defines the mock data using the inline `dict` format, but there are a handful of different options for how you format your mock data. +The above example defines the mock data using the inline `dict` format, but you can also use `csv` either inline or in a separate fixture file. Notice that you only have to define the mock data for the columns you care about. This enables you to write succinct and _specific_ unit tests. From 225f48f03108027bbd875d4227fd8f573e011380 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 15:51:46 -0500 Subject: [PATCH 061/121] Update website/docs/reference/resource-properties/unit-tests.md Co-authored-by: Grace Goheen <53586774+graciegoheen@users.noreply.github.com> --- website/docs/reference/resource-properties/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 34b9b17f58b..852af27e219 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -145,7 +145,7 @@ unit_tests: - `input:` is optional for seeds: - If you don’t supply an input for a seed, we will use the seed *as* the input. - If you do supply an input for a seed, we will use that input instead. -- You can also have “empty” inputs, by setting rows to an empty list `rows: []`: +- You can also have “empty” inputs, by setting rows to an empty list `rows: []` Examples: ```yml From ea79e05b09ada8dffb613880bfa1c77d8fe514b2 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 15:52:55 -0500 Subject: [PATCH 062/121] Update unit-tests.md Fixing spacing --- website/docs/reference/resource-properties/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 852af27e219..b404f7f1e01 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -96,7 +96,7 @@ unit_tests: given: - input: ref('my_model_a') format: dict - rows: + rows: - {id: 1, name: gerda} - {id: 2, b: michelle} From fc0ba3a22337fc84b0de764c98aeabdbdbd386e2 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 15:54:00 -0500 Subject: [PATCH 063/121] Update unit-tests.md Fixing spacing --- website/docs/reference/resource-properties/unit-tests.md | 1 + 1 file changed, 1 insertion(+) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index b404f7f1e01..00e74254eee 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -119,6 +119,7 @@ unit_tests: ... ``` + - The name of a csv file in the `tests/fixtures` directory in your project (or the directory configured for [test-paths](https://docs.getdbt.com/reference/project-configs/test-paths)) for `fixture`: From fb455284ab80f90d7fd12445d3666af1172553cf Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 15:55:07 -0500 Subject: [PATCH 064/121] Update unit-tests.md Spacing --- website/docs/reference/resource-properties/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 00e74254eee..b24506e6ce6 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -112,7 +112,7 @@ unit_tests: given: - input: ref('my_model_a') format: csv - rows: | + rows: | id,name 1,gerda 2,michelle From 2edec426fc3683941362f59ed7af720a11cdbaef Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 16:13:27 -0500 Subject: [PATCH 065/121] Update website/sidebars.js --- website/sidebars.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/sidebars.js b/website/sidebars.js index a453afe62a5..9c67619bf90 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -280,7 +280,7 @@ const sidebarSettings = { { type: "category", label: "Tests", - link: { type: "doc", id: "docs/build/models" }, + link: { type: "doc", id: "docs/build/data-tests" }, items: [ "docs/build/data-tests", "docs/build/unit-tests", From 158ea89c6bd036f320ddf7df812fa446902c2604 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 16:38:16 -0500 Subject: [PATCH 066/121] Update unit-tests.md --- website/docs/reference/resource-properties/unit-tests.md | 1 + 1 file changed, 1 insertion(+) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index b24506e6ce6..aa65fc1f8ac 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -60,6 +60,7 @@ Unit tests are currently limited to testing SQL models and only models in your c - If your model has multiple versions, be default the unit test will run on *all* versions of your model. To specify version(s) of your model to unit test, `include` or `exclude` the desired versions in your model versions config: ```yaml + # my test_is_valid_email_address unit test will run on all versions of my_model unit-tests: - name: test_is_valid_email_address From 86c577a331ff71d1b84c4d5abc60fb75df752159 Mon Sep 17 00:00:00 2001 From: Ly Nguyen Date: Tue, 13 Feb 2024 13:46:59 -0800 Subject: [PATCH 067/121] Feedback --- .../docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md b/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md index e5604bf9e88..dfa534130fa 100644 --- a/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md +++ b/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md @@ -14,8 +14,6 @@ displayed_sidebar: "docs" :::tip Keep on latest version, always -_Is it dbt Core? Is it dbt Cloud? From now on, it's just dbt._ - Starting this year, let dbt Labs handle version upgrades for you. With dbt Cloud, you can get early access to new functionality before it lands in the final release of dbt Core v1.8 and without the need of managing your own version upgrades. For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). The **Keep on latest version** setting is currently available in beta for select dbt Cloud customers. The first beta release of dbt-core v1.8 is planned for February 28. From 8b4b31b498f0528d66816b8cd3946b84c1be3686 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 16:50:14 -0500 Subject: [PATCH 068/121] Update unit-tests.md Spacing fix --- website/docs/reference/resource-properties/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index aa65fc1f8ac..3aa5295e8dd 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -59,7 +59,7 @@ unit_tests: Unit tests are currently limited to testing SQL models and only models in your current project. When writing your unit tests, keep the following in mind: - If your model has multiple versions, be default the unit test will run on *all* versions of your model. To specify version(s) of your model to unit test, `include` or `exclude` the desired versions in your model versions config: - ```yaml +```yaml # my test_is_valid_email_address unit test will run on all versions of my_model unit-tests: From bd583cfd53704e345840279094bdf601dc594efd Mon Sep 17 00:00:00 2001 From: Ly Nguyen Date: Tue, 13 Feb 2024 14:27:23 -0800 Subject: [PATCH 069/121] Update screenshot --- .../example-environment-settings.png | Bin 70852 -> 78407 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/website/static/img/docs/dbt-cloud/cloud-configuring-dbt-cloud/choosing-dbt-version/example-environment-settings.png b/website/static/img/docs/dbt-cloud/cloud-configuring-dbt-cloud/choosing-dbt-version/example-environment-settings.png index 89e3dfba17559e094ff9a02096b455a7601c11fd..307110711014461fec48e71de5ffb288cc91b0ea 100644 GIT binary patch literal 78407 zcmeFZbyQrzvM!DV4S_&H65L&a2X}W#aM!^m*x*hAB)Ge~26qYWPLRRf-3NJ-bMHOp z+;`#q`CIF^-pg78J9}4mPgmFey6UTHf)wQ?&{1(wVPIg;r6fg_VPFu^VPN3wkP)GG zuByG^U|?Pf0z^akItJ4i(@fv6|X8@qi;mjF`p^%WqJ2cRS9O`yMnLDrrczAb} z#`?%*e>m9e1fwYM`|VGAMRXWDv75+veJ^okJ5;|(bVWfJRefZ0ZQa!Pw{PFR(*I!f zsJplT6Ik55OFVIF_UOfs=q^Nv0Yi?u%H~PP^lsG;X8AL3IXMwbW-w=3B2%n^x=#%P zBJzpwhhfEK+7I$7%guI4b?-SkOJMTzZR;an!kEXAj8HF|2%>8eb;^^rC?a@s!yBf} z&-b|ps*u$9a2N)f+zwU|Ij}tBCU9i;ZJ53^=+a&nqY#Xz8eWlq6qq<^m9YtR7!7z^ zY>^Nd{(d&uV9~}z;Z>9Yd!U;b;B^G1rO=&FZyZ=8SeYe<H``3GsLZ**8OknNTZ#-JWaI&Nd?sD!sx(&W0tQX zIU=}7t@zompuxetweM+ok$J72GmK>0;uUO2FaLT=l;*&eRY?96so+s6;aum)~G5vC@Ua|Bq%aPODI zFt4OdzlvryNg$M!r(@osM8K@0hn&S-p$fvTx4tU>Q3Nj;cZJg{VeFTOx#jyY9R4Wh zR4J1Lh_Z}g?EiQ?{4EA)ZOG^IpU0ycp-Y|)U)j3Ih*z%0`52m5@IkPhn1+~RIGk-B zUzvFEb?@~ZyA$eqmU&yi*r{0D$YIFSC@KEnD1WiYv`l<7?hMaxmUjSwO}JX$#L_x} zL-eT(meQYiFi7(+ZVgsiMl0!zXZ!0+Gz{*t?`uEY9kWG)jHy_p3B@nTz<0cnrV{o9 z$`Kp4J$KZGa(MlmZuwhgkNZRwBLUVkBe65W`!FCJo}iSTPn6^9m_H(MeB~c*LwAN1z(f`nA`gV`(j!Nlr21Pf?OeDD~Ud;wi5<|i%*U9Y&cLZ(7Fd_)o z*-ufr6xmhr*o8|*BdD=WG7QY|xnYL{^U}YWGdCdU_cYWO)3d&>}^?a#c z7|&?>gG*mFI7G~lMxC4Tx2aK%`in0iQwBrFTzXyH<+}T1@|`=M;GMkbJ|TqlxLm(+ z=V*Da7jV?Jck<B<+B@xCZ2-K+#Ob zvBd3HSB5OiKR@}^#n+|Q1vvZ82)WDdQ$SSZk z7SdAE4$}(J($JE|kj9|Kq|o-Lmge)S+{peR){5loi!kPQ;dY^Mp{q}D51JQykR8ib zS81ZLji&GC?Z=fS*kIcr+z2TwEKDd2u&63jbS&M)ooX)JQY9+%RGm<+R52xVzum%K$m}-b8l%&p*C47H)rjYaM|I1Ec*-?wQV&TEX%BTJ^01Fsf-EDdimTwN zuQj_gwW{O+e7Qyr_S{LsStEJCoU~jg0CsgrHP@WRoXK2cHMkn$Q01WQfaQ?8qq>Vf zwKLh}P~yPVz||n*c(u1Ude1g!{@yZPeJY8=0$77!F`57q&!7DF27`|J7zZdTo z|1EBqRV|(u>>A=2avxk7tcFX(ddQrSbRCZ@_azaZ(`9(n;MaSuVD{iI;%NmLfWU%D zhe|->jv1?ErE?`|C7x-Zt?+jtSaT%NNXJ~q(qrVi#hN8+SMJDlj?`7|C?@Pgww(B-W9}M3?Ulv~rzgu4&KQn|hWDZ}b@Teax%J zpV*UI6t6}#GD-|A49X4m+6ljbzsa;G^<)}}^pw7LV`^s+elv!NLdq3EM|vcoAt4vU zjV~7*`lB@16PK0N)O2uG-E}{ECZ+sn^=>V;dm*GYD6YGfJfA99Az#Wl?R~g<>P!L~ z3*gImm$9F*ft?X54F!pbmh@v?n{83IV~7)h9?L^F!XC;5WpbMNM`p9tF{$0Cx~Ny# zSjyNcPPv{d;&w&#_kiT8!YY2kq}s$Q-=iMAzN6R9X#Fon#+xSwCK_3rSicyb8{e9K zF}_5dZFg)}(;(5nt6VgbFa?ef_DT)TMioUSC4$Mvu}pqyQsF72a@31hF)_Y&l0QkV zu#iq8m#tvH=t~NpjxR&^S_fxyjO%4%pt+;cqVdbh#k=Y!ZnBM4)$D*K-pP4=d9Qj6 ze(8<~6d#bCNH{a)Pwq;rcHv;*u?7v`pK*2BH*6w~EHH<$Fu5%riOGv?hyk~#hJlP6 zw5eKm*Kx~w7Bc1(k&#JgO*mHCflO~0t@PMj$L7SAq;GQG^(Xh!_P5Y)GPE4;n{=7w}P0LZ5TO3<@ zsEyr{Yg^JaXJXk}JfQ8=Jl<-j5MwZvS$MT~vsY$y3|6ciGdG&;R!H(svax=(sI6!H zS*QG4U5@_1L(Wnrpf$l@njL#x<+HXo4#(?@9+6 z;X#~#xF)R^vl{cPm}ck}Antm*EqIWQ%UXPW!h9ZcmtVV>_lf{MWr60FGLp)SO6L0V zESjon85jT-V;~X&#%-r8-CZyP;vNJFSIUdz;nCN=bBeBME&yGuQD*E5!wV9wzOIY{ zL|09F->$p179$1NAB$Z9XQ#`0o?g`#6c>)okxjVH&DS9hNe4ik#hP=83jyai$l)1e z9OIS<8L@3Zs1OF09KFRSOL%zL=;> znaat*&_b_~VPFFQFbL2qSm*~A`hkIgkNggU1pSQ#{fMT+{nt}O^mO?Dx`wm+D=4HQ zA|(a=tzu+nVq#-&4s^gce(415Y8s%b?w~Fw%WVX-W;8Gc8k#UVTYvrA1cuj{8+vJN z;$T4RY;9#@&+W`d`VR?i==I;*Or*sB5OJ{NBUP7EBo+bMnGka@eq{Ve%8yD+Ow4O% zY|5=HD*m6%q5tC}HFt3M%FV>&FmPtD zu_ybFPX4POQ4@P3JHS^50MLf`Z@&hHKt~5YQqsQz{qx^{d`}Z+z`sVavH#C$K_|%c z_X!g-<42}{_6=>y`}Z!lBEZ?iN<$Q24OI_x41Nw44&Hyr|BomC8u8y+s{gAcGdmmC zzc>B2NB?`%&-NyEB0y{Cm=65^TAKfC{O=F{vmr0j->LtbD*i*y|F{cPG(RdY(?1uD zAC>VKT?+ZU|aVo6P^gfd2o zszKX_g)%$6|HF9c$|EIV$z`~%?8;*(IDy$zchl|R(P^Zm`2;{%Iv2oJ_z2vZF$f>_q>?Bz7ab- zvJ~a9=YQG?o!ws$x{m5EbPrWn42f%0+C<$!mSDksL`un)oOcvMdI$6Z_bdXL@-9nf z<~`?`6h+2+p74JW~vnQF`m0Rn#7mZ}dp(&pLwKw&0Y3%u4 zWp2Y8R>%B#l{&2*jU)H?^kmOK(iL`KRr>F!o6|tg(~UlwdqfZNCAs^tw`?;fS2i~m ztEybi+kw0hB+XTp3$m!|BXn9d2hn3|EfIDm(*6BYdmF(!(L)J*Md#a>iP^Fdq`huh zzswWvtQK(uJT`;Z2P1UmlI%BnW5rDG*wkYh|ch(;+rA&lV=}JoFhDp}TimhRtaD^UE1|Fw_ z*la0mnGV@OkGAWd3p`<&C9lAAAQR+T10YlK4!Gu87Il8S zp(jq^u6eopMR@*_cx2=5+fTcV{?9I_eND2iZ1R&_lW4s)4hEh(fDq4-f1 zn^zTHM~5KpEW)E#RTtf%Y1FK;ip8cOv@AD}4gf`X`Bi9C+9kfr7_r9h*TE5_`Y{lFF6+P|}*}FqeG- z0>@$J^`;G|&2rRQPH9`HmRXhcVLbOn@xn28*pK?*XQiwcDCdTwnR3U0P3JQ2kuV0@ zt|amGG?tz?WCeoWlaCn)UOT z-{vRepFh*mTASl2yh_>R)p8^=;6NVH38=LBSh{iQ<%WIbYgA%qOvT#GLO*b5^h=#) zLC2Q*xsn-o9O0~{cjRufNu0ob9uGvYw@^soTiJAy9CtoIp%u7gfcz2N>MV@%v2$m_ zEZci0zIMd!cI0xVi84N0=nccj8#+=hd(-NHm7CX#Tahecb~Nh5t^4ygVZ2LCAw!m5 z*Sh6`KCm7WMY*7P#t}9nNi|df)~8~JjJx`)Plp?iq*z!ETEb9%$ zb=ZIx4f9QoD&puw(M!+^{>+ zar0m=y}xM*2RuZCaXNBn(0lIk)Sc=1Xk}+f4{)12?QaOvBJVLOwq* z+Y!9eY(Gs1{*JmK-Df{VC$$%+_sd$N)%ItR-0e&LhhMGddsAJAD4_ewp2G>VWHu?o z#`%Y-P2~xEqPHgdc^%oIHw2SyK8VO{3cqi8TInXt?hTVB&ki`Py!W`yzO*8~8c!tl z4b2}_E)dpWP0T5oEY*;cj-fZLWw)G@)CDf}Ga_ANiJs)GC!M7A1{__n`ozAeXkQl| zt=L-fxNNj3*##j8@uB0yD>qw+os9^|@?4Bf6-|>H-JYL5xE=LB?oQW0ZhW3u0Dm=N zsrP@}kpSb_9ArrHGZCnV z7mhch5m{IQy6#dbv^fho1aq38Bb0sj6202*!5tpNoTf=U}0ge=a$ZW=_ z!337x*b<)!wvFMK1@4jC9W^P_+_c-Bt$L39bh7sj=N;QhBH2rA2IGYbc&3GUgDmdb zFw>J-2G;Nwub**&-v*wi`^Xn$sbKG%GjQL_ePM;uziNGynwGa7a^O^GNR@VH4SV=5 zr=_#kkUp_w-X@q=E)~o6F@0HAXvue4ejCjcL4*bS>*x-!%6K4l)-#StN0`!`RSbto z!+>Y{Lhg8`yhGxcm|&uYSy!Na)oyK*p)5-*ne(#JxQ|*QEcJMXNP{tf)vRi|L^~t6 z$x1x*lUUlcwSa&b`^?dMW;mo4b74a>>2!TMq{=m+w1LeM9$8H4R^!2VUDu|C+4ZRz zgFI|*yYu)rGaCy%WvkF<7Zc@`^p4$3?PQSx^5T8>ulnlql9jXP1saW@F``~?U9FAVDMTj6kou=P6WS#U=}yH z-eISrS=6}E+!uh3Nw3w?&D$dy$zuj$MW4h0TorC5-3;Hmd2Nlv$;6iNl0kunMJg4| z86l!+53%|oeZ-^y#oTfKE_BE;o$JGJG9M5gac4XyMz*`!^n#YdJU!)XgtL&!Y{)?o zWso|)q1rOu|Bp|Wre^{q2|X}|4VDI--~7gN_a&G8X7P{)rfQ=f7<7BCq0wR((sb+& zU!Vu!I)mV8878g|YKA5n_XArNBobR^)Rp7Or*P{6-*MV}%`@bA&H<$Lkwn2YANF-Y zd;Fz>1n9Bbijy00!-|0F8)P2*4F&+Zoh7n1_njS zgy2)U^V6le@&4GYt|uTTMQ#h}RKaUtqwTp&t~4($?6YxVOi*;EWVbDn!5Vf4lLX22 zTm<+n#$bF8tLZD6`Xb?vFJRk02uZtbnPe~e9I4~=NN2yv5Gf#McB5t_F@NHWv{B>GzW!|5$7afa7Kpj26m@1=AJuSAJo!P||B0wtI0iH6P~rg)zl)@B5_$E$drV!YJZfq$qk#0eOI8S#Gn< zcy>^ZS(*^Yo;hl}(d>#dnb!R|w{-<8&|py$19>_EV`~s&${H z{~XE0l?5&xfGKwzS+0gMH2JL;`==vNe#(^57Oc^7^kQnVlaW@cnw!RhivbhmMZviIl6J-;lxk&q zQNKmR`$5>`TGdvm=x=nIL2@=r4FsF^ZhAi*pYiqtU+}u|X3dc2%X@;!vENIE6MuYN z=7jCIczwPz?ril(8)b28eCOva1|bP|PFN_5xoT@}53_+r(4eYDq9$d)vp$Q(b zL4a0!9vsu@a2rtjDX6%^)m@bT9RU}n_LvgR&QP?N(A#^yiw7OKST=y-=cC30|Gtq7 zF>LKTxg_ydgxrSWllZ@~FdU47V*OFD0^=X^o})%ylPs$U!5`sCr_vX!a{wpIB-4i7 z)Z(WV5^h#Tk`Vf0Xrp5rstcv&C7d6wW+h{tq%0 zFhYLe9y33mL3?6v!K&B9=9t!m?3_QIm+6H=Ko`C=V0!wi{#}nTaqo1YDwoN5>gQ!h z&@kDMX9Jp_rnUagQxp%@7jbM;$v*3Ong2@_<1;h1DPOPjv<(UpzxVO>_SV1r#r4VO zJ+mP~EuAWu8N=9Bu}9G$AOlOt@1wrb+o$P3LMGUQI^7DZYAf(bEk2*CunpvfPnYu= z^N29aX%3(`qQqVPcP2#)m5BAk2@K~&v!AXCNkoe8$?Na3|i%1{**4! z1DpOx8+O0s`c|6Q%I*3R)=xjR1@TqO;rW~gfgcxdJ4e9X8?t?tWaOu(gn5h(n?h(- zkPs;;@gDP|^DnbZ&)xh~k`3ywx#WiaLdT01SrZ)J*5BWay{-*N7wXioqkMWvoe>bK zR6s?22I(qTN`%^i1XHZp!!`?fTra6f(DIceLrI7TnB7otMT5!Ao<<=5sFBb-Y1Liu?{dkgwz5HHF{SPElUcDp9w(wpN;EH-E7n&b~p&&pj1 z=zqh+e*-@-+kk*6L5;$(t~3w4!88sTKV`Rr^uWiP92?B^M*sbw}J!93HepeTxHzog$N z$K~lp(W&^f?&(7G4vWdDvs5&-fjLHwE*sV-+tcVho3f>*6;0D;cz;3xpG+4!BsY~L zry~>)5l=f6CWVmS5mi{!o4%;N2lxQvBQGT5{>cQp{TY;Lf?}=5ICox);`4)rq3Vzq z2>3om5@B3FpK+%I5m2>TJ$3%_IW#KSfo+xFA5{-5rot~j(?LsBm^>dvx&SfIUuC^9Y$sP6=m~~s;!c)Pd_&!IvOd$Tb3Tc* z0@tX#BH*%+pfDZ`7y9vrk+|Hb=d{#fnn}B9doGpQfK-hSUH7iqrHEWQUJ>=Jt1^^p z+A6#vMuRe+71j{>zXYUqz1`>3-gw>A!88TsoQ5l+I&kg%djC|L%k4!X3O0H4CtF`n z-Z&<`*8*OxZMiQ3$z^cjk%Y@^!ACUc;duH~0MAImP?L$eNC3z5zt1Vnkd3>pGVjqZ2?30mh zprVg8*y#lr_+h*y9Cu}Fi|X-kfvNFfmMkH)m-rhRKaH&%|41(*)WeJoiZbi3l1h`f z%<*eV#r`;Ry~IDO&%Y>k#pBqH`-xgDJA9H_Tis@{g~Fc0I=1y;_Q2!Tyq?gZ%z<2G zn@tq{_9FZ*%Li<|Uun2)``uyET~(&DH|#6kC?1SYm(}CGV`b-I)*CJ_{)&kHEp0T& z+8*cht@9s^Xuy&jG@DQ=Q^xPdC(dR5O?Z>27ua$;>2PZHbqZszeNe-GJu4zh?2N-X zZVPWZuH^_6H3?9z2MxuuYc0AqmRU9{9M!I0yej!S-ouG=p|jXnL2{M3*1O>}gE*e1 zhnl+<=LDU@#REscnFX4gm%zh$(Zc54sQkSYc8}yA`UFv)`z6o3*1K}!`bw~89D|B- z%lotPY&IY7^!_oU9+S2<1D366H!^369|9CO`kjDjMUv_Yg z)6$j6R;iaZ*fB#j$nbRIT^9N0-DprFBKs*0^@fs!+5@YX@EVPZ;mU<#yS`W;M^!>+SPr0uY+W z0d!NKs)BGi)T_i1j#oHtxxpbeC`cfw7Aq?}%-)xkelOVG_C4ggmDytC^LzPzyDxVn znIWc-^A~WNhpJ4sIW$LS|QexSMSYp z7ThkS!IwHF_uq$S>&uaeJL3A| zA+q!!GFa)()oWI5x*!gicsRUh_QIGS>0o&h=OZZ6S+k(jjvqWO`PU!VA4fe%hEi82 zomws^R``$5qx^$b2UhDRj5|j?Sv*eFUB;T6@l)UtLlx9pQeGovaOH|ev{$T+8qiE+ zg+=eps`01t=;7Eb5GINcLAd$fvh~I?{Cwla{k5M|;$b~#VmK3>*ukT*);zCT1&d0a z`eK)#>T{9mSB}}E%`%5**1Qo{D|Ejr=UFwdK z+DHnS8Aq74>pf1c(L#czL>|4xe12$AC}`iU)uW8(-9t;~XNh+f)1{kG1)KLYr;^oW z`b4;*Cj~Y7IW2rHnjXL@^HLm6699q_f*nSUDolsSL-3|AoI$P!)7-6Ow-QWs(ELH$ zYpmY~(``OADl+)22a4v>zSk!rDk0oYTC2a7pv3z+q*wFsh>KYmhfWb5rn~1MUe-~b zd=2q{T6jp!Y7&2`#piyoh~w_bk?hyi7?4i3>q4CI;5Be#zuq3Sbh1X3(}Blla&Rj* zUOK^}TqZ?#W3b6Y7^hur>gRCyM@?GIhFHh#^cCk)m$qsT@PjazP{ z{f5;9tT$jXQhITkkf7YtysawbmBiI4tR;^xK;efNcAUSs6r4KKY@brB&8_x@DGkUo zlY%~OTpPV1v)OM(7NGgq;?YpQyQeBe z@`AA{6H&$V{y1b?RZL(g**H(jE~SmWnAvNxid;5cFqB}Rx+XfXYWhJM3 zcU?85n^X%8_rM#|Q-_`Tlh1(JrXY8gO-n9YmSeH~3p~yN@X@Q-9~;uMV`wJQd`5O1 zlppKG9wT+{zf1qjeTk|(W?#`a|Qv&$9)V2aQVN0UNT%f@(COn+WY_6*HZBl^{tb(+^{ zMo%(?TRJ0ON_QnXg;EIkRct9#@8cCxScY&2-c&Vku#pH#{Gwh>VaAyarLL7fdZF)0 zB25$!c8Hc#ZA<<@Srd1iO!x%&A$M4WClgD*`C2vJAeVW3Cp5WYn*4T@>n>&d*YAZ0 zlwppmBNV;h=u#l4N<7isb<{icu<@W`Q^Yw#3O-4)A-j((T?p~YZvIZl?#E{2wdby^ z*;FX~_QD=RnE%jFqAMc5FlvMOsL>*mN{+)0mTCTHUK*3b$CSg=>FH#&H%~9FnopKQ zm<-2++6Qf^M7DB=qj9Cvtsw@_2hT`42@Z{Nixi2AtJ@}qZ>Z~0w~iJw2VP4FAdiQ3 z3gtZ0w*ceZPt)uDA#z?Ov}dt*(7aua(tVGVx)Y_8Y2Z zDjb)+WP6>h$=xc2a?Mv*DSbFZkKCbfcCVvY5`p1Z@MayQNt(wxwGl+~CopL{-VK^l z{S}0JZyR~H`!GI&Q=4*&T(2V`@|a>k;UI zh#TvZ_Ezc-AuDx*@8@-KYMN}0desAob?Q6=j<>`N+(RP*jaPHaVuSI_Ia32necnPH z`}_n!zYNxJwDdUdP6Es-R_8`OS6}!-lrppdVLFRJDeQo%nx1BJ{f_23By`aJ{6U05 zhVZuvyGz++Md~Y~^W@|L?D4qxB!r`-f+=d!05E40h$|y z3!4BqL7ii|+tadGC`T-%a+X=;G9OI0Ar+EkG_ZA(tTtd_faec-Yrr@ir>!XuIG^m7kKWcRsFYSULGRnESY zmh~gG;>d>(yg6=bTD5RXPGFxnHu?5qeui~-{2zvc+A}h}?%?57vaujB(TGt(TBN4k&7maLUL&+bc}FVq z^tbZKyfoj)TT8&bqLActADio&IG57&-%U5IVD8&2H=1c?x{CG#VYf%BR*n3HNHuz>2yCs3PGS}Sz4sK_V+J^$P@R`~Fn>JTP zf9yeHc97aKu|ny-a$%Av3Imaa9N1qPm z^1I5@38vP*(->&jRic$y8G_$*CR`N?s&hRUll-CGF55?#I$ovxLWAR1S(ByR;O1a* z-zFP%oIqM~BerOurD-dd{f^!8x$wq-^qg^@cHEf$aQEY-OiEr_g$j0v&im`ktJNW` zp>w4NmSPPR8k^JZZsrM`>O#U(S?1EH+ZkVl5Vje>W}sbewQX`0wvG&HEmGDVG#eHj zm$bxlA9iRj9Z4RP+@@*>S_WI~LGU=%Ux*ZO=)@HQyxMyc6V%#3-wMJ4yxDvwgGR6RpBaGFV# z`YVE1V9ZR=Q?zXx8L48vzUR&A1PNiia!Rh{a=Lj2mEZiv;hUe(&3LhJ#kSC>bbSni&~n?x1I#x{}1Nvkox*iR8vmOd4K0=g;68OW9? z*)kp)6|!4E_&luh3O{0b{%l69bs&ZLdfk!rk7i5Me;F=V|ygu{IdkpJ7 z<4oVit9{4MO8`3<^GLm;(`h|0FUQU=(ktcLSu75cQ&{YaiPNMHruO%@=xQ;En?#@^ zZJ5#&3|kT%?h%m1>Sn;n%XT|7PhGB$?RNBzPsZxVVcv+ZeCbFI&<@|HFywgb;fx{X_%Ej`2>hU@ix>)kJt???AXHH-O zUim?Jm?it0bh{7c3!`riRNN;VjxGC=Nt%;cvrrlJTK2imAzd;X0Rn2$no(@G`P2I> zngDRCTh5FYpY}z{HwL$dmq{R&=aG%b`qYx$y#4>D@6OKzy^>1v1 zQ8-1t4SRGw&mPV~_Ny7** zType%nn3;ml)yiyL!C6^!*|SQ@~L;>NhF6ZAJ~3ndL3ty2A=*piaL8L`zH#eyhjxh zNX5cAQ|4tA-YjN%6bYrMK}h`OQkUh&myUIrNW<_1jyT6gI%oqzT{dkUOYOnISje>c z%ljBRkjaEfl7q_|59X}QZ%A?yM|!5Ad3sw6(Gh9EF{qz+`#Pm2coWBOE@~pdmhy#h zi5#c-6D!rV8&pvXnp+WeKZftiwvsJ}36#eG;SEhwU}F>kgQ65}7foH8iw22E{S>$Y z_gOPO`7Chq>Cs{{$5=(BZtLQLHbTPzXH@n&JZtAxcSxHOoa;ylxOqjjc8NjHhPK>j zDJj3+)~}(|wI?(M^Zrwgbk6CpVYX+_&vzrTDU&m6i9?#8s*!PzHCR8VGJh7(9i@!1* zx}cqhKr%;EqqzhWBCIr6Wu#fZjsMDkUr$Me*A8&Myg?XKP^6F;wi++@7{vih6l?^?2Fck!)iM${T~&Q3hTDN*nvQzWyr!j<^rqY6UJ#5KCE~gF zA^9F$Hpc$7MY0LXnPeQvr;E!gr#E$NE21H|erihTbT+wlG9_|f8l+uX005_W>)ySi*^B;^r3&(~WB`>@Hia`bJ^ahsx#Rx-Ii$1C&6f?`FVaR zS^T=RR`7hXuu3o+0e#h_x#WmV%nuap*36BPnl60~+-@UF=`C5BmoxaSq z%n3`s@#;51v!pM#g^|J6>Jd%P&If0xE15 z45i}uLn?PtmGDXlY|w1iTy&Z8mr~dODg)3+{0K#R8*q8BbOhqSc@l*G=7icwG1t0> zw4AWv{5K?t^7oF8fZRbCy<=HDT}w=YslCy<6{dakhXiYfLxbV<-j>xf6W=zbXH^cg zuNxm0t#iR#HryE#GA&K@zI=;Z*HE`;)|$nDh%=#bEm8hj_*?2rj@L&%egPY!86B%m zU_IqrX~udxQw-aF@-5t3kM(V4mt5n|)09JAAJ^|&N*(po>pbrp?rM*`let~GH%)sJ z87ht0LP=hDk`^u`4&Fk&BD+p^oB0NsorxUw3Gxk8770;Nov5>?GA+DwaEU~pAu+D! zA84T!uE*v}!5Gyo_O-C5E6b^wQgM#m@2^(lH})J z=jvDAVy;itkhs^w?*42O5f4#h5TQOv$U*(-Ha|4paUnmXR*xlazfk>|a{D-F+CU^X z31O&pP-EFb|H9%e1u#{+)Dh=dAi@kZhh~XiGu*;#O#mWOi|&QP&78};Mu=-GUqAg0 zw=-gb2MseO-t1W6L?dAn!(?RLiBx^-#SSBkC1h&UCnnhn>{=E|oiLqkzozQ$IANY*Wowb^qy8(Bf@3mkWr zvSRIOAv@!NQ+=v6^S%7kMU?ObfP>zK@HgYDv9-e_jY}-WtZ@A1LV@V1_nbD1sDsFN zit-~;9kl5#=x}g%6!OWR4EUmNpA2b;F;QW?yu9kIbNfE9dR9c!>#EX5Gko}wm5&wO zR`J#n%G(W{YBu6vfn`guSxrZyz@Ij)dpw1fiK!(k85FwDSu%_un9%enn=mIfTcD!6 z{P(AH1_Rf^h>3}*fA%4n+fh7sD4FcTL|zO_PFh59LK<<85H(@y=EqT*AcySkF(_dO zSZjdBYP6Q`=Cw{kZ!%Q!Oxn&rAiQcyX4n6?d_x(@CAW)7(EQ4cx(ETC5S5Nf?7!_+ z|Fj-GoKeoDi!6d=uTpg?u+sxsPgq(c*fa&J!kdy$K8-&lWfi*FV%0=xNxVnk>~G^r zYP^|zTV&jKc~Eh*zGI$*uMtIP`N~iF1zP`46PbXyu@iUoCFqc`^jpsinTGR~yF3Nx zfd@U?4@;o5jDVVaG>X5Y&a*VOz}pm>QT_^;VjhFc)g+1kOch>Onl}itSHe$UKep;#j7&r}w*nD{+ETH@8 zF8`VUrVF%igmfg4?s<{r38;ws?aAn;r)TpQvPl)7#U<++_7u;HxNCZ+`zQzy;y$BM zsNoB)qhPWH@>-VqKW&{*5pM-(8u@sqM`Z1v_VYi64CIBPPlVY}%=0400H_H6y|X#~ zb2tbC7eNKB?>Q~5$9i6bpFwc6EsqEzMC933AU^$D1C+|H_WVM%<-I`0y*^*duzmXF z|3}?TDzr?fw{lbZd6DZX=!vm3PhPfHPh%`p8$P|*&{857XkFN|BC!9@Xr5ck|4)s^ zP+~Dh6b=rqb7@Hr?oRCP0_oY(3K$=AN=#O9S>{J3W}`%C@v{5wAsK`D^469a93r%i zyfaeW)=2YZT4Xx&^VTEk>)oP#w6(>=3A{;Yv5SD7(hzI^EaDXOkIf2MXX<#m!2_&d z*cD6yJdxK>(g+z|0JgI-&yUvCN?GCP92P$E^r;2`v+)PoMAJd-| zhhoez++19#$F7nNp~Wb1+q_<}I>rT-(m~I&rRoTn&ib$iGSmDQ`HUFV5=%?-2C{PZ zvQL-v{9|rD`Y)=ObRd&i4Wn5^QwrXDPldSu@g0}R{(|ee(CEwm0b~CxkIIB1r;w@u zY-!l@uowod+&PXw5@LNG^8ziPn5T4)P{;p&05no4ph*xS4E=NP|Ir_DAr!4dFR+)N zaaI1J)pZ~giilh=+2EgBYZ#w==;nm^|CIA2*!=%eIhbIHIU!b3jpgeT?9;15zRN=B zxv@BC;2~y*ChWu|ARusKIlv*6N}sUapTOsUq=fdIaS&@mUy7!gQoUA^Jr1i#k$|wk z*4EbbkvIwH=|u)8gL_(dV_s&%LU5AOcv-_)?mDZThK@UUee!MxTIplG1#EpFuD3IG zt6Bl@J!9+39nc}>35S1twzQJC?UIRGs6k{5#lK9QEIOO#1J7c*`joY%kS1{eqqgv- zqE1cHER;TTbU}fq{~_R4jFuFXG!mRBRR+cIZ!`^}oF!mFW@VZ<9&DQ zdJG2;TISFTJ!l$Da}oTr=`nr9?sA`Nnj6jFoqB^+&fwz#2G5UQ33E)w&7k-Y6rcs$cE55(G+h~2fl*;Txp)mU1 z2<+u~TP>nZF1XqmL|1Ou6R--X z=VAxq$|N@j6J$MovV{msuWrlAdy{uipr?I;BnYfWQavCCHPGXLeHVMv2X=SYCmZVp zDy0parAt*1=xGNE+qK>Mu4pqEL_{ETyCjDm8wSngCvn0{5Ns0&%OL;P-vT(%9FB+Z zx}N(3mau=+gD*?_D}W91A{YCA!}q zT%8^`v1<412`|h|87sD?Mv_Yzh8YMn z0dT5HSX&;)5e)B4mXSJ2N+1tT4b7BgY?iyHPD?$|sv_Q7xEyFjSdI)%C1>QPU@x+i z#%a+50l5@RYDz=pN88#mIwUrxKsqK5BTF)=y!E`p6S+p5VU9Wp zw;dzOMXqmY?yXQ7k9x<9P7RAfOJBL73vY9oJ>DjH?0NR4^IyujZHX?)r2wvY_FRV8 zsXPRR-hTW#mjl@v)FFo+zl>x|ftOJI)Z>3%0?fSJg|t{JC{ILOo~yhtna~4UBi)y_ zI)T%DK)p_$MRD}^_91*R6Pt3-LZ4SD4FecUa+r_ajV>s{4Z6;kd}@z5Zm--Lrv(et zTY^70M$8}X%{qlQd+Cf3cg2?Q{H-M2=V$N#x>d3)=0)%L;^mJwsQ7>i6EGtrIg!)a zaPJJdcS8$On_TP?TR%AYHM<6+h2D3sYt&P!4VwE~^Ek=$nf>V1N&)wWwbF-w`x%$; z8bBnyKT~dU=-b6&dHKKCd+VU8+V@>tLJY(J0g+U?rMskCN;;H|O?L{2iXh#al$P!e z3F(f_rjd?KH*EGP$|~J|5@f zuqmZHHZ=)|=ODx^va{1?CR)mjMGBOBhbs6fJUw@+P!vEB$mn&=o=4K4>L{&8v3?&r zSlU_w7*RcH${X(6|RiD^Lr=$rC|`l`jK1M2Ab z0eB&xpds3BnNbpI93UADnHb9s+dp3Zrosw4Z$`_SSs9Z8xTWIL8`CrV?GMBQnY_C8 zq!3P9Xl=eVPJ~nJt*G_5F^{mH+V@kRk2j2Kg;C0z)v>;F{~j1Nv2#Q;ASiR$7Z*Jv z6W$_;sZm1-VCaAdL(G61mci7Iyf7L=W|zG(RoF^k+g8PAo_{BNvjf=HOU5qtTeC=- z`3W!OhHHLoG#$Ow0ixS#<=P`XN<*$Q^Y{ys!I)`#?(oi zfpd9iYmRt7oDdw>(82WoLY%XM1AkMZY0sZj%{f> zFr4^6o=dTVejkMCj~LzmK~7us>`o-WFmBxgBGn@)np9`nKp`a z&0cK9829Tgb)WX;uLtW)ad%~sPFJieWuWm_d|s692o{hjO-jm?k6`Snqm+v1cesZR zaMYdebn8}%OrPnc!8Zh~+oyr%Tw{a9IE*k-H=JyhJfB>R8U@F=-tFgpi4g#GykiN( z1LA`P_Pxz8*kh5LC?kcR9+-Q#fw^bk+u_P|su~(~lgj)T_O%#KO3kL#Yz_MWw}?=5 z+&FDhaoTK3S8Q-p=?G^5y9>Z6C#pQxM?r4AqF(3JJ#p+2K(}kgly%wZ`NfQuiSEMmT1V&7`!7DJQ@P$@HtQrSmy5z_UEtlB_% z-W>T(w84*HI}o44Sg}L&{>r$H?P5Cx94)w1sh10~^k=Q)s}9NdEsT6EjE&g=@lam% zS@0@Q*|NXQW`0oJW_&PyP%T{^$1#$i*e64157U@EKaZr1Dgkp?Om1vAdH`k3T9>Z6 z^4Omg^${FHxTcxaQS(m7k4|4VP}~_E%rzxtN%DLP78cCBF&Jb+53rog8>YMhPfbF2 zV;Kt)xW#9XM^@eJxydnj2{?w1E!aUL_bKR~5>y%Rr_jeHR)SOKhM2Gn&UzbQ_Ofg} zE4N|1gTW6}{dQwy<~0UD~HXe9t7G{+4l zssTr^2D^aO0+v2mBU6h96IV>^i|1=WVZ}jlG5qG`b+|pC6hcjaVg(4F{EUld;bxW; zh?8!mHXTZ1PJs1wq06pK$O5-+bxN`XMP(EP~WlP)y1+yKp{ z!F-xV1KC!VGxZ>jEtaZ#@yz?FeIf$WqB9f@jNF}q05Nqj6KZF;@!m>XX}fZ(!OVv& zrN=zvnTMHiOL;Sv^F*R(i71 zMjQOI1^u2S>hZ0yUZ<(h7eelmAuqgvLauOeoWa&K`S%1nH>(GxQ}F46nAMNmwa~7h zTC>5zasp0w5zCm>548byfhAK_R&7ERluU@t5qV3jTv;>ZoTd#!n%HiMG@Y6+#z7{*2 zF=)c@N(df_B6`j8z4we<$>22wq`9nKjs8lRzI-0lrQW1t?6IN9>MR1!OcgWlmgkqu z?`N0To^)cHs#SdGxEU^%ufs%ofGj_+d}l|K@a{qvJt8ii87K>e2d)l{6Wo{VX-E09 zXm%X*PPMOWiN}O zd0)Iw*tBYircswUtvhqPUFJKTeupRFoj1k#$jMn5;M+J?P+nG*$*hKbCGNrMUn;Xa zls#V+xOg7fZ7;Lf85LHw=M~Lrr1ANY@C>~S=Cd#5-`emH$>LD*~+K4 zfrB1JG^G=L$<}`$9#oc!rNgX5#5a#qYG1JK$*=7wkXh0<^1LLZ4K=;(|o_ zLd&pEpio|w^abo6k?k$-Ckg%Q7aIY7iAjG?<5D?fq8D7Rw(%rhiAe~ z5`bXLXx#D0s;14`k~V)G3|i~=+P=NF^-ZB%?9rZ6naLcoWtsXPjcZp>ie94N&@zIu zMCPF&mXzb_v~Ex=FNz9nB+DL4Cez*v1Z}2V!j7|?-xN3Jhv0Lq>bjG-o@ds3OZ4jH z?vW;zzG{|3k6Z`{xvKS4QAs1FNp5VtUS=pZ^<(Cr+0Onx4 zBZN9U-uBz-><)uXPdr4fYAFix9hxzd*%u#~(ku`P8Lud|n!{~R0t7()*>UMKXyg=E z!djDxg-|dm-MMynTvBX=!||VI$FtaZY_Zyzn->ZNEZO$Uxg~_H%Il{oA+-WJRcLs- z3%!QxE5Sg53a%6uX$w2ZHN^&HV%kiFc0Ad; zeD2&2{lWO-An_YW#8?s*nDGc^_&SLuTjADJW1d{Wy!IB*|iS=WE1Xtx(|&Ov9L6*b~!zMf@`y_($R|IB@4^gNzd40LSSg z_nML(o)^ZO&j*5+aQlPo=u^c#^ti3QjV%_QuMDLISa5VaV{;x@Dysk$8+iEY_T?-m z3AlX|7Y{$G8j2xn?^TwL!|p+rbJ`Q5!3Pw^FBMMS?%#F`x^t&`6jhPSmrKgw` zx``Pp*xF2UD%L<@cVBv-QBp17Le{;>n4`+TCrM))$evoqunsC)y>dl~YH zdRPdv%nCPZm7mnHT#M4#$|?ZfGJexmj|5KfSF z-TT&J?*`_tbFs5uODj?YNQjyTKhwJoYoFeBu2RQ3JFMHZ_7Wa}$8%S|IX5PjY~4-Y zFoMl8Zl}dc{miM6j7)gn?b^V|VQ#U$>To}<7GR@IIaS9zLPC^)4=&>02}SpUdW!lc zV5exCZOv$sm%1B`FFCl8P-MU6`g0`=W(g5SN9!mF06m?hHEdPILyyuYAbB$uSoAgW z=5vA5pBC9iLXYr^d&?%V$Qq{e(@UUe6j2vdVx9x0Z>Ia!OnT{xaMbU?;#hdA-oc30;>mPX7^)Dn0IQ_ z!}vjF0C>gJVJ7y>^ttQrkxnReveG&cr@aWkV54f2PmGG{!IxZ9rY0@9qjd%0H;Mz$ z*>SsXGT!w?w^C^;b+dtqqKXsu+s|KJFmQy=YRn`)SH$*uh zk$Uw2M2YVhQ8A7y`kLM9uUp+4#c##~gp>D3NGQY}60E;U2A?vJPiHbuXR^8dC|oMO zt}-H3Tq5uyML?OH%JYU6(PeFcWcTL2mpf>@xLHo}@rmm4=YMYE_ItWyCF3=(0!%>g z!v9+E;(_?Pc8>@E;gkN>B%Z zJ)`e{sF!F1^&D3JveUtM**0Of!aq0hA72TwVgekI!$Q@39Y!GYT`m`0I3n*#x2w3w z2c?R6QR})NB$!Wmr1ZHpr`a8OGFz`uK`Ri+rLbY)`-J>!I^^w(jtOp`b$GID4<~Qh zB{~@ZNth7KlddBB1Uz*nu9hs4G~?qZO)O1odH2^-{o1QnyY`cW_t+zsV(}9#ZtmIU zQ2k48`|iQmqc`=DCCj~Cql8{vAAMaVFKVk6w+HmYm|d9t33*<}^kGjuka#Fi4+v87 zRcpRdd7E@>4N`2Ae|cE&EL6xbvtdbKFX$Ob!uDuah3xQiPn=*9LY zW~MuDQ(p<(>5<(2zTIa5mzz43m_IE`8&mR2>ua3b9k}HI)7-;l)QOV+;Z6=N-v|NZ z+$1lPb@$jXAszi`E3ftk0GJ+tTOcv;@`P^<5HHfEkWZj?J0gsrqbMAx5~l3{Q)cD_ zO?RF9NiRT70$?T|eNOh;X?x--*X&($f&sF*E`|J=0z>TNJ*E1S?j^k^EOVM}z4um! zB!ersrGhNfwU&o(vO$6FKcF7xf6i*0VsCa-to-ej28G;(&=RAD(fVlaYoSYM>}`z1 zN8kd+88#ZH%Vz%AEKv~vI_|hJPOmRkXLVHOm6{2h<2(T73FdQ*!CMSv5r1uJu(7YP zheH?jX6vZvtZCe+uD6nrvdddo+=66f{2+NxbS(T5U;d93{q=1lxu6`1@J`=mo$bLX z8(>7TlxYyT=k@k}=v1uelHp{R8croDJY{aJwd9Dv$?8Q)AhIqYTmZBL24Pb|wg+n} zc>I;otEC0B#2&kT*>-1%LyWprqmJc}Yz0v<3>YPV_}GpN1RXyE)Ha)L?t!Tz_`@{V zXe58O+|fQu@bfy{h>T9OB1!V%RSSzL_W-&gjiU*;92Gx&c}ja=t{V9a#WjYkD{~>C zURY+?!xE3p;vJwNEBhl5F{(17-hab)>FKd~mm}Wr5k2*Vi~@M#O~)?V;5tkW2#4M9 zd5O=jwLfLq*f2bH1USFKv*H1dcIGp`(^|L9QJ^i(|XL$zQGTu+esZ-sDsMRmwHYjs1=iON?ob&pr=omQ%_H&0 zA`hcS7;o{b*fE zgEtjgkf{dUwg%nMQD0(qdL`c3Du!-YvZri>oqv!o-l{j8c4^oGq!V1GW7W$jMqE#g zP8l0wM{lyFTNUIh=4+X*4wdAXClGKc%0YUy-Fk-3xMcd16C#+WNUA73IuR*nn_*G( zabr7=OTpxXx^vFwcOYg{R<++Pb58nVE85H5`=hWm20U}_uv@&C=K(sF2FvPM9uXxf zU2OS(On2;A!^BEZ%|LK#TCPKc%|^4HJIKa@S-(+wb*r0bT6VvnzlSz6su{-yB2xic zi$uVx%?oZC|9=av9C%<_hy_bQp$Unpv`g*p85`#C8fJI?fY_SN1XT2DU z!elmAHKoZf|Kq6DVDG>e*o0DL!|WPzLH~FX^8m6 z&Vo8HThlF|gP5jh)(wwWPjGcg=vxv!mUg5=30?k3;BFw};j|wL`LeCEOTASLS)>si50>8B=G7nRIYz~o5v?ys!#>%Hv;4>o zx=>1VTLl3L>60o%B9B&%Ifvku=W!LU^VX}X`hzk+PJ{vPq9Rkfi;uDs+?j9K1!>Rf zn|YK;?z_xAJ&jARIMz#K^uv2)nBO5p7=@|IZV@xD5%T&@BDHwX3m)3(yaQiH^~WZ= zszxv))82FP@-kmEb&1QDn~vjrm{c%6s&CjC5jNwQWaX31w7bQj6OpgYt+S@>=k6JR z!x$ONfANyv6#)xjq`movXZLPIE%rDPVetf$rpw|AoVIvTUlre|ZXZ*FO$pUWucs|oFjh;_ITdp_fF+$^6bpi=`H-~Ajj=NGc4?&fKg2pRPx znpbCiie{S6tQ_SrLo>ZN&tWRhNnuWxmJDt3+u*#DkKHX2cITZ5jc$G*?5#=D0`Z2M zZbKZqsa~61zk8Wxpz{#@z~@NQ8rj`R9qnO@1&(lolg}eY@jfMv$@+xb>a^=%HV~i} zDi`gr&Jo*L<_lDfhqTpK%DF%76;QmeJ8oA1Bo5hPRae%rv?H&#T z8wzrP<4g-1jCW#_cOf5p<j;l`mAMu{(qK z64KH_W@;l#nyrytTf38l=zwKlt~tBcYK!l2#fFe{$@*P@gg;2nAUSmb9Rv&Iny%G{ zc~}64B6OVXTc>X@pLsPwb)P+T1nr2eM>y$5lWBokeeU_Z)luhul2^316CV}4hkZs4 zPTj*kojC5bG3S=%b4QLB-h@9mAH}l>#hr8Ddg`EcwqIT#*p=%YL8Q&oUMV@#1#_CV^2O$kDP6wM=Fvw6 zoNDE5Bn%(^-TpfESEmDrdh5mg=3oKoHU^LMS373Ajl%MkKd6samt%KVW)Si^o(J^V z%5_D$a3090%ej>)U`Xh-bxp zYd2b2>5ni^UDri=$roNq@e2jDeGSKP?&r|krjxk|Q_FzH(nL@F z*@d{v5;WRy;3u}@g(l*nAe^w^-|w8n8XNsRIR*KxX+{~e2dvc8(0ecOBfsapv^oGX zv$#x1-?(>JnZ0=T(2k3Ysu=eTTe0x_61m^+652!gR)>x?s$j}7>q@(GTy~Y!GPb%L z&*mZkcDvNw$L(AEJR_x+NtE(wc=x!riL&;y5xg#6$(Wrsm0i-0#C!?Olu5k!RZkK? z_X&6{mfAYEyy!wIrq9$Uf=`Ck4K%glIb%b9G?l%)fmPq>PQx_tgk0*vom&3|Y6x}? zz%*ok)ZeEEB0QMY@9W~R;swv8ZVtk6R-q*UlP+yHAmzjtTXuMCuC?8#hM(_0HK+A8?xAwy0cvF1uY&~^1xNR$%Az`AcBD^75b;em2@O{s? zt>L7>{II7(v)!>QgLTUw$G|8`BDYtgR%2AbychBA`!kTmjLn2}p`r5KVXOy|4fWLD z=QXVwq&3PcD7@<2vM}zM%<*5$(hsezRo*-45-!J2uh4PRd8@CV=G2hFJnc?YQMEb# zuG0+?axsV)t!K6!Ry#5LVO4B0&1gH@`0QjhRen)(NMoZUc&5xNTq>Goj`_{y#=A~Q zXMdu85ZKMFg|7{j)4s{fpZ#fTV1AV&?>oi|bXeX)(iXuE~h&p2`_b42*~FgCs9b#YPAQ;a7o+|?dpfcTB9kewDD@U5d+ z%7p6~rc#=dwHe$1UEJ2tHgvucS`+ZGPT1K*5AC~(}v@p-0ZEiBvAO(rrT zF?uGX3%?$AC;MnSoc_s zmKM36o|sI$%~S2O+#N>L0VFsCwRCh|p*ERmNR#9oMd2(NVJQ^u0XS+{B}X-H-EQ@* z4s;wUy%OHV(X!Bz2ReVyo=D6A45R(&GSfovSM{L}8836*v`2>{U&>PryZ{(gpC+?Hd3TXEq+hL0&v|)5l0cQ85fwZc?&p)-Jg| zY8C3ThubkwslU60aMv^Du=4!k(eo&=IY>R#>YGZAMKuQvy;VIt5g^1!+u!)fC>F$| zeb1qIeXRfqZWZM;gBV7=-`&_n$Y3wKpz-XT|9W56zUX9v*EvvG{(Z$yXpXXAku z9J!RW^0e=n_*J-X?RWFypwmml>rxGmUQ>&dl;3NHZB(WpQQHvVjbhv95!?xM&4D_m z&-$btUm0Y^$n(R$=2`S535eC7{^ZNn%J$Jtb6HJp^>B5H{_*8$drOgSXM&Re)d5(` zDq7&YQFkFf1tq~EE!*^ax^F)RAiDlJuE=IGJP3b2ak4F;BXqur1?8d>pW@A?x=uG3hb#OF7T3c3C?P@>41*#k7z<{e!Yxz3&m=zIkQ7$8wE z26j^p!GI;WZ4tEae_+Ulhyg!kDiQPFbnyY-cKDdYB!sVzNBqC?Uf&5m1^DLwzhA|` z&3k*>8qofhDZd=`^|u!y*+<=X`{t=je!bQY?*aGr{grXj)v^fTQfU`gT1*ttt}G`1 zF7fDmcjZVKUN3b`STiK@`k=IR3 zf-eA!4^=q9<4OV;RhEQ~PG&#TA;+lLX$C2l&CRpFvnl8|dwKcOnWuaz4F%jY+I*0? zzg|zY5(ym>^~vPoxR9b^vB>h5YAtB^UuwUxn4C_V@$r0aukRCZl97tZhhesUmIzq- zlBN}_xK9YCR$%{!i&psriLhC)hHMZA%}u6JuaTZFO(OJV7^(Pue9p?4S}4xtlFhDR zei8@;IMkx3W&OZ2clPyOKQnnUP@*JS@#;5%^UFu&X;IcVZs}Vu=p{Tn{I&TE^pObn zE0sImDmKVDOf(73nA4(QJPo;8q2g!&pWSe%=hC=}03KplBi}k*lliFji2D97D**&f z);_3m>&VDx(1jMe7~mbf`zQ#s)Y-a5_*Yz?Py>7Bbe--Uvu7&q{1x2`z`@ z-8_DvQO*x1;Qe)Lf5VFLxOyUl41e%ve%l3wz+S0*_}f4H1JGZ8bv3f;<-h;+pB;Mx ziB_=x9r}N1JH5K_<%lo_)Zd=v-@oqv-NfGp;Q!l|@D6y)Y4bBJkcdP5keJgxl&gsA zk1ay-P|G|1`xKuWP-h2T5eX+UB^KtwPNt4z+1}6A&+XyCQ(!Y45-R{kr}666ey&2R z67f~^?#*J!R}jE_1-c(Ds#O&!;Zv)8b^cboFp?a>9HGE)43zs%-~VJn^N!U1w}5#FIbhZd{D<0wu23F>*U9cx zgM+0uaAj~X0iUE?f>gx&7NugFA@*#gl5h8_>w?dD^~<|sD?}1Kc9Aqw_}7n4jHZcg zj}j_6YKYyRp;)bx16g#Gv93FSx8+%B5-;@O(l&45k?95zFw#OSLQJq?Dzm#V21_M7 z`5mUlDG&gP1S+g{UqUPVN(nwY`l)I3gz=Qp$C%^}^s&tf$4LkLG)AIFC zNL6Se!`(KY>dh3)6pGdp@j&GS;C&ov+F+bw)2`QUxy>J@ql$Z$XT~6a41K$N!^Jal zne}@Zf-5%n@m+Hw7*t+{g@tLifdzB}Cr1lDD(5MFw`^nlNU}{;JR?ogoLVzCq1Nu%VI3Jd75sS&(gi6j1 znqJd5I^qgQbI37I(}F7Q!h=~r>25&q&E8kF7cBvigGk%%nx1qoU?or%3>PQ~FVSmJ zxXJ3h>6?b{3Mhr@0)us`<`1Wf?OUJ5GMVRdPB3Z|D_Sz2jj%4B>5{4D-!^psVVzx6 zn}em!)-|D~@boE`kt~gl`mLdo5lrR&`KAuh{!@I(tS!_qN#D|0HZHy zmI-U@jmh(mm06I`WL0RQqdOxzCrsgyeWiD)RA>wXeO)PDDAYPX8oHaBsLgLRr-;Qn zrk9D&mSwJc03osCed=xkOx7@^FH*O!Mdi~0DHOdKdd+2b7>MzN008;RFtDzD=5KiH z!)j!E`N!4EAHuE{PYcQ0C`FVr`UX2 z28%%+{}R@qoTZ0UV?-K>p-YVLT z^FL%z;0l*fz4@P6-Uxk2NQhny_2B5OXl~OA!BcxL3z^c&Ter_)%W2f|&Oz2gWeQRd z$<1{$9hW^3|0p&lCdowiO@{$NVT30Kbi^}(OPoS3mVptm$HZd!UA;#42e)uJ1|98N4{Z&Z4;Q5_Ap2~hvn^R4#Q#KP*>s8r~zcfh-kQEf78AI~DecX$f zbdJ`|jfeym0m@2-3wl&LM8ARMyD!0Do%tE7x@qbyW9>daZX)DA`{?r-kTjlZX)gy1 zUb{?d(VKvzB&g=?AX3s)n^pg2tRrlilpA4N8ejSKR!8r@L$=$GykD7^0?Gp-3}~PK zYXTNhck|^llMqt3B;=qgs>APb<8SVT0Eh^JQ2zu~f31sw9qLY1 z)pKIj{yPNtbq$h`o}0Etd-KbGT_XgT3L&ATRU0oQ6JfV}<2UNWZ0Ftge*Pj$z4Rx$ zqS63mJAb1WihsRvh=72ZSJ3$?jR^5T1^lMrS#KTYqfn(wIr-4gDsmY_o7g{zjNt6u zyYVal+mbtyN_;-3E2EMSnAK?05lQ>=Zqz&NYo}l>1Ry;OYA^gQ_d!SxDy!Z@tORkX z$BfSv6hcw&6+=&!t^a;-?^lodZ>jE|WqC4=T&7@uCvb(A37m8y{5pYCxz3$#-d#X9 z;~M)t?At^>g)28?t{tiT1>Agp2y{5#b2z-x|9fZ;DYw~>;ECU6R3)!BH>xnu8~$P#N_k}l z`)_uu*#*9NxL+dpTSi)YXXVMQ|B{gYb|?S5&xbz1yLh>s_UiXM>0cYw=NYg^pR8?Q z{T*TdYtsM>iH872@X&|S@A)4N`q!!a&piB(^Llwp?~{R)@gXnu<3G>Z-?#LitMRR> zJ)WB$t!i!vHf@x&t!?oF<10aK#|%!-E_(;!W1A(KbFf@ivm=tnsd{m$NWVrzysbS- zphChqh+wer4QaMQNk*<(y;fALMftwJ zpa2}|yf<8zaj-tx@v}7`O)jB&Fh%$lS7Zo@bTnOA7iRZtTC ziWwH_L!HSfAoYj1xRgajMPG$bK_0KhQDyHYK2YO4TmCgdsa+0vys1%hwvkV7HV6Bq zqwP<%D?<R#ORE6C{fGjIL2AZZbi_w)lyL-1fnD2v&Ggz6oKLIYh%+U=vQ znP{V;^85YDKLTTC)56H5J31q2H#9+_g{}7DrB*XK&?1kTh0aLn&v7Jv;jB;QE=wbI z_nt0DumdyURwE&G3od(N6QHngrSdYX<10UOWoY$o#wWik=d=!!J6kVrR}WUb_S!EM z0DDfAh~0UG9zNVf9)Bu$OK8*vnRSr~d-v(>{>;50X=Ax09Ks60q@PDJfWf~V$4d38 z2^F0cCQvwocFUeS$)!^_X&*?;%2sz*l3{?DwlS+=S}k4=_?O0s_Xfo*9w&)j$W;D~ zpv&P;?HYi|FCINvFu5{$45@-|e^PV3MWf_*-cF{|sub)^;Gu-XZThkT$T4lVV0(^g zUWD05PFGQ-ewc+1O6zCrk}d~2pB^wfbm!hucf$O*7-cD2Be2^ycnP-zYtZ6YjDt!| zCr0g6OJ^L_(@uD@^YJ+5f(48w;E-JPuGoYW$Yl+r#OLPS&JPO*z=#_r781J%yj-sI zGQS3p+OHJAzyXQUI=O9?KVc*oJb#V5yI$V?G}q#%>$?wc3?k$a@v@Dx^ePn_A-G94 zq=_$qKf$6+E=#i@akyZn(L>=wW?dvlzl^<}0m$^>qfpv@S+xhh+&hV&_W^!|R6<-N ziWYd}YMqNe3!eL<4vE@WYwl;}`?b>)6WqFXfI^u4dV&@fxqWqK8aRZ6;YRqG*uH1T zgy(9SamFUcrq5F-Vmyx(`2Pg{Gn38%CU3k{}2U}m^89o2Q`g`I9Y}os4IP~6fiWC_ z{s)CIEe3CbXj=WJAR6m1wLb#O0NG~9DcQ2|NI3Q zAs;kV$jR5zzu*0@i0JRD+}2_TJ`?>VD)8_4^w*pC6%$le1EJ|ZxrWwr@4^?McEBX` zuaoU)|9sqAn(}`aV+tB3)m2XYbW@3hudDTDh59|h=2Bq(fz2fAE z_=S-JMxXnGx1(el{XJGa;FR=;ofSLUt80p&`%3?iy5jh$P(So~E@Zp-`L-F<)bydUr{m>;1w~QWH`!N3sCI5cIf`vDq43Uf(zk~m`wgcb_&o2Y-1(8?(8#O2&Ky&W@;>&pV zV{%5u027#r(DPpUNtouReM$6v|6U1+_yho)0fl)|KoJM}uA&N)Hj&dtF{mx6(xT>b zumE-S15D&-#o6{yPDv@L`YbvY*9T|gc#uj)yd_;rZ`u=%EnDJ%hVug*h+E>X)13uW zNb*sxLO2WR!jnEwvB|1bfq=iiB(u{6rpxL9!nKUc<211Lc+IWYddIe)tDvQuQCu#h zXg*WNUppQ8Q2@+JtGjTI?-qd3KelE#J0y-U);+Hv_=2AIu5awlOqa245XLblbM?

UR_~^Im|UxQw*s`g#`&VU(UiLV;g|M>3h(l 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�*95S$azk4Zm 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%0A8-&Xt2X=~(iluMrW^ zfVNnT8Kd;a%^ZENK&@x9up@e^l*WKE(D`bj;6Vhl zB=v!(7SHRi$`u;mBB1n`lXBAlZW_h{+*dZjAd3onqT*^x!rN%_3a|K;Qzq+SiC-h+ z7V6O;Vu0~(05ifMDBRN&7G^02AE)eI<<6%^h^Xi0BJU>dpC=z@2~)JW!7$g+1YxUv z|EZf$%l__ao82EMPgV^#?d3N}|IOr=DB^+kHY^C|8H)D^n7SbkZsq<_p`4sYUeP}7`0x+}RKEy#C#p#^k<*R%^-^HupdKLOwA0!?b|uPnL?%Cx0s&FepUp^8ZbkI#Dgu$PT_H&En&20$AM{1CgfP}#&73l#36eg_Y7~@&L z{5(R6AXKHC*Z%fRcJv_ln)`%gm&EponjU6VSI!~dQ6Anmz(I5%v^${ryKN>@*&n`Z+la-$y++Wem z+XvUNg(=vPuEo-^E6~Ffg35Fx{-es)oM#&g%x4v@2xjx;VG(-84CP1}ysK9kKme)W z8{(AKfkwUgeLs{q7?cq-!ZNQKf|B4CNA~4q%xeZo&z_G>>kbnrc}twCLDZmqt*U_h zvmrBqwJ)&#mu|uiP|xE-|K~8Il|7|M6G{b35>hg#fPKP#fN}(4vyMh`Lza)>1~df~ z6nH9pdf0J+$~mNKir-3JQr-RNR7~{U(+%` zPrDLxfkhEU2sRbB5g#_952LWzqUFg_#HL zOrWH3fNpyT^g#JZoh{bXT|MzU^;9i?ya0x znBpmSMJImx1QW?AK6@R_Z7;EYorn3gmsf3P=8?nwyu%&+D9_h1n{P{G(N3g!r98!_ z@*;<@dR~A608K3#5^Yg1-2Dny_@Wa&_l84Z9}MOHJkqk93+B1+orG z0%&D44101TjQT)%L7fgwBVhBC$bD8o>$2H;?n}UUGc;Wxi1IZ?@uo~9n<%IoN@v^e zl5RwDM*oEqU_0-E0M`D_Y#V%SBC#oJO=zZ1l%t|jtGrOK%75pwL{*$4V;iOa)7Pv< zX3a%1z;)s?hea2}zqGLN(A2MgZ5R(!xsXv8l23LX>&?a(I$93yH?N1R_7G~)bT3}# z+Z=078j8UY-+03{|qSOIuM%^!Z-XfVVn1J#KUVA zL_=<(-u^XB>W;xoc84DK<a&pBmn3QOR#-YnXxxDRrGP3H2nzC9~0dG6SC`_wgCP8UDqi-@ot zHtXBv#|!1fL26+cM6(j&c34n~q75k;ZM+pv3tDoNpHnLppH*J6#Hv(9G3#kmd^reo zgdR?s*bEHi$+&`JEH*rjoAbqGMr!ufHPJ>T>$ov_6rhmnA(visyIFtd;j{(l01p8C zKFNGkL%PLpTwjqi1o>#T0rKKvkA_gm>qY&s3-|ieJDw=+?}X>|m8%P_)YG%sO`CVE zpyH4Pfp%pNKX;izGr#BdFAMt=+{fqxzH6(w9;K`M5m3ypHf zXImFKe;OhkNA6#2Aey zCZk0`f6w`A_C4|N;crw1Yhsx{S zcYqjsoh4lT=|h(f8==Oxrc(Rj-vhs?YO*vjt7@TfFnya|_r7?+ecJ~QANHWGe|q2_ zNcaFV^cy01P(pJ#<=*B}_+(?G#8y_9Ly@86rH; zCb#l;+Tq!YuMl}9IbnqNW_za#*`k()!?^Pyd5NUM*6fRLZy_#aVy=p(phBb}*{D)s zAKBL}&f?6WMw?>QaOq8v9k*(-{5goDI;+tBwlDw2_*iXWl^$osFF$+9x=?1u_r&et z?ytP-d#y>5);LI$p1od`>&HA8Q*oX8Diu{!=e*Uwn9nDnmuJ6=7Pdk0lzmsNo-;o>-B$PE?w!cUP34~ho#vO!gukKQu@+)+jQ zwBejD7J4;77f8@sIu0C(YBg0Ye3pdIs@T9^Geo7N(W40Zc^e>Jl;Phfdvh2q2`SN> zVk!~jGVZ4CvUyG%io4VO7kl$4_8U}EQgwu6;sil%*VJ4>#8TOqA}9sk zr&c|4>!H8UN`{d-p_PV*%&!C1Z=C8q5XWq+$?N=9%6IJIMa5<=-%sz#3J0gIGy*ia z=7(HcOj*^FLk=2rdo4IAtv8BLm;b2taE<4J`*mQIQ=n?9MMAgT?NZ?fHeH=ueHzlJN2QARG{>O?od#3I9D9=Lq}q(B^&Md z$^+`BhaofU3)e3-QCARqPWM239XY#Jho%Ojv%x_TBh?p#K}NotYGU;FAKs^pNJ^Nw zkswN>u2^9jWZ#-AO3PWEKS;Cs&C%>Dw&P@RxNcLlW)LRvqx~13i3C4qrKfxsWY1TC zlo&>R=&@$IdZLs;Ey$(fM|ROz%h6Y$w8pzQd1pBoLy8@yd$!Wb7F*D;`wMgI4DFHE zUu+ZAikVSajv;a#63iaDQ9A&2cyp_=RdecNoPC=w%!6V1| zbJr!qv-5x8&h%~ZqUCH}NHz7qGL)h(pebJctdPlM)OlbscMTW!rAQ}nNBRdcY)97a z*jBIS4`sSFkb5}~e)EvsF>CkQF6)7QI1x6y9JJO9o=25BMmwq4B{ zoAWQ6)!rIyo4CW))hifC#cW?-Ht?B$Zsbs3)+b*n`D1*Rw>@h}LgV^Qp%d>S zDd=?Io}TgL%dHtZ6Enl^d5N8_hHtm5TanOSk_6SHrCSPX$vO>K4;)ApjQ5US$Gv8L z$mq$g19AvAigTSARjXZo)v$MD%Bup;=43HX)dr2EQm>6+-}+SUuZ4wZOva<9`Zrw# z$+>@ffL^-K5t-7vGV&%43x{#i994{p7qYxFkAhwgiRUH1SD$L%q084e>kojl)2-%9 zl$4)F*)S;C*d#!{RFq1UJPTY+RIIeTMyWrr)BdO=1K8X-AID}185P$*uCFg_Jg=4( z^SM%Wh2OxI^-*<4bDU5dDBN1@Y?)iXt5_}_nXzHv>gGD%{ZdtNvAvA{Pz+r(A#i^G>Sb*?I`_T`Cs?p9j)?G-5idt3MPdv>hqR@H0^*Wfk?$#Gn3M9ob_eQiyKBzLy~?i0IkksQBe z2Wj2i$-?y=0jma6BThUAU3|5DSh@((mYaK!p&w&BDstI%`OIo?RBPs0J=BHk*%fiFa!Wz`@`^&e%iNoz~?;j5#`8MV9nQaN$ zxzGD-R7YBZQ>f<^43ZTEK{%H)LnSV4D&G8Wa$F)d$2n#>33qGP%)kT3&0>o=(SD&L zWtP68!>Qg$42(6`T`96@$2e96jsffbogwVvrO8s==B$Akmijz5a{WV!yyWKms3FG# zQlg`8+|5ix<%i$psm9|fxb*Fc&u06>=<5a|B9(!|@Nk|xKGLA`f%?ut*Xt~`p+~#D z{7$a29+t?Zg%kO&4K*JH(#J_jDCMzzeCL}fEGG6Qgz1T#1@cr$H{}%p76t|hLDDrJ zs~KzOk9%#ow+jS8Hn7DSDOdeEYf4g*-Rfxw;&_rbfvhncr93XUvVxEvmK_q<3}GO5 zIxJVnkfX28ogaWalqM4j%-YnwM?|RVo=Z?y%eVx&nN%NI3?0<8XUSEp=j}w|gUm>u zMVb0v`P*t8J1=(hRv&qVOJLlxhi%%YLavn>XlznyI&e3!@VqS7t3`5Ze;j9pr}-um zl)qmtXp(HcwKC|I-nE)#c4bly`Rwf9zw*V2&)$o_drQMmt{?}qZ0aSC)o}cr^49Cu z6%FB~W@T-$W1s>>_$P1dQX3;4-$ycUzTsf!?hV;nE4&?>um1I`u6d|A)O%0Jp!r}w zUSD@^($zSE{5=^}UWzNNykH!I?Rr^b2U+H;EF*QzYi#}2ey{ehYZ#l$42p&<2HvwB zrD)Qmfyz2jT*kQ*)BP8ucPIAZ?#;#1^T?Q_3w~8%FX-ets`lFz&N8xpe-N>JSPkk~ zG45?G7EN)xtZyUhZqC{G?k_jm+LRu)mhp!CUagYM%n1usVD)w7Gzr93vNb17$8fY= zAb{MQ{kWjH2P!HbCiVt>Xx{CZ8}F(1>NQH;_-!EyTUcdRDit7B9s1 z>2!Wq0f~>=_WI)njy2W-+2Oq#EPPE=;g8zeBGt0?{3)RLuc6D|{>@PDym^GylULnx*BH?vr_ZZaqhJE;OjmUgy zY&9<8)#!r%U|1~I2AjqY-Ng*@g&B?|O;8iubE~@EEd{ksz<&TV#aa%#-s`G;LBBNO zLUA-Gs~77M#itpm`TK5p^g)tB)>H9V7oF6Bn0`p$hh`hR%LW~X=n)2WGcU3x+#FFP zwjuJ2-OD!MuxnG3Wk6&e1orO785kYJwqY6rnwkAV{ z0lHO#^rjk_U&=V3mfn`0#V z-ow2M6+@7NiQJo53$J#L3QfZsNt$Ke@y!=#w@!YxY0Y?IY1mPil)-M6NgIC0V0l{J zzmE)$chR+qfk3zC<3!<>8+NHeqQPT&`NDVYpOvanE>3~py%t@uwRW)5^Yx-=Ub#=0kzO-Nhu+w3p5o@M|lH@I8#ddE8$jO zC+id<1UScWi<6D?(-aDFk&sZt?6y^U%pCX>*l;>Fw9E8+O%U*n4%HYD<4ASpx=PK+ zXWFuhoVY-RUqpe)iQiOGZsTk-F3)9DeG)T*!$(2GM9bZEIORatYPU(N?E3A1yagj zkz;l=?@P8?=l78u(gB)E3<{qO9NDf5INg&7W0~m9#wpudpBsDHwRV+3t%bjG@Fo^W zd+dAV;i0xC8Nza7B&E3`VX=24C;rDJsco$?d`_G+$OJ|aWF4CN{D7RtPC3?LS)BgyXHQJx%|xuquWTQXr-(Z; zEPagfN~De~yna?y6&E5$kfBGm=iW_PO{T3@=@Qf*X_zt36Pn3>+}kD+tPxdNxxETZ zW%(=@)4tp%f_7`pePfCCQCDr0rfaty#gwc@7v8)PD~-`S(Qi&P9i4pPR@Vi+^$0px zXbo8S6fH-GeG9Ml3rQt=b0&ryP4de&zo}+%eW!I6Qn6Z9-^$k=yIC69Ex6^>w3@uJ zVpd4V__)7EM`%v%spMf#SyjQp^vEa9ud?){c(<2s{g~(9snjA8Fb&CH=+>|Sjn(o} zXq?st58O*SN8Vy9)yPwMmCTMX;WMZydzCHc_iuG0u5L=2)v){HaENX^Dl8qSH(#C8 z&vYm-@qafV8CG9L?!sxdwe_VmhHGBlC>dwl46?`hdl0dWR+`=N4nI>x)^6j0LY7hf zS_P@xK@hP`T$5DG7Zt?c8dnU(t>?OO)}-6Z^QAv}oA7b5dTvs`@$oCP2gn=yBuY2n z*e1}rHc7_zqMxr&gSR2XvDeHiTcVl6mep7HZ{>v_`C4p^yytPALlCYx8Oz)hUNcsZ zrptb#baeXI+MMbPx!++WHmHzFhM%prnF0<$Iya>qDu4ZnbV2&9vs98Z*PXjweWC-6uZ z@IEcd|+Rp!8jLKGDBXbRDr3qHb%bv1Y-i&@9e=Cs43P`b8XKLF2o?p#*Kz z;!j3-*e|eY)r~Rl7H^W}E+I2FRlcqt zx2BSAYQi^os5C~~TZ~?^KFb8jnx!$BEyC4Ly+NCey=OVPEpGTECG^qGJY#XPsy@+r zzcAm3MSU-GqU0P)u1g26&mBBLavqEEqlE!gho32*}`H5e`-ytFq+y!s}xB*7o~ z?PVO{^vTg~Kjxrry{4D?d2<6Qs#P3g4MnXEdQAQ@pzZIk3_T|MvdPh0opy10uA_0? zX~Ltu=b}CT+W6x{%zHLQq)V46gxxM&M1Wmr(I7hKmG}YYrdpLq}f!xGFjIcpEQdTi=)QTz09?$;WED?T^^2{<@#l5O9ZQ4+bO9f z41cG+z+0<}zs+xyZVyHyP2)dw@@#A$R~SQZOnDy0;A?rcL3d;PwsdUFCFg?z5GdI# z^nZ}orgB$nY}tHl(c4b{TLj2eA8yh5#N=}8koVA7vHZ4UzTDdV18M90nAG_AV3icn z=SQ)E_PhhmxUB8Aj#Z_+FA6dslGl|K9!5`TZB46>R6oS_=F-QzJC)tdrJqM#-;$hA zma41L9#$o|(&X3E@U>!aXmv;PXkTe$OGW^%e5IR9wa(-iFB1f*QjcCIBuEZnfvmSq zj_%*Tf9Jbeu(_nnqixLZ3GZtVxDK~$2a5Iwn^Y^6KO!M5T(gjbqEnd!LB7X-G^;H4 zz;&(T-Czt#dfI{-6pylK?shi>E3Q?1{Wh?8q8_>2l>wHve+{ z@cdD|IMUA@!Z1rU%Y(+boa{}ZuR{B)wVHQ8-rh$~5&kc!%)allXXlJ0ul-D{!4u+- zZX7T-tLHhHEsV-;7u-YfZ{e;=ya44_p`1~M?OrrrlC^-aGMD=6p`r?fbnkU?>-@;< zX4jn&^D(}wlg7%8YrKTVTm)w)g@?ke@x0ENNw68qxi1~9uLM1~nPG~sviMG2YE9gV z&xU5RijUqD@?3}JvmENVr!UjtFWY^*OU!qUKmRbQn{WXVHP+{jp{J6k-<@zV>>G4s zYAkfa`7_LY?uQ*$0`8F@*Y&?V-)I`_^~SQI3|bLyhK-$}4_#Dcg(eTd>_MCMK#6ri3hjgNgIYz0tDMC3{EKD$Lxt2}J-geullE~I z5Hc9zraHA&Qh>wVoB;YSH<4G7M97@VV_2WttNAa5+~MXTy}9~|8SRf02vN}5>l~5I z-l_<@^EHI&&B!F0hf@TX_KJ;$sW@yRVT`gniQg;|u0Mo+3=gktdU~+>BB1m16>`I& zK525lXy{03$GT zjzs=Vo+@35J^#hO#->U26ZuDAeFS^{43n08Zf%V6$gH)i{0QDUSl|#EZoj z8F*X3Uml-VIXO229EGWb6W!3mW9JJz-8c_b8L%cCSz3v?D3JlSP z$gw1RxY&oovfDj@L!Ljp%Smj8Hop1gXq3(s7OsB#=Du7+SlwGkaE?Au$m^i9NFKb5 z0UaRZsg{imOWE3FQA(mnk?_$>NggO?eHgV6984N6O0|4>X z^fD3@2sJ+hLe?g)Y?lMo5lPK`wUK?)@aLrkK7Zj^xfCG4sA%aPjD9qP*BlRJv>hCH zorVvVnC%n4Q~k{qOqaxnuc5)9AI7?}y|5IE?r7s$qmE)0kp1E>4t5VE47j6gFVArW z3aUG``F=6p$Yj*ugMSE}FM5E7J0B^bg+Spu973R#iAB#YcVKw^a zwg7Rgz@d}m8`i^#q%S6WondSwf8p_hI~&G&7!P+23_I>@X#LBbe8eOC>&x!>hYi1} zMk0-DJeNrM@j1=Nu&Ih5jG@g94W272wO?MEe_0{=OIrXy=VFKvhd{i4!bCw5F89W2 z9LDpVJPz5Mekk!f8zJ0?`7T9^7wxm);9eB literal 70852 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 Ka({d9 Date: Tue, 13 Feb 2024 16:17:18 -0800 Subject: [PATCH 070/121] prototype of release note --- .../72-Feb-2024/keep-on-latest-version.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md diff --git a/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md b/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md new file mode 100644 index 00000000000..5ef1c766d94 --- /dev/null +++ b/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md @@ -0,0 +1,19 @@ +--- +title: "New: Keep on latest version" +description: "February 2024: New setting, called Keep on latest version, that allows dbt Labs to handle version upgrades for you." +sidebar_label: "New: Keep on latest version" +sidebar_position: 06 +tags: [Feb-2024] +date: 2024-02-14 +--- + +# New: Keep on latest version + +Now available as a beta is the new **Keep on latest version** setting in dbt Cloud. + +When enabled, you always get the latest fixes and early access to new functionality for your dbt project. dbt Labs will handle upgrades behind-the-scenes, as part of testing and redeploying the dbt Cloud application — just like other dbt Cloud capabilities and other SaaS tools that you're using. No more manual upgrades and no more need for _a second sandbox project_. + +To learn more about the new setting, refer to [Keep on latest version](/docs/dbt-versions/upgrade-core-in-cloud#keep-on-latest-version) for details. + + + From 27ecde39c6b841eb1e064cc94e3e58980a3d1517 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:21:01 -0500 Subject: [PATCH 071/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index b981930bf1d..01ec387476e 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -28,7 +28,7 @@ Now, we are introducing a new type of test to dbt - unit tests. In software prog Read the [reference doc](/reference/resource-properties/unit-tests) for more details about formatting your unit tests. ::: -Let’s say you’re creating a new `dim_customers` model with a field `is_valid_email_address`, that calculates whether or not the customer’s email is valid: +This example creates a new `dim_customers` model with a field `is_valid_email_address` that calculates whether or not the customer’s email is valid: From fba19031f6e8aeb11313d517ac09a093aa7ada3c Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:21:19 -0500 Subject: [PATCH 072/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 01ec387476e..73e3fa43f76 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -97,7 +97,7 @@ unit_tests: ``` -The above example defines the mock data using the inline `dict` format, but you can also use `csv` either inline or in a separate fixture file. +The previous example defines the mock data using the inline `dict` format, but you can also use `csv` either inline or in a separate fixture file. Notice that you only have to define the mock data for the columns you care about. This enables you to write succinct and _specific_ unit tests. From bdfc000111bfaa7bc59b9942f63e4bcb0061756b Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:21:31 -0500 Subject: [PATCH 073/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 73e3fa43f76..086fc9c1f77 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -99,7 +99,7 @@ unit_tests: The previous example defines the mock data using the inline `dict` format, but you can also use `csv` either inline or in a separate fixture file. -Notice that you only have to define the mock data for the columns you care about. This enables you to write succinct and _specific_ unit tests. +You only have to define the mock data for the columns you care about. This enables you to write succinct and _specific_ unit tests. :::note From 58c41a69011081414945834f66ade0965fd0fa36 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:26:28 -0500 Subject: [PATCH 074/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 086fc9c1f77..349c4389ebc 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -244,7 +244,7 @@ There are a number of scenarios where unit testing a mode is appropriate, includ - `case when` statements when there are many `when`s - Truncation - Recursion -- Add a unit test for anything that feels like writing a function. For example, it involves your own logic processing the input. +- When you're writing custom logic to process input data, similar to creating a function. - For example, you wouldn't need to prioritize unit testing just calling `min()`. That's already been tested extensively by the warehouse. If something unexpected happens, it's going to be a result of issues in the underlying data, so your fixture data in the unit test isn't going to help you. - Logic for which you had bugs reported before. - Edge cases not yet seen in your actual data that you want to handle. From f67b7795c0e1811eec7ef4fca6d2eab05656b4bf Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:31:26 -0500 Subject: [PATCH 075/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 1 - 1 file changed, 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 349c4389ebc..244304cd3ea 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -26,7 +26,6 @@ Now, we are introducing a new type of test to dbt - unit tests. In software prog - If your model has multiple versions, by default the unit test will run on *all* versions of your model. Read [unit testing versioned models for more information](#unit-testing-versioned-models). Read the [reference doc](/reference/resource-properties/unit-tests) for more details about formatting your unit tests. -::: This example creates a new `dim_customers` model with a field `is_valid_email_address` that calculates whether or not the customer’s email is valid: From db435da4be41f5cd80c0b18fb54174d76e2f41c9 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:31:34 -0500 Subject: [PATCH 076/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 244304cd3ea..8caaed77bb2 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -23,7 +23,7 @@ Now, we are introducing a new type of test to dbt - unit tests. In software prog - We currently only support unit testing SQL models. - We currently only support adding unit tests to models in your _current_ project. -- If your model has multiple versions, by default the unit test will run on *all* versions of your model. Read [unit testing versioned models for more information](#unit-testing-versioned-models). +- If your model has multiple versions, by default the unit test will run on *all* versions of your model. Read [unit testing versioned models](#unit-testing-versioned-models) for more information. Read the [reference doc](/reference/resource-properties/unit-tests) for more details about formatting your unit tests. From 97f7e7ab4895d63631c12f2aa5a1cb41f16fd873 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:31:46 -0500 Subject: [PATCH 077/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 8caaed77bb2..aab848163e4 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -19,7 +19,7 @@ Historically, the test coverage capabilities of dbt were limited to [“data” Now, we are introducing a new type of test to dbt - unit tests. In software programming, unit tests validate small portions of your functional code, and they work much the same way here. Unit tests allow you to validate your SQL modeling logic on a small set of static inputs _before_ you materialize your full model in production. Unit tests enable test-driven development, benefiting developer efficiency and code reliability. -:::note Before you begin +## Before you begin - We currently only support unit testing SQL models. - We currently only support adding unit tests to models in your _current_ project. From 62ce8c61721423aea650e7d2948404b735b6e9e0 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:31:51 -0500 Subject: [PATCH 078/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index aab848163e4..0a949429025 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -15,7 +15,7 @@ It is available now as an alpha feature for dbt Core v1.8 users. ::: -Historically, the test coverage capabilities of dbt were limited to [“data” tests](/docs/build/data-tests) ‐ testing the quality of input data or the shape of the resulting datasets — that could only be executed _after_ a model had been built. +Historically, dbt's test coverage was confined to [“data” tests](/docs/build/data-tests), assessing the quality of input data or resulting datasets' structure. However, these tests could only be executed _after_ a building a model. Now, we are introducing a new type of test to dbt - unit tests. In software programming, unit tests validate small portions of your functional code, and they work much the same way here. Unit tests allow you to validate your SQL modeling logic on a small set of static inputs _before_ you materialize your full model in production. Unit tests enable test-driven development, benefiting developer efficiency and code reliability. From 8bd64f7c2d8a0ce9c260a52206761d40e768a2d3 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:33:47 -0500 Subject: [PATCH 079/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 0a949429025..4cdd7fce48d 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -186,7 +186,7 @@ dbt test --select test_is_valid_email_address Your model is now ready for production! Adding this unit test helped catch an issue with the SQL logic _before_ you materialized `dim_customers` in your warehouse and will better ensure the reliability of this model in the future. -### Unit testing versioned models +## Unit testing versioned models When a unit test is added to a model, it will run on all versions of the model by default. Using the example in this article, if you have versions 1, 2, and 3 of `my_model`, the `my test_is_valid_email_address` unit test will run on all 3 versions. From 72b84f28ff1d98635fa7173c8b91449d62863e37 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:34:08 -0500 Subject: [PATCH 080/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 4cdd7fce48d..cc8bb29b2bc 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -235,7 +235,7 @@ unit-tests: ### When to add a unit test to your model -There are a number of scenarios where unit testing a mode is appropriate, including: +You should unit test a model: - When your SQL contains complex logic: - Regex - Date math From dbd0aa446465f21ea02acac91c19dbb5c0211871 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:34:14 -0500 Subject: [PATCH 081/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index cc8bb29b2bc..c902bcd4fac 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -244,7 +244,7 @@ You should unit test a model: - Truncation - Recursion - When you're writing custom logic to process input data, similar to creating a function. - - For example, you wouldn't need to prioritize unit testing just calling `min()`. That's already been tested extensively by the warehouse. If something unexpected happens, it's going to be a result of issues in the underlying data, so your fixture data in the unit test isn't going to help you. +- We don't recommend conducting unit testing for functions like `min()` since these functions are tested extensively by the warehouse. If an unexpected issue arises, it's more likely a result of issues in the underlying data rather than the function itself. Therefore, fixture data in the unit test won't provide valuable information. - Logic for which you had bugs reported before. - Edge cases not yet seen in your actual data that you want to handle. - Prior to refactoring the transformation logic (especially if the refactor is significant). From 12f92a87b519614417442ae61d92e7664b1935a7 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:34:59 -0500 Subject: [PATCH 082/121] Update website/docs/docs/build/unit-tests.md --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index c902bcd4fac..cba0e27ca6e 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -66,7 +66,7 @@ select * from check_valid_emails ``` -This type of logic can be challenging to validate. You can add a unit test to this model to ensure your `is_valid_email_address` logic captures all known edge cases: emails without `.`, emails without `@`, and emails from invalid domains. +The logic posed in this example can be challenging to validate. You can add a unit test to this model to ensure the `is_valid_email_address` logic captures all known edge cases: emails without `.`, emails without `@`, and emails from invalid domains. From dd87c90d0db7757d4ca74c974d51d3b9e2f1e7b9 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:35:08 -0500 Subject: [PATCH 083/121] Update website/docs/docs/build/unit-tests.md --- website/docs/docs/build/unit-tests.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index cba0e27ca6e..b4c296dc424 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -27,6 +27,8 @@ Now, we are introducing a new type of test to dbt - unit tests. In software prog Read the [reference doc](/reference/resource-properties/unit-tests) for more details about formatting your unit tests. +## Unit testing a model + This example creates a new `dim_customers` model with a field `is_valid_email_address` that calculates whether or not the customer’s email is valid: From 694037a9d49c0ad3effdd46542aea3872cc89190 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:36:17 -0500 Subject: [PATCH 084/121] Update unit-tests.md moving section based on feedback --- website/docs/docs/build/unit-tests.md | 32 ++++++++++++++------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index b4c296dc424..7448df5d674 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -27,6 +27,23 @@ Now, we are introducing a new type of test to dbt - unit tests. In software prog Read the [reference doc](/reference/resource-properties/unit-tests) for more details about formatting your unit tests. +### When to add a unit test to your model + +You should unit test a model: +- When your SQL contains complex logic: + - Regex + - Date math + - Window functions + - `case when` statements when there are many `when`s + - Truncation + - Recursion +- When you're writing custom logic to process input data, similar to creating a function. +- We don't recommend conducting unit testing for functions like `min()` since these functions are tested extensively by the warehouse. If an unexpected issue arises, it's more likely a result of issues in the underlying data rather than the function itself. Therefore, fixture data in the unit test won't provide valuable information. +- Logic for which you had bugs reported before. +- Edge cases not yet seen in your actual data that you want to handle. +- Prior to refactoring the transformation logic (especially if the refactor is significant). +- Models with high "criticality" (public, contracted models or models directly upstream of an exposure). + ## Unit testing a model This example creates a new `dim_customers` model with a field `is_valid_email_address` that calculates whether or not the customer’s email is valid: @@ -235,20 +252,5 @@ unit-tests: ``` -### When to add a unit test to your model -You should unit test a model: -- When your SQL contains complex logic: - - Regex - - Date math - - Window functions - - `case when` statements when there are many `when`s - - Truncation - - Recursion -- When you're writing custom logic to process input data, similar to creating a function. -- We don't recommend conducting unit testing for functions like `min()` since these functions are tested extensively by the warehouse. If an unexpected issue arises, it's more likely a result of issues in the underlying data rather than the function itself. Therefore, fixture data in the unit test won't provide valuable information. -- Logic for which you had bugs reported before. -- Edge cases not yet seen in your actual data that you want to handle. -- Prior to refactoring the transformation logic (especially if the refactor is significant). -- Models with high "criticality" (public, contracted models or models directly upstream of an exposure). From 528e6533a90c218b82fff9a181fc54e85f5b65c4 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:36:52 -0500 Subject: [PATCH 085/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 7448df5d674..de7c560a924 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -1,7 +1,7 @@ --- title: "Unit tests" sidebar_label: "Unit tests" -description: "Read this tutorial to learn how to use unit tests on your SQL models." +description: "Learn how to use unit tests on your SQL models." search_weight: "heavy" id: "unit-tests" keywords: From 5870f968b86d19f7f0de1137f004e3b776a81c31 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 20:13:53 -0500 Subject: [PATCH 086/121] Update website/docs/reference/resource-properties/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/reference/resource-properties/unit-tests.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 3aa5295e8dd..758567ce5db 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -86,7 +86,9 @@ unit-tests: ... ``` - + +### Format + -When using `format: dict` you must supply an in-line dictionary for `rows:` (this is the default, if you don’t specify a `format`) ```yml From c10ea4910e9085c3439571287ba330bf655b603b Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 20:14:18 -0500 Subject: [PATCH 087/121] Update website/docs/reference/resource-properties/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/reference/resource-properties/unit-tests.md | 1 - 1 file changed, 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 758567ce5db..43bfd753f19 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -5,7 +5,6 @@ resource_types: [models] datatype: test --- -## Definition Unit tests validate your SQL modeling logic on a small set of static inputs before you materialize your full model in production. They support a test-driven development approach, improving both the efficiency of developers and code reliability. From 95cd74b8ca366c761bbdbcf5caac9522c1cc89df Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 20:14:57 -0500 Subject: [PATCH 088/121] Update website/docs/reference/resource-properties/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/reference/resource-properties/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 43bfd753f19..f838f29e3eb 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -6,7 +6,7 @@ datatype: test --- -Unit tests validate your SQL modeling logic on a small set of static inputs before you materialize your full model in production. They support a test-driven development approach, improving both the efficiency of developers and code reliability. +Unit tests validate your SQL modeling logic on a small set of static inputs before you materialize your full model in production. They support a test-driven development approach, improving both the efficiency of developers and reliability of code. To run only your unit tests, use the command: `dbt test --select test_type:unit` From 7b3f23b2fb945d0760fbc229ae9f33ea8c25cf27 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 20:15:18 -0500 Subject: [PATCH 089/121] Update website/docs/reference/resource-properties/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/reference/resource-properties/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index f838f29e3eb..7b0a030689e 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -56,7 +56,7 @@ unit_tests: ### About writing unit tests Unit tests are currently limited to testing SQL models and only models in your current project. When writing your unit tests, keep the following in mind: -- If your model has multiple versions, be default the unit test will run on *all* versions of your model. To specify version(s) of your model to unit test, `include` or `exclude` the desired versions in your model versions config: +- If your model has multiple versions, the default unit test will run on *all* versions of your model. To specify version(s) of your model to unit test, use `include` or `exclude` for the desired versions in your model versions config: ```yaml From ef9ceeeafb8e2fe27494cd547414cad130325c24 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 20:15:40 -0500 Subject: [PATCH 090/121] Update website/docs/reference/resource-properties/unit-tests.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/reference/resource-properties/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 7b0a030689e..36f282b76b1 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -53,7 +53,7 @@ unit_tests: -### About writing unit tests +## About writing unit tests Unit tests are currently limited to testing SQL models and only models in your current project. When writing your unit tests, keep the following in mind: - If your model has multiple versions, the default unit test will run on *all* versions of your model. To specify version(s) of your model to unit test, use `include` or `exclude` for the desired versions in your model versions config: From d6b4fa14f7aac41415fa2844e10a2767475df53b Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Tue, 13 Feb 2024 20:16:35 -0500 Subject: [PATCH 091/121] Apply suggestions from code review Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/reference/resource-properties/unit-tests.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 36f282b76b1..575f6f35345 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -88,7 +88,7 @@ unit-tests: ### Format --When using `format: dict` you must supply an in-line dictionary for `rows:` (this is the default, if you don’t specify a `format`) +When using `format: dict` you must supply an in-line dictionary for `rows:` (this is the default, if you don’t specify a `format`) ```yml @@ -104,7 +104,7 @@ unit_tests: ``` -- When `format: csv`, can either supply: +When `format: csv`, can either supply: - An inline csv string for `rows:` ```yaml @@ -142,6 +142,8 @@ unit_tests: 2,michelle ``` +### Input + - `input:` string that represents a `ref` or `source` call: - `ref('my_model')` or `ref('my_model', v='2')` or `ref('dougs_project', 'users')` - `source('source_schema', 'source_name')` @@ -150,7 +152,7 @@ unit_tests: - If you do supply an input for a seed, we will use that input instead. - You can also have “empty” inputs, by setting rows to an empty list `rows: []` -Examples: +### Examples ```yml unit_tests: From a32998c835732e90100c7803774ed62b2010b1f9 Mon Sep 17 00:00:00 2001 From: Jeremy Cohen Date: Wed, 14 Feb 2024 16:26:37 +0100 Subject: [PATCH 092/121] Update snippet --- website/snippets/_config-dbt-version-check.md | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/website/snippets/_config-dbt-version-check.md b/website/snippets/_config-dbt-version-check.md index cff9d9c7bf7..d0038085d2c 100644 --- a/website/snippets/_config-dbt-version-check.md +++ b/website/snippets/_config-dbt-version-check.md @@ -1,6 +1,21 @@ -Starting in 2024, when you select **Keep on latest version** in dbt Cloud, it will ignore version checking. However, if you're not using this configuration, dbt Labs recommends: -- **Writing defensive code** — If you're developing dbt code that could be run in a variety of execution contexts (such as a package) and you depend on newer dbt functionality, you can add conditional logic that checks for the presence of other packages or macros. -- **Pinning packages** — If you're maintaining a dbt project that installs third-party packages and are concerned about the potential for breaking changes in those packages, you should pin the package to a specific revision or `version` boundary. Since v1.7, this is the default dbt behavior, by _locking_ the version/revision of packages in development in order to guarantee predictable builds in production. +Starting in 2024, when you select **Keep on latest version** in dbt Cloud, dbt will ignore the `require-dbt-version` config. + +dbt Labs is committed to zero breaking changes for code in dbt projects, with ongoing releases to dbt Cloud and new versions of dbt Core. We also recommend some best practices for your peace of mind: +- **If you install dbt packages** for use in your project, whether the package is maintained by your colleagues or a member of the open source dbt community, we recommend pinning the package to a specific revision or `version` boundary. Since v1.7, dbt manages this out-of-the-box, by _locking_ the version/revision of packages in development in order to guarantee predictable builds in production. To learn more, refer to [Predictable Package Installs](/reference/commands/deps#predictable-package-installs). +- **If you maintain dbt packages**, whether on behalf of your colleagues or members of the open source community, we recommend writing defensive code that checks to verify that other required packages and global macros are available. For example, if your package depends on the availability of a `date_spine` macro in the global `dbt` namespace, you can write: + + + +```sql +{% if dbt.get('date_spine') %} + {{ exceptions.raise_compiler_error("Expected to find the dbt.date_spine macro, but it could not be found") }} +{% endif %} + +{{ date_spine("day", "'2023-09-01'::date", "'2023-09-10'::date") }} +``` + + + To learn more, refer to [Keep on latest version](/docs/dbt-versions/upgrade-core-in-cloud##keep-on-latest-version) which is available as a beta. \ No newline at end of file From 6af69738ce991898be6da75e4d6ecc7aaa1b33e0 Mon Sep 17 00:00:00 2001 From: Jeremy Cohen Date: Wed, 14 Feb 2024 16:31:20 +0100 Subject: [PATCH 093/121] Propose changes to release note --- .../release-notes/72-Feb-2024/keep-on-latest-version.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md b/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md index 5ef1c766d94..7ea28a15ef1 100644 --- a/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md +++ b/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md @@ -9,7 +9,7 @@ date: 2024-02-14 # New: Keep on latest version -Now available as a beta is the new **Keep on latest version** setting in dbt Cloud. +_Now available in the dbt version dropdown in dbt Cloud. Starting with select customers, rolling out to wider avaiability through February and March._ When enabled, you always get the latest fixes and early access to new functionality for your dbt project. dbt Labs will handle upgrades behind-the-scenes, as part of testing and redeploying the dbt Cloud application — just like other dbt Cloud capabilities and other SaaS tools that you're using. No more manual upgrades and no more need for _a second sandbox project_. From 84175fb5698517bba1d1d53d5e486773df979d9e Mon Sep 17 00:00:00 2001 From: Ly Nguyen Date: Wed, 14 Feb 2024 09:17:57 -0800 Subject: [PATCH 094/121] Minor update to release note --- .../release-notes/72-Feb-2024/keep-on-latest-version.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md b/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md index 7ea28a15ef1..f07ef1d0561 100644 --- a/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md +++ b/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md @@ -9,9 +9,9 @@ date: 2024-02-14 # New: Keep on latest version -_Now available in the dbt version dropdown in dbt Cloud. Starting with select customers, rolling out to wider avaiability through February and March._ +_Now available in the dbt version dropdown in dbt Cloud. We're starting with select customers, rolling out to wider avaiability through February and March._ -When enabled, you always get the latest fixes and early access to new functionality for your dbt project. dbt Labs will handle upgrades behind-the-scenes, as part of testing and redeploying the dbt Cloud application — just like other dbt Cloud capabilities and other SaaS tools that you're using. No more manual upgrades and no more need for _a second sandbox project_. +When the new **Keep on latest version** setting is enabled, you always get the latest fixes and early access to new functionality for your dbt project. dbt Labs will handle upgrades behind-the-scenes, as part of testing and redeploying the dbt Cloud application — just like other dbt Cloud capabilities and other SaaS tools that you're using. No more manual upgrades and no more need for _a second sandbox project_. To learn more about the new setting, refer to [Keep on latest version](/docs/dbt-versions/upgrade-core-in-cloud#keep-on-latest-version) for details. From 24312b3f07dc958dfcabfdf6444a34ae9b2eaadf Mon Sep 17 00:00:00 2001 From: mirnawong1 Date: Wed, 14 Feb 2024 17:28:54 +0000 Subject: [PATCH 095/121] update to accept strings + commas --- website/src/components/lifeCycle/index.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/website/src/components/lifeCycle/index.js b/website/src/components/lifeCycle/index.js index d4e4eab88d8..88bc6f12e4b 100644 --- a/website/src/components/lifeCycle/index.js +++ b/website/src/components/lifeCycle/index.js @@ -22,8 +22,10 @@ export default function Lifecycle(props) { if (!props.status || (Array.isArray(props.status) && props.status.length === 0)) { return null; } - // Check if props.status is an array or a single value - const statuses = Array.isArray(props.status) ? props.status : [props.status]; + // Check if props.status is an array or a single value amd to handle strings separated by commas + const statuses = typeof props.status ==='string' + ?props.status.split(',').map(s => s.trim()) + : Array.isArray(props.status) ? props.status : [props.status]; return ( <> From 487b1583541de3e576fc8f7adc778b02d5a56ed7 Mon Sep 17 00:00:00 2001 From: mirnawong1 Date: Wed, 14 Feb 2024 17:32:17 +0000 Subject: [PATCH 096/121] test pr --- website/docs/docs/use-dbt-semantic-layer/quickstart-sl.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/docs/docs/use-dbt-semantic-layer/quickstart-sl.md b/website/docs/docs/use-dbt-semantic-layer/quickstart-sl.md index 11a610805a9..4abe185d2d8 100644 --- a/website/docs/docs/use-dbt-semantic-layer/quickstart-sl.md +++ b/website/docs/docs/use-dbt-semantic-layer/quickstart-sl.md @@ -8,6 +8,8 @@ meta: api_name: dbt Semantic Layer APIs --- +### test + import CreateModel from '/snippets/_sl-create-semanticmodel.md'; import DefineMetrics from '/snippets/_sl-define-metrics.md'; import ConfigMetric from '/snippets/_sl-configure-metricflow.md'; From 0e1c014c3ee3fab7f31236c56b7d1ca0d170f99b Mon Sep 17 00:00:00 2001 From: Ly Nguyen Date: Wed, 14 Feb 2024 09:45:03 -0800 Subject: [PATCH 097/121] Feedback --- .../72-Feb-2024/keep-on-latest-version.md | 2 +- .../global-configs/version-compatibility.md | 2 +- .../reference/project-configs/require-dbt-version.md | 2 +- website/snippets/_config-dbt-version-check.md | 12 +++++------- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md b/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md index f07ef1d0561..dc0d118484a 100644 --- a/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md +++ b/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md @@ -9,7 +9,7 @@ date: 2024-02-14 # New: Keep on latest version -_Now available in the dbt version dropdown in dbt Cloud. We're starting with select customers, rolling out to wider avaiability through February and March._ +_Now available in the dbt version dropdown in dbt Cloud — starting with select customers, rolling out to wider avaiability through February and March._ When the new **Keep on latest version** setting is enabled, you always get the latest fixes and early access to new functionality for your dbt project. dbt Labs will handle upgrades behind-the-scenes, as part of testing and redeploying the dbt Cloud application — just like other dbt Cloud capabilities and other SaaS tools that you're using. No more manual upgrades and no more need for _a second sandbox project_. diff --git a/website/docs/reference/global-configs/version-compatibility.md b/website/docs/reference/global-configs/version-compatibility.md index 697717deb32..1abbbe3c86a 100644 --- a/website/docs/reference/global-configs/version-compatibility.md +++ b/website/docs/reference/global-configs/version-compatibility.md @@ -14,7 +14,7 @@ Running with dbt=1.0.0 Found 13 models, 2 tests, 1 archives, 0 analyses, 204 macros, 2 operations.... ``` -:::info Keep with latest version +:::info Keep with latest version ::: diff --git a/website/docs/reference/project-configs/require-dbt-version.md b/website/docs/reference/project-configs/require-dbt-version.md index dd020412b8e..0289300c9ff 100644 --- a/website/docs/reference/project-configs/require-dbt-version.md +++ b/website/docs/reference/project-configs/require-dbt-version.md @@ -22,7 +22,7 @@ When you set this configuration, dbt sends a helpful error message for any user If this configuration is not specified, no version check will occur. -:::info Keep on latest version +:::info Keep on latest version diff --git a/website/snippets/_config-dbt-version-check.md b/website/snippets/_config-dbt-version-check.md index d0038085d2c..237e501ed6b 100644 --- a/website/snippets/_config-dbt-version-check.md +++ b/website/snippets/_config-dbt-version-check.md @@ -1,9 +1,10 @@ -Starting in 2024, when you select **Keep on latest version** in dbt Cloud, dbt will ignore the `require-dbt-version` config. +Starting in 2024, when you select **Keep on latest version** in dbt Cloud, dbt will ignore the `require-dbt-version` config. Refer to [Keep on latest version](/docs/dbt-versions/upgrade-core-in-cloud##keep-on-latest-version) (available as a beta) for more details. -dbt Labs is committed to zero breaking changes for code in dbt projects, with ongoing releases to dbt Cloud and new versions of dbt Core. We also recommend some best practices for your peace of mind: -- **If you install dbt packages** for use in your project, whether the package is maintained by your colleagues or a member of the open source dbt community, we recommend pinning the package to a specific revision or `version` boundary. Since v1.7, dbt manages this out-of-the-box, by _locking_ the version/revision of packages in development in order to guarantee predictable builds in production. To learn more, refer to [Predictable Package Installs](/reference/commands/deps#predictable-package-installs). -- **If you maintain dbt packages**, whether on behalf of your colleagues or members of the open source community, we recommend writing defensive code that checks to verify that other required packages and global macros are available. For example, if your package depends on the availability of a `date_spine` macro in the global `dbt` namespace, you can write: +dbt Labs is committed to zero breaking changes for code in dbt projects, with ongoing releases to dbt Cloud and new versions of dbt Core. We also recommend these best practices: + +- **If you install dbt packages** — for use in your project, whether the package is maintained by your colleagues or a member of the open source dbt community, we recommend pinning the package to a specific revision or `version` boundary. Since v1.7, dbt manages this out-of-the-box by _locking_ the version/revision of packages in development in order to guarantee predictable builds in production. To learn more, refer to [Predictable package installs](/reference/commands/deps#predictable-package-installs). +- **If you maintain dbt packages** — whether on behalf of your colleagues or members of the open source community, we recommend writing defensive code that checks to verify that other required packages and global macros are available. For example, if your package depends on the availability of a `date_spine` macro in the global `dbt` namespace, you can write: @@ -16,6 +17,3 @@ dbt Labs is committed to zero breaking changes for code in dbt projects, with on ``` - - -To learn more, refer to [Keep on latest version](/docs/dbt-versions/upgrade-core-in-cloud##keep-on-latest-version) which is available as a beta. \ No newline at end of file From 8503acd764b68376fa06559fe8f97b4938706e69 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Wed, 14 Feb 2024 13:26:37 -0500 Subject: [PATCH 098/121] Apply suggestions from code review Co-authored-by: Grace Goheen <53586774+graciegoheen@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index de7c560a924..3acaa14a018 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -141,8 +141,8 @@ Alternatively, use `dbt build` to, in lineage order: Now you’re ready to run this unit test. You have a couple of options for commands depending on how specific you want to be: -- `dbt test —-select dim_customers` runs _all_ of the tests on `dim_customers`. -- `dbt test —-select "dim_customers,test_type:unit"` runs all of the _unit_ tests on `dim_customers`. +- `dbt test --select dim_customers` runs _all_ of the tests on `dim_customers`. +- `dbt test --select "dim_customers,test_type:unit"` runs all of the _unit_ tests on `dim_customers`. - `dbt test —-select test_is_valid_email_address` runs the test named `test_is_valid_email_address`. ```bash From a1b361449913408f4ffc4c724ca26b6d7d545ad3 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Wed, 14 Feb 2024 13:27:54 -0500 Subject: [PATCH 099/121] Update website/docs/docs/build/unit-tests.md Co-authored-by: Grace Goheen <53586774+graciegoheen@users.noreply.github.com> --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 3acaa14a018..50adebcc885 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -179,7 +179,7 @@ actual differs from expected: ``` -The clever regex statement wasn’t as clever as initially thought, as the model incorrectly flagged `missingdot@gmailcom` as a valid email address. +The clever regex statement wasn’t as clever as initially thought, as the model incorrectly flagged `cool@example.com` (customer 1's email) as an invalid email address. Updating the regex logic to `'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'` (those pesky escape characters) and rerunning the unit test solves the problem: From ee1212f98fff72fbad80d1e7d3516e95caf071f6 Mon Sep 17 00:00:00 2001 From: mirnawong1 Date: Wed, 14 Feb 2024 18:30:11 +0000 Subject: [PATCH 100/121] fold in jason's feedback --- .../docs/docs/use-dbt-semantic-layer/quickstart-sl.md | 2 -- website/src/components/lifeCycle/index.js | 9 +++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/website/docs/docs/use-dbt-semantic-layer/quickstart-sl.md b/website/docs/docs/use-dbt-semantic-layer/quickstart-sl.md index 4abe185d2d8..11a610805a9 100644 --- a/website/docs/docs/use-dbt-semantic-layer/quickstart-sl.md +++ b/website/docs/docs/use-dbt-semantic-layer/quickstart-sl.md @@ -8,8 +8,6 @@ meta: api_name: dbt Semantic Layer APIs --- -### test - import CreateModel from '/snippets/_sl-create-semanticmodel.md'; import DefineMetrics from '/snippets/_sl-define-metrics.md'; import ConfigMetric from '/snippets/_sl-configure-metricflow.md'; diff --git a/website/src/components/lifeCycle/index.js b/website/src/components/lifeCycle/index.js index 88bc6f12e4b..0c6978582e3 100644 --- a/website/src/components/lifeCycle/index.js +++ b/website/src/components/lifeCycle/index.js @@ -19,13 +19,14 @@ const fontColors = { }; export default function Lifecycle(props) { + const statuses = props.status?.split(',') + if (!statuses?.length) { + return null; + } + if (!props.status || (Array.isArray(props.status) && props.status.length === 0)) { return null; } - // Check if props.status is an array or a single value amd to handle strings separated by commas - const statuses = typeof props.status ==='string' - ?props.status.split(',').map(s => s.trim()) - : Array.isArray(props.status) ? props.status : [props.status]; return ( <> From ba74fe5632dfdf6350bfe0cc92d2bce7b443fc92 Mon Sep 17 00:00:00 2001 From: Grace Goheen <53586774+graciegoheen@users.noreply.github.com> Date: Wed, 14 Feb 2024 12:08:47 -0700 Subject: [PATCH 101/121] Apply suggestions from code review --- website/docs/docs/build/unit-tests.md | 40 ++++++------ website/docs/reference/commands/test.md | 8 +-- .../resource-properties/unit-tests.md | 61 ++++++++++--------- 3 files changed, 56 insertions(+), 53 deletions(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 50adebcc885..86efe423b25 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -127,7 +127,7 @@ Use the `--empty` flag to build an empty version of the models to save warehouse ```bash -dbt run —-select "stg_customers top_level_email_domains" --empty +dbt run --select "stg_customers top_level_email_domains" --empty ``` @@ -143,7 +143,7 @@ Now you’re ready to run this unit test. You have a couple of options for comma - `dbt test --select dim_customers` runs _all_ of the tests on `dim_customers`. - `dbt test --select "dim_customers,test_type:unit"` runs all of the _unit_ tests on `dim_customers`. -- `dbt test —-select test_is_valid_email_address` runs the test named `test_is_valid_email_address`. +- `dbt test --select test_is_valid_email_address` runs the test named `test_is_valid_email_address`. ```bash @@ -192,8 +192,8 @@ dbt test --select test_is_valid_email_address 16:09:12 16:09:13 Concurrency: 5 threads (target='postgres') 16:09:13 -16:09:13 1 of 1 START unit_test dim_wizards::test_is_valid_email_address ................... [RUN] -16:09:13 1 of 1 PASS dim_wizards::test_is_valid_email_address .............................. [PASS in 0.26s] +16:09:13 1 of 1 START unit_test dim_customers::test_is_valid_email_address ................... [RUN] +16:09:13 1 of 1 PASS dim_customers::test_is_valid_email_address .............................. [PASS in 0.26s] 16:09:13 16:09:13 Finished running 1 unit_test in 0 hours 0 minutes and 0.75 seconds (0.75s). 16:09:13 @@ -208,47 +208,49 @@ Your model is now ready for production! Adding this unit test helped catch an is ## Unit testing versioned models When a unit test is added to a model, it will run on all versions of the model by default. -Using the example in this article, if you have versions 1, 2, and 3 of `my_model`, the `my test_is_valid_email_address` unit test will run on all 3 versions. +Using the example in this article, if you have versions 1, 2, and 3 of `dim_customers`, the `test_is_valid_email_address` unit test will run on all 3 versions. To only unit test a specific version (or versions) of a model, include the desired version(s) in the model config: ```yml -unit-tests: - - name: test_is_valid_email_address # this is the unique name of the test - model: my_model # name of the model I'm unit testing +unit_tests:: + - name: test_is_valid_email_address + model: dim_customers versions: include: - 2 - given: # optional: list of inputs to provide as fixtures + ... ``` -In this scenario, if you have version 1, 2, and 3 of `my_model`, `my test_is_valid_email_address` unit test will run on _only_ version 2. +In this scenario, if you have version 1, 2, and 3 of `dim_customers `, my `test_is_valid_email_address` unit test will run on _only_ version 2. To unit test all versions except a specific version (or versions) of a model, you can exclude the relevant version(s) in the model config: ```yml -unit-tests: - - name: test_is_valid_email_address # this is the unique name of the test - model: my_model # name of the model I'm unit testing +unit_tests: + - name: test_is_valid_email_address + model: dim_customers versions: exclude: - 1 - given: # optional: list of inputs to provide as fixtures + ... ``` -So, if you have versions 1, 2, and 3 of `my_model`, your `test_is_valid_email_address` unit test will run on _only_ versions 2 and 3. +So, if you have versions 1, 2, and 3 of `dim_customers`, your `test_is_valid_email_address` unit test will run on _only_ versions 2 and 3. If you want to unit test a model that references the pinned version of the model, you should specify that in the `ref` of your input: ```yml -unit-tests: - - name: test_is_valid_email_address # this is the unique name of the test - model: my_model # name of the model I am unit testing - given: # optional: list of inputs to provide as fixtures +unit_tests: + - name: test_is_valid_email_address + model: dim_customers + given: + - input: ref('stg_customers', v=1) + ... ``` diff --git a/website/docs/reference/commands/test.md b/website/docs/reference/commands/test.md index c62e0071484..2203cc09faa 100644 --- a/website/docs/reference/commands/test.md +++ b/website/docs/reference/commands/test.md @@ -61,11 +61,11 @@ dbt test --select "test_type:singular" # run only data tests defined generically dbt test --select "test_type:generic" -# run singular data tests limited to one_specific_model -dbt test --select "one_specific_model,test_type:singular" +# run data tests limited to one_specific_model +dbt test --select "one_specific_model,test_type:data" -# run generic data tests limited to one_specific_model -dbt test --select "one_specific_model,test_type:generic" +# run unit tests limited to one_specific_model +dbt test --select "one_specific_model,test_type:unit" ``` For more information on writing tests, read the [data testing](/docs/build/tests) and [unit testing](/docs/build/unit-tests) documentation. diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 575f6f35345..64744b98918 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -55,34 +55,36 @@ unit_tests: ## About writing unit tests -Unit tests are currently limited to testing SQL models and only models in your current project. When writing your unit tests, keep the following in mind: -- If your model has multiple versions, the default unit test will run on *all* versions of your model. To specify version(s) of your model to unit test, use `include` or `exclude` for the desired versions in your model versions config: +Unit tests are currently limited to testing SQL models and only models in your current project. + +### Versions +If your model has multiple versions, the default unit test will run on *all* versions of your model. To specify version(s) of your model to unit test, use `include` or `exclude` for the desired versions in your model versions config: ```yaml # my test_is_valid_email_address unit test will run on all versions of my_model -unit-tests: +unit_tests: - name: test_is_valid_email_address model: my_model -... + ... # my test_is_valid_email_address unit test will run on ONLY version 2 of my_model -unit-tests: +unit_tests: - name: test_is_valid_email_address model: my_model versions: include: - 2 -... + ... # my test_is_valid_email_address unit test will run on all versions EXCEPT 1 of my_model -unit-tests: +unit_tests: - name: test_is_valid_email_address model: my_model versions: exclude: - 1 -... + ... ``` @@ -101,7 +103,7 @@ unit_tests: rows: - {id: 1, name: gerda} - {id: 2, b: michelle} - + ... ``` When `format: csv`, can either supply: @@ -118,7 +120,6 @@ When `format: csv`, can either supply: id,name 1,gerda 2,michelle - ... ``` @@ -152,29 +153,29 @@ When `format: csv`, can either supply: - If you do supply an input for a seed, we will use that input instead. - You can also have “empty” inputs, by setting rows to an empty list `rows: []` -### Examples +## Examples ```yml unit_tests: - name: test_is_valid_email_address # this is the unique name of the test - model: my_model # name of the model I'm unit testing + model: dim_customers # name of the model I'm unit testing given: # the mock data for your inputs - - input: ref('users') + - input: ref('stg_customers') rows: - - {user_id: 1, email: cool@example.com, email_top_level_domain: example.com} - - {user_id: 2, email: cool@unknown.com, email_top_level_domain: unknown.com} - - {user_id: 3, email: badgmail.com, email_top_level_domain: gmail.com} - - {user_id: 4, email: missingdot@gmailcom, email_top_level_domain: gmail.com} - - input: ref('top_level_domains') + - {customer_id: 1, email: cool@example.com, email_top_level_domain: example.com} + - {customer_id: 2, email: cool@unknown.com, email_top_level_domain: unknown.com} + - {customer_id: 3, email: badgmail.com, email_top_level_domain: gmail.com} + - {customer_id: 4, email: missingdot@gmailcom, email_top_level_domain: gmail.com} + - input: ref('top_level_email_domains') rows: - {tld: example.com} - {tld: gmail.com} expect: # the expected output given the inputs above rows: - - {user_id: 1, is_valid_email_address: true} - - {user_id: 2, is_valid_email_address: false} - - {user_id: 3, is_valid_email_address: false} - - {user_id: 4, is_valid_email_address: false} + - {customer_id: 1, is_valid_email_address: true} + - {customer_id: 2, is_valid_email_address: false} + - {customer_id: 3, is_valid_email_address: false} + - {customer_id: 4, is_valid_email_address: false} ``` @@ -182,15 +183,15 @@ unit_tests: unit_tests: - name: test_is_valid_email_address # this is the unique name of the test - model: my_model # name of the model I'm unit testing + model: dim_customers # name of the model I'm unit testing given: # the mock data for your inputs - - input: ref('users') + - input: ref('stg_customers') rows: - - {user_id: 1, email: cool@example.com, email_top_level_domain: example.com} - - {user_id: 2, email: cool@unknown.com, email_top_level_domain: unknown.com} - - {user_id: 3, email: badgmail.com, email_top_level_domain: gmail.com} - - {user_id: 4, email: missingdot@gmailcom, email_top_level_domain: gmail.com} - - input: ref('top_level_domains') + - {customer_id: 1, email: cool@example.com, email_top_level_domain: example.com} + - {customer_id: 2, email: cool@unknown.com, email_top_level_domain: unknown.com} + - {customer_id: 3, email: badgmail.com, email_top_level_domain: gmail.com} + - {customer_id: 4, email: missingdot@gmailcom, email_top_level_domain: gmail.com} + - input: ref('top_level_email_domains') format: csv rows: | tld @@ -198,6 +199,6 @@ unit_tests: gmail.com expect: # the expected output given the inputs above format: csv - fixture: my_model_fixture + fixture: valid_email_address_fixture_output ``` From e5b18a16b89e4e05a0a303c23c2d78b42c558f18 Mon Sep 17 00:00:00 2001 From: Ly Nguyen Date: Wed, 14 Feb 2024 11:13:24 -0800 Subject: [PATCH 102/121] Rename file --- .../2021-11-23-how-to-upgrade-dbt-versions.md | 2 +- .../best-practices/clone-incremental-models.md | 2 +- .../best-practices/how-we-mesh/mesh-4-faqs.md | 2 +- website/docs/docs/build/about-metricflow.md | 2 +- .../docs/docs/cloud/cloud-cli-installation.md | 2 +- website/docs/docs/cloud/configure-cloud-cli.md | 2 +- .../core-upgrade/01-upgrading-to-v1.8.md | 4 ++-- .../core-upgrade/02-upgrading-to-v1.7.md | 2 +- .../core-upgrade/03-upgrading-to-v1.6.md | 2 +- .../core-upgrade/05-upgrading-to-v1.5.md | 2 +- .../core-upgrade/06-upgrading-to-v1.4.md | 2 +- .../core-upgrade/07-upgrading-to-v1.3.md | 2 +- .../core-upgrade/08-upgrading-to-v1.2.md | 2 +- .../core-upgrade/09-upgrading-to-v1.1.md | 2 +- .../core-upgrade/10-upgrading-to-v1.0.md | 2 +- website/docs/docs/dbt-versions/core-versions.md | 10 +++++----- .../72-Feb-2024/keep-on-latest-version.md | 2 +- .../72-Feb-2024/override-dbt-version.md | 2 +- .../release-notes/74-Dec-2023/legacy-sl.md | 2 +- .../release-notes/76-Oct-2023/sl-ga.md | 2 +- .../release-notes/78-Aug-2023/sl-revamp-beta.md | 2 +- .../81-May-2023/may-ide-updates.md | 2 +- .../83-Mar-2023/1.0-deprecation.md | 2 +- ...cloud.md => upgrade-dbt-version-in-cloud.md} | 12 ++++++------ website/docs/docs/deploy/retry-jobs.md | 2 +- .../docs/docs/use-dbt-semantic-layer/exports.md | 2 +- website/sidebars.js | 2 +- website/snippets/_cloud-environments-info.md | 2 +- website/snippets/_config-dbt-version-check.md | 2 +- website/snippets/_new-sl-setup.md | 2 +- website/snippets/_sl-deprecation-notice.md | 2 +- website/snippets/_sl-faqs.md | 2 +- website/snippets/_v2-sl-prerequisites.md | 2 +- .../Environment-settings.png | Bin 30262 -> 0 bytes website/vercel.json | 11 ++++++++--- 35 files changed, 51 insertions(+), 46 deletions(-) rename website/docs/docs/dbt-versions/{upgrade-core-in-cloud.md => upgrade-dbt-version-in-cloud.md} (92%) delete mode 100644 website/static/img/docs/dbt-cloud/cloud-configuring-dbt-cloud/choosing-dbt-version/Environment-settings.png diff --git a/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md b/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md index 517fbcf6b85..ceccfe86196 100644 --- a/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md +++ b/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md @@ -16,7 +16,7 @@ is_featured: true It's been a few years since dbt-core turned 1.0! Since then, we've committed to releasing zero breaking changes whenever possible and it's become much easier to upgrade dbt Core versions. -Now, we're taking it one step further by introducing **Keep on latest version** in dbt Cloud (currently available to select customers). No more manual upgrades and no more need for "a second sandbox project." For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). +Now, we're taking it one step further by introducing **Keep on latest version** in dbt Cloud (currently available to select customers). No more manual upgrades and no more need for "a second sandbox project." For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-dbt-version-in-cloud). We're leaving the rest of this post as is, so we can all remember how it used to be. Enjoy a stroll down memory lane. diff --git a/website/docs/best-practices/clone-incremental-models.md b/website/docs/best-practices/clone-incremental-models.md index 11075b92161..b3b037847ae 100644 --- a/website/docs/best-practices/clone-incremental-models.md +++ b/website/docs/best-practices/clone-incremental-models.md @@ -7,7 +7,7 @@ hoverSnippet: Learn how to clone incremental models for CI jobs. --- Before you begin, you must be aware of a few conditions: -- `dbt clone` is only available with dbt version 1.6 and newer. Refer to our [upgrade guide](/docs/dbt-versions/upgrade-core-in-cloud) for help enabling newer versions in dbt Cloud +- `dbt clone` is only available with dbt version 1.6 and newer. Refer to our [upgrade guide](/docs/dbt-versions/upgrade-dbt-version-in-cloud) for help enabling newer versions in dbt Cloud - This strategy only works for warehouse that support zero copy cloning (otherwise `dbt clone` will just create pointer views). - Some teams may want to test that their incremental models run in both incremental mode and full-refresh mode. diff --git a/website/docs/best-practices/how-we-mesh/mesh-4-faqs.md b/website/docs/best-practices/how-we-mesh/mesh-4-faqs.md index 2b11c3563eb..2f984da9d04 100644 --- a/website/docs/best-practices/how-we-mesh/mesh-4-faqs.md +++ b/website/docs/best-practices/how-we-mesh/mesh-4-faqs.md @@ -273,7 +273,7 @@ The [dbt Cloud CLI](/docs/cloud/cloud-cli-installation) allows users to develop -Yes, your account must be on [at least dbt v1.6](/docs/dbt-versions/upgrade-core-in-cloud) to take advantage of [cross-project dependencies](/docs/collaborate/govern/project-dependencies), one of the most crucial underlying capabilities required to implement a dbt Mesh. +Yes, your account must be on [at least dbt v1.6](/docs/dbt-versions/upgrade-dbt-version-in-cloud) to take advantage of [cross-project dependencies](/docs/collaborate/govern/project-dependencies), one of the most crucial underlying capabilities required to implement a dbt Mesh. diff --git a/website/docs/docs/build/about-metricflow.md b/website/docs/docs/build/about-metricflow.md index 19d27bc60d2..fc83af63306 100644 --- a/website/docs/docs/build/about-metricflow.md +++ b/website/docs/docs/build/about-metricflow.md @@ -15,7 +15,7 @@ MetricFlow handles SQL query construction and defines the specification for dbt Before you start, consider the following guidelines: - Define metrics in YAML and query them using these [new metric specifications](https://github.com/dbt-labs/dbt-core/discussions/7456). -- You must be on [dbt version](/docs/dbt-versions/upgrade-core-in-cloud) 1.6 or higher to use MetricFlow. +- You must be on [dbt version](/docs/dbt-versions/upgrade-dbt-version-in-cloud) 1.6 or higher to use MetricFlow. - Use MetricFlow with Snowflake, BigQuery, Databricks, Postgres (dbt Core only), or Redshift. - Discover insights and query your metrics using the [dbt Semantic Layer](/docs/use-dbt-semantic-layer/dbt-sl) and its diverse range of [available integrations](/docs/use-dbt-semantic-layer/avail-sl-integrations). diff --git a/website/docs/docs/cloud/cloud-cli-installation.md b/website/docs/docs/cloud/cloud-cli-installation.md index e66642067b6..308e879be6e 100644 --- a/website/docs/docs/cloud/cloud-cli-installation.md +++ b/website/docs/docs/cloud/cloud-cli-installation.md @@ -25,7 +25,7 @@ dbt commands are run against dbt Cloud's infrastructure and benefit from: ## Prerequisites The dbt Cloud CLI is available in all [deployment regions](/docs/cloud/about-cloud/access-regions-ip-addresses) and for both multi-tenant and single-tenant accounts (Azure single-tenant not supported at this time). -- Ensure you are using dbt version 1.5 or higher. Refer to [dbt Cloud versions](/docs/dbt-versions/upgrade-core-in-cloud) to upgrade. +- Ensure you are using dbt version 1.5 or higher. Refer to [dbt Cloud versions](/docs/dbt-versions/upgrade-dbt-version-in-cloud) to upgrade. - Note that SSH tunneling for [Postgres and Redshift](/docs/cloud/connect-data-platform/connect-redshift-postgresql-alloydb) connections doesn't support the dbt Cloud CLI yet. ## Install dbt Cloud CLI diff --git a/website/docs/docs/cloud/configure-cloud-cli.md b/website/docs/docs/cloud/configure-cloud-cli.md index 7a673d4a18a..8966080dc0a 100644 --- a/website/docs/docs/cloud/configure-cloud-cli.md +++ b/website/docs/docs/cloud/configure-cloud-cli.md @@ -15,7 +15,7 @@ import CloudCLIFlag from '/snippets/_cloud-cli-flag.md'; - You must set up a project in dbt Cloud. - **Note** — If you're using the dbt Cloud CLI, you can connect to your [data platform](/docs/cloud/connect-data-platform/about-connections) directly in the dbt Cloud interface and don't need a [`profiles.yml`](/docs/core/connect-data-platform/profiles.yml) file. - You must have your [personal development credentials](/docs/dbt-cloud-environments#set-developer-credentials) set for that project. The dbt Cloud CLI will use these credentials, stored securely in dbt Cloud, to communicate with your data platform. -- You must be on dbt version 1.5 or higher. Refer to [dbt Cloud versions](/docs/dbt-versions/upgrade-core-in-cloud) to upgrade. +- You must be on dbt version 1.5 or higher. Refer to [dbt Cloud versions](/docs/dbt-versions/upgrade-dbt-version-in-cloud) to upgrade. ## Configure the dbt Cloud CLI diff --git a/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md b/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md index dfa534130fa..5b14d91d59d 100644 --- a/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md +++ b/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md @@ -9,12 +9,12 @@ displayed_sidebar: "docs" - Changelog (coming soon) - [CLI Installation guide](/docs/core/installation-overview) -- [Cloud upgrade guide](/docs/dbt-versions/upgrade-core-in-cloud) +- [Cloud upgrade guide](/docs/dbt-versions/upgrade-dbt-version-in-cloud) - Release schedule (coming soon) :::tip Keep on latest version, always -Starting this year, let dbt Labs handle version upgrades for you. With dbt Cloud, you can get early access to new functionality before it lands in the final release of dbt Core v1.8 and without the need of managing your own version upgrades. For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-core-in-cloud). +Starting this year, let dbt Labs handle version upgrades for you. With dbt Cloud, you can get early access to new functionality before it lands in the final release of dbt Core v1.8 and without the need of managing your own version upgrades. For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-dbt-version-in-cloud). The **Keep on latest version** setting is currently available in beta for select dbt Cloud customers. The first beta release of dbt-core v1.8 is planned for February 28. diff --git a/website/docs/docs/dbt-versions/core-upgrade/02-upgrading-to-v1.7.md b/website/docs/docs/dbt-versions/core-upgrade/02-upgrading-to-v1.7.md index 1f40aaa9f40..1346d610385 100644 --- a/website/docs/docs/dbt-versions/core-upgrade/02-upgrading-to-v1.7.md +++ b/website/docs/docs/dbt-versions/core-upgrade/02-upgrading-to-v1.7.md @@ -9,7 +9,7 @@ displayed_sidebar: "docs" - [Changelog](https://github.com/dbt-labs/dbt-core/blob/8aaed0e29f9560bc53d9d3e88325a9597318e375/CHANGELOG.md) - [CLI Installation guide](/docs/core/installation-overview) -- [Cloud upgrade guide](/docs/dbt-versions/upgrade-core-in-cloud) +- [Cloud upgrade guide](/docs/dbt-versions/upgrade-dbt-version-in-cloud) - [Release schedule](https://github.com/dbt-labs/dbt-core/issues/8260) ## What to know before upgrading diff --git a/website/docs/docs/dbt-versions/core-upgrade/03-upgrading-to-v1.6.md b/website/docs/docs/dbt-versions/core-upgrade/03-upgrading-to-v1.6.md index a70f220edc8..e71fa5eab77 100644 --- a/website/docs/docs/dbt-versions/core-upgrade/03-upgrading-to-v1.6.md +++ b/website/docs/docs/dbt-versions/core-upgrade/03-upgrading-to-v1.6.md @@ -14,7 +14,7 @@ dbt Core v1.6 has three significant areas of focus: - [Changelog](https://github.com/dbt-labs/dbt-core/blob/1.6.latest/CHANGELOG.md) - [dbt Core installation guide](/docs/core/installation-overview) -- [Cloud upgrade guide](/docs/dbt-versions/upgrade-core-in-cloud) +- [Cloud upgrade guide](/docs/dbt-versions/upgrade-dbt-version-in-cloud) - [Release schedule](https://github.com/dbt-labs/dbt-core/issues/7481) ## What to know before upgrading diff --git a/website/docs/docs/dbt-versions/core-upgrade/05-upgrading-to-v1.5.md b/website/docs/docs/dbt-versions/core-upgrade/05-upgrading-to-v1.5.md index 7e696e0ba3c..abd3819f9dd 100644 --- a/website/docs/docs/dbt-versions/core-upgrade/05-upgrading-to-v1.5.md +++ b/website/docs/docs/dbt-versions/core-upgrade/05-upgrading-to-v1.5.md @@ -13,7 +13,7 @@ dbt Core v1.5 is a feature release, with two significant additions: - [Changelog](https://github.com/dbt-labs/dbt-core/blob/1.5.latest/CHANGELOG.md) - [CLI Installation guide](/docs/core/installation-overview) -- [Cloud upgrade guide](/docs/dbt-versions/upgrade-core-in-cloud) +- [Cloud upgrade guide](/docs/dbt-versions/upgrade-dbt-version-in-cloud) - [Release schedule](https://github.com/dbt-labs/dbt-core/issues/6715) ## What to know before upgrading diff --git a/website/docs/docs/dbt-versions/core-upgrade/06-upgrading-to-v1.4.md b/website/docs/docs/dbt-versions/core-upgrade/06-upgrading-to-v1.4.md index 41e19956690..fa37075c727 100644 --- a/website/docs/docs/dbt-versions/core-upgrade/06-upgrading-to-v1.4.md +++ b/website/docs/docs/dbt-versions/core-upgrade/06-upgrading-to-v1.4.md @@ -9,7 +9,7 @@ displayed_sidebar: "docs" - [Changelog](https://github.com/dbt-labs/dbt-core/blob/1.4.latest/CHANGELOG.md) - [CLI Installation guide](/docs/core/installation-overview) -- [Cloud upgrade guide](/docs/dbt-versions/upgrade-core-in-cloud) +- [Cloud upgrade guide](/docs/dbt-versions/upgrade-dbt-version-in-cloud) **Final release:** January 25, 2023 diff --git a/website/docs/docs/dbt-versions/core-upgrade/07-upgrading-to-v1.3.md b/website/docs/docs/dbt-versions/core-upgrade/07-upgrading-to-v1.3.md index 7febb0bade9..d209e70643c 100644 --- a/website/docs/docs/dbt-versions/core-upgrade/07-upgrading-to-v1.3.md +++ b/website/docs/docs/dbt-versions/core-upgrade/07-upgrading-to-v1.3.md @@ -9,7 +9,7 @@ displayed_sidebar: "docs" - [Changelog](https://github.com/dbt-labs/dbt-core/blob/1.3.latest/CHANGELOG.md) - [CLI Installation guide](/docs/core/installation-overview) -- [Cloud upgrade guide](/docs/dbt-versions/upgrade-core-in-cloud) +- [Cloud upgrade guide](/docs/dbt-versions/upgrade-dbt-version-in-cloud) ## What to know before upgrading diff --git a/website/docs/docs/dbt-versions/core-upgrade/08-upgrading-to-v1.2.md b/website/docs/docs/dbt-versions/core-upgrade/08-upgrading-to-v1.2.md index 17e62c90b43..dd9cb4742ea 100644 --- a/website/docs/docs/dbt-versions/core-upgrade/08-upgrading-to-v1.2.md +++ b/website/docs/docs/dbt-versions/core-upgrade/08-upgrading-to-v1.2.md @@ -9,7 +9,7 @@ displayed_sidebar: "docs" - [Changelog](https://github.com/dbt-labs/dbt-core/blob/1.2.latest/CHANGELOG.md) - [CLI Installation guide](/docs/core/installation-overview) -- [Cloud upgrade guide](/docs/dbt-versions/upgrade-core-in-cloud) +- [Cloud upgrade guide](/docs/dbt-versions/upgrade-dbt-version-in-cloud) ## What to know before upgrading diff --git a/website/docs/docs/dbt-versions/core-upgrade/09-upgrading-to-v1.1.md b/website/docs/docs/dbt-versions/core-upgrade/09-upgrading-to-v1.1.md index aee3413e1ad..7191cb4a915 100644 --- a/website/docs/docs/dbt-versions/core-upgrade/09-upgrading-to-v1.1.md +++ b/website/docs/docs/dbt-versions/core-upgrade/09-upgrading-to-v1.1.md @@ -9,7 +9,7 @@ displayed_sidebar: "docs" - [Changelog](https://github.com/dbt-labs/dbt-core/blob/1.1.latest/CHANGELOG.md) - [CLI Installation guide](/docs/core/installation-overview) -- [Cloud upgrade guide](/docs/dbt-versions/upgrade-core-in-cloud) +- [Cloud upgrade guide](/docs/dbt-versions/upgrade-dbt-version-in-cloud) ## What to know before upgrading diff --git a/website/docs/docs/dbt-versions/core-upgrade/10-upgrading-to-v1.0.md b/website/docs/docs/dbt-versions/core-upgrade/10-upgrading-to-v1.0.md index 9cbfae50831..013d70b311c 100644 --- a/website/docs/docs/dbt-versions/core-upgrade/10-upgrading-to-v1.0.md +++ b/website/docs/docs/dbt-versions/core-upgrade/10-upgrading-to-v1.0.md @@ -11,7 +11,7 @@ displayed_sidebar: "docs" - [Discourse](https://discourse.getdbt.com/t/3180) - [Changelog](https://github.com/dbt-labs/dbt-core/blob/1.0.latest/CHANGELOG.md) - [CLI Installation guide](/docs/core/installation-overview) -- [Cloud upgrade guide](/docs/dbt-versions/upgrade-core-in-cloud) +- [Cloud upgrade guide](/docs/dbt-versions/upgrade-dbt-version-in-cloud) ## What to know before upgrading diff --git a/website/docs/docs/dbt-versions/core-versions.md b/website/docs/docs/dbt-versions/core-versions.md index e4ed594d29f..16759ec740f 100644 --- a/website/docs/docs/dbt-versions/core-versions.md +++ b/website/docs/docs/dbt-versions/core-versions.md @@ -2,7 +2,7 @@ title: "About dbt Core versions" id: "core" description: "Learn about semantic versioning for dbt Core, and how long those versions are supported." -pagination_next: "docs/dbt-versions/upgrade-core-in-cloud" +pagination_next: "docs/dbt-versions/upgrade-dbt-version-in-cloud" pagination_prev: null --- @@ -12,7 +12,7 @@ dbt Core releases follow [semantic versioning](https://semver.org/) guidelines. _Did you know that you can always be working on the latest version?_ -With dbt Cloud, you can get early access to new functionality before it becomes available in dbt Core and without the need of managing your own version upgrades. Refer to the [Keep on latest version](/docs/dbt-versions/upgrade-core-in-cloud#keep-on-latest-version) setting for details. +With dbt Cloud, you can get early access to new functionality before it becomes available in dbt Core and without the need of managing your own version upgrades. Refer to the [Keep on latest version](/docs/dbt-versions/upgrade-dbt-version-in-cloud#keep-on-latest-version) setting for details. ::: @@ -25,7 +25,7 @@ dbt Labs provides different support levels for different versions, which may inc ### Further reading -- To learn how you can use dbt Core versions in dbt Cloud, see [Choosing a dbt Core version](/docs/dbt-versions/upgrade-core-in-cloud). +- To learn how you can use dbt Core versions in dbt Cloud, see [Choosing a dbt Core version](/docs/dbt-versions/upgrade-dbt-version-in-cloud). - To learn about installing dbt Core, see "[How to install dbt Core](/docs/core/installation-overview)." - To restrict your project to only work with a range of dbt Core versions, or use the currently running dbt Core version, see [`require-dbt-version`](/reference/project-configs/require-dbt-version) and [`dbt_version`](/reference/dbt-jinja-functions/dbt_version). @@ -37,7 +37,7 @@ All dbt Core versions released prior to 1.0 and their version-specific documenta All dbt Core minor versions that have reached end-of-life (EOL) will have no new patch releases. This means they will no longer receive any fixes, including for known bugs that have been identified. Fixes for those bugs will instead be made in newer minor versions that are still under active support. -We recommend upgrading to a newer version in [dbt Cloud](/docs/dbt-versions/upgrade-core-in-cloud) or [dbt Core](/docs/core/installation-overview#upgrading-dbt-core) to continue receiving support. +We recommend upgrading to a newer version in [dbt Cloud](/docs/dbt-versions/upgrade-dbt-version-in-cloud) or [dbt Core](/docs/core/installation-overview#upgrading-dbt-core) to continue receiving support. All dbt Core v1.0 and later are available in dbt Cloud until further notice. In the future, we intend to align dbt Cloud availability with dbt Core ongoing support. You will receive plenty of advance notice before any changes take place. @@ -49,7 +49,7 @@ All dbt Core v1.0 and later are available in dbt Cloud until further notice. In Minor versions include new features and capabilities. They will be supported for one year from their initial release date. _dbt Labs is committed to this 12-month support timeframe._ Our mechanism for continuing to support a minor version is by releasing new patches: small, targeted bug fixes. Whenever we refer to a minor version, such as v1.0, we always mean its latest available patch release (v1.0.x). While a minor version is officially supported: -- You can use it in dbt Cloud. For more on dbt Cloud versioning, see [Choosing a dbt version](/docs/dbt-versions/upgrade-core-in-cloud). +- You can use it in dbt Cloud. For more on dbt Cloud versioning, see [Choosing a dbt version](/docs/dbt-versions/upgrade-dbt-version-in-cloud). - You can select it from the version dropdown on this website, to see documentation that is accurate for use with that minor version. ### Ongoing patches diff --git a/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md b/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md index dc0d118484a..4c79582579e 100644 --- a/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md +++ b/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md @@ -13,7 +13,7 @@ _Now available in the dbt version dropdown in dbt Cloud — starting with se When the new **Keep on latest version** setting is enabled, you always get the latest fixes and early access to new functionality for your dbt project. dbt Labs will handle upgrades behind-the-scenes, as part of testing and redeploying the dbt Cloud application — just like other dbt Cloud capabilities and other SaaS tools that you're using. No more manual upgrades and no more need for _a second sandbox project_. -To learn more about the new setting, refer to [Keep on latest version](/docs/dbt-versions/upgrade-core-in-cloud#keep-on-latest-version) for details. +To learn more about the new setting, refer to [Keep on latest version](/docs/dbt-versions/upgrade-dbt-version-in-cloud#keep-on-latest-version) for details. diff --git a/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/override-dbt-version.md b/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/override-dbt-version.md index 389665d8ba8..4c368ab4eb5 100644 --- a/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/override-dbt-version.md +++ b/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/override-dbt-version.md @@ -7,7 +7,7 @@ tags: [Feb-2024] date: 2024-02-02 --- -You can now [override the dbt version](/docs/dbt-versions/upgrade-core-in-cloud#override-dbt-version) that's configured for the development environment within your project and use a different version — affecting only your user account. This lets you test new dbt features without impacting other people working on the same project. And when you're satisfied with the test results, you can safely upgrade the dbt version for your project(s). +You can now [override the dbt version](/docs/dbt-versions/upgrade-dbt-version-in-cloud#override-dbt-version) that's configured for the development environment within your project and use a different version — affecting only your user account. This lets you test new dbt features without impacting other people working on the same project. And when you're satisfied with the test results, you can safely upgrade the dbt version for your project(s). Use the **dbt version** dropdown to specify the version to override with. It's available on your project's credentials page in the **User development settings** section. For example: diff --git a/website/docs/docs/dbt-versions/release-notes/74-Dec-2023/legacy-sl.md b/website/docs/docs/dbt-versions/release-notes/74-Dec-2023/legacy-sl.md index f6c18b2a053..ae7fa2c1a44 100644 --- a/website/docs/docs/dbt-versions/release-notes/74-Dec-2023/legacy-sl.md +++ b/website/docs/docs/dbt-versions/release-notes/74-Dec-2023/legacy-sl.md @@ -35,5 +35,5 @@ The [re-released dbt Semantic Layer](/docs/use-dbt-semantic-layer/dbt-sl), power - Feedback and community support — Engage and share feedback with the dbt Labs team and dbt Community slack using channels like [#dbt-cloud-semantic-layer](https://getdbt.slack.com/archives/C046L0VTVR6) and [#dbt-metricflow](https://getdbt.slack.com/archives/C02CCBBBR1D). Or reach out to your dbt Cloud account representative. - Resources for upgrading — Refer to some additional info and resources to help you upgrade your dbt version: - - [Upgrade version in dbt Cloud](/docs/dbt-versions/upgrade-core-in-cloud) + - [Upgrade version in dbt Cloud](/docs/dbt-versions/upgrade-dbt-version-in-cloud) - [Version migration guides](/docs/dbt-versions/core-upgrade) diff --git a/website/docs/docs/dbt-versions/release-notes/76-Oct-2023/sl-ga.md b/website/docs/docs/dbt-versions/release-notes/76-Oct-2023/sl-ga.md index 06818042539..e488f77c52e 100644 --- a/website/docs/docs/dbt-versions/release-notes/76-Oct-2023/sl-ga.md +++ b/website/docs/docs/dbt-versions/release-notes/76-Oct-2023/sl-ga.md @@ -8,7 +8,7 @@ tags: [Oct-2023] --- :::important -If you're using the legacy Semantic Layer, we _highly_ recommend you [upgrade your dbt version](/docs/dbt-versions/upgrade-core-in-cloud) to dbt v1.6 or higher and [migrate](/guides/sl-migration) to the latest Semantic Layer. +If you're using the legacy Semantic Layer, we _highly_ recommend you [upgrade your dbt version](/docs/dbt-versions/upgrade-dbt-version-in-cloud) to dbt v1.6 or higher and [migrate](/guides/sl-migration) to the latest Semantic Layer. ::: dbt Labs is thrilled to announce that the [dbt Semantic Layer](/docs/use-dbt-semantic-layer/dbt-sl) is now generally available. It offers consistent data organization, improved governance, reduced costs, enhanced efficiency, and accessible data for better decision-making and collaboration across organizations. diff --git a/website/docs/docs/dbt-versions/release-notes/78-Aug-2023/sl-revamp-beta.md b/website/docs/docs/dbt-versions/release-notes/78-Aug-2023/sl-revamp-beta.md index 112fdfe4db0..599257840bb 100644 --- a/website/docs/docs/dbt-versions/release-notes/78-Aug-2023/sl-revamp-beta.md +++ b/website/docs/docs/dbt-versions/release-notes/78-Aug-2023/sl-revamp-beta.md @@ -8,7 +8,7 @@ sidebar_position: 7 --- :::important -If you're using the legacy Semantic Layer, we _highly_ recommend you [upgrade your dbt version](/docs/dbt-versions/upgrade-core-in-cloud) to dbt v1.6 or higher to use the new dbt Semantic Layer. To migrate to the new Semantic Layer, refer to the dedicated [migration guide](/guides/sl-migration) for more info. +If you're using the legacy Semantic Layer, we _highly_ recommend you [upgrade your dbt version](/docs/dbt-versions/upgrade-dbt-version-in-cloud) to dbt v1.6 or higher to use the new dbt Semantic Layer. To migrate to the new Semantic Layer, refer to the dedicated [migration guide](/guides/sl-migration) for more info. ::: dbt Labs are thrilled to announce the re-release of the [dbt Semantic Layer](/docs/use-dbt-semantic-layer/dbt-sl), now available in [public beta](#public-beta). It aims to bring the best of modeling and semantics to downstream applications by introducing: diff --git a/website/docs/docs/dbt-versions/release-notes/81-May-2023/may-ide-updates.md b/website/docs/docs/dbt-versions/release-notes/81-May-2023/may-ide-updates.md index d85ffa154dd..2f551572c9c 100644 --- a/website/docs/docs/dbt-versions/release-notes/81-May-2023/may-ide-updates.md +++ b/website/docs/docs/dbt-versions/release-notes/81-May-2023/may-ide-updates.md @@ -26,7 +26,7 @@ Stay up-to-date with [IDE-related changes](/tags/ide). - Performance-related upgrades: - Reduced cold start time by 60+% - Improved render time of modals in the IDE by 98% - - Improved IDE performance with dbt Core v1.5+ (faster and snappier – highly encourage you to [upgrade your dbt version](/docs/dbt-versions/upgrade-core-in-cloud)!) + - Improved IDE performance with dbt Core v1.5+ (faster and snappier – highly encourage you to [upgrade your dbt version](/docs/dbt-versions/upgrade-dbt-version-in-cloud)!) - Upgraded sqlfmt (which powers the Format button) to 0.18.0 - Updated Build button to change menu options based on file/model type (snapshot, macro, etc.) - Display message to disable adblocker for file contents error diff --git a/website/docs/docs/dbt-versions/release-notes/83-Mar-2023/1.0-deprecation.md b/website/docs/docs/dbt-versions/release-notes/83-Mar-2023/1.0-deprecation.md index 6b6f646e40e..f157ac07611 100644 --- a/website/docs/docs/dbt-versions/release-notes/83-Mar-2023/1.0-deprecation.md +++ b/website/docs/docs/dbt-versions/release-notes/83-Mar-2023/1.0-deprecation.md @@ -16,6 +16,6 @@ For more info on dbt versions, releases, and dbt Cloud support timeline, refer t Refer to some additional info and resources to help you upgrade your dbt version: - [How to upgrade dbt without fear](https://docs.getdbt.com/blog/upgrade-dbt-without-fear) -- [Upgrade Q&A on breaking changes](/docs/dbt-versions/upgrade-core-in-cloud#upgrading-legacy-versions-under-10) +- [Upgrade Q&A on breaking changes](/docs/dbt-versions/upgrade-dbt-version-in-cloud#upgrading-legacy-versions-under-10) - [Version migration guides](/docs/dbt-versions/core-upgrade) diff --git a/website/docs/docs/dbt-versions/upgrade-core-in-cloud.md b/website/docs/docs/dbt-versions/upgrade-dbt-version-in-cloud.md similarity index 92% rename from website/docs/docs/dbt-versions/upgrade-core-in-cloud.md rename to website/docs/docs/dbt-versions/upgrade-dbt-version-in-cloud.md index 58b703c6fc2..b2b00ec8669 100644 --- a/website/docs/docs/dbt-versions/upgrade-core-in-cloud.md +++ b/website/docs/docs/dbt-versions/upgrade-dbt-version-in-cloud.md @@ -1,6 +1,6 @@ --- -title: "Upgrade Core version in Cloud" -id: "upgrade-core-in-cloud" +title: "Upgrade dbt version in Cloud" +id: "upgrade-dbt-version-in-cloud" --- In dbt Cloud, both [jobs](/docs/deploy/jobs) and [environments](/docs/dbt-cloud-environments) are configured to use a specific version of dbt Core. The version can be upgraded at any time. @@ -79,13 +79,13 @@ For more on version support and future releases, see [Understanding dbt Core ver #### Need help upgrading? -If you want more advice on how to upgrade your dbt projects, check out our [migration guides](/docs/dbt-versions/core-upgrade/) and our [upgrading Q&A page](/docs/dbt-versions/upgrade-core-in-cloud#upgrading-legacy-versions-under-10). +If you want more advice on how to upgrade your dbt projects, check out our [migration guides](/docs/dbt-versions/core-upgrade/) and our [upgrading Q&A page](/docs/dbt-versions/upgrade-dbt-version-in-cloud#upgrading-legacy-versions-under-10). ## Upgrading legacy versions under 1.0 -You can use the following sections to successfully upgrade your version of dbt Core in dbt Cloud. We recommend everyone upgrade to the most recent version of dbt Core, as new versions contain enhancements, bug fixes, and updated security features. We document which [versions of dbt Core are currently supported](/docs/dbt-versions/upgrade-core-in-cloud#supported-versions). +You can use the following sections to successfully upgrade your version of dbt Core in dbt Cloud. We recommend everyone upgrade to the most recent version of dbt Core, as new versions contain enhancements, bug fixes, and updated security features. We document which [versions of dbt Core are currently supported](/docs/dbt-versions/upgrade-dbt-version-in-cloud#supported-versions). -There aren't many breaking changes between minor versions, and it may be the case that you don't need to change any code to upgrade to a newer version of dbt in dbt Cloud. There are only breaking changes between minor versions of dbt before dbt 1.0. Minor releases starting with dbt 1.0, do not have breaking code changes. If there are no code changes needed, all you have to do is [change the settings](/docs/dbt-versions/upgrade-core-in-cloud#upgrading-to-the-latest-version-of-dbt-in-cloud) in your environment or job to run a more recent version of dbt. +There aren't many breaking changes between minor versions, and it may be the case that you don't need to change any code to upgrade to a newer version of dbt in dbt Cloud. There are only breaking changes between minor versions of dbt before dbt 1.0. Minor releases starting with dbt 1.0, do not have breaking code changes. If there are no code changes needed, all you have to do is [change the settings](/docs/dbt-versions/upgrade-dbt-version-in-cloud#upgrading-to-the-latest-version-of-dbt-in-cloud) in your environment or job to run a more recent version of dbt. #### Changes between minor versions of dbt that will affect your project @@ -301,7 +301,7 @@ If you believe your project might be affected, read more details in the migratio #### Testing your changes before upgrading -Once you know what code changes you'll need to make, you can start implementing them. We recommend you create a separate dbt project, **Upgrade Project**, to test your changes before making them live in your main dbt project. In your **Upgrade Project**, connect to the same repository you use for your production project. This time, set the development environment [settings](/docs/dbt-versions/upgrade-core-in-cloud) to run the latest version of dbt Core. Next, check out a branch `dbt-version-upgrade`, make the appropriate updates to your project, and verify your dbt project compiles and runs with the new version in the IDE. If upgrading directly to the latest version results in too many issues, try testing your project iteratively on successive minor versions. There are years of development and a few breaking changes between distant versions of dbt Core (for example, 0.14 --> 1.0). The likelihood of experiencing problems upgrading between successive minor versions is much lower, which is why upgrading regularly is recommended. +Once you know what code changes you'll need to make, you can start implementing them. We recommend you create a separate dbt project, **Upgrade Project**, to test your changes before making them live in your main dbt project. In your **Upgrade Project**, connect to the same repository you use for your production project. This time, set the development environment [settings](/docs/dbt-versions/upgrade-dbt-version-in-cloud) to run the latest version of dbt Core. Next, check out a branch `dbt-version-upgrade`, make the appropriate updates to your project, and verify your dbt project compiles and runs with the new version in the IDE. If upgrading directly to the latest version results in too many issues, try testing your project iteratively on successive minor versions. There are years of development and a few breaking changes between distant versions of dbt Core (for example, 0.14 --> 1.0). The likelihood of experiencing problems upgrading between successive minor versions is much lower, which is why upgrading regularly is recommended. Once you have your project compiling and running on the latest version of dbt in the development environment for your `dbt-version-upgrade` branch, try replicating one of your production jobs to run off your branch's code. You can do this by creating a new deployment environment for testing, setting the custom branch to 'ON' and referencing your `dbt-version-upgrade` branch. You'll also need to set the dbt version in this environment to the latest dbt Core version. diff --git a/website/docs/docs/deploy/retry-jobs.md b/website/docs/docs/deploy/retry-jobs.md index beefb35379e..f439351aec5 100644 --- a/website/docs/docs/deploy/retry-jobs.md +++ b/website/docs/docs/deploy/retry-jobs.md @@ -9,7 +9,7 @@ If your dbt job run completed with a status of **Error**, you can rerun it from ## Prerequisites - You have a [dbt Cloud account](https://www.getdbt.com/signup). -- You must be using [dbt version](/docs/dbt-versions/upgrade-core-in-cloud) 1.6 or newer. +- You must be using [dbt version](/docs/dbt-versions/upgrade-dbt-version-in-cloud) 1.6 or newer. - The most recent run of the job hasn't completed successfully. The latest status of the run is **Error**. - The job command that failed in the run must be one that supports the [retry command](/reference/commands/retry). diff --git a/website/docs/docs/use-dbt-semantic-layer/exports.md b/website/docs/docs/use-dbt-semantic-layer/exports.md index eaf5db16439..5b33e825549 100644 --- a/website/docs/docs/use-dbt-semantic-layer/exports.md +++ b/website/docs/docs/use-dbt-semantic-layer/exports.md @@ -18,7 +18,7 @@ Essentially, exports are like any other table in your data platform. They enable ## Prerequisites - You have a multi-tenant dbt Cloud account on a [Team or Enterprise](https://www.getdbt.com/pricing/) plan. (Single-tenant is not supported at this time) -- You are on [dbt version](/docs/dbt-versions/upgrade-core-in-cloud) 1.7 or newer. +- You are on [dbt version](/docs/dbt-versions/upgrade-dbt-version-in-cloud) 1.7 or newer. - You have the dbt Semantic Layer [configured](/docs/use-dbt-semantic-layer/setup-sl) in your dbt project. - You have a dbt Cloud environment with a [Job scheduler](/docs/deploy/job-scheduler) enabled. diff --git a/website/sidebars.js b/website/sidebars.js index f469e8da97b..b27717f72ae 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -612,7 +612,7 @@ const sidebarSettings = { link: { type: "doc", id: "docs/dbt-versions/core" }, items: [ "docs/dbt-versions/core", - "docs/dbt-versions/upgrade-core-in-cloud", + "docs/dbt-versions/upgrade-dbt-version-in-cloud", "docs/dbt-versions/product-lifecycles", "docs/dbt-versions/experimental-features", { diff --git a/website/snippets/_cloud-environments-info.md b/website/snippets/_cloud-environments-info.md index 2083d8f07ec..0af89af3771 100644 --- a/website/snippets/_cloud-environments-info.md +++ b/website/snippets/_cloud-environments-info.md @@ -29,7 +29,7 @@ Both development and deployment environments have a section called **General Set :::note About dbt version -- dbt Cloud allows users to select any dbt release. At this time, **environments must use a dbt version greater than or equal to v1.0.0;** [lower versions are no longer supported](/docs/dbt-versions/upgrade-core-in-cloud). +- dbt Cloud allows users to select any dbt release. At this time, **environments must use a dbt version greater than or equal to v1.0.0;** [lower versions are no longer supported](/docs/dbt-versions/upgrade-dbt-version-in-cloud). - If you select a current version with `(latest)` in the name, your environment will automatically install the latest stable version of the minor version selected. ::: diff --git a/website/snippets/_config-dbt-version-check.md b/website/snippets/_config-dbt-version-check.md index 237e501ed6b..13984e3c2d5 100644 --- a/website/snippets/_config-dbt-version-check.md +++ b/website/snippets/_config-dbt-version-check.md @@ -1,5 +1,5 @@ -Starting in 2024, when you select **Keep on latest version** in dbt Cloud, dbt will ignore the `require-dbt-version` config. Refer to [Keep on latest version](/docs/dbt-versions/upgrade-core-in-cloud##keep-on-latest-version) (available as a beta) for more details. +Starting in 2024, when you select **Keep on latest version** in dbt Cloud, dbt will ignore the `require-dbt-version` config. Refer to [Keep on latest version](/docs/dbt-versions/upgrade-dbt-version-in-cloud#keep-on-latest-version) (available as a beta) for more details. dbt Labs is committed to zero breaking changes for code in dbt projects, with ongoing releases to dbt Cloud and new versions of dbt Core. We also recommend these best practices: diff --git a/website/snippets/_new-sl-setup.md b/website/snippets/_new-sl-setup.md index a93f233d09c..e7039c8103a 100644 --- a/website/snippets/_new-sl-setup.md +++ b/website/snippets/_new-sl-setup.md @@ -6,7 +6,7 @@ You can set up the dbt Semantic Layer in dbt Cloud at the environment and projec - You must have a successful run in your new environment. :::tip -If you've configured the legacy Semantic Layer, it has been deprecated. dbt Labs strongly recommends that you [upgrade your dbt version](/docs/dbt-versions/upgrade-core-in-cloud) to dbt version 1.6 or higher to use the latest dbt Semantic Layer. Refer to the dedicated [migration guide](/guides/sl-migration) for details. +If you've configured the legacy Semantic Layer, it has been deprecated. dbt Labs strongly recommends that you [upgrade your dbt version](/docs/dbt-versions/upgrade-dbt-version-in-cloud) to dbt version 1.6 or higher to use the latest dbt Semantic Layer. Refer to the dedicated [migration guide](/guides/sl-migration) for details. ::: 1. In dbt Cloud, create a new [deployment environment](/docs/deploy/deploy-environments#create-a-deployment-environment) or use an existing environment on dbt 1.6 or higher. diff --git a/website/snippets/_sl-deprecation-notice.md b/website/snippets/_sl-deprecation-notice.md index 610b1574b7d..2c42dd199c7 100644 --- a/website/snippets/_sl-deprecation-notice.md +++ b/website/snippets/_sl-deprecation-notice.md @@ -1,5 +1,5 @@ :::info Deprecation of dbt Metrics and the legacy dbt Semantic Layer dbt Labs has deprecated dbt Metrics and the legacy dbt Semantic Layer, both supported on dbt version 1.5 or lower. These changes went into effect on December 15th, 2023. -To migrate and access [MetricFlow](/docs/build/build-metrics-intro) or the re-released dbt Semantic Layer, use the [dbt Semantic Layer migration guide](/guides/sl-migration) and [upgrade your version](/docs/dbt-versions/upgrade-core-in-cloud) in dbt Cloud. +To migrate and access [MetricFlow](/docs/build/build-metrics-intro) or the re-released dbt Semantic Layer, use the [dbt Semantic Layer migration guide](/guides/sl-migration) and [upgrade your version](/docs/dbt-versions/upgrade-dbt-version-in-cloud) in dbt Cloud. ::: diff --git a/website/snippets/_sl-faqs.md b/website/snippets/_sl-faqs.md index 75583bfa2f6..2c1d305b200 100644 --- a/website/snippets/_sl-faqs.md +++ b/website/snippets/_sl-faqs.md @@ -40,7 +40,7 @@ You can use the upcoming feature, Exports, which will allow you to create a [pre -If you're using the legacy Semantic Layer, we highly recommend you [upgrade your dbt version](/docs/dbt-versions/upgrade-core-in-cloud) to dbt v1.6 or higher to use the new dbt Semantic Layer. Refer to the dedicated [migration guide](/guides/sl-migration) for more info. +If you're using the legacy Semantic Layer, we highly recommend you [upgrade your dbt version](/docs/dbt-versions/upgrade-dbt-version-in-cloud) to dbt v1.6 or higher to use the new dbt Semantic Layer. Refer to the dedicated [migration guide](/guides/sl-migration) for more info. diff --git a/website/snippets/_v2-sl-prerequisites.md b/website/snippets/_v2-sl-prerequisites.md index 18f228ad3fe..9c7c86bab6f 100644 --- a/website/snippets/_v2-sl-prerequisites.md +++ b/website/snippets/_v2-sl-prerequisites.md @@ -1,6 +1,6 @@ - Have a dbt Cloud Team or Enterprise account. Suitable for both Multi-tenant and Single-tenant deployment. - Note: Single-tenant accounts should contact their account representative for necessary setup and enablement. -- Have both your production and development environments running [dbt version 1.6 or higher](/docs/dbt-versions/upgrade-core-in-cloud). +- Have both your production and development environments running [dbt version 1.6 or higher](/docs/dbt-versions/upgrade-dbt-version-in-cloud). - Use Snowflake, BigQuery, Databricks, or Redshift. - Create a successful run in the environment where you configure the Semantic Layer. - **Note:** Semantic Layer currently supports the Deployment environment for querying. (_development querying experience coming soon_) diff --git a/website/static/img/docs/dbt-cloud/cloud-configuring-dbt-cloud/choosing-dbt-version/Environment-settings.png b/website/static/img/docs/dbt-cloud/cloud-configuring-dbt-cloud/choosing-dbt-version/Environment-settings.png deleted file mode 100644 index 7484ba944618d86f9afe6558100f9cb9826c420c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30262 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 V&f^8MklSYjQqScjip2GN{tf;`_2d8m diff --git a/website/vercel.json b/website/vercel.json index a68fb899918..fd58e3f5b82 100644 --- a/website/vercel.json +++ b/website/vercel.json @@ -2,6 +2,11 @@ "cleanUrls": true, "trailingSlash": false, "redirects": [ + { + "source": "/docs/dbt-versions/upgrade-core-in-cloud", + "destination": "/docs/dbt-versions/upgrade-dbt-version-in-cloud", + "permanent": true + }, { "source": "/docs/cloud/about-cloud/regions-ip-addresses", "destination": "/docs/cloud/about-cloud/access-regions-ip-addresses", @@ -1674,7 +1679,7 @@ }, { "source": "/docs/dbt-cloud/cloud-configuring-dbt-cloud/cloud-choosing-a-dbt-version", - "destination": "/docs/dbt-versions/upgrade-core-in-cloud", + "destination": "/docs/dbt-versions/upgrade-dbt-version-in-cloud", "permanent": true }, { @@ -2379,7 +2384,7 @@ }, { "source": "/docs/dbt-cloud/cloud-configuring-dbt-cloud/cloud-upgrading-dbt-versions", - "destination": "/docs/dbt-versions/upgrade-core-in-cloud", + "destination": "/docs/dbt-versions/upgrade-dbt-version-in-cloud", "permanent": true }, { @@ -2854,7 +2859,7 @@ }, { "source": "/docs/dbt-cloud/cloud-configuring-dbt-cloud/cloud-choosing-a-dbt-version", - "destination": "/docs/dbt-versions/upgrade-core-in-cloud", + "destination": "/docs/dbt-versions/upgrade-dbt-version-in-cloud", "permanent": true }, { From dcfd67953ad8ae25a39d27bceafb72980a526ca4 Mon Sep 17 00:00:00 2001 From: Jason Karlavige Date: Wed, 14 Feb 2024 14:55:35 -0500 Subject: [PATCH 103/121] adjust if check and add component variations to test build --- website/docs/docs/introduction.md | 8 ++++---- website/src/components/lifeCycle/index.js | 6 +----- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/website/docs/docs/introduction.md b/website/docs/docs/introduction.md index f4fb6e64d53..915dd446c51 100644 --- a/website/docs/docs/introduction.md +++ b/website/docs/docs/introduction.md @@ -11,21 +11,21 @@ dbt compiles and runs your analytics code against your data platform, enabling y Read more about why we want to enable analysts to work more like software engineers in [The dbt Viewpoint](/community/resources/viewpoint). -## dbt optimizes your workflow +## dbt optimizes your workflow - Avoid writing boilerplate  and by managing transactions, dropping tables, and managing schema changes. Write business logic with just a SQL `select` statement, or a Python DataFrame, that returns the dataset you need, and dbt takes care of . - Build up reusable, or modular, data models that can be referenced in subsequent work instead of starting at the raw data with every analysis. - Dramatically reduce the time your queries take to run: Leverage metadata to find long-running models that you want to optimize and use [incremental models](/docs/build/incremental-models) which dbt makes easy to configure and use. - Write er code by leveraging [macros](/docs/build/jinja-macros), [hooks](/docs/build/hooks-operations), and [package management](/docs/build/packages). -## dbt provides more reliable analysis +## dbt provides more reliable analysis - No longer copy and paste SQL, which can lead to errors when logic changes. Instead, build reusable data models that get pulled into subsequent models and analysis. Change a model once and that change will propagate to all its dependencies. - Publish the canonical version of a particular data model, encapsulating all complex business logic. All analysis on top of this model will incorporate the same business logic without needing to reimplement it. - Use mature source control processes like branching, pull requests, and code reviews. - Write data quality tests quickly and easily on the underlying data. Many analytic errors are caused by edge cases in the data: testing helps analysts find and handle those edge cases. -## dbt products +## dbt products You can access dbt using dbt Core or dbt Cloud. dbt Cloud is built around dbt Core, but it also provides: @@ -36,7 +36,7 @@ You can access dbt using dbt Core or dbt Cloud. dbt Cloud is built around dbt Co You can learn about plans and pricing on [www.getdbt.com](https://www.getdbt.com/pricing/). -### dbt Cloud +### dbt Cloud dbt Cloud is the fastest and most reliable way to deploy dbt. Develop, test, schedule, and investigate data models all in one web-based UI. It also natively supports developing using a command line with the [dbt Cloud CLI](/docs/cloud/cloud-cli-installation). Learn more about [dbt Cloud features](/docs/cloud/about-cloud/dbt-cloud-features) and try one of the [dbt Cloud quickstarts](/guides). diff --git a/website/src/components/lifeCycle/index.js b/website/src/components/lifeCycle/index.js index 0c6978582e3..d8abc142162 100644 --- a/website/src/components/lifeCycle/index.js +++ b/website/src/components/lifeCycle/index.js @@ -20,11 +20,7 @@ const fontColors = { export default function Lifecycle(props) { const statuses = props.status?.split(',') - if (!statuses?.length) { - return null; - } - - if (!props.status || (Array.isArray(props.status) && props.status.length === 0)) { + if (!props.status || !statuses?.length) { return null; } From 9c626b9447deee9be3465a9cfb7632debe7df066 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:56:39 -0500 Subject: [PATCH 104/121] Fixing format and spacing --- website/docs/docs/build/unit-tests.md | 4 ++-- website/docs/reference/resource-properties/unit-tests.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 86efe423b25..71c464cbd40 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -145,7 +145,7 @@ Now you’re ready to run this unit test. You have a couple of options for comma - `dbt test --select "dim_customers,test_type:unit"` runs all of the _unit_ tests on `dim_customers`. - `dbt test --select test_is_valid_email_address` runs the test named `test_is_valid_email_address`. -```bash +```shell dbt test --select test_is_valid_email_address 16:03:49 Running with dbt=1.8.0-a1 @@ -183,7 +183,7 @@ The clever regex statement wasn’t as clever as initially thought, as the model Updating the regex logic to `'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'` (those pesky escape characters) and rerunning the unit test solves the problem: -```bash +```shell dbt test --select test_is_valid_email_address 16:09:11 Running with dbt=1.8.0-a1 diff --git a/website/docs/reference/resource-properties/unit-tests.md b/website/docs/reference/resource-properties/unit-tests.md index 64744b98918..40c3414e373 100644 --- a/website/docs/reference/resource-properties/unit-tests.md +++ b/website/docs/reference/resource-properties/unit-tests.md @@ -124,7 +124,7 @@ When `format: csv`, can either supply: ``` - - The name of a csv file in the `tests/fixtures` directory in your project (or the directory configured for [test-paths](https://docs.getdbt.com/reference/project-configs/test-paths)) for `fixture`: + - The name of a csv file in the `tests/fixtures` directory in your project (or the directory configured for [test-paths](https://docs.getdbt.com/reference/project-configs/test-paths)) for `fixture`: ```yaml unit_tests: From 6b8e0348393f1e8f29616cbe68c0bbc0fe79de07 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:59:42 -0500 Subject: [PATCH 105/121] fixing links --- website/docs/reference/commands/test.md | 4 ++-- website/docs/reference/resource-configs/store_failures_as.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/website/docs/reference/commands/test.md b/website/docs/reference/commands/test.md index 2203cc09faa..cad61a05ac5 100644 --- a/website/docs/reference/commands/test.md +++ b/website/docs/reference/commands/test.md @@ -29,7 +29,7 @@ dbt test --select "one_specific_model,test_type:singular" dbt test --select "one_specific_model,test_type:generic" ``` -For more information on writing tests, see the [Testing Documentation](/docs/build/tests). +For more information on writing tests, see the [Testing Documentation](/docs/build/data-tests). @@ -68,7 +68,7 @@ dbt test --select "one_specific_model,test_type:data" dbt test --select "one_specific_model,test_type:unit" ``` -For more information on writing tests, read the [data testing](/docs/build/tests) and [unit testing](/docs/build/unit-tests) documentation. +For more information on writing tests, read the [data testing](/docs/build/data-tests) and [unit testing](/docs/build/unit-tests) documentation. diff --git a/website/docs/reference/resource-configs/store_failures_as.md b/website/docs/reference/resource-configs/store_failures_as.md index dd61030afb8..005193a5381 100644 --- a/website/docs/reference/resource-configs/store_failures_as.md +++ b/website/docs/reference/resource-configs/store_failures_as.md @@ -17,7 +17,7 @@ You can configure it in all the same places as `store_failures`, including singu #### Singular test -[Singular test](https://docs.getdbt.com/docs/build/tests#singular-data-tests) in `tests/singular/check_something.sql` file +[Singular test](https://docs.getdbt.com/docs/build/data-tests#singular-data-tests) in `tests/singular/check_something.sql` file ```sql {{ config(store_failures_as="table") }} @@ -29,7 +29,7 @@ where 1=0 #### Generic test -[Generic tests](https://docs.getdbt.com/docs/build/tests#generic-data-tests) in `models/_models.yml` file +[Generic tests](https://docs.getdbt.com/docs/build/data-tests#generic-data-tests) in `models/_models.yml` file ```yaml models: From 9c67cdcc32ba68a36cf10883770cf7bfbfb7d32b Mon Sep 17 00:00:00 2001 From: Ly Nguyen Date: Wed, 14 Feb 2024 12:04:28 -0800 Subject: [PATCH 106/121] Add link --- website/docs/terms/data-lineage.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/docs/terms/data-lineage.md b/website/docs/terms/data-lineage.md index d0162c35616..42217db40d8 100644 --- a/website/docs/terms/data-lineage.md +++ b/website/docs/terms/data-lineage.md @@ -101,13 +101,13 @@ Is your DAG keeping up with best practices? Instead of manually auditing your DA Complex workflows also add to the difficulties a data lineage system will encounter. For example, consider the challenges in describing a data source's movement through a pipeline as it's filtered, pivoted, and joined with other tables. These challenges increase when the granularity of the data lineage shifts from the table to the column level. -As data lineage graphs mature and grow, it becomes clear that column or field-level lineage is often a needed layer of specificity that is not typically built-in to data lineage systems. [Some of the third party tooling](#third-party-tooling) from above can support column-level lineage. +As data lineage graphs mature and grow, it becomes clear that column- or field-level lineage is often a needed layer of specificity that is not typically built in to data lineage systems. Learn more about the [column-level lineage](/docs/collaborate/column-level-lineage) feature in [dbt Explorer](https://www.getdbt.com/product/dbt-explorer) and how it can help you gain insights. -## **Conclusion** +## Conclusion Data lineage is the holistic overview of how data moves through an organization or system, and is typically represented by a DAG. Analytics engineering practitioners use their DAG and data lineage to unpack root causes in broken pipelines, audit their models for inefficiencies, and promote greater transparency in their data work to business users. Overall, using your data lineage and DAG to know when your data is transformed and where it’s consumed is the foundation for good analytics work. -## **Further reading** +## Further reading DAGs, data lineage, and root cause analysis…tell me more! Check out some of our favorite resources of writing modular models, DRY code, and data modeling best practices: From a587301631f17d19a1c2a0a4cac9421358a94539 Mon Sep 17 00:00:00 2001 From: Jason Karlavige Date: Wed, 14 Feb 2024 15:13:21 -0500 Subject: [PATCH 107/121] revert test changes --- website/docs/docs/introduction.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/website/docs/docs/introduction.md b/website/docs/docs/introduction.md index 915dd446c51..f4fb6e64d53 100644 --- a/website/docs/docs/introduction.md +++ b/website/docs/docs/introduction.md @@ -11,21 +11,21 @@ dbt compiles and runs your analytics code against your data platform, enabling y Read more about why we want to enable analysts to work more like software engineers in [The dbt Viewpoint](/community/resources/viewpoint). -## dbt optimizes your workflow +## dbt optimizes your workflow - Avoid writing boilerplate  and by managing transactions, dropping tables, and managing schema changes. Write business logic with just a SQL `select` statement, or a Python DataFrame, that returns the dataset you need, and dbt takes care of . - Build up reusable, or modular, data models that can be referenced in subsequent work instead of starting at the raw data with every analysis. - Dramatically reduce the time your queries take to run: Leverage metadata to find long-running models that you want to optimize and use [incremental models](/docs/build/incremental-models) which dbt makes easy to configure and use. - Write er code by leveraging [macros](/docs/build/jinja-macros), [hooks](/docs/build/hooks-operations), and [package management](/docs/build/packages). -## dbt provides more reliable analysis +## dbt provides more reliable analysis - No longer copy and paste SQL, which can lead to errors when logic changes. Instead, build reusable data models that get pulled into subsequent models and analysis. Change a model once and that change will propagate to all its dependencies. - Publish the canonical version of a particular data model, encapsulating all complex business logic. All analysis on top of this model will incorporate the same business logic without needing to reimplement it. - Use mature source control processes like branching, pull requests, and code reviews. - Write data quality tests quickly and easily on the underlying data. Many analytic errors are caused by edge cases in the data: testing helps analysts find and handle those edge cases. -## dbt products +## dbt products You can access dbt using dbt Core or dbt Cloud. dbt Cloud is built around dbt Core, but it also provides: @@ -36,7 +36,7 @@ You can access dbt using dbt Core or dbt Cloud. dbt Cloud is built around dbt Co You can learn about plans and pricing on [www.getdbt.com](https://www.getdbt.com/pricing/). -### dbt Cloud +### dbt Cloud dbt Cloud is the fastest and most reliable way to deploy dbt. Develop, test, schedule, and investigate data models all in one web-based UI. It also natively supports developing using a command line with the [dbt Cloud CLI](/docs/cloud/cloud-cli-installation). Learn more about [dbt Cloud features](/docs/cloud/about-cloud/dbt-cloud-features) and try one of the [dbt Cloud quickstarts](/guides). From f715ecb6a64a3c8b91bcb56eb3e2545ebdecb766 Mon Sep 17 00:00:00 2001 From: Jeremy Cohen Date: Wed, 14 Feb 2024 21:49:35 +0100 Subject: [PATCH 108/121] Small edits from final review --- .../2021-11-23-how-to-upgrade-dbt-versions.md | 4 +++- .../core-upgrade/01-upgrading-to-v1.8.md | 4 +++- .../72-Feb-2024/keep-on-latest-version.md | 4 ++-- .../dbt-versions/upgrade-dbt-version-in-cloud.md | 2 +- website/snippets/_cloud-environments-info.md | 1 + website/snippets/_config-dbt-version-check.md | 16 ++++++++++------ 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md b/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md index ceccfe86196..5098e9d29e3 100644 --- a/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md +++ b/website/blog/2021-11-23-how-to-upgrade-dbt-versions.md @@ -16,7 +16,9 @@ is_featured: true It's been a few years since dbt-core turned 1.0! Since then, we've committed to releasing zero breaking changes whenever possible and it's become much easier to upgrade dbt Core versions. -Now, we're taking it one step further by introducing **Keep on latest version** in dbt Cloud (currently available to select customers). No more manual upgrades and no more need for "a second sandbox project." For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-dbt-version-in-cloud). +In 2024, we're taking this promise further by: +- Stabilizing interfaces for everyone — adapter maintainers, metadata consumers, and (of course) people writing dbt code everywhere — as discussed in [our November 2023 roadmap update](https://github.com/dbt-labs/dbt-core/blob/main/docs/roadmap/2023-11-dbt-tng.md). +- Introducing **Keep on latest version** in dbt Cloud. No more manual upgrades and no more need for _a second sandbox project_ just to try out new features in development. For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-dbt-version-in-cloud). We're leaving the rest of this post as is, so we can all remember how it used to be. Enjoy a stroll down memory lane. diff --git a/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md b/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md index 5b14d91d59d..2dcc17e4ee9 100644 --- a/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md +++ b/website/docs/docs/dbt-versions/core-upgrade/01-upgrading-to-v1.8.md @@ -16,7 +16,9 @@ displayed_sidebar: "docs" Starting this year, let dbt Labs handle version upgrades for you. With dbt Cloud, you can get early access to new functionality before it lands in the final release of dbt Core v1.8 and without the need of managing your own version upgrades. For more details, refer to [Upgrade Core version in Cloud](/docs/dbt-versions/upgrade-dbt-version-in-cloud). -The **Keep on latest version** setting is currently available in beta for select dbt Cloud customers. The first beta release of dbt-core v1.8 is planned for February 28. +The **Keep on latest version** setting is currently available in beta for select dbt Cloud customers, rolling out to wider availability through February and March. + +For users of dbt Core, the v1.8.0-b1 release of `dbt-core` & dbt Labs-maintained adapters is planned for February 28. ::: diff --git a/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md b/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md index 4c79582579e..188f9f0102a 100644 --- a/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md +++ b/website/docs/docs/dbt-versions/release-notes/72-Feb-2024/keep-on-latest-version.md @@ -9,9 +9,9 @@ date: 2024-02-14 # New: Keep on latest version -_Now available in the dbt version dropdown in dbt Cloud — starting with select customers, rolling out to wider avaiability through February and March._ +_Now available in the dbt version dropdown in dbt Cloud — starting with select customers, rolling out to wider availability through February and March._ -When the new **Keep on latest version** setting is enabled, you always get the latest fixes and early access to new functionality for your dbt project. dbt Labs will handle upgrades behind-the-scenes, as part of testing and redeploying the dbt Cloud application — just like other dbt Cloud capabilities and other SaaS tools that you're using. No more manual upgrades and no more need for _a second sandbox project_. +When the new **Keep on latest version** setting is enabled, you always get the latest fixes and early access to new functionality for your dbt project. dbt Labs will handle upgrades behind-the-scenes, as part of testing and redeploying the dbt Cloud application — just like other dbt Cloud capabilities and other SaaS tools that you're using. No more manual upgrades and no more need for _a second sandbox project_ just to try out new features in development. To learn more about the new setting, refer to [Keep on latest version](/docs/dbt-versions/upgrade-dbt-version-in-cloud#keep-on-latest-version) for details. diff --git a/website/docs/docs/dbt-versions/upgrade-dbt-version-in-cloud.md b/website/docs/docs/dbt-versions/upgrade-dbt-version-in-cloud.md index b2b00ec8669..81535001aeb 100644 --- a/website/docs/docs/dbt-versions/upgrade-dbt-version-in-cloud.md +++ b/website/docs/docs/dbt-versions/upgrade-dbt-version-in-cloud.md @@ -19,7 +19,7 @@ You can upgrade to **Keep on latest version** no matter which version of dbt you :::tip Interested? Let us know! -Currently, this feature is available as a beta to select customers. Are you interested? Please contact your account team to join! +Currently, this feature is available in beta for select customers, rolling out to wider availability through February and March. Are you interested in getting early access? Please contact your account team to join! ::: diff --git a/website/snippets/_cloud-environments-info.md b/website/snippets/_cloud-environments-info.md index 0af89af3771..929337f86d4 100644 --- a/website/snippets/_cloud-environments-info.md +++ b/website/snippets/_cloud-environments-info.md @@ -31,6 +31,7 @@ Both development and deployment environments have a section called **General Set - dbt Cloud allows users to select any dbt release. At this time, **environments must use a dbt version greater than or equal to v1.0.0;** [lower versions are no longer supported](/docs/dbt-versions/upgrade-dbt-version-in-cloud). - If you select a current version with `(latest)` in the name, your environment will automatically install the latest stable version of the minor version selected. +- In 2024 we are introducing **Keep on latest version**, which removes the need for manually upgrading environments in the future, while ensuring you get access to the latest fixes and features. This feature is currently in beta for select customers, rolling out to wider availability through February and March._ ::: ### Custom branch behavior diff --git a/website/snippets/_config-dbt-version-check.md b/website/snippets/_config-dbt-version-check.md index 13984e3c2d5..231143407ce 100644 --- a/website/snippets/_config-dbt-version-check.md +++ b/website/snippets/_config-dbt-version-check.md @@ -1,19 +1,23 @@ -Starting in 2024, when you select **Keep on latest version** in dbt Cloud, dbt will ignore the `require-dbt-version` config. Refer to [Keep on latest version](/docs/dbt-versions/upgrade-dbt-version-in-cloud#keep-on-latest-version) (available as a beta) for more details. +Starting in 2024, when you select **Keep on latest version** in dbt Cloud, dbt will ignore the `require-dbt-version` config. Refer to [Keep on latest version](/docs/dbt-versions/upgrade-dbt-version-in-cloud#keep-on-latest-version) (available in beta) for more details. dbt Labs is committed to zero breaking changes for code in dbt projects, with ongoing releases to dbt Cloud and new versions of dbt Core. We also recommend these best practices: - **If you install dbt packages** — for use in your project, whether the package is maintained by your colleagues or a member of the open source dbt community, we recommend pinning the package to a specific revision or `version` boundary. Since v1.7, dbt manages this out-of-the-box by _locking_ the version/revision of packages in development in order to guarantee predictable builds in production. To learn more, refer to [Predictable package installs](/reference/commands/deps#predictable-package-installs). - **If you maintain dbt packages** — whether on behalf of your colleagues or members of the open source community, we recommend writing defensive code that checks to verify that other required packages and global macros are available. For example, if your package depends on the availability of a `date_spine` macro in the global `dbt` namespace, you can write: - + ```sql -{% if dbt.get('date_spine') %} - {{ exceptions.raise_compiler_error("Expected to find the dbt.date_spine macro, but it could not be found") }} -{% endif %} +{% macro a_few_days_in_september() %} -{{ date_spine("day", "'2023-09-01'::date", "'2023-09-10'::date") }} + {% if not dbt.get('date_spine') %} + {{ exceptions.raise_compiler_error("Expected to find the dbt.date_spine macro, but it could not be found") }} + {% endif %} + + {{ date_spine("day", "cast('2020-01-01' as date)", "cast('2030-12-31' as date)") }} + +{% endmacro %} ``` From d93ffb4a03940f64ff38596ff68bc6c4ab7075e6 Mon Sep 17 00:00:00 2001 From: Ly Nguyen <107218380+nghi-ly@users.noreply.github.com> Date: Wed, 14 Feb 2024 13:22:09 -0800 Subject: [PATCH 109/121] Update website/docs/reference/global-configs/version-compatibility.md Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/reference/global-configs/version-compatibility.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/global-configs/version-compatibility.md b/website/docs/reference/global-configs/version-compatibility.md index 1abbbe3c86a..fdc9bc1d48e 100644 --- a/website/docs/reference/global-configs/version-compatibility.md +++ b/website/docs/reference/global-configs/version-compatibility.md @@ -14,7 +14,7 @@ Running with dbt=1.0.0 Found 13 models, 2 tests, 1 archives, 0 analyses, 204 macros, 2 operations.... ``` -:::info Keep with latest version +:::info Keep on latest version ::: From 7a411aa1d2c8a2b0c01b1ed17c19d18a07000d03 Mon Sep 17 00:00:00 2001 From: Ly Nguyen Date: Wed, 14 Feb 2024 13:33:25 -0800 Subject: [PATCH 110/121] Fix build error --- website/docs/docs/build/unit-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index 71c464cbd40..f0297903366 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -9,7 +9,7 @@ keywords: --- :::note closed beta -Unit testing is currently in closed beta for dbt Cloud accounts that have updated to a [versionless environment](/docs/dbt-versions/upgrade-core-in-cloud). +Unit testing is currently in closed beta for dbt Cloud accounts that have updated to a [versionless environment](/docs/dbt-versions/upgrade-dbt-version-in-cloud). It is available now as an alpha feature for dbt Core v1.8 users. From 1d7198db42e4fb4956fd49f1ca8cae279a67cf22 Mon Sep 17 00:00:00 2001 From: Jeremy Cohen Date: Wed, 14 Feb 2024 22:52:08 +0100 Subject: [PATCH 111/121] Update unit test language for consistency --- website/docs/docs/build/unit-tests.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index f0297903366..df262e6179a 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -9,9 +9,9 @@ keywords: --- :::note closed beta -Unit testing is currently in closed beta for dbt Cloud accounts that have updated to a [versionless environment](/docs/dbt-versions/upgrade-dbt-version-in-cloud). +Support for unit testing dbt models is available to dbt Cloud customers who have selected [**Keep on latest version**](/docs/dbt-versions/upgrade-dbt-version-in-cloud#keep-on-latest-version). This is currently in closed beta, starting with select customers, and rolling out to wider availability through February and March. -It is available now as an alpha feature for dbt Core v1.8 users. +For users of dbt Core, unit tests will be included in v1.8, planned for late April 2024. The v1.8.0-b1 release of `dbt-core` & dbt Labs-maintained adapters is planned for February 28. ::: From 8fe72215cebffb58b03599f3d5d9e9d8fa074cde Mon Sep 17 00:00:00 2001 From: Ly Nguyen <107218380+nghi-ly@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:01:25 -0800 Subject: [PATCH 112/121] Update website/docs/reference/commands/version.md Co-authored-by: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> --- website/docs/reference/commands/version.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/commands/version.md b/website/docs/reference/commands/version.md index 79923d5e90f..b17ef133d29 100644 --- a/website/docs/reference/commands/version.md +++ b/website/docs/reference/commands/version.md @@ -4,7 +4,7 @@ sidebar_label: "version" id: "version" --- -The `--version` command-line option returns information about the currently installed version of dbt Core or the dbt Cloud CLI. +The `--version` command-line flag returns information about the currently installed version of dbt Core or the dbt Cloud CLI. This option is not supported when invoking dbt in other dbt Cloud runtimes (like, the IDE or scheduled runs). From f38ac17fb6d520212cfbbdf830304df3ed6523be Mon Sep 17 00:00:00 2001 From: Ly Nguyen <107218380+nghi-ly@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:01:45 -0800 Subject: [PATCH 113/121] Update website/docs/reference/commands/version.md Co-authored-by: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> --- website/docs/reference/commands/version.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/commands/version.md b/website/docs/reference/commands/version.md index b17ef133d29..91619f2af7a 100644 --- a/website/docs/reference/commands/version.md +++ b/website/docs/reference/commands/version.md @@ -6,7 +6,7 @@ id: "version" The `--version` command-line flag returns information about the currently installed version of dbt Core or the dbt Cloud CLI. -This option is not supported when invoking dbt in other dbt Cloud runtimes (like, the IDE or scheduled runs). +This flag is not supported when invoking dbt in other dbt Cloud runtimes (for example, the IDE or scheduled runs). From 9218ee51049386e94a076c2b687b4daa66b03b75 Mon Sep 17 00:00:00 2001 From: Ly Nguyen <107218380+nghi-ly@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:02:45 -0800 Subject: [PATCH 114/121] Update website/docs/reference/commands/deps.md Co-authored-by: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> --- website/docs/reference/commands/deps.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/commands/deps.md b/website/docs/reference/commands/deps.md index edafd62da40..e843a0b2f23 100644 --- a/website/docs/reference/commands/deps.md +++ b/website/docs/reference/commands/deps.md @@ -62,7 +62,7 @@ Update your versions in packages.yml, then run dbt deps ## Predictable package installs -Starting in dbt Core v1.7, dbt generates an additional `package-lock.yml` file in the root of your project. This contains the full set of resolved packages, based on the `packages` configuration (in `dependencies.yml` or `packages.yml`). Each subsequent invocation of `dbt deps` will install from the _locked_ set of packages specified in this file. By storing the full set of required packages (with pinned versions) in version-controlled code, it ensures predictable installs in production and consistency across all developers and environments. +Starting in dbt Core v1.7, dbt generates a `package-lock.yml` file in the root of your project. This contains the complete set of resolved packages based on the `packages` configuration in `dependencies.yml` or `packages.yml`. Each subsequent invocation of `dbt deps` will install from the _locked_ set of packages specified in this file. Storing the complete set of required packages (with pinned versions) in version-controlled code ensures predictable installs in production and consistency across all developers and environments. The `package-lock.yml` file includes a `sha1_hash` of the `packages` config. This enables dbt to detect if the `packages` config has updated, and to rerun dependency resolution. If you want to only check for changes to the `packages` config and update the lock file accordingly (without actually installing those packages), you can provide the `--lock` option (that is, `dbt deps --lock`). From 6eb2d4bb528f0beb05c24414438e45a48b5d96a2 Mon Sep 17 00:00:00 2001 From: Ly Nguyen <107218380+nghi-ly@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:06:59 -0800 Subject: [PATCH 115/121] Update website/docs/reference/commands/deps.md Co-authored-by: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> --- website/docs/reference/commands/deps.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/commands/deps.md b/website/docs/reference/commands/deps.md index e843a0b2f23..e87d4a2e1eb 100644 --- a/website/docs/reference/commands/deps.md +++ b/website/docs/reference/commands/deps.md @@ -64,7 +64,7 @@ Update your versions in packages.yml, then run dbt deps Starting in dbt Core v1.7, dbt generates a `package-lock.yml` file in the root of your project. This contains the complete set of resolved packages based on the `packages` configuration in `dependencies.yml` or `packages.yml`. Each subsequent invocation of `dbt deps` will install from the _locked_ set of packages specified in this file. Storing the complete set of required packages (with pinned versions) in version-controlled code ensures predictable installs in production and consistency across all developers and environments. -The `package-lock.yml` file includes a `sha1_hash` of the `packages` config. This enables dbt to detect if the `packages` config has updated, and to rerun dependency resolution. If you want to only check for changes to the `packages` config and update the lock file accordingly (without actually installing those packages), you can provide the `--lock` option (that is, `dbt deps --lock`). +The `package-lock.yml` file includes a `sha1_hash` of the `packages` config. This enables dbt to detect if the `packages` config has been updated, and to rerun dependency resolution. To only check for changes to the `packages` config and update the lock file accordingly without installing those packages, provide the `--lock` flag (that is, `dbt deps --lock`). It's also possible to force package resolution to rerun, even if the `packages` config hasn't changed, by running `dbt deps --upgrade`. For example, this enables you to always get the latest commits from the `main` branch of an internally maintained `git` package while accepting the risk of unpredictable builds. An alternative to always running `dbt deps --upgrade` in production is to "ignore" the lock file by adding `package-lock.yml` to your project's `.gitignore` file. If you pursue either approach, we strongly recommend adding version pins for third-party packages within your `packages` config. From f3b62c2a3aec13eb2df976fc39cc89baba410950 Mon Sep 17 00:00:00 2001 From: Ly Nguyen <107218380+nghi-ly@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:09:20 -0800 Subject: [PATCH 116/121] Update website/docs/reference/commands/deps.md Co-authored-by: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> --- website/docs/reference/commands/deps.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/commands/deps.md b/website/docs/reference/commands/deps.md index e87d4a2e1eb..079f47c23cb 100644 --- a/website/docs/reference/commands/deps.md +++ b/website/docs/reference/commands/deps.md @@ -66,7 +66,7 @@ Starting in dbt Core v1.7, dbt generates a `package-lock.yml` file in the root o The `package-lock.yml` file includes a `sha1_hash` of the `packages` config. This enables dbt to detect if the `packages` config has been updated, and to rerun dependency resolution. To only check for changes to the `packages` config and update the lock file accordingly without installing those packages, provide the `--lock` flag (that is, `dbt deps --lock`). -It's also possible to force package resolution to rerun, even if the `packages` config hasn't changed, by running `dbt deps --upgrade`. For example, this enables you to always get the latest commits from the `main` branch of an internally maintained `git` package while accepting the risk of unpredictable builds. An alternative to always running `dbt deps --upgrade` in production is to "ignore" the lock file by adding `package-lock.yml` to your project's `.gitignore` file. If you pursue either approach, we strongly recommend adding version pins for third-party packages within your `packages` config. +It's possible to force package resolution to rerun, even if the `packages` config hasn't changed, by running `dbt deps --upgrade`. This enables you to get the latest commits from the `main` branch of an internally maintained `git` package while accepting the risk of unpredictable builds. An alternative to running `dbt deps --upgrade` in production is to "ignore" the lock file by adding `package-lock.yml` to your project's `.gitignore` file. If you pursue either approach, dbt Labs strongly recommends adding version pins for third-party packages within your `packages` config. ## Add specific packages From 5948f792a3061ec42fa64078157c8c80c22a7e28 Mon Sep 17 00:00:00 2001 From: Ly Nguyen <107218380+nghi-ly@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:13:24 -0800 Subject: [PATCH 117/121] Update website/docs/docs/dbt-versions/upgrade-dbt-version-in-cloud.md Co-authored-by: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> --- website/docs/docs/dbt-versions/upgrade-dbt-version-in-cloud.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/dbt-versions/upgrade-dbt-version-in-cloud.md b/website/docs/docs/dbt-versions/upgrade-dbt-version-in-cloud.md index 81535001aeb..2f4044b58f4 100644 --- a/website/docs/docs/dbt-versions/upgrade-dbt-version-in-cloud.md +++ b/website/docs/docs/dbt-versions/upgrade-dbt-version-in-cloud.md @@ -19,7 +19,7 @@ You can upgrade to **Keep on latest version** no matter which version of dbt you :::tip Interested? Let us know! -Currently, this feature is available in beta for select customers, rolling out to wider availability through February and March. Are you interested in getting early access? Please contact your account team to join! +This feature is available in beta for select customers, rolling out to wider availability through February and March. If you're interested in early access, please contact your account team to join! ::: From 2ca974e17cfa8fc4fd25c6cfd5e5712b3fa77cc4 Mon Sep 17 00:00:00 2001 From: Ly Nguyen <107218380+nghi-ly@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:15:28 -0800 Subject: [PATCH 118/121] Update website/docs/reference/commands/deps.md Co-authored-by: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> --- website/docs/reference/commands/deps.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/commands/deps.md b/website/docs/reference/commands/deps.md index 079f47c23cb..3ce0b2da81f 100644 --- a/website/docs/reference/commands/deps.md +++ b/website/docs/reference/commands/deps.md @@ -81,7 +81,7 @@ dbt deps --add-package dbt-labs/dbt_utils@1.0.0 dbt deps --add-package dbt-labs/snowplow@">=0.7.0,<0.8.0" ``` -For other package types, use the `--source` option: +For other package types, use the `--source` flag: ```shell # add package from git dbt deps --add-package https://github.com/fivetran/dbt_amplitude@v0.3.0 --source git From ad58b72605e72169fc4808550c042bbccd2e3a1e Mon Sep 17 00:00:00 2001 From: Ly Nguyen <107218380+nghi-ly@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:15:53 -0800 Subject: [PATCH 119/121] Update website/docs/reference/commands/deps.md Co-authored-by: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> --- website/docs/reference/commands/deps.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/commands/deps.md b/website/docs/reference/commands/deps.md index 3ce0b2da81f..980386b1c1d 100644 --- a/website/docs/reference/commands/deps.md +++ b/website/docs/reference/commands/deps.md @@ -70,7 +70,7 @@ It's possible to force package resolution to rerun, even if the `packages` confi ## Add specific packages -You can use the `dbt deps` command to add or update an existing package configuration — no need to remember the exact syntax for package configurations. +The `dbt deps` command can add or update an existing package configuration — no need to remember the exact syntax for package configurations. For Hub packages (default), which are the easiest to install: From 8a1a12b212bf526b48f9aeba27f769f6df71892e Mon Sep 17 00:00:00 2001 From: Ly Nguyen Date: Wed, 14 Feb 2024 14:22:11 -0800 Subject: [PATCH 120/121] Feedback --- website/docs/reference/project-configs/require-dbt-version.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/docs/reference/project-configs/require-dbt-version.md b/website/docs/reference/project-configs/require-dbt-version.md index 0289300c9ff..1d00eeb0be0 100644 --- a/website/docs/reference/project-configs/require-dbt-version.md +++ b/website/docs/reference/project-configs/require-dbt-version.md @@ -86,6 +86,8 @@ Pinning to a specific dbt version is discouraged because it limits project flexi While you can restrict your project to run only with an exact version of dbt Core, we do not recommend this for dbt Core v1.0.0 and higher. +::: + In the following example, the project will only run with dbt v1.5: From a101fb251d7d44caaa14bc5a20b406641de7118d Mon Sep 17 00:00:00 2001 From: Ly Nguyen Date: Wed, 14 Feb 2024 14:26:25 -0800 Subject: [PATCH 121/121] Review of unit test callout --- website/docs/docs/build/unit-tests.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/docs/build/unit-tests.md b/website/docs/docs/build/unit-tests.md index df262e6179a..6c83e435290 100644 --- a/website/docs/docs/build/unit-tests.md +++ b/website/docs/docs/build/unit-tests.md @@ -9,9 +9,9 @@ keywords: --- :::note closed beta -Support for unit testing dbt models is available to dbt Cloud customers who have selected [**Keep on latest version**](/docs/dbt-versions/upgrade-dbt-version-in-cloud#keep-on-latest-version). This is currently in closed beta, starting with select customers, and rolling out to wider availability through February and March. +Support for unit testing dbt models is available to dbt Cloud customers who have chosen to [Keep on latest version](/docs/dbt-versions/upgrade-dbt-version-in-cloud#keep-on-latest-version). This is currently in closed beta, starting with select customers and rolling out to wider availability through February and March. -For users of dbt Core, unit tests will be included in v1.8, planned for late April 2024. The v1.8.0-b1 release of `dbt-core` & dbt Labs-maintained adapters is planned for February 28. +For dbt Core, unit tests will be available in v1.8, planned for late April 2024. The v1.8.0-b1 release of `dbt-core` & dbt Labs-maintained adapters is planned for February 28. :::