1 |
commit: 7924dd97ea401ef71192ec181e669ea24c90ebaa |
2 |
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org> |
3 |
AuthorDate: Tue Jul 3 15:40:59 2012 +0000 |
4 |
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua> |
5 |
CommitDate: Tue Jul 3 15:41:27 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=7924dd97 |
7 |
|
8 |
Now independent from gentoolkit |
9 |
|
10 |
--- |
11 |
Requirements | 1 - |
12 |
gpackages/apps/packages/models.py | 4 +- |
13 |
gpackages/apps/packages/utils.py | 84 ------------------ |
14 |
gpackages/apps/packages/validators.py | 8 -- |
15 |
gpackages/apps/packages/views.py | 6 +- |
16 |
gpackages/libs/package_info/mixins.py | 9 +- |
17 |
.../libs/package_info/package_backends/portage.py | 9 ++- |
18 |
.../utils.py => libs/package_info/parse_cp.py} | 92 +++++++++++++++----- |
19 |
gpackages/libs/package_info/validators.py | 4 + |
20 |
9 files changed, 90 insertions(+), 127 deletions(-) |
21 |
|
22 |
diff --git a/Requirements b/Requirements |
23 |
index 2e02a7e..2a5cdb1 100644 |
24 |
--- a/Requirements |
25 |
+++ b/Requirements |
26 |
@@ -1,6 +1,5 @@ |
27 |
django>=1.4 |
28 |
portage |
29 |
-gentoolkit |
30 |
|
31 |
Optional: |
32 |
lxml |
33 |
|
34 |
diff --git a/gpackages/apps/packages/models.py b/gpackages/apps/packages/models.py |
35 |
index 064add4..a5ad484 100644 |
36 |
--- a/gpackages/apps/packages/models.py |
37 |
+++ b/gpackages/apps/packages/models.py |
38 |
@@ -6,8 +6,8 @@ from package_info.generic import get_from_kwargs_and_del |
39 |
from package_info.repo_info import REPOS_TYPE |
40 |
# relative |
41 |
from .keywords import KeywordRepr |
42 |
-from utils import get_link |
43 |
-from .validators import validate_url, validate_email |
44 |
+#from utils import get_link |
45 |
+from package_info.validators import validate_url, validate_email |
46 |
|
47 |
|
48 |
class AbstractDateTimeModel(models.Model): |
49 |
|
50 |
diff --git a/gpackages/apps/packages/utils.py b/gpackages/apps/packages/utils.py |
51 |
index fc2bd8d..25150c2 100644 |
52 |
--- a/gpackages/apps/packages/utils.py |
53 |
+++ b/gpackages/apps/packages/utils.py |
54 |
@@ -1,5 +1,3 @@ |
55 |
-import re |
56 |
-from .validators import REVISION_RE, VERSION_RE, NAME_RE |
57 |
from package_info.generic import ToStrMixin |
58 |
|
59 |
def gen_args(args): |
60 |
@@ -12,85 +10,3 @@ def get_link(host, script, args): |
61 |
'script': script, |
62 |
'args': get_args(args)} |
63 |
|
64 |
-BASE_PACKAGE_RE_P = r'(?P<category>[^/]+)/(?P<name>%(name)s)' % \ |
65 |
- {'name' : NAME_RE} |
66 |
- |
67 |
-REPOSITORY_RE_P = r'(?:::(?P<repository>\w+))?' |
68 |
- |
69 |
-PACKAGE_RE_P = r'%(base)s%(repository)s' % {'base' : BASE_PACKAGE_RE_P, |
70 |
- 'repository' : REPOSITORY_RE_P} |
71 |
- |
72 |
-PACKAGE_RE = r'^%s$' % PACKAGE_RE_P |
73 |
- |
74 |
-VERSIONS_RE_P = r'-(?P<version>%(version)s)(?:-(?P<revision>%(revision)s))?' % \ |
75 |
- { 'version' : VERSION_RE, |
76 |
- 'revision': REVISION_RE |
77 |
- } |
78 |
-EBUILD_CPVR_RE_P = r'%(base)s%(versions)s%(repository)s' % { |
79 |
- 'base': BASE_PACKAGE_RE_P, |
80 |
- 'versions': VERSIONS_RE_P, |
81 |
- 'repository': REPOSITORY_RE_P |
82 |
- } |
83 |
- |
84 |
-EBUILD_CPVR_RE = r'^%s$' % EBUILD_CPVR_RE_P |
85 |
- |
86 |
-ebuild_cpvr_re = re.compile(EBUILD_CPVR_RE) |
87 |
-package_re = re.compile(PACKAGE_RE) |
88 |
- |
89 |
-def _gen_func(name): |
90 |
- return lambda self: self.gr_dict.get(name) |
91 |
- |
92 |
-class ParseMetaClass(type): |
93 |
- |
94 |
- def __init__(cls, name, bases, dct): |
95 |
- super(ParseMetaClass, cls).__init__(name, bases, dct) |
96 |
- for v in cls.simple_attrs: |
97 |
- setattr(cls, v, property(_gen_func(v))) |
98 |
- |
99 |
-class PackageParse(ToStrMixin): |
100 |
- |
101 |
- __metaclass__ = ParseMetaClass |
102 |
- re = package_re |
103 |
- simple_attrs = ('category', 'name', 'repository') |
104 |
- |
105 |
- def __init__(self, parse = None, dct = None): |
106 |
- assert parse or dct, 'Shoud set or parse or dct' |
107 |
- self.parse_str = parse |
108 |
- |
109 |
- if parse is not None: |
110 |
- m = self.re.match(parse) |
111 |
- self.gr_dict = {} |
112 |
- if m is not None: |
113 |
- self.gr_dict = m.groupdict() |
114 |
- elif dct is not None: |
115 |
- self.gr_dict = dct |
116 |
- |
117 |
- def __unicode__(self): |
118 |
- return unicode(self.parse_str) |
119 |
- |
120 |
- @property |
121 |
- def re_str(self): |
122 |
- return PACKAGE_RE_P |
123 |
- |
124 |
- @property |
125 |
- def repository_for_q(self): |
126 |
- if self.repository: |
127 |
- return self.repository |
128 |
- else: |
129 |
- return 'gentoo' |
130 |
- |
131 |
-class EbuildParse(PackageParse): |
132 |
- |
133 |
- re = ebuild_cpvr_re |
134 |
- simple_attrs = ('category', 'name', 'repository', 'version', 'revision') |
135 |
- |
136 |
- @property |
137 |
- def re_str(self): |
138 |
- return EBUILD_CPVR_RE_P |
139 |
- |
140 |
- @property |
141 |
- def revision_for_q(self): |
142 |
- if self.revision: |
143 |
- return self.revision |
144 |
- else: |
145 |
- return '' |
146 |
|
147 |
diff --git a/gpackages/apps/packages/validators.py b/gpackages/apps/packages/validators.py |
148 |
deleted file mode 100644 |
149 |
index efe0c00..0000000 |
150 |
--- a/gpackages/apps/packages/validators.py |
151 |
+++ /dev/null |
152 |
@@ -1,8 +0,0 @@ |
153 |
-from django.core.validators import URLValidator, validate_email |
154 |
-from django.core.exceptions import ValidationError |
155 |
- |
156 |
-validate_url = URLValidator() |
157 |
- |
158 |
-REVISION_RE = r'r\d+' |
159 |
-VERSION_RE = r'[\w.]+' |
160 |
-NAME_RE = r'[\w+-]+' |
161 |
|
162 |
diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py |
163 |
index 3d239ae..a0ce56a 100644 |
164 |
--- a/gpackages/apps/packages/views.py |
165 |
+++ b/gpackages/apps/packages/views.py |
166 |
@@ -6,7 +6,7 @@ from models import CategoryModel, HerdsModel, MaintainerModel, \ |
167 |
PackageModel, UseFlagModel |
168 |
|
169 |
from django.shortcuts import get_object_or_404 |
170 |
-from .utils import EbuildParse, PackageParse |
171 |
+from package_info.parse_cp import EbuildParseCPVR, PackageParseCPR |
172 |
|
173 |
arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86'] |
174 |
|
175 |
@@ -71,7 +71,7 @@ class EbuildDetailView(ContextView, DetailView): |
176 |
queryset = self.get_queryset() |
177 |
|
178 |
cpvr = self.kwargs.get('cpvr') |
179 |
- eo = EbuildParse(cpvr) |
180 |
+ eo = EbuildParseCPVR(cpvr) |
181 |
category, name = eo.category, eo.name |
182 |
version, revision = eo.version, eo.revision_for_q |
183 |
repository = eo.repository_for_q |
184 |
@@ -134,7 +134,7 @@ class PackageDetailView(ContextView, DetailView): |
185 |
queryset = self.get_queryset() |
186 |
|
187 |
cpr = self.kwargs.get('cpr') |
188 |
- po = PackageParse(cpr) |
189 |
+ po = PackageParseCPR(cpr) |
190 |
category, name = po.category, po.name |
191 |
repository = po.repository_for_q |
192 |
obj = get_object_or_404(queryset, name = name, |
193 |
|
194 |
diff --git a/gpackages/libs/package_info/mixins.py b/gpackages/libs/package_info/mixins.py |
195 |
index 36afb10..923fcc8 100644 |
196 |
--- a/gpackages/libs/package_info/mixins.py |
197 |
+++ b/gpackages/libs/package_info/mixins.py |
198 |
@@ -227,10 +227,11 @@ class EbuildRevMixin(object): |
199 |
@cached_property |
200 |
def revision_as_int(self): |
201 |
d = 0 # Maybe None ? |
202 |
- m = rev_re.match(self.revision) |
203 |
- if m is not None: |
204 |
- d = m.groupdict().get('rev') |
205 |
- d = toint(d, 0) |
206 |
+ if self.revision: |
207 |
+ m = rev_re.match(self.revision) |
208 |
+ if m is not None: |
209 |
+ d = m.groupdict().get('rev') |
210 |
+ d = toint(d, 0) |
211 |
return d |
212 |
|
213 |
class EbuildHomepageMixin(object): |
214 |
|
215 |
diff --git a/gpackages/libs/package_info/package_backends/portage.py b/gpackages/libs/package_info/package_backends/portage.py |
216 |
index 4721d19..52956dd 100644 |
217 |
--- a/gpackages/libs/package_info/package_backends/portage.py |
218 |
+++ b/gpackages/libs/package_info/package_backends/portage.py |
219 |
@@ -5,8 +5,8 @@ from portage.dep import Atom |
220 |
from portage.exception import PortageException, FileNotFound, InvalidAtom, \ |
221 |
InvalidDependString, InvalidPackageName |
222 |
|
223 |
-from gentoolkit.cpv import CPV |
224 |
from ..generic import cached_property |
225 |
+from ..parse_cp import EbuildParse |
226 |
import os.path |
227 |
#Mixins |
228 |
from ..mixins import PortageMixin, PortTreeMixin, CategoryMixin, PackageMixin, \ |
229 |
@@ -152,11 +152,14 @@ class Ebuild(EbuildMixin): |
230 |
def __init__(self, package, ebuild): |
231 |
self.package = package |
232 |
self.ebuild = ebuild |
233 |
- self.cpv_object = CPV(ebuild) |
234 |
+ self.cpv_object = EbuildParse(ebuild) |
235 |
self._cache = {} |
236 |
self._env = None |
237 |
# Maybe this should be lazy ? |
238 |
- self._set_env() |
239 |
+ if not self.cpv_object.is_valid: |
240 |
+ self._is_valid = False |
241 |
+ else: |
242 |
+ self._set_env() |
243 |
|
244 |
def _set_env(self): |
245 |
try: |
246 |
|
247 |
diff --git a/gpackages/apps/packages/utils.py b/gpackages/libs/package_info/parse_cp.py |
248 |
similarity index 52% |
249 |
copy from gpackages/apps/packages/utils.py |
250 |
copy to gpackages/libs/package_info/parse_cp.py |
251 |
index fc2bd8d..5680b05 100644 |
252 |
--- a/gpackages/apps/packages/utils.py |
253 |
+++ b/gpackages/libs/package_info/parse_cp.py |
254 |
@@ -1,41 +1,41 @@ |
255 |
import re |
256 |
from .validators import REVISION_RE, VERSION_RE, NAME_RE |
257 |
-from package_info.generic import ToStrMixin |
258 |
+from .generic import ToStrMixin |
259 |
+from .mixins import EbuildRevMixin |
260 |
|
261 |
-def gen_args(args): |
262 |
- t = '%s=%s' |
263 |
- l = (t % arg for arg in args) |
264 |
- return '&'.join(l) |
265 |
- |
266 |
-def get_link(host, script, args): |
267 |
- return 'http://%(host)s/%(script)s?%(args)' % {'host': host, |
268 |
- 'script': script, |
269 |
- 'args': get_args(args)} |
270 |
- |
271 |
-BASE_PACKAGE_RE_P = r'(?P<category>[^/]+)/(?P<name>%(name)s)' % \ |
272 |
+PACKAGE_RE_P = r'(?P<category>[^/]+)/(?P<name>%(name)s)' % \ |
273 |
{'name' : NAME_RE} |
274 |
|
275 |
REPOSITORY_RE_P = r'(?:::(?P<repository>\w+))?' |
276 |
|
277 |
-PACKAGE_RE_P = r'%(base)s%(repository)s' % {'base' : BASE_PACKAGE_RE_P, |
278 |
+PACKAGE_CPR_RE_P = r'%(base)s%(repository)s' % {'base' : PACKAGE_RE_P, |
279 |
'repository' : REPOSITORY_RE_P} |
280 |
|
281 |
PACKAGE_RE = r'^%s$' % PACKAGE_RE_P |
282 |
+PACKAGE_CPV_RE = r'^%s$' % PACKAGE_CPR_RE_P |
283 |
|
284 |
VERSIONS_RE_P = r'-(?P<version>%(version)s)(?:-(?P<revision>%(revision)s))?' % \ |
285 |
{ 'version' : VERSION_RE, |
286 |
'revision': REVISION_RE |
287 |
} |
288 |
-EBUILD_CPVR_RE_P = r'%(base)s%(versions)s%(repository)s' % { |
289 |
- 'base': BASE_PACKAGE_RE_P, |
290 |
+ |
291 |
+EBUILD_CPV_RE_P = r'%(base)s%(versions)s' % { |
292 |
+ 'base': PACKAGE_RE_P, |
293 |
'versions': VERSIONS_RE_P, |
294 |
+ } |
295 |
+ |
296 |
+EBUILD_CPVR_RE_P = r'%(cpv)s%(repository)s' % { |
297 |
+ 'cpv': EBUILD_CPV_RE_P, |
298 |
'repository': REPOSITORY_RE_P |
299 |
} |
300 |
|
301 |
+EBUILD_CPV_RE = r'^%s$' % EBUILD_CPV_RE_P |
302 |
EBUILD_CPVR_RE = r'^%s$' % EBUILD_CPVR_RE_P |
303 |
|
304 |
-ebuild_cpvr_re = re.compile(EBUILD_CPVR_RE) |
305 |
package_re = re.compile(PACKAGE_RE) |
306 |
+package_cpr_re = re.compile(PACKAGE_CPV_RE) |
307 |
+ebuild_cpvr_re = re.compile(EBUILD_CPVR_RE) |
308 |
+ebuild_cpv_re = re.compile(EBUILD_CPV_RE) |
309 |
|
310 |
def _gen_func(name): |
311 |
return lambda self: self.gr_dict.get(name) |
312 |
@@ -51,17 +51,19 @@ class PackageParse(ToStrMixin): |
313 |
|
314 |
__metaclass__ = ParseMetaClass |
315 |
re = package_re |
316 |
- simple_attrs = ('category', 'name', 'repository') |
317 |
+ simple_attrs = ('category', 'name') |
318 |
|
319 |
def __init__(self, parse = None, dct = None): |
320 |
- assert parse or dct, 'Shoud set or parse or dct' |
321 |
+ assert parse or dct, 'Should set parse or dct' |
322 |
self.parse_str = parse |
323 |
+ self.is_valid = False |
324 |
|
325 |
if parse is not None: |
326 |
m = self.re.match(parse) |
327 |
self.gr_dict = {} |
328 |
if m is not None: |
329 |
self.gr_dict = m.groupdict() |
330 |
+ self.is_valid = True |
331 |
elif dct is not None: |
332 |
self.gr_dict = dct |
333 |
|
334 |
@@ -73,24 +75,70 @@ class PackageParse(ToStrMixin): |
335 |
return PACKAGE_RE_P |
336 |
|
337 |
@property |
338 |
+ def cp(self): |
339 |
+ return '%s/%s' % (self.category, self.name) |
340 |
+ |
341 |
+class PackageParseCPR(PackageParse): |
342 |
+ simple_attrs = ('category', 'name', 'repository') |
343 |
+ re = package_cpr_re |
344 |
+ |
345 |
+ @property |
346 |
+ def re_str(self): |
347 |
+ return PACKAGE_CPR_RE_P |
348 |
+ |
349 |
+ @property |
350 |
def repository_for_q(self): |
351 |
if self.repository: |
352 |
return self.repository |
353 |
else: |
354 |
return 'gentoo' |
355 |
|
356 |
-class EbuildParse(PackageParse): |
357 |
+ @property |
358 |
+ def cpr(self): |
359 |
+ return '%s::%s' % (self.cp, self.repository_for_q) |
360 |
+ |
361 |
+class EbuildParse(EbuildRevMixin, PackageParse): |
362 |
+ #NOTICE: It three time faster than CPV from gentoolkit.cpv |
363 |
|
364 |
- re = ebuild_cpvr_re |
365 |
- simple_attrs = ('category', 'name', 'repository', 'version', 'revision') |
366 |
+ re = ebuild_cpv_re |
367 |
+ simple_attrs = ('category', 'name', 'version', 'revision') |
368 |
|
369 |
@property |
370 |
def re_str(self): |
371 |
- return EBUILD_CPVR_RE_P |
372 |
+ return EBUILD_CPV_RE_P |
373 |
|
374 |
@property |
375 |
def revision_for_q(self): |
376 |
if self.revision: |
377 |
+ return self.revision_as_int |
378 |
+ else: |
379 |
+ return 0 |
380 |
+ |
381 |
+ @property |
382 |
+ def revision_as_str(self): |
383 |
+ if self.revision: |
384 |
return self.revision |
385 |
else: |
386 |
return '' |
387 |
+ |
388 |
+ @property |
389 |
+ def cpv(self): |
390 |
+ return '%s-%s' % (self.cp, self.fullversion) |
391 |
+ |
392 |
+ @property |
393 |
+ def fullversion(self): |
394 |
+ rev_p = '-' + self.revision if self.revision else '' |
395 |
+ return '%s%s' % (self.version, rev_p) |
396 |
+ |
397 |
+class EbuildParseCPVR(EbuildParse, PackageParseCPR): |
398 |
+ |
399 |
+ re = ebuild_cpvr_re |
400 |
+ simple_attrs = ('category', 'name', 'repository', 'version', 'revision') |
401 |
+ |
402 |
+ @property |
403 |
+ def re_str(self): |
404 |
+ return EBUILD_CPVR_RE_P |
405 |
+ |
406 |
+ @property |
407 |
+ def cpvr(self): |
408 |
+ return '%s::%s' % (self.cpv, self.repository_for_q) |
409 |
|
410 |
diff --git a/gpackages/libs/package_info/validators.py b/gpackages/libs/package_info/validators.py |
411 |
index d86e7b8..0b1fbc6 100644 |
412 |
--- a/gpackages/libs/package_info/validators.py |
413 |
+++ b/gpackages/libs/package_info/validators.py |
414 |
@@ -5,3 +5,7 @@ from django.core.exceptions import ValidationError |
415 |
validate_url = URLValidator() |
416 |
|
417 |
__all__ = ('validate_email', 'validate_url', 'ValidationError') |
418 |
+ |
419 |
+REVISION_RE = r'r\d+' |
420 |
+VERSION_RE = r'[\w.]+' |
421 |
+NAME_RE = r'[\w+-]+' |