public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Slava Bacherikov" <slava@bacherikov.org.ua>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/libs/
Date: Wed, 20 Jun 2012 23:23:54 +0000 (UTC)	[thread overview]
Message-ID: <1340196653.ddba123a5a29de786959a5a548b89991738cb2fe.bacher09@gentoo> (raw)

commit:     ddba123a5a29de786959a5a548b89991738cb2fe
Author:     Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Wed Jun 20 12:50:53 2012 +0000
Commit:     Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Wed Jun 20 12:50:53 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=ddba123a

Refactor porttree

---
 gpackages/libs/generic.py  |    8 ++++-
 gpackages/libs/porttree.py |   64 ++++++++++++++++++++++++--------------------
 2 files changed, 41 insertions(+), 31 deletions(-)

diff --git a/gpackages/libs/generic.py b/gpackages/libs/generic.py
index 409ec09..b8312c4 100644
--- a/gpackages/libs/generic.py
+++ b/gpackages/libs/generic.py
@@ -3,9 +3,13 @@ import hashlib
 import types
 from datetime import datetime
 
-__all__ = ('StrThatIgnoreCase', 'ToStrMixin', 'file_get_content', 'file_sha1', \
-           'file_mtime', 'cached_property' )
+__all__ = ('StrThatIgnoreCase', 'ToStrMixin', 'file_get_content', 'file_sha1',\
+           'file_mtime', 'cached_property', 'iter_over_gen', 'lofstr_to_ig')
 
+def iter_over_gen(iterat, name):
+    for obj in iterat:
+        for item in getattr(obj, name)():
+            yield item
 def del_from_dict(what_list, dict_todel):
     for item in what_list:
         if item in dict_todel:

diff --git a/gpackages/libs/porttree.py b/gpackages/libs/porttree.py
index 75812ab..637e198 100644
--- a/gpackages/libs/porttree.py
+++ b/gpackages/libs/porttree.py
@@ -10,7 +10,9 @@ from gentoolkit.package import Package as PackageInfo
 from gentoolkit.metadata import MetaData
 from gentoolkit import errors
 from generic import ToStrMixin, file_sha1, file_mtime, cached_property, \
-                    file_get_content, StrThatIgnoreCase, lofstr_to_ig
+                    file_get_content, StrThatIgnoreCase, lofstr_to_ig, \
+                    iter_over_gen
+
 from use_info import get_uses_info, get_local_uses_info
 import os
 
@@ -166,7 +168,27 @@ def _gen_all_use(func, iterator):
             func(use_all_dict, use_dict)
     return use_all_dict
 
-class Portage(object):
+
+def gen_generator_over_gen(gen_name, name):
+    return lambda self: iter_over_gen(getattr(self, gen_name)(), name)
+
+class IteratorAddMetaclass(type):
+    
+    def __init__(cls, name, bases, dct):
+        super(IteratorAddMetaclass, cls).__init__(name, bases, dct)
+        for name in cls.generator_names:
+            setattr(cls, name, gen_generator_over_gen(cls.main_iterator, name))
+
+class AutoGeneratorMixin(object):
+
+    __metaclass__ = IteratorAddMetaclass
+    generator_names = ()
+    #main_iterator = 'generator_name'
+
+class Portage(ToStrMixin, AutoGeneratorMixin):
+
+    generator_names = ('iter_categories', 'iter_packages', 'iter_ebuilds')
+    main_iterator = 'iter_trees'
 
     def __init__(self):
         self.treemap = PORTDB.repositories.treemap
@@ -183,21 +205,6 @@ class Portage(object):
         for tree_name in self.tree_order:
             yield PortTree(tree_dict[tree_name], tree_name)
 
-    def iter_categories(self):
-        for tree in self.iter_trees():
-            for category in tree.iter_categories():
-                yield category
-
-    def iter_packages(self):
-        for tree in self.iter_trees():
-            for package in tree.iter_packages():
-                yield package
-
-    def iter_ebuilds(self):
-        for tree in self.iter_trees():
-            for ebuild in tree.iter_ebuilds():
-                yield ebuild
-    
     def iter_use_desc(self):
         for tree in self.iter_trees():
             yield tree.use_desc
@@ -224,9 +231,15 @@ class Portage(object):
     def dict_repos(self):
         return self.treemap
 
+    def __unicode__(self):
+        return u'portage'
+
 
-class PortTree(ToStrMixin):
+class PortTree(ToStrMixin, AutoGeneratorMixin):
     "Represent portage tree as object"
+
+    main_iterator = 'iter_categories'
+    generator_names = ('iter_packages', 'iter_ebuilds')
     
     def __init__(self, tree_path = '/usr/portage', name = 'main'):
         """Args:
@@ -241,16 +254,6 @@ class PortTree(ToStrMixin):
             if os.path.isdir(os.path.join(self.porttree_path, category)):
                     yield Category(self, category)
 
-    def iter_packages(self):
-        for category in self.iter_categories():
-            for package in category.iter_packages():
-                yield package
-    
-    def iter_ebuilds(self):
-        for package in self.iter_packages():
-            for ebuild in package.iter_ebuilds():
-                yield ebuild
-
     def __unicode__(self):
         return self.name
     
@@ -304,10 +307,13 @@ class CategoryMetadata(ToStrMixin):
         return unicode(self._metadata_path)
 
 
-class Category(ToStrMixin):
+class Category(ToStrMixin, AutoGeneratorMixin):
     "Represent category of portage tree as object"
 
     __slots__ = ('porttree', 'category', '_cache')
+
+    main_iterator = 'iter_packages'
+    generator_names = ('iter_ebuilds', )
     
     def __init__(self, porttree, category):
         """Args:



             reply	other threads:[~2012-06-20 23:24 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-20 23:23 Slava Bacherikov [this message]
  -- strict thread matches above, loose matches on Subject: below --
2012-06-20 23:23 [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/libs/ Slava Bacherikov
2012-06-20 23:23 Slava Bacherikov
2012-06-18 21:26 Slava Bacherikov
2012-06-18 21:26 Slava Bacherikov
2012-06-18 21:26 Slava Bacherikov
2012-06-14 19:10 Slava Bacherikov
2012-06-12 18:34 Slava Bacherikov
2012-06-12 18:34 Slava Bacherikov
2012-06-10 17:51 Slava Bacherikov
2012-06-09 18:19 Slava Bacherikov
2012-06-09 18:19 Slava Bacherikov
2012-06-07 22:48 Slava Bacherikov
2012-06-07 22:48 Slava Bacherikov
2012-06-07 22:48 Slava Bacherikov
2012-06-06 22:48 Slava Bacherikov
2012-06-05 21:46 Slava Bacherikov
2012-06-05 20:48 Slava Bacherikov
2012-06-05 15:49 Slava Bacherikov
2012-06-05 15:49 Slava Bacherikov
2012-06-04 22:18 Slava Bacherikov
2012-06-04 16:16 Slava Bacherikov
2012-06-04 16:16 Slava Bacherikov
2012-06-03 19:34 Slava Bacherikov
2012-06-03 16:19 Slava Bacherikov
2012-06-03 13:19 Slava Bacherikov
2012-06-03 13:19 Slava Bacherikov
2012-06-02 16:04 Slava Bacherikov
2012-06-01 21:28 Slava Bacherikov
2012-06-01 21:28 Slava Bacherikov
2012-05-31 15:28 Slava Bacherikov
2012-05-31 15:28 Slava Bacherikov
2012-05-29 21:34 Slava Bacherikov
2012-05-29 13:38 Slava Bacherikov
2012-05-28 17:00 Slava Bacherikov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1340196653.ddba123a5a29de786959a5a548b89991738cb2fe.bacher09@gentoo \
    --to=slava@bacherikov.org.ua \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox