* [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/libs/package_info/package_backends/
@ 2012-07-03 21:08 Slava Bacherikov
0 siblings, 0 replies; 3+ messages in thread
From: Slava Bacherikov @ 2012-07-03 21:08 UTC (permalink / raw
To: gentoo-commits
commit: 91ce510fc19933e558e0160e3400ff32719fbe36
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Tue Jul 3 10:09:40 2012 +0000
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Tue Jul 3 10:09:40 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=91ce510f
Changes in portage backend
---
gpackages/apps/packages/admin.py | 4 +-
gpackages/apps/packages/models.py | 4 +-
.../libs/package_info/package_backends/pkgcore.py | 2 +-
.../libs/package_info/package_backends/portage.py | 89 ++++++++++++--------
4 files changed, 60 insertions(+), 39 deletions(-)
diff --git a/gpackages/apps/packages/admin.py b/gpackages/apps/packages/admin.py
index 4daf96e..04a269e 100644
--- a/gpackages/apps/packages/admin.py
+++ b/gpackages/apps/packages/admin.py
@@ -33,8 +33,8 @@ class ArchesAdmin(admin.ModelAdmin):
search_fields = ('name',)
class EbuildAdmin(admin.ModelAdmin):
- list_display = ('__unicode__', 'is_masked', )
- list_filter = ('created_datetime','updated_datetime', 'licenses', 'is_masked')
+ list_display = ('__unicode__', 'is_hard_masked', )
+ list_filter = ('created_datetime','updated_datetime', 'licenses', 'is_hard_masked')
filter_horizontal = ('licenses', 'use_flags', 'homepages')
date_hierarchy = 'updated_datetime'
list_select_related = True
diff --git a/gpackages/apps/packages/models.py b/gpackages/apps/packages/models.py
index 21d8c0c..5ce8919 100644
--- a/gpackages/apps/packages/models.py
+++ b/gpackages/apps/packages/models.py
@@ -396,7 +396,7 @@ class EbuildModel(AbstractDateTimeModel):
ebuild_hash = models.CharField(max_length = 128)
ebuild_mtime = models.DateTimeField(blank = True, null = True)
is_deleted = models.BooleanField(default = False)
- is_masked = models.BooleanField(default = False)
+ is_hard_masked = models.BooleanField(default = False)
homepages = models.ManyToManyField(HomepageModel, blank = True)
description = models.TextField(blank = True, null = True)
@@ -421,7 +421,7 @@ class EbuildModel(AbstractDateTimeModel):
self.update_by_ebuild(ebuild)
def update_by_ebuild(self, ebuild):
- self.is_masked = ebuild.is_masked
+ self.is_hard_masked = ebuild.is_hard_masked
self.version = ebuild.version
self.revision = ebuild.revision_as_int
self.license = ebuild.license
diff --git a/gpackages/libs/package_info/package_backends/pkgcore.py b/gpackages/libs/package_info/package_backends/pkgcore.py
index 6f83df6..5b053aa 100644
--- a/gpackages/libs/package_info/package_backends/pkgcore.py
+++ b/gpackages/libs/package_info/package_backends/pkgcore.py
@@ -179,5 +179,5 @@ class Ebuild(EbuildMixin):
# Need changes !!!
@property
- def is_masked(self):
+ def is_hard_masked(self):
return False
diff --git a/gpackages/libs/package_info/package_backends/portage.py b/gpackages/libs/package_info/package_backends/portage.py
index 581680b..d821e9e 100644
--- a/gpackages/libs/package_info/package_backends/portage.py
+++ b/gpackages/libs/package_info/package_backends/portage.py
@@ -5,8 +5,7 @@ from portage.dep import Atom
from portage.exception import PortageException, FileNotFound, InvalidAtom, \
InvalidDependString, InvalidPackageName
-from gentoolkit.package import Package as PackageInfo
-from gentoolkit import errors
+from gentoolkit.cpv import CPV
from ..generic import cached_property
import os.path
#Mixins
@@ -22,7 +21,7 @@ VARDB = portage.db[portage.root]["vartree"].dbapi
ARCHES = PORTDB.settings["PORTAGE_ARCHLIST"].split()
def _ebuild_environment(name):
- return lambda self: self.package_object.environment(name)
+ return lambda self: self._env.get(name, '')
class Portage(PortageMixin):
@@ -142,74 +141,96 @@ class Package(PackageMixin):
class Ebuild(EbuildMixin):
"Represent ebuild as object"
- __slots__ = ('package', 'ebuild', 'package_object', '_cache')
+ __slots__ = ('package', 'ebuild', 'cpv_object', '_cache', '_env', '_is_valid')
+ ENV_VARS = PORTDB._aux_cache_keys
def __init__(self, package, ebuild):
self.package = package
self.ebuild = ebuild
- self.package_object = PackageInfo(ebuild)
+ self.cpv_object = CPV(ebuild)
self._cache = {}
+ self._env = None
+ # Maybe this should be lazy ?
+ self._set_env()
+
+ def _set_env(self):
+ try:
+ env_t = PORTDB.aux_get(self.cpv, self.ENV_VARS,
+ mytree = self.package.category.porttree_path)
+ except KeyError:
+ env_t = ()
+ self._is_valid = False
+ else:
+ self._is_valid = True
+ env = {}
+
+ if self._is_valid:
+ env = dict(zip(self.ENV_VARS, env_t))
+
+ self._env = env
@property
def keywords_env(self):
- return self.package_object.environment("KEYWORDS", prefer_vdb = False)
+ return self._env.get("KEYWORDS")
@property
def is_valid(self):
"Check if ebuild is valid"
- try:
- self.eapi
- except errors.GentoolkitFatalError:
- return False
- else:
- return True
+ return self._is_valid
- #Could be faster
@cached_property
- def is_masked(self):
- return self.package_object.is_masked()
+ def is_hard_masked(self):
+ if self.mask_reason:
+ return True
+ else:
+ return False
@property
def version(self):
"Ebuild version"
- return self.package_object.version
+ return self.cpv_object.version
@property
def revision(self):
"Ebuild revision"
- return self.package_object.revision
+ return self.cpv_object.revision
@property
def fullversion(self):
"Version with revision"
- return self.package_object.fullversion
+ return self.cpv_object.fullversion
- @property
+ @cached_property
def ebuild_path(self):
"Full path to ebuild"
- return self.package_object.ebuild_path()
+ return os.path.join(self.package.package_path, self.ebuild_file)
+
+ @property
+ def name(self):
+ return self.cpv_object.name
- homepage_env = cached_property(_ebuild_environment('HOMEPAGE'),
- name = 'homepage_env')
- license = cached_property(_ebuild_environment('LICENSE'),
- name = 'license')
- description = cached_property(_ebuild_environment('DESCRIPTION'),
- name = 'description')
- eapi = cached_property(_ebuild_environment('EAPI'),
- name = 'eapi')
- slot = cached_property(_ebuild_environment('SLOT'),
- name = 'slot')
+ @property
+ def ebuild_file(self):
+ return '%s-%s.ebuild' % (self.name, self.fullversion)
- iuse_env = cached_property(_ebuild_environment('IUSE'),
- name = 'iuse')
+ homepage_env = property(_ebuild_environment('HOMEPAGE'))
+ license = property(_ebuild_environment('LICENSE'))
+ description = property(_ebuild_environment('DESCRIPTION'))
+ eapi = property(_ebuild_environment('EAPI'))
+ slot = property(_ebuild_environment('SLOT'))
+
+ iuse_env = property(_ebuild_environment('IUSE'))
@property
def cpv(self):
- return self.package
+ return self.cpv_object.cpv
@cached_property
def mask_reason(self):
- reas, in_file = self.package_object.get_mask_reason()
+ reas, in_file = portage.getmaskingreason(self.cpv,
+ metadata = self._env,
+ return_location=True,
+ myrepo = self.package.category.porttree.name)
if in_file is None:
return None
elif in_file.startswith('/etc/portage/'):
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/libs/package_info/package_backends/
@ 2012-07-03 21:08 Slava Bacherikov
0 siblings, 0 replies; 3+ messages in thread
From: Slava Bacherikov @ 2012-07-03 21:08 UTC (permalink / raw
To: gentoo-commits
commit: 3b7a2bbd26ad71e907244095d35f2ba173eca70b
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Tue Jul 3 13:17:50 2012 +0000
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Tue Jul 3 13:24:41 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=3b7a2bbd
Code refactoring
---
gpackages/apps/packages/models.py | 9 +++++-
.../libs/package_info/package_backends/pkgcore.py | 24 +++++++++++++++----
.../libs/package_info/package_backends/portage.py | 11 ++++++--
3 files changed, 34 insertions(+), 10 deletions(-)
diff --git a/gpackages/apps/packages/models.py b/gpackages/apps/packages/models.py
index 98abc79..064add4 100644
--- a/gpackages/apps/packages/models.py
+++ b/gpackages/apps/packages/models.py
@@ -494,11 +494,16 @@ class EbuildModel(AbstractDateTimeModel):
@property
def fullversion(self):
- return '%s%s' % (self.version, ('-'+ self.revision_str if self.revision else ''))
+ rev_p = '-'+ self.revision_str if self.revision else ''
+ return '%s%s' % (self.version, rev_p)
def get_keywords(self, arch_list):
keywords_dict = self.get_keywords_dict(arch_list)
- return (KeywordRepr(arch, keywords_dict[arch], self.is_hard_masked) for arch in arch_list)
+ l = []
+ for arch in arch_list:
+ l.append(
+ KeywordRepr(arch, keywords_dict[arch], self.is_hard_masked))
+ return l
def get_keywords_dict(self, arch_list):
arch_set = set(arch_list)
diff --git a/gpackages/libs/package_info/package_backends/pkgcore.py b/gpackages/libs/package_info/package_backends/pkgcore.py
index 5b053aa..9a17208 100644
--- a/gpackages/libs/package_info/package_backends/pkgcore.py
+++ b/gpackages/libs/package_info/package_backends/pkgcore.py
@@ -4,6 +4,7 @@ from pkgcore.config import load_config
from pkgcore.ebuild.repository import UnconfiguredTree, SlavedTree
from pkgcore.util.repo_utils import get_raw_repos, get_virtual_repos
from pkgcore.ebuild.atom import atom
+from pkgcore.ebuild.domain import generate_unmasking_restrict
#Mixins
from ..mixins import PortageMixin, PortTreeMixin, CategoryMixin, PackageMixin, \
@@ -27,6 +28,7 @@ class Portage(PortageMixin):
raise ValueError("Bad domain name - '%s'" % domain_name)
finally:
self._domain = domain
+ self._mask = generate_unmasking_restrict(domain.profile.masks)
def _get_repos(self):
repo_dict = {}
@@ -42,7 +44,7 @@ class Portage(PortageMixin):
def iter_trees(self):
for tree in self.repo_list:
- yield PortTree(tree)
+ yield PortTree(tree, self)
def get_tree_by_name(self, tree_name):
if tree_name in self.repo_dict:
@@ -50,15 +52,19 @@ class Portage(PortageMixin):
else:
raise ValueError
+ def is_masked(self, ebuild):
+ return self._mask.match(ebuild)
+
def __unicode__(self):
return u'pkgcore'
class PortTree(PortTreeMixin):
- def __init__(self, repo_obj):
+ def __init__(self, repo_obj, porttree):
self._repo_obj = repo_obj
self.name = repo_obj.repo_id
self.categories = sorted(repo_obj.categories)
+ self.porttree = porttree
def iter_categories(self):
for category in self.categories:
@@ -95,7 +101,7 @@ class Category(CategoryMixin):
@property
def category_path(self):
"Full path to category"
- return os.path.join(self._repo_obj.porttree_path, self.name)
+ return os.path.join(self.porttree_path, self.name)
def _get_packages_names(self):
return self._repo_obj._packages[self.name]
@@ -103,6 +109,14 @@ class Category(CategoryMixin):
def _get_ebuilds_names_by_name(self, package_name):
return self._repo_obj._versions[(self.name, package_name)]
+ @property
+ def porttree_name(self):
+ return self._repo_obj.name
+
+ @property
+ def porttree_path(self):
+ return self._repo_obj.porttree_path
+
class Package(PackageMixin):
__slots__ = ('name', 'category_obj')
@@ -177,7 +191,7 @@ class Ebuild(EbuildMixin):
cpv = ebuild_prop('cpvstr')
- # Need changes !!!
@property
def is_hard_masked(self):
- return False
+ return self.package_obj.category_obj._repo_obj. \
+ porttree.is_masked(self._ebuild)
diff --git a/gpackages/libs/package_info/package_backends/portage.py b/gpackages/libs/package_info/package_backends/portage.py
index d821e9e..4721d19 100644
--- a/gpackages/libs/package_info/package_backends/portage.py
+++ b/gpackages/libs/package_info/package_backends/portage.py
@@ -107,6 +107,10 @@ class Category(CategoryMixin):
def porttree_path(self):
return self.porttree.porttree
+ @property
+ def porttree_name(self):
+ return self.porttree.name
+
class Package(PackageMixin):
"Represent package as object"
@@ -127,7 +131,7 @@ class Package(PackageMixin):
@property
def package_path(self):
- return os.path.join(self.category.porttree.porttree_path, self.package)
+ return os.path.join(self.category.porttree_path, self.package)
@property
def cp(self):
@@ -141,7 +145,8 @@ class Package(PackageMixin):
class Ebuild(EbuildMixin):
"Represent ebuild as object"
- __slots__ = ('package', 'ebuild', 'cpv_object', '_cache', '_env', '_is_valid')
+ __slots__ = ('package', 'ebuild', 'cpv_object', '_cache', '_env',
+ '_is_valid')
ENV_VARS = PORTDB._aux_cache_keys
def __init__(self, package, ebuild):
@@ -230,7 +235,7 @@ class Ebuild(EbuildMixin):
reas, in_file = portage.getmaskingreason(self.cpv,
metadata = self._env,
return_location=True,
- myrepo = self.package.category.porttree.name)
+ myrepo = self.package.category.porttree_name)
if in_file is None:
return None
elif in_file.startswith('/etc/portage/'):
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/libs/package_info/package_backends/
@ 2012-07-05 23:27 Slava Bacherikov
0 siblings, 0 replies; 3+ messages in thread
From: Slava Bacherikov @ 2012-07-05 23:27 UTC (permalink / raw
To: gentoo-commits
commit: e6a1805fa32a963d1728c1e95797a13874662200
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Thu Jul 5 17:43:48 2012 +0000
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Thu Jul 5 17:43:48 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=e6a1805f
Add stats calculating
---
gpackages/apps/packages/models.py | 92 ++++++++++++++++++--
gpackages/apps/packages/stats.py | 31 +++++++
.../libs/package_info/package_backends/pkgcore.py | 6 ++
.../libs/package_info/package_backends/portage.py | 6 ++
4 files changed, 127 insertions(+), 8 deletions(-)
diff --git a/gpackages/apps/packages/models.py b/gpackages/apps/packages/models.py
index 51b839e..efb4638 100644
--- a/gpackages/apps/packages/models.py
+++ b/gpackages/apps/packages/models.py
@@ -6,6 +6,7 @@ from package_info.generic import get_from_kwargs_and_del
from package_info.repo_info import REPOS_TYPE
# relative
from .keywords import KeywordRepr
+from .stats import StatsMixin
#from utils import get_link
from package_info.validators import validate_url, validate_email, \
validate_name
@@ -90,12 +91,17 @@ class ArchesModel(models.Model):
def __unicode__(self):
return self.name
-class RepositoryModel(AbstractDateTimeModel):
+class RepositoryModel(StatsMixin, AbstractDateTimeModel):
QUALITY_CHOICES = ( (0, 'stable'),
(1, 'testing'),
(2, 'experimental'),
)
+ stats_params = (
+ ('packages_count', 'packagemodel'),
+ ('ebuilds_count', 'packagemodel__ebuildmodel'),
+ )
+
def __init__(self, *args, **kwargs):
repo = get_from_kwargs_and_del('repo', kwargs)
super(RepositoryModel, self).__init__(*args, **kwargs)
@@ -113,6 +119,12 @@ class RepositoryModel(AbstractDateTimeModel):
official = models.BooleanField(default = False)
quality = models.PositiveSmallIntegerField(choices = QUALITY_CHOICES)
+ # Maybe in future auto generate this field by metaclass ?
+ # For fast stats
+ packages_count = models.PositiveIntegerField(default = 0)
+ ebuilds_count = models.PositiveIntegerField(default = 0)
+
+
objects = managers.RepositoryManager()
def init_by_repo(self, repo):
@@ -194,7 +206,7 @@ class RepositorySourceModel(models.Model):
def __unicode__(self):
return self.url
-class CategoryModel(models.Model):
+class CategoryModel(StatsMixin, models.Model):
def __init__(self, *args, **kwargs):
super(CategoryModel, self).__init__(*args, **kwargs)
@@ -202,6 +214,13 @@ class CategoryModel(models.Model):
if isinstance(category, AbstractCategory):
self.update_by_category(category)
+ stats_params = (
+ ('virtual_packages_count', 'virtualpackagemodel'),
+ ('packages_count', 'virtualpackagemodel__packagemodel'),
+ ('repositories_count', 'virtualpackagemodel__packagemodel__repository'),
+ ('ebuilds_count', 'virtualpackagemodel__packagemodel__ebuildmodel'),
+ )
+
def update_by_category(self, category):
self.description = category.metadata.default_descr
self.metadata_hash = category.metadata_sha1
@@ -212,21 +231,47 @@ class CategoryModel(models.Model):
category = models.CharField(unique = True, max_length = 70, db_index = True)
description = models.TextField(blank = True, null = True)
metadata_hash = models.CharField(max_length = 128, null = True)
+
+ # Maybe in future auto generate this field by metaclass ?
+ # For fast stats
+ virtual_packages_count = models.PositiveIntegerField(default = 0)
+ packages_count = models.PositiveIntegerField(default = 0)
+ repositories_count = models.PositiveIntegerField(default = 0)
+ ebuilds_count = models.PositiveIntegerField(default = 0)
def __unicode__(self):
return unicode(self.category)
-class MaintainerModel(AbstractDateTimeModel):
+class MaintainerModel(StatsMixin, AbstractDateTimeModel):
def __init__(self, *args, **kwargs):
maintainer = get_from_kwargs_and_del('maintainer', kwargs)
super(MaintainerModel, self).__init__(*args, **kwargs)
if maintainer is not None:
self.init_by_maintainer(maintainer)
+
+ stats_params = (
+ ('packages_count', 'packagemodel'),
+ ('herds_count', 'herdsmodel'),
+ ('ebuilds_count', 'packagemodel__ebuildmodel'),
+ ('repositories_count', 'packagemodel__ebuildmodel'),
+ ('news_author_count', 'author_news_set'),
+ ('news_translator_count', 'translator_news_set')
+ )
name = models.CharField(max_length = 255, blank = True, null = True)
email = models.EmailField(unique = True, validators = [validate_email], db_index = True)
+ # For fast stats
+ # Maybe use django-composition ?
+ # Maybe in future auto generate this field by metaclass ?
+ herds_count = models.PositiveIntegerField(default = 0)
+ packages_count = models.PositiveIntegerField(default = 0)
+ ebuilds_count = models.PositiveIntegerField(default = 0)
+ repositories_count = models.PositiveIntegerField(default = 0)
+ news_author_count = models.PositiveIntegerField(default = 0)
+ news_translator_count = models.PositiveIntegerField(default = 0)
+
objects = managers.MaintainerManager()
def init_by_maintainer(self, maintainer):
@@ -246,7 +291,7 @@ class MaintainerModel(AbstractDateTimeModel):
class Meta:
ordering = ('name',)
-class HerdsModel(AbstractDateTimeModel):
+class HerdsModel(StatsMixin, AbstractDateTimeModel):
def __init__(self, *args, **kwargs):
herd = get_from_kwargs_and_del('herd', kwargs)
@@ -254,11 +299,26 @@ class HerdsModel(AbstractDateTimeModel):
if herd is not None:
self.init_by_herd(herd)
+ stats_params = (
+ ('packages_count', 'packagemodel'),
+ ('maintainers_count', 'maintainers'),
+ ('ebuilds_count', 'packagemodel__ebuildmodel'),
+ ('repositories_count', 'packagemodel__repository'),
+ )
+
name = models.CharField(unique = True, max_length = 150, db_index = True)
email = models.EmailField(validators = [validate_email])
description = models.TextField(blank = True, null = True)
maintainers = models.ManyToManyField(MaintainerModel, blank = True)
+ # For fast stats
+ # Maybe use django-composition ?
+ # Maybe in future auto generate this field by metaclass ?
+ maintainers_count = models.PositiveIntegerField(default = 0)
+ packages_count = models.PositiveIntegerField(default = 0)
+ ebuilds_count = models.PositiveIntegerField(default = 0)
+ repositories_count = models.PositiveIntegerField(default = 0)
+
objects = managers.HerdsManager()
def init_by_herd(self, herd):
@@ -304,7 +364,8 @@ class VirtualPackageModel(models.Model):
class Meta:
unique_together = ('name', 'category')
-class PackageModel(AbstractDateTimeModel):
+class PackageModel(StatsMixin, AbstractDateTimeModel):
+
def __init__(self, *args, **kwargs):
package_object, category = \
get_from_kwargs_and_del(('package','category' ), kwargs)
@@ -313,6 +374,9 @@ class PackageModel(AbstractDateTimeModel):
if isinstance(package_object, AbstarctPackage):
self.init_by_package(package_object, category = category)
+ stats_params = (
+ ('ebuilds_count', 'ebuildmodel'),
+ )
virtual_package = models.ForeignKey(VirtualPackageModel, db_index = True)
changelog = models.TextField(blank = True, null = True)
@@ -329,6 +393,8 @@ class PackageModel(AbstractDateTimeModel):
description = models.TextField(blank = True, null = True)
repository = models.ForeignKey(RepositoryModel, db_index = True)
# Different versions can have different licenses, or homepages.
+
+ ebuilds_count = models.PositiveIntegerField(default = 0)
objects = managers.PackageManager()
@@ -407,10 +473,16 @@ class PackageModel(AbstractDateTimeModel):
unique_together = ('virtual_package', 'repository')
ordering = ('-updated_datetime',)
-class UseFlagModel(models.Model):
+class UseFlagModel(StatsMixin, models.Model):
+ stats_params = (
+ ('ebuilds_count', 'ebuildmodel'),
+ )
+
name = models.CharField(unique = True, max_length = 60, db_index = True)
description = models.TextField(blank = True)
+ ebuilds_count = models.PositiveIntegerField(default = 0)
+
def __unicode__(self):
return self.name
@@ -431,9 +503,14 @@ class UseFlagDescriptionModel(models.Model):
class Meta:
unique_together = ('use_flag', 'package')
-class LicenseModel(models.Model):
+class LicenseModel(StatsMixin, models.Model):
+ stats_params = (
+ ('ebuilds_count', 'ebuildmodel'),
+ )
+
name = models.CharField(unique = True, max_length = 60, db_index = True)
#description = TextField()
+ ebuilds_count = models.PositiveIntegerField(default = 0)
def __unicode__(self):
return self.name
@@ -648,4 +725,3 @@ class Keyword(models.Model):
class Meta:
unique_together = ('ebuild', 'arch')
-
diff --git a/gpackages/apps/packages/stats.py b/gpackages/apps/packages/stats.py
new file mode 100644
index 0000000..9bf3efa
--- /dev/null
+++ b/gpackages/apps/packages/stats.py
@@ -0,0 +1,31 @@
+from django.db.models import Count
+from itertools import starmap
+
+gen_prefix = lambda x: x + '_prefix'
+
+def gen_query_dict(params):
+ query_dict = {}
+ for key, value in starmap(lambda x,y: (gen_prefix(x), y), params):
+ query_dict[key] = Count(value, distinct = True)
+
+ return query_dict
+
+def make_query_for_stats(model, params):
+ query_dict = gen_query_dict(params)
+ return model.objects.annotate(**query_dict)
+
+def update_stats(model, params):
+ query = make_query_for_stats(model, params)
+ for obj in query:
+ for key, mykey in starmap(lambda x,y: (x, gen_prefix(x)), params):
+ setattr(obj, key, getattr(obj, mykey))
+
+ obj.save(force_update = True)
+
+class StatsMixin(object):
+
+ stats_params = ((),)
+
+ @classmethod
+ def calc_stats(cls):
+ update_stats(cls, cls.stats_params)
diff --git a/gpackages/libs/package_info/package_backends/pkgcore.py b/gpackages/libs/package_info/package_backends/pkgcore.py
index 9a17208..2ad6b69 100644
--- a/gpackages/libs/package_info/package_backends/pkgcore.py
+++ b/gpackages/libs/package_info/package_backends/pkgcore.py
@@ -57,6 +57,9 @@ class Portage(PortageMixin):
def __unicode__(self):
return u'pkgcore'
+
+ def __len__(self):
+ return len(self.repo_list)
class PortTree(PortTreeMixin):
@@ -86,6 +89,9 @@ class PortTree(PortTreeMixin):
def _versions(self):
return self._repo_obj.versions
+ def __len__(self):
+ return len(self.categories)
+
class Category(CategoryMixin):
__slots__ = ('_repo_obj', 'name')
diff --git a/gpackages/libs/package_info/package_backends/portage.py b/gpackages/libs/package_info/package_backends/portage.py
index 729e6e9..e3707d4 100644
--- a/gpackages/libs/package_info/package_backends/portage.py
+++ b/gpackages/libs/package_info/package_backends/portage.py
@@ -51,6 +51,9 @@ class Portage(PortageMixin):
def __unicode__(self):
return u'portage'
+ def __len__(self):
+ return len(self.tree_order)
+
class PortTree(PortTreeMixin):
"Represent portage tree as object"
@@ -72,6 +75,9 @@ class PortTree(PortTreeMixin):
"Full path to portage tree"
return self.porttree
+ def __len__(self):
+ return len(PORTDB.settings.categories)
+
class Category(CategoryMixin):
"Represent category of portage tree as object"
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2012-07-05 23:27 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-03 21:08 [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/libs/package_info/package_backends/ Slava Bacherikov
-- strict thread matches above, loose matches on Subject: below --
2012-07-05 23:27 Slava Bacherikov
2012-07-03 21:08 Slava Bacherikov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox