Skip to content

Commit b04e916

Browse files
committed
New Atom implementation
Based off of gentooPackage.py from =app-portage/tatt-0.5 package, see https://github.com/gentoo/tatt/blob/master/tatt/gentooPackage.py Add tests
1 parent 2f625a1 commit b04e916

File tree

2 files changed

+139
-35
lines changed

2 files changed

+139
-35
lines changed

ebuildtester/atom.py

Lines changed: 80 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,94 @@
1+
2+
import re
3+
4+
15
class AtomException(Exception):
26
pass
37

48

59
class Atom(object):
10+
"""A Gentoo Atom consists of the:
11+
category
12+
package (name)
13+
version
14+
of a Gentoo package"""
615

716
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
12-
13-
# We don't store the optional '='.
14-
temp = atom.split("=")
15-
self.atom = temp[-1]
16-
17-
try:
18-
self.category, self.package = self.atom.split("/")
19-
except ValueError:
20-
raise AtomException(
21-
"ATOM has to be of the form [=]SECTION/PACKAGE[-VERSION]")
22-
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
17+
"""We expect an atom of the form [=]CATEGORY/PACKAGE[-VERSION]."""
18+
self.category = ""
19+
self.package = ""
20+
self.version = ""
3121

32-
def __str__(self):
33-
if self.version is not None:
34-
prefix = "="
35-
suffix = "-" + self.version
22+
# strip off an optional leading =
23+
atom = str(atom)
24+
if atom[0] == "=":
25+
atom = atom[1:]
26+
27+
slashparts = atom.split("/")
28+
if len(slashparts) == 1:
29+
raise AtomException("Atoms must be of the form [=]CAT/PKG[-VER]!")
30+
else:
31+
self.category = slashparts[0]
32+
self._split_version(slashparts[1])
33+
34+
def _split_version(self, pkg):
35+
"""Splits the version from an atom with version"""
36+
minusparts = pkg.split("-")
37+
if len(minusparts) == 1:
38+
# no version given
39+
self.package = pkg
3640
else:
37-
prefix = ""
38-
suffix = ""
39-
return prefix + self.category + "/" + self.package + suffix
41+
# parse the name-version part
42+
while 1:
43+
try:
44+
p = minusparts.pop(0)
45+
except IndexError:
46+
break
47+
48+
# try a number after a '-'
49+
if re.match('[0-9]+', p):
50+
# version starts here
51+
self.version = "-".join([p] + minusparts)
52+
break
53+
else:
54+
# append back to name
55+
if self.package == "":
56+
self.package = p
57+
else:
58+
self.package = "-".join([self.package, p])
59+
60+
def atomName(self):
61+
"""Returns the package name without category"""
62+
return self.package
63+
64+
def atomCategory(self):
65+
"""Returns the package category without name"""
66+
return self.category
67+
68+
def atomVersion(self):
69+
"""Returns the package version"""
70+
return self.version
71+
72+
def atomCatName(self):
73+
"""Returns the package category and name without version"""
74+
return "/".join([self.category, self.package])
75+
76+
def atomString(self):
77+
"""Returns a portage compatible string representation"""
78+
if self.version == "":
79+
return self.atomCatName()
80+
81+
return ("=" + "/".join([self.category,
82+
"-".join([self.package,
83+
self.version])]))
84+
85+
def __str__(self):
86+
return self.atomString()
4087

4188
def __eq__(self, other):
42-
result = (self.atom == other.atom)
89+
result = (self.category == other.category
90+
and self.package == other.package
91+
and self.version == other.version)
4392
return result
4493

4594
def __repr__(self):

tests/test_atom.py

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import unittest
2-
from ebuildtester.atom import Atom, AtomException
2+
from ebuildtester.atom import Atom
33

44

55
class TestAtom(unittest.TestCase):
@@ -9,9 +9,9 @@ def test_equals(self):
99
self.assertEqual(atom.__str__()[0], "=")
1010
self.assertEqual(atom.__str__(), "=CATEGORY/PACKAGE-1.0.0")
1111

12-
def test_slash_1(self):
13-
with self.assertRaises(AtomException) as e:
14-
Atom("ATOM")
12+
# def test_slash_1(self):
13+
# with self.assertRaises(AtomException) as e:
14+
# Atom("ATOM")
1515

1616
def test_slash_2(self):
1717
atom = Atom("CATEGORY/PACKAGE")
@@ -28,3 +28,58 @@ 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("PACKAGE").atomName(), "PACKAGE")
34+
self.assertEqual(Atom("CATEGORY/PACKAGE").atomName(), "PACKAGE")
35+
self.assertEqual(Atom("=CATEGORY/PACKAGE-1.0.0").atomName(), "PACKAGE")
36+
self.assertEqual(Atom("CATEGORY/PACKAGE-1.0.0").atomName(), "PACKAGE")
37+
self.assertEqual(Atom("=CATEGORY/PACKAGE-DEP-1.0b-r1").atomName(),
38+
"PACKAGE-DEP")
39+
40+
def test_atomCategory(self):
41+
self.assertEqual(Atom("CATEGORY/PACKAGE").atomCategory(), "CATEGORY")
42+
self.assertEqual(Atom("=CATEGORY/PACKAGE-1.0.0").atomCategory(),
43+
"CATEGORY")
44+
45+
def test_atomVersion(self):
46+
self.assertEqual(Atom("=CATEGORY/PACKAGE-1").atomVersion(), "1")
47+
self.assertEqual(Atom("=CATEGORY/PACKAGE-1.0").atomVersion(), "1.0")
48+
self.assertEqual(Atom("=CATEGORY/PACKAGE-1.0-r1").atomVersion(),
49+
"1.0-r1")
50+
self.assertEqual(Atom("=CATEGORY/PACKAGE-DEP-1.0b-r1").atomVersion(),
51+
"1.0b-r1")
52+
53+
def test_atomCatName(self):
54+
self.assertEqual(Atom("PACKAGE").atomCatName(), "PACKAGE")
55+
self.assertEqual(Atom("CATEGORY/PACKAGE").atomCatName(),
56+
"CATEGORY/PACKAGE")
57+
self.assertEqual(Atom("=CATEGORY/PACKAGE-1.0").atomCatName(),
58+
"CATEGORY/PACKAGE")
59+
60+
def test_atomString(self):
61+
atom1 = Atom("=CATEGORY/PACKAGE-1.0.0")
62+
atom2 = Atom(atom1.atomString())
63+
self.assertEqual(atom1, atom2)
64+
65+
def test_atom(self):
66+
atom1 = Atom("=CATEGORY/PACKAGE-DEP-1.0b-r1")
67+
self.assertEqual(atom1.atomCategory(), "CATEGORY")
68+
self.assertEqual(atom1.atomName(), "PACKAGE-DEP")
69+
self.assertEqual(atom1.atomCatName(), "CATEGORY/PACKAGE-DEP")
70+
self.assertEqual(atom1.atomVersion(), "1.0b-r1")
71+
self.assertEqual(atom1.atomString(), "=CATEGORY/PACKAGE-DEP-1.0b-r1")
72+
73+
atom2 = Atom("PACKAGE-DEP")
74+
self.assertEqual(atom2.atomCategory(), "")
75+
self.assertEqual(atom2.atomName(), "PACKAGE-DEP")
76+
self.assertEqual(atom2.atomCatName(), "PACKAGE-DEP")
77+
self.assertEqual(atom2.atomVersion(), "")
78+
self.assertEqual(atom2.atomString(), "PACKAGE-DEP")
79+
80+
atom3 = Atom("=PACKAGE-DEP-1.0b-r1")
81+
self.assertEqual(atom3.atomCategory(), "")
82+
self.assertEqual(atom3.atomName(), "PACKAGE-DEP")
83+
self.assertEqual(atom3.atomCatName(), "PACKAGE-DEP")
84+
self.assertEqual(atom3.atomVersion(), "1.0b-r1")
85+
self.assertEqual(atom3.atomString(), "=PACKAGE-DEP-1.0b-r1")

0 commit comments

Comments
 (0)