From 1c5fd277161a219b04ffe7d9ef4fd52f9c6dba0c Mon Sep 17 00:00:00 2001 From: David Wiens Date: Tue, 19 Dec 2023 16:49:02 -0800 Subject: [PATCH 1/7] Install pytest and its deps --- requirements.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/requirements.txt b/requirements.txt index 9a6358f..f1dde2b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,18 @@ certifi==2023.5.7 charset-normalizer==3.1.0 +colorama==0.4.6 +exceptiongroup==1.2.0 idna==3.4 +iniconfig==2.0.0 inquirerpy==0.3.4 ordered-set==4.1.0 +packaging==23.2 pfzy==0.3.4 +pluggy==1.3.0 prompt-toolkit==3.0.38 +pytest==7.4.3 requests==2.30.0 termcolor==2.3.0 +tomli==2.0.1 urllib3==2.0.2 wcwidth==0.2.6 From ca9db8efe18a0c823f72fd4bd4dbd60aff9db351 Mon Sep 17 00:00:00 2001 From: David Wiens Date: Tue, 19 Dec 2023 16:56:18 -0800 Subject: [PATCH 2/7] Add Package.py and PackageNameVersion tests --- src/Package.py | 12 +++++ src/tests/test_PackageNameVersion.py | 73 ++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 src/Package.py create mode 100644 src/tests/test_PackageNameVersion.py diff --git a/src/Package.py b/src/Package.py new file mode 100644 index 0000000..d8f770b --- /dev/null +++ b/src/Package.py @@ -0,0 +1,12 @@ +class PackageNameVersion: + def __init__(self, input: str): + pass + + def getBaseName(self): + pass + + def getFullName(self): + pass + + def getVersion(self): + pass \ No newline at end of file diff --git a/src/tests/test_PackageNameVersion.py b/src/tests/test_PackageNameVersion.py new file mode 100644 index 0000000..a389c03 --- /dev/null +++ b/src/tests/test_PackageNameVersion.py @@ -0,0 +1,73 @@ +import pytest +import sys +sys.path.append('./src/') +from Package import PackageNameVersion + +class Test_PackageNameVersion: + def test_validInputsNoVersion(self): + + # valid inputs without version number + validInputsNoVersion = ["atn", + "atn@", + "/atn", + "\\atn", + "/atn@", + "\\atn@", + "@loupeteam/atn", + "@loupeteam\\atn", + "@loupeteam/atn@", + "@loupeteam\\atn@", + "ATN", + "@LOUPETEAM/atn", + ] + + for i in validInputsNoVersion: + p = PackageNameVersion(i) + assert p.getBaseName() == "atn" + assert p.getFullName() == "@loupeteam/atn" + assert p.getVersion() == "" + + def test_validInputsWithVersion(self): + # Valid inputs with version number + validInputsWithVersion = [ "atn@v3.1.0", + "atn@V3.1.0", + "atn@3.1.0", + "atn@03.01.0", + "@loupeteam/atn@v3.1.0", + "@loupeteam/atn@V3.1.0", + "@loupeteam/atn@3.1.0", + "@loupeteam/atn@03.01.0", + "@loupeteam\\atn@v3.1.0", + "@loupeteam\\atn@V3.1.0", + "@loupeteam\\atn@3.1.0", + ] + + for i in validInputsWithVersion: + p = PackageNameVersion(i) + assert p.getBaseName() == "atn" + assert p.getFullName() == "@loupeteam/atn" + assert p.getVersion() == "v3.1.0" + + def test_versionLeadingZeros(self): + # Leading zeros are not truncated + # (though its debatable whether we want to parse to integer) + p = PackageNameVersion("atn@v03.01.00") + assert p.getBaseName() == "atn" + assert p.getFullName() == "@loupeteam/atn" + assert p.getVersion() == "v03.01.00" + + def test_invalidInputs(self): + # Invalid inputs + invalidInputs = ["atn@v3.1", + "atn@v3.1.0.1", + "atn@w3.1.0", + "atn@v3.a.0", + "@somebogusorg/atn", + "somebogusorg/atn", + "loupeteam/atn", # maybe this should be valid + "#~atn$%~" + ] + + for i in invalidInputs: + with pytest.raises(ValueError): + p = PackageNameVersion(i) \ No newline at end of file From 34e7771d8bf3a7d274745e42e46d82b5798af0ad Mon Sep 17 00:00:00 2001 From: David Wiens Date: Wed, 20 Dec 2023 08:24:17 -0800 Subject: [PATCH 3/7] Implement PackageNameVersion passes tests --- .vscode/settings.json | 7 +++++++ src/Package.py | 30 +++++++++++++++++++++++----- src/tests/test_PackageNameVersion.py | 10 +++------- 3 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7a230e1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "python.testing.pytestArgs": [ + "src" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} \ No newline at end of file diff --git a/src/Package.py b/src/Package.py index d8f770b..cceebac 100644 --- a/src/Package.py +++ b/src/Package.py @@ -1,12 +1,32 @@ +import re + class PackageNameVersion: def __init__(self, input: str): - pass + + # Extract text after optional org prefix + reOrgPrefix = r"^(@loupeteam[\\\/])?([\w@\.]+)$" + match = re.search(reOrgPrefix, input, re.IGNORECASE) + if not match: raise ValueError + inputWithoutOrg = match.group(2) + + # Extract package name and optional version + rePackageAndVersion = r"^(\w+)@?(@v?(\d+\.\d+\.\d+))?$" + match = re.search(rePackageAndVersion, inputWithoutOrg, re.IGNORECASE) + if not match: raise ValueError + self.baseName = match.group(1).lower() + if match.group(3) is not None: + self.versionText = match.group(3) + else: + self.versionText = '' def getBaseName(self): - pass + return f"{self.baseName}" def getFullName(self): - pass - + return f"@loupeteam/{self.baseName}" + def getVersion(self): - pass \ No newline at end of file + if self.versionText != '': + return f"v{self.versionText}" + else: + return '' \ No newline at end of file diff --git a/src/tests/test_PackageNameVersion.py b/src/tests/test_PackageNameVersion.py index a389c03..b6a5107 100644 --- a/src/tests/test_PackageNameVersion.py +++ b/src/tests/test_PackageNameVersion.py @@ -9,16 +9,13 @@ def test_validInputsNoVersion(self): # valid inputs without version number validInputsNoVersion = ["atn", "atn@", - "/atn", - "\\atn", - "/atn@", - "\\atn@", "@loupeteam/atn", "@loupeteam\\atn", "@loupeteam/atn@", "@loupeteam\\atn@", - "ATN", "@LOUPETEAM/atn", + "@lOuPeTeAm/atn", + "AtN", ] for i in validInputsNoVersion: @@ -32,11 +29,9 @@ def test_validInputsWithVersion(self): validInputsWithVersion = [ "atn@v3.1.0", "atn@V3.1.0", "atn@3.1.0", - "atn@03.01.0", "@loupeteam/atn@v3.1.0", "@loupeteam/atn@V3.1.0", "@loupeteam/atn@3.1.0", - "@loupeteam/atn@03.01.0", "@loupeteam\\atn@v3.1.0", "@loupeteam\\atn@V3.1.0", "@loupeteam\\atn@3.1.0", @@ -62,6 +57,7 @@ def test_invalidInputs(self): "atn@v3.1.0.1", "atn@w3.1.0", "atn@v3.a.0", + "@loupeteamatn", "@somebogusorg/atn", "somebogusorg/atn", "loupeteam/atn", # maybe this should be valid From 3fc79c9cb4c12673f0e0be070240dcba3d64e0c5 Mon Sep 17 00:00:00 2001 From: David Wiens Date: Wed, 20 Dec 2023 09:23:02 -0800 Subject: [PATCH 4/7] Refactor PackageNameVersion init --- src/Package.py | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/Package.py b/src/Package.py index cceebac..f568ca9 100644 --- a/src/Package.py +++ b/src/Package.py @@ -2,23 +2,12 @@ class PackageNameVersion: def __init__(self, input: str): - - # Extract text after optional org prefix - reOrgPrefix = r"^(@loupeteam[\\\/])?([\w@\.]+)$" - match = re.search(reOrgPrefix, input, re.IGNORECASE) - if not match: raise ValueError - inputWithoutOrg = match.group(2) - - # Extract package name and optional version - rePackageAndVersion = r"^(\w+)@?(@v?(\d+\.\d+\.\d+))?$" - match = re.search(rePackageAndVersion, inputWithoutOrg, re.IGNORECASE) + reValidInput = r"^(@loupeteam[\\\/])?(\w+)@?(@v?(\d+\.\d+\.\d+))?$" + match = re.search(reValidInput, input, re.IGNORECASE) if not match: raise ValueError - self.baseName = match.group(1).lower() - if match.group(3) is not None: - self.versionText = match.group(3) - else: - self.versionText = '' - + self.baseName = match.group(2).lower() + self.versionText = match.group(4) if match.group(4) is not None else '' + def getBaseName(self): return f"{self.baseName}" From 41286d53a6a8b544ea7787a57d45cdc59329887c Mon Sep 17 00:00:00 2001 From: David Wiens Date: Wed, 20 Dec 2023 11:17:19 -0800 Subject: [PATCH 5/7] Change getVersion to return without 'v' --- src/Package.py | 2 +- src/tests/test_PackageNameVersion.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Package.py b/src/Package.py index f568ca9..8ba9d70 100644 --- a/src/Package.py +++ b/src/Package.py @@ -16,6 +16,6 @@ def getFullName(self): def getVersion(self): if self.versionText != '': - return f"v{self.versionText}" + return self.versionText else: return '' \ No newline at end of file diff --git a/src/tests/test_PackageNameVersion.py b/src/tests/test_PackageNameVersion.py index b6a5107..b25a416 100644 --- a/src/tests/test_PackageNameVersion.py +++ b/src/tests/test_PackageNameVersion.py @@ -41,7 +41,7 @@ def test_validInputsWithVersion(self): p = PackageNameVersion(i) assert p.getBaseName() == "atn" assert p.getFullName() == "@loupeteam/atn" - assert p.getVersion() == "v3.1.0" + assert p.getVersion() == "3.1.0" def test_versionLeadingZeros(self): # Leading zeros are not truncated @@ -49,7 +49,7 @@ def test_versionLeadingZeros(self): p = PackageNameVersion("atn@v03.01.00") assert p.getBaseName() == "atn" assert p.getFullName() == "@loupeteam/atn" - assert p.getVersion() == "v03.01.00" + assert p.getVersion() == "03.01.00" def test_invalidInputs(self): # Invalid inputs From 0fed7d9858f023caaa8f5fc9d3ba44bd759b5041 Mon Sep 17 00:00:00 2001 From: David Wiens Date: Wed, 20 Dec 2023 14:58:14 -0800 Subject: [PATCH 6/7] Use PackageNameVersion class to process package names --- src/LPM.py | 108 +++++++++++++++++++++++++---------------------------- 1 file changed, 51 insertions(+), 57 deletions(-) diff --git a/src/LPM.py b/src/LPM.py index 7fb4cd1..0610677 100644 --- a/src/LPM.py +++ b/src/LPM.py @@ -23,6 +23,8 @@ import time import requests +import Package + version_file = os.path.join(os.path.dirname(sys.argv[0]), 'version.json') with open(version_file, "r") as f: data = json.load(f) @@ -63,22 +65,21 @@ def colored(text, color): def cprint(text, color): print(text) - # Prepend the @loupeteam prefix to all package names, and split any @version suffixes off into separate struct. - packages = [] - packageVersions = [] + # Build array of PackageNameVersion objects from args + packageNameObjectList = [] if(args.packages): for item in args.packages: - # Force package name to lowercase, by convention - item = item.lower() - # If the @ character is present, it means there's a version specifier. - if('@' in item): - splitItem = item.split('@') - packages.append('@loupeteam/' + splitItem[0]) - packageVersions.append(splitItem[1]) - # Othersie, version string is empty. - else: - packages.append('@loupeteam/' + item) - packageVersions.append('') + try: + packageNameObjectList.append(Package.PackageNameVersion(item)) + except: + print(colored(f'Could not interpret \"{item}\" as a valid package', 'red')) + + # Return if no valid packages + if len(packageNameObjectList) == 0: + return + packagesFullNames = [p.getFullName() for p in packageNameObjectList] + packagesBaseNames = [p.getBaseName() for p in packageNameObjectList] + packagesVersions = [p.getVersion() for p in packageNameObjectList] # Authenticate with a custom personal access token. if(args.cmd == 'login'): @@ -140,11 +141,13 @@ def cprint(text, color): # View information about a package. elif(args.cmd == 'view') | (args.cmd == 'info'): if (len(args.packages) > 1): + packageFullName = Package.PackageNameVersion(args.packages[0]).getFullName() options = args.packages[1:] - getInfo(packages[0], options) + getInfo(packageFullName, options) elif (len(args.packages) > 0): + packageFullName = Package.PackageNameVersion(args.packages[0]).getFullName() options = [] - getInfo(packages[0], options) + getInfo(packageFullName, options) else: print(colored('Please provide the name of one package.', 'yellow')) @@ -154,16 +157,16 @@ def cprint(text, color): # Retrieve the type of a package (or directory). elif(args.cmd == 'type'): - if (len(packages) > 1): + if (len(packagesFullNames) > 1): print(colored('This command is only supported with a single package.', 'yellow')) else: print(getPackageType(args.packages[0])) # Open up documentation page for the library. elif(args.cmd == 'docs'): - if (len(packages) > 0): - print('Opening up documentation for ' + ', '.join(packages) + '...') - openDocumentation(packages) + if (len(packagesFullNames) > 0): + print('Opening up documentation for ' + ', '.join(packagesFullNames) + '...') + openDocumentation(packagesFullNames) print(colored('Documentation is now up in your browser.', 'green')) else: print(colored('Please provide the name of at least one package.', 'yellow')) @@ -267,25 +270,25 @@ def cprint(text, color): elif(args.cmd == 'install'): # Handle default scenario where sources are not requested (i.e. we're installing binary packages). if (not args.source): - if (len(packages) > 0): - print('Installing ' + ', '.join(packages) + '...') + if (len(packagesFullNames) > 0): + print('Installing ' + ', '.join(packagesFullNames) + '...') try: - installPackages(packages, packageVersions) + installPackages(packagesFullNames, packagesVersions) except: cprint('Error while attempting to install package(s).', 'yellow') return else: print('Installing all dependencies...') try: - installPackages(packages, packageVersions) + installPackages(packagesFullNames, packagesVersions) except: cprint('Error while attempting to install package(s).', 'yellow') return # Move packages from the node_modules folder into the project/main directory. - syncPackages(getAllDependencies(packages)) + syncPackages(getAllDependencies(packagesFullNames)) else: # Handle request to install source code instead. - if (len(packages) > 0): - print('Cloning ' + ', '.join(args.packages) + '...') + if (len(packageNameObjectList) > 0): + print('Cloning ' + ', '.join(packagesBaseNames) + '...') try: # First check to see if there is an AS project locally. project = ASTools.Project('.') @@ -297,19 +300,10 @@ def cprint(text, color): print('Loupe folder not found, creating it...') # Add the Loupe package back in there. loupePkg = librariesPkg.addEmptyPackage('Loupe') - for package in args.packages: - # Extract version info if included (this would show up after the '@' character, i.e. 'mylib@3.0.4') - # TODO: this check is now redundant with a version check done at the top of this file, so this should get refactored... - if package.find('@') > -1: - splitPackage = package.split('@') - packageName = splitPackage[0] - packageVersion = splitPackage[1] - installSource(packageName, packageVersion, loupePkg) - else: - packageName = package - installSource(packageName, '', loupePkg) + for (packageFullName, packageBaseName, version) in zip(packagesFullNames, packagesBaseNames, packagesVersions): + installSource(packageFullName, version, loupePkg) # Next, install any dependencies of this source library. - sourceDependencies = getSourceDependencies(os.path.join('.', 'Logical', 'Libraries', 'Loupe', packageName)) + sourceDependencies = getSourceDependencies(os.path.join('.', 'Logical', 'Libraries', 'Loupe', packageBaseName)) if (len(sourceDependencies) > 0): # TODO: add support for getting the correct version of these dependencies. installPackages(sourceDependencies, [''] * len(sourceDependencies)) @@ -322,18 +316,18 @@ def cprint(text, color): # First check project-level settings to see if deployment is configured. deploymentConfigs = getPackageManifestField('package.json', ['lpmConfig', 'deploymentConfigs']) if (deploymentConfigs is not None): - print('Deploying ' + ', '.join(packages) + ' to the following configurations: ' + ', '.join(deploymentConfigs)) + print('Deploying ' + ', '.join(packagesFullNames) + ' to the following configurations: ' + ', '.join(deploymentConfigs)) for config in deploymentConfigs: if(not args.source): - deployPackages(config, getAllDependencies(packages)) + deployPackages(config, getAllDependencies(packagesFullNames)) else: # TODO: this split below may not be necessary, TBD. # For case of source, deploy the source first. - deployPackages(config, packages) + deployPackages(config, packagesFullNames) # Then deploy all of its dependencies. deployPackages(config, sourceDependencies) cprint('Operation completed successfully.', 'green') - for package in packages: + for package in packagesFullNames: packageManifestPath = os.path.join('node_modules', package, 'package.json') if(os.path.exists(packageManifestPath)): packageType = getPackageManifestField(packageManifestPath, ['lpm', 'type']) @@ -345,14 +339,14 @@ def cprint(text, color): # Uninstall one or more packages. elif(args.cmd == 'uninstall'): - if (len(packages) > 0): - print('Uninstalling ' + ', '.join(packages) + '...') + if (len(packagesFullNames) > 0): + print('Uninstalling ' + ', '.join(packagesFullNames) + '...') try: - uninstallPackages(packages) + uninstallPackages(packagesFullNames) except: cprint('Error while attempting to uninstall package(s).', 'yellow') return - syncPackages(getAllDependencies(packages)) + syncPackages(getAllDependencies(packagesFullNames)) cprint('Operation completed successfully.', 'green') else: print(colored('Please provide the name of at least one package.', 'yellow')) @@ -364,13 +358,13 @@ def cprint(text, color): if(gitClient == ''): cprint("No Git client configured (please run lpm configure)", "yellow") else: - print(f'Opening {gitClient} for these packages: ' + ', '.join(args.packages)) - for package in packages: + print(f'Opening {gitClient} for these packages: ' + ', '.join(packagesFullNames)) + for package in packagesBaseNames: cmd = [] if(gitClient == 'GitExtensions'): cmd.append('gitex.cmd') cmd.append('openrepo') - cmd.append('\"' + os.path.join(os.getcwd(), 'Logical', 'Libraries', 'Loupe', os.path.split(package)[1]) + '\"') + cmd.append('\"' + os.path.join(os.getcwd(), 'Logical', 'Libraries', 'Loupe', package) + '\"') executeAndContinue(cmd) else: cprint(f"We don't support {gitClient}, are you kidding?", "yellow") @@ -417,7 +411,7 @@ def cprint(text, color): # In all other cases, just pass the command and list of packages straight through to NPM. else: - runGenericNpmCmd(args.cmd, packages) + runGenericNpmCmd(args.cmd, args.packages) cprint('Operation completed', 'green') return @@ -477,7 +471,8 @@ def importLibraries(): packages_to_import = [] package_versions_to_import = [] for library in loupePkg.objects: - packages_to_import.append('@loupeteam/' + library.text) + packageFullName = Package.PackageNameVersion(library.text).getFullName() # Adds organization prefix + packages_to_import.append(packageFullName) package_versions_to_import.append(library.version) # Install them. try: @@ -615,12 +610,12 @@ def getPackageType(path): return packageType # Perform the NPM install. -def installPackages(packages, packageVersions): +def installPackages(packages, packagesVersions): command = [] command.append('npm install') # force packages names to lowercase packages = [package.lower() for package in packages] - for (item, version) in zip(packages, packageVersions): + for (item, version) in zip(packages, packagesVersions): if(version != ''): command.append(f'{item}@{version}') else: @@ -720,9 +715,8 @@ def getAllDependencies(packages): # If there is no package.json for this package, assume it's a source library, and that it's already sync'd # to the Logical View under Libraries / Loupe. else: - # Strip it of its @loupeteam prefix. - splitPackage = os.path.split(package)[1] - dependencyData = getSourceDependencies(os.path.join('.', 'Logical', 'Libraries', 'Loupe', splitPackage)) + packageBaseName = Package.PackageNameVersion(package).getBaseName() + dependencyData = getSourceDependencies(os.path.join('.', 'Logical', 'Libraries', 'Loupe', packageBaseName)) print('Source dependencies: ') print(dependencyData) localDependencies = [] From 530f45ca439b2e177e1535219874fb29088699ba Mon Sep 17 00:00:00 2001 From: David Wiens Date: Wed, 20 Dec 2023 15:05:14 -0800 Subject: [PATCH 7/7] Change methods to properties --- src/LPM.py | 14 +++++++------- src/Package.py | 21 ++++++++++++--------- src/tests/test_PackageNameVersion.py | 18 +++++++++--------- 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/LPM.py b/src/LPM.py index 0610677..e70990c 100644 --- a/src/LPM.py +++ b/src/LPM.py @@ -77,9 +77,9 @@ def cprint(text, color): # Return if no valid packages if len(packageNameObjectList) == 0: return - packagesFullNames = [p.getFullName() for p in packageNameObjectList] - packagesBaseNames = [p.getBaseName() for p in packageNameObjectList] - packagesVersions = [p.getVersion() for p in packageNameObjectList] + packagesFullNames = [p.fullName for p in packageNameObjectList] + packagesBaseNames = [p.baseName for p in packageNameObjectList] + packagesVersions = [p.version for p in packageNameObjectList] # Authenticate with a custom personal access token. if(args.cmd == 'login'): @@ -141,11 +141,11 @@ def cprint(text, color): # View information about a package. elif(args.cmd == 'view') | (args.cmd == 'info'): if (len(args.packages) > 1): - packageFullName = Package.PackageNameVersion(args.packages[0]).getFullName() + packageFullName = Package.PackageNameVersion(args.packages[0]).fullName options = args.packages[1:] getInfo(packageFullName, options) elif (len(args.packages) > 0): - packageFullName = Package.PackageNameVersion(args.packages[0]).getFullName() + packageFullName = Package.PackageNameVersion(args.packages[0]).fullName options = [] getInfo(packageFullName, options) else: @@ -471,7 +471,7 @@ def importLibraries(): packages_to_import = [] package_versions_to_import = [] for library in loupePkg.objects: - packageFullName = Package.PackageNameVersion(library.text).getFullName() # Adds organization prefix + packageFullName = Package.PackageNameVersion(library.text).fullName # Adds organization prefix packages_to_import.append(packageFullName) package_versions_to_import.append(library.version) # Install them. @@ -715,7 +715,7 @@ def getAllDependencies(packages): # If there is no package.json for this package, assume it's a source library, and that it's already sync'd # to the Logical View under Libraries / Loupe. else: - packageBaseName = Package.PackageNameVersion(package).getBaseName() + packageBaseName = Package.PackageNameVersion(package).baseName dependencyData = getSourceDependencies(os.path.join('.', 'Logical', 'Libraries', 'Loupe', packageBaseName)) print('Source dependencies: ') print(dependencyData) diff --git a/src/Package.py b/src/Package.py index 8ba9d70..a594508 100644 --- a/src/Package.py +++ b/src/Package.py @@ -5,17 +5,20 @@ def __init__(self, input: str): reValidInput = r"^(@loupeteam[\\\/])?(\w+)@?(@v?(\d+\.\d+\.\d+))?$" match = re.search(reValidInput, input, re.IGNORECASE) if not match: raise ValueError - self.baseName = match.group(2).lower() - self.versionText = match.group(4) if match.group(4) is not None else '' + self._baseName = match.group(2).lower() + self._versionText = match.group(4) if match.group(4) is not None else '' - def getBaseName(self): - return f"{self.baseName}" + @property + def baseName(self): + return f"{self._baseName}" - def getFullName(self): - return f"@loupeteam/{self.baseName}" + @property + def fullName(self): + return f"@loupeteam/{self._baseName}" - def getVersion(self): - if self.versionText != '': - return self.versionText + @property + def version(self): + if self._versionText != '': + return self._versionText else: return '' \ No newline at end of file diff --git a/src/tests/test_PackageNameVersion.py b/src/tests/test_PackageNameVersion.py index b25a416..a9fc5b2 100644 --- a/src/tests/test_PackageNameVersion.py +++ b/src/tests/test_PackageNameVersion.py @@ -20,9 +20,9 @@ def test_validInputsNoVersion(self): for i in validInputsNoVersion: p = PackageNameVersion(i) - assert p.getBaseName() == "atn" - assert p.getFullName() == "@loupeteam/atn" - assert p.getVersion() == "" + assert p.baseName == "atn" + assert p.fullName == "@loupeteam/atn" + assert p.version == "" def test_validInputsWithVersion(self): # Valid inputs with version number @@ -39,17 +39,17 @@ def test_validInputsWithVersion(self): for i in validInputsWithVersion: p = PackageNameVersion(i) - assert p.getBaseName() == "atn" - assert p.getFullName() == "@loupeteam/atn" - assert p.getVersion() == "3.1.0" + assert p.baseName == "atn" + assert p.fullName == "@loupeteam/atn" + assert p.version == "3.1.0" def test_versionLeadingZeros(self): # Leading zeros are not truncated # (though its debatable whether we want to parse to integer) p = PackageNameVersion("atn@v03.01.00") - assert p.getBaseName() == "atn" - assert p.getFullName() == "@loupeteam/atn" - assert p.getVersion() == "03.01.00" + assert p.baseName == "atn" + assert p.fullName == "@loupeteam/atn" + assert p.version == "03.01.00" def test_invalidInputs(self): # Invalid inputs