root/pkgcore-checks/pkgcore_checks/feeds.py @ ferringb%2540gmail.com-20070402122032-4ss5mgv50fko6ts0

Revision ferringb%2540gmail.com-20070402122032-4ss5mgv50fko6ts0, 4.3 kB (checked in by Brian Harring <ferringb@…>, 22 months ago)

convert over to using snakeoil api instead of pkgcore.util

Line 
1# Copyright: 2006 Marien Zwart <marienz@gentoo.org>
2# License: GPL2
3
4
5"""Feed classes: pass groups of packages to other addons."""
6
7
8import operator
9import itertools
10
11from pkgcore_checks import base
12
13from pkgcore.restrictions import util
14from snakeoil.compatibility import any
15
16
17class VersionToEbuild(base.Transform):
18
19    """Convert from just a package to a (package, list_of_lines) tuple."""
20
21    source = base.versioned_feed
22    dest = base.ebuild_feed
23    scope = base.version_scope
24    cost = 20
25
26    def feed(self, pkg, reporter):
27        self.child.feed((pkg, list(pkg.ebuild.get_fileobj())), reporter)
28
29
30class EbuildToVersion(base.Transform):
31
32    """Convert (package, list_of_lines) to just package."""
33
34    source = base.ebuild_feed
35    dest = base.versioned_feed
36    scope = base.version_scope
37    cost = 5
38
39    def feed(self, pair, reporter):
40        self.child.feed(pair[0], reporter)
41
42
43class _Collapse(base.Transform):
44
45    """Collapse the input into tuples with a function returning the same val.
46
47    Override keyfunc in a subclass and set the C{transforms} attribute.
48    """
49
50    def start(self):
51        base.Transform.start(self)
52        self.chunk = None
53        self.key = None
54
55    def keyfunc(self, pkg):
56        raise NotImplementedError(self.keyfunc)
57
58    def feed(self, pkg, reporter):
59        key = self.keyfunc(pkg)
60        if key == self.key:
61            # New version for our current package.
62            self.chunk.append(pkg)
63        else:
64            # Package change.
65            if self.chunk is not None:
66                self.child.feed(tuple(self.chunk), reporter)
67            self.chunk = [pkg]
68            self.key = key
69
70    def finish(self, reporter):
71        # Deal with empty runs.
72        if self.chunk is not None:
73            self.child.feed(tuple(self.chunk), reporter)
74        base.Transform.finish(self, reporter)
75        self.chunk = None
76        self.key = None
77
78
79class VersionToPackage(_Collapse):
80
81    source = base.versioned_feed
82    dest = base.package_feed
83    scope = base.package_scope
84    cost = 10
85
86    keyfunc = operator.attrgetter('key')
87
88
89class VersionToCategory(_Collapse):
90
91    source = base.versioned_feed
92    dest = base.category_feed
93    scope = base.category_scope
94    cost = 10
95
96    keyfunc = operator.attrgetter('category')
97
98
99class _PackageOrCategoryToRepo(base.Transform):
100
101    def start(self):
102        base.Transform.start(self)
103        self.repo = []
104
105    def feed(self, item, reporter):
106        self.repo.append(item)
107
108    def finish(self, reporter):
109        self.child.feed(repo, reporter)
110        base.Transform.finish(self, reporter)
111        self.repo = None
112
113
114class PackageToRepo(_PackageOrCategoryToRepo):
115
116    source = base.package_feed
117    dest = base.repository_feed
118    scope = base.repository_scope
119    cost = 10
120
121
122class CategoryToRepo(_PackageOrCategoryToRepo):
123
124    source = base.category_feed
125    dest = base.repository_feed
126    scope = base.repository_scope
127    cost = 10
128
129
130class PackageToCategory(base.Transform):
131
132    source = base.package_feed
133    dest = base.category_feed
134    scope = base.category_scope
135    cost = 10
136
137    def start(self):
138        base.Transform.start(self)
139        self.chunk = None
140        self.category = None
141
142    def feed(self, item, reporter):
143        category = item[0].category
144        if category == self.category:
145            self.chunk.extend(item)
146        else:
147            if self.chunk is not None:
148                self.child.feed(tuple(self.chunk), reporter)
149            self.chunk = list(item)
150            self.category = category
151
152    def finish(self, reporter):
153        if self.chunk is not None:
154            self.child.feed(tuple(self.chunk), reporter)
155        base.Transform.finish(self, reporter)
156        self.category = None
157        self.chunk = None
158
159
160class RestrictedRepoSource(object):
161
162    feed_type = base.versioned_feed
163    cost = 10
164
165    def __init__(self, repo, limiter):
166        self.repo = repo
167        self.limiter = limiter
168        for scope, attrs in [
169            (base.version_scope, ['fullver', 'version', 'rev']),
170            (base.package_scope, ['package']),
171            (base.category_scope, ['category']),
172            ]:
173            if any(util.collect_package_restrictions(limiter, attrs)):
174                self.scope = scope
175                return
176        self.scope = base.repository_scope
177
178    def feed(self):
179        return self.repo.itermatch(self.limiter, sorter=sorted)
Note: See TracBrowser for help on using the browser.