Gentoo Archives: gentoo-commits

From: Slava Bacherikov <slava@××××××××××××××.ua>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/libs/
Date: Wed, 20 Jun 2012 23:24:25
Message-Id: 1340234610.8e5aaa4fd9b8b9a5ff4ff6aebedb1b60d49d1408.bacher09@gentoo
1 commit: 8e5aaa4fd9b8b9a5ff4ff6aebedb1b60d49d1408
2 Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
3 AuthorDate: Wed Jun 20 23:23:30 2012 +0000
4 Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
5 CommitDate: Wed Jun 20 23:23:30 2012 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=8e5aaa4f
7
8 Divide porttree to mixins
9
10 ---
11 gpackages/libs/category_metadata.py | 49 ++++++
12 gpackages/libs/generic_objects.py | 92 ++++++++++
13 gpackages/libs/mixins.py | 194 +++++++++++++++++++++
14 gpackages/libs/porttree.py | 317 +++--------------------------------
15 4 files changed, 356 insertions(+), 296 deletions(-)
16
17 diff --git a/gpackages/libs/category_metadata.py b/gpackages/libs/category_metadata.py
18 new file mode 100644
19 index 0000000..a834895
20 --- /dev/null
21 +++ b/gpackages/libs/category_metadata.py
22 @@ -0,0 +1,49 @@
23 +from generic import ToStrMixin
24 +#XML
25 +from my_etree import etree
26 +
27 +__all__ = ('CategoryMetadata', )
28 +
29 +class CategoryMetadata(ToStrMixin):
30 +
31 + def __init__(self, metadata_path):
32 + self._metadata_path = metadata_path
33 + self._descrs = {}
34 + try:
35 + self._metadata_xml = etree.parse(metadata_path)
36 + except IOError:
37 + pass
38 + else:
39 + self._parse_descrs()
40 +
41 + def _parse_descrs(self):
42 + for descr_xml in self._metadata_xml.iterfind('longdescription'):
43 + lang = descr_xml.attrib.get('lang', 'en')
44 + self._descrs[lang] = descr_xml.text
45 +
46 + @property
47 + def descrs(self):
48 + return self._descrs
49 +
50 + @property
51 + def default_descr(self):
52 + return self._descrs.get('en')
53 +
54 + def __unicode__(self):
55 + return unicode(self._metadata_path)
56 +
57 +
58 +class FakeMetaData(ToStrMixin):
59 +
60 + def herds(self):
61 + return []
62 +
63 + def maintainers(self):
64 + return []
65 +
66 + def descriptions(self):
67 + return []
68 +
69 + def __unicode__(self):
70 + return 'fake'
71 +
72
73 diff --git a/gpackages/libs/generic_objects.py b/gpackages/libs/generic_objects.py
74 new file mode 100644
75 index 0000000..1e82d3a
76 --- /dev/null
77 +++ b/gpackages/libs/generic_objects.py
78 @@ -0,0 +1,92 @@
79 +from generic import StrThatIgnoreCase, ToStrMixin
80 +from functools import total_ordering
81 +from collections import defaultdict
82 +
83 +__all__ = ('Use', 'Keyword', 'KeywordsSet')
84 +
85 +class Use(ToStrMixin):
86 + "Represend Use flag as object"
87 + __slots__ = ('name',)
88 +
89 + def __init__(self, name):
90 + """Args:
91 + name -- name of use flag, may start with + or -
92 + """
93 + if name.startswith('+') or name.startswith('-'):
94 + name = name[1:]
95 + self.name = StrThatIgnoreCase(name)
96 +
97 + def __unicode__(self):
98 + return self.name
99 +
100 + def __eq__(self, other):
101 + return self.name == other.name
102 +
103 + def __ne__(self, other):
104 + return self.name != other.name
105 +
106 + def __hash__(self):
107 + return hash(self.name)
108 +
109 +@total_ordering
110 +class Keyword(ToStrMixin):
111 + "Represend ebuild Keyword as object"
112 + __slots__ = ('name', 'status')
113 + status_repr = ['','~','-']
114 +
115 + def __init__(self, name, status = 0):
116 + """Args:
117 + name -- name of keyword, it may start with ~ or -, if so than
118 + status will be auto seting.
119 + status -- status of keyword: 0 - stable,
120 + 1 - utested '~',
121 + 2 - unstable '-'
122 + Also may get by name parameter.
123 + """
124 + if name.startswith('~'):
125 + name = name[1:]
126 + status = 1
127 + elif name.startswith('-'):
128 + name = name[1:]
129 + status = 2
130 + self.name = name
131 + self.status = status
132 +
133 + def __unicode__(self):
134 + return self.status_repr[self.status] + self.name
135 +
136 + def __hash__(self):
137 + return hash((self.name, self.status))
138 +
139 + def is_same(self, other):
140 + return self.name == other.name
141 +
142 + def is_higer(self, other):
143 + return self.status < other.status
144 +
145 + def is_lower(self, other):
146 + return self.status > other.status
147 +
148 + def __eq__(self, other):
149 + return (self.arch, self.status) == (other.arch, other.status)
150 +
151 + def __lt__(self, other):
152 + return (self.status, self.arch) > (other.status, other.arch)
153 +
154 + @property
155 + def arch(self):
156 + "Return arch name"
157 + return self.name
158 +
159 +class KeywordsSet(set):
160 + def __init__(self, init_list):
161 + start = defaultdict(list)
162 + for item in init_list:
163 + start[item.arch].append(item)
164 +
165 + to_create = []
166 + for item in start.itervalues():
167 + item.sort(reverse = True)
168 + if len(item)>=1:
169 + to_create.append(item[0])
170 + super(KeywordsSet, self).__init__(to_create)
171
172 diff --git a/gpackages/libs/mixins.py b/gpackages/libs/mixins.py
173 new file mode 100644
174 index 0000000..3c35a3c
175 --- /dev/null
176 +++ b/gpackages/libs/mixins.py
177 @@ -0,0 +1,194 @@
178 +from generic import ToStrMixin, file_sha1, file_mtime, cached_property, \
179 + file_get_content, iter_over_gen
180 +
181 +from use_info import get_uses_info, get_local_uses_info
182 +# Repo info
183 +from repo_info import TreeMetadata
184 +import os.path
185 +
186 +def _file_path(file_name):
187 + return lambda self: os.path.join(self.package_path, file_name)
188 +
189 +def _file_hash(attr):
190 + return lambda self: file_sha1(getattr(self, attr))
191 +
192 +def _file_mtime(attr):
193 + return lambda self: file_mtime(getattr(self, attr))
194 +
195 +
196 +def gen_generator_over_gen(gen_name, name):
197 + return lambda self: iter_over_gen(getattr(self, gen_name)(), name)
198 +
199 +class IteratorAddMetaclass(type):
200 +
201 + def __init__(cls, name, bases, dct):
202 + super(IteratorAddMetaclass, cls).__init__(name, bases, dct)
203 + for name in cls.generator_names:
204 + setattr(cls, name, gen_generator_over_gen(cls.main_iterator, name))
205 +
206 +class AutoGeneratorMixin(object):
207 +
208 + __metaclass__ = IteratorAddMetaclass
209 + generator_names = ()
210 + #main_iterator = 'generator_name'
211 +
212 +
213 +class PortageBaseMixin(ToStrMixin):
214 + def iter_use_desc(self):
215 + for tree in self.iter_trees():
216 + yield tree.use_desc
217 +
218 + def iter_use_local_desc(self):
219 + for tree in self.iter_trees():
220 + yield tree.use_local_desc
221 +
222 + def get_all_use_desc(self):
223 + return _gen_all_use(lambda x,y: x.update(y), self.iter_use_desc())
224 +
225 + def get_all_use_local_desc(self):
226 + def action(all_dict, use_dict):
227 + for key, value in use_dict.iteritems():
228 + all_dict[key].update(value)
229 +
230 + return _gen_all_use(action, self.iter_use_local_desc())
231 +
232 + def __unicode__(self):
233 + return u'portage'
234 +
235 +class PortageIteratorMixin(AutoGeneratorMixin):
236 + main_iterator = 'iter_trees'
237 + generator_names = ('iter_categories', 'iter_packages', 'iter_ebuilds')
238 +
239 +class PortTreeBaseMixin(ToStrMixin):
240 +
241 + @cached_property
242 + def metadata(self):
243 + return TreeMetadata(self.name)
244 +
245 + @cached_property
246 + def use_desc(self):
247 + return _get_info_by_func(get_uses_info,
248 + self.porttree_path,
249 + 'profiles/use.desc')
250 +
251 + @cached_property
252 + def use_local_desc(self):
253 + return _get_info_by_func(get_local_uses_info,
254 + self.porttree_path,
255 + 'profiles/use.local.desc')
256 +
257 + def __unicode__(self):
258 + return self.name
259 +
260 +class PortTreeIteratorMixin(AutoGeneratorMixin):
261 + main_iterator = 'iter_categories'
262 + generator_names = ('iter_packages', 'iter_ebuilds')
263 +
264 +class MetaDataPath(object):
265 +
266 + @property
267 + def metadata_path(self):
268 + raise NotImplementedError
269 +
270 +class CategoryBaseMixin(ToStrMixin):
271 +
272 + @property
273 + def metadata_path(self):
274 + return os.path.join(self.category_path, 'metadata.xml')
275 +
276 + @cached_property
277 + def metadata_sha1(self):
278 + return file_sha1(self.metadata_path)
279 +
280 + @cached_property
281 + def metadata(self):
282 + return CategoryMetadata(self.metadata_path)
283 +
284 + def __unicode__(self):
285 + return self.name
286 +
287 +class CategoryIteratorMixin(AutoGeneratorMixin):
288 + main_iterator = 'iter_packages'
289 + generator_names = ('iter_ebuilds', )
290 +
291 +class PackageBaseMixin(ToStrMixin, MetaDataPath):
292 +
293 + @cached_property
294 + def metadata(self):
295 + "Return `MetaData` object that represent package metadata.xml file"
296 + try:
297 + return MetaData( self.metadata_path)
298 + except IOError:
299 + return FakeMetaData()
300 +
301 + @cached_property
302 + def descriptions(self):
303 + return self.metadata.descriptions()
304 +
305 + @property
306 + def description(self):
307 + "Return first description in package metadata.xml"
308 + if len(self.descriptions)>0:
309 + return self.descriptions[0]
310 + else:
311 + return None
312 + @property
313 + def cp(self):
314 + raise NotImplementedError
315 +
316 + def __unicode__(self):
317 + return unicode(self.cp)
318 +
319 +class PackageFilesMixin(object):
320 + #Paths
321 + manifest_path = property(_file_path('Manifest'))
322 + changelog_path = property(_file_path('ChangeLog'))
323 + metadata_path = property(_file_path('metadata.xml'))
324 +
325 + #Hashes
326 + manifest_sha1 = cached_property(_file_hash('manifest_path'),
327 + name = 'manifest_sha1')
328 + changelog_sha1 = cached_property(_file_hash('changelog_path'),
329 + name = 'changelog_sha1')
330 + metadata_sha1 = cached_property(_file_hash('metadata_path'),
331 + name = 'metadata_sha1')
332 +
333 + # Modify times
334 + manifest_mtime = property(_file_mtime("manifest_path"))
335 + changelog_mtime = property(_file_mtime("changelog_path"))
336 + metadata_mtime = property(_file_mtime("metadata_path"))
337 +
338 + mtime = property(_file_mtime("package_path"))
339 +
340 + @cached_property
341 + def changelog(self):
342 + "Return ChangeLog content"
343 + return file_get_content(self.changelog_path)
344 +
345 +class EbuildBaseMixin(ToStrMixin):
346 +
347 + sha1 = cached_property(_file_hash("ebuild_path"), name = 'sha1')
348 + mtime = cached_property(_file_mtime("ebuild_path"), name = 'mtime')
349 +
350 + @property
351 + def cpv(self):
352 + raise NotImplementedError
353 +
354 + def __unicode__(self):
355 + return unicode(self.cpv)
356 +
357 +#Main mixins
358 +class PortageMixin(PortageBaseMixin, PortageIteratorMixin):
359 + pass
360 +
361 +class PortTreeMixin(PortTreeBaseMixin, PortTreeIteratorMixin):
362 + pass
363 +
364 +class CategoryMixin(CategoryBaseMixin, CategoryIteratorMixin):
365 + pass
366 +
367 +class PackageMixin(PackageBaseMixin, PackageFilesMixin):
368 + pass
369 +
370 +class EbuildMixin(EbuildBaseMixin):
371 + pass
372
373 diff --git a/gpackages/libs/porttree.py b/gpackages/libs/porttree.py
374 index 8adb502..74a6e6e 100644
375 --- a/gpackages/libs/porttree.py
376 +++ b/gpackages/libs/porttree.py
377 @@ -1,5 +1,3 @@
378 -from functools import total_ordering
379 -from collections import defaultdict
380 import portage
381 from portage.util.listdir import listdir
382 from portage.dep import Atom
383 @@ -9,21 +7,21 @@ from portage.exception import PortageException, FileNotFound, InvalidAtom, \
384 from gentoolkit.package import Package as PackageInfo
385 from gentoolkit.metadata import MetaData
386 from gentoolkit import errors
387 -from generic import ToStrMixin, file_sha1, file_mtime, cached_property, \
388 - file_get_content, StrThatIgnoreCase, lofstr_to_ig, \
389 - iter_over_gen
390 +from generic import cached_property, lofstr_to_ig
391
392 -from use_info import get_uses_info, get_local_uses_info
393 -import os
394 +import os.path
395
396 -#XML
397 -from my_etree import etree
398 +#Generic objects
399 +from generic_objects import Use, Keyword, KeywordsSet
400 +
401 +#Mixins
402 +from mixins import PortageMixin, PortTreeMixin, CategoryMixin, PackageMixin, \
403 + EbuildMixin
404
405 # Validators
406 from validators import validate_url, validate_url, ValidationError
407
408 -# Repo info
409 -from repo_info import TreeMetadata
410 +from category_metadata import CategoryMetadata, FakeMetaData
411
412 __all__ = ('Portage','PortTree', 'Category', 'Package', 'Ebuild')
413
414 @@ -37,16 +35,6 @@ _license_filter = lambda x: False if x.startswith('|') or x.startswith('(') or \
415 x.endswith('?') or x.startswith(')') \
416 else True
417
418 -def _file_path(file_name):
419 - return lambda self: os.path.join(self.package_path, file_name)
420 -
421 -
422 -def _file_hash(attr):
423 - return lambda self: file_sha1(getattr(self, attr))
424 -
425 -def _file_mtime(attr):
426 - return lambda self: file_mtime(getattr(self, attr))
427 -
428 def _ebuild_environment(name):
429 return lambda self: self.package_object.environment(name)
430
431 @@ -58,108 +46,6 @@ def _get_info_by_func(func, path1, path2):
432 except IOError:
433 return None
434
435 -class FakeMetaData(ToStrMixin):
436 -
437 - def herds(self):
438 - return []
439 -
440 - def maintainers(self):
441 - return []
442 -
443 - def descriptions(self):
444 - return []
445 -
446 - def __unicode__(self):
447 - return 'fake'
448 -
449 -
450 -class Use(ToStrMixin):
451 - "Represend Use flag as object"
452 - __slots__ = ('name',)
453 -
454 - def __init__(self, name):
455 - """Args:
456 - name -- name of use flag, may start with + or -
457 - """
458 - if name.startswith('+') or name.startswith('-'):
459 - name = name[1:]
460 - self.name = StrThatIgnoreCase(name)
461 -
462 - def __unicode__(self):
463 - return self.name
464 -
465 - def __eq__(self, other):
466 - return self.name == other.name
467 -
468 - def __ne__(self, other):
469 - return self.name != other.name
470 -
471 - def __hash__(self):
472 - return hash(self.name)
473 -
474 -@total_ordering
475 -class Keyword(ToStrMixin):
476 - "Represend ebuild Keyword as object"
477 - __slots__ = ('name', 'status')
478 - status_repr = ['','~','-']
479 -
480 - def __init__(self, name, status = 0):
481 - """Args:
482 - name -- name of keyword, it may start with ~ or -, if so than
483 - status will be auto seting.
484 - status -- status of keyword: 0 - stable,
485 - 1 - utested '~',
486 - 2 - unstable '-'
487 - Also may get by name parameter.
488 - """
489 - if name.startswith('~'):
490 - name = name[1:]
491 - status = 1
492 - elif name.startswith('-'):
493 - name = name[1:]
494 - status = 2
495 - self.name = name
496 - self.status = status
497 -
498 - def __unicode__(self):
499 - return self.status_repr[self.status] + self.name
500 -
501 - def __hash__(self):
502 - return hash((self.name, self.status))
503 -
504 - def is_same(self, other):
505 - return self.name == other.name
506 -
507 - def is_higer(self, other):
508 - return self.status < other.status
509 -
510 - def is_lower(self, other):
511 - return self.status > other.status
512 -
513 - def __eq__(self, other):
514 - return (self.arch, self.status) == (other.arch, other.status)
515 -
516 - def __lt__(self, other):
517 - return (self.status, self.arch) > (other.status, other.arch)
518 -
519 - @property
520 - def arch(self):
521 - "Return arch name"
522 - return self.name
523 -
524 -class KeywordsSet(set):
525 - def __init__(self, init_list):
526 - start = defaultdict(list)
527 - for item in init_list:
528 - start[item.arch].append(item)
529 -
530 - to_create = []
531 - for item in start.itervalues():
532 - item.sort(reverse = True)
533 - if len(item)>=1:
534 - to_create.append(item[0])
535 - super(KeywordsSet, self).__init__(to_create)
536 -
537 def _gen_all_use(func, iterator):
538 use_g = iterator
539 use_all_dict = next(use_g)
540 @@ -168,27 +54,7 @@ def _gen_all_use(func, iterator):
541 func(use_all_dict, use_dict)
542 return use_all_dict
543
544 -
545 -def gen_generator_over_gen(gen_name, name):
546 - return lambda self: iter_over_gen(getattr(self, gen_name)(), name)
547 -
548 -class IteratorAddMetaclass(type):
549 -
550 - def __init__(cls, name, bases, dct):
551 - super(IteratorAddMetaclass, cls).__init__(name, bases, dct)
552 - for name in cls.generator_names:
553 - setattr(cls, name, gen_generator_over_gen(cls.main_iterator, name))
554 -
555 -class AutoGeneratorMixin(object):
556 -
557 - __metaclass__ = IteratorAddMetaclass
558 - generator_names = ()
559 - #main_iterator = 'generator_name'
560 -
561 -class Portage(ToStrMixin, AutoGeneratorMixin):
562 -
563 - generator_names = ('iter_categories', 'iter_packages', 'iter_ebuilds')
564 - main_iterator = 'iter_trees'
565 +class Portage(PortageMixin):
566
567 def __init__(self):
568 self.treemap = PORTDB.repositories.treemap
569 @@ -205,24 +71,6 @@ class Portage(ToStrMixin, AutoGeneratorMixin):
570 for tree_name in self.tree_order:
571 yield PortTree(tree_dict[tree_name], tree_name)
572
573 - def iter_use_desc(self):
574 - for tree in self.iter_trees():
575 - yield tree.use_desc
576 -
577 - def iter_use_local_desc(self):
578 - for tree in self.iter_trees():
579 - yield tree.use_local_desc
580 -
581 - def get_all_use_desc(self):
582 - return _gen_all_use(lambda x,y: x.update(y), self.iter_use_desc())
583 -
584 - def get_all_use_local_desc(self):
585 - def action(all_dict, use_dict):
586 - for key, value in use_dict.iteritems():
587 - all_dict[key].update(value)
588 -
589 - return _gen_all_use(action, self.iter_use_local_desc())
590 -
591 @property
592 def list_repos(self):
593 return self.tree_order
594 @@ -231,16 +79,9 @@ class Portage(ToStrMixin, AutoGeneratorMixin):
595 def dict_repos(self):
596 return self.treemap
597
598 - def __unicode__(self):
599 - return u'portage'
600 -
601 -
602 -class PortTree(ToStrMixin, AutoGeneratorMixin):
603 +class PortTree(PortTreeMixin):
604 "Represent portage tree as object"
605
606 - main_iterator = 'iter_categories'
607 - generator_names = ('iter_packages', 'iter_ebuilds')
608 -
609 def __init__(self, tree_path = '/usr/portage', name = 'main'):
610 """Args:
611 tree_path -- full path to portage tree as str
612 @@ -253,115 +94,48 @@ class PortTree(ToStrMixin, AutoGeneratorMixin):
613 for category in sorted(PORTDB.settings.categories):
614 if os.path.isdir(os.path.join(self.porttree_path, category)):
615 yield Category(self, category)
616 -
617 - def __unicode__(self):
618 - return self.name
619
620 @property
621 def porttree_path(self):
622 "Full path to portage tree"
623 return self.porttree
624
625 - @cached_property
626 - def metadata(self):
627 - return TreeMetadata(self.name)
628 -
629 - @cached_property
630 - def use_desc(self):
631 - return _get_info_by_func(get_uses_info,
632 - self.porttree_path,
633 - 'profiles/use.desc')
634 -
635 - @cached_property
636 - def use_local_desc(self):
637 - return _get_info_by_func(get_local_uses_info,
638 - self.porttree_path,
639 - 'profiles/use.local.desc')
640 -
641 -class CategoryMetadata(ToStrMixin):
642 -
643 - def __init__(self, metadata_path):
644 - self._metadata_path = metadata_path
645 - self._descrs = {}
646 - try:
647 - self._metadata_xml = etree.parse(metadata_path)
648 - except IOError:
649 - pass
650 - else:
651 - self._parse_descrs()
652 -
653 - def _parse_descrs(self):
654 - for descr_xml in self._metadata_xml.iterfind('longdescription'):
655 - lang = descr_xml.attrib.get('lang', 'en')
656 - self._descrs[lang] = descr_xml.text
657 -
658 - @property
659 - def descrs(self):
660 - return self._descrs
661 -
662 - @property
663 - def default_descr(self):
664 - return self._descrs.get('en')
665 -
666 - def __unicode__(self):
667 - return unicode(self._metadata_path)
668 -
669 -
670 -class Category(ToStrMixin, AutoGeneratorMixin):
671 +class Category(CategoryMixin):
672 "Represent category of portage tree as object"
673
674 __slots__ = ('porttree', 'category', '_cache')
675
676 - main_iterator = 'iter_packages'
677 - generator_names = ('iter_ebuilds', )
678 -
679 def __init__(self, porttree, category):
680 """Args:
681 porttree -- PortTree object
682 category -- category name as str
683 """
684 self.porttree = porttree
685 - self.category = category
686 + self.name = category
687 self._cache = {}
688
689 def iter_packages(self):
690 - packages = listdir(self.porttree.porttree + '/'+ self.category,
691 + packages = listdir(self.porttree.porttree + '/'+ self.name,
692 EmptyOnError=1, ignorecvs=1, dirsonly=1)
693 for package in packages:
694 try:
695 - atom = Atom(self.category + '/' + package)
696 + atom = Atom(self.name + '/' + package)
697 except InvalidAtom:
698 continue
699 if atom != atom.cp:
700 continue
701 yield Package(self, atom)
702
703 - def __unicode__(self):
704 - return self.category
705 -
706 @property
707 def category_path(self):
708 "Full path to category"
709 - return os.path.join(self.porttree_path, self.category)
710 -
711 - @property
712 - def metadata_path(self):
713 - return os.path.join(self.category_path, 'metadata.xml')
714 -
715 - @cached_property
716 - def metadata_sha1(self):
717 - return file_sha1(self.metadata_path)
718 -
719 - @cached_property
720 - def metadata(self):
721 - return CategoryMetadata(self.metadata_path)
722 + return os.path.join(self.porttree_path, self.name)
723
724 @property
725 def porttree_path(self):
726 return self.porttree.porttree
727
728 -
729 -class Package(ToStrMixin):
730 +class Package(PackageMixin):
731 "Represent package as object"
732
733 __slots__ = ('category', 'package', '_cache')
734 @@ -379,66 +153,20 @@ class Package(ToStrMixin):
735 if ebuild_obj.is_valid:
736 yield ebuild_obj
737
738 - def __unicode__(self):
739 - return unicode(self.cp)
740 -
741 @property
742 def package_path(self):
743 return os.path.join(self.category.porttree.porttree_path, self.package)
744
745 - @cached_property
746 - def metadata(self):
747 - "Return `MetaData` object that represent package metadata.xml file"
748 - try:
749 - return MetaData( self.metadata_path)
750 - except IOError:
751 - return FakeMetaData()
752 -
753 @property
754 def cp(self):
755 return self.package
756
757 - mtime = property(_file_mtime("package_path"))
758 -
759 @property
760 def name(self):
761 return self.package.split('/')[1]
762
763 - manifest_path = property(_file_path('Manifest'))
764 - changelog_path = property(_file_path('ChangeLog'))
765 - metadata_path = property(_file_path('metadata.xml'))
766 -
767 - #Hashes
768 - manifest_sha1 = cached_property(_file_hash('manifest_path'),
769 - name = 'manifest_sha1')
770 - changelog_sha1 = cached_property(_file_hash('changelog_path'),
771 - name = 'changelog_sha1')
772 - metadata_sha1 = cached_property(_file_hash('metadata_path'),
773 - name = 'metadata_sha1')
774 - # Modify times
775 - manifest_mtime = property(_file_mtime("manifest_path"))
776 - changelog_mtime = property(_file_mtime("changelog_path"))
777 - metadata_mtime = property(_file_mtime("metadata_path"))
778 -
779 - @cached_property
780 - def descriptions(self):
781 - return self.metadata.descriptions()
782 -
783 - @property
784 - def description(self):
785 - "Return first description in package metadata.xml"
786 - if len(self.descriptions)>0:
787 - return self.descriptions[0]
788 - else:
789 - return None
790 -
791 - @cached_property
792 - def changelog(self):
793 - "Return ChangeLog content"
794 - return file_get_content(self.changelog_path)
795 -
796
797 -class Ebuild(ToStrMixin):
798 +class Ebuild(EbuildMixin):
799 "Represent ebuild as object"
800
801 __slots__ = ('package', 'ebuild', 'package_object', '_cache')
802 @@ -572,9 +300,6 @@ class Ebuild(ToStrMixin):
803 def licenses(self):
804 return tuple(set(lofstr_to_ig(self._licenses)))
805
806 - sha1 = cached_property(_file_hash("ebuild_path"), name = 'sha1')
807 - mtime = cached_property(_file_mtime("ebuild_path"), name = 'mtime')
808 -
809 - def __unicode__(self):
810 - return self.ebuild
811 -
812 + @property
813 + def cpv(self):
814 + return self.package