diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 9db8c8c..6674270 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,3 +1,8 @@ +Version 0.8.5a2 +============================================================ + +* Modified combined plugin to support relative paths and recursion. (Issue #108) + Version 0.8.5a1 ============================================================ diff --git a/README.rst b/README.rst index df09ff1..b903d94 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -Version 0.8.5a1 +Version 0.8.5a2 A brand new **hyde** ==================== diff --git a/hyde/ext/plugins/combine.py b/hyde/ext/plugins/combine.py index 6c9ef64..d80d0f0 100644 --- a/hyde/ext/plugins/combine.py +++ b/hyde/ext/plugins/combine.py @@ -7,12 +7,15 @@ from fnmatch import fnmatch from hyde.model import Expando from hyde.plugin import Plugin +import operator class CombinePlugin(Plugin): """ To use this combine, the following configuration should be added to meta data:: combine: + root: content/media #Optional. Path must be relative to content folder - default current folder + recurse: true #Optional. Default false. files: - ns1.*.js - ns2.*.js @@ -45,17 +48,28 @@ class CombinePlugin(Plugin): files = [ files ] # Grab resources to combine - resources = [] - for r in resource.node.resources: - for f in files: - if fnmatch(r.name, f): - resources.append(r) - break + + # select site root + try: + root = self.site.content.node_from_relative_path(resource.meta.combine.root) + except AttributeError: + root = resource.node + + # select walker + try: + recurse = resource.meta.combine.recurse + except AttributeError: + recurse = False + + walker = root.walk_resources() if recurse else root.resources + + resources = [r for r in walker if any(fnmatch(r.name, f) for f in files)] + if not resources: self.logger.debug("No resources to combine for [%s]" % resource) return [] - return sorted(resources, key=lambda r: r.name) + return sorted(resources, key=operator.attrgetter('name')) def begin_site(self): """ @@ -105,4 +119,4 @@ class CombinePlugin(Plugin): if where == "top": return "".join([r.source.read_all() for r in resources] + [text]) else: - return "".join([text] + [r.source.read_all() for r in resources]) + return "".join([text] + [r.source.read_all() for r in resources]) \ No newline at end of file diff --git a/hyde/site.py b/hyde/site.py index ccd0ef6..1dc31c9 100644 --- a/hyde/site.py +++ b/hyde/site.py @@ -457,4 +457,4 @@ class Site(object): Given the relative path, determines if it is content or media. """ folder = self.content.source.child_folder(path) - return folder.is_descendant_of(self.config.media_root_path) + return folder.is_descendant_of(self.config.media_root_path) \ No newline at end of file diff --git a/hyde/tests/ext/test_combine.py b/hyde/tests/ext/test_combine.py index 20da2fd..4bee815 100644 --- a/hyde/tests/ext/test_combine.py +++ b/hyde/tests/ext/test_combine.py @@ -12,19 +12,7 @@ from hyde.site import Site COMBINE_SOURCE = File(__file__).parent.child_folder('combine') TEST_SITE = File(__file__).parent.parent.child_folder('_test') - -class TestCombine(object): - - def setUp(self): - TEST_SITE.make() - TEST_SITE.parent.child_folder( - 'sites/test_jinja').copy_contents_to(TEST_SITE) - TEST_SITE.child_folder('content/media/js').make() - COMBINE_SOURCE.copy_contents_to(TEST_SITE.child('content/media/js')) - - def tearDown(self): - TEST_SITE.delete() - +class CombineTester(object): def _test_combine(self, content): s = Site(TEST_SITE) s.config.plugins = [ @@ -41,6 +29,18 @@ class TestCombine(object): text = target.read_all() return text, s +class TestCombine(CombineTester): + + def setUp(self): + TEST_SITE.make() + TEST_SITE.parent.child_folder( + 'sites/test_jinja').copy_contents_to(TEST_SITE) + TEST_SITE.child_folder('content/media/js').make() + COMBINE_SOURCE.copy_contents_to(TEST_SITE.child('content/media/js')) + + def tearDown(self): + TEST_SITE.delete() + def test_combine_top(self): text, _ = self._test_combine(""" --- @@ -88,3 +88,40 @@ First line""") for i in range(1,4): assert not File(Folder(s.config.deploy_root_path). child('media/js/script.%d.js' % i)).exists + + +class TestCombinePaths(CombineTester): + + def setUp(self): + TEST_SITE.make() + TEST_SITE.parent.child_folder( + 'sites/test_jinja').copy_contents_to(TEST_SITE) + TEST_SITE.child_folder('content/media/js').make() + JS = TEST_SITE.child_folder('content/scripts').make() + S1 = JS.child_folder('s1').make() + S2 = JS.child_folder('s2').make() + S3 = JS.child_folder('s3').make() + File(COMBINE_SOURCE.child('script.1.js')).copy_to(S1) + File(COMBINE_SOURCE.child('script.2.js')).copy_to(S2) + File(COMBINE_SOURCE.child('script.3.js')).copy_to(S3) + + def tearDown(self): + TEST_SITE.delete() + + def test_combine_top(self): + text, _ = self._test_combine(""" +--- +combine: + root: scripts + recurse: true + files: script.*.js + where: top +--- + +Last line""") + print text + assert text == """var a = 1 + 2; +var b = a + 3; +var c = a + 5; +Last line""" + return diff --git a/hyde/version.py b/hyde/version.py index db82e6d..485de3a 100644 --- a/hyde/version.py +++ b/hyde/version.py @@ -3,4 +3,4 @@ Handles hyde version TODO: Use fabric like versioning scheme """ -__version__ = '0.8.5a1' +__version__ = '0.8.5a2'