From 42c27594abb5bc73530a390d184285e5b06132c3 Mon Sep 17 00:00:00 2001 From: Bryan Brattlof Date: Fri, 30 Nov 2018 14:23:14 -0600 Subject: [PATCH] Add relative_source_path attribute to content --- docs/themes.rst | 70 +++++++++++++++++++--------------- pelican/contents.py | 1 + pelican/tests/test_contents.py | 28 ++++++++++++++ 3 files changed, 68 insertions(+), 31 deletions(-) diff --git a/docs/themes.rst b/docs/themes.rst index 3e186ee2..dcd72d75 100644 --- a/docs/themes.rst +++ b/docs/themes.rst @@ -347,9 +347,9 @@ Article The string representation of an Article is the `source_path` attribute. -=================== =================================================== +====================== =================================================== Attribute Description -=================== =================================================== +====================== =================================================== author The :ref:`Author ` of this article. authors A list of :ref:`Authors ` @@ -368,6 +368,7 @@ metadata Article header metadata `dict`. save_as Location to save the article page. slug Page slug. source_path Full system path of the article source file. +relative_source_path Relative path from PATH_ to the article source file. status The article status, can be any of 'published' or 'draft'. summary Rendered summary content. @@ -378,7 +379,10 @@ title Title of the article. translations List of translations :ref:`Article ` objects. url URL to the article page. -=================== =================================================== +====================== =================================================== + +.. _PATH: settings.html#PATH + .. _object-author_cat_tag: @@ -406,34 +410,38 @@ Page The string representation of a Page is the `source_path` attribute. -=================== =================================================== -Attribute Description -=================== =================================================== -author The :ref:`Author ` of - this page. -content The rendered content of the page. -date Datetime object representing the page date. -date_format Either default date format or locale date format. -default_template Default template name. -in_default_lang Boolean representing if the article is written - in the default language. -lang Language of the article. -locale_date Date formatted by the `date_format`. -metadata Page header metadata `dict`. -save_as Location to save the page. -slug Page slug. -source_path Full system path of the page source file. -status The page status, can be any of 'published', 'hidden' or - 'draft'. -summary Rendered summary content. -tags List of :ref:`Tag ` - objects. -template Template name to use for rendering. -title Title of the page. -translations List of translations - :ref:`Article ` objects. -url URL to the page. -=================== =================================================== +===================== =================================================== +Attribute Description +===================== =================================================== +author The :ref:`Author ` of + this page. +content The rendered content of the page. +date Datetime object representing the page date. +date_format Either default date format or locale date format. +default_template Default template name. +in_default_lang Boolean representing if the article is written + in the default language. +lang Language of the article. +locale_date Date formatted by the `date_format`. +metadata Page header metadata `dict`. +save_as Location to save the page. +slug Page slug. +source_path Full system path of the page source file. +relative_source_path Relative path from PATH_ to the page source file. +status The page status, can be any of 'published', 'hidden' or + 'draft'. +summary Rendered summary content. +tags List of :ref:`Tag ` + objects. +template Template name to use for rendering. +title Title of the page. +translations List of translations + :ref:`Article ` objects. +url URL to the page. +===================== =================================================== + +.. _PATH: settings.html#PATH + Feeds ===== diff --git a/pelican/contents.py b/pelican/contents.py index ccd38fe0..235c814a 100644 --- a/pelican/contents.py +++ b/pelican/contents.py @@ -110,6 +110,7 @@ class Content(object): regex_subs=settings.get('SLUG_REGEX_SUBSTITUTIONS', [])) self.source_path = source_path + self.relative_source_path = self.get_relative_source_path() # manage the date format if not hasattr(self, 'date_format'): diff --git a/pelican/tests/test_contents.py b/pelican/tests/test_contents.py index de1edbc4..104bc889 100644 --- a/pelican/tests/test_contents.py +++ b/pelican/tests/test_contents.py @@ -146,6 +146,34 @@ class TestPage(LoggedTestCase): page = Page(**self.page_kwargs) self.assertEqual(page.save_as, "pages/foo-bar-fr.html") + def test_relative_source_path(self): + # 'relative_source_path' should be the relative path + # from 'PATH' to 'source_path' + page_kwargs = self._copy_page_kwargs() + + # If 'source_path' is None, 'relative_source_path' should + # also return None + page_kwargs['source_path'] = None + page = Page(**page_kwargs) + self.assertIsNone(page.relative_source_path) + + page_kwargs = self._copy_page_kwargs() + settings = get_settings() + full_path = page_kwargs['source_path'] + + settings['PATH'] = os.path.dirname(full_path) + page_kwargs['settings'] = settings + page = Page(**page_kwargs) + + # if 'source_path' is set, 'relative_source_path' should + # return the relative path from 'PATH' to 'source_path' + self.assertEqual( + page.relative_source_path, + os.path.relpath( + full_path, + os.path.dirname(full_path) + )) + def test_metadata_url_format(self): # Arbitrary metadata should be passed through url_format() page = Page(**self.page_kwargs)