recce-nightly 1.2.0.20250506__py3-none-any.whl → 1.4.0.20250514__py3-none-any.whl
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.
Potentially problematic release.
This version of recce-nightly might be problematic. Click here for more details.
- recce/VERSION +1 -1
- recce/__init__.py +22 -22
- recce/adapter/base.py +11 -14
- recce/adapter/dbt_adapter/__init__.py +355 -316
- recce/adapter/dbt_adapter/dbt_version.py +3 -0
- recce/adapter/sqlmesh_adapter.py +24 -35
- recce/apis/check_api.py +39 -28
- recce/apis/check_func.py +33 -27
- recce/apis/run_api.py +25 -19
- recce/apis/run_func.py +29 -23
- recce/artifact.py +44 -49
- recce/cli.py +484 -285
- recce/config.py +42 -33
- recce/core.py +52 -44
- recce/data/404.html +1 -1
- recce/data/_next/static/chunks/{368-7587b306577df275.js → 778-aef312bffb4c0312.js} +15 -15
- recce/data/_next/static/chunks/8d700b6a.ed11a130057c7a47.js +1 -0
- recce/data/_next/static/chunks/app/layout-c713a2829d3279e4.js +1 -0
- recce/data/_next/static/chunks/app/page-7086764277331fcb.js +1 -0
- recce/data/_next/static/chunks/{cd9f8d63-cf0d5a7b0f7a92e8.js → cd9f8d63-e020f408095ed77c.js} +3 -3
- recce/data/_next/static/chunks/webpack-b787cb1a4f2293de.js +1 -0
- recce/data/_next/static/css/88b8abc134cfd59a.css +3 -0
- recce/data/index.html +2 -2
- recce/data/index.txt +2 -2
- recce/diff.py +6 -12
- recce/event/__init__.py +74 -72
- recce/event/collector.py +27 -20
- recce/event/track.py +39 -27
- recce/exceptions.py +1 -1
- recce/git.py +7 -7
- recce/github.py +57 -53
- recce/models/__init__.py +1 -1
- recce/models/check.py +6 -7
- recce/models/run.py +1 -0
- recce/models/types.py +27 -27
- recce/pull_request.py +26 -24
- recce/run.py +148 -111
- recce/server.py +105 -88
- recce/state.py +209 -177
- recce/summary.py +168 -143
- recce/tasks/__init__.py +3 -3
- recce/tasks/core.py +11 -13
- recce/tasks/dataframe.py +19 -17
- recce/tasks/histogram.py +69 -34
- recce/tasks/lineage.py +2 -2
- recce/tasks/profile.py +152 -86
- recce/tasks/query.py +139 -87
- recce/tasks/rowcount.py +33 -30
- recce/tasks/schema.py +14 -14
- recce/tasks/top_k.py +35 -35
- recce/tasks/valuediff.py +216 -152
- recce/util/breaking.py +77 -84
- recce/util/cll.py +55 -51
- recce/util/io.py +19 -17
- recce/util/logger.py +1 -1
- recce/util/recce_cloud.py +70 -72
- recce/util/singleton.py +4 -4
- recce/yaml/__init__.py +7 -10
- {recce_nightly-1.2.0.20250506.dist-info → recce_nightly-1.4.0.20250514.dist-info}/METADATA +5 -2
- recce_nightly-1.4.0.20250514.dist-info/RECORD +143 -0
- {recce_nightly-1.2.0.20250506.dist-info → recce_nightly-1.4.0.20250514.dist-info}/WHEEL +1 -1
- tests/adapter/dbt_adapter/conftest.py +1 -0
- tests/adapter/dbt_adapter/dbt_test_helper.py +28 -18
- tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -15
- tests/adapter/dbt_adapter/test_dbt_cll.py +39 -32
- tests/adapter/dbt_adapter/test_selector.py +22 -21
- tests/tasks/test_histogram.py +58 -66
- tests/tasks/test_lineage.py +36 -23
- tests/tasks/test_preset_checks.py +45 -31
- tests/tasks/test_profile.py +340 -15
- tests/tasks/test_query.py +40 -40
- tests/tasks/test_row_count.py +65 -46
- tests/tasks/test_schema.py +65 -42
- tests/tasks/test_top_k.py +22 -18
- tests/tasks/test_valuediff.py +43 -32
- tests/test_cli.py +71 -58
- tests/test_config.py +7 -9
- tests/test_core.py +5 -3
- tests/test_dbt.py +7 -7
- tests/test_pull_request.py +1 -1
- tests/test_server.py +19 -13
- tests/test_state.py +40 -27
- tests/test_summary.py +18 -14
- recce/data/_next/static/chunks/8d700b6a-f0b1f6b9e0d97ce2.js +0 -1
- recce/data/_next/static/chunks/app/layout-9102e22cb73f74d6.js +0 -1
- recce/data/_next/static/chunks/app/page-cee661090afbd6aa.js +0 -1
- recce/data/_next/static/chunks/webpack-567d72f0bc0820d5.js +0 -1
- recce_nightly-1.2.0.20250506.dist-info/RECORD +0 -142
- /recce/data/_next/static/{Kcbs3GEIyH2LxgLYat0es → E_HPXsXdrqHg2YEHmU3mK}/_buildManifest.js +0 -0
- /recce/data/_next/static/{Kcbs3GEIyH2LxgLYat0es → E_HPXsXdrqHg2YEHmU3mK}/_ssgManifest.js +0 -0
- {recce_nightly-1.2.0.20250506.dist-info → recce_nightly-1.4.0.20250514.dist-info}/entry_points.txt +0 -0
- {recce_nightly-1.2.0.20250506.dist-info → recce_nightly-1.4.0.20250514.dist-info}/licenses/LICENSE +0 -0
- {recce_nightly-1.2.0.20250506.dist-info → recce_nightly-1.4.0.20250514.dist-info}/top_level.txt +0 -0
recce/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.
|
|
1
|
+
1.4.0.20250514
|
recce/__init__.py
CHANGED
|
@@ -7,19 +7,19 @@ from packaging.version import Version
|
|
|
7
7
|
def is_ci_env():
|
|
8
8
|
# List of CI environment variables and their expected values
|
|
9
9
|
ci_environments = {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
10
|
+
"CI": "true", # Generic CI indicator
|
|
11
|
+
"CIRCLECI": "true", # CircleCI
|
|
12
|
+
"GITHUB_ACTIONS": "true", # GitHub Actions
|
|
13
|
+
"GITLAB_CI": "true", # GitLab CI
|
|
14
|
+
"JENKINS_URL": None, # Jenkins (just needs to exist)
|
|
15
|
+
"TRAVIS": "true", # Travis CI
|
|
16
|
+
"APPVEYOR": "true", # AppVeyor
|
|
17
|
+
"DRONE": "true", # Drone CI
|
|
18
|
+
"TEAMCITY_VERSION": None, # TeamCity
|
|
19
|
+
"BITBUCKET_COMMIT": None, # Bitbucket Pipelines
|
|
20
|
+
"BUILDKITE": "true", # Buildkite
|
|
21
|
+
"CODEBUILD_BUILD_ID": None, # AWS CodeBuild
|
|
22
|
+
"AZURE_PIPELINES": "true", # Azure Pipelines
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
for env_var, expected_value in ci_environments.items():
|
|
@@ -37,22 +37,22 @@ def is_ci_env():
|
|
|
37
37
|
|
|
38
38
|
def get_runner():
|
|
39
39
|
# GitHub Action
|
|
40
|
-
if os.environ.get(
|
|
41
|
-
return
|
|
40
|
+
if os.environ.get("GITHUB_ACTIONS", "false") == "true":
|
|
41
|
+
return "github actions"
|
|
42
42
|
|
|
43
43
|
# GitHub Codespace
|
|
44
|
-
if os.environ.get(
|
|
45
|
-
return
|
|
44
|
+
if os.environ.get("CODESPACES", "false") == "true":
|
|
45
|
+
return "github codespaces"
|
|
46
46
|
|
|
47
47
|
# CircleCI
|
|
48
|
-
if os.environ.get(
|
|
49
|
-
return
|
|
48
|
+
if os.environ.get("CIRCLECI", "false") == "true":
|
|
49
|
+
return "circleci"
|
|
50
50
|
|
|
51
51
|
return None
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
def get_version():
|
|
55
|
-
version_file = os.path.normpath(os.path.join(os.path.dirname(__file__),
|
|
55
|
+
version_file = os.path.normpath(os.path.join(os.path.dirname(__file__), "VERSION"))
|
|
56
56
|
with open(version_file) as fh:
|
|
57
57
|
version = fh.read().strip()
|
|
58
58
|
return version
|
|
@@ -65,11 +65,11 @@ def fetch_latest_version():
|
|
|
65
65
|
return current_version
|
|
66
66
|
|
|
67
67
|
try:
|
|
68
|
-
url =
|
|
68
|
+
url = "https://pypi.org/pypi/recce/json"
|
|
69
69
|
response = requests.get(url, timeout=3)
|
|
70
70
|
response.raise_for_status()
|
|
71
71
|
data = response.json()
|
|
72
|
-
return data[
|
|
72
|
+
return data["info"]["version"]
|
|
73
73
|
except Exception:
|
|
74
74
|
return current_version
|
|
75
75
|
|
recce/adapter/base.py
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from abc import ABC, abstractmethod
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import Callable, Literal, Optional, Set
|
|
4
4
|
|
|
5
5
|
from recce.models.types import LineageDiff, NodeDiff
|
|
6
6
|
from recce.state import ArtifactsRoot
|
|
7
7
|
|
|
8
8
|
# from dbt.contracts.graph.nodes import ManifestNode
|
|
9
9
|
|
|
10
|
-
logger = logging.getLogger(
|
|
10
|
+
logger = logging.getLogger("uvicorn")
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class BaseAdapter(ABC):
|
|
@@ -23,28 +23,25 @@ class BaseAdapter(ABC):
|
|
|
23
23
|
def get_lineage_diff(self) -> LineageDiff:
|
|
24
24
|
base = self.get_lineage(base=True)
|
|
25
25
|
current = self.get_lineage(base=False)
|
|
26
|
-
keys = {
|
|
27
|
-
*base.get('nodes', {}).keys(),
|
|
28
|
-
*current.get('nodes', {}).keys()
|
|
29
|
-
}
|
|
26
|
+
keys = {*base.get("nodes", {}).keys(), *current.get("nodes", {}).keys()}
|
|
30
27
|
|
|
31
28
|
# for each node, compare the base and current lineage
|
|
32
29
|
diff = {}
|
|
33
30
|
for key in keys:
|
|
34
|
-
base_node = base.get(
|
|
35
|
-
curr_node = current.get(
|
|
31
|
+
base_node = base.get("nodes", {}).get(key)
|
|
32
|
+
curr_node = current.get("nodes", {}).get(key)
|
|
36
33
|
if base_node and curr_node:
|
|
37
|
-
base_checksum = base_node.get(
|
|
38
|
-
curr_checksum = curr_node.get(
|
|
34
|
+
base_checksum = base_node.get("checksum", {}).get("checksum")
|
|
35
|
+
curr_checksum = curr_node.get("checksum", {}).get("checksum")
|
|
39
36
|
|
|
40
37
|
if base_checksum is not None and base_checksum == curr_checksum:
|
|
41
38
|
continue
|
|
42
39
|
|
|
43
|
-
diff[key] = NodeDiff(change_status=
|
|
40
|
+
diff[key] = NodeDiff(change_status="modified", change_category="breaking")
|
|
44
41
|
elif base_node:
|
|
45
|
-
diff[key] = NodeDiff(change_status=
|
|
42
|
+
diff[key] = NodeDiff(change_status="removed")
|
|
46
43
|
elif curr_node:
|
|
47
|
-
diff[key] = NodeDiff(change_status=
|
|
44
|
+
diff[key] = NodeDiff(change_status="added")
|
|
48
45
|
return LineageDiff(
|
|
49
46
|
base=base,
|
|
50
47
|
current=current,
|
|
@@ -57,7 +54,7 @@ class BaseAdapter(ABC):
|
|
|
57
54
|
select: Optional[str] = None,
|
|
58
55
|
exclude: Optional[str] = None,
|
|
59
56
|
packages: Optional[list[str]] = None,
|
|
60
|
-
view_mode: Optional[Literal[
|
|
57
|
+
view_mode: Optional[Literal["all", "changed_models"]] = None,
|
|
61
58
|
) -> Set[str]:
|
|
62
59
|
raise NotImplementedError()
|
|
63
60
|
|