Skip to content

Commit 46ed0ea

Browse files
jtcohen6QMalcolm
andauthored
[1.9.latest] Support reading package 'name' in package-lock.yml, but do not write (#11662)
* Cherry pick changes from 04f579a * Rm 'name' from written lock file * Add test + changie * Smaller diff * Fixup whitespace to pass code quality check --------- Co-authored-by: Quigley Malcolm <[email protected]> Co-authored-by: Quigley Malcolm <[email protected]>
1 parent ab93b10 commit 46ed0ea

File tree

4 files changed

+34
-2
lines changed

4 files changed

+34
-2
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: Under the Hood
2+
body: Support reading 'name' in package-lock.yml for forward-compatibility
3+
time: 2025-05-28T12:14:00.774495+02:00
4+
custom:
5+
Author: jtcohen6
6+
Issue: "11661"

core/dbt/contracts/project.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,21 @@ class Quoting(dbtClassMixin, Mergeable):
4242

4343
@dataclass
4444
class Package(dbtClassMixin):
45-
pass
45+
46+
# Exclude {'name': None} from to_dict result to avoid changing sha1_hash result
47+
# when user has not changed their 'packages' configuration.
48+
def __post_serialize__(self, data, context: Optional[Dict]):
49+
if "name" in data.keys() and data["name"] is None:
50+
data.pop("name")
51+
return data
52+
return data
4653

4754

4855
@dataclass
4956
class LocalPackage(Package):
5057
local: str
5158
unrendered: Dict[str, Any] = field(default_factory=dict)
59+
name: Optional[str] = None
5260

5361

5462
# `float` also allows `int`, according to PEP484 (and jsonschema!)
@@ -69,6 +77,7 @@ class GitPackage(Package):
6977
warn_unpinned: Optional[bool] = field(default=None, metadata={"alias": "warn-unpinned"})
7078
subdirectory: Optional[str] = None
7179
unrendered: Dict[str, Any] = field(default_factory=dict)
80+
name: Optional[str] = None
7281

7382
def get_revisions(self) -> List[str]:
7483
if self.revision is None:
@@ -85,6 +94,7 @@ class PrivatePackage(Package):
8594
warn_unpinned: Optional[bool] = field(default=None, metadata={"alias": "warn-unpinned"})
8695
subdirectory: Optional[str] = None
8796
unrendered: Dict[str, Any] = field(default_factory=dict)
97+
name: Optional[str] = None
8898

8999

90100
@dataclass
@@ -93,6 +103,7 @@ class RegistryPackage(Package):
93103
version: Union[RawVersion, List[RawVersion]]
94104
install_prerelease: Optional[bool] = False
95105
unrendered: Dict[str, Any] = field(default_factory=dict)
106+
name: Optional[str] = None
96107

97108
def get_versions(self) -> List[str]:
98109
if isinstance(self.version, list):

core/dbt/task/deps.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ def lock(self) -> None:
190190
# package-lock.yml includes both the stated packages in packages.yml along with dependent packages
191191
for package in resolved_deps:
192192
packages_installed["packages"].append(package.to_dict())
193+
193194
packages_installed[PACKAGE_LOCK_HASH_KEY] = _create_sha1_hash(
194195
self.project.packages.packages
195196
)
@@ -204,7 +205,7 @@ def run(self) -> None:
204205
if self.args.add_package:
205206
self.add()
206207

207-
# Check lock file exist and generated by the same pacakges.yml
208+
# Check lock file exist and generated by the same packages.yml
208209
# or dependencies.yml.
209210
lock_file_path = f"{self.project.project_root}/{PACKAGE_LOCK_FILE_NAME}"
210211
if not system.path_exists(lock_file_path):

tests/functional/dependencies/test_dependency_options.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,17 @@ def test_deps_upgrade(self, clean_start, mocker):
100100
patched_lock = mocker.patch("dbt.task.deps.DepsTask.lock")
101101
run_dbt(["deps", "--upgrade"])
102102
assert patched_lock.call_count == 1
103+
104+
def test_deps_read_fwd_compatible(self, clean_start, mocker):
105+
package_lock_content = """packages:
106+
- name: fivetran_utils
107+
package: fivetran/fivetran_utils
108+
version: 0.4.7
109+
- name: dbt_utils
110+
package: dbt-labs/dbt_utils
111+
version: 1.3.0
112+
sha1_hash: 71304bca2138cf8004070b3573a1e17183c0c1a8\n
113+
"""
114+
with open("package-lock.yml", "w") as fp:
115+
fp.write(package_lock_content)
116+
run_dbt(["deps"])

0 commit comments

Comments
 (0)