1 |
commit: ddba123a5a29de786959a5a548b89991738cb2fe |
2 |
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org> |
3 |
AuthorDate: Wed Jun 20 12:50:53 2012 +0000 |
4 |
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua> |
5 |
CommitDate: Wed Jun 20 12:50:53 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=ddba123a |
7 |
|
8 |
Refactor porttree |
9 |
|
10 |
--- |
11 |
gpackages/libs/generic.py | 8 ++++- |
12 |
gpackages/libs/porttree.py | 64 ++++++++++++++++++++++++-------------------- |
13 |
2 files changed, 41 insertions(+), 31 deletions(-) |
14 |
|
15 |
diff --git a/gpackages/libs/generic.py b/gpackages/libs/generic.py |
16 |
index 409ec09..b8312c4 100644 |
17 |
--- a/gpackages/libs/generic.py |
18 |
+++ b/gpackages/libs/generic.py |
19 |
@@ -3,9 +3,13 @@ import hashlib |
20 |
import types |
21 |
from datetime import datetime |
22 |
|
23 |
-__all__ = ('StrThatIgnoreCase', 'ToStrMixin', 'file_get_content', 'file_sha1', \ |
24 |
- 'file_mtime', 'cached_property' ) |
25 |
+__all__ = ('StrThatIgnoreCase', 'ToStrMixin', 'file_get_content', 'file_sha1',\ |
26 |
+ 'file_mtime', 'cached_property', 'iter_over_gen', 'lofstr_to_ig') |
27 |
|
28 |
+def iter_over_gen(iterat, name): |
29 |
+ for obj in iterat: |
30 |
+ for item in getattr(obj, name)(): |
31 |
+ yield item |
32 |
def del_from_dict(what_list, dict_todel): |
33 |
for item in what_list: |
34 |
if item in dict_todel: |
35 |
|
36 |
diff --git a/gpackages/libs/porttree.py b/gpackages/libs/porttree.py |
37 |
index 75812ab..637e198 100644 |
38 |
--- a/gpackages/libs/porttree.py |
39 |
+++ b/gpackages/libs/porttree.py |
40 |
@@ -10,7 +10,9 @@ from gentoolkit.package import Package as PackageInfo |
41 |
from gentoolkit.metadata import MetaData |
42 |
from gentoolkit import errors |
43 |
from generic import ToStrMixin, file_sha1, file_mtime, cached_property, \ |
44 |
- file_get_content, StrThatIgnoreCase, lofstr_to_ig |
45 |
+ file_get_content, StrThatIgnoreCase, lofstr_to_ig, \ |
46 |
+ iter_over_gen |
47 |
+ |
48 |
from use_info import get_uses_info, get_local_uses_info |
49 |
import os |
50 |
|
51 |
@@ -166,7 +168,27 @@ def _gen_all_use(func, iterator): |
52 |
func(use_all_dict, use_dict) |
53 |
return use_all_dict |
54 |
|
55 |
-class Portage(object): |
56 |
+ |
57 |
+def gen_generator_over_gen(gen_name, name): |
58 |
+ return lambda self: iter_over_gen(getattr(self, gen_name)(), name) |
59 |
+ |
60 |
+class IteratorAddMetaclass(type): |
61 |
+ |
62 |
+ def __init__(cls, name, bases, dct): |
63 |
+ super(IteratorAddMetaclass, cls).__init__(name, bases, dct) |
64 |
+ for name in cls.generator_names: |
65 |
+ setattr(cls, name, gen_generator_over_gen(cls.main_iterator, name)) |
66 |
+ |
67 |
+class AutoGeneratorMixin(object): |
68 |
+ |
69 |
+ __metaclass__ = IteratorAddMetaclass |
70 |
+ generator_names = () |
71 |
+ #main_iterator = 'generator_name' |
72 |
+ |
73 |
+class Portage(ToStrMixin, AutoGeneratorMixin): |
74 |
+ |
75 |
+ generator_names = ('iter_categories', 'iter_packages', 'iter_ebuilds') |
76 |
+ main_iterator = 'iter_trees' |
77 |
|
78 |
def __init__(self): |
79 |
self.treemap = PORTDB.repositories.treemap |
80 |
@@ -183,21 +205,6 @@ class Portage(object): |
81 |
for tree_name in self.tree_order: |
82 |
yield PortTree(tree_dict[tree_name], tree_name) |
83 |
|
84 |
- def iter_categories(self): |
85 |
- for tree in self.iter_trees(): |
86 |
- for category in tree.iter_categories(): |
87 |
- yield category |
88 |
- |
89 |
- def iter_packages(self): |
90 |
- for tree in self.iter_trees(): |
91 |
- for package in tree.iter_packages(): |
92 |
- yield package |
93 |
- |
94 |
- def iter_ebuilds(self): |
95 |
- for tree in self.iter_trees(): |
96 |
- for ebuild in tree.iter_ebuilds(): |
97 |
- yield ebuild |
98 |
- |
99 |
def iter_use_desc(self): |
100 |
for tree in self.iter_trees(): |
101 |
yield tree.use_desc |
102 |
@@ -224,9 +231,15 @@ class Portage(object): |
103 |
def dict_repos(self): |
104 |
return self.treemap |
105 |
|
106 |
+ def __unicode__(self): |
107 |
+ return u'portage' |
108 |
+ |
109 |
|
110 |
-class PortTree(ToStrMixin): |
111 |
+class PortTree(ToStrMixin, AutoGeneratorMixin): |
112 |
"Represent portage tree as object" |
113 |
+ |
114 |
+ main_iterator = 'iter_categories' |
115 |
+ generator_names = ('iter_packages', 'iter_ebuilds') |
116 |
|
117 |
def __init__(self, tree_path = '/usr/portage', name = 'main'): |
118 |
"""Args: |
119 |
@@ -241,16 +254,6 @@ class PortTree(ToStrMixin): |
120 |
if os.path.isdir(os.path.join(self.porttree_path, category)): |
121 |
yield Category(self, category) |
122 |
|
123 |
- def iter_packages(self): |
124 |
- for category in self.iter_categories(): |
125 |
- for package in category.iter_packages(): |
126 |
- yield package |
127 |
- |
128 |
- def iter_ebuilds(self): |
129 |
- for package in self.iter_packages(): |
130 |
- for ebuild in package.iter_ebuilds(): |
131 |
- yield ebuild |
132 |
- |
133 |
def __unicode__(self): |
134 |
return self.name |
135 |
|
136 |
@@ -304,10 +307,13 @@ class CategoryMetadata(ToStrMixin): |
137 |
return unicode(self._metadata_path) |
138 |
|
139 |
|
140 |
-class Category(ToStrMixin): |
141 |
+class Category(ToStrMixin, AutoGeneratorMixin): |
142 |
"Represent category of portage tree as object" |
143 |
|
144 |
__slots__ = ('porttree', 'category', '_cache') |
145 |
+ |
146 |
+ main_iterator = 'iter_packages' |
147 |
+ generator_names = ('iter_ebuilds', ) |
148 |
|
149 |
def __init__(self, porttree, category): |
150 |
"""Args: |