Skip to content

Commit 8ba7ce5

Browse files
committed
Fix filter issues
- Filter inheritance from target should now work again, except for special edge cases around exports & the preprocessor. (Initial load of most pages has to be before instantiating the target, so filters from the target are not yet available.) - Filters are now applied in the order they are listed, by group: 1. global filters 2. target filters 3. page filters Duplicate filters are applied at most once, at their earliest listed timing.
1 parent 0918ca8 commit 8ba7ce5

File tree

3 files changed

+42
-14
lines changed

3 files changed

+42
-14
lines changed

dactyl/page.py

+24-10
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from dactyl.jinja_loaders import FrontMatterRemoteLoader, FrontMatterFSLoader
1717

1818
class DactylPage:
19-
def __init__(self, config, data, skip_pp=False):
19+
def __init__(self, config, data, skip_pp=False, more_filters=[]):
2020
self.config = config
2121
self.data = data
2222
self.rawtext = None
@@ -29,6 +29,7 @@ def __init__(self, config, data, skip_pp=False):
2929
self.html = None
3030
self.soup = None
3131

32+
self.gain_filters(more_filters)
3233
self.load_content()
3334
self.provide_default_filename()
3435
self.provide_name()
@@ -53,7 +54,7 @@ def undefined_or_ne(a,b):
5354
pp_env.tests["undefined_or_ne"] = undefined_or_ne
5455

5556
# Pull exported values (& functions) from page filters into the pp_env
56-
for filter_name in self.filters():
57+
for filter_name in self.filters(save=False):
5758
if filter_name not in self.config.filters.keys():
5859
logger.debug("Skipping unloaded filter '%s'" % filter_name)
5960
continue
@@ -508,22 +509,35 @@ def filepath(self, mode):
508509
# for pdf or html just use the html field as-is
509510
return self.data["html"]
510511

512+
def gain_filters(self, filterlist):
513+
"""
514+
Called by target to add its filters to this page's.
515+
"""
516+
if "filters" in self.data:
517+
self.data["filters"] = filterlist + self.data["filters"]
518+
else:
519+
self.data["filters"] = filterlist
511520

512-
def filters(self):
521+
def filters(self, save=True):
513522
"""
514523
Returns the names of filters to use when processing this page.
515524
"""
516525
if self.ffp:
517526
# Return saved results
518527
return self.ffp
519-
ffp = set(self.config["default_filters"])
520-
if "filters" in self.data:
521-
# self.data should already include filters inherited from target
522-
ffp.update(self.data["filters"])
523-
loaded_filters = set(self.config.filters.keys())
524-
ffp &= loaded_filters
528+
529+
# Create de-duplicated list of loaded filters only
530+
ffp = []
531+
for f in self.config["default_filters"]:
532+
if f not in ffp and f in self.config.filters:
533+
ffp.append(f)
534+
for f in self.data.get("filters", []) :
535+
if f not in ffp and f in self.config.filters:
536+
ffp.append(f)
537+
525538
logger.debug("...filters for page: %s"%ffp)
526-
self.ffp = ffp
539+
if save:
540+
self.ffp = ffp
527541
return ffp
528542

529543
def __repr__(self):

dactyl/target.py

+17-3
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,8 @@ def add_cover(self):
130130
coverpage_data = self.config["cover_page"]
131131
coverpage_data["targets"] = [self.name]
132132
skip_pp = self.config.get("skip_preprocessor", False)
133-
self.cover = DactylPage(self.config, coverpage_data, skip_pp)
133+
more_filters = self.data.get("filters", [])
134+
self.cover = DactylPage(self.config, coverpage_data, skip_pp, more_filters)
134135

135136
def default_pdf_name(self):
136137
"""Choose a reasonable name for a PDF file in case one isn't specified."""
@@ -155,6 +156,7 @@ def gain_fields(self, fields):
155156
if "display_name" in fields: # Exception to reserved key rule
156157
self.data["display_name"] = fields["display_name"]
157158

159+
158160
def expand_openapi_spec(self, page_data):
159161
"""Expand OpenAPI Spec placeholders into a full page list"""
160162
assert OPENAPI_SPEC_KEY in page_data.keys()
@@ -169,8 +171,16 @@ def expand_openapi_spec(self, page_data):
169171
swagger = ApiDef.from_path(page_data[OPENAPI_SPEC_KEY], api_slug,
170172
extra_fields, template_path)
171173
skip_pp = self.config.get("skip_preprocessor", False)
172-
return [DactylPage(self.config, p, skip_pp)
173-
for p in swagger.create_pagelist()]
174+
made_pages = []
175+
for p in swagger.create_pagelist():
176+
more_filters = self.data.get("filters", [])
177+
po = DactylPage(self.config, p, skip_pp, more_filters)
178+
# Special case for filters; concatenate filter lists,
179+
# with target's filters first.
180+
if "filters" in self.data:
181+
po.gain_filters(self.data["filters"])
182+
made_pages.append(po)
183+
return made_pages
174184

175185
def load_pages(self):
176186
"""
@@ -215,6 +225,10 @@ def load_pages(self):
215225
# then add it to the list
216226
else:
217227
merge_dicts(self.data, page_data, RESERVED_KEYS_TARGET)
228+
# Special case for filters; concatenate filter lists,
229+
# with target's filters first.
230+
if "filters" in self.data:
231+
page_candidate.gain_filters(self.data["filters"])
218232
pages.append(page_candidate)
219233

220234
# Check for pages that would overwrite each other

dactyl/version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '0.10.0-a120'
1+
__version__ = '0.10.0-a123'

0 commit comments

Comments
 (0)