click-extended 1.0.5__tar.gz → 1.0.7__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 (158) hide show
  1. {click_extended-1.0.5/click_extended.egg-info → click_extended-1.0.7}/PKG-INFO +1 -1
  2. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/nodes/child_validation_node.py +13 -0
  3. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/nodes/validation_node.py +13 -0
  4. click_extended-1.0.7/click_extended/decorators/check/regex.py +65 -0
  5. {click_extended-1.0.5 → click_extended-1.0.7/click_extended.egg-info}/PKG-INFO +1 -1
  6. {click_extended-1.0.5 → click_extended-1.0.7}/pyproject.toml +1 -1
  7. click_extended-1.0.5/click_extended/decorators/check/regex.py +0 -47
  8. {click_extended-1.0.5 → click_extended-1.0.7}/AUTHORS.md +0 -0
  9. {click_extended-1.0.5 → click_extended-1.0.7}/LICENSE +0 -0
  10. {click_extended-1.0.5 → click_extended-1.0.7}/README.md +0 -0
  11. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/__init__.py +0 -0
  12. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/classes.py +0 -0
  13. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/__init__.py +0 -0
  14. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/decorators/__init__.py +0 -0
  15. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/decorators/argument.py +0 -0
  16. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/decorators/command.py +0 -0
  17. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/decorators/context.py +0 -0
  18. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/decorators/env.py +0 -0
  19. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/decorators/group.py +0 -0
  20. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/decorators/option.py +0 -0
  21. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/decorators/prompt.py +0 -0
  22. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/decorators/selection.py +0 -0
  23. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/decorators/tag.py +0 -0
  24. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/nodes/__init__.py +0 -0
  25. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/nodes/_root_node.py +0 -0
  26. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/nodes/argument_node.py +0 -0
  27. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/nodes/child_node.py +0 -0
  28. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/nodes/node.py +0 -0
  29. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/nodes/option_node.py +0 -0
  30. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/nodes/parent_node.py +0 -0
  31. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/other/__init__.py +0 -0
  32. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/other/_click_command.py +0 -0
  33. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/other/_click_group.py +0 -0
  34. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/other/_tree.py +0 -0
  35. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/other/context.py +0 -0
  36. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/core/other/get_context.py +0 -0
  37. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/__init__.py +0 -0
  38. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/__init__.py +0 -0
  39. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/conflicts.py +0 -0
  40. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/contains.py +0 -0
  41. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/dependencies.py +0 -0
  42. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/divisible_by.py +0 -0
  43. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/ends_with.py +0 -0
  44. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/exclusive.py +0 -0
  45. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/falsy.py +0 -0
  46. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/is_email.py +0 -0
  47. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/is_hex_color.py +0 -0
  48. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/is_hostname.py +0 -0
  49. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/is_ipv4.py +0 -0
  50. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/is_ipv6.py +0 -0
  51. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/is_json.py +0 -0
  52. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/is_mac_address.py +0 -0
  53. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/is_negative.py +0 -0
  54. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/is_non_zero.py +0 -0
  55. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/is_port.py +0 -0
  56. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/is_positive.py +0 -0
  57. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/is_url.py +0 -0
  58. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/is_uuid.py +0 -0
  59. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/length.py +0 -0
  60. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/not_empty.py +0 -0
  61. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/requires.py +0 -0
  62. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/starts_with.py +0 -0
  63. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/check/truthy.py +0 -0
  64. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/compare/__init__.py +0 -0
  65. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/compare/at_least.py +0 -0
  66. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/compare/at_most.py +0 -0
  67. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/compare/between.py +0 -0
  68. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/compare/greater_than.py +0 -0
  69. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/compare/less_than.py +0 -0
  70. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/convert/__init__.py +0 -0
  71. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/convert/convert_angle.py +0 -0
  72. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/convert/convert_area.py +0 -0
  73. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/convert/convert_bits.py +0 -0
  74. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/convert/convert_distance.py +0 -0
  75. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/convert/convert_energy.py +0 -0
  76. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/convert/convert_power.py +0 -0
  77. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/convert/convert_pressure.py +0 -0
  78. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/convert/convert_speed.py +0 -0
  79. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/convert/convert_temperature.py +0 -0
  80. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/convert/convert_time.py +0 -0
  81. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/convert/convert_volume.py +0 -0
  82. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/convert/convert_weight.py +0 -0
  83. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/load/__init__.py +0 -0
  84. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/load/load_csv.py +0 -0
  85. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/load/load_json.py +0 -0
  86. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/load/load_toml.py +0 -0
  87. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/load/load_yaml.py +0 -0
  88. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/__init__.py +0 -0
  89. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/absolute.py +0 -0
  90. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/add.py +0 -0
  91. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/ceil.py +0 -0
  92. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/clamp.py +0 -0
  93. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/divide.py +0 -0
  94. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/floor.py +0 -0
  95. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/maximum.py +0 -0
  96. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/minimum.py +0 -0
  97. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/modulo.py +0 -0
  98. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/multiply.py +0 -0
  99. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/normalize.py +0 -0
  100. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/power.py +0 -0
  101. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/rounded.py +0 -0
  102. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/sqrt.py +0 -0
  103. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/subtract.py +0 -0
  104. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/math/to_percent.py +0 -0
  105. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/misc/__init__.py +0 -0
  106. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/misc/choice.py +0 -0
  107. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/misc/confirm_if.py +0 -0
  108. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/misc/default.py +0 -0
  109. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/misc/deprecated.py +0 -0
  110. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/misc/experimental.py +0 -0
  111. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/misc/now.py +0 -0
  112. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/random/__init__.py +0 -0
  113. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/random/random_bool.py +0 -0
  114. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/random/random_choice.py +0 -0
  115. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/random/random_datetime.py +0 -0
  116. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/random/random_float.py +0 -0
  117. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/random/random_integer.py +0 -0
  118. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/random/random_prime.py +0 -0
  119. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/random/random_string.py +0 -0
  120. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/random/random_uuid.py +0 -0
  121. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/__init__.py +0 -0
  122. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/add_prefix.py +0 -0
  123. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/add_suffix.py +0 -0
  124. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/apply.py +0 -0
  125. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/basename.py +0 -0
  126. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/dirname.py +0 -0
  127. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/expand_vars.py +0 -0
  128. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/remove_prefix.py +0 -0
  129. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/remove_suffix.py +0 -0
  130. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/replace.py +0 -0
  131. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/slugify.py +0 -0
  132. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/split.py +0 -0
  133. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/strip.py +0 -0
  134. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/to_case.py +0 -0
  135. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/to_date.py +0 -0
  136. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/to_datetime.py +0 -0
  137. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/to_path.py +0 -0
  138. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/to_time.py +0 -0
  139. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/to_timestamp.py +0 -0
  140. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/decorators/transform/truncate.py +0 -0
  141. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/errors.py +0 -0
  142. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/types.py +0 -0
  143. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/utils/__init__.py +0 -0
  144. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/utils/casing.py +0 -0
  145. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/utils/checks.py +0 -0
  146. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/utils/dispatch.py +0 -0
  147. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/utils/format.py +0 -0
  148. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/utils/humanize.py +0 -0
  149. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/utils/naming.py +0 -0
  150. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/utils/process.py +0 -0
  151. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/utils/selection.py +0 -0
  152. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended/utils/time.py +0 -0
  153. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended.egg-info/SOURCES.txt +0 -0
  154. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended.egg-info/dependency_links.txt +0 -0
  155. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended.egg-info/requires.txt +0 -0
  156. {click_extended-1.0.5 → click_extended-1.0.7}/click_extended.egg-info/top_level.txt +0 -0
  157. {click_extended-1.0.5 → click_extended-1.0.7}/setup.cfg +0 -0
  158. {click_extended-1.0.5 → click_extended-1.0.7}/tests/test_lifecycle.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: click_extended
3
- Version: 1.0.5
3
+ Version: 1.0.7
4
4
  Summary: An extension to Click with additional features like automatic async support, aliasing and a modular decorator system.
5
5
  Author-email: Marcus Fredriksson <marcus@marcusfredriksson.com>
6
6
  License: MIT License
@@ -3,6 +3,7 @@ Child validation node module for nodes that can
3
3
  act as both child and validation nodes.
4
4
  """
5
5
 
6
+ import asyncio
6
7
  from abc import ABC
7
8
  from functools import wraps
8
9
  from typing import TYPE_CHECKING, Any, Callable, ParamSpec, TypeVar
@@ -88,8 +89,20 @@ class ChildValidationNode(ChildNode, ValidationNode, ABC):
88
89
  instance = cls(name=name, process_args=args, process_kwargs=kwargs)
89
90
  Tree.queue_child_validation(instance)
90
91
 
92
+ if asyncio.iscoroutinefunction(func):
93
+
94
+ @wraps(func)
95
+ async def async_wrapper(
96
+ *call_args: P.args, **call_kwargs: P.kwargs
97
+ ) -> T:
98
+ """Async wrapper that preserves the original function."""
99
+ return await func(*call_args, **call_kwargs) # type: ignore
100
+
101
+ return async_wrapper # type: ignore
102
+
91
103
  @wraps(func)
92
104
  def wrapper(*call_args: P.args, **call_kwargs: P.kwargs) -> T:
105
+ """Wrapper that preserves the original function."""
93
106
  return func(*call_args, **call_kwargs)
94
107
 
95
108
  return wrapper
@@ -1,5 +1,6 @@
1
1
  """ValidationNode class for global validation logic."""
2
2
 
3
+ import asyncio
3
4
  from abc import ABC
4
5
  from functools import wraps
5
6
  from typing import TYPE_CHECKING, Any, Callable, ParamSpec, TypeVar
@@ -111,6 +112,18 @@ class ValidationNode(Node, ABC):
111
112
  instance = cls(name=name, process_args=args, process_kwargs=kwargs)
112
113
  Tree.queue_validation(instance)
113
114
 
115
+ if asyncio.iscoroutinefunction(func):
116
+
117
+ @wraps(func)
118
+ async def async_wrapper(
119
+ *call_args: P.args,
120
+ **call_kwargs: P.kwargs,
121
+ ) -> T:
122
+ """Async wrapper that preserves the original function."""
123
+ return await func(*call_args, **call_kwargs) # type: ignore
124
+
125
+ return async_wrapper # type: ignore
126
+
114
127
  @wraps(func)
115
128
  def wrapper(*call_args: P.args, **call_kwargs: P.kwargs) -> T:
116
129
  """Wrapper that preserves the original function."""
@@ -0,0 +1,65 @@
1
+ """Check if a value matches a regex pattern."""
2
+
3
+ import re
4
+ from typing import Any, Union
5
+
6
+ from click_extended.core.nodes.child_node import ChildNode
7
+ from click_extended.core.other.context import Context
8
+ from click_extended.types import Decorator
9
+
10
+
11
+ class Regex(ChildNode):
12
+ """Check if a value matches a regex pattern."""
13
+
14
+ def handle_str(
15
+ self,
16
+ value: str,
17
+ context: Context,
18
+ *args: Any,
19
+ **kwargs: Any,
20
+ ) -> Any:
21
+ patterns: tuple[Union[str, re.Pattern[str]], ...] = kwargs["patterns"]
22
+ flags: int = kwargs.get("flags", 0)
23
+
24
+ for pattern in patterns:
25
+ compiled_pattern: re.Pattern[str]
26
+ if isinstance(pattern, re.Pattern):
27
+ compiled_pattern = pattern
28
+ else:
29
+ compiled_pattern = re.compile(pattern, flags)
30
+
31
+ if compiled_pattern.fullmatch(value):
32
+ return value
33
+
34
+ pattern_strs: list[str] = [
35
+ p.pattern if isinstance(p, re.Pattern) else p for p in patterns
36
+ ]
37
+ raise ValueError(
38
+ f"Value '{value}' does not match any "
39
+ + f"of the patterns: {pattern_strs}"
40
+ )
41
+
42
+
43
+ def regex(*patterns: Union[str, re.Pattern[str]], flags: int = 0) -> Decorator:
44
+ """
45
+ Check if a value matches a regex pattern.
46
+
47
+ Type: `ChildNode`
48
+
49
+ Supports: `str`
50
+
51
+ Args:
52
+ *patterns (Union[str, Pattern[str]]):
53
+ The regex patterns to check against. Can be strings or compiled
54
+ Pattern objects. If strings are provided, they will be compiled
55
+ with the specified flags.
56
+ flags (int):
57
+ Regex flags to use when compiling string patterns (e.g.,
58
+ re.IGNORECASE, re.MULTILINE). Ignored for pre-compiled patterns.
59
+ Default is 0 (no flags).
60
+
61
+ Returns:
62
+ Decorator:
63
+ The decorated function.
64
+ """
65
+ return Regex.as_decorator(patterns=patterns, flags=flags)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: click_extended
3
- Version: 1.0.5
3
+ Version: 1.0.7
4
4
  Summary: An extension to Click with additional features like automatic async support, aliasing and a modular decorator system.
5
5
  Author-email: Marcus Fredriksson <marcus@marcusfredriksson.com>
6
6
  License: MIT License
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "click_extended"
3
- version = "1.0.5"
3
+ version = "1.0.7"
4
4
  description = "An extension to Click with additional features like automatic async support, aliasing and a modular decorator system."
5
5
  authors = [
6
6
  { name = "Marcus Fredriksson", email = "marcus@marcusfredriksson.com" },
@@ -1,47 +0,0 @@
1
- """Check if a value matches a regex pattern."""
2
-
3
- import re
4
- from typing import Any
5
-
6
- from click_extended.core.nodes.child_node import ChildNode
7
- from click_extended.core.other.context import Context
8
- from click_extended.types import Decorator
9
-
10
-
11
- class Regex(ChildNode):
12
- """Check if a value matches a regex pattern."""
13
-
14
- def handle_str(
15
- self,
16
- value: str,
17
- context: Context,
18
- *args: Any,
19
- **kwargs: Any,
20
- ) -> Any:
21
- patterns = kwargs["patterns"]
22
- for pattern in patterns:
23
- if re.fullmatch(pattern, value):
24
- return value
25
-
26
- raise ValueError(
27
- f"Value '{value}' does not match any of the patterns: {patterns}"
28
- )
29
-
30
-
31
- def regex(*patterns: str) -> Decorator:
32
- """
33
- Check if a value matches a regex pattern.
34
-
35
- Type: `ChildNode`
36
-
37
- Supports: `str`
38
-
39
- Args:
40
- *patterns (str):
41
- The regex patterns to check against.
42
-
43
- Returns:
44
- Decorator:
45
- The decorated function.
46
- """
47
- return Regex.as_decorator(patterns=patterns)
File without changes
File without changes
File without changes