* [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