root / trunk / yui / components.py

Revision 258, 2.4 kB (checked in by akaihola, 8 weeks ago)

[yui] Added support for optional modules. Improved error handling.

  • Property svn:eol-style set to native
Line 
1class ComponentAdapter:
2
3    def __init__(self, components, name, data):
4        self.components = components
5        self.name = name
6        self.data = data
7
8    @property
9    def optional(self):
10        return self.data.get('optional', [])
11
12    @property
13    def supersedes(self):
14        return self.data.get('supersedes', [])
15
16    @property
17    def requires(self):
18        r = self.data.get('requires', [])
19
20        if self.type != 'js' \
21        or self.name == 'yahoo' \
22        or 'yahoo' in self.supersedes \
23        or 'yahoo' in r:
24            return r
25        else:
26            return ['yahoo'] + r
27
28    @property
29    def after(self):
30        if self.type == 'css':
31            return self.data.get('after', [])
32        elif self.type == 'js':
33            return self.data.get('after', []) + \
34                   self.components.get_css_components()
35
36    @property
37    def rollup(self):
38        return self.data.get('rollup', 1)
39
40    @property
41    def skinnable(self):
42        return self.data.get('skinnable', False)
43
44    @property
45    def fullpath(self):
46        return self.data.get('fullpath', None)
47
48    def __getattr__(self, attname):
49        return self.data[attname]
50
51
52class Components(dict):
53    def __init__(self, components_dict):
54        super(Components, self).__init__()
55        self.rollup_mapping = {}
56        for component_name, data in components_dict.items():
57            self.add(component_name, data)
58
59    def __getitem__(self, component_name):
60        data = super(Components, self).__getitem__(component_name)
61        return ComponentAdapter(self, component_name, data)
62
63    def get_rollups(self, component_name):
64        return self.rollup_mapping[component_name]
65
66    def get_all_rollups(self, component_name):
67        rollups = self.get_rollups(component_name)
68        for superseded in self[component_name].supersedes:
69            rollups.update(self.get_all_rollups(superseded))
70        return rollups
71
72    def get_css_components(self):
73        return [name for name, data in self.items()
74                if data['type'] == 'css']
75
76    def add(self, component_name, data):
77        self[component_name] = data
78        self.rollup_mapping.setdefault(component_name, set())
79        if 'rollup' not in data:
80            return
81        for rolled_up in data['supersedes']:
82            self.rollup_mapping.setdefault(rolled_up, set()).add(
83                component_name)
Note: See TracBrowser for help on using the browser.