public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [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-03 21:08 Slava Bacherikov
2012-07-05 23:27 Slava Bacherikov

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