Skip to content

Commit 3b05c07

Browse files
committed
update get_overrides_from to accept an arbitrary number of str inputs
1 parent daa3ff9 commit 3b05c07

File tree

3 files changed

+39
-17
lines changed

3 files changed

+39
-17
lines changed

docs/intro/overrides.rst

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -254,16 +254,16 @@ Then we could easily retrieve all Page Objects per subpackage or module like thi
254254
from web_poet import default_registry, consume_modules
255255
256256
# We can do it per website.
257-
rules = default_registry.get_overrides_from("my_page_obj_project.cool_gadget_site")
258-
rules = default_registry.get_overrides_from("my_page_obj_project.furniture_site")
257+
rules_gadget = default_registry.get_overrides_from("my_page_obj_project.cool_gadget_site")
258+
rules_furniture = default_registry.get_overrides_from("my_page_obj_project.furniture_site")
259259
260260
# It can also drill down to the country domains on a given site.
261-
rules = default_registry.get_overrides_from("my_page_obj_project.cool_gadget_site.us")
262-
rules = default_registry.get_overrides_from("my_page_obj_project.cool_gadget_site.fr")
261+
rules_gadget_us = default_registry.get_overrides_from("my_page_obj_project.cool_gadget_site.us")
262+
rules_gadget_fr = default_registry.get_overrides_from("my_page_obj_project.cool_gadget_site.fr")
263263
264264
# Or even drill down further to the specific module.
265-
rules = default_registry.get_overrides_from("my_page_obj_project.cool_gadget_site.us.products")
266-
rules = default_registry.get_overrides_from("my_page_obj_project.cool_gadget_site.us.product_listings")
265+
rules_gadget_us_products = default_registry.get_overrides_from("my_page_obj_project.cool_gadget_site.us.products")
266+
rules_gadget_us_listings = default_registry.get_overrides_from("my_page_obj_project.cool_gadget_site.us.product_listings")
267267
268268
# Or simply all of the Override rules ever declared.
269269
rules = default_registry.get_overrides()
@@ -273,6 +273,12 @@ Then we could easily retrieve all Page Objects per subpackage or module like thi
273273
consume_modules("external_package_A.po", "another_ext_package.lib")
274274
rules = default_registry.get_overrides()
275275
276+
.. warning::
277+
278+
Remember to consider calling :func:`~.web_poet.overrides.consume_modules`
279+
when using :meth:`~.PageObjectRegistry.get_overrides` in case you have some
280+
external package containing Page Objects of interest.
281+
276282
Multiple Registry Approach
277283
~~~~~~~~~~~~~~~~~~~~~~~~~~
278284

@@ -376,11 +382,11 @@ retrieve such rules would be:
376382
377383
from web_poet import default_registry
378384
379-
product_listing_rules = [
380-
default_registry.get_overrides_from("my_page_obj_project.cool_gadget_site.us.product_listings")
381-
+ default_registry.get_overrides_from("my_page_obj_project.cool_gadget_site.fr.product_listings")
382-
+ default_registry.get_overrides_from("my_page_obj_project.furniture_shop.product_listings")
383-
]
385+
product_listing_rules = default_registry.get_overrrides_from(
386+
"my_page_obj_project.cool_gadget_site.us.product_listings",
387+
"my_page_obj_project.cool_gadget_site.fr.product_listings",
388+
"my_page_obj_project.furniture_shop.product_listings"
389+
)
384390
385391
On the other hand, we can also create another :class:`~.PageObjectRegistry` instance
386392
that we'll be using aside from the ``default_registry`` to help us better organize

tests/test_overrides.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,29 @@ def test_list_page_objects_from_pkg():
6767
assert rule.meta == rule.use.expected_meta, rule.use
6868

6969

70-
def test_list_page_objects_from_module():
70+
def test_list_page_objects_from_single():
7171
rules = default_registry.get_overrides_from("tests.po_lib.a_module")
7272
assert len(rules) == 1
7373
rule = rules[0]
7474
assert rule.use == POModule
7575
assert rule.for_patterns == POModule.expected_patterns
7676
assert rule.instead_of == POModule.expected_overrides
7777

78+
def test_list_page_objects_from_multiple():
79+
rules = default_registry.get_overrides_from(
80+
"tests.po_lib.a_module",
81+
"tests.po_lib.nested_package.a_nested_module"
82+
)
83+
assert len(rules) == 2
84+
85+
assert rules[0].use == POModule
86+
assert rules[0].for_patterns == POModule.expected_patterns
87+
assert rules[0].instead_of == POModule.expected_overrides
88+
89+
assert rules[1].use == PONestedModule
90+
assert rules[1].for_patterns == PONestedModule.expected_patterns
91+
assert rules[1].instead_of == PONestedModule.expected_overrides
92+
7893

7994
def test_list_page_objects_from_empty_module():
8095
rules = default_registry.get_overrides_from("tests.po_lib.an_empty_module")

web_poet/overrides.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,18 +157,19 @@ def get_overrides(self) -> List[OverrideRule]:
157157
"""Returns all override rules that were declared using ``@handle_urls``."""
158158
return list(self.data.values())
159159

160-
def get_overrides_from(self, module: str) -> List[OverrideRule]:
160+
def get_overrides_from(self, *pkgs_or_modules: str) -> List[OverrideRule]:
161161
"""Returns the override rules that were declared using ``@handle_urls``
162-
in a specific module.
162+
in a specific modules/packages.
163163
164164
This is useful if you've organized your Page Objects into multiple
165165
submodules in your project as you can filter them easily.
166166
"""
167+
# Dict ensures that no duplicates are collected and returned.
167168
rules: Dict[Callable, OverrideRule] = {}
168169

169-
for mod in walk_module(module):
170-
# Dict ensures that no duplicates are collected and returned.
171-
rules.update(self._filter_from_module(mod.__name__))
170+
for item in pkgs_or_modules:
171+
for mod in walk_module(item):
172+
rules.update(self._filter_from_module(mod.__name__))
172173

173174
return list(rules.values())
174175

0 commit comments

Comments
 (0)