| @@ -42,6 +42,10 @@ class Group(Expando): | |||||
| 'walk_resources_grouped_by_%s' % self.name, | 'walk_resources_grouped_by_%s' % self.name, | ||||
| Group.walk_resources, | Group.walk_resources, | ||||
| group=self) | group=self) | ||||
| add_method(Resource, | |||||
| 'walk_%s_groups' % self.name, | |||||
| Group.walk_resource_groups, | |||||
| group=self) | |||||
| def set_expando(self, key, value): | def set_expando(self, key, value): | ||||
| """ | """ | ||||
| @@ -53,6 +57,23 @@ class Group(Expando): | |||||
| else: | else: | ||||
| return super(Group, self).set_expando(key, value) | return super(Group, self).set_expando(key, value) | ||||
| @staticmethod | |||||
| def walk_resource_groups(resource, group): | |||||
| """ | |||||
| This method gets attached to the resource object. | |||||
| Returns group and its ancestors that the resource | |||||
| belongs to, in that order. | |||||
| """ | |||||
| try: | |||||
| group_name = getattr(resource.meta, group.root.name) | |||||
| except AttributeError: | |||||
| group_name = None | |||||
| if group_name: | |||||
| for g in group.walk_groups(): | |||||
| if g.name == group_name: | |||||
| return reversed(list(g.walk_hierarchy())) | |||||
| return [] | |||||
| @staticmethod | @staticmethod | ||||
| def walk_resources(node, group): | def walk_resources(node, group): | ||||
| """ | """ | ||||
| @@ -75,6 +96,17 @@ class Group(Expando): | |||||
| lister = g.walk_resources_in_node(node) | lister = g.walk_resources_in_node(node) | ||||
| yield Grouper(group=g, resources=lister) | yield Grouper(group=g, resources=lister) | ||||
| def walk_hierarchy(self): | |||||
| """ | |||||
| Walks the group hierarchy starting from | |||||
| this group. | |||||
| """ | |||||
| g = self | |||||
| yield g | |||||
| while g.parent: | |||||
| yield g.parent | |||||
| g = g.parent | |||||
| def walk_groups(self): | def walk_groups(self): | ||||
| """ | """ | ||||
| Walks the groups in the current group | Walks the groups in the current group | ||||
| @@ -61,6 +61,7 @@ class TestGrouperSingleLevel(object): | |||||
| self.all = ['installation.html', 'overview.html', 'templating.html', 'plugins.html', 'tags.html'] | self.all = ['installation.html', 'overview.html', 'templating.html', 'plugins.html', 'tags.html'] | ||||
| self.start = ['installation.html', 'overview.html', 'templating.html'] | self.start = ['installation.html', 'overview.html', 'templating.html'] | ||||
| self.plugins = ['plugins.html', 'tags.html'] | self.plugins = ['plugins.html', 'tags.html'] | ||||
| self.section = self.all | |||||
| def tearDown(self): | def tearDown(self): | ||||
| TEST_SITE.delete() | TEST_SITE.delete() | ||||
| @@ -129,6 +130,17 @@ class TestGrouperSingleLevel(object): | |||||
| plugin_resources = [resource.name for resource in self.s.content.walk_resources_grouped_by_plugins()] | plugin_resources = [resource.name for resource in self.s.content.walk_resources_grouped_by_plugins()] | ||||
| assert plugin_resources == self.plugins | assert plugin_resources == self.plugins | ||||
| def test_resource_belongs_to(self): | |||||
| groups = dict([(g.name, g) for g in self.s.grouper['section'].groups]) | |||||
| for name, group in groups.items(): | |||||
| pages = getattr(self, name) | |||||
| for page in pages: | |||||
| res = self.s.content.resource_from_relative_path('blog/' + page) | |||||
| res_groups = getattr(res, 'walk_%s_groups' % name)() | |||||
| assert group in res_groups | |||||
| def test_prev_next(self): | def test_prev_next(self): | ||||
| resources = [] | resources = [] | ||||
| @@ -29,14 +29,20 @@ class TestLess(object): | |||||
| def test_can_execute_less(self): | def test_can_execute_less(self): | ||||
| s = Site(TEST_SITE) | s = Site(TEST_SITE) | ||||
| s.config.plugins = ['hyde.ext.plugins.less.LessCSSPlugin'] | s.config.plugins = ['hyde.ext.plugins.less.LessCSSPlugin'] | ||||
| s.config.less = Expando(dict(app='/usr/local/share/npm/bin/lessc')) | |||||
| source = TEST_SITE.child('content/media/css/site.less') | |||||
| target = File(Folder(s.config.deploy_root_path).child('media/css/site.css')) | |||||
| gen = Generator(s) | |||||
| gen.generate_resource_at_path(source) | |||||
| assert target.exists | |||||
| text = target.read_all() | |||||
| expected_text = File(LESS_SOURCE.child('expected-site.css')).read_all() | |||||
| assert text == expected_text | |||||
| less_paths = ['/usr/local/share/npm/bin/lessc', '~/local/bin/lessc'] | |||||
| for path in less_paths: | |||||
| if File(path).exists: | |||||
| s.config.less = Expando(dict(app=path)) | |||||
| source = TEST_SITE.child('content/media/css/site.less') | |||||
| target = File(Folder(s.config.deploy_root_path).child('media/css/site.css')) | |||||
| gen = Generator(s) | |||||
| gen.generate_resource_at_path(source) | |||||
| assert target.exists | |||||
| text = target.read_all() | |||||
| expected_text = File(LESS_SOURCE.child('expected-site.css')).read_all() | |||||
| assert text == expected_text | |||||
| return | |||||
| assert "Cannot find the less css executable" | |||||