Skip to content

Commit

Permalink
[py] optimised PrintOptions object in common/print_page_options.py
Browse files Browse the repository at this point in the history
  • Loading branch information
sandeepsuryaprasad committed Jun 16, 2023
1 parent fc58eac commit 4ddaf51
Showing 1 changed file with 71 additions and 191 deletions.
262 changes: 71 additions & 191 deletions py/selenium/webdriver/common/print_page_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,229 +59,109 @@ class _PrintOpts(TypedDict, total=False):
_MarginOpts = _PageOpts = _PrintOpts = Dict[str, Any]


class PrintOptions:
ORIENTATION_VALUES = ["portrait", "landscape"]

def __init__(self) -> None:
self._print_options: _PrintOpts = {}
self._page: _PageOpts = {}
self._margin: _MarginOpts = {}

def to_dict(self) -> _PrintOpts:
"""
:Returns: A hash of print options configured
"""
return self._print_options

@property
def orientation(self) -> Optional[Orientation]:
"""
:Returns: Orientation that was set for the page
"""
return self._print_options.get("orientation", None)

@orientation.setter
def orientation(self, value: Orientation) -> None:
"""
Allows you to set orientation of the page
:Args:
- value: Either portrait or landscape
"""
if value not in self.ORIENTATION_VALUES:
raise ValueError(f"Orientation value must be one of {self.ORIENTATION_VALUES}")
class PageSettings:
"""PageSettings descriptor which validates 'height' and 'width' of page."""

self._print_options["orientation"] = value
def __init__(self, name):
self.name = name

@property
def scale(self) -> Optional[float]:
"""
:Returns: Scale that was set for the page
"""
return self._print_options.get("scale", None)
def __get__(self, obj, cls) -> Optional[float]:
return obj._page.get(self.name, None)

@scale.setter
def scale(self, value: float) -> None:
"""
Allows you to to set scale for the page
:Args:
- value: integer or float between 0.1 and 2
"""
self.__validate_num_property("Scale", value)
def __set__(self, obj, value) -> None:
getattr(obj, "_validate_num_property")(self.name, value)
obj._page[self.name] = value
obj._print_options["page"] = obj._page

if value < 0.1 or value > 2:
raise ValueError("Scale value should be between 0.1 and 2")

self._print_options["scale"] = value
class MarginSettings:
"""MarginSettings descriptor which validates below attributes.
@property
def background(self) -> Optional[bool]:
"""
:Returns: Background value that was set
"""
return self._print_options.get("background", None)
- top
- bottom
- left
- right margins
"""

@background.setter
def background(self, value: bool) -> None:
"""
Allows you to set the boolean value for the background
:Args:
- value: Boolean
"""
if not isinstance(value, bool):
raise ValueError("Set background value should be a boolean")
self._print_options["background"] = value
def __init__(self, name):
self.name = name

@property
def page_width(self) -> Optional[float]:
"""
:Returns: Page width that was set
"""
return self._page.get("width", None)
def __get__(self, obj, cls) -> Optional[float]:
return obj._margin.get(self.name, None)

@page_width.setter
def page_width(self, value: float) -> None:
"""
Allows you to set width of the page
:Args:
- value: A positive integer or float
"""
self.__validate_num_property("Page Width", value)
def __set__(self, obj, value) -> None:
getattr(obj, "_validate_num_property")(f"Margin {self.name}", value)
obj._margin[self.name] = value
obj._print_options["margin"] = obj._margin

self._page["width"] = value
self._print_options["page"] = self._page

@property
def page_height(self) -> Optional[float]:
"""
:Returns: Page height that was set
"""
return self._page.get("height", None)
class Scale:
"""Scale descriptor which validates scale."""

@page_height.setter
def page_height(self, value: float) -> None:
"""
Allows you to set height of the page
:Args:
- value: A positive integer or float
"""
self.__validate_num_property("Page Height", value)
def __init__(self, name):
self.name = name

self._page["height"] = value
self._print_options["page"] = self._page
def __get__(self, obj, cls) -> Optional[float]:
return obj._print_options.get(self.name)

@property
def margin_top(self) -> Optional[float]:
"""
:Returns: Top margin of the page
"""
return self._margin.get("top", None)
def __set__(self, obj, value) -> None:
getattr(obj, "_validate_num_property")(self.name, value)
if value < 0.1 or value > 2:
raise ValueError("Value of scale should be between 0.1 and 2")
obj._print_options[self.name] = value

@margin_top.setter
def margin_top(self, value: float) -> None:
"""
Allows you to set top margin of the page
:Args:
- value: A positive integer or float
"""
self.__validate_num_property("Margin top", value)

self._margin["top"] = value
self._print_options["margin"] = self._margin
class PageOrientation:
"""PageOrientation descriptor which validates orientation of page."""

@property
def margin_left(self) -> Optional[float]:
"""
:Returns: Left margin of the page
"""
return self._margin.get("left", None)
ORIENTATION_VALUES = ["portrait", "landscape"]

@margin_left.setter
def margin_left(self, value: float) -> None:
"""
Allows you to set left margin of the page
:Args:
- value: A positive integer or float
"""
self.__validate_num_property("Margin left", value)
def __init__(self, name):
self.name = name

self._margin["left"] = value
self._print_options["margin"] = self._margin
def __get__(self, obj, cls) -> Optional[Orientation]:
return obj._print_options.get(self.name, None)

@property
def margin_bottom(self) -> Optional[float]:
"""
:Returns: Bottom margin of the page
"""
return self._margin.get("bottom", None)
def __set__(self, obj, value) -> None:
if value not in self.ORIENTATION_VALUES:
raise ValueError(f"Orientation value must be one of {self.ORIENTATION_VALUES}")
obj._print_options[self.name] = value

@margin_bottom.setter
def margin_bottom(self, value: float) -> None:
"""
Allows you to set bottom margin of the page
:Args:
- value: A positive integer or float
"""
self.__validate_num_property("Margin bottom", value)

self._margin["bottom"] = value
self._print_options["margin"] = self._margin
class ValidateType:
"""descriptor which validates type of below attributes.
@property
def margin_right(self) -> Optional[float]:
"""
:Returns: Right margin of the page
"""
return self._margin.get("right", None)
- background
- shrink_to_fit
- page_ranges
"""

@margin_right.setter
def margin_right(self, value: float) -> None:
"""
Allows you to set right margin of the page
:Args:
- value: A positive integer or float
"""
self.__validate_num_property("Margin right", value)
def __init__(self, name, expected_type):
self.name = name
self.expected_type = expected_type

self._margin["right"] = value
self._print_options["margin"] = self._margin
def __get__(self, obj, cls):
return obj._print_options.get(self.name, None)

@property
def shrink_to_fit(self) -> Optional[bool]:
"""
:Returns: Value set for shrinkToFit
"""
return self._print_options.get("shrinkToFit", None)
def __set__(self, obj, value) -> None:
if not isinstance(value, self.expected_type):
raise ValueError(f"{self.name} should be of type {self.expected_type}")
obj._print_options[self.name] = value

@shrink_to_fit.setter
def shrink_to_fit(self, value: bool) -> None:
"""
Allows you to set shrinkToFit
:Args:
- value: Boolean
"""
if not isinstance(value, bool):
raise ValueError("Set shrink to fit value should be a boolean")
self._print_options["shrinkToFit"] = value

@property
def page_ranges(self) -> Optional[List[str]]:
"""
:Returns: value set for pageRanges
"""
return self._print_options.get("pageRanges", None)
class PrintOptions:
def __init__(self) -> None:
self._print_options: _PrintOpts = {}
self._page: _PageOpts = {}
self._margin: _MarginOpts = {}

@page_ranges.setter
def page_ranges(self, value: List[str]) -> None:
def to_dict(self) -> _PrintOpts:
"""
Allows you to set pageRanges for the print command
:Args:
- value: A list of page ranges. Eg: ['1-2']
:Returns: A hash of print options configured
"""
if not isinstance(value, list):
raise ValueError("Page ranges should be a list")
self._print_options["pageRanges"] = value
return self._print_options

def __validate_num_property(self, property_name: str, value: float) -> None:
def _validate_num_property(self, property_name: str, value: float) -> None:
"""Helper function to validate some of the properties."""
if not isinstance(value, (int, float)):
raise ValueError(f"{property_name} should be an integer or a float")
Expand Down

0 comments on commit 4ddaf51

Please sign in to comment.