mirror of https://github.com/mamba-org/mamba.git
996 lines
30 KiB
Python
996 lines
30 KiB
Python
import copy
|
|
|
|
import pytest
|
|
|
|
import libmambapy
|
|
|
|
|
|
def test_import_submodule():
|
|
import libmambapy.specs as specs
|
|
|
|
# Dummy execution
|
|
_p = specs.KnownPlatform.noarch
|
|
|
|
|
|
def test_import_recursive():
|
|
import libmambapy as mamba
|
|
|
|
# Dummy execution
|
|
_p = mamba.specs.KnownPlatform.noarch
|
|
|
|
|
|
def test_ParseError():
|
|
assert issubclass(libmambapy.specs.ParseError, ValueError)
|
|
|
|
|
|
def test_archive_extension():
|
|
assert libmambapy.specs.archive_extensions() == [".tar.bz2", ".conda", ".whl", ".tar.gz"]
|
|
|
|
assert libmambapy.specs.has_archive_extension("pkg.conda")
|
|
assert not libmambapy.specs.has_archive_extension("conda.pkg")
|
|
|
|
assert libmambapy.specs.strip_archive_extension("pkg.conda") == "pkg"
|
|
assert libmambapy.specs.strip_archive_extension("conda.pkg") == "conda.pkg"
|
|
|
|
|
|
def test_KnownPlatform():
|
|
KnownPlatform = libmambapy.specs.KnownPlatform
|
|
|
|
assert KnownPlatform.noarch.name == "noarch"
|
|
assert KnownPlatform.linux_32.name == "linux_32"
|
|
assert KnownPlatform.linux_64.name == "linux_64"
|
|
assert KnownPlatform.linux_armv6l.name == "linux_armv6l"
|
|
assert KnownPlatform.linux_armv7l.name == "linux_armv7l"
|
|
assert KnownPlatform.linux_aarch64.name == "linux_aarch64"
|
|
assert KnownPlatform.linux_ppc64le.name == "linux_ppc64le"
|
|
assert KnownPlatform.linux_ppc64.name == "linux_ppc64"
|
|
assert KnownPlatform.linux_s390x.name == "linux_s390x"
|
|
assert KnownPlatform.linux_riscv32.name == "linux_riscv32"
|
|
assert KnownPlatform.linux_riscv64.name == "linux_riscv64"
|
|
assert KnownPlatform.osx_64.name == "osx_64"
|
|
assert KnownPlatform.osx_arm64.name == "osx_arm64"
|
|
assert KnownPlatform.win_32.name == "win_32"
|
|
assert KnownPlatform.win_64.name == "win_64"
|
|
assert KnownPlatform.win_arm64.name == "win_arm64"
|
|
assert KnownPlatform.zos_z.name == "zos_z"
|
|
|
|
assert len(KnownPlatform.__members__) == KnownPlatform.count()
|
|
assert KnownPlatform.build_platform() in KnownPlatform.__members__.values()
|
|
assert KnownPlatform.parse("linux-64") == KnownPlatform.linux_64
|
|
assert KnownPlatform("linux_64") == KnownPlatform.linux_64
|
|
|
|
with pytest.raises(KeyError):
|
|
# No parsing, explicit name
|
|
KnownPlatform("linux-64")
|
|
|
|
|
|
def test_NoArchType():
|
|
NoArchType = libmambapy.specs.NoArchType
|
|
|
|
assert NoArchType.No.name == "No"
|
|
assert NoArchType.Generic.name == "Generic"
|
|
assert NoArchType.Python.name == "Python"
|
|
|
|
assert len(NoArchType.__members__) == NoArchType.count()
|
|
assert NoArchType.parse(" Python") == NoArchType.Python
|
|
assert NoArchType("Generic") == NoArchType.Generic
|
|
|
|
with pytest.raises(KeyError):
|
|
# No parsing, explicit name, needs "Generic"
|
|
NoArchType("generic")
|
|
|
|
|
|
def test_CondaURL_Credentials():
|
|
Credentials = libmambapy.specs.CondaURL.Credentials
|
|
|
|
assert Credentials.Hide.name == "Hide"
|
|
assert Credentials.Show.name == "Show"
|
|
assert Credentials.Remove.name == "Remove"
|
|
assert Credentials("Show") == Credentials.Show
|
|
|
|
|
|
def test_CondaURL_setters():
|
|
CondaURL = libmambapy.specs.CondaURL
|
|
url = CondaURL()
|
|
|
|
# Scheme
|
|
assert url.scheme_is_defaulted()
|
|
url.set_scheme("ftp")
|
|
assert not url.scheme_is_defaulted()
|
|
assert url.scheme() == "ftp"
|
|
assert url.clear_scheme() == "ftp"
|
|
assert url.scheme() == "https"
|
|
assert url.scheme_is_defaulted()
|
|
# User
|
|
assert url.user() == ""
|
|
assert not url.has_user()
|
|
url.set_user("user@email.com")
|
|
assert url.user() == "user@email.com"
|
|
url.set_user("none%40email.com", encode=False)
|
|
assert url.user() == "none@email.com"
|
|
assert url.clear_user() == "none%40email.com"
|
|
assert url.user() == ""
|
|
# Password
|
|
assert url.password() == ""
|
|
assert not url.has_password()
|
|
url.set_password("some#pass")
|
|
assert url.password() == "some#pass"
|
|
url.set_password("s%23pass", encode=False)
|
|
assert url.password() == "s#pass"
|
|
assert url.clear_password() == "s%23pass"
|
|
assert url.password() == ""
|
|
# Host
|
|
assert url.host_is_defaulted()
|
|
assert url.host() == "localhost"
|
|
url.set_host("mamba.org")
|
|
assert not url.host_is_defaulted()
|
|
assert url.host() == "mamba.org"
|
|
assert url.clear_host() == "mamba.org"
|
|
assert url.host() == "localhost"
|
|
assert url.host_is_defaulted()
|
|
# Port
|
|
assert url.port() == ""
|
|
url.set_port("33")
|
|
assert url.port() == "33"
|
|
assert url.clear_port() == "33"
|
|
assert url.port() == ""
|
|
# Path
|
|
assert url.path() == "/"
|
|
url.set_path("some path")
|
|
assert url.path() == "/some path"
|
|
url.set_path("some%20", encode=False)
|
|
assert url.path() == "/some "
|
|
url.append_path(" foo")
|
|
assert url.path() == "/some / foo"
|
|
url.append_path("%23", encode=False)
|
|
assert url.path() == "/some / foo/#"
|
|
assert url.clear_path() == "/some%20/%20foo/%23"
|
|
# Token
|
|
assert not url.has_token()
|
|
assert url.token() == ""
|
|
url.set_token("mytoken")
|
|
assert url.has_token()
|
|
assert url.token() == "mytoken"
|
|
assert url.clear_token()
|
|
assert url.token() == ""
|
|
# Path without token
|
|
url.set_token("mytoken")
|
|
assert url.path_without_token() == "/"
|
|
url.set_path_without_token("my path")
|
|
assert url.path_without_token() == "/my path"
|
|
url.set_path_without_token("bar%20", encode=False)
|
|
assert url.path_without_token() == "/bar "
|
|
assert url.clear_path_without_token()
|
|
# KnownPlatform
|
|
url.set_path_without_token("conda-forge/win-64", encode=False)
|
|
assert url.platform().name == "win_64"
|
|
url.set_platform("linux_64")
|
|
assert url.platform().name == "linux_64"
|
|
assert url.clear_platform()
|
|
# Package
|
|
assert url.package() == ""
|
|
url.set_package("pkg.conda")
|
|
assert url.package() == "pkg.conda"
|
|
assert url.clear_package()
|
|
|
|
|
|
def test_CondaURL_parse():
|
|
CondaURL = libmambapy.specs.CondaURL
|
|
|
|
# Errors
|
|
with pytest.raises(libmambapy.specs.ParseError):
|
|
CondaURL.parse("py>#")
|
|
|
|
url = CondaURL.parse(
|
|
"https://user%40mail.com:pas%23@repo.mamba.pm:400/t/xy-12345678-1234/%20conda/linux-64/pkg.conda"
|
|
)
|
|
assert url.scheme() == "https"
|
|
assert url.user() == "user@mail.com"
|
|
assert url.user(decode=False) == "user%40mail.com"
|
|
assert url.password() == "pas#"
|
|
assert url.password(decode=False) == "pas%23"
|
|
assert url.authentication() == "user%40mail.com:pas%23"
|
|
assert url.host() == "repo.mamba.pm"
|
|
assert url.host(decode=False) == "repo.mamba.pm"
|
|
assert url.port() == "400"
|
|
assert url.path() == "/t/xy-12345678-1234/ conda/linux-64/pkg.conda"
|
|
assert url.path(decode=False) == "/t/xy-12345678-1234/%20conda/linux-64/pkg.conda"
|
|
assert url.token() == "xy-12345678-1234"
|
|
assert url.path_without_token() == "/ conda/linux-64/pkg.conda"
|
|
assert url.path_without_token(decode=False) == "/%20conda/linux-64/pkg.conda"
|
|
assert url.platform().name == "linux_64"
|
|
assert url.package() == "pkg.conda"
|
|
|
|
assert (
|
|
url.str()
|
|
== "https://user%40mail.com:*****@repo.mamba.pm:400/t/*****/%20conda/linux-64/pkg.conda"
|
|
)
|
|
assert (
|
|
url.str(credentials="Show")
|
|
== "https://user%40mail.com:pas%23@repo.mamba.pm:400/t/xy-12345678-1234/%20conda/linux-64/pkg.conda"
|
|
)
|
|
assert repr(url) == (
|
|
"https://user%40mail.com:*****@repo.mamba.pm:400/t/*****/%20conda/linux-64/pkg.conda"
|
|
)
|
|
assert (
|
|
url.pretty_str(strip_scheme=True, credentials="Hide", rstrip_path="/")
|
|
== "user@mail.com:*****@repo.mamba.pm:400/t/*****/ conda/linux-64/pkg.conda"
|
|
)
|
|
|
|
|
|
def test_CondaURL_op():
|
|
CondaURL = libmambapy.specs.CondaURL
|
|
url = CondaURL.parse(
|
|
"https://user%40mail.com:pas%23@repo.mamba.pm:400/t/xy-12345678-1234/%20conda/linux-64/pkg.conda"
|
|
)
|
|
|
|
# Copy
|
|
other = copy.deepcopy(url)
|
|
assert other.str() == url.str()
|
|
assert other is not url
|
|
|
|
# Comparison
|
|
assert hash(url) != 0
|
|
assert url == url
|
|
assert other == url
|
|
other.set_host("somehost.com")
|
|
assert other != url
|
|
|
|
# Append
|
|
url.set_path("/folder")
|
|
assert (url / "file.txt").path() == "/folder/file.txt"
|
|
|
|
|
|
def test_UnresolvedChannel_Type():
|
|
Type = libmambapy.specs.UnresolvedChannel.Type
|
|
|
|
assert Type.URL.name == "URL"
|
|
assert Type.PackageURL.name == "PackageURL"
|
|
assert Type.Path.name == "Path"
|
|
assert Type.PackagePath.name == "PackagePath"
|
|
assert Type.Name.name == "Name"
|
|
assert Type.Unknown.name == "Unknown"
|
|
assert Type("Name").name == "Name"
|
|
|
|
|
|
def test_UnresolvedChannel():
|
|
UnresolvedChannel = libmambapy.specs.UnresolvedChannel
|
|
|
|
# Constructor
|
|
uc = UnresolvedChannel(
|
|
location="<unknown>",
|
|
platform_filters=set(),
|
|
type=UnresolvedChannel.Type.Unknown,
|
|
)
|
|
assert uc.location == "<unknown>"
|
|
assert uc.platform_filters == set()
|
|
assert uc.type == UnresolvedChannel.Type.Unknown
|
|
|
|
# Enum cast
|
|
uc = UnresolvedChannel(location="conda-forge", platform_filters=set(), type="Name")
|
|
assert uc.type == UnresolvedChannel.Type.Name
|
|
|
|
# str
|
|
uc = UnresolvedChannel(location="conda-forge", platform_filters=set(), type="Name")
|
|
assert str(uc) == "conda-forge"
|
|
|
|
# Parser
|
|
uc = UnresolvedChannel.parse("conda-forge[linux-64]")
|
|
assert uc.location == "conda-forge"
|
|
assert uc.platform_filters == {"linux-64"}
|
|
assert uc.type == UnresolvedChannel.Type.Name
|
|
|
|
# Errors
|
|
with pytest.raises(libmambapy.specs.ParseError):
|
|
UnresolvedChannel.parse("conda-forge]")
|
|
|
|
# Copy
|
|
other = copy.deepcopy(uc)
|
|
assert other.location == uc.location
|
|
assert other is not uc
|
|
|
|
|
|
def test_BasicHTTPAuthentication():
|
|
BasicHTTPAuthentication = libmambapy.specs.BasicHTTPAuthentication
|
|
|
|
auth = BasicHTTPAuthentication(user="mamba", password="superpass!!")
|
|
|
|
# Properties
|
|
assert auth.user == "mamba"
|
|
assert auth.password == "superpass!!"
|
|
auth.user = "conda"
|
|
auth.password = "awesome#"
|
|
assert auth.user == "conda"
|
|
assert auth.password == "awesome#"
|
|
|
|
# Copy
|
|
other = copy.deepcopy(auth)
|
|
assert other is not auth
|
|
assert other.user == auth.user
|
|
assert other is not auth
|
|
|
|
# Comparison
|
|
assert auth == auth
|
|
assert auth == other
|
|
other.user = "rattler"
|
|
assert auth != other
|
|
assert hash(auth) != 0
|
|
|
|
|
|
def test_BearerToken():
|
|
BearerToken = libmambapy.specs.BearerToken
|
|
|
|
auth = BearerToken(token="mytoken")
|
|
|
|
# Properties
|
|
assert auth.token == "mytoken"
|
|
auth.token = "othertok"
|
|
assert auth.token == "othertok"
|
|
|
|
# Copy
|
|
other = copy.deepcopy(auth)
|
|
assert other is not auth
|
|
assert other.token == auth.token
|
|
|
|
# Comparison
|
|
assert auth == auth
|
|
assert auth == other
|
|
other.token = "foo"
|
|
assert auth != other
|
|
assert hash(auth) != 0
|
|
|
|
|
|
def test_CondaToken():
|
|
CondaToken = libmambapy.specs.CondaToken
|
|
|
|
auth = CondaToken(token="mytoken")
|
|
|
|
# Properties
|
|
assert auth.token == "mytoken"
|
|
auth.token = "othertok"
|
|
assert auth.token == "othertok"
|
|
|
|
# Copy
|
|
other = copy.deepcopy(auth)
|
|
assert other is not auth
|
|
assert other.token == auth.token
|
|
|
|
# Comparison
|
|
assert auth == auth
|
|
assert auth == other
|
|
other.token = "foo"
|
|
assert auth != other
|
|
assert hash(auth) != 0
|
|
|
|
|
|
def test_AuthenticationDataBase():
|
|
AuthenticationDataBase = libmambapy.specs.AuthenticationDataBase
|
|
BearerToken = libmambapy.specs.BearerToken
|
|
BasicHTTPAuthentication = libmambapy.specs.BasicHTTPAuthentication
|
|
|
|
auth_1 = BearerToken(token="mytoken")
|
|
db = AuthenticationDataBase({"mamba.org": auth_1})
|
|
|
|
# Dict style mapping
|
|
assert "mamba.org" in db
|
|
assert len(db) == 1
|
|
assert db["mamba.org"] == auth_1
|
|
|
|
auth_2 = BasicHTTPAuthentication(user="user", password="pass")
|
|
db["anaconda.com"] = auth_2
|
|
assert db["anaconda.com"] == auth_2
|
|
|
|
# Iteration
|
|
for key, val in db.items():
|
|
...
|
|
|
|
# Comparison
|
|
assert auth_1 == auth_1
|
|
assert auth_1 != auth_2
|
|
|
|
# Special functions
|
|
assert db.contains_weaken("mamba.org")
|
|
assert db.contains_weaken("mamba.org/conda-forge")
|
|
assert db.at_weaken("mamba.org/conda-forge") == auth_1
|
|
|
|
|
|
def test_ChannelResolveParams():
|
|
ChannelResolveParams = libmambapy.specs.ChannelResolveParams
|
|
CondaURL = libmambapy.specs.CondaURL
|
|
AuthenticationDataBase = libmambapy.specs.AuthenticationDataBase
|
|
BearerToken = libmambapy.specs.BearerToken
|
|
|
|
# custom_channel and custom_multichannel require creating a Channel to be tested,
|
|
# so we leave them out for simplicity/isolation here.
|
|
# See test_Channel_resolve
|
|
|
|
platforms_1 = {"linux-64"}
|
|
channel_alias_1 = CondaURL.parse("oci://github.com/")
|
|
db_1 = AuthenticationDataBase({"mamba.org": BearerToken(token="mytoken")})
|
|
home_dir_1 = "/users/mamba"
|
|
cwd_1 = "/tmp/workspace"
|
|
|
|
# Constructor
|
|
params = ChannelResolveParams(
|
|
platforms=platforms_1,
|
|
channel_alias=channel_alias_1,
|
|
# custom_channels = ,
|
|
# custom_multichannels = ,
|
|
authentication_db=db_1,
|
|
home_dir=home_dir_1,
|
|
current_working_dir=cwd_1,
|
|
)
|
|
|
|
# Getters
|
|
assert params.platforms == platforms_1
|
|
assert params.channel_alias == channel_alias_1
|
|
assert params.authentication_db == db_1
|
|
assert params.home_dir == home_dir_1
|
|
assert params.current_working_dir == cwd_1
|
|
|
|
platforms_2 = {"win-64", "noarch"}
|
|
channel_alias_2 = CondaURL.parse("ftp://anaconda.com/")
|
|
db_2 = AuthenticationDataBase({"conda.org": BearerToken(token="tkn")})
|
|
home_dir_2 = "/users/conda"
|
|
cwd_2 = "/tmp/elsewhere"
|
|
|
|
# Setters
|
|
params.platforms = platforms_2
|
|
params.channel_alias = channel_alias_2
|
|
params.authentication_db = db_2
|
|
params.home_dir = home_dir_2
|
|
params.current_working_dir = cwd_2
|
|
assert params.platforms == platforms_2
|
|
assert params.channel_alias == channel_alias_2
|
|
assert params.authentication_db == db_2
|
|
assert params.home_dir == home_dir_2
|
|
assert params.current_working_dir == cwd_2
|
|
|
|
|
|
def test_Channel():
|
|
Channel = libmambapy.specs.Channel
|
|
Match = libmambapy.specs.Channel.Match
|
|
CondaURL = libmambapy.specs.CondaURL
|
|
|
|
url_1 = CondaURL.parse("https://repo.anaconda.com/conda-forge")
|
|
platforms_1 = {"osx-64", "noarch"}
|
|
display_name_1 = "conda-forge"
|
|
|
|
# Constructor
|
|
chan = Channel(url=url_1, platforms=platforms_1, display_name=display_name_1)
|
|
|
|
# Getters
|
|
assert chan.url == url_1
|
|
assert chan.platforms == platforms_1
|
|
assert chan.display_name == display_name_1
|
|
assert not chan.is_package()
|
|
|
|
url_2 = CondaURL.parse("https://mamba.pm/mamba-forge/pkg.conda")
|
|
platforms_2 = {"win-64"}
|
|
display_name_2 = "mamba-forge"
|
|
|
|
# Setters
|
|
chan.url = url_2
|
|
chan.platforms = platforms_2
|
|
chan.display_name = display_name_2
|
|
assert chan.url == url_2
|
|
assert chan.platforms == platforms_2
|
|
assert chan.display_name == display_name_2
|
|
assert chan.is_package()
|
|
|
|
# Copy
|
|
other = copy.deepcopy(chan)
|
|
assert other is not chan
|
|
assert chan.display_name == chan.display_name
|
|
|
|
# Comparison
|
|
assert chan == chan
|
|
assert chan == chan
|
|
other.platforms = {"neverheard-59"}
|
|
assert chan != other
|
|
assert hash(chan) != 0
|
|
|
|
# Weak comparison
|
|
chan = Channel(url=url_1, platforms=platforms_1, display_name=display_name_1)
|
|
other = Channel(
|
|
url=url_1, platforms=(chan.platforms | {"human-67"}), display_name=display_name_1
|
|
)
|
|
assert chan.url_equivalent_with(chan)
|
|
assert chan.url_equivalent_with(other)
|
|
assert other.url_equivalent_with(chan)
|
|
assert chan.is_equivalent_to(chan)
|
|
assert not chan.is_equivalent_to(other)
|
|
assert not other.is_equivalent_to(chan)
|
|
assert chan.contains_equivalent(chan)
|
|
assert other.contains_equivalent(chan)
|
|
assert not chan.contains_equivalent(other)
|
|
assert chan.contains_package(chan.url / "noarch/pkg.conda") == Match.Full
|
|
assert chan.contains_package(chan.url / "win-64/pkg.conda") == Match.InOtherPlatform
|
|
|
|
|
|
def test_Channel_resolve():
|
|
Channel = libmambapy.specs.Channel
|
|
UnresolvedChannel = libmambapy.specs.UnresolvedChannel
|
|
CondaURL = libmambapy.specs.CondaURL
|
|
AuthenticationDataBase = libmambapy.specs.AuthenticationDataBase
|
|
BearerToken = libmambapy.specs.BearerToken
|
|
|
|
platforms = {"linux-64"}
|
|
channel_alias = CondaURL.parse("oci://github.com/")
|
|
auth_db = AuthenticationDataBase({"mamba.org": BearerToken(token="mytoken")})
|
|
home_dir = "/users/mamba"
|
|
cwd = "/tmp/workspace"
|
|
|
|
chans = Channel.resolve(
|
|
what=UnresolvedChannel.parse("conda-forge"),
|
|
platforms=platforms,
|
|
channel_alias=channel_alias,
|
|
authentication_db=auth_db,
|
|
home_dir=home_dir,
|
|
current_working_dir=cwd,
|
|
)
|
|
|
|
assert len(chans) == 1
|
|
chan_1 = chans[0]
|
|
assert chan_1.url == channel_alias / "conda-forge"
|
|
assert chan_1.platforms == platforms
|
|
assert chan_1.display_name == "conda-forge"
|
|
|
|
# Custom channel match
|
|
custom_channels = Channel.ChannelMap({"best-forge": chan_1})
|
|
chans = Channel.resolve(
|
|
what=UnresolvedChannel.parse("best-forge"),
|
|
platforms=platforms,
|
|
channel_alias=channel_alias,
|
|
custom_channels=custom_channels,
|
|
authentication_db=auth_db,
|
|
home_dir=home_dir,
|
|
current_working_dir=cwd,
|
|
)
|
|
assert len(chans) == 1
|
|
chan_2 = chans[0]
|
|
assert chan_2.display_name == "best-forge"
|
|
|
|
# Custom multi channel match
|
|
custom_multichannels = Channel.MultiChannelMap({"known-forges": [chan_1, chan_2]})
|
|
chans = Channel.resolve(
|
|
what=UnresolvedChannel.parse("known-forges"),
|
|
platforms=platforms,
|
|
channel_alias=channel_alias,
|
|
custom_channels=custom_channels,
|
|
custom_multichannels=custom_multichannels,
|
|
authentication_db=auth_db,
|
|
home_dir=home_dir,
|
|
current_working_dir=cwd,
|
|
)
|
|
assert len(chans) == 2
|
|
assert {c.display_name for c in chans} == {"best-forge", "conda-forge"}
|
|
|
|
|
|
def test_VersionPartAtom():
|
|
VersionPartAtom = libmambapy.specs.VersionPartAtom
|
|
|
|
a = VersionPartAtom(numeral=1, literal="alpha")
|
|
|
|
# Getters
|
|
assert a.numeral == 1
|
|
assert a.literal == "alpha"
|
|
assert str(a) == "1alpha"
|
|
|
|
# Comparison
|
|
b = VersionPartAtom(2)
|
|
assert a == a
|
|
assert a != b
|
|
assert a <= a
|
|
assert a <= b
|
|
assert a < b
|
|
assert a >= a
|
|
assert b >= a
|
|
assert b > a
|
|
|
|
# Copy
|
|
other = copy.deepcopy(a)
|
|
assert other == a
|
|
assert other is not a
|
|
|
|
|
|
def test_VersionPart():
|
|
VersionPartAtom = libmambapy.specs.VersionPartAtom
|
|
VersionPart = libmambapy.specs.VersionPart
|
|
|
|
atoms = [VersionPartAtom(1, "a"), VersionPartAtom(3)]
|
|
p = VersionPart(atoms)
|
|
assert len(p) == len(atoms)
|
|
assert p == p
|
|
|
|
|
|
def test_CommonVersion():
|
|
VersionPartAtom = libmambapy.specs.VersionPartAtom
|
|
VersionPart = libmambapy.specs.VersionPart
|
|
CommonVersion = libmambapy.specs.CommonVersion
|
|
|
|
p = VersionPart([VersionPartAtom(1, "a"), VersionPartAtom(3)])
|
|
v = CommonVersion([p, p])
|
|
assert len(v) == 2
|
|
|
|
|
|
def test_Version():
|
|
VersionPartAtom = libmambapy.specs.VersionPartAtom
|
|
VersionPart = libmambapy.specs.VersionPart
|
|
CommonVersion = libmambapy.specs.CommonVersion
|
|
Version = libmambapy.specs.Version
|
|
|
|
# Static data
|
|
assert isinstance(Version.epoch_delim, str)
|
|
assert isinstance(Version.local_delim, str)
|
|
assert isinstance(Version.part_delim, str)
|
|
assert isinstance(Version.part_delim_alt, str)
|
|
assert isinstance(Version.part_delim_special, str)
|
|
|
|
# Parse
|
|
v = Version.parse("3!1.3ab2.4+42.0alpha")
|
|
|
|
# Errors
|
|
with pytest.raises(libmambapy.specs.ParseError):
|
|
Version.parse("#!33")
|
|
|
|
# Getters
|
|
assert v.epoch == 3
|
|
assert v.version == CommonVersion(
|
|
[
|
|
VersionPart([VersionPartAtom(1)]),
|
|
VersionPart([VersionPartAtom(3, "ab"), VersionPartAtom(2)]),
|
|
VersionPart([VersionPartAtom(4)]),
|
|
]
|
|
)
|
|
assert v.local == CommonVersion(
|
|
[
|
|
VersionPart([VersionPartAtom(42)]),
|
|
VersionPart([VersionPartAtom(0, "alpha")]),
|
|
]
|
|
)
|
|
|
|
# str
|
|
assert str(v) == "3!1.3ab2.4+42.0alpha"
|
|
assert v.str(level=1) == "3!1+42"
|
|
|
|
# Copy
|
|
other = copy.deepcopy(v)
|
|
assert other == v
|
|
assert other is not v
|
|
|
|
# Comparison
|
|
v1 = Version.parse("1.0.1")
|
|
v2 = Version.parse("1.2.3alpha2")
|
|
assert v1 == v1
|
|
assert v1 != v2
|
|
assert v1 <= v1
|
|
assert v1 <= v2
|
|
assert v2 >= v1
|
|
assert v2 >= v2
|
|
assert v2 > v1
|
|
assert v1.starts_with(Version.parse("1.0"))
|
|
assert not v1.starts_with(v2)
|
|
assert v2.compatible_with(older=v1, level=1)
|
|
assert not v2.compatible_with(older=v1, level=2)
|
|
assert not v1.compatible_with(older=v2, level=1)
|
|
|
|
|
|
def test_VersionPredicate():
|
|
Version = libmambapy.specs.Version
|
|
VersionPredicate = libmambapy.specs.VersionPredicate
|
|
|
|
assert str(VersionPredicate.make_free()) == "=*"
|
|
assert str(VersionPredicate.make_equal_to(Version.parse("1"))) == "==1"
|
|
assert str(VersionPredicate.make_not_equal_to(Version.parse("1"))) == "!=1"
|
|
assert str(VersionPredicate.make_greater(Version.parse("1"))) == ">1"
|
|
assert str(VersionPredicate.make_greater_equal(Version.parse("1"))) == ">=1"
|
|
assert str(VersionPredicate.make_less(Version.parse("1"))) == "<1"
|
|
assert str(VersionPredicate.make_less_equal(Version.parse("1"))) == "<=1"
|
|
assert str(VersionPredicate.make_starts_with(Version.parse("1"))) == "=1"
|
|
assert str(VersionPredicate.make_not_starts_with(Version.parse("1"))) == "!=1.*"
|
|
assert str(VersionPredicate.make_compatible_with(Version.parse("1"), 1)) == "~=1"
|
|
|
|
pred = VersionPredicate.make_equal_to(Version.parse("1"))
|
|
|
|
# Contains
|
|
assert pred.contains(Version.parse("1"))
|
|
assert not pred.contains(Version.parse("2"))
|
|
|
|
# Equality
|
|
assert pred == pred
|
|
assert pred != VersionPredicate()
|
|
|
|
# Copy
|
|
other = copy.deepcopy(pred)
|
|
assert other == pred
|
|
assert other is not pred
|
|
|
|
|
|
def test_VersionSpec():
|
|
Version = libmambapy.specs.Version
|
|
VersionSpec = libmambapy.specs.VersionSpec
|
|
|
|
# Static data
|
|
assert isinstance(VersionSpec.and_token, str)
|
|
assert isinstance(VersionSpec.or_token, str)
|
|
assert isinstance(VersionSpec.left_parenthesis_token, str)
|
|
assert isinstance(VersionSpec.right_parenthesis_token, str)
|
|
assert isinstance(VersionSpec.preferred_free_str, str)
|
|
assert isinstance(VersionSpec.all_free_strs, list)
|
|
assert isinstance(VersionSpec.starts_with_str, str)
|
|
assert isinstance(VersionSpec.equal_str, str)
|
|
assert isinstance(VersionSpec.not_equal_str, str)
|
|
assert isinstance(VersionSpec.greater_str, str)
|
|
assert isinstance(VersionSpec.greater_equal_str, str)
|
|
assert isinstance(VersionSpec.less_str, str)
|
|
assert isinstance(VersionSpec.less_equal_str, str)
|
|
assert isinstance(VersionSpec.compatible_str, str)
|
|
assert isinstance(VersionSpec.glob_suffix_str, str)
|
|
assert isinstance(VersionSpec.glob_suffix_token, str)
|
|
|
|
# Constructor
|
|
vs = VersionSpec()
|
|
assert vs.is_explicitly_free()
|
|
assert vs.expression_size() == 0
|
|
|
|
# Parse
|
|
vs = VersionSpec.parse(">2.0,<3.0")
|
|
assert not vs.is_explicitly_free()
|
|
assert vs.expression_size() == 3 # including operator
|
|
|
|
# Errors
|
|
with pytest.raises(libmambapy.specs.ParseError):
|
|
VersionSpec.parse("=2,")
|
|
|
|
assert not vs.contains(Version.parse("1.1"))
|
|
assert vs.contains(Version.parse("2.1"))
|
|
|
|
# str
|
|
assert str(vs) == ">2.0,<3.0"
|
|
|
|
# Copy, no easy comparison, this may not work for all specs
|
|
other = copy.deepcopy(vs)
|
|
assert str(other) == str(vs)
|
|
assert other is not vs
|
|
|
|
|
|
def test_PackageInfo():
|
|
PackageInfo = libmambapy.specs.PackageInfo
|
|
NoArchType = libmambapy.specs.NoArchType
|
|
|
|
pkg = PackageInfo(name="pkg", version="1.0", build_string="bld", build_number=2)
|
|
|
|
assert pkg.name == "pkg"
|
|
assert pkg.version == "1.0"
|
|
assert pkg.build_string == "bld"
|
|
assert pkg.build_number == 2
|
|
|
|
# str
|
|
assert str(pkg) == "pkg-1.0-bld"
|
|
|
|
# from_url with md5
|
|
pkg = PackageInfo.from_url(
|
|
"https://repo.mamba.pm/conda-forge/linux-64/bar-5.1-xld.conda"
|
|
"#01234012340123401234012340123401"
|
|
)
|
|
assert pkg.name == "bar"
|
|
assert pkg.version == "5.1"
|
|
assert pkg.build_string == "xld"
|
|
assert pkg.md5 == "01234012340123401234012340123401"
|
|
assert pkg.sha256 == ""
|
|
|
|
# from_url with sha256
|
|
pkg = PackageInfo.from_url(
|
|
"https://repo.mamba.pm/conda-forge/linux-64/bar-5.1-xld.conda"
|
|
"#0123401234012340123401234012340101234012340123401234012340123401"
|
|
)
|
|
assert pkg.name == "bar"
|
|
assert pkg.version == "5.1"
|
|
assert pkg.build_string == "xld"
|
|
assert pkg.md5 == ""
|
|
assert pkg.sha256 == "0123401234012340123401234012340101234012340123401234012340123401"
|
|
|
|
# getters and setters
|
|
pkg.name = "foo"
|
|
assert pkg.name == "foo"
|
|
pkg.version = "4.0"
|
|
assert pkg.version == "4.0"
|
|
pkg.build_string = "mybld"
|
|
assert pkg.build_string == "mybld"
|
|
pkg.build_number = 5
|
|
assert pkg.build_number == 5
|
|
pkg.noarch = "Generic"
|
|
assert pkg.noarch == NoArchType.Generic
|
|
pkg.channel = "conda-forge"
|
|
assert pkg.channel == "conda-forge"
|
|
pkg.package_url = "https://repo.mamba.pm/conda-forge/linux-64/foo-4.0-mybld.conda"
|
|
assert pkg.package_url == "https://repo.mamba.pm/conda-forge/linux-64/foo-4.0-mybld.conda"
|
|
pkg.platform = "linux-64"
|
|
assert pkg.platform == "linux-64"
|
|
pkg.filename = "foo-4.0-mybld.conda"
|
|
assert pkg.filename == "foo-4.0-mybld.conda"
|
|
pkg.license = "MIT"
|
|
assert pkg.license == "MIT"
|
|
pkg.size = 3200
|
|
assert pkg.size == 3200
|
|
pkg.timestamp = 4532
|
|
assert pkg.timestamp == 4532
|
|
pkg.sha256 = "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b"
|
|
assert pkg.sha256 == "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b"
|
|
pkg.md5 = "68b329da9893e34099c7d8ad5cb9c940"
|
|
assert pkg.md5 == "68b329da9893e34099c7d8ad5cb9c940"
|
|
pkg.track_features = ["mkl"]
|
|
assert pkg.track_features == ["mkl"]
|
|
pkg.dependencies = ["python>=3.7"]
|
|
assert pkg.dependencies == ["python>=3.7"]
|
|
pkg.constrains = ["pip>=2.1"]
|
|
assert pkg.constrains == ["pip>=2.1"]
|
|
|
|
# Equality
|
|
assert PackageInfo() == PackageInfo()
|
|
assert pkg == pkg
|
|
assert pkg != PackageInfo()
|
|
|
|
# Copy
|
|
other = copy.deepcopy(pkg)
|
|
assert other == pkg
|
|
assert other is not pkg
|
|
|
|
|
|
def test_PackageInfo_V2Migrator():
|
|
"""Explicit migration help added from v1 to v2."""
|
|
import libmambapy
|
|
|
|
with pytest.raises(Exception, match=r"libmambapy\.specs"):
|
|
libmambapy.PackageInfo()
|
|
|
|
pkg = libmambapy.specs.PackageInfo()
|
|
|
|
with pytest.raises(Exception, match=r"filename"):
|
|
pkg.fn
|
|
with pytest.raises(Exception, match=r"filename"):
|
|
pkg.fn = "foo"
|
|
|
|
with pytest.raises(Exception, match=r"package_url"):
|
|
pkg.url
|
|
with pytest.raises(Exception, match=r"package_url"):
|
|
pkg.url = "https://repo.mamba.pm/conda-forge/linux-64/foo-4.0-mybld.conda"
|
|
|
|
|
|
def test_GlobSpec():
|
|
GlobSpec = libmambapy.specs.GlobSpec
|
|
spec = GlobSpec("py*")
|
|
|
|
assert GlobSpec().is_free()
|
|
assert not spec.is_free()
|
|
|
|
assert GlobSpec("python").is_exact()
|
|
assert not spec.is_exact()
|
|
|
|
assert spec.contains("python")
|
|
|
|
assert str(spec) == "py*"
|
|
|
|
# Copy
|
|
other = copy.deepcopy(spec)
|
|
assert str(other) == str(spec)
|
|
assert other is not spec
|
|
|
|
|
|
def test_RegexSpec():
|
|
RegexSpec = libmambapy.specs.RegexSpec
|
|
spec = RegexSpec.parse("^py.*$")
|
|
|
|
assert RegexSpec().is_explicitly_free()
|
|
assert not spec.is_explicitly_free()
|
|
|
|
assert RegexSpec.parse("python").is_exact()
|
|
assert not spec.is_exact()
|
|
|
|
assert spec.contains("python")
|
|
|
|
assert str(spec) == "^py.*$"
|
|
|
|
# Copy
|
|
other = copy.deepcopy(spec)
|
|
assert str(other) == str(spec)
|
|
assert other is not spec
|
|
|
|
|
|
def test_ChimeraStringSpec():
|
|
ChimeraStringSpec = libmambapy.specs.ChimeraStringSpec
|
|
spec = ChimeraStringSpec.parse("^py.*$")
|
|
|
|
assert ChimeraStringSpec().is_explicitly_free()
|
|
assert not spec.is_explicitly_free()
|
|
|
|
assert ChimeraStringSpec().is_glob()
|
|
assert not spec.is_glob()
|
|
|
|
assert ChimeraStringSpec.parse("python").is_exact()
|
|
assert not spec.is_exact()
|
|
|
|
assert spec.contains("python")
|
|
|
|
assert str(spec) == "^py.*$"
|
|
|
|
# Copy
|
|
other = copy.deepcopy(spec)
|
|
assert str(other) == str(spec)
|
|
assert other is not spec
|
|
|
|
|
|
def test_MatchSpec():
|
|
MatchSpec = libmambapy.specs.MatchSpec
|
|
|
|
# Errors
|
|
with pytest.raises(libmambapy.specs.ParseError):
|
|
MatchSpec.parse_url("httos:/")
|
|
|
|
ms = MatchSpec.parse_url("https://conda.com/pkg-2-bld.conda")
|
|
assert ms.is_file()
|
|
assert str(ms.name) == "pkg"
|
|
assert ms.filename == "pkg-2-bld.conda"
|
|
assert ms == ms
|
|
assert ms != MatchSpec.parse("foo")
|
|
|
|
# Errors
|
|
with pytest.raises(libmambapy.specs.ParseError):
|
|
MatchSpec.parse("py>#")
|
|
|
|
ms = MatchSpec.parse(
|
|
"conda-forge[plat]:ns:python=3.7=*pypy"
|
|
"[md5=m,sha256=s,license=l, license_family=lf,track_features=ft,optional]"
|
|
)
|
|
|
|
assert str(ms.channel) == "conda-forge[plat]"
|
|
assert ms.platforms == {"plat"}
|
|
assert ms.name_space == "ns"
|
|
assert str(ms.name) == "python"
|
|
assert str(ms.version) == "=3.7"
|
|
assert str(ms.build_string) == "*pypy"
|
|
assert ms.md5 == "m"
|
|
assert ms.sha256 == "s"
|
|
assert ms.license == "l"
|
|
assert ms.license_family == "lf"
|
|
assert ms.track_features == {"ft"}
|
|
assert ms.optional
|
|
assert not ms.is_file()
|
|
assert not ms.is_simple()
|
|
assert not ms.is_only_package_name()
|
|
|
|
# str
|
|
assert str(ms) == (
|
|
"conda-forge[plat]:ns:python"
|
|
"""[version="=3.7",build="*pypy",track_features="ft",md5=m,sha256=s,"""
|
|
"""license=l,license_family=lf,optional]"""
|
|
)
|
|
|
|
# Copy
|
|
other = copy.deepcopy(ms)
|
|
assert str(other) == str(ms)
|
|
assert other is not ms
|
|
|
|
|
|
def test_MatchSpec_contains():
|
|
MatchSpec = libmambapy.specs.MatchSpec
|
|
PackageInfo = libmambapy.specs.PackageInfo
|
|
|
|
ms = MatchSpec.parse("conda-forge::py*[build_number='>4']")
|
|
|
|
assert ms.contains_except_channel(name="python", build_number=5, build_string="bld")
|
|
assert not ms.contains_except_channel(name="python", build_number=2)
|
|
assert not ms.contains_except_channel(name="rust", build_number=4)
|
|
|
|
assert ms.contains_except_channel(PackageInfo(name="python", build_number=5))
|
|
assert not ms.contains_except_channel(PackageInfo(name="python"))
|
|
|
|
|
|
def test_MatchSpec_V2Migrator():
|
|
"""Explicit migration help added from v1 to v2."""
|
|
import libmambapy
|
|
|
|
with pytest.raises(Exception, match=r"libmambapy\.specs"):
|
|
libmambapy.MatchSpec()
|