mirror of
https://github.com/dbt-labs/dbt-core
synced 2025-12-18 22:11:27 +00:00
Compare commits
10 Commits
enable-pos
...
jerco/fun-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c2f6e5445a | ||
|
|
3c2a373b0a | ||
|
|
51faf1d718 | ||
|
|
59e5fc5f86 | ||
|
|
eebb1d3ab6 | ||
|
|
0952e8b003 | ||
|
|
649fc51af8 | ||
|
|
cf4b2c2dbd | ||
|
|
914f23d859 | ||
|
|
1ec9888e17 |
6
.changes/unreleased/Features-20230208-090751.yaml
Normal file
6
.changes/unreleased/Features-20230208-090751.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Features
|
||||
body: enhance package mismatch deps error
|
||||
time: 2023-02-08T09:07:51.254423-06:00
|
||||
custom:
|
||||
Author: jtcohen6 dave-connors-3 dbeatty10
|
||||
Issue: "4775"
|
||||
@@ -1,4 +1,4 @@
|
||||
from typing import List
|
||||
from typing import List, Dict, Optional
|
||||
|
||||
from dbt import semver
|
||||
from dbt.flags import get_flags
|
||||
@@ -59,22 +59,50 @@ class RegistryPinnedPackage(RegistryPackageMixin, PinnedPackage):
|
||||
def install(self, project, renderer):
|
||||
self._install(project, renderer)
|
||||
|
||||
def __repr__(self):
|
||||
return f"{self.package}@{self.version}"
|
||||
|
||||
|
||||
class RegistryUnpinnedPackage(RegistryPackageMixin, UnpinnedPackage[RegistryPinnedPackage]):
|
||||
def __init__(
|
||||
self, package: str, versions: List[semver.VersionSpecifier], install_prerelease: bool
|
||||
self,
|
||||
package: str,
|
||||
versions: List[semver.VersionSpecifier],
|
||||
install_prerelease: bool,
|
||||
by_whom: str = "user",
|
||||
who_wants_which: Optional[Dict[str, List[semver.VersionSpecifier]]] = None,
|
||||
) -> None:
|
||||
super().__init__(package)
|
||||
self.versions = versions
|
||||
self.install_prerelease = install_prerelease
|
||||
self.by_whom = by_whom
|
||||
self.who_wants_which = who_wants_which
|
||||
|
||||
if not self.who_wants_which:
|
||||
self.who_wants_which = {self.by_whom: self.versions}
|
||||
|
||||
def __repr__(self) -> str:
|
||||
version_list = []
|
||||
for version in self.versions:
|
||||
version_list.append(version.to_version_string())
|
||||
return f"{self.name} : {version_list}"
|
||||
|
||||
def _check_in_index(self):
|
||||
index = registry.index_cached()
|
||||
if self.package not in index:
|
||||
raise PackageNotFoundError(self.package)
|
||||
|
||||
def package_requests(self):
|
||||
message = ""
|
||||
for who, which in self.who_wants_which.items():
|
||||
version_list = []
|
||||
for version in which:
|
||||
version_list.append(version.to_version_string())
|
||||
message = message + f"\n Required by {who}: {version_list}"
|
||||
return message
|
||||
|
||||
@classmethod
|
||||
def from_contract(cls, contract: RegistryPackage) -> "RegistryUnpinnedPackage":
|
||||
def from_contract(cls, contract: RegistryPackage, by_whom="user") -> "RegistryUnpinnedPackage":
|
||||
raw_version = contract.get_versions()
|
||||
|
||||
versions = [semver.VersionSpecifier.from_version_string(v) for v in raw_version]
|
||||
@@ -82,13 +110,16 @@ class RegistryUnpinnedPackage(RegistryPackageMixin, UnpinnedPackage[RegistryPinn
|
||||
package=contract.package,
|
||||
versions=versions,
|
||||
install_prerelease=bool(contract.install_prerelease),
|
||||
by_whom=by_whom,
|
||||
)
|
||||
|
||||
def incorporate(self, other: "RegistryUnpinnedPackage") -> "RegistryUnpinnedPackage":
|
||||
who_wants_which = (self.who_wants_which or {}) or (other.who_wants_which or {})
|
||||
return RegistryUnpinnedPackage(
|
||||
package=self.package,
|
||||
install_prerelease=self.install_prerelease,
|
||||
versions=self.versions + other.versions,
|
||||
who_wants_which=who_wants_which,
|
||||
)
|
||||
|
||||
def resolved(self) -> RegistryPinnedPackage:
|
||||
@@ -96,7 +127,8 @@ class RegistryUnpinnedPackage(RegistryPackageMixin, UnpinnedPackage[RegistryPinn
|
||||
try:
|
||||
range_ = semver.reduce_versions(*self.versions)
|
||||
except VersionsNotCompatibleError as e:
|
||||
new_msg = "Version error for package {}: {}".format(self.name, e)
|
||||
new_msg = f"Version error for package {self.name}: {self.package_requests()}"
|
||||
print(f"--- in resolved. new_msg: {new_msg}")
|
||||
raise DependencyError(new_msg) from e
|
||||
flags = get_flags()
|
||||
should_version_check = bool(flags.VERSION_CHECK)
|
||||
|
||||
@@ -68,7 +68,7 @@ class PackageListing:
|
||||
else:
|
||||
self.packages[key] = package
|
||||
|
||||
def update_from(self, src: List[PackageContract]) -> None:
|
||||
def update_from(self, src: List[PackageContract], by_whom="user") -> None:
|
||||
pkg: UnpinnedPackage
|
||||
for contract in src:
|
||||
if isinstance(contract, LocalPackage):
|
||||
@@ -78,7 +78,7 @@ class PackageListing:
|
||||
elif isinstance(contract, GitPackage):
|
||||
pkg = GitUnpinnedPackage.from_contract(contract)
|
||||
elif isinstance(contract, RegistryPackage):
|
||||
pkg = RegistryUnpinnedPackage.from_contract(contract)
|
||||
pkg = RegistryUnpinnedPackage.from_contract(contract, by_whom)
|
||||
else:
|
||||
raise DbtInternalError("Invalid package type {}".format(type(contract)))
|
||||
self.incorporate(pkg)
|
||||
@@ -128,8 +128,9 @@ def resolve_packages(
|
||||
# resolve the dependency in question
|
||||
for package in pending:
|
||||
final.incorporate(package)
|
||||
target = final[package].resolved().fetch_metadata(project, renderer)
|
||||
next_pending.update_from(target.packages)
|
||||
resolved = final[package].resolved()
|
||||
target = resolved.fetch_metadata(project, renderer)
|
||||
next_pending.update_from(target.packages, by_whom=str(resolved))
|
||||
pending = next_pending
|
||||
|
||||
resolved = final.resolved()
|
||||
|
||||
@@ -6,7 +6,7 @@ flake8
|
||||
flaky
|
||||
freezegun==0.3.12
|
||||
ipdb
|
||||
mypy==0.981
|
||||
mypy==0.942
|
||||
pip-tools
|
||||
pre-commit
|
||||
protobuf
|
||||
|
||||
@@ -3,6 +3,8 @@ from copy import deepcopy
|
||||
import unittest
|
||||
from unittest import mock
|
||||
|
||||
from dbt.flags import set_from_args
|
||||
from argparse import Namespace
|
||||
import dbt.deps
|
||||
import dbt.exceptions
|
||||
from dbt.deps.git import GitUnpinnedPackage
|
||||
@@ -23,6 +25,8 @@ from dbt.version import get_installed_version
|
||||
|
||||
from dbt.dataclass_schema import ValidationError
|
||||
|
||||
set_from_args(Namespace(SEND_ANONYMOUS_USAGE_STATS=False), None)
|
||||
|
||||
|
||||
class TestLocalPackage(unittest.TestCase):
|
||||
def test_init(self):
|
||||
@@ -300,10 +304,8 @@ class TestHubPackage(unittest.TestCase):
|
||||
|
||||
with self.assertRaises(dbt.exceptions.DependencyError) as exc:
|
||||
c.resolved()
|
||||
msg = (
|
||||
"Version error for package dbt-labs-test/a: Could not "
|
||||
"find a satisfactory version from options: ['=0.1.2', '=0.1.3']"
|
||||
)
|
||||
msg = "Version error for package dbt-labs-test/a: \n Required by user: ['=0.1.3']"
|
||||
print(f"--- from str(exc.exception): {str(exc.exception)}")
|
||||
self.assertEqual(msg, str(exc.exception))
|
||||
|
||||
def test_resolve_ranges(self):
|
||||
|
||||
Reference in New Issue
Block a user