Skip to content

Commit 0cbeb0b

Browse files
committed
refactor get_overrides() to have a simpler interface with consume_modules()
1 parent bd3a88e commit 0cbeb0b

File tree

4 files changed

+111
-71
lines changed

4 files changed

+111
-71
lines changed

docs/intro/overrides.rst

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -148,18 +148,18 @@ to see the other functionalities.
148148
rules = default_registry.get_overrides()
149149
150150
# Or, we could also filter out the rules by the module they were defined in
151-
rules = default_registry.get_overrides_from("my_project.page_objects")
151+
rules = default_registry.get_overrides(filters="my_project.page_objects")
152152
153153
print(len(rules)) # 3
154154
print(rules[0]) # OverrideRule(for_patterns=Patterns(include=['example.com'], exclude=[], priority=500), use=<class 'my_project.page_objects.ExampleProductPage'>, instead_of=<class 'my_project.page_objects.GenericProductPage'>, meta={})
155155
156156
.. note::
157157

158158
Notice in the code sample above where we could filter out the Override rules
159-
per module via :meth:`~.PageObjectRegistry.get_overrides_from`. This
160-
could also offer another alternative way to organize your Page Object rules
161-
using only the ``default_registry``. There's no need to declare multiple
162-
:class:`~.PageObjectRegistry` instances and use multiple annotations.
159+
per module via the ``filters`` param. This could also offer another alternative
160+
way to organize your Page Object rules using only the ``default_registry``.
161+
There's no need to declare multiple :class:`~.PageObjectRegistry` instances
162+
and use multiple annotations.
163163

164164
.. warning::
165165

@@ -182,8 +182,12 @@ to see the other functionalities.
182182
consume_modules("external_package_A.po", "another_ext_package.lib")
183183
rules = default_registry.get_overrides()
184184
185-
**NOTE**: :func:`~.web_poet.overrides.consume_modules` must be called before
186-
:meth:`~.PageObjectRegistry.get_overrides` for the imports to properly load.
185+
# Fortunately, `get_overrides()` provides a shortcut for the lines above:
186+
rules = default_registry.get_overrides(consume=["external_package_A.po", "another_ext_package.lib"])
187+
188+
**NOTE**: :func:`~.web_poet.overrides.consume_modules` or the ``consume`` param
189+
of :meth:`~.PageObjectRegistry.get_overrides` for the imports to properly load.
190+
Most especially if you intend to use Page Objects from externally imported packages.
187191

188192

189193
A handy CLI tool is also available at your disposal to quickly see the available
@@ -254,16 +258,16 @@ Then we could easily retrieve all Page Objects per subpackage or module like thi
254258
from web_poet import default_registry, consume_modules
255259
256260
# We can do it per website.
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")
261+
rules_gadget = default_registry.get_overrides(filters="my_page_obj_project.cool_gadget_site")
262+
rules_furniture = default_registry.get_overrides(filters="my_page_obj_project.furniture_site")
259263
260264
# It can also drill down to the country domains on a given site.
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")
265+
rules_gadget_us = default_registry.get_overrides(filters="my_page_obj_project.cool_gadget_site.us")
266+
rules_gadget_fr = default_registry.get_overrides(filters="my_page_obj_project.cool_gadget_site.fr")
263267
264268
# Or even drill down further to the specific module.
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")
269+
rules_gadget_us_products = default_registry.get_overrides(filters="my_page_obj_project.cool_gadget_site.us.products")
270+
rules_gadget_us_listings = default_registry.get_overrides(filters="my_page_obj_project.cool_gadget_site.us.product_listings")
267271
268272
# Or simply all of the Override rules ever declared.
269273
rules = default_registry.get_overrides()
@@ -273,11 +277,16 @@ Then we could easily retrieve all Page Objects per subpackage or module like thi
273277
consume_modules("external_package_A.po", "another_ext_package.lib")
274278
rules = default_registry.get_overrides()
275279
280+
# Remember, a shortcut for consuming imports would be:
281+
rules = default_registry.get_overrides(consume=["external_package_A.po", "another_ext_package.lib"])
282+
283+
276284
.. warning::
277285

278286
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.
287+
or the ``consume`` param of :meth:`~.PageObjectRegistry.get_overrides` for the
288+
imports to properly load. Most especially if you intend to use Page Objects
289+
from externally imported packages.
281290

282291
This enables the :meth:`~.PageObjectRegistry.handle_urls` that annotates
283292
the external Page Objects to be properly loadeded.
@@ -301,9 +310,9 @@ hierarchy** like this:
301310
├── furniture_shop_products.py
302311
└── furniture_shop_product_listings.py
303312
304-
As such, calling ``default_registry.get_overrides_from()`` would not work
305-
on projects with a **flat hierarchy**. Thus, we can organize them using our own
306-
instances of the :class:`~.PageObjectRegistry` instead:
313+
As such, calling ``default_registry.get_overrides()`` with a ``from`` parameter
314+
would not effectively work on projects with a **flat hierarchy**. Thus, we can
315+
organize them using our own instances of the :class:`~.PageObjectRegistry` instead:
307316

308317
.. code-block:: python
309318
@@ -385,10 +394,12 @@ retrieve such rules would be:
385394
386395
from web_poet import default_registry
387396
388-
product_listing_rules = default_registry.get_overrrides_from(
389-
"my_page_obj_project.cool_gadget_site.us.product_listings",
390-
"my_page_obj_project.cool_gadget_site.fr.product_listings",
391-
"my_page_obj_project.furniture_shop.product_listings"
397+
product_listing_rules = default_registry.get_overrrides(
398+
filters=[
399+
"my_page_obj_project.cool_gadget_site.us.product_listings",
400+
"my_page_obj_project.cool_gadget_site.fr.product_listings",
401+
"my_page_obj_project.furniture_shop.product_listings",
402+
]
392403
)
393404
394405
On the other hand, we can also create another :class:`~.PageObjectRegistry` instance
@@ -431,7 +442,7 @@ Retrieving all of the Product Listing Override rules would simply be:
431442
rules = product_listings_registry.get_overrides()
432443
433444
# We can also filter it down further on a per site basis if needed.
434-
rules = product_listings_registry.get_overrides_from("my_page_obj_project.cool_gadget_site")
445+
rules = product_listings_registry.get_overrides(filters="my_page_obj_project.cool_gadget_site")
435446
436447
Using Overrides from External Packages
437448
--------------------------------------
@@ -461,6 +472,9 @@ packages** in your project, you can do it like:
461472
import gadget_sites_page_objects
462473
from web_poet import PageObjectRegistry, consume_modules, default_registry
463474
475+
# We're using `consume_modules()` here instead of the `consume` param of
476+
# `PageObjectRegistry.get_overrides()` since we need to access the `data`
477+
# attribute of the registry even before calling `PageObjectRegistry.get_overrides()`
464478
consume_modules("ecommerce_page_objects", "gadget_sites_page_objects")
465479
466480
combined_registry = PageObjectRegistry()

tests/test_overrides.py

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@
22
from url_matcher import Patterns
33

44
from tests.po_lib_sub import POLibSub
5-
from tests.po_lib import POTopLevel1, POTopLevel2, POTopLevelOverriden2, secondary_registry
5+
from tests.po_lib import (
6+
POTopLevel1,
7+
POTopLevel2,
8+
POTopLevelOverriden2,
9+
secondary_registry,
10+
)
611
from tests.po_lib.a_module import POModule
712
from tests.po_lib.nested_package import PONestedPkg
813
from tests.po_lib.nested_package.a_nested_module import (
914
PONestedModule,
1015
PONestedModuleOverridenSecondary,
1116
)
12-
from web_poet import consume_modules
1317
from web_poet.overrides import PageObjectRegistry, default_registry
1418

1519

@@ -40,19 +44,18 @@ def test_list_page_objects_all():
4044
assert rule.meta == rule.use.expected_meta, rule.use
4145

4246

43-
def test_list_page_objects_all_consume_modules():
47+
def test_list_page_objects_all_consume():
4448
"""A test similar to the one above but calls ``consume_modules()`` to properly
4549
load the @handle_urls annotations from other modules/packages.
4650
"""
47-
consume_modules("tests_extra")
48-
rules = default_registry.get_overrides()
51+
rules = default_registry.get_overrides(consume="tests_extra")
4952
page_objects = {po.use for po in rules}
5053
assert any(["po_lib_sub_not_imported" in po.__module__ for po in page_objects])
5154

5255

5356
def test_list_page_objects_from_pkg():
5457
"""Tests that metadata is extracted properly from the po_lib package"""
55-
rules = default_registry.get_overrides_from("tests.po_lib")
58+
rules = default_registry.get_overrides(filters="tests.po_lib")
5659
page_objects = {po.use for po in rules}
5760

5861
# Ensure that the "tests.po_lib", which imports another module named
@@ -68,17 +71,20 @@ def test_list_page_objects_from_pkg():
6871

6972

7073
def test_list_page_objects_from_single():
71-
rules = default_registry.get_overrides_from("tests.po_lib.a_module")
74+
rules = default_registry.get_overrides(filters="tests.po_lib.a_module")
7275
assert len(rules) == 1
7376
rule = rules[0]
7477
assert rule.use == POModule
7578
assert rule.for_patterns == POModule.expected_patterns
7679
assert rule.instead_of == POModule.expected_overrides
7780

81+
7882
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"
83+
rules = default_registry.get_overrides(
84+
filters=[
85+
"tests.po_lib.a_module",
86+
"tests.po_lib.nested_package.a_nested_module",
87+
]
8288
)
8389
assert len(rules) == 2
8490

@@ -92,22 +98,22 @@ def test_list_page_objects_from_multiple():
9298

9399

94100
def test_list_page_objects_from_empty_module():
95-
rules = default_registry.get_overrides_from("tests.po_lib.an_empty_module")
101+
rules = default_registry.get_overrides(filters="tests.po_lib.an_empty_module")
96102
assert len(rules) == 0
97103

98104

99105
def test_list_page_objects_from_empty_pkg():
100-
rules = default_registry.get_overrides_from("tests.po_lib.an_empty_package")
106+
rules = default_registry.get_overrides(filters="tests.po_lib.an_empty_package")
101107
assert len(rules) == 0
102108

103109

104110
def test_list_page_objects_from_unknown_module():
105111
with pytest.raises(ImportError):
106-
default_registry.get_overrides_from("tests.po_lib.unknown_module")
112+
default_registry.get_overrides(filters="tests.po_lib.unknown_module")
107113

108114

109115
def test_list_page_objects_from_imported_registry():
110-
rules = secondary_registry.get_overrides_from("tests.po_lib")
116+
rules = secondary_registry.get_overrides(filters="tests.po_lib")
111117
assert len(rules) == 2
112118
rule_for = {po.use: po for po in rules}
113119

@@ -119,13 +125,15 @@ def test_list_page_objects_from_imported_registry():
119125
assert pones.for_patterns == Patterns(["example.com"])
120126
assert pones.instead_of == PONestedModuleOverridenSecondary
121127

128+
122129
def test_registry_data_from():
123130
data = default_registry.data_from("tests.po_lib.nested_package")
124131

125132
assert len(data) == 2
126133
assert PONestedModule in data
127134
assert PONestedPkg in data
128135

136+
129137
def test_cmd():
130138
from web_poet.__main__ import main
131139

web_poet/__main__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def main(args=None):
4242
rule.for_patterns.priority,
4343
rule.meta,
4444
)
45-
for rule in default_registry.get_overrides_from(args.module)
45+
for rule in default_registry.get_overrides(filters=args.module)
4646
]
4747
print(tabulate.tabulate(table, headers="firstrow"))
4848

0 commit comments

Comments
 (0)