Gentoo Archives: gentoo-commits

From: Jauhien Piatlicki <piatlicki@×××××.com>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/g-sorcery:master commit in: g_elpa/, tests/
Date: Tue, 02 Jul 2013 11:29:46
Message-Id: 1372764658.127764e5bca1197fa6e4fabcf0b63990ee964126.jauhien@gentoo
1 commit: 127764e5bca1197fa6e4fabcf0b63990ee964126
2 Author: Jauhien Piatlicki (jauhien) <piatlicki <AT> gmail <DOT> com>
3 AuthorDate: Tue Jul 2 11:30:58 2013 +0000
4 Commit: Jauhien Piatlicki <piatlicki <AT> gmail <DOT> com>
5 CommitDate: Tue Jul 2 11:30:58 2013 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/g-sorcery.git;a=commit;h=127764e5
7
8 g_elpa/elpa_db: generate_tree
9
10 ---
11 g_elpa/elpa_db.py | 46 ++++++++++++++++++++----
12 tests/test_elpa_db.py | 99 +++++++++++++++++++++++++++++++++++++++++++++++++--
13 2 files changed, 135 insertions(+), 10 deletions(-)
14
15 diff --git a/g_elpa/elpa_db.py b/g_elpa/elpa_db.py
16 index e25ac60..f4d838d 100644
17 --- a/g_elpa/elpa_db.py
18 +++ b/g_elpa/elpa_db.py
19 @@ -13,8 +13,11 @@
20
21 import os, tempfile, urllib.parse
22
23 -from g_sorcery.package_db import PackageDB
24 +import sexpdata
25 +
26 +from g_sorcery.package_db import Package, PackageDB
27 from g_sorcery.fileutils import wget
28 +from g_sorcery.exceptions import SyncError
29
30 class ElpaDB(PackageDB):
31 def __init__(self, directory, repo_uri="", db_uri=""):
32 @@ -24,12 +27,41 @@ class ElpaDB(PackageDB):
33 tempdir = tempfile.TemporaryDirectory()
34
35 ac_uri = urllib.parse.urljoin(self.repo_uri, 'archive-contents')
36 - wget(ac_uri, tempdir.name)
37 + if wget(ac_uri, tempdir.name):
38 + raise SyncError('sync failed: ' + self.repo_uri)
39 +
40 + try:
41 + with open(os.path.join(tempdir.name, 'archive-contents')) as f:
42 + archive_contents = sexpdata.load(f)
43 + except Exception as e:
44 + raise SyncError('sync failed: ' + self.repo_uri + ': ' + str(e))
45
46 - os.system('ls -l ' + tempdir.name)
47 - os.system('less ' + tempdir.name + '/archive-contents')
48 -
49 del tempdir
50 +
51 + if sexpdata.car(archive_contents) != 1:
52 + raise SyncError('sync failed: ' + self.repo_uri + ' bad archive contents format')
53
54 - def get_parser(self):
55 - pass
56 + for entry in sexpdata.cdr(archive_contents):
57 + desc = entry[2].value()
58 + pkg = self._s_get_package(entry[0], desc[0])
59 + source_type = desc[3].value()
60 + description = desc[2]
61 + deps = desc[1]
62 + dependencies = []
63 + for dep in deps:
64 + dep_pkg = self._s_get_package(dep[0], dep[1])
65 + dependencies.append(dep_pkg)
66 +
67 + properties = {'source_type' : source_type,
68 + 'description' : description,
69 + 'depend' : dependencies,
70 + 'rdepend' : dependencies,
71 + }
72 + self.add_category('app-emacs')
73 + self.add_package(pkg, properties)
74 +
75 +
76 + def _s_get_package(self, name, version):
77 + category = 'app-emacs'
78 + version = '.'.join(map(str, version))
79 + return Package(category, name.value(), version)
80
81 diff --git a/tests/test_elpa_db.py b/tests/test_elpa_db.py
82 index dfbe34a..97ce4e2 100644
83 --- a/tests/test_elpa_db.py
84 +++ b/tests/test_elpa_db.py
85 @@ -11,10 +11,14 @@
86 :license: GPL-2, see LICENSE for more details.
87 """
88
89 -import http.server, tempfile, threading, unittest
90 +import http.server, os, tempfile, threading, unittest
91
92 from g_elpa import elpa_db
93
94 +from g_sorcery import exceptions, package_db
95 +
96 +from tests.server import Server
97 +
98 class TestElpaDB(unittest.TestCase):
99 def setUp(self):
100 self.tempdir = tempfile.TemporaryDirectory()
101 @@ -23,8 +27,97 @@ class TestElpaDB(unittest.TestCase):
102 del self.tempdir
103
104 def test_generate(self):
105 - edb = elpa_db.ElpaDB(self.tempdir.name, repo_uri = 'http://elpa.gnu.org/packages/')
106 - edb.generate_tree()
107 + prev = os.getcwd()
108 + os.chdir(self.tempdir.name)
109 + edb = elpa_db.ElpaDB(os.path.join(self.tempdir.name, 'db'),
110 + repo_uri = 'http://127.0.0.1:8080')
111 + self.assertRaises(exceptions.SyncError, edb.generate)
112 +
113 + packages = [['ack', [1, 2],
114 + "Interface to ack-like source code search tools",
115 + "tar",
116 + []
117 + ],
118 + ['dict-tree', [0, 12, 8],
119 + "Dictionary data structure",
120 + "tar",
121 + [['trie', [0, 2, 5]],
122 + ['tNFA', [0, 1, 1]],
123 + ['heap', [0, 3]]]
124 + ],
125 + ['tNFA', [0, 1, 1],
126 + "Tagged non-deterministic finite-state automata",
127 + "single",
128 + [['queue', [0, 1]]]
129 + ],
130 + ['trie', [0, 2, 6],
131 + "Trie data structure",
132 + "single",
133 + [['tNFA', [0, 1, 1]],
134 + ['queue', [0, 1]]]
135 + ],
136 + ['heap', [0, 3],
137 + "Heap (a.k.a. priority queue) data structure",
138 + "single",
139 + []
140 + ],
141 + ['queue', [0, 1],
142 + "Queue data structure",
143 + "single",
144 + []
145 + ]
146 + ]
147 +
148 + archive_contents = "(1"
149 + for pkg in packages:
150 + archive_contents += "\n(" + pkg[0] + ' . [('
151 + for v in pkg[1]:
152 + archive_contents += ' ' + str(v)
153 + archive_contents += ')\n'
154 + if pkg[4]:
155 + archive_contents += '('
156 + for p in pkg[4]:
157 + archive_contents += '(' + p[0] + ' ('
158 + for v in p[1]:
159 + archive_contents += ' ' + str(v)
160 + archive_contents += '))\n'
161 + archive_contents += ')'
162 + else:
163 + archive_contents += 'nil'
164 + archive_contents += '\n "' + pkg[2] + '" ' + pkg[3] + '])'
165 + archive_contents += ')'
166 +
167 + with open(os.path.join(self.tempdir.name, 'archive-contents'), 'w') as f:
168 + f.write(archive_contents)
169 +
170 + server = Server()
171 + server.start()
172 +
173 + edb.generate()
174 +
175 + for pkg in packages:
176 + package = package_db.Package('app-emacs',
177 + pkg[0],
178 + '.'.join(map(str, pkg[1])))
179 + description = edb.get_package_description(package)
180 + self.assertEqual(description['source_type'], pkg[3])
181 + self.assertEqual(description['description'], pkg[2])
182 + deps = []
183 + for d in pkg[4]:
184 + deps.append(package_db.Package('app-emacs',
185 + d[0],
186 + '.'.join(map(str, d[1]))))
187 +
188 + for ds in (description['depend'], description['rdepend']):
189 + for d in ds:
190 + self.assertTrue(d in deps)
191 + for d in deps:
192 + self.assertTrue(d in ds)
193 +
194 + server.shutdown()
195 + server.join()
196 +
197 + os.chdir(prev)
198
199 def suite():
200 suite = unittest.TestSuite()