Skip to content

Commit 46d40e7

Browse files
committed
refactor by removing the need for find_page_object_overrides()
1 parent 0a0ee12 commit 46d40e7

File tree

8 files changed

+122
-145
lines changed

8 files changed

+122
-145
lines changed

CHANGELOG.rst

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ Changelog
55
TBR
66
------------------
77

8-
* ``handle_urls`` decorator and ``find_page_object_overrides`` function added.
9-
* new CLI tool for displaying all available Page Objects: ``web_poet <path>``
8+
* added a ``PageObjectRegistry`` class which has the ``handle_urls`` decorator
9+
to write override rules.
10+
* new CLI tool for displaying all available Page Objects: ``web_poet <module>``
1011
* removed support for Python 3.6
1112
* added support for Python 3.10
1213

docs/intro/overrides.rst

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,16 +96,19 @@ Viewing all available Overrides
9696

9797
A convenience function is available discover and retrieve all rules from your
9898
project. Make sure to check out :ref:`Overrides API section <api-overrides>`
99-
to see the other functionalities of ``find_page_object_overrides``.
99+
to see the other functionalities.
100100

101101
.. code-block::
102102
103-
from web_poet import find_page_object_overrides
103+
from web_poet import default_registry
104104
105-
rules = find_page_object_overrides("my_project.page_objects")
105+
# Retrieves all rules that were registered in the registry
106+
rules = default_registry.get_overrides()
106107
107-
print(len(rules)) # 3
108+
# Or, we could also filter out the rules by the module they were defined in
109+
rules = default_registry.get_overrides_from_module("my_project.page_objects")
108110
111+
print(len(rules)) # 3
109112
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={})
110113
111114

tests/po_lib/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from url_matcher import Patterns
77

8+
from .. import po_sub_lib # NOTE: this module contains a PO with @handle_rules
89
from web_poet import handle_urls, PageObjectRegistry
910

1011

@@ -22,7 +23,7 @@ class POTopLevelOverriden2:
2223
...
2324

2425

25-
secondary_registry = PageObjectRegistry(name="secondary")
26+
secondary_registry = PageObjectRegistry()
2627

2728

2829
# This first annotation is ignored. A single annotation per registry is allowed

tests/po_sub_lib/__init__.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
"""This package is being used by tests/po_lib to validate some behaviors on
2+
external depedencies.
3+
"""
4+
from typing import Dict, Any, Callable
5+
6+
from url_matcher import Patterns
7+
8+
from web_poet import handle_urls
9+
10+
11+
class POBase:
12+
expected_overrides: Callable
13+
expected_patterns: Patterns
14+
expected_meta: Dict[str, Any]
15+
16+
17+
class POSubLibOverriden:
18+
...
19+
20+
21+
@handle_urls("sub_example.com", POSubLibOverriden)
22+
class POSubLib(POBase):
23+
expected_overrides = POSubLibOverriden
24+
expected_patterns = Patterns(["sub_example.com"])
25+
expected_meta = {} # type: ignore

tests/test_overrides.py

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,53 @@
11
import pytest
22
from url_matcher import Patterns
33

4-
from tests.po_lib import POTopLevel1, POTopLevel2, POTopLevelOverriden2
4+
from tests.po_sub_lib import POSubLib
5+
from tests.po_lib import POTopLevel1, POTopLevel2, POTopLevelOverriden2, secondary_registry
56
from tests.po_lib.a_module import POModule
67
from tests.po_lib.nested_package import PONestedPkg
78
from tests.po_lib.nested_package.a_nested_module import (
89
PONestedModule,
910
PONestedModuleOverridenSecondary,
1011
)
11-
from web_poet.overrides import find_page_object_overrides, PageObjectRegistry
12+
from web_poet.overrides import PageObjectRegistry, default_registry
1213

1314

1415
POS = {POTopLevel1, POTopLevel2, POModule, PONestedPkg, PONestedModule}
1516

1617

18+
def test_list_page_objects_all():
19+
rules = default_registry.get_overrides()
20+
21+
page_objects = {po.use for po in rules}
22+
23+
# Ensure that ALL Override Rules are returned as long as the given
24+
# registry's @handle_urls annotation was used.
25+
assert page_objects == POS.union({POSubLib})
26+
for rule in rules:
27+
assert rule.instead_of == rule.use.expected_overrides, rule.use
28+
assert rule.for_patterns == rule.use.expected_patterns, rule.use
29+
assert rule.meta == rule.use.expected_meta, rule.use
30+
31+
1732
def test_list_page_objects_from_pkg():
1833
"""Tests that metadata is extracted properly from the po_lib package"""
19-
rules = find_page_object_overrides("tests.po_lib")
20-
assert {po.use for po in rules} == POS
34+
rules = default_registry.get_overrides_from_module("tests.po_lib")
35+
page_objects = {po.use for po in rules}
36+
37+
# Ensure that the "tests.po_lib", which imports another module named
38+
# "tests.po_sub_lib" which contains @handle_urls decorators, does not
39+
# retrieve the override rules from the external package.
40+
assert POSubLib not in page_objects
2141

42+
assert page_objects == POS
2243
for rule in rules:
2344
assert rule.instead_of == rule.use.expected_overrides, rule.use
2445
assert rule.for_patterns == rule.use.expected_patterns, rule.use
2546
assert rule.meta == rule.use.expected_meta, rule.use
2647

2748

2849
def test_list_page_objects_from_module():
29-
rules = find_page_object_overrides("tests.po_lib.a_module")
50+
rules = default_registry.get_overrides_from_module("tests.po_lib.a_module")
3051
assert len(rules) == 1
3152
rule = rules[0]
3253
assert rule.use == POModule
@@ -35,22 +56,22 @@ def test_list_page_objects_from_module():
3556

3657

3758
def test_list_page_objects_from_empty_module():
38-
rules = find_page_object_overrides("tests.po_lib.an_empty_module")
59+
rules = default_registry.get_overrides_from_module("tests.po_lib.an_empty_module")
3960
assert len(rules) == 0
4061

4162

4263
def test_list_page_objects_from_empty_pkg():
43-
rules = find_page_object_overrides("tests.po_lib.an_empty_package")
64+
rules = default_registry.get_overrides_from_module("tests.po_lib.an_empty_package")
4465
assert len(rules) == 0
4566

4667

4768
def test_list_page_objects_from_unknown_module():
4869
with pytest.raises(ImportError):
49-
find_page_object_overrides("tests.po_lib.unknown_module")
70+
default_registry.get_overrides_from_module("tests.po_lib.unknown_module")
5071

5172

5273
def test_list_page_objects_from_imported_registry():
53-
rules = find_page_object_overrides("tests.po_lib", registry_name="secondary")
74+
rules = secondary_registry.get_overrides_from_module("tests.po_lib")
5475
assert len(rules) == 2
5576
rule_for = {po.use: po for po in rules}
5677

@@ -63,16 +84,7 @@ def test_list_page_objects_from_imported_registry():
6384
assert pones.instead_of == PONestedModuleOverridenSecondary
6485

6586

66-
def test_list_page_objects_from_non_existing_registry():
67-
assert find_page_object_overrides("tests.po_lib", registry_name="not-exist") == []
68-
69-
7087
def test_cmd():
7188
from web_poet.__main__ import main
7289

7390
assert main(["tests.po_lib"]) is None
74-
75-
76-
def test_registry_repr():
77-
registry = PageObjectRegistry(name="test")
78-
assert "name='test'" in str(registry)

web_poet/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
from .pages import WebPage, ItemPage, ItemWebPage, Injectable
22
from .page_inputs import ResponseData
3-
from .overrides import handle_urls, find_page_object_overrides, PageObjectRegistry
3+
from .overrides import handle_urls, PageObjectRegistry, default_registry

web_poet/__main__.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
"""Returns all Override Rules from the default registry."""
2+
13
import argparse
24
from typing import Callable
35

46
import tabulate
57

6-
from web_poet.overrides import find_page_object_overrides
8+
from web_poet import default_registry
79

810

911
def qualified_name(cls: Callable) -> str:
@@ -20,14 +22,6 @@ def main(args=None):
2022
type=str,
2123
help="A package or module to list overrides from",
2224
)
23-
parser.add_argument(
24-
"--registry",
25-
"-n",
26-
metavar="REGISTRY_NAME",
27-
type=str,
28-
help="Registry name to list overrides from",
29-
default="default",
30-
)
3125
args = parser.parse_args(args)
3226
table = [
3327
(
@@ -48,7 +42,7 @@ def main(args=None):
4842
rule.for_patterns.priority,
4943
rule.meta,
5044
)
51-
for rule in find_page_object_overrides(args.module, registry_name=args.registry)
45+
for rule in default_registry.get_overrides_from_module(args.module)
5246
]
5347
print(tabulate.tabulate(table, headers="firstrow"))
5448

0 commit comments

Comments
 (0)