manen 0.3.0.dev4__tar.gz → 0.3.0.dev5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/PKG-INFO +1 -1
  2. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/user_guide/page_object_model.ipynb +9 -1
  3. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/manen/__init__.py +1 -1
  4. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/manen/page_object_model/config.py +19 -3
  5. manen-0.3.0.dev5/manen/page_object_model/exceptions.py +21 -0
  6. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/.github/workflows/build-documentation.yml +0 -0
  7. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/.github/workflows/deploy-package.yml +0 -0
  8. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/.github/workflows/test-package.yml +0 -0
  9. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/.gitignore +0 -0
  10. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/.rstcheck.cfg +0 -0
  11. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/LICENSE +0 -0
  12. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/README.md +0 -0
  13. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/Makefile +0 -0
  14. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/assets/screenshot_pypi_home.png +0 -0
  15. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/assets/screenshot_pypi_search_results.png +0 -0
  16. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/make.bat +0 -0
  17. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/_static/favicon.png +0 -0
  18. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/_static/manen_logo.png +0 -0
  19. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/_static/manen_logo_xs.png +0 -0
  20. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/_static/theme_override.css +0 -0
  21. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/about.rst +0 -0
  22. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/changelog.rst +0 -0
  23. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/conf.py +0 -0
  24. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/contributing.rst +0 -0
  25. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/index.rst +0 -0
  26. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/installation.rst +0 -0
  27. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/manen/manen.browser.rst +0 -0
  28. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/manen/manen.exceptions.rst +0 -0
  29. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/manen/manen.finder.rst +0 -0
  30. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/manen/manen.helpers.rst +0 -0
  31. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/manen/manen.page_object_model.config.rst +0 -0
  32. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/manen/manen.page_object_model.dom.rst +0 -0
  33. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/manen/manen.page_object_model.element.rst +0 -0
  34. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/manen/manen.page_object_model.rst +0 -0
  35. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/manen/manen.page_object_model.webarea.rst +0 -0
  36. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/manen/manen.rst +0 -0
  37. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/user_guide/browser.ipynb +0 -0
  38. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/user_guide/dom_exploration.ipynb +0 -0
  39. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/docs/source/user_guide.rst +0 -0
  40. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/manen/browser.py +0 -0
  41. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/manen/exceptions.py +0 -0
  42. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/manen/finder.py +0 -0
  43. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/manen/helpers.py +0 -0
  44. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/manen/page_object_model/__init__.py +0 -0
  45. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/manen/page_object_model/dom.py +0 -0
  46. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/manen/page_object_model/element.py +0 -0
  47. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/manen/page_object_model/webarea.py +0 -0
  48. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/manen/typing.py +0 -0
  49. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/pyproject.toml +0 -0
  50. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/requirements-dev.lock +0 -0
  51. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/requirements.lock +0 -0
  52. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/tests/__init__.py +0 -0
  53. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/tests/assets/page.yaml +0 -0
  54. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/tests/assets/page_test_basic.jinja.html +0 -0
  55. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/tests/test_finder.py +0 -0
  56. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/tests/test_helpers.py +0 -0
  57. {manen-0.3.0.dev4 → manen-0.3.0.dev5}/tests/test_imports.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: manen
3
- Version: 0.3.0.dev4
3
+ Version: 0.3.0.dev5
4
4
  Summary: An implementation of the Page Object Model design pattern, and other utilities for web scraping and automation.
5
5
  Project-URL: Changes, https://kodaho.github.io/manen/changelog.html
6
6
  Project-URL: Documentation, https://kodaho.github.io/manen/
@@ -538,7 +538,7 @@
538
538
  " Wait(5),\n",
539
539
  " ]\n",
540
540
  "\n",
541
- " dont_exist: Annotated[str, CSS('i-dont-exist'), Default(None)]\n",
541
+ " dont_exist: Annotated[str | None, CSS('i-dont-exist'), Default(None)]\n",
542
542
  "\n",
543
543
  "page = SearchResultPage(driver)"
544
544
  ]
@@ -553,6 +553,14 @@
553
553
  "assert page.dont_exist is None"
554
554
  ]
555
555
  },
556
+ {
557
+ "cell_type": "markdown",
558
+ "id": "fb45e6e5",
559
+ "metadata": {},
560
+ "source": [
561
+ "Note that when using a default value, the type specified in the annotation should be coherent with the default value, with the restriction that only not-None type is allowed. For example, you can't have something like `Annotated[int | str, CSS('i-dont-exist'), Default('not here')]`."
562
+ ]
563
+ },
556
564
  {
557
565
  "cell_type": "markdown",
558
566
  "id": "53a197b2-4723-41a8-a4a5-582614a25440",
@@ -17,4 +17,4 @@ use the module :py:mod:`~manen.finder` without :py:mod:`~manen.browser` or
17
17
  :py:mod:`~manen.page_object_model` without :py:mod:`~manen.browser`.
18
18
  """
19
19
 
20
- __version__ = "0.3.0.dev4"
20
+ __version__ = "0.3.0.dev5"
@@ -1,7 +1,9 @@
1
1
  from dataclasses import dataclass
2
- from typing import Any, get_origin
2
+ from types import NoneType, UnionType
3
+ from typing import Any, get_args, get_origin
3
4
 
4
5
  from manen.page_object_model.dom import Flag
6
+ from manen.page_object_model.exceptions import SelectorConfigError, TypeConfigError
5
7
 
6
8
  __all__ = ("CSS", "Default", "LinkText", "PartialLinkText", "Wait", "XPath")
7
9
 
@@ -85,8 +87,22 @@ class Config:
85
87
  def from_annotation_item(cls, field, annotation):
86
88
  origin = get_origin(type_ := annotation.__origin__)
87
89
  kwargs = {"name": field}
90
+
88
91
  if origin is list:
89
- kwargs.update({"element_type": type_.__args__[0], "many": True})
92
+ kwargs.update({"element_type": get_args(type_)[0], "many": True})
93
+
94
+ elif origin is UnionType:
95
+ args = [arg for arg in get_args(type_) if arg is not NoneType]
96
+ if len(args) != 1:
97
+ raise TypeConfigError(field, args)
98
+ kwargs.update({"element_type": args[0], "many": False})
99
+
90
100
  else:
91
101
  kwargs.update({"element_type": type_, "many": False})
92
- return cls.merge(annotation.__metadata__, **kwargs)
102
+
103
+ config = cls.merge(annotation.__metadata__, **kwargs)
104
+
105
+ if len(config.selectors) == 0:
106
+ raise SelectorConfigError(field)
107
+
108
+ return config
@@ -0,0 +1,21 @@
1
+ from manen.exceptions import ManenException
2
+
3
+
4
+ class TypeConfigError(TypeError, ManenException):
5
+ def __init__(self, field, types):
6
+ self.field = field
7
+ self.types = types
8
+
9
+ def __str__(self):
10
+ return (
11
+ f"Field '{self.field}' should have exactly one non-None type in its annotation, but "
12
+ f"get {self.types}"
13
+ )
14
+
15
+
16
+ class SelectorConfigError(ValueError, ManenException):
17
+ def __init__(self, field):
18
+ self.field = field
19
+
20
+ def __str__(self):
21
+ return f"At least one selector should be specified in the annotation of '{self.field}'"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes