Gentoo Archives: gentoo-commits

From: Slava Bacherikov <slava@××××××××××××××.ua>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/libs/
Date: Tue, 05 Jun 2012 15:50:06
Message-Id: 1338899240.5b7efed420bdcf338f5743614bcd1ebfc3a4bc4f.bacher09@gentoo
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