dbt-bouncer 1.31.2rc3__tar.gz → 2.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. {dbt_bouncer-1.31.2rc3/src/dbt_bouncer.egg-info → dbt_bouncer-2.0.0}/PKG-INFO +15 -15
  2. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/README.md +3 -0
  3. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/pyproject.toml +13 -53
  4. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/artifact_parsers/dbt_cloud/catalog_latest.py +21 -21
  5. dbt_bouncer-2.0.0/src/dbt_bouncer/artifact_parsers/dbt_cloud/manifest_latest.py +3895 -0
  6. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/artifact_parsers/dbt_cloud/run_results_latest.py +22 -22
  7. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/artifact_parsers/parsers_catalog.py +26 -24
  8. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/artifact_parsers/parsers_common.py +57 -36
  9. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/artifact_parsers/parsers_manifest.py +98 -69
  10. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/artifact_parsers/parsers_run_results.py +32 -19
  11. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/check_base.py +22 -11
  12. dbt_bouncer-2.0.0/src/dbt_bouncer/checks/catalog/check_catalog_sources.py +68 -0
  13. dbt_bouncer-2.0.0/src/dbt_bouncer/checks/catalog/check_columns.py +451 -0
  14. dbt_bouncer-2.0.0/src/dbt_bouncer/checks/common.py +28 -0
  15. dbt_bouncer-2.0.0/src/dbt_bouncer/checks/manifest/check_exposures.py +190 -0
  16. dbt_bouncer-2.0.0/src/dbt_bouncer/checks/manifest/check_lineage.py +177 -0
  17. dbt_bouncer-2.0.0/src/dbt_bouncer/checks/manifest/check_macros.py +390 -0
  18. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/checks/manifest/check_metadata.py +28 -18
  19. dbt_bouncer-2.0.0/src/dbt_bouncer/checks/manifest/check_models.py +1941 -0
  20. dbt_bouncer-2.0.0/src/dbt_bouncer/checks/manifest/check_seeds.py +63 -0
  21. dbt_bouncer-2.0.0/src/dbt_bouncer/checks/manifest/check_semantic_models.py +66 -0
  22. dbt_bouncer-2.0.0/src/dbt_bouncer/checks/manifest/check_snapshots.py +122 -0
  23. dbt_bouncer-2.0.0/src/dbt_bouncer/checks/manifest/check_sources.py +512 -0
  24. dbt_bouncer-2.0.0/src/dbt_bouncer/checks/manifest/check_unit_tests.py +253 -0
  25. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/checks/run_results/check_run_results.py +34 -20
  26. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/config_file_parser.py +47 -28
  27. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/config_file_validator.py +11 -8
  28. dbt_bouncer-2.0.0/src/dbt_bouncer/global_context.py +31 -0
  29. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/main.py +128 -67
  30. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/runner.py +61 -31
  31. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/utils.py +146 -50
  32. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/version.py +1 -1
  33. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0/src/dbt_bouncer.egg-info}/PKG-INFO +15 -15
  34. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer.egg-info/SOURCES.txt +2 -0
  35. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer.egg-info/requires.txt +9 -13
  36. dbt_bouncer-1.31.2rc3/src/dbt_bouncer/artifact_parsers/dbt_cloud/manifest_latest.py +0 -3895
  37. dbt_bouncer-1.31.2rc3/src/dbt_bouncer/checks/catalog/check_catalog_sources.py +0 -58
  38. dbt_bouncer-1.31.2rc3/src/dbt_bouncer/checks/catalog/check_columns.py +0 -381
  39. dbt_bouncer-1.31.2rc3/src/dbt_bouncer/checks/common.py +0 -7
  40. dbt_bouncer-1.31.2rc3/src/dbt_bouncer/checks/manifest/check_exposures.py +0 -163
  41. dbt_bouncer-1.31.2rc3/src/dbt_bouncer/checks/manifest/check_lineage.py +0 -148
  42. dbt_bouncer-1.31.2rc3/src/dbt_bouncer/checks/manifest/check_macros.py +0 -317
  43. dbt_bouncer-1.31.2rc3/src/dbt_bouncer/checks/manifest/check_models.py +0 -1595
  44. dbt_bouncer-1.31.2rc3/src/dbt_bouncer/checks/manifest/check_semantic_models.py +0 -58
  45. dbt_bouncer-1.31.2rc3/src/dbt_bouncer/checks/manifest/check_snapshots.py +0 -98
  46. dbt_bouncer-1.31.2rc3/src/dbt_bouncer/checks/manifest/check_sources.py +0 -403
  47. dbt_bouncer-1.31.2rc3/src/dbt_bouncer/checks/manifest/check_unit_tests.py +0 -210
  48. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/LICENSE +0 -0
  49. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/setup.cfg +0 -0
  50. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/__init__.py +0 -0
  51. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer/logger.py +0 -0
  52. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer.egg-info/dependency_links.txt +0 -0
  53. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer.egg-info/entry_points.txt +0 -0
  54. {dbt_bouncer-1.31.2rc3 → dbt_bouncer-2.0.0}/src/dbt_bouncer.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dbt-bouncer
3
- Version: 1.31.2rc3
3
+ Version: 2.0.0
4
4
  Summary: Configure and enforce conventions for your dbt project.
5
5
  Author-email: Padraic Slattery <pgoslatara@gmail.com>
6
6
  Maintainer-email: Padraic Slattery <pgoslatara@gmail.com>
@@ -13,43 +13,40 @@ Classifier: Programming Language :: Python :: 3 :: Only
13
13
  Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
- Requires-Python: <3.14,>=3.11
16
+ Classifier: Programming Language :: Python :: 3.14
17
+ Requires-Python: <3.15,>=3.11
17
18
  Description-Content-Type: text/markdown
18
19
  License-File: LICENSE
19
- Requires-Dist: click<9
20
+ Requires-Dist: click!=8.3.0,!=8.3.1,<9
20
21
  Requires-Dist: dbt-artifacts-parser>=0.8
21
22
  Requires-Dist: h11>=0.16.0
22
23
  Requires-Dist: jellyfish<2,>=1
23
24
  Requires-Dist: jinja2<4,>=3
24
25
  Requires-Dist: jinja2-simple-tags<1
25
- Requires-Dist: packaging<25
26
+ Requires-Dist: packaging<26
26
27
  Requires-Dist: progress
27
28
  Requires-Dist: pydantic<3,>=2
29
+ Requires-Dist: pytest<=10
28
30
  Requires-Dist: pyyaml<7
29
31
  Requires-Dist: requests<3,>=2
30
32
  Requires-Dist: tabulate<1
31
33
  Requires-Dist: toml<1
32
34
  Requires-Dist: semver<4
33
35
  Provides-Extra: dev
34
- Requires-Dist: autoflake~=2.0; extra == "dev"
35
- Requires-Dist: black~=25.0; extra == "dev"
36
- Requires-Dist: dbt-core<2,>=1.10.0; extra == "dev"
36
+ Requires-Dist: bandit~=1.0; extra == "dev"
37
+ Requires-Dist: dbt-core<2,>=1.11.2; extra == "dev"
37
38
  Requires-Dist: dbt-duckdb~=1.0; extra == "dev"
38
- Requires-Dist: isort~=7.0; extra == "dev"
39
- Requires-Dist: mypy~=1.0; extra == "dev"
40
- Requires-Dist: pre-commit<5,>=3; extra == "dev"
41
- Requires-Dist: pytest<=10; extra == "dev"
39
+ Requires-Dist: prek<1,>=0.1; extra == "dev"
42
40
  Requires-Dist: pytest-cov<8,>=5; extra == "dev"
43
41
  Requires-Dist: pytest-xdist~=3.0; extra == "dev"
42
+ Requires-Dist: pyupgrade~=3.0; extra == "dev"
44
43
  Requires-Dist: ruff~=0.0; extra == "dev"
45
44
  Requires-Dist: shandy-sqlfmt[jinjafmt]~=0.0; extra == "dev"
46
- Requires-Dist: types-PyYaml~=6.0; extra == "dev"
47
- Requires-Dist: types-tabulate~=0.0; extra == "dev"
48
- Requires-Dist: types-toml~=0.0; extra == "dev"
45
+ Requires-Dist: ty>=0.0.7; extra == "dev"
49
46
  Provides-Extra: docs
50
47
  Requires-Dist: mike~=2.0; extra == "docs"
51
48
  Requires-Dist: mkdocs~=1.0; extra == "docs"
52
- Requires-Dist: mkdocstrings-python<2; extra == "docs"
49
+ Requires-Dist: mkdocstrings-python<3; extra == "docs"
53
50
  Requires-Dist: mkdocs-click~=0.0; extra == "docs"
54
51
  Requires-Dist: mkdocs-git-revision-date-localized-plugin~=1.0; extra == "docs"
55
52
  Requires-Dist: mkdocs-material~=9.0; extra == "docs"
@@ -75,6 +72,9 @@ Dynamic: license-file
75
72
  <a>
76
73
  <img src="https://img.shields.io/badge/License-MIT-yellow.svg">
77
74
  </a>
75
+ <a>
76
+ <img alt="security: bandit" href="https://github.com/PyCQA/bandit" src="https://img.shields.io/badge/security-bandit-yellow.svg">
77
+ </a>
78
78
  <a>
79
79
  <img src="https://img.shields.io/github/last-commit/godatadriven/dbt-bouncer/main">
80
80
  </a>
@@ -17,6 +17,9 @@
17
17
  <a>
18
18
  <img src="https://img.shields.io/badge/License-MIT-yellow.svg">
19
19
  </a>
20
+ <a>
21
+ <img alt="security: bandit" href="https://github.com/PyCQA/bandit" src="https://img.shields.io/badge/security-bandit-yellow.svg">
22
+ </a>
20
23
  <a>
21
24
  <img src="https://img.shields.io/github/last-commit/godatadriven/dbt-bouncer/main">
22
25
  </a>
@@ -7,17 +7,19 @@ classifiers = [
7
7
  "Programming Language :: Python :: 3.11",
8
8
  "Programming Language :: Python :: 3.12",
9
9
  "Programming Language :: Python :: 3.13",
10
+ "Programming Language :: Python :: 3.14",
10
11
  ]
11
12
  dependencies =[
12
- "click (<9)",
13
+ "click (!=8.3.0,!=8.3.1,<9)", # Due to this issue: https://github.com/pallets/click/issues/3110
13
14
  "dbt-artifacts-parser (>=0.8)",
14
15
  "h11 (>=0.16.0)", # To fix security warning
15
16
  "jellyfish (>=1,<2)",
16
17
  "jinja2 (>=3,<4)",
17
18
  "jinja2-simple-tags (<1)",
18
- "packaging (<25)",
19
+ "packaging (<26)",
19
20
  "progress",
20
21
  "pydantic (>=2,<3)",
22
+ "pytest<=10",
21
23
  "pyyaml (<7)",
22
24
  "requests (>=2,<3)",
23
25
  "tabulate (<1)",
@@ -35,31 +37,26 @@ license ="MIT"
35
37
  maintainers = [{name="Padraic Slattery",email="pgoslatara@gmail.com"}]
36
38
  name = "dbt-bouncer"
37
39
  readme = "README.md"
38
- requires-python = ">=3.11,<3.14"
39
- version = "1.31.2rc3"
40
+ requires-python = ">=3.11,<3.15"
41
+ version = "2.0.0"
40
42
 
41
43
  [project.optional-dependencies]
42
44
  dev = [
43
- "autoflake~=2.0",
44
- "black~=25.0",
45
- "dbt-core>=1.10.0,<2",
45
+ "bandit~=1.0",
46
+ "dbt-core>=1.11.2,<2",
46
47
  "dbt-duckdb~=1.0",
47
- "isort~=7.0",
48
- "mypy~=1.0",
49
- "pre-commit>=3,<5",
50
- "pytest<=10",
48
+ "prek>=0.1,<1",
51
49
  "pytest-cov>=5,<8",
52
50
  "pytest-xdist~=3.0",
51
+ "pyupgrade~=3.0",
53
52
  "ruff~=0.0",
54
53
  "shandy-sqlfmt[jinjafmt]~=0.0",
55
- "types-PyYaml~=6.0",
56
- "types-tabulate~=0.0",
57
- "types-toml~=0.0"
54
+ "ty>=0.0.7"
58
55
  ]
59
56
  docs = [
60
57
  "mike~=2.0",
61
58
  "mkdocs~=1.0",
62
- "mkdocstrings-python<2",
59
+ "mkdocstrings-python<3",
63
60
  "mkdocs-click~=0.0",
64
61
  "mkdocs-git-revision-date-localized-plugin~=1.0",
65
62
  "mkdocs-material~=9.0",
@@ -72,25 +69,6 @@ dbt-bouncer = "dbt_bouncer.main:cli"
72
69
  [project.urls]
73
70
  repository = "https://github.com/godatadriven/dbt-bouncer"
74
71
 
75
- [tool.black]
76
- line-length = 99
77
- include = '/project$|\.pyi?$'
78
- exclude = '''
79
- /(
80
- \.git
81
- | \.hg
82
- | \.eggs
83
- | \.mypy_cache
84
- | \.tox
85
- | \.venv
86
- | \.vscode
87
- | _build
88
- | buck-out
89
- | build
90
- | dist
91
- )/
92
- '''
93
-
94
72
  [tool.coverage.report]
95
73
  exclude_lines = [
96
74
  "if TYPE_CHECKING:",
@@ -107,24 +85,6 @@ name = "check_model_names"
107
85
  include = "^staging"
108
86
  model_name_pattern = "^stg_"
109
87
 
110
- [tool.isort]
111
- profile = "black"
112
-
113
- [tool.mypy]
114
- follow_imports = "silent"
115
- warn_redundant_casts = true
116
- warn_unused_ignores = true
117
- disallow_any_generics = true
118
- check_untyped_defs = true
119
- no_implicit_reexport = true
120
- plugins = [
121
- "pydantic.mypy"
122
- ]
123
-
124
- [[tool.mypy.overrides]]
125
- ignore_missing_imports = true
126
- module = "dbt_artifacts_parser.*"
127
-
128
88
  [tool.ruff]
129
89
  exclude = [
130
90
  ".bzr",
@@ -157,7 +117,7 @@ exclude = [
157
117
  ]
158
118
  line-length = 88
159
119
  indent-width = 4
160
- target-version = "py38"
120
+ target-version = "py311"
161
121
 
162
122
  [tool.ruff.lint]
163
123
  ignore = ["COM812", "D100", "D203", "D213", "D406", "D407", "D409", "E501", "G004", "LOG015", "S101"]
@@ -3,7 +3,7 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
- from typing import Any, Dict, List, Optional, Union
6
+ from typing import Any
7
7
 
8
8
  from pydantic import ConfigDict, Field
9
9
 
@@ -14,11 +14,11 @@ class Metadata(BaseParserModel):
14
14
  model_config = ConfigDict(
15
15
  extra='allow',
16
16
  )
17
- dbt_schema_version: Optional[str] = None
18
- dbt_version: Optional[str] = '1.9.0b2'
19
- generated_at: Optional[str] = None
20
- invocation_id: Optional[str] = None
21
- env: Optional[Dict[str, str]] = None
17
+ dbt_schema_version: str | None = None
18
+ dbt_version: str | None = '1.9.0b2'
19
+ generated_at: str | None = None
20
+ invocation_id: str | None = None
21
+ env: dict[str, str] | None = None
22
22
 
23
23
 
24
24
  class Metadata1(BaseParserModel):
@@ -28,9 +28,9 @@ class Metadata1(BaseParserModel):
28
28
  type: str
29
29
  schema_: str = Field(..., alias='schema')
30
30
  name: str
31
- database: Optional[str] = None
32
- comment: Optional[str] = None
33
- owner: Optional[str] = None
31
+ database: str | None = None
32
+ comment: str | None = None
33
+ owner: str | None = None
34
34
 
35
35
 
36
36
  class Columns(BaseParserModel):
@@ -40,7 +40,7 @@ class Columns(BaseParserModel):
40
40
  type: str
41
41
  index: int
42
42
  name: str
43
- comment: Optional[str] = None
43
+ comment: str | None = None
44
44
 
45
45
 
46
46
  class Stats(BaseParserModel):
@@ -49,9 +49,9 @@ class Stats(BaseParserModel):
49
49
  )
50
50
  id: str
51
51
  label: str
52
- value: Optional[Union[bool, str, float]] = None
52
+ value: bool | str | float | None = None
53
53
  include: bool
54
- description: Optional[str] = None
54
+ description: str | None = None
55
55
 
56
56
 
57
57
  class Nodes(BaseParserModel):
@@ -59,9 +59,9 @@ class Nodes(BaseParserModel):
59
59
  extra='allow',
60
60
  )
61
61
  metadata: Metadata1 = Field(..., title='TableMetadata')
62
- columns: Dict[str, Columns]
63
- stats: Dict[str, Stats]
64
- unique_id: Optional[str] = None
62
+ columns: dict[str, Columns]
63
+ stats: dict[str, Stats]
64
+ unique_id: str | None = None
65
65
 
66
66
 
67
67
  class Sources(BaseParserModel):
@@ -69,9 +69,9 @@ class Sources(BaseParserModel):
69
69
  extra='allow',
70
70
  )
71
71
  metadata: Metadata1 = Field(..., title='TableMetadata')
72
- columns: Dict[str, Columns]
73
- stats: Dict[str, Stats]
74
- unique_id: Optional[str] = None
72
+ columns: dict[str, Columns]
73
+ stats: dict[str, Stats]
74
+ unique_id: str | None = None
75
75
 
76
76
 
77
77
  class CatalogLatest(BaseParserModel):
@@ -79,7 +79,7 @@ class CatalogLatest(BaseParserModel):
79
79
  extra='allow',
80
80
  )
81
81
  metadata: Metadata = Field(..., title='CatalogMetadata')
82
- nodes: Dict[str, Nodes]
83
- sources: Dict[str, Sources]
84
- errors: Optional[List[str]] = None
82
+ nodes: dict[str, Nodes]
83
+ sources: dict[str, Sources]
84
+ errors: list[str] | None = None
85
85
  field_compile_results: Any = Field(None, alias='_compile_results')