1 |
commit: 5b7efed420bdcf338f5743614bcd1ebfc3a4bc4f |
2 |
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org> |
3 |
AuthorDate: Tue Jun 5 12:27:20 2012 +0000 |
4 |
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua> |
5 |
CommitDate: Tue Jun 5 12:27:20 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=5b7efed4 |
7 |
|
8 |
Add caching propertys |
9 |
|
10 |
--- |
11 |
gpackages/libs/porttree.py | 67 ++++++++++++++++++++++++++----------------- |
12 |
1 files changed, 40 insertions(+), 27 deletions(-) |
13 |
|
14 |
diff --git a/gpackages/libs/porttree.py b/gpackages/libs/porttree.py |
15 |
index 0bf329b..6781d4e 100644 |
16 |
--- a/gpackages/libs/porttree.py |
17 |
+++ b/gpackages/libs/porttree.py |
18 |
@@ -48,6 +48,24 @@ def file_mtime(file_path): |
19 |
else: |
20 |
return None |
21 |
|
22 |
+class cached_property(object): |
23 |
+ def __init__(self, func, name = None): |
24 |
+ self.func = func |
25 |
+ if name is None: |
26 |
+ name = func.__name__ |
27 |
+ self.__name__ = name |
28 |
+ self.__module__ = func.__module__ |
29 |
+ |
30 |
+ def __get__(self, inst, owner): |
31 |
+ try: |
32 |
+ value = inst._cache[self.__name__] |
33 |
+ except (KeyError, AttributeError): |
34 |
+ value = self.func(inst) |
35 |
+ if not hasattr(inst, '_cache'): |
36 |
+ inst._cache = {} |
37 |
+ inst._cache[self.__name__] = value |
38 |
+ return value |
39 |
+ |
40 |
class Use(ToStrMixin): |
41 |
"Represend Use flag as object" |
42 |
__slots__ = ('name',) |
43 |
@@ -174,13 +192,12 @@ class Category(ToStrMixin): |
44 |
|
45 |
class Package(ToStrMixin): |
46 |
|
47 |
- __slots__ = ('category', 'package', '_metadata', '_changelog') |
48 |
+ __slots__ = ('category', 'package', '_cache') |
49 |
|
50 |
def __init__(self, category, package): |
51 |
self.category = category |
52 |
self.package = package |
53 |
- self._metadata = None |
54 |
- self._changelog = None |
55 |
+ self._cache = {} |
56 |
|
57 |
def iter_ebuilds(self): |
58 |
ebuilds = PORTDB.cp_list(self.package, mytree=self.category.porttree.porttree) |
59 |
@@ -194,11 +211,9 @@ class Package(ToStrMixin): |
60 |
def package_path(self): |
61 |
return os.path.join(self.category.porttree.porttree_path, self.package) |
62 |
|
63 |
- @property |
64 |
+ @cached_property |
65 |
def metadata(self): |
66 |
- if self._metadata is None: |
67 |
- self._metadata = MetaData( self.metadata_path) |
68 |
- return self._metadata |
69 |
+ return MetaData( self.metadata_path) |
70 |
|
71 |
mtime = property(_file_mtime("package_path")) |
72 |
|
73 |
@@ -211,30 +226,28 @@ class Package(ToStrMixin): |
74 |
metadata_path = property(_file_path('metadata.xml')) |
75 |
|
76 |
#Hashes |
77 |
- manifest_sha1 = property(_file_hash('manifest_path')) |
78 |
- changelog_sha1 = property(_file_hash('changelog_path')) |
79 |
- metadata_sha1 = property(_file_hash('metadata_path')) |
80 |
+ manifest_sha1 = cached_property(_file_hash('manifest_path'), name = 'manifest_sha1') |
81 |
+ changelog_sha1 = cached_property(_file_hash('changelog_path'), name = 'changelog_sha1') |
82 |
+ metadata_sha1 = cached_property(_file_hash('metadata_path'), name = 'metadata_sha1') |
83 |
# Modify times |
84 |
manifest_mtime = property(_file_mtime("manifest_path")) |
85 |
changelog_mtime = property(_file_mtime("changelog_path")) |
86 |
metadata_mtime = property(_file_mtime("metadata_path")) |
87 |
|
88 |
- @property |
89 |
+ @cached_property |
90 |
def changelog(self): |
91 |
- if self._changelog is not None: |
92 |
- return self._changelog |
93 |
- self._changelog = open(self.changelog_path,'r').read() |
94 |
- return self._changelog |
95 |
+ return open(self.changelog_path,'r').read() |
96 |
|
97 |
|
98 |
class Ebuild(ToStrMixin): |
99 |
|
100 |
- __slots__ = ('package', 'ebuild', 'package_object') |
101 |
+ __slots__ = ('package', 'ebuild', 'package_object', '_cache') |
102 |
|
103 |
def __init__(self, package, ebuild): |
104 |
self.package = package |
105 |
self.ebuild = ebuild |
106 |
self.package_object = PackageInfo(ebuild) |
107 |
+ self._cache = {} |
108 |
|
109 |
@property |
110 |
def keywords_env(self): |
111 |
@@ -270,7 +283,7 @@ class Ebuild(ToStrMixin): |
112 |
return l |
113 |
|
114 |
#Could be faster |
115 |
- @property |
116 |
+ @cached_property |
117 |
def is_masked(self): |
118 |
return self.package_object.is_masked() |
119 |
|
120 |
@@ -290,22 +303,22 @@ class Ebuild(ToStrMixin): |
121 |
def ebuild_path(self): |
122 |
return self.package_object.ebuild_path() |
123 |
|
124 |
- homepage_val = property(_ebuild_environment('HOMEPAGE')) |
125 |
- license = property(_ebuild_environment('LICENSE')) |
126 |
- description = property(_ebuild_environment('DESCRIPTION')) |
127 |
- eapi = property(_ebuild_environment('EAPI')) |
128 |
- slot = property(_ebuild_environment('SLOT')) |
129 |
+ homepage_val = cached_property(_ebuild_environment('HOMEPAGE'), name = 'homepage_val') |
130 |
+ license = cached_property(_ebuild_environment('LICENSE'), name = 'license') |
131 |
+ description = cached_property(_ebuild_environment('DESCRIPTION'), name = 'description') |
132 |
+ eapi = cached_property(_ebuild_environment('EAPI'), name = 'eapi') |
133 |
+ slot = cached_property(_ebuild_environment('SLOT'), name = 'slot') |
134 |
|
135 |
- @property |
136 |
+ @cached_property |
137 |
def homepages(self): |
138 |
return self.homepage_val.split() |
139 |
|
140 |
- @property |
141 |
+ @cached_property |
142 |
def homepage(self): |
143 |
return self.homepages[0] if len(self.homepages)>=1 else '' |
144 |
|
145 |
|
146 |
- @property |
147 |
+ @cached_property |
148 |
def licenses(self): |
149 |
return filter(_license_filter, self.license.split()) |
150 |
|
151 |
@@ -313,8 +326,8 @@ class Ebuild(ToStrMixin): |
152 |
def ebuild_path(self): |
153 |
return self.package_object.ebuild_path() |
154 |
|
155 |
- sha1 = property(_file_hash("ebuild_path")) |
156 |
- mtime = property(_file_mtime("ebuild_path")) |
157 |
+ sha1 = cached_property(_file_hash("ebuild_path"), name = 'sha1') |
158 |
+ mtime = cached_property(_file_mtime("ebuild_path"), name = 'mtime') |
159 |
|
160 |
def __unicode__(self): |
161 |
return self.ebuild |