Skip to content

Commit ef5af7f

Browse files
waebbllinxon
authored andcommitted
New Atom implementation
Closes: nicolasbock#99 Closes: nicolasbock#96
1 parent 9fcd99e commit ef5af7f

File tree

4 files changed

+118
-27
lines changed

4 files changed

+118
-27
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ python:
66
- "3.6"
77

88
install:
9-
- pip install -r requirements.txt
9+
- pip install -r requirements.txt -r requirements-dev.txt
1010

1111
script:
1212
- bandit ebuildtester

ebuildtester/atom.py

Lines changed: 69 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,88 @@
1+
import re
2+
3+
from portage.dbapi.dep_expand import dep_expand
4+
from portage.versions import cpv_getversion
5+
import portage.exception as pe
6+
7+
18
class AtomException(Exception):
29
pass
310

411

512
class Atom(object):
613

714
def __init__(self, atom):
8-
# We expect an atom of the form [=]CATEGORY/PACKAGE[-VERSION].
9-
self.category = None
10-
self.package = None
11-
self.version = None
15+
try:
16+
# We expect an atom of the form [=]CATEGORY/PACKAGE[-VERSION].
17+
self.atom = dep_expand(str(atom))
18+
except pe.InvalidAtom:
19+
raise AtomException(
20+
"ATOM has to be of the form [=]SECTION/PACKAGE[-VERSION]")
1221

13-
# We don't store the optional '='.
14-
temp = atom.split("=")
15-
self.atom = temp[-1]
22+
self.category = self.atomCategory()
23+
self.package = self.atomName()
24+
self.version = self.atomVersion()
25+
self.repo = self.atomRepo()
1626

17-
try:
18-
self.category, self.package = self.atom.split("/")
19-
except ValueError:
27+
def _splitPackage(self):
28+
return self.atom.split("/", 1)
29+
30+
def atomCategory(self):
31+
"""Returns the package category without name"""
32+
category = re.sub('^(=|<=|>=|<|>)', '', self._splitPackage()[0])
33+
if category == 'null':
2034
raise AtomException(
2135
"ATOM has to be of the form [=]SECTION/PACKAGE[-VERSION]")
2236

23-
# Split off version.
24-
try:
25-
temp = self.package.index("-")
26-
if temp > -1:
27-
self.version = self.package[temp + 1:]
28-
self.package = self.package[:temp]
29-
except ValueError:
30-
pass
37+
return category
3138

32-
def __str__(self):
39+
def atomName(self):
40+
"""Returns the package name without category"""
41+
pkg = self._splitPackage()[1]
42+
suffix = ['-' + str(self.atomVersion()),
43+
'::' + str(self.atomRepo())]
44+
for s in suffix:
45+
pkg = pkg.replace(s, '')
46+
47+
return pkg
48+
49+
def atomVersion(self):
50+
"""Returns the package version"""
51+
52+
return cpv_getversion(self.atom)
53+
54+
def atomRepo(self):
55+
"""Returns the package repository"""
56+
pkg = self._splitPackage()[1].split("::", 1)
57+
if len(pkg) == 2:
58+
return pkg[1]
59+
60+
def atomCatName(self):
61+
"""Returns the package category and name without version"""
62+
return "/".join([self.category, self.package])
63+
64+
def atomComplete(self):
65+
"""Returns a portage compatible string representation"""
66+
suff = []
67+
pref = ''
3368
if self.version is not None:
34-
prefix = "="
35-
suffix = "-" + self.version
36-
else:
37-
prefix = ""
38-
suffix = ""
39-
return prefix + self.category + "/" + self.package + suffix
69+
suff += ['-' + self.version]
70+
pref = '='
71+
72+
if self.repo is not None:
73+
suff += ['::' + self.repo]
74+
75+
return (pref + self.category + '/' + self.package +
76+
''.join([str(s) for s in suff]))
77+
78+
def __str__(self):
79+
return self.atomComplete()
4080

4181
def __eq__(self, other):
42-
result = (self.atom == other.atom)
82+
result = (self.category == other.category
83+
and self.package == other.package
84+
and self.version == other.version)
85+
4386
return result
4487

4588
def __repr__(self):

requirements-dev.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
git+https://github.com/gentoo/[email protected]#egg=portage

tests/test_atom.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,50 @@ def test_str(self):
2828
atom_1 = Atom("=CATEGORY/PACKAGE-1.0.0-r1")
2929
atom_2 = Atom(str(atom_1))
3030
self.assertEqual(atom_1, atom_2)
31+
32+
def test_atomName(self):
33+
self.assertEqual(Atom("CATEGORY/PACKAGE").atomName(), "PACKAGE")
34+
self.assertEqual(Atom("=CATEGORY/PACKAGE-1.0.0").atomName(), "PACKAGE")
35+
self.assertEqual(Atom("CATEGORY/PACKAGE-1.0.0").atomName(), "PACKAGE")
36+
self.assertEqual(Atom("=CATEGORY/PACKAGE-DEP-1.0b-r1").atomName(),
37+
"PACKAGE-DEP")
38+
39+
def test_atomCategory(self):
40+
self.assertEqual(Atom("CATEGORY/PACKAGE").atomCategory(), "CATEGORY")
41+
self.assertEqual(Atom("=CATEGORY/PACKAGE-1.0.0").atomCategory(),
42+
"CATEGORY")
43+
44+
def test_atomVersion(self):
45+
self.assertEqual(Atom("=CATEGORY/PACKAGE-1").atomVersion(), "1")
46+
self.assertEqual(Atom("=CATEGORY/PACKAGE-1.0").atomVersion(), "1.0")
47+
self.assertEqual(Atom("=CATEGORY/PACKAGE-1.0-r1").atomVersion(),
48+
"1.0-r1")
49+
self.assertEqual(Atom("=CATEGORY/PACKAGE-DEP-1.0b-r1").atomVersion(),
50+
"1.0b-r1")
51+
52+
def test_atomRepo(self):
53+
self.assertEqual(Atom(
54+
"=CATEGORY/PACKAGE-1::REP-0").atomRepo(), "REP-0")
55+
self.assertEqual(Atom(
56+
"<=CATEGORY/PACKAGE-1.0.0::REPO-NAME").atomRepo(), "REPO-NAME")
57+
self.assertEqual(Atom(
58+
"CATEGORY/PACKAGE::REPO_NAME").atomRepo(), "REPO_NAME")
59+
60+
def test_atomCatName(self):
61+
self.assertEqual(Atom("CATEGORY/PACKAGE").atomCatName(),
62+
"CATEGORY/PACKAGE")
63+
self.assertEqual(Atom("=CATEGORY/PACKAGE-1.0").atomCatName(),
64+
"CATEGORY/PACKAGE")
65+
66+
def test_atomComplete(self):
67+
atom1 = Atom("=CATEGORY/PACKAGE-1.0.0::REPO")
68+
atom2 = Atom(atom1.atomComplete())
69+
self.assertEqual(atom1, atom2)
70+
71+
def test_atom(self):
72+
atom1 = Atom("=CATEGORY/PACKAGE-DEP-1.0b-r1")
73+
self.assertEqual(atom1.atomCategory(), "CATEGORY")
74+
self.assertEqual(atom1.atomName(), "PACKAGE-DEP")
75+
self.assertEqual(atom1.atomCatName(), "CATEGORY/PACKAGE-DEP")
76+
self.assertEqual(atom1.atomVersion(), "1.0b-r1")
77+
self.assertEqual(atom1.atomComplete(), "=CATEGORY/PACKAGE-DEP-1.0b-r1")

0 commit comments

Comments
 (0)