Skip to content

Support dbt Core 1.10 by updating manifest v12#157

Merged
yu-iskw merged 2 commits intomainfrom
support-dbt-1.10
Jun 17, 2025
Merged

Support dbt Core 1.10 by updating manifest v12#157
yu-iskw merged 2 commits intomainfrom
support-dbt-1.10

Conversation

@yu-iskw
Copy link
Copy Markdown
Owner

@yu-iskw yu-iskw commented Jun 17, 2025

PR Type

Enhancement


Description

• Updated dbt artifacts parser to support dbt Core 1.10 by implementing manifest v12 schema changes
• Added new Quoting class and updated Metadata class with invocation_started_at and quoting fields
• Enhanced multiple node and column classes with doc_blocks field support
• Added freshness-related classes (BuildAfter, Freshness, UpdatesOn, Period) for improved data freshness handling
• Updated Sources class to include loaded_at_query field and changed Owner.email to support both string and list types
• Added tags and meta fields to various configuration classes for better metadata management
• Simplified granularity fields from enum types to string types across multiple classes
• Bumped package version from 0.8.3 to 0.9.0
• Updated version compatibility documentation to reflect dbt 1.7-1.10 support


Changes walkthrough 📝

Relevant files
Enhancement
manifest_v12.py
Update manifest v12 parser for dbt Core 1.10 support         

dbt_artifacts_parser/parsers/manifest/manifest_v12.py

• Added new Quoting class and moved it to the top of the file

Updated dbt_version from '1.9.4' to '1.10.0b3' in Metadata class

Added invocation_started_at and quoting fields to Metadata class

Added doc_blocks field to multiple column and node classes throughout
the file
• Added freshness-related classes (BuildAfter, Freshness,
UpdatesOn, Period enums)
• Updated Sources class to include
loaded_at_query field
• Changed Owner.email field type from str to
Union[str, List[str]]
• Added tags and meta fields to various config
classes
• Simplified granularity fields from enum types to string
types in multiple classes
• Added configuration fields to entity,
measure, and dimension classes

+275/-218
Configuration changes
__init__.py
Bump package version to 0.9.0                                                       

dbt_artifacts_parser/init.py

• Updated package version from "0.8.3" to "0.9.0"

+1/-1     
manifest_v12.json
Update manifest schema for dbt Core 1.10 compatibility     

dbt_artifacts_parser/resources/manifest/manifest_v12.json

• Updated default dbt version from "1.9.4" to "1.10.0b3"
• Added new
invocation_started_at field with string/null type support
• Added
comprehensive quoting configuration object with database, schema,
identifier, and column properties
• Added doc_blocks array field to
multiple resource types (models, macros, sources, etc.)
• Added
freshness configuration with build_after settings for models
• Added
loaded_at_query field for sources
• Enhanced semantic layer elements
with config objects containing meta properties
• Added tags field
support for saved queries and exposures
• Simplified array formatting
throughout the schema (inline bracket notation)
• Updated time
granularity enums to use generic string type instead of specific enum
values

+972/-1276
Documentation
README.md
Update version compatibility table for dbt 1.10 support   

README.md

• Added new row to version compatibility table showing version 0.9
supports dbt 1.7 to 1.10

+1/-0     

Need help?
  • Type /help how to ... in the comments thread for any questions about Qodo Merge usage.
  • Check out the documentation for more information.
  • Signed-off-by: Yu Ishikawa <yu-iskw@users.noreply.github.com>
    @coderabbitai
    Copy link
    Copy Markdown

    coderabbitai bot commented Jun 17, 2025

    Caution

    Review failed

    The pull request is closed.

    Walkthrough

    This update revises the manifest schema in manifest_v12.py, introducing new models, enums, and fields for quoting, freshness, and metadata. It updates config class names, adds richer doc_blocks and tagging support, and changes granularity fields from enums to strings. The package version is incremented to 0.9.0, and documentation is updated accordingly.

    Changes

    File(s) Change Summary
    README.md Added a new compatibility row for version 0.9, specifying dbt 1.7–1.10 and pydantic v2 requirements.
    dbt_artifacts_parser/init.py Updated __version__ from "0.8.3" to "0.9.0".
    dbt_artifacts_parser/parsers/manifest/manifest_v12.py Introduced new models/enums for quoting and freshness, added doc_blocks fields, changed granularity fields to strings, updated config class names and metadata fields, and allowed richer tagging/meta/email support.

    Sequence Diagram(s)

    sequenceDiagram
        participant User
        participant Parser
        participant ManifestSchema
    
        User->>Parser: Parse manifest v12 artifact
        Parser->>ManifestSchema: Instantiate models (with new Quoting, Freshness, doc_blocks, etc.)
        ManifestSchema-->>Parser: Return parsed structured data
        Parser-->>User: Provide parsed manifest with updated schema
    
    Loading

    Possibly related PRs

    • Support v1.9.1 #139: Both PRs change granularity fields in manifest_v12.py, but in opposite directions (enum ↔ string), directly modifying the same attributes.
    • Set __version__ to 0.8.0rc1 #128: Both PRs update the __version__ string in dbt_artifacts_parser/__init__.py, indicating related versioning changes.
    • Update README.md #77: Both PRs enhance the manifest_v12 schema and parser, with this PR extending models and the related PR introducing initial manifest_v12 parsing support.

    Suggested labels

    documentation, Review effort [1-5]: 2

    Suggested reviewers

    • yu-iskw

    Poem

    In fields of code where schemas grow,
    New quoting blooms and fresh winds blow.
    Doc blocks sprout in columns bright,
    Tags and meta take their flight.
    Version hops to nine—oh my!
    The parser leaps, the docs comply.
    🐇✨

    Warning

    There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

    🔧 Pylint (3.3.7)
    dbt_artifacts_parser/__init__.py
    dbt_artifacts_parser/parsers/manifest/manifest_v12.py

    📜 Recent review details

    Configuration used: CodeRabbit UI
    Review profile: CHILL
    Plan: Pro

    📥 Commits

    Reviewing files that changed from the base of the PR and between e50f391 and 587749e.

    ⛔ Files ignored due to path filters (1)
    • dbt_artifacts_parser/resources/manifest/manifest_v12.json is excluded by !**/*.json
    📒 Files selected for processing (3)
    • README.md (1 hunks)
    • dbt_artifacts_parser/__init__.py (1 hunks)
    • dbt_artifacts_parser/parsers/manifest/manifest_v12.py (125 hunks)
    ✨ Finishing Touches
    • 📝 Generate Docstrings

    Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

    ❤️ Share
    🪧 Tips

    Chat

    There are 3 ways to chat with CodeRabbit:

    • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
      • I pushed a fix in commit <commit_id>, please review it.
      • Explain this complex logic.
      • Open a follow-up GitHub issue for this discussion.
    • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
      • @coderabbitai explain this code block.
      • @coderabbitai modularize this function.
    • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
      • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
      • @coderabbitai read src/utils.ts and explain its main purpose.
      • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
      • @coderabbitai help me debug CodeRabbit configuration file.

    Support

    Need help? Create a ticket on our support page for assistance with any issues or questions.

    Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

    CodeRabbit Commands (Invoked using PR comments)

    • @coderabbitai pause to pause the reviews on a PR.
    • @coderabbitai resume to resume the paused reviews.
    • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
    • @coderabbitai full review to do a full review from scratch and review all the files again.
    • @coderabbitai summary to regenerate the summary of the PR.
    • @coderabbitai generate docstrings to generate docstrings for this PR.
    • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
    • @coderabbitai resolve resolve all the CodeRabbit review comments.
    • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
    • @coderabbitai help to get help.

    Other keywords and placeholders

    • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
    • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
    • Add @coderabbitai anywhere in the PR title to generate the title automatically.

    CodeRabbit Configuration File (.coderabbit.yaml)

    • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
    • Please see the configuration documentation for more information.
    • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

    Documentation and Community

    • Visit our Documentation for detailed information on how to use CodeRabbit.
    • Join our Discord Community to get help, request features, and share feedback.
    • Follow us on X/Twitter for updates and announcements.

    Signed-off-by: Yu Ishikawa <yu-iskw@users.noreply.github.com>
    @yu-iskw yu-iskw marked this pull request as ready for review June 17, 2025 05:33
    @qodo-code-review
    Copy link
    Copy Markdown

    PR Reviewer Guide 🔍

    Here are some key observations to aid the review process:

    ⏱️ Estimated effort to review: 4 🔵🔵🔵🔵⚪
    🧪 No relevant tests
    🔒 No security concerns identified
    ⚡ Recommended focus areas for review

    Code Duplication

    Multiple duplicate class definitions exist for BuildAfter, Freshness, and Config classes with identical structures but different names (e.g., BuildAfter, BuildAfter1, BuildAfter2, BuildAfter3). This creates maintenance overhead and potential inconsistencies.

    class BuildAfter(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        updates_on: Optional[UpdatesOn] = 'any'
        count: Optional[int] = 0
        period: Optional[Period] = 'hour'
    
    
    class Freshness(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        build_after: Optional[BuildAfter] = Field(None, title='ModelBuildAfter')
    
    
    class Config9(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        alias: Optional[str] = None
        schema_: Optional[str] = Field(None, alias='schema')
        database: Optional[str] = None
        tags: Optional[Union[List[str], str]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        materialized: Optional[str] = 'view'
        incremental_strategy: Optional[str] = None
        batch_size: Optional[Any] = None
        lookback: Optional[Any] = 1
        begin: Optional[Any] = None
        persist_docs: Optional[Dict[str, Any]] = None
        post_hook: Optional[List[PostHookItem]] = Field(None, alias='post-hook')
        pre_hook: Optional[List[PreHookItem]] = Field(None, alias='pre-hook')
        quoting: Optional[Dict[str, Any]] = None
        column_types: Optional[Dict[str, Any]] = None
        full_refresh: Optional[bool] = None
        unique_key: Optional[Union[str, List[str]]] = None
        on_schema_change: Optional[str] = 'ignore'
        on_configuration_change: Optional[OnConfigurationChange] = None
        grants: Optional[Dict[str, Any]] = None
        packages: Optional[List[str]] = None
        docs: Optional[Docs] = Field(None, title='Docs')
        contract: Optional[Contract7] = Field(None, title='ContractConfig')
        event_time: Optional[Any] = None
        concurrent_batches: Optional[Any] = None
        access: Optional[Access] = 'protected'
        freshness: Optional[Freshness] = None
    
    
    class Constraint4(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        type: Type
        name: Optional[str] = None
        expression: Optional[str] = None
        warn_unenforced: Optional[bool] = True
        warn_unsupported: Optional[bool] = True
        to: Optional[str] = None
        to_columns: Optional[List[str]] = None
    
    
    class Config10(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        meta: Optional[Dict[str, Any]] = None
        tags: Optional[List[str]] = None
    
    
    class Columns4(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        name: str
        description: Optional[str] = ''
        meta: Optional[Dict[str, Any]] = None
        data_type: Optional[str] = None
        constraints: Optional[List[Constraint4]] = None
        quote: Optional[bool] = None
        config: Optional[Config10] = Field(None, title='ColumnConfig')
        tags: Optional[List[str]] = None
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        granularity: Optional[Granularity] = None
        doc_blocks: Optional[List[str]] = None
    
    
    class Contract8(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        enforced: Optional[bool] = False
        alias_types: Optional[bool] = True
        checksum: Optional[str] = None
    
    
    class Constraint5(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        type: Type
        name: Optional[str] = None
        expression: Optional[str] = None
        warn_unenforced: Optional[bool] = True
        warn_unsupported: Optional[bool] = True
        to: Optional[str] = None
        to_columns: Optional[List[str]] = None
        columns: Optional[List[str]] = None
    
    
    class Contract9(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        enforced: Optional[bool] = False
        alias_types: Optional[bool] = True
    
    
    class Config11(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        alias: Optional[str] = None
        schema_: Optional[str] = Field(None, alias='schema')
        database: Optional[str] = None
        tags: Optional[Union[List[str], str]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        materialized: Optional[str] = 'view'
        incremental_strategy: Optional[str] = None
        batch_size: Optional[Any] = None
        lookback: Optional[Any] = 1
        begin: Optional[Any] = None
        persist_docs: Optional[Dict[str, Any]] = None
        post_hook: Optional[List[PostHookItem]] = Field(None, alias='post-hook')
        pre_hook: Optional[List[PreHookItem]] = Field(None, alias='pre-hook')
        quoting: Optional[Dict[str, Any]] = None
        column_types: Optional[Dict[str, Any]] = None
        full_refresh: Optional[bool] = None
        unique_key: Optional[Union[str, List[str]]] = None
        on_schema_change: Optional[str] = 'ignore'
        on_configuration_change: Optional[OnConfigurationChange] = None
        grants: Optional[Dict[str, Any]] = None
        packages: Optional[List[str]] = None
        docs: Optional[Docs] = Field(None, title='Docs')
        contract: Optional[Contract9] = Field(None, title='ContractConfig')
        event_time: Optional[Any] = None
        concurrent_batches: Optional[Any] = None
    
    
    class DeferRelation1(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        database: Optional[str] = None
        schema_: str = Field(..., alias='schema')
        alias: str
        relation_name: Optional[str] = None
        resource_type: ResourceType
        name: str
        description: str
        compiled_code: Optional[str] = None
        meta: Dict[str, Any]
        tags: List[str]
        config: Optional[Config11] = None
    
    
    class CustomGranularity(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: str
        column_name: Optional[str] = None
    
    
    class TimeSpine(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        standard_granularity_column: str
        custom_granularities: Optional[List[CustomGranularity]] = None
    
    
    class BuildAfter1(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        updates_on: Optional[UpdatesOn] = 'any'
        count: Optional[int] = 0
        period: Optional[Period] = 'hour'
    
    
    class Freshness1(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        build_after: Optional[BuildAfter1] = Field(None, title='ModelBuildAfter')
    
    
    class Nodes4(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        database: Optional[str] = None
        schema_: str = Field(..., alias='schema')
        name: str
        resource_type: Literal['model']
        package_name: str
        path: str
        original_file_path: str
        unique_id: str
        fqn: List[str]
        alias: str
        checksum: Checksum = Field(..., title='FileHash')
        config: Optional[Config9] = Field(None, title='ModelConfig')
        tags: Optional[List[str]] = None
        description: Optional[str] = ''
        columns: Optional[Dict[str, Columns4]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        docs: Optional[Docs] = Field(None, title='Docs')
        patch_path: Optional[str] = None
        build_path: Optional[str] = None
        unrendered_config: Optional[Dict[str, Any]] = None
        created_at: Optional[float] = None
        config_call_dict: Optional[Dict[str, Any]] = None
        unrendered_config_call_dict: Optional[Dict[str, Any]] = None
        relation_name: Optional[str] = None
        raw_code: Optional[str] = ''
        doc_blocks: Optional[List[str]] = None
        language: Optional[str] = 'sql'
        refs: Optional[List[Ref]] = None
        sources: Optional[List[List[str]]] = None
        metrics: Optional[List[List[str]]] = None
        depends_on: Optional[DependsOn1] = Field(None, title='DependsOn')
        compiled_path: Optional[str] = None
        compiled: Optional[bool] = False
        compiled_code: Optional[str] = None
        extra_ctes_injected: Optional[bool] = False
        extra_ctes: Optional[List[ExtraCte]] = None
        field_pre_injected_sql: Optional[str] = Field(None, alias='_pre_injected_sql')
        contract: Optional[Contract8] = Field(None, title='Contract')
        access: Optional[Access] = 'protected'
        constraints: Optional[List[Constraint5]] = None
        version: Optional[Union[str, float]] = None
        latest_version: Optional[Union[str, float]] = None
        deprecation_date: Optional[str] = None
        defer_relation: Optional[DeferRelation1] = None
        primary_key: Optional[List[str]] = None
        time_spine: Optional[TimeSpine] = None
        freshness: Optional[Freshness1] = None
    
    
    class Config12(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        alias: Optional[str] = None
        schema_: Optional[str] = Field(None, alias='schema')
        database: Optional[str] = None
        tags: Optional[Union[List[str], str]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        materialized: Optional[str] = 'view'
        incremental_strategy: Optional[str] = None
        batch_size: Optional[Any] = None
        lookback: Optional[Any] = 1
        begin: Optional[Any] = None
        persist_docs: Optional[Dict[str, Any]] = None
        post_hook: Optional[List[PostHookItem]] = Field(None, alias='post-hook')
        pre_hook: Optional[List[PreHookItem]] = Field(None, alias='pre-hook')
        quoting: Optional[Dict[str, Any]] = None
        column_types: Optional[Dict[str, Any]] = None
        full_refresh: Optional[bool] = None
        unique_key: Optional[Union[str, List[str]]] = None
        on_schema_change: Optional[str] = 'ignore'
        on_configuration_change: Optional[OnConfigurationChange] = None
        grants: Optional[Dict[str, Any]] = None
        packages: Optional[List[str]] = None
        docs: Optional[Docs] = Field(None, title='Docs')
        contract: Optional[Contract9] = Field(None, title='ContractConfig')
        event_time: Optional[Any] = None
        concurrent_batches: Optional[Any] = None
    
    
    class Constraint6(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        type: Type
        name: Optional[str] = None
        expression: Optional[str] = None
        warn_unenforced: Optional[bool] = True
        warn_unsupported: Optional[bool] = True
        to: Optional[str] = None
        to_columns: Optional[List[str]] = None
    
    
    class Config13(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        meta: Optional[Dict[str, Any]] = None
        tags: Optional[List[str]] = None
    
    
    class Columns5(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        name: str
        description: Optional[str] = ''
        meta: Optional[Dict[str, Any]] = None
        data_type: Optional[str] = None
        constraints: Optional[List[Constraint6]] = None
        quote: Optional[bool] = None
        config: Optional[Config13] = Field(None, title='ColumnConfig')
        tags: Optional[List[str]] = None
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        granularity: Optional[Granularity] = None
        doc_blocks: Optional[List[str]] = None
    
    
    class Contract11(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        enforced: Optional[bool] = False
        alias_types: Optional[bool] = True
        checksum: Optional[str] = None
    
    
    class Nodes5(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        database: Optional[str] = None
        schema_: str = Field(..., alias='schema')
        name: str
        resource_type: Literal['sql_operation']
        package_name: str
        path: str
        original_file_path: str
        unique_id: str
        fqn: List[str]
        alias: str
        checksum: Checksum = Field(..., title='FileHash')
        config: Optional[Config12] = Field(None, title='NodeConfig')
        tags: Optional[List[str]] = None
        description: Optional[str] = ''
        columns: Optional[Dict[str, Columns5]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        docs: Optional[Docs] = Field(None, title='Docs')
        patch_path: Optional[str] = None
        build_path: Optional[str] = None
        unrendered_config: Optional[Dict[str, Any]] = None
        created_at: Optional[float] = None
        config_call_dict: Optional[Dict[str, Any]] = None
        unrendered_config_call_dict: Optional[Dict[str, Any]] = None
        relation_name: Optional[str] = None
        raw_code: Optional[str] = ''
        doc_blocks: Optional[List[str]] = None
        language: Optional[str] = 'sql'
        refs: Optional[List[Ref]] = None
        sources: Optional[List[List[str]]] = None
        metrics: Optional[List[List[str]]] = None
        depends_on: Optional[DependsOn1] = Field(None, title='DependsOn')
        compiled_path: Optional[str] = None
        compiled: Optional[bool] = False
        compiled_code: Optional[str] = None
        extra_ctes_injected: Optional[bool] = False
        extra_ctes: Optional[List[ExtraCte]] = None
        field_pre_injected_sql: Optional[str] = Field(None, alias='_pre_injected_sql')
        contract: Optional[Contract11] = Field(None, title='Contract')
    
    
    class Config14(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        alias: Optional[str] = None
        schema_: Optional[str] = Field('dbt_test__audit', alias='schema')
        database: Optional[str] = None
        tags: Optional[Union[List[str], str]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        materialized: Optional[str] = 'test'
        severity: Optional[constr(pattern=r'^([Ww][Aa][Rr][Nn]|[Ee][Rr][Rr][Oo][Rr])$')] = (
            'ERROR'
        )
        store_failures: Optional[bool] = None
        store_failures_as: Optional[str] = None
        where: Optional[str] = None
        limit: Optional[int] = None
        fail_calc: Optional[str] = 'count(*)'
        warn_if: Optional[str] = '!= 0'
        error_if: Optional[str] = '!= 0'
    
    
    class Constraint7(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        type: Type
        name: Optional[str] = None
        expression: Optional[str] = None
        warn_unenforced: Optional[bool] = True
        warn_unsupported: Optional[bool] = True
        to: Optional[str] = None
        to_columns: Optional[List[str]] = None
    
    
    class Config15(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        meta: Optional[Dict[str, Any]] = None
        tags: Optional[List[str]] = None
    
    
    class Columns6(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        name: str
        description: Optional[str] = ''
        meta: Optional[Dict[str, Any]] = None
        data_type: Optional[str] = None
        constraints: Optional[List[Constraint7]] = None
        quote: Optional[bool] = None
        config: Optional[Config15] = Field(None, title='ColumnConfig')
        tags: Optional[List[str]] = None
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        granularity: Optional[Granularity] = None
        doc_blocks: Optional[List[str]] = None
    
    
    class TestMetadata(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: Optional[str] = 'test'
        kwargs: Optional[Dict[str, Any]] = None
        namespace: Optional[str] = None
    
    
    class Nodes6(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        database: Optional[str] = None
        schema_: str = Field(..., alias='schema')
        name: str
        resource_type: Literal['test']
        package_name: str
        path: str
        original_file_path: str
        unique_id: str
        fqn: List[str]
        alias: str
        checksum: Checksum = Field(..., title='FileHash')
        config: Optional[Config14] = Field(None, title='TestConfig')
        tags: Optional[List[str]] = None
        description: Optional[str] = ''
        columns: Optional[Dict[str, Columns6]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        docs: Optional[Docs] = Field(None, title='Docs')
        patch_path: Optional[str] = None
        build_path: Optional[str] = None
        unrendered_config: Optional[Dict[str, Any]] = None
        created_at: Optional[float] = None
        config_call_dict: Optional[Dict[str, Any]] = None
        unrendered_config_call_dict: Optional[Dict[str, Any]] = None
        relation_name: Optional[str] = None
        raw_code: Optional[str] = ''
        doc_blocks: Optional[List[str]] = None
        language: Optional[str] = 'sql'
        refs: Optional[List[Ref]] = None
        sources: Optional[List[List[str]]] = None
        metrics: Optional[List[List[str]]] = None
        depends_on: Optional[DependsOn1] = Field(None, title='DependsOn')
        compiled_path: Optional[str] = None
        compiled: Optional[bool] = False
        compiled_code: Optional[str] = None
        extra_ctes_injected: Optional[bool] = False
        extra_ctes: Optional[List[ExtraCte]] = None
        field_pre_injected_sql: Optional[str] = Field(None, alias='_pre_injected_sql')
        contract: Optional[Contract11] = Field(None, title='Contract')
        column_name: Optional[str] = None
        file_key_name: Optional[str] = None
        attached_node: Optional[str] = None
        test_metadata: Optional[TestMetadata] = Field(None, title='TestMetadata')
    
    
    class Contract13(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        enforced: Optional[bool] = False
        alias_types: Optional[bool] = True
    
    
    class SnapshotMetaColumnNames(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        dbt_valid_to: Optional[str] = None
        dbt_valid_from: Optional[str] = None
        dbt_scd_id: Optional[str] = None
        dbt_updated_at: Optional[str] = None
        dbt_is_deleted: Optional[str] = None
    
    
    class Config16(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        alias: Optional[str] = None
        schema_: Optional[str] = Field(None, alias='schema')
        database: Optional[str] = None
        tags: Optional[Union[List[str], str]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        materialized: Optional[str] = 'snapshot'
        incremental_strategy: Optional[str] = None
        batch_size: Optional[Any] = None
        lookback: Optional[Any] = 1
        begin: Optional[Any] = None
        persist_docs: Optional[Dict[str, Any]] = None
        post_hook: Optional[List[PostHookItem]] = Field(None, alias='post-hook')
        pre_hook: Optional[List[PreHookItem]] = Field(None, alias='pre-hook')
        quoting: Optional[Dict[str, Any]] = None
        column_types: Optional[Dict[str, Any]] = None
        full_refresh: Optional[bool] = None
        unique_key: Optional[Union[str, List[str]]] = None
        on_schema_change: Optional[str] = 'ignore'
        on_configuration_change: Optional[OnConfigurationChange] = None
        grants: Optional[Dict[str, Any]] = None
        packages: Optional[List[str]] = None
        docs: Optional[Docs] = Field(None, title='Docs')
        contract: Optional[Contract13] = Field(None, title='ContractConfig')
        event_time: Optional[Any] = None
        concurrent_batches: Optional[Any] = None
        strategy: Optional[str] = None
        target_schema: Optional[str] = None
        target_database: Optional[str] = None
        updated_at: Optional[str] = None
        check_cols: Optional[Union[str, List[str]]] = None
        snapshot_meta_column_names: Optional[SnapshotMetaColumnNames] = Field(
            None, title='SnapshotMetaColumnNames'
        )
        dbt_valid_to_current: Optional[str] = None
    
    
    class Constraint8(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        type: Type
        name: Optional[str] = None
        expression: Optional[str] = None
        warn_unenforced: Optional[bool] = True
        warn_unsupported: Optional[bool] = True
        to: Optional[str] = None
        to_columns: Optional[List[str]] = None
    
    
    class Config17(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        meta: Optional[Dict[str, Any]] = None
        tags: Optional[List[str]] = None
    
    
    class Columns7(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        name: str
        description: Optional[str] = ''
        meta: Optional[Dict[str, Any]] = None
        data_type: Optional[str] = None
        constraints: Optional[List[Constraint8]] = None
        quote: Optional[bool] = None
        config: Optional[Config17] = Field(None, title='ColumnConfig')
        tags: Optional[List[str]] = None
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        granularity: Optional[Granularity] = None
        doc_blocks: Optional[List[str]] = None
    
    
    class Contract14(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        enforced: Optional[bool] = False
        alias_types: Optional[bool] = True
        checksum: Optional[str] = None
    
    
    class Contract15(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        enforced: Optional[bool] = False
        alias_types: Optional[bool] = True
    
    
    class Config18(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        alias: Optional[str] = None
        schema_: Optional[str] = Field(None, alias='schema')
        database: Optional[str] = None
        tags: Optional[Union[List[str], str]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        materialized: Optional[str] = 'view'
        incremental_strategy: Optional[str] = None
        batch_size: Optional[Any] = None
        lookback: Optional[Any] = 1
        begin: Optional[Any] = None
        persist_docs: Optional[Dict[str, Any]] = None
        post_hook: Optional[List[PostHookItem]] = Field(None, alias='post-hook')
        pre_hook: Optional[List[PreHookItem]] = Field(None, alias='pre-hook')
        quoting: Optional[Dict[str, Any]] = None
        column_types: Optional[Dict[str, Any]] = None
        full_refresh: Optional[bool] = None
        unique_key: Optional[Union[str, List[str]]] = None
        on_schema_change: Optional[str] = 'ignore'
        on_configuration_change: Optional[OnConfigurationChange] = None
        grants: Optional[Dict[str, Any]] = None
        packages: Optional[List[str]] = None
        docs: Optional[Docs] = Field(None, title='Docs')
        contract: Optional[Contract15] = Field(None, title='ContractConfig')
        event_time: Optional[Any] = None
        concurrent_batches: Optional[Any] = None
    
    
    class DeferRelation2(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        database: Optional[str] = None
        schema_: str = Field(..., alias='schema')
        alias: str
        relation_name: Optional[str] = None
        resource_type: ResourceType
        name: str
        description: str
        compiled_code: Optional[str] = None
        meta: Dict[str, Any]
        tags: List[str]
        config: Optional[Config18] = None
    
    
    class Nodes7(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        database: Optional[str] = None
        schema_: str = Field(..., alias='schema')
        name: str
        resource_type: Literal['snapshot']
        package_name: str
        path: str
        original_file_path: str
        unique_id: str
        fqn: List[str]
        alias: str
        checksum: Checksum = Field(..., title='FileHash')
        config: Config16 = Field(..., title='SnapshotConfig')
        tags: Optional[List[str]] = None
        description: Optional[str] = ''
        columns: Optional[Dict[str, Columns7]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        docs: Optional[Docs] = Field(None, title='Docs')
        patch_path: Optional[str] = None
        build_path: Optional[str] = None
        unrendered_config: Optional[Dict[str, Any]] = None
        created_at: Optional[float] = None
        config_call_dict: Optional[Dict[str, Any]] = None
        unrendered_config_call_dict: Optional[Dict[str, Any]] = None
        relation_name: Optional[str] = None
        raw_code: Optional[str] = ''
        doc_blocks: Optional[List[str]] = None
        language: Optional[str] = 'sql'
        refs: Optional[List[Ref]] = None
        sources: Optional[List[List[str]]] = None
        metrics: Optional[List[List[str]]] = None
        depends_on: Optional[DependsOn1] = Field(None, title='DependsOn')
        compiled_path: Optional[str] = None
        compiled: Optional[bool] = False
        compiled_code: Optional[str] = None
        extra_ctes_injected: Optional[bool] = False
        extra_ctes: Optional[List[ExtraCte]] = None
        field_pre_injected_sql: Optional[str] = Field(None, alias='_pre_injected_sql')
        contract: Optional[Contract14] = Field(None, title='Contract')
        defer_relation: Optional[DeferRelation2] = None
    
    
    class WarnAfter(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        count: Optional[int] = None
        period: Optional[Period] = None
    
    
    class ErrorAfter(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        count: Optional[int] = None
        period: Optional[Period] = None
    
    
    class Freshness2(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        warn_after: Optional[WarnAfter] = None
        error_after: Optional[ErrorAfter] = None
        filter: Optional[str] = None
    
    
    class Partition(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        name: Optional[str] = ''
        description: Optional[str] = ''
        data_type: Optional[str] = ''
        meta: Optional[Dict[str, Any]] = None
    
    
    class External(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        location: Optional[str] = None
        file_format: Optional[str] = None
        row_format: Optional[str] = None
        tbl_properties: Optional[str] = None
        partitions: Optional[Union[List[str], List[Partition]]] = None
    
    
    class Constraint9(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        type: Type
        name: Optional[str] = None
        expression: Optional[str] = None
        warn_unenforced: Optional[bool] = True
        warn_unsupported: Optional[bool] = True
        to: Optional[str] = None
        to_columns: Optional[List[str]] = None
    
    
    class Config19(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        meta: Optional[Dict[str, Any]] = None
        tags: Optional[List[str]] = None
    
    
    class Columns8(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        name: str
        description: Optional[str] = ''
        meta: Optional[Dict[str, Any]] = None
        data_type: Optional[str] = None
        constraints: Optional[List[Constraint9]] = None
        quote: Optional[bool] = None
        config: Optional[Config19] = Field(None, title='ColumnConfig')
        tags: Optional[List[str]] = None
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        granularity: Optional[Granularity] = None
        doc_blocks: Optional[List[str]] = None
    
    
    class WarnAfter1(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        count: Optional[int] = None
        period: Optional[Period] = None
    
    
    class ErrorAfter1(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        count: Optional[int] = None
        period: Optional[Period] = None
    
    
    class Freshness3(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        warn_after: Optional[WarnAfter1] = None
        error_after: Optional[ErrorAfter1] = None
        filter: Optional[str] = None
    
    
    class Config20(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        event_time: Optional[Any] = None
        freshness: Optional[Freshness3] = None
    
    
    class Sources(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        database: Optional[str] = None
        schema_: str = Field(..., alias='schema')
        name: str
        resource_type: Literal['source']
        package_name: str
        path: str
        original_file_path: str
        unique_id: str
        fqn: List[str]
        source_name: str
        source_description: str
        loader: str
        identifier: str
        quoting: Optional[Quoting] = Field(None, title='Quoting')
        loaded_at_field: Optional[str] = None
        loaded_at_query: Optional[str] = None
        freshness: Optional[Freshness2] = None
        external: Optional[External] = None
        description: Optional[str] = ''
        columns: Optional[Dict[str, Columns8]] = None
        meta: Optional[Dict[str, Any]] = None
        source_meta: Optional[Dict[str, Any]] = None
        tags: Optional[List[str]] = None
        config: Optional[Config20] = Field(None, title='SourceConfig')
        patch_path: Optional[str] = None
        unrendered_config: Optional[Dict[str, Any]] = None
        relation_name: Optional[str] = None
        created_at: Optional[float] = None
        unrendered_database: Optional[str] = None
        unrendered_schema: Optional[str] = None
        doc_blocks: Optional[List[str]] = None
    
    
    class DependsOn8(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        macros: Optional[List[str]] = None
    
    
    class Argument(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: str
        type: Optional[str] = None
        description: Optional[str] = ''
    
    
    class SupportedLanguage(Enum):
        python = 'python'
        sql = 'sql'
    
    
    class Macros(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: str
        resource_type: Literal['macro']
        package_name: str
        path: str
        original_file_path: str
        unique_id: str
        macro_sql: str
        depends_on: Optional[DependsOn8] = Field(None, title='MacroDependsOn')
        description: Optional[str] = ''
        meta: Optional[Dict[str, Any]] = None
        docs: Optional[Docs] = Field(None, title='Docs')
        patch_path: Optional[str] = None
        arguments: Optional[List[Argument]] = None
        created_at: Optional[float] = None
        supported_languages: Optional[List[SupportedLanguage]] = None
    
    
    class Docs18(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: str
        resource_type: Literal['doc']
        package_name: str
        path: str
        original_file_path: str
        unique_id: str
        block_contents: str
    
    
    class Type10(Enum):
        dashboard = 'dashboard'
        notebook = 'notebook'
        analysis = 'analysis'
        ml = 'ml'
        application = 'application'
    
    
    class Owner(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        email: Optional[Union[str, List[str]]] = None
        name: Optional[str] = None
    
    
    class Maturity(Enum):
        low = 'low'
        medium = 'medium'
        high = 'high'
    
    
    class Config21(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        tags: Optional[List[str]] = None
        meta: Optional[Dict[str, Any]] = None
    
    
    class DependsOn9(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        macros: Optional[List[str]] = None
        nodes: Optional[List[str]] = None
    
    
    class Exposures(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: str
        resource_type: Literal['exposure']
        package_name: str
        path: str
        original_file_path: str
        unique_id: str
        fqn: List[str]
        type: Type10
        owner: Owner = Field(..., title='Owner')
        description: Optional[str] = ''
        label: Optional[str] = None
        maturity: Optional[Maturity] = None
        meta: Optional[Dict[str, Any]] = None
        tags: Optional[List[str]] = None
        config: Optional[Config21] = Field(None, title='ExposureConfig')
        unrendered_config: Optional[Dict[str, Any]] = None
        url: Optional[str] = None
        depends_on: Optional[DependsOn9] = Field(None, title='DependsOn')
        refs: Optional[List[Ref]] = None
        sources: Optional[List[List[str]]] = None
        metrics: Optional[List[List[str]]] = None
        created_at: Optional[float] = None
    
    
    class Type11(Enum):
        simple = 'simple'
        ratio = 'ratio'
        cumulative = 'cumulative'
        derived = 'derived'
        conversion = 'conversion'
    
    
    class WhereFilter(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        where_sql_template: str
    
    
    class Filter(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        where_filters: List[WhereFilter]
    
    
    class Measure(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: str
        filter: Optional[Filter] = None
        alias: Optional[str] = None
        join_to_timespine: Optional[bool] = False
        fill_nulls_with: Optional[int] = None
    
    
    class Filter1(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        where_filters: List[WhereFilter]
    
    
    class InputMeasure(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: str
        filter: Optional[Filter1] = None
        alias: Optional[str] = None
        join_to_timespine: Optional[bool] = False
        fill_nulls_with: Optional[int] = None
    
    
    class Filter2(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        where_filters: List[WhereFilter]
    
    
    class OffsetWindow(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        count: int
        granularity: str
    
    
    class Numerator(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: str
        filter: Optional[Filter2] = None
        alias: Optional[str] = None
        offset_window: Optional[OffsetWindow] = None
        offset_to_grain: Optional[str] = None
    
    
    class Filter3(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        where_filters: List[WhereFilter]
    
    
    class Denominator(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: str
        filter: Optional[Filter3] = None
        alias: Optional[str] = None
        offset_window: Optional[OffsetWindow] = None
        offset_to_grain: Optional[str] = None
    
    
    class Window(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        count: int
        granularity: str
    
    
    class GrainToDate(Enum):
        nanosecond = 'nanosecond'
        microsecond = 'microsecond'
        millisecond = 'millisecond'
        second = 'second'
        minute = 'minute'
        hour = 'hour'
        day = 'day'
        week = 'week'
        month = 'month'
        quarter = 'quarter'
        year = 'year'
    
    
    class Filter4(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        where_filters: List[WhereFilter]
    
    
    class Metric(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: str
        filter: Optional[Filter4] = None
        alias: Optional[str] = None
        offset_window: Optional[OffsetWindow] = None
        offset_to_grain: Optional[str] = None
    
    
    class Filter5(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        where_filters: List[WhereFilter]
    
    
    class BaseMeasure(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: str
        filter: Optional[Filter5] = None
        alias: Optional[str] = None
        join_to_timespine: Optional[bool] = False
        fill_nulls_with: Optional[int] = None
    
    
    class Filter6(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        where_filters: List[WhereFilter]
    
    
    class ConversionMeasure(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: str
        filter: Optional[Filter6] = None
        alias: Optional[str] = None
        join_to_timespine: Optional[bool] = False
        fill_nulls_with: Optional[int] = None
    
    
    class Calculation(Enum):
        conversions = 'conversions'
        conversion_rate = 'conversion_rate'
    
    
    class ConstantProperty(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        base_property: str
        conversion_property: str
    
    
    class ConversionTypeParams(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        base_measure: BaseMeasure = Field(..., title='MetricInputMeasure')
        conversion_measure: ConversionMeasure = Field(..., title='MetricInputMeasure')
        entity: str
        calculation: Optional[Calculation] = 'conversion_rate'
        window: Optional[Window] = None
        constant_properties: Optional[List[ConstantProperty]] = None
    
    
    class PeriodAgg(Enum):
        first = 'first'
        last = 'last'
        average = 'average'
    
    
    class CumulativeTypeParams(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        window: Optional[Window] = None
        grain_to_date: Optional[str] = None
        period_agg: Optional[PeriodAgg] = 'first'
    
    
    class TypeParams(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        measure: Optional[Measure] = None
        input_measures: Optional[List[InputMeasure]] = None
        numerator: Optional[Numerator] = None
        denominator: Optional[Denominator] = None
        expr: Optional[str] = None
        window: Optional[Window] = None
        grain_to_date: Optional[GrainToDate] = None
        metrics: Optional[List[Metric]] = None
        conversion_type_params: Optional[ConversionTypeParams] = None
        cumulative_type_params: Optional[CumulativeTypeParams] = None
    
    
    class Filter7(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        where_filters: List[WhereFilter]
    
    
    class FileSlice(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        filename: str
        content: str
        start_line_number: int
        end_line_number: int
    
    
    class Metadata1(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        repo_file_path: str
        file_slice: FileSlice = Field(..., title='FileSlice')
    
    
    class Config22(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        group: Optional[str] = None
        meta: Optional[Dict[str, Any]] = None
    
    
    class Metrics(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: str
        resource_type: Literal['metric']
        package_name: str
        path: str
        original_file_path: str
        unique_id: str
        fqn: List[str]
        description: str
        label: str
        type: Type11
        type_params: TypeParams = Field(..., title='MetricTypeParams')
        filter: Optional[Filter7] = None
        metadata: Optional[Metadata1] = None
        time_granularity: Optional[str] = None
        meta: Optional[Dict[str, Any]] = None
        tags: Optional[List[str]] = None
        config: Optional[Config22] = Field(None, title='MetricConfig')
        unrendered_config: Optional[Dict[str, Any]] = None
        sources: Optional[List[List[str]]] = None
        depends_on: Optional[DependsOn9] = Field(None, title='DependsOn')
        refs: Optional[List[Ref]] = None
        metrics: Optional[List[List[str]]] = None
        created_at: Optional[float] = None
        group: Optional[str] = None
    
    
    class Config23(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        meta: Optional[Dict[str, Any]] = None
    
    
    class Groups(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        name: str
        resource_type: Literal['group']
        package_name: str
        path: str
        original_file_path: str
        unique_id: str
        owner: Owner = Field(..., title='Owner')
        description: Optional[str] = None
        config: Optional[Config23] = Field(None, title='GroupConfig')
    
    
    class Docs19(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        show: Optional[bool] = True
        node_color: Optional[str] = None
    
    
    class Config24(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        alias: Optional[str] = None
        schema_: Optional[str] = Field(None, alias='schema')
        database: Optional[str] = None
        tags: Optional[Union[List[str], str]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        materialized: Optional[str] = 'seed'
        incremental_strategy: Optional[str] = None
        batch_size: Optional[Any] = None
        lookback: Optional[Any] = 1
        begin: Optional[Any] = None
        persist_docs: Optional[Dict[str, Any]] = None
        post_hook: Optional[List[PostHookItem]] = Field(None, alias='post-hook')
        pre_hook: Optional[List[PreHookItem]] = Field(None, alias='pre-hook')
        quoting: Optional[Dict[str, Any]] = None
        column_types: Optional[Dict[str, Any]] = None
        full_refresh: Optional[bool] = None
        unique_key: Optional[Union[str, List[str]]] = None
        on_schema_change: Optional[str] = 'ignore'
        on_configuration_change: Optional[OnConfigurationChange] = None
        grants: Optional[Dict[str, Any]] = None
        packages: Optional[List[str]] = None
        docs: Optional[Docs19] = Field(None, title='Docs')
        contract: Optional[Contract15] = Field(None, title='ContractConfig')
        event_time: Optional[Any] = None
        concurrent_batches: Optional[Any] = None
        delimiter: Optional[str] = ','
        quote_columns: Optional[bool] = None
    
    
    class Type12(Enum):
        check = 'check'
        not_null = 'not_null'
        unique = 'unique'
        primary_key = 'primary_key'
        foreign_key = 'foreign_key'
        custom = 'custom'
    
    
    class Constraint10(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        type: Type12
        name: Optional[str] = None
        expression: Optional[str] = None
        warn_unenforced: Optional[bool] = True
        warn_unsupported: Optional[bool] = True
        to: Optional[str] = None
        to_columns: Optional[List[str]] = None
    
    
    class Config25(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        meta: Optional[Dict[str, Any]] = None
        tags: Optional[List[str]] = None
    
    
    class Columns9(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        name: str
        description: Optional[str] = ''
        meta: Optional[Dict[str, Any]] = None
        data_type: Optional[str] = None
        constraints: Optional[List[Constraint10]] = None
        quote: Optional[bool] = None
        config: Optional[Config25] = Field(None, title='ColumnConfig')
        tags: Optional[List[str]] = None
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        granularity: Optional[Granularity] = None
        doc_blocks: Optional[List[str]] = None
    
    
    class DependsOn11(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        macros: Optional[List[str]] = None
    
    
    class Config26(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        alias: Optional[str] = None
        schema_: Optional[str] = Field(None, alias='schema')
        database: Optional[str] = None
        tags: Optional[Union[List[str], str]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        materialized: Optional[str] = 'view'
        incremental_strategy: Optional[str] = None
        batch_size: Optional[Any] = None
        lookback: Optional[Any] = 1
        begin: Optional[Any] = None
        persist_docs: Optional[Dict[str, Any]] = None
        post_hook: Optional[List[PostHookItem]] = Field(None, alias='post-hook')
        pre_hook: Optional[List[PreHookItem]] = Field(None, alias='pre-hook')
        quoting: Optional[Dict[str, Any]] = None
        column_types: Optional[Dict[str, Any]] = None
        full_refresh: Optional[bool] = None
        unique_key: Optional[Union[str, List[str]]] = None
        on_schema_change: Optional[str] = 'ignore'
        on_configuration_change: Optional[OnConfigurationChange] = None
        grants: Optional[Dict[str, Any]] = None
        packages: Optional[List[str]] = None
        docs: Optional[Docs19] = Field(None, title='Docs')
        contract: Optional[Contract15] = Field(None, title='ContractConfig')
        event_time: Optional[Any] = None
        concurrent_batches: Optional[Any] = None
    
    
    class DeferRelation3(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        database: Optional[str] = None
        schema_: str = Field(..., alias='schema')
        alias: str
        relation_name: Optional[str] = None
        resource_type: ResourceType
        name: str
        description: str
        compiled_code: Optional[str] = None
        meta: Dict[str, Any]
        tags: List[str]
        config: Optional[Config26] = None
    
    
    class Disabled(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        database: Optional[str] = None
        schema_: str = Field(..., alias='schema')
        name: str
        resource_type: Literal['seed']
        package_name: str
        path: str
        original_file_path: str
        unique_id: str
        fqn: List[str]
        alias: str
        checksum: Checksum = Field(..., title='FileHash')
        config: Optional[Config24] = Field(None, title='SeedConfig')
        tags: Optional[List[str]] = None
        description: Optional[str] = ''
        columns: Optional[Dict[str, Columns9]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        docs: Optional[Docs19] = Field(None, title='Docs')
        patch_path: Optional[str] = None
        build_path: Optional[str] = None
        unrendered_config: Optional[Dict[str, Any]] = None
        created_at: Optional[float] = None
        config_call_dict: Optional[Dict[str, Any]] = None
        unrendered_config_call_dict: Optional[Dict[str, Any]] = None
        relation_name: Optional[str] = None
        raw_code: Optional[str] = ''
        doc_blocks: Optional[List[str]] = None
        root_path: Optional[str] = None
        depends_on: Optional[DependsOn11] = Field(None, title='MacroDependsOn')
        defer_relation: Optional[DeferRelation3] = None
    
    
    class Config27(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        alias: Optional[str] = None
        schema_: Optional[str] = Field(None, alias='schema')
        database: Optional[str] = None
        tags: Optional[Union[List[str], str]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        materialized: Optional[str] = 'view'
        incremental_strategy: Optional[str] = None
        batch_size: Optional[Any] = None
        lookback: Optional[Any] = 1
        begin: Optional[Any] = None
        persist_docs: Optional[Dict[str, Any]] = None
        post_hook: Optional[List[PostHookItem]] = Field(None, alias='post-hook')
        pre_hook: Optional[List[PreHookItem]] = Field(None, alias='pre-hook')
        quoting: Optional[Dict[str, Any]] = None
        column_types: Optional[Dict[str, Any]] = None
        full_refresh: Optional[bool] = None
        unique_key: Optional[Union[str, List[str]]] = None
        on_schema_change: Optional[str] = 'ignore'
        on_configuration_change: Optional[OnConfigurationChange] = None
        grants: Optional[Dict[str, Any]] = None
        packages: Optional[List[str]] = None
        docs: Optional[Docs19] = Field(None, title='Docs')
        contract: Optional[Contract15] = Field(None, title='ContractConfig')
        event_time: Optional[Any] = None
        concurrent_batches: Optional[Any] = None
    
    
    class Constraint11(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        type: Type12
        name: Optional[str] = None
        expression: Optional[str] = None
        warn_unenforced: Optional[bool] = True
        warn_unsupported: Optional[bool] = True
        to: Optional[str] = None
        to_columns: Optional[List[str]] = None
    
    
    class Config28(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        meta: Optional[Dict[str, Any]] = None
        tags: Optional[List[str]] = None
    
    
    class Columns10(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        name: str
        description: Optional[str] = ''
        meta: Optional[Dict[str, Any]] = None
        data_type: Optional[str] = None
        constraints: Optional[List[Constraint11]] = None
        quote: Optional[bool] = None
        config: Optional[Config28] = Field(None, title='ColumnConfig')
        tags: Optional[List[str]] = None
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        granularity: Optional[Granularity] = None
        doc_blocks: Optional[List[str]] = None
    
    
    class DependsOn12(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        macros: Optional[List[str]] = None
        nodes: Optional[List[str]] = None
    
    
    class Contract19(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        enforced: Optional[bool] = False
        alias_types: Optional[bool] = True
        checksum: Optional[str] = None
    
    
    class Disabled1(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        database: Optional[str] = None
        schema_: str = Field(..., alias='schema')
        name: str
        resource_type: Literal['analysis']
        package_name: str
        path: str
        original_file_path: str
        unique_id: str
        fqn: List[str]
        alias: str
        checksum: Checksum = Field(..., title='FileHash')
        config: Optional[Config27] = Field(None, title='NodeConfig')
        tags: Optional[List[str]] = None
        description: Optional[str] = ''
        columns: Optional[Dict[str, Columns10]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        docs: Optional[Docs19] = Field(None, title='Docs')
        patch_path: Optional[str] = None
        build_path: Optional[str] = None
        unrendered_config: Optional[Dict[str, Any]] = None
        created_at: Optional[float] = None
        config_call_dict: Optional[Dict[str, Any]] = None
        unrendered_config_call_dict: Optional[Dict[str, Any]] = None
        relation_name: Optional[str] = None
        raw_code: Optional[str] = ''
        doc_blocks: Optional[List[str]] = None
        language: Optional[str] = 'sql'
        refs: Optional[List[Ref]] = None
        sources: Optional[List[List[str]]] = None
        metrics: Optional[List[List[str]]] = None
        depends_on: Optional[DependsOn12] = Field(None, title='DependsOn')
        compiled_path: Optional[str] = None
        compiled: Optional[bool] = False
        compiled_code: Optional[str] = None
        extra_ctes_injected: Optional[bool] = False
        extra_ctes: Optional[List[ExtraCte]] = None
        field_pre_injected_sql: Optional[str] = Field(None, alias='_pre_injected_sql')
        contract: Optional[Contract19] = Field(None, title='Contract')
    
    
    class Config29(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        alias: Optional[str] = None
        schema_: Optional[str] = Field('dbt_test__audit', alias='schema')
        database: Optional[str] = None
        tags: Optional[Union[List[str], str]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        materialized: Optional[str] = 'test'
        severity: Optional[constr(pattern=r'^([Ww][Aa][Rr][Nn]|[Ee][Rr][Rr][Oo][Rr])$')] = (
            'ERROR'
        )
        store_failures: Optional[bool] = None
        store_failures_as: Optional[str] = None
        where: Optional[str] = None
        limit: Optional[int] = None
        fail_calc: Optional[str] = 'count(*)'
        warn_if: Optional[str] = '!= 0'
        error_if: Optional[str] = '!= 0'
    
    
    class Constraint12(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        type: Type12
        name: Optional[str] = None
        expression: Optional[str] = None
        warn_unenforced: Optional[bool] = True
        warn_unsupported: Optional[bool] = True
        to: Optional[str] = None
        to_columns: Optional[List[str]] = None
    
    
    class Config30(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        meta: Optional[Dict[str, Any]] = None
        tags: Optional[List[str]] = None
    
    
    class Columns11(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        name: str
        description: Optional[str] = ''
        meta: Optional[Dict[str, Any]] = None
        data_type: Optional[str] = None
        constraints: Optional[List[Constraint12]] = None
        quote: Optional[bool] = None
        config: Optional[Config30] = Field(None, title='ColumnConfig')
        tags: Optional[List[str]] = None
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        granularity: Optional[Granularity] = None
        doc_blocks: Optional[List[str]] = None
    
    
    class Disabled2(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        database: Optional[str] = None
        schema_: str = Field(..., alias='schema')
        name: str
        resource_type: Literal['test']
        package_name: str
        path: str
        original_file_path: str
        unique_id: str
        fqn: List[str]
        alias: str
        checksum: Checksum = Field(..., title='FileHash')
        config: Optional[Config29] = Field(None, title='TestConfig')
        tags: Optional[List[str]] = None
        description: Optional[str] = ''
        columns: Optional[Dict[str, Columns11]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        docs: Optional[Docs19] = Field(None, title='Docs')
        patch_path: Optional[str] = None
        build_path: Optional[str] = None
        unrendered_config: Optional[Dict[str, Any]] = None
        created_at: Optional[float] = None
        config_call_dict: Optional[Dict[str, Any]] = None
        unrendered_config_call_dict: Optional[Dict[str, Any]] = None
        relation_name: Optional[str] = None
        raw_code: Optional[str] = ''
        doc_blocks: Optional[List[str]] = None
        language: Optional[str] = 'sql'
        refs: Optional[List[Ref]] = None
        sources: Optional[List[List[str]]] = None
        metrics: Optional[List[List[str]]] = None
        depends_on: Optional[DependsOn12] = Field(None, title='DependsOn')
        compiled_path: Optional[str] = None
        compiled: Optional[bool] = False
        compiled_code: Optional[str] = None
        extra_ctes_injected: Optional[bool] = False
        extra_ctes: Optional[List[ExtraCte]] = None
        field_pre_injected_sql: Optional[str] = Field(None, alias='_pre_injected_sql')
        contract: Optional[Contract19] = Field(None, title='Contract')
    
    
    class Contract21(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        enforced: Optional[bool] = False
        alias_types: Optional[bool] = True
    
    
    class Config31(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        alias: Optional[str] = None
        schema_: Optional[str] = Field(None, alias='schema')
        database: Optional[str] = None
        tags: Optional[Union[List[str], str]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        materialized: Optional[str] = 'view'
        incremental_strategy: Optional[str] = None
        batch_size: Optional[Any] = None
        lookback: Optional[Any] = 1
        begin: Optional[Any] = None
        persist_docs: Optional[Dict[str, Any]] = None
        post_hook: Optional[List[PostHookItem]] = Field(None, alias='post-hook')
        pre_hook: Optional[List[PreHookItem]] = Field(None, alias='pre-hook')
        quoting: Optional[Dict[str, Any]] = None
        column_types: Optional[Dict[str, Any]] = None
        full_refresh: Optional[bool] = None
        unique_key: Optional[Union[str, List[str]]] = None
        on_schema_change: Optional[str] = 'ignore'
        on_configuration_change: Optional[OnConfigurationChange] = None
        grants: Optional[Dict[str, Any]] = None
        packages: Optional[List[str]] = None
        docs: Optional[Docs19] = Field(None, title='Docs')
        contract: Optional[Contract21] = Field(None, title='ContractConfig')
        event_time: Optional[Any] = None
        concurrent_batches: Optional[Any] = None
    
    
    class Constraint13(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        type: Type12
        name: Optional[str] = None
        expression: Optional[str] = None
        warn_unenforced: Optional[bool] = True
        warn_unsupported: Optional[bool] = True
        to: Optional[str] = None
        to_columns: Optional[List[str]] = None
    
    
    class Config32(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        meta: Optional[Dict[str, Any]] = None
        tags: Optional[List[str]] = None
    
    
    class Columns12(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        name: str
        description: Optional[str] = ''
        meta: Optional[Dict[str, Any]] = None
        data_type: Optional[str] = None
        constraints: Optional[List[Constraint13]] = None
        quote: Optional[bool] = None
        config: Optional[Config32] = Field(None, title='ColumnConfig')
        tags: Optional[List[str]] = None
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        granularity: Optional[Granularity] = None
        doc_blocks: Optional[List[str]] = None
    
    
    class Contract22(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        enforced: Optional[bool] = False
        alias_types: Optional[bool] = True
        checksum: Optional[str] = None
    
    
    class Disabled3(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        database: Optional[str] = None
        schema_: str = Field(..., alias='schema')
        name: str
        resource_type: Literal['operation']
        package_name: str
        path: str
        original_file_path: str
        unique_id: str
        fqn: List[str]
        alias: str
        checksum: Checksum = Field(..., title='FileHash')
        config: Optional[Config31] = Field(None, title='NodeConfig')
        tags: Optional[List[str]] = None
        description: Optional[str] = ''
        columns: Optional[Dict[str, Columns12]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        docs: Optional[Docs19] = Field(None, title='Docs')
        patch_path: Optional[str] = None
        build_path: Optional[str] = None
        unrendered_config: Optional[Dict[str, Any]] = None
        created_at: Optional[float] = None
        config_call_dict: Optional[Dict[str, Any]] = None
        unrendered_config_call_dict: Optional[Dict[str, Any]] = None
        relation_name: Optional[str] = None
        raw_code: Optional[str] = ''
        doc_blocks: Optional[List[str]] = None
        language: Optional[str] = 'sql'
        refs: Optional[List[Ref]] = None
        sources: Optional[List[List[str]]] = None
        metrics: Optional[List[List[str]]] = None
        depends_on: Optional[DependsOn12] = Field(None, title='DependsOn')
        compiled_path: Optional[str] = None
        compiled: Optional[bool] = False
        compiled_code: Optional[str] = None
        extra_ctes_injected: Optional[bool] = False
        extra_ctes: Optional[List[ExtraCte]] = None
        field_pre_injected_sql: Optional[str] = Field(None, alias='_pre_injected_sql')
        contract: Optional[Contract22] = Field(None, title='Contract')
        index: Optional[int] = None
    
    
    class Contract23(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        enforced: Optional[bool] = False
        alias_types: Optional[bool] = True
    
    
    class BuildAfter2(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        updates_on: Optional[UpdatesOn] = 'any'
        count: Optional[int] = 0
        period: Optional[Period] = 'hour'
    
    
    class Freshness4(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        build_after: Optional[BuildAfter2] = Field(None, title='ModelBuildAfter')
    
    
    class Config33(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        alias: Optional[str] = None
        schema_: Optional[str] = Field(None, alias='schema')
        database: Optional[str] = None
        tags: Optional[Union[List[str], str]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        materialized: Optional[str] = 'view'
        incremental_strategy: Optional[str] = None
        batch_size: Optional[Any] = None
        lookback: Optional[Any] = 1
        begin: Optional[Any] = None
        persist_docs: Optional[Dict[str, Any]] = None
        post_hook: Optional[List[PostHookItem]] = Field(None, alias='post-hook')
        pre_hook: Optional[List[PreHookItem]] = Field(None, alias='pre-hook')
        quoting: Optional[Dict[str, Any]] = None
        column_types: Optional[Dict[str, Any]] = None
        full_refresh: Optional[bool] = None
        unique_key: Optional[Union[str, List[str]]] = None
        on_schema_change: Optional[str] = 'ignore'
        on_configuration_change: Optional[OnConfigurationChange] = None
        grants: Optional[Dict[str, Any]] = None
        packages: Optional[List[str]] = None
        docs: Optional[Docs19] = Field(None, title='Docs')
        contract: Optional[Contract23] = Field(None, title='ContractConfig')
        event_time: Optional[Any] = None
        concurrent_batches: Optional[Any] = None
        access: Optional[Access] = 'protected'
        freshness: Optional[Freshness4] = None
    
    
    class Constraint14(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        type: Type12
        name: Optional[str] = None
        expression: Optional[str] = None
        warn_unenforced: Optional[bool] = True
        warn_unsupported: Optional[bool] = True
        to: Optional[str] = None
        to_columns: Optional[List[str]] = None
    
    
    class Config34(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        meta: Optional[Dict[str, Any]] = None
        tags: Optional[List[str]] = None
    
    
    class Columns13(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        name: str
        description: Optional[str] = ''
        meta: Optional[Dict[str, Any]] = None
        data_type: Optional[str] = None
        constraints: Optional[List[Constraint14]] = None
        quote: Optional[bool] = None
        config: Optional[Config34] = Field(None, title='ColumnConfig')
        tags: Optional[List[str]] = None
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        granularity: Optional[Granularity] = None
        doc_blocks: Optional[List[str]] = None
    
    
    class Contract24(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        enforced: Optional[bool] = False
        alias_types: Optional[bool] = True
        checksum: Optional[str] = None
    
    
    class Constraint15(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        type: Type12
        name: Optional[str] = None
        expression: Optional[str] = None
        warn_unenforced: Optional[bool] = True
        warn_unsupported: Optional[bool] = True
        to: Optional[str] = None
        to_columns: Optional[List[str]] = None
        columns: Optional[List[str]] = None
    
    
    class Contract25(BaseParserModel):
        model_config = ConfigDict(
            extra='forbid',
        )
        enforced: Optional[bool] = False
        alias_types: Optional[bool] = True
    
    
    class Config35(BaseParserModel):
        model_config = ConfigDict(
            extra='allow',
        )
        field_extra: Optional[Dict[str, Any]] = Field(None, alias='_extra')
        enabled: Optional[bool] = True
        alias: Optional[str] = None
        schema_: Optional[str] = Field(None, alias='schema')
        database: Optional[str] = None
        tags: Optional[Union[List[str], str]] = None
        meta: Optional[Dict[str, Any]] = None
        group: Optional[str] = None
        materialized: Optional[str] = 'view'
        incremental_strategy: Optional[str] = None
        batch_size: Optional[Any] = None
        lookback: Optional[Any] = 1
        begin: Optional[Any] = None
        persist_docs: Optional[Dict[str, Any]] = None
        post_hook: Optional[List[PostHookItem]] = Field(None, alias='post-hook')
        pre_hoo...

    @qodo-code-review
    Copy link
    Copy Markdown

    PR Code Suggestions ✨

    Explore these optional code suggestions:

    CategorySuggestion                                                                                                                                    Impact
    General
    Add timestamp format validation

    The invocation_started_at field should include format validation for timestamp
    strings to ensure data consistency. Consider adding a format constraint like
    "date-time" to validate ISO 8601 timestamps.

    dbt_artifacts_parser/resources/manifest/manifest_v12.json [31-39]

     "invocation_started_at": {
       "anyOf": [
         {
    -      "type": "string"
    +      "type": "string",
    +      "format": "date-time"
         },
         {
           "type": "null"
         }
       ]
     }
    • Apply / Chat
    Suggestion importance[1-10]: 7

    __

    Why: The suggestion correctly proposes adding format: "date-time" to the invocation_started_at field for better data validation. This is a good practice for JSON schemas to ensure timestamps are in a consistent, expected format like ISO 8601.

    Medium
    Replace beta version with stable release

    Using a beta version as the default may cause instability in production
    environments. Consider using a stable release version like "1.10.0" instead of
    the beta version "1.10.0b3".

    dbt_artifacts_parser/resources/manifest/manifest_v12.json [16]

    -"default": "1.10.0b3"
    +"default": "1.10.0"
    • Apply / Chat
    Suggestion importance[1-10]: 5

    __

    Why: The suggestion correctly points out that using a beta version (1.10.0b3) as a default can be risky. However, this version might be intentionally used to align with the specific dbt release that introduced the manifest_v12 schema. It's a valid point for consideration but may not be an error.

    Low
    • More

    @yu-iskw yu-iskw merged commit e4c7886 into main Jun 17, 2025
    5 of 6 checks passed
    @yu-iskw yu-iskw deleted the support-dbt-1.10 branch June 17, 2025 05:37
    @coderabbitai coderabbitai bot mentioned this pull request Oct 11, 2025
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Projects

    None yet

    Development

    Successfully merging this pull request may close these issues.

    1 participant