| @@ -42,6 +42,10 @@ class Group(Expando): | |||
| 'walk_resources_grouped_by_%s' % self.name, | |||
| Group.walk_resources, | |||
| group=self) | |||
| add_method(Resource, | |||
| 'walk_%s_groups' % self.name, | |||
| Group.walk_resource_groups, | |||
| group=self) | |||
| def set_expando(self, key, value): | |||
| """ | |||
| @@ -53,6 +57,23 @@ class Group(Expando): | |||
| else: | |||
| 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 | |||
| def walk_resources(node, group): | |||
| """ | |||
| @@ -75,6 +96,17 @@ class Group(Expando): | |||
| lister = g.walk_resources_in_node(node) | |||
| 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): | |||
| """ | |||
| 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.start = ['installation.html', 'overview.html', 'templating.html'] | |||
| self.plugins = ['plugins.html', 'tags.html'] | |||
| self.section = self.all | |||
| def tearDown(self): | |||
| 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()] | |||
| 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): | |||
| resources = [] | |||
| @@ -29,14 +29,20 @@ class TestLess(object): | |||
| def test_can_execute_less(self): | |||
| s = Site(TEST_SITE) | |||
| 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" | |||