public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/libs/package_info/, gpackages/libs/package_info/generic_metadata/
@ 2012-06-24 23:21 Slava Bacherikov
  0 siblings, 0 replies; 5+ messages in thread
From: Slava Bacherikov @ 2012-06-24 23:21 UTC (permalink / raw
  To: gentoo-commits

commit:     8af7afacb90d8b7e787e986110ed7947dee53115
Author:     Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Sat Jun 23 18:34:16 2012 +0000
Commit:     Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Sat Jun 23 18:34:16 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=8af7afac

Changes in package_metadata, not it not requre gentoolkit

---
 .../libs/package_info/generic_metadata/herds.py    |    4 +-
 .../generic_metadata/package_metadata.py           |   70 ++++++++++++++++----
 gpackages/libs/package_info/mixins.py              |   12 ++--
 3 files changed, 65 insertions(+), 21 deletions(-)

diff --git a/gpackages/libs/package_info/generic_metadata/herds.py b/gpackages/libs/package_info/generic_metadata/herds.py
index dd698dd..25e738a 100644
--- a/gpackages/libs/package_info/generic_metadata/herds.py
+++ b/gpackages/libs/package_info/generic_metadata/herds.py
@@ -35,7 +35,7 @@ class Maintainer(AbstractXmlObject, ToStrMixin):
         - email -- maintainer email
         - role -- maintainer role
     """
-    attrs = ('name', 'email', 'role')
+    attrs = ('name', 'email', 'role', 'description')
 
     def __init__(self, *args, **kwargs):
         super(Maintainer, self).__init__(*args, **kwargs)
@@ -116,7 +116,7 @@ class Herds(ToStrMixin):
             defaultdict(list) with maintainer object as key, and list of herds
             as value.
         Example:
-            {'<Maintainers example@gentoo.org>': ['mozilla','base'], ...}
+            {'<Maintainer example@gentoo.org>': ['mozilla','base'], ...}
         """
         if self._maintainers_dict is not None:
             return self._maintainers_dict

diff --git a/gpackages/libs/package_info/generic_metadata/package_metadata.py b/gpackages/libs/package_info/generic_metadata/package_metadata.py
index e89d387..704a590 100644
--- a/gpackages/libs/package_info/generic_metadata/package_metadata.py
+++ b/gpackages/libs/package_info/generic_metadata/package_metadata.py
@@ -1,23 +1,65 @@
 from __future__ import absolute_import
-from gentoolkit.metadata import MetaData
 from ..generic import ToStrMixin
+#XML
+from .my_etree import etree
+# Maintainers
+from .herds import Maintainer
 
-class FakeMetaData(ToStrMixin):
+class PackageMetaData(ToStrMixin):
 
-    def herds(self):
-        return []
+    def __init__(self, metadata_path):
+        self._metadata_path = metadata_path
+        self.descr = {'en': None}
+        self._herds = ()
+        self._maintainers = ()
+        try:
+            self._metadata_xml = etree.parse(metadata_path)
+        except IOError:
+            pass
+        else:
+            self._parse_all()
 
-    def maintainers(self):
-        return []
+    def _parse_all(self):
+        self._parse_herds()
+        self._parse_description()
+        self._parse_maintainers()
+
+    def _parse_herds(self):
+        herd_set = set()
+        for herd in self._metadata_xml.iterfind('herd'):
+            herd_set.add(herd.text)
+        self._herds = tuple(herd_set)
+
+    def _parse_description(self):
+        for descr in self._metadata_xml.iterfind('longdescription'):
+            lang = descr.attrib.get('lang', 'en')
+            self.descr[lang] = descr.text
+
+    def iter_mainteiner(self):
+        for maintainer_tree in self._metadata_xml.iterfind('maintainer'):
+            yield Maintainer(maintainer_tree)
+
+    def _parse_maintainers(self):
+        maintainers = set()
+        for maintainer in self.iter_mainteiner():
+            maintainers.add(maintainer)
+        self._maintainers = tuple(maintainers)
+
+    @property
+    def description(self):
+        return self.descr['en']
 
     def descriptions(self):
-        return []
+        return self.descr.values()
+
+    def descriptions_dict(self):
+        return self.descr
+
+    def herds(self):
+        return self._herds
+
+    def maintainers(self):
+        return self._maintainers
     
     def __unicode__(self):
-        return 'fake'
-
-def PackageMetaData(path):
-    try:
-        return MetaData(path)
-    except IOError:
-        return FakeMetaData()
+        return self._metadata_path

diff --git a/gpackages/libs/package_info/mixins.py b/gpackages/libs/package_info/mixins.py
index eedd1d7..92188ed 100644
--- a/gpackages/libs/package_info/mixins.py
+++ b/gpackages/libs/package_info/mixins.py
@@ -149,13 +149,15 @@ class PackageBaseMixin(ToStrMixin):
     def descriptions(self):
         return self.metadata.descriptions()
 
-    @property
+    @cached_property
     def description(self):
         "Return first description in package metadata.xml"
-        if len(self.descriptions)>0:
-            return self.descriptions[0]
-        else:
-            return None
+        return self.metadata.description
+
+    @cached_property
+    def descriptions_dict(self):
+        return self.metadata.descriptions_dict()
+
     @property
     def cp(self):
         raise NotImplementedError



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/libs/package_info/, gpackages/libs/package_info/generic_metadata/
@ 2012-06-26 18:48 Slava Bacherikov
  0 siblings, 0 replies; 5+ messages in thread
From: Slava Bacherikov @ 2012-06-26 18:48 UTC (permalink / raw
  To: gentoo-commits

commit:     12352ec6c35112360dbf3567f823a852ac576f61
Author:     Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Tue Jun 26 12:12:04 2012 +0000
Commit:     Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Tue Jun 26 12:12:04 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=12352ec6

Check layman repo by location.

---
 .../package_info/generic_metadata/repo_info.py     |   32 +++++++++++++++----
 gpackages/libs/package_info/mixins.py              |    2 +-
 2 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/gpackages/libs/package_info/generic_metadata/repo_info.py b/gpackages/libs/package_info/generic_metadata/repo_info.py
index d9ba513..9bcb22d 100644
--- a/gpackages/libs/package_info/generic_metadata/repo_info.py
+++ b/gpackages/libs/package_info/generic_metadata/repo_info.py
@@ -1,5 +1,6 @@
 from __future__ import absolute_import
 from functools import total_ordering
+import os.path
 # Layman API
 from layman.api import LaymanAPI
 layman_api = LaymanAPI()
@@ -33,7 +34,7 @@ class Enum(object):
         self.num_dict = dct2
 
     def get_as_tuple(self):
-        "Return tuple to use as choices in django model"
+       "Return tuple to use as choices in django model"
        return tuple([(num, item) for num, item in enumerate(self.list)])
             
 REPO_TYPE = (  'git', 
@@ -96,12 +97,16 @@ class TreeMetadata(ToStrMixin):
     statuses = {'official': 0, 'unofficial': 1}
     qualities = {'stable': 0 , 'testing': 1, 'experimental': 2}
 
-    def __init__(self, repo_name, dct = None):
+    storage_path = os.path.join(layman_api.config['storage'], '')
+    installed = frozenset(layman_api.get_installed())
+    available = frozenset(layman_api.get_available())
+
+    def __init__(self, repo_name, repo_location = None, dct = None):
         """Args:
             repo_name -- repository name
             dct -- dict of params, could be None that it will be calculated 
         """
-        repo_name = self._find_real_repo_name(repo_name)
+        repo_name = self._find_real_repo_name(repo_name, repo_location)
         self.repo_name = repo_name
 
         if dct is None:
@@ -109,17 +114,30 @@ class TreeMetadata(ToStrMixin):
 
         self._dct = dct
 
-    def _find_real_repo_name(self, repo_name):
+    def _find_name_by_path(self, repo_name, repo_location):
+        try_name = repo_location.replace(self.storage_path, '')
+        if try_name in self.installed:
+            return try_name
+        else:
+            return None
+        
+    def _find_real_repo_name(self, repo_name, repo_location = None):
         gen_str = 'gentoo-'
 
+        try_name = None
+        if repo_location is not None:
+            try_name = self._find_name_by_path(repo_name, repo_location)
+
         if repo_name == 'gentoo':
             return repo_name
-        elif layman_api.is_repo(repo_name):
+        elif try_name is not None:
+            return try_name
+        elif repo_name in self.available:
             return repo_name
-        elif layman_api.is_repo(gen_str + repo_name):
+        elif (gen_str + repo_name) in self.available:
             return gen_str + repo_name
         elif repo_name.startswith(gen_str) and \
-            layman_api.is_repo(repo_name[len(gen_str):]):
+            (repo_name[len(gen_str):]) in self.available:
 
             return repo_name[len(gen_str):]
 

diff --git a/gpackages/libs/package_info/mixins.py b/gpackages/libs/package_info/mixins.py
index 610e89e..77972ba 100644
--- a/gpackages/libs/package_info/mixins.py
+++ b/gpackages/libs/package_info/mixins.py
@@ -103,7 +103,7 @@ class PortTreeBaseMixin(ToStrMixin):
 
     @cached_property
     def metadata(self):
-        return TreeMetadata(self.name)
+        return TreeMetadata(self.name, repo_location = self.porttree_path)
 
     @cached_property
     def use_desc(self):



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/libs/package_info/, gpackages/libs/package_info/generic_metadata/
@ 2012-07-03 21:08 Slava Bacherikov
  0 siblings, 0 replies; 5+ messages in thread
From: Slava Bacherikov @ 2012-07-03 21:08 UTC (permalink / raw
  To: gentoo-commits

commit:     1141ccb27e72421a606f2e7c5324ce32f7cff426
Author:     Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Tue Jul  3 20:23:07 2012 +0000
Commit:     Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Tue Jul  3 21:07:08 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=1141ccb2

Add layer for work with portage news

---
 .../libs/package_info/generic_metadata/news.py     |  133 ++++++++++++++++++++
 gpackages/libs/package_info/mixins.py              |   14 ++-
 2 files changed, 146 insertions(+), 1 deletions(-)

diff --git a/gpackages/libs/package_info/generic_metadata/news.py b/gpackages/libs/package_info/generic_metadata/news.py
new file mode 100644
index 0000000..d84ac6b
--- /dev/null
+++ b/gpackages/libs/package_info/generic_metadata/news.py
@@ -0,0 +1,133 @@
+import os
+import os.path
+import re
+import hashlib
+from datetime import datetime
+from email import message_from_string
+from email.utils import getaddresses
+from ..generic import ToStrMixin, toint, file_get_content
+
+NEWS_STR_RE = r'^(?P<date>\d{4,4}-\d{2}-\d{2})-(?P<title>.*)$'
+news_re = re.compile(NEWS_STR_RE)
+
+class News(ToStrMixin):
+    
+    def __init__(self, repo_path = '/usr/portage'):
+        self.news_path = os.path.join(repo_path, 'metadata', 'news')
+        if not os.path.isdir(self.news_path):
+            raise ValueError
+        # For repr
+        self.repo_path = repo_path 
+
+    def iter_news(self):
+        for name in os.listdir(self.news_path):
+            try:
+                i = NewsItem(self.news_path, name)
+            except ValueError:
+                pass
+            else:
+                yield i
+
+    def __iter__(self):
+        return self.iter_news()
+
+    def __unicode__(self):
+        return unicode(self.repo_path)
+
+class NewsItem(ToStrMixin):
+
+    N_ITEM_P = r'^%(name)s\.(?P<lang>[a-z]{2})\.txt$'
+
+    def __init__(self, news_path, news_dir):
+        ndir = os.path.join(news_path, news_dir)
+        if not os.path.isdir(ndir):
+            raise ValueError
+        m = news_re.match(news_dir)
+        if m is None:
+            raise ValueError
+        p_dct =  m.groupdict()
+        try:
+            date = datetime.strptime(p_dct['date'], '%Y-%m-%d')
+        except ValueError:
+            raise
+        else:
+            self.date = date.date()
+
+        self.title = p_dct['title']
+        self.name = news_dir
+        self.news_dir = ndir
+        self._news_dict = {}
+        self._fetch_news()
+
+    def _iter_news_items(self):
+        pattern_str = self.N_ITEM_P % {'name': self.name}
+        pattern = re.compile(pattern_str)
+        for item in os.listdir(self.news_dir):
+            m = pattern.match(item)
+            full_path = os.path.join(self.news_dir, item)
+            if m is not None and os.path.isfile(full_path):
+                lang = m.groupdict()['lang']
+                yield (full_path, lang)
+            
+    def _fetch_news(self):
+        for item, lang in self._iter_news_items():
+            self._news_dict[lang] = NewsItemLang(item,
+                                                 self.date,
+                                                 lang,
+                                                 self.title)
+
+    @property
+    def default_news(self):
+        return self._news_dict['en']
+
+    @property
+    def news(self):
+        return self._news_dict
+
+    def __unicode__(self):
+        return unicode(self.name)
+
+class NewsItemLang(object):
+    
+    def __init__(self, item, date, lang = 'en', name = ''):
+        f = file_get_content(item)
+        self.sha1 = hashlib.sha1(f).hexdigest()
+        self._mes_obj = message_from_string(f)
+        self.date = date
+        self.lang = lang
+        self.name = name
+
+    @property
+    def title(self):
+        return self._mes_obj.get('Title')
+
+    @property
+    def revision(self):
+        return toint(self._mes_obj.get('Revision', 1),1)
+
+    @property
+    def format_ver(self):
+        g = self._mes_obj.get('News-Item-Format', '1.0')
+        try:
+            maj, min = g.split('.')
+        except ValueError:
+            maj, min = 1, 0
+
+        return toint(maj,1), toint(min, 0)
+
+    @property
+    def authors(self):
+        "Returns list of tuples"
+        authors = self._mes_obj.get_all('Author')
+        return getaddresses(authors)
+
+    @property
+    def translators(self):
+        "Returns list of tuples"
+        translators = self._mes_obj.get_all('Translator')
+        return getaddresses(translators)
+
+    @property
+    def message(self):
+        return self._mes_obj.get_payload()
+

diff --git a/gpackages/libs/package_info/mixins.py b/gpackages/libs/package_info/mixins.py
index 923fcc8..0ef9b4d 100644
--- a/gpackages/libs/package_info/mixins.py
+++ b/gpackages/libs/package_info/mixins.py
@@ -13,6 +13,8 @@ from .generic_metadata.category_metadata import CategoryMetadata
 from .generic_metadata.package_metadata import PackageMetaData
 #License group metadata
 from .generic_metadata.license_groups import LicenseGroups
+# News
+from .generic_metadata.news import News
 # Validators
 from .validators import validate_url, validate_email, ValidationError
 #Generic objects
@@ -126,6 +128,15 @@ class PortTreeBaseMixin(ToStrMixin):
     def __unicode__(self):
         return self.name
 
+class PortTreeNewsMixin(object):
+    
+    @cached_property
+    def news(self):
+        try:
+            return News(self.porttree_path)
+        except:
+            return None
+
 class PortTreeIteratorMixin(AutoGeneratorMixin):
     main_iterator = 'iter_categories'
     generator_names = ('iter_packages', 'iter_ebuilds')
@@ -335,7 +346,8 @@ class PackageGenericMixin(PackageBaseMixin, PackageFilesMixin):
 class PortageMixin(PortageGenericMixin, PortageIteratorMixin, AbstractPortage):
     pass
 
-class PortTreeMixin(PortTreeBaseMixin, PortTreeIteratorMixin, AbstractPortTree):
+class PortTreeMixin(PortTreeBaseMixin, PortTreeIteratorMixin, \
+                    PortTreeNewsMixin, AbstractPortTree):
     pass
 
 class CategoryMixin(CategoryBaseMixin, CategoryIteratorMixin, AbstractCategory):



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/libs/package_info/, gpackages/libs/package_info/generic_metadata/
@ 2012-07-05 23:27 Slava Bacherikov
  0 siblings, 0 replies; 5+ messages in thread
From: Slava Bacherikov @ 2012-07-05 23:27 UTC (permalink / raw
  To: gentoo-commits

commit:     920ccab8e4332e74a12bebb75a75445ceb60c1c1
Author:     Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Thu Jul  5 12:55:42 2012 +0000
Commit:     Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Thu Jul  5 12:55:42 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=920ccab8

Update comparison functions

---
 .../libs/package_info/generic_metadata/herds.py    |    4 +++-
 .../package_info/generic_metadata/repo_info.py     |    4 ++++
 gpackages/libs/package_info/generic_objects.py     |    8 +++++++-
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/gpackages/libs/package_info/generic_metadata/herds.py b/gpackages/libs/package_info/generic_metadata/herds.py
index ee1475f..1fe30cb 100644
--- a/gpackages/libs/package_info/generic_metadata/herds.py
+++ b/gpackages/libs/package_info/generic_metadata/herds.py
@@ -57,10 +57,12 @@ class Herd(AbstractXmlObject, ToStrMixin):
         self._xml_object = xml_object
 
     def __eq__(self, other):
+        if not isinstance(other, Herd):
+            return False
         return self.name == other.name
 
     def __ne__(self, other):
-        return self.name != other.name
+        return not self.__eq__(other)
 
     def __hash__(self):
         return hash(self.name)

diff --git a/gpackages/libs/package_info/generic_metadata/repo_info.py b/gpackages/libs/package_info/generic_metadata/repo_info.py
index 9bcb22d..1af8e14 100644
--- a/gpackages/libs/package_info/generic_metadata/repo_info.py
+++ b/gpackages/libs/package_info/generic_metadata/repo_info.py
@@ -66,9 +66,13 @@ class SourcesObject(ToStrMixin):
         return hash(self.source_url)
 
     def __eq__(self, other):
+        if not isinstance(other, SourcesObject):
+            return False
         return self.source_url == other.source_url
 
     def __lt__(self, other):
+        if not isinstance(other, SourcesObject):
+            return NotImplemented
         return self.source_url < other.source_url
 
     @property

diff --git a/gpackages/libs/package_info/generic_objects.py b/gpackages/libs/package_info/generic_objects.py
index b80cef6..8c8e2aa 100644
--- a/gpackages/libs/package_info/generic_objects.py
+++ b/gpackages/libs/package_info/generic_objects.py
@@ -21,10 +21,12 @@ class Use(ToStrMixin, AbstractUse):
         return self.name
 
     def __eq__(self, other):
+        if not isinstance(other, self):
+            return False
         return self.name == other.name
 
     def __ne__(self, other):
-        return self.name != other.name
+        return not self.__eq__(other)
 
     def __hash__(self):
         return hash(self.name)
@@ -69,9 +71,13 @@ class Keyword(ToStrMixin, AbstractKeywords):
         return self.status > other.status
 
     def __eq__(self, other):
+        if not isinstance(other, Keyword):
+            return False
         return (self.arch, self.status) == (other.arch, other.status)
 
     def __lt__(self, other):
+        if not isinstance(other, Keyword):
+            return NotImplemented
         return (self.status, self.arch) > (other.status, other.arch)
 
     @property



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/libs/package_info/, gpackages/libs/package_info/generic_metadata/
@ 2012-07-06 23:09 Slava Bacherikov
  0 siblings, 0 replies; 5+ messages in thread
From: Slava Bacherikov @ 2012-07-06 23:09 UTC (permalink / raw
  To: gentoo-commits

commit:     f9a040809c1ed0bf5fffea0602be20b55f5738d2
Author:     Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Fri Jul  6 13:36:29 2012 +0000
Commit:     Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Fri Jul  6 14:01:47 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=f9a04080

Add license text object

---
 .../package_info/generic_metadata/license_text.py  |  175 ++++++++++++++++++++
 gpackages/libs/package_info/mixins.py              |   14 ++-
 2 files changed, 188 insertions(+), 1 deletions(-)

diff --git a/gpackages/libs/package_info/generic_metadata/license_text.py b/gpackages/libs/package_info/generic_metadata/license_text.py
new file mode 100644
index 0000000..36e8336
--- /dev/null
+++ b/gpackages/libs/package_info/generic_metadata/license_text.py
@@ -0,0 +1,175 @@
+from ..generic import ToStrMixin, file_get_content
+from itertools import ifilter, izip
+from functools import wraps
+import collections
+import os
+import os.path
+
+def reverse_enumerate(lst):
+    return izip(xrange(len(lst)-1, -1, -1), reversed(lst))
+
+def filter_predicate(file_name, file_path):
+    full_file = os.path.join(file_path, file_name)
+    return not file_name.startswith('.') and os.path.isfile(full_file)
+
+class LicenseMixin(ToStrMixin):
+
+    def get_license(self, license):
+        try:
+            return self[license]
+        except (TypeError, KeyError):
+            return None
+
+class Licenses(LicenseMixin):
+    __slots__ = ('is_valid', 'licenses_dict', 'licenses_path', 'tree_path')
+
+    def __init__(self, tree_path):
+        self.licenses_dict = {}
+        self.is_valid = False
+        self.tree_path = tree_path
+        self.licenses_path = os.path.join(tree_path, 'licenses')
+        if os.path.isdir(self.licenses_path):
+            self.is_valid = True
+            self._fetch_licenses_list()
+
+    def _fetch_licenses_list(self):
+        dir_list = os.listdir(self.licenses_path)
+        f = lambda x: filter_predicate(x, self.licenses_path)
+        licenses_list = ((s.lower(), s) for s in ifilter(f, dir_list))
+        self.licenses_dict = dict(licenses_list)
+
+    def __len__(self):
+        return len(self.licenses_dict)
+
+    def __contains__(self, item):
+        item = unicode(item)
+        return item.lower() in self.licenses_dict
+
+    def __iter__(self):
+        return self.licenses_dict.itervalues()
+
+    def __eq__(self, other):
+        if isinstance(other, Licenses):
+            return other.tree_path == self.tree_path
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __or__(self, other):
+        return LicensesSet([self, other])
+
+    def hash(self):
+        return hash(self.tree_path)
+
+    def get_license_path(self, license):
+        try:
+            key = unicode(license).lower()
+        except:
+            raise TypeError
+        return os.path.join(self.licenses_path, self.licenses_dict[key])
+
+    def __getitem__(self, key):
+        return file_get_content(self.get_license_path(key))
+
+    def __unicode__(self):
+        return unicode(self.tree_path)
+
+def preinit_cache(func):
+    @wraps(func)
+    def wrapper(self, *args, **kwargs):
+        if not self._cache_is_init:
+            self._precache_objects()
+        return func(self, *args, **kwargs)
+
+    return wrapper
+
+class LicensesSet(LicenseMixin):
+
+    __slots__ = ('licenses_list', 'licenses_set', '_cache', '_cache_is_init')
+    
+    def __init__(self, val):
+        self.licenses_list = []
+        self.licenses_set = set()
+        self._cache = {}
+        self._cache_is_init = False
+        if isinstance(val, LicensesSet):
+            obj = val.copy()
+            self.licenses_list = obj.licenses_list
+            self.licenses_set = obj.licenses_set
+            self._cache = obj._cache
+            self._cache_is_init = obj._cache_is_init
+        else:
+            if not isinstance(val, collections.Iterable):
+                raise TypeError
+
+            for item in val:
+                if not isinstance(item, Licenses):
+                    raise TypeError
+                self.add_licenses(item)
+
+    def _precache_objects(self):
+        cache = {}
+        for num, licenses in reverse_enumerate(self.licenses_list):
+            for key in licenses.licenses_dict.iterkeys():
+                cache[key] = num
+        self._cache = cache
+        self._cache_is_init = True
+        
+    def copy(self):
+        return LicensesSet(self.licenses_list)
+
+    def add_licenses(self, licenses):   
+        if not isinstance(licenses, Licenses):
+            return None
+
+        if (not licenses in self.licenses_set) and licenses.is_valid: 
+            self.licenses_list.append(licenses)
+            self.licenses_set.add(licenses)
+            self._cache_is_init = False
+
+    def merge(self, licenses):
+        if isinstance(licenses, Licenses):
+            self.add_licenses(licenses)
+        elif isinstance(licenses, LicensesSet):
+            for licenses in licenses.licenses_list:
+                self.add_licenses(licenses)
+        else:
+            raise TypeError
+
+    def __or__(self, other):
+        try:
+            obj = self.copy()
+            obj.merge(other)
+            return obj
+        except TypeError:
+            return NotImplemented
+
+    def __ior__(self, other):
+        return self.merge(other)
+
+    @preinit_cache
+    def __contains__(self, item):
+        item = unicode(item)
+        return item.lower() in self._cache
+
+    @preinit_cache
+    def __len__(self):
+        return len(self._cache)
+
+    @preinit_cache
+    def __getitem__(self, key):
+        try:
+            key = unicode(key).lower()
+        except:
+            raise TypeError
+        return  self.licenses_list[self._cache[key.lower()]][key]
+
+    def __unicode__(self):
+        res = ""
+        for num ,licenses in enumerate(self.licenses_list):
+            if num == 0:
+                res += repr(licenses)
+            else:
+                res += ', %s' % repr(licenses)
+        return '[%s]' % res
+

diff --git a/gpackages/libs/package_info/mixins.py b/gpackages/libs/package_info/mixins.py
index c18607e..a5cf9d1 100644
--- a/gpackages/libs/package_info/mixins.py
+++ b/gpackages/libs/package_info/mixins.py
@@ -13,6 +13,8 @@ from .generic_metadata.category_metadata import CategoryMetadata
 from .generic_metadata.package_metadata import PackageMetaData
 #License group metadata
 from .generic_metadata.license_groups import LicenseGroups
+# License text
+from .generic_metadata.license_text import Licenses, LicensesSet
 # News
 from .generic_metadata.news import News
 # Validators
@@ -100,6 +102,10 @@ class PortageHerdsMixin(object):
         "Return new `LicenseGroups` object"
         return LicenseGroups()
 
+    @cached_property
+    def licenses(self):
+        return LicensesSet([tree.licenses for tree in self.iter_trees()])
+
 def _get_info_by_func(func, path1, path2):
         path = os.path.join(path1, path2)
         try:
@@ -140,6 +146,12 @@ class PortTreeNewsMixin(object):
 class PortTreeIteratorMixin(AutoGeneratorMixin):
     main_iterator = 'iter_categories'
     generator_names = ('iter_packages', 'iter_ebuilds')
+
+class PortTreeLicenseMixin(object):
+    
+    @cached_property
+    def licenses(self):
+        return Licenses(self.porttree_path)
     
 class CategoryBaseMixin(ToStrMixin):
 
@@ -362,7 +374,7 @@ class PortageMixin(PortageGenericMixin, PortageIteratorMixin, AbstractPortage):
     pass
 
 class PortTreeMixin(PortTreeBaseMixin, PortTreeIteratorMixin, \
-                    PortTreeNewsMixin, AbstractPortTree):
+                    PortTreeNewsMixin, PortTreeLicenseMixin, AbstractPortTree):
     pass
 
 class CategoryMixin(CategoryBaseMixin, CategoryIteratorMixin, AbstractCategory):



^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-07-06 23:10 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-05 23:27 [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/libs/package_info/, gpackages/libs/package_info/generic_metadata/ Slava Bacherikov
  -- strict thread matches above, loose matches on Subject: below --
2012-07-06 23:09 Slava Bacherikov
2012-07-03 21:08 Slava Bacherikov
2012-06-26 18:48 Slava Bacherikov
2012-06-24 23:21 Slava Bacherikov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox