mirror of
https://github.com/esphome/esphome.git
synced 2024-11-25 08:28:12 +01:00
Support library override using named library with repository (#2056)
This commit is contained in:
parent
c2637a76f7
commit
159744e09e
4 changed files with 53 additions and 12 deletions
|
@ -408,19 +408,28 @@ class Define:
|
||||||
|
|
||||||
|
|
||||||
class Library:
|
class Library:
|
||||||
def __init__(self, name, version):
|
def __init__(self, name, version, repository=None):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.version = version
|
self.version = version
|
||||||
|
self.repository = repository
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.as_lib_dep
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def as_lib_dep(self):
|
def as_lib_dep(self):
|
||||||
|
if self.repository is not None:
|
||||||
|
if self.name is not None:
|
||||||
|
return f"{self.name}={self.repository}"
|
||||||
|
return self.repository
|
||||||
|
|
||||||
if self.version is None:
|
if self.version is None:
|
||||||
return self.name
|
return self.name
|
||||||
return f"{self.name}@{self.version}"
|
return f"{self.name}@{self.version}"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def as_tuple(self):
|
def as_tuple(self):
|
||||||
return self.name, self.version
|
return self.name, self.version, self.repository
|
||||||
|
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return hash(self.as_tuple)
|
return hash(self.as_tuple)
|
||||||
|
@ -632,10 +641,24 @@ class EsphomeCore:
|
||||||
"Library {} must be instance of Library, not {}"
|
"Library {} must be instance of Library, not {}"
|
||||||
"".format(library, type(library))
|
"".format(library, type(library))
|
||||||
)
|
)
|
||||||
_LOGGER.debug("Adding library: %s", library)
|
|
||||||
for other in self.libraries[:]:
|
for other in self.libraries[:]:
|
||||||
if other.name != library.name:
|
if other.name != library.name:
|
||||||
continue
|
continue
|
||||||
|
if other.repository is not None:
|
||||||
|
if library.repository is None or other.repository == library.repository:
|
||||||
|
# Other is using a/the same repository, takes precendence
|
||||||
|
break
|
||||||
|
raise ValueError(
|
||||||
|
"Adding named Library with repository failed! Libraries {} and {} "
|
||||||
|
"requested with conflicting repositories!"
|
||||||
|
"".format(library, other)
|
||||||
|
)
|
||||||
|
|
||||||
|
if library.repository is not None:
|
||||||
|
# This is more specific since its using a repository
|
||||||
|
self.libraries.remove(other)
|
||||||
|
continue
|
||||||
|
|
||||||
if library.version is None:
|
if library.version is None:
|
||||||
# Other requirement is more specific
|
# Other requirement is more specific
|
||||||
break
|
break
|
||||||
|
@ -652,6 +675,7 @@ class EsphomeCore:
|
||||||
"".format(library, other)
|
"".format(library, other)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
_LOGGER.debug("Adding library: %s", library)
|
||||||
self.libraries.append(library)
|
self.libraries.append(library)
|
||||||
return library
|
return library
|
||||||
|
|
||||||
|
|
|
@ -332,6 +332,14 @@ async def to_code(config):
|
||||||
if "@" in lib:
|
if "@" in lib:
|
||||||
name, vers = lib.split("@", 1)
|
name, vers = lib.split("@", 1)
|
||||||
cg.add_library(name, vers)
|
cg.add_library(name, vers)
|
||||||
|
elif "://" in lib:
|
||||||
|
# Repository...
|
||||||
|
if "=" in lib:
|
||||||
|
name, repo = lib.split("=", 1)
|
||||||
|
cg.add_library(name, None, repo)
|
||||||
|
else:
|
||||||
|
cg.add_library(None, None, lib)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
cg.add_library(lib, None)
|
cg.add_library(lib, None)
|
||||||
|
|
||||||
|
|
|
@ -543,13 +543,13 @@ def add_global(expression: Union[SafeExpType, Statement]):
|
||||||
CORE.add_global(expression)
|
CORE.add_global(expression)
|
||||||
|
|
||||||
|
|
||||||
def add_library(name: str, version: Optional[str]):
|
def add_library(name: str, version: Optional[str], repository: Optional[str] = None):
|
||||||
"""Add a library to the codegen library storage.
|
"""Add a library to the codegen library storage.
|
||||||
|
|
||||||
:param name: The name of the library (for example 'AsyncTCP')
|
:param name: The name of the library (for example 'AsyncTCP')
|
||||||
:param version: The version of the library, may be None.
|
:param version: The version of the library, may be None.
|
||||||
"""
|
"""
|
||||||
CORE.add_library(Library(name, version))
|
CORE.add_library(Library(name, version, repository))
|
||||||
|
|
||||||
|
|
||||||
def add_build_flag(build_flag: str):
|
def add_build_flag(build_flag: str):
|
||||||
|
|
|
@ -444,16 +444,24 @@ class TestDefine:
|
||||||
|
|
||||||
class TestLibrary:
|
class TestLibrary:
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"name, value, prop, expected",
|
"name, version, repository, prop, expected",
|
||||||
(
|
(
|
||||||
("mylib", None, "as_lib_dep", "mylib"),
|
("mylib", None, None, "as_lib_dep", "mylib"),
|
||||||
("mylib", None, "as_tuple", ("mylib", None)),
|
("mylib", None, None, "as_tuple", ("mylib", None, None)),
|
||||||
("mylib", "1.2.3", "as_lib_dep", "mylib@1.2.3"),
|
("mylib", "1.2.3", None, "as_lib_dep", "mylib@1.2.3"),
|
||||||
("mylib", "1.2.3", "as_tuple", ("mylib", "1.2.3")),
|
("mylib", "1.2.3", None, "as_tuple", ("mylib", "1.2.3", None)),
|
||||||
|
("mylib", None, "file:///test", "as_lib_dep", "mylib=file:///test"),
|
||||||
|
(
|
||||||
|
"mylib",
|
||||||
|
None,
|
||||||
|
"file:///test",
|
||||||
|
"as_tuple",
|
||||||
|
("mylib", None, "file:///test"),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
def test_properties(self, name, value, prop, expected):
|
def test_properties(self, name, version, repository, prop, expected):
|
||||||
target = core.Library(name, value)
|
target = core.Library(name, version, repository)
|
||||||
|
|
||||||
actual = getattr(target, prop)
|
actual = getattr(target, prop)
|
||||||
|
|
||||||
|
@ -465,6 +473,7 @@ class TestLibrary:
|
||||||
("__eq__", core.Library(name="libfoo", version="1.2.3"), True),
|
("__eq__", core.Library(name="libfoo", version="1.2.3"), True),
|
||||||
("__eq__", core.Library(name="libfoo", version="1.2.4"), False),
|
("__eq__", core.Library(name="libfoo", version="1.2.4"), False),
|
||||||
("__eq__", core.Library(name="libbar", version="1.2.3"), False),
|
("__eq__", core.Library(name="libbar", version="1.2.3"), False),
|
||||||
|
("__eq__", core.Library(name="libbar", version=None, repository="file:///test"), False),
|
||||||
("__eq__", 1000, NotImplemented),
|
("__eq__", 1000, NotImplemented),
|
||||||
("__eq__", "1000", NotImplemented),
|
("__eq__", "1000", NotImplemented),
|
||||||
("__eq__", True, NotImplemented),
|
("__eq__", True, NotImplemented),
|
||||||
|
|
Loading…
Reference in a new issue