Manifest Checks
Note
The below checks require manifest.json
to be present.
check_exposures
check_exposure_based_on_non_public_models
Exposures should be based on public models only.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the exposure path (i.e the .yml file where the exposure is configured). Exposure paths that match the pattern will not be checked. |
exposure |
Exposures
|
The Exposures object to check. |
include |
Optional[str]
|
Regex pattern to match the exposure path (i.e the .yml file where the exposure is configured). Only exposure paths that match the pattern will be checked. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_exposures.py
check_exposure_based_on_view
Exposures should not be based on views.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the exposure path (i.e the .yml file where the exposure is configured). Exposure paths that match the pattern will not be checked. |
exposure |
Exposures
|
The Exposures object to check. |
include |
Optional[str]
|
Regex pattern to match the exposure path (i.e the .yml file where the exposure is configured). Only exposure paths that match the pattern will be checked. |
materializations_to_include |
Optional[List[str]]
|
List of materializations to include in the check. If not provided, defaults to |
Example(s):
manifest_checks:
- name: check_exposure_based_on_view
materializations_to_include:
- ephemeral
- my_custom_materialization
- view
Source code in src/dbt_bouncer/checks/manifest/check_exposures.py
check_lineage
check_lineage_permitted_upstream_models
Upstream models must have a path that matches the provided upstream_path_pattern
.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
upstream_path_pattern |
str
|
Regexp pattern to match the upstream model(s) path. |
Example(s):
manifest_checks:
- name: check_lineage_permitted_upstream_models
include: ^staging
upstream_path_pattern: $^
- name: check_lineage_permitted_upstream_models
include: ^intermediate
upstream_path_pattern: ^staging|^intermediate
- name: check_lineage_permitted_upstream_models
include: ^marts
upstream_path_pattern: ^staging|^intermediate
Source code in src/dbt_bouncer/checks/manifest/check_lineage.py
check_lineage_seed_cannot_be_used
Seed cannot be referenced in models with a path that matches the specified include
config.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_lineage.py
check_lineage_source_cannot_be_used
Sources cannot be referenced in models with a path that matches the specified include
config.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_lineage.py
check_macros
check_macro_arguments_description_populated
Macro arguments must have a populated description.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the macro path. Macro paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the macro path. Only macro paths that match the pattern will be checked. |
macro |
Macros
|
The Macro object to check. |
Example(s):
# Only "common" macros need to have their arguments populated
manifest_checks:
- name: check_macro_arguments_description_populated
include: ^macros/common
Source code in src/dbt_bouncer/checks/manifest/check_macros.py
check_macro_code_does_not_contain_regexp_pattern
The raw code for a macro must not match the specified regexp pattern.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the macro path. Macro paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the macro path. Only macro paths that match the pattern will be checked. |
macro |
Macros
|
The Macro object to check. |
regexp_pattern |
str
|
The regexp pattern that should not be matched by the macro code. |
Example(s):
manifest_checks:
# Prefer `coalesce` over `ifnull`: https://docs.sqlfluff.com/en/stable/rules.html#sqlfluff.rules.sphinx.Rule_CV02
- name: check_macro_code_does_not_contain_regexp_pattern
regexp_pattern: .*[i][f][n][u][l][l].*
Source code in src/dbt_bouncer/checks/manifest/check_macros.py
check_macro_description_populated
Macros must have a populated description.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the macro path. Macro paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the macro path. Only macro paths that match the pattern will be checked. |
macro |
Macros
|
The Macro object to check. |
Example(s):
# Only "common" macros need to have a populated description
manifest_checks:
- name: check_macro_description_populated
include: ^macros/common
Source code in src/dbt_bouncer/checks/manifest/check_macros.py
check_macro_name_matches_file_name
Macros names must be the same as the file they are contained in.
Generic tests are also macros, however to document these tests the "name" value must be precededed with "test_".
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the macro path. Macro paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the macro path. Only macro paths that match the pattern will be checked. |
macro |
Macros
|
The Macro object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_macros.py
check_macro_property_file_location
Macro properties files must follow the guidance provided by dbt here.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the macro path. Macro paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the macro path. Only macro paths that match the pattern will be checked. |
macro |
Macros
|
The Macro object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_macros.py
check_metadata
check_project_name
Enforce that the name of the dbt project matches a supplied regex. Generally used to enforce that project names conform to something like company_<DOMAIN>
.
Receives:
Type | Description |
---|---|
None
|
project_name_pattern str: Regex pattern to match the project name. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_metadata.py
check_models
check_model_access
Models must have the specified access attribute. Requires dbt 1.7+.
Receives:
Name | Type | Description |
---|---|---|
access |
Literal['private', 'protected', 'public']
|
The access level to check for. |
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
manifest_checks:
# Align with dbt best practices that marts should be `public`, everything else should be `protected`
- name: check_model_access
access: protected
include: ^intermediate
- name: check_model_access
access: public
include: ^marts
- name: check_model_access
access: protected
include: ^staging
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_contract_enforced_for_public_model
Public models must have contracts enforced.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_description_populated
Models must have a populated description.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_documentation_coverage
Set the minimum percentage of models that have a populated description.
Receives:
Name | Type | Description |
---|---|---|
min_model_documentation_coverage_pct |
float
|
The minimum percentage of models that must have a populated description. Default: 100. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_documented_in_same_directory
Models must be documented in the same directory where they are defined (i.e. .yml
and .sql
files are in the same directory).
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_code_does_not_contain_regexp_pattern
The raw code for a model must not match the specified regexp pattern.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
regexp_pattern |
str
|
The regexp pattern that should not be matched by the model code. |
Example(s):
manifest_checks:
# Prefer `coalesce` over `ifnull`: https://docs.sqlfluff.com/en/stable/rules.html#sqlfluff.rules.sphinx.Rule_CV02
- name: check_model_code_does_not_contain_regexp_pattern
regexp_pattern: .*[i][f][n][u][l][l].*
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_depends_on_multiple_sources
Models cannot reference more than one source.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_directories
Only specified sub-directories are permitted.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. Special case: if you want to check |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
permitted_sub_directories |
List[str]
|
List of permitted sub-directories. |
Example(s):
manifest_checks:
# Special case for top level directories within `./models`, pass "" to `include`
- name: check_model_directories
include: ""
permitted_sub_directories:
- intermediate
- marts
- staging
# Restrict sub-directories within `./models/staging`
- name: check_model_directories
include: ^staging
permitted_sub_directories:
- crm
- payments
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_has_contracts_enforced
Model must have contracts enforced.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_has_meta_keys
The meta
config for models must have the specified keys.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
keys |
NestedDict
|
A list (that may contain sub-lists) of required keys. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_has_no_upstream_dependencies
Identify if models have no upstream dependencies as this likely indicates hard-coded tables references.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_has_tags
Models must have the specified tags.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
tags |
List[str]
|
List of tags to check for. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_has_unique_test
Models must have a test for uniqueness of a column.
Receives:
Name | Type | Description |
---|---|---|
accepted_uniqueness_tests |
Optional[List[str]]
|
List of tests that are accepted as uniqueness tests. If not provided, defaults to |
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
manifest_checks:
# Example of allowing a custom uniqueness test
- name: check_model_has_unique_test
accepted_uniqueness_tests:
- expect_compound_columns_to_be_unique
- my_custom_uniqueness_test
- unique
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_max_chained_views
Models cannot have more than the specified number of upstream dependents that are not tables (default: 3).
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
materializations_to_include |
Optional[List[str]]
|
List of materializations to include in the check. If not provided, defaults to |
max_chained_views |
Optional[int]
|
The maximum number of upstream dependents that are not tables. Default: 3 |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
manifest_checks:
- name: check_model_max_chained_views
materializations_to_include:
- ephemeral
- my_custom_materialization
- view
max_chained_views: 5
Source code in src/dbt_bouncer/checks/manifest/check_models.py
520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 |
|
check_model_max_fanout
Models cannot have more than the specified number of downstream models (default: 3).
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
max_downstream_models |
Optional[int]
|
The maximum number of permitted downstream models. Default: 3 |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_max_upstream_dependencies
Limit the number of upstream dependencies a model has. Default values are 5 for models, 5 for macros, and 1 for sources.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
max_upstream_macros |
Optional[int]
|
The maximum number of permitted upstream macros. Default: 5 |
max_upstream_models |
Optional[int]
|
The maximum number of permitted upstream models. Default: 5 |
max_upstream_sources |
Optional[int]
|
The maximum number of permitted upstream sources. Default: 1 |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_names
Models must have a name that matches the supplied regex.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model_name_pattern |
str
|
Regexp the model name must match. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
manifest_checks:
- name: check_model_names
include: ^intermediate
model_name_pattern: ^int_
- name: check_model_names
include: ^staging
model_name_pattern: ^stg_
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_property_file_location
Model properties files must follow the guidance provided by dbt here.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the model path. Model paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the model path. Only model paths that match the pattern will be checked. |
model |
DbtBouncerModel
|
The DbtBouncerModel object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_model_test_coverage
Set the minimum percentage of models that have at least one test.
Receives:
Name | Type | Description |
---|---|---|
min_model_test_coverage_pct |
float
|
The minimum percentage of models that must have at least one test. Default: 100 |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_models.py
check_sources
check_source_description_populated
Sources must have a populated description.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Source paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Only source paths that match the pattern will be checked. |
source |
DbtBouncerSource
|
The DbtBouncerSource object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_sources.py
check_source_freshness_populated
Sources must have a populated freshness.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Source paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Only source paths that match the pattern will be checked. |
source |
DbtBouncerSource
|
The DbtBouncerSource object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_sources.py
check_source_has_meta_keys
The meta
config for sources must have the specified keys.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Source paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Only source paths that match the pattern will be checked. |
keys |
NestedDict
|
A list (that may contain sub-lists) of required keys. |
source |
DbtBouncerSource
|
The DbtBouncerSource object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_sources.py
check_source_has_tags
Sources must have the specified tags.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Source paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Only source paths that match the pattern will be checked. |
source |
DbtBouncerSource
|
The DbtBouncerSource object to check. |
tags |
List[str]
|
List of tags to check for. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_sources.py
check_source_loader_populated
Sources must have a populated loader.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Source paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Only source paths that match the pattern will be checked. |
source |
DbtBouncerSource
|
The DbtBouncerSource object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_sources.py
check_source_names
Sources must have a name that matches the supplied regex.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Source paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Only source paths that match the pattern will be checked. |
source |
DbtBouncerSource
|
The DbtBouncerSource object to check. |
source_name_pattern |
str
|
Regexp the source name must match. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_sources.py
check_source_not_orphaned
Sources must be referenced in at least one model.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Source paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Only source paths that match the pattern will be checked. |
source |
DbtBouncerSource
|
The DbtBouncerSource object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_sources.py
check_source_property_file_location
Source properties files must follow the guidance provided by dbt here.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Source paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Only source paths that match the pattern will be checked. |
source |
DbtBouncerSource
|
The DbtBouncerSource object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_sources.py
check_source_used_by_models_in_same_directory
Sources can only be referenced by models that are located in the same directory where the source is defined.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Source paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Only source paths that match the pattern will be checked. |
source |
DbtBouncerSource
|
The DbtBouncerSource object to check. |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_sources.py
check_source_used_by_only_one_model
Each source can be referenced by a maximum of one model.
Receives:
Name | Type | Description |
---|---|---|
exclude |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Source paths that match the pattern will not be checked. |
include |
Optional[str]
|
Regex pattern to match the source path (i.e the .yml file where the source is configured). Only source paths that match the pattern will be checked. |
source |
DbtBouncerSource
|
The DbtBouncerSource object to check. |
Example(s):