fabricatio 0.3.14.dev4__cp313-cp313-manylinux_2_34_x86_64.whl

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 (64) hide show
  1. fabricatio/__init__.py +29 -0
  2. fabricatio/actions/__init__.py +1 -0
  3. fabricatio/actions/article.py +319 -0
  4. fabricatio/actions/article_rag.py +416 -0
  5. fabricatio/actions/fs.py +25 -0
  6. fabricatio/actions/output.py +248 -0
  7. fabricatio/actions/rag.py +96 -0
  8. fabricatio/actions/rules.py +83 -0
  9. fabricatio/capabilities/__init__.py +1 -0
  10. fabricatio/capabilities/advanced_judge.py +20 -0
  11. fabricatio/capabilities/advanced_rag.py +61 -0
  12. fabricatio/capabilities/censor.py +105 -0
  13. fabricatio/capabilities/check.py +212 -0
  14. fabricatio/capabilities/correct.py +228 -0
  15. fabricatio/capabilities/extract.py +74 -0
  16. fabricatio/capabilities/persist.py +103 -0
  17. fabricatio/capabilities/propose.py +65 -0
  18. fabricatio/capabilities/rag.py +263 -0
  19. fabricatio/capabilities/rating.py +404 -0
  20. fabricatio/capabilities/review.py +114 -0
  21. fabricatio/capabilities/task.py +113 -0
  22. fabricatio/decorators.py +251 -0
  23. fabricatio/emitter.py +177 -0
  24. fabricatio/fs/__init__.py +35 -0
  25. fabricatio/fs/curd.py +153 -0
  26. fabricatio/fs/readers.py +61 -0
  27. fabricatio/journal.py +12 -0
  28. fabricatio/models/action.py +263 -0
  29. fabricatio/models/adv_kwargs_types.py +63 -0
  30. fabricatio/models/extra/__init__.py +1 -0
  31. fabricatio/models/extra/advanced_judge.py +32 -0
  32. fabricatio/models/extra/aricle_rag.py +284 -0
  33. fabricatio/models/extra/article_base.py +422 -0
  34. fabricatio/models/extra/article_essence.py +101 -0
  35. fabricatio/models/extra/article_main.py +285 -0
  36. fabricatio/models/extra/article_outline.py +46 -0
  37. fabricatio/models/extra/article_proposal.py +52 -0
  38. fabricatio/models/extra/patches.py +20 -0
  39. fabricatio/models/extra/problem.py +165 -0
  40. fabricatio/models/extra/rag.py +98 -0
  41. fabricatio/models/extra/rule.py +52 -0
  42. fabricatio/models/generic.py +812 -0
  43. fabricatio/models/kwargs_types.py +121 -0
  44. fabricatio/models/role.py +95 -0
  45. fabricatio/models/task.py +310 -0
  46. fabricatio/models/tool.py +328 -0
  47. fabricatio/models/usages.py +791 -0
  48. fabricatio/parser.py +114 -0
  49. fabricatio/py.typed +0 -0
  50. fabricatio/rust.cpython-313-x86_64-linux-gnu.so +0 -0
  51. fabricatio/rust.pyi +846 -0
  52. fabricatio/toolboxes/__init__.py +15 -0
  53. fabricatio/toolboxes/arithmetic.py +62 -0
  54. fabricatio/toolboxes/fs.py +31 -0
  55. fabricatio/utils.py +156 -0
  56. fabricatio/workflows/__init__.py +1 -0
  57. fabricatio/workflows/articles.py +24 -0
  58. fabricatio/workflows/rag.py +11 -0
  59. fabricatio-0.3.14.dev4.data/scripts/tdown +0 -0
  60. fabricatio-0.3.14.dev4.data/scripts/ttm +0 -0
  61. fabricatio-0.3.14.dev4.dist-info/METADATA +188 -0
  62. fabricatio-0.3.14.dev4.dist-info/RECORD +64 -0
  63. fabricatio-0.3.14.dev4.dist-info/WHEEL +4 -0
  64. fabricatio-0.3.14.dev4.dist-info/licenses/LICENSE +21 -0
fabricatio/parser.py ADDED
@@ -0,0 +1,114 @@
1
+ """A module for capturing patterns in text using regular expressions."""
2
+
3
+ import re
4
+ from dataclasses import dataclass, field
5
+ from functools import lru_cache
6
+ from typing import Any, Callable, Iterable, List, Optional, Self, Tuple, Type, Union
7
+
8
+ import ujson
9
+ from json_repair import repair_json
10
+
11
+ from fabricatio.journal import logger
12
+ from fabricatio.rust import CONFIG
13
+
14
+
15
+ @dataclass(frozen=True)
16
+ class Capture:
17
+ """A class to capture patterns in text using regular expressions.
18
+
19
+ Attributes:
20
+ target_groups (Tuple[int, ...]): The target groups to extract from the match.
21
+ pattern (str): The regex pattern to search for.
22
+ flags (int): Flags to apply when compiling the regex.
23
+ capture_type (Optional[str]): Optional hint for post-processing (e.g., 'json').
24
+ """
25
+
26
+ pattern: str = field()
27
+ """The regular expression pattern to search for."""
28
+ flags: int = re.DOTALL | re.MULTILINE | re.IGNORECASE
29
+ """Flags to control regex behavior (DOTALL, MULTILINE, IGNORECASE by default)."""
30
+ capture_type: Optional[str] = None
31
+ """Optional type identifier for post-processing (e.g., 'json' for JSON repair)."""
32
+ target_groups: Tuple[int, ...] = field(default_factory=tuple)
33
+ """Tuple of group indices to extract from the match (1-based indexing)."""
34
+
35
+ def fix(self, text: Union[str, Iterable[str], Any]) -> Union[str, List[str], Any]:
36
+ """Fix the text based on capture_type (e.g., JSON repair)."""
37
+ match self.capture_type:
38
+ case "json" if CONFIG.general.use_json_repair:
39
+ logger.debug("Applying JSON repair to text.")
40
+ if isinstance(text, str):
41
+ return repair_json(text, ensure_ascii=False)
42
+ return [repair_json(item, ensure_ascii=False) for item in text]
43
+ case _:
44
+ return text
45
+
46
+ def capture(self, text: str) -> Optional[Union[str, Tuple[str, ...]]]:
47
+ """Capture the first match of the pattern in the text."""
48
+ compiled = re.compile(self.pattern, self.flags)
49
+ match = compiled.match(text) or compiled.search(text)
50
+ if match is None:
51
+ logger.debug(f"Capture Failed: {text}")
52
+ return None
53
+
54
+ groups = self.fix(match.groups())
55
+ if self.target_groups:
56
+ cap = tuple(groups[g - 1] for g in self.target_groups)
57
+ logger.debug(f"Captured texts: {'\n==\n'.join(cap)}")
58
+ return cap
59
+ cap = groups[0]
60
+ logger.debug(f"Captured text: \n{cap}")
61
+ return cap
62
+
63
+ def convert_with(
64
+ self,
65
+ text: str,
66
+ convertor: Callable[[Union[str, Tuple[str, ...]]], Any],
67
+ ) -> Optional[Any]:
68
+ """Convert captured text using a provided function."""
69
+ if (cap := self.capture(text)) is None:
70
+ return None
71
+ try:
72
+ return convertor(cap)
73
+ except Exception as e: # noqa: BLE001
74
+ logger.error(f"Failed to convert text using {convertor.__name__}: {e}\n{cap}")
75
+ return None
76
+
77
+ def validate_with[T, K, E](
78
+ self,
79
+ text: str,
80
+ target_type: Type[T],
81
+ elements_type: Optional[Type[E]] = None,
82
+ length: Optional[int] = None,
83
+ deserializer: Callable[[Union[str, Tuple[str, ...]]], K] = lambda x: ujson.loads(x) if isinstance(x, str) else ujson.loads(x[0]),
84
+ ) -> Optional[T]:
85
+ """Deserialize and validate the captured text against expected types."""
86
+ judges = [lambda obj: isinstance(obj, target_type)]
87
+ if elements_type:
88
+ judges.append(lambda obj: all(isinstance(e, elements_type) for e in obj))
89
+ if length:
90
+ judges.append(lambda obj: len(obj) == length)
91
+
92
+ if (out := self.convert_with(text, deserializer)) and all(j(out) for j in judges):
93
+ return out # type: ignore
94
+ return None
95
+
96
+ @classmethod
97
+ @lru_cache(32)
98
+ def capture_code_block(cls, language: str) -> Self:
99
+ """Capture a code block of the given language."""
100
+ return cls(pattern=f"```{language}(.*?)```", capture_type=language)
101
+
102
+ @classmethod
103
+ @lru_cache(32)
104
+ def capture_generic_block(cls, language: str) -> Self:
105
+ """Capture a generic block of the given language."""
106
+ return cls(
107
+ pattern=f"--- Start of {language} ---(.*?)--- End of {language} ---",
108
+ capture_type=language,
109
+ )
110
+
111
+
112
+ JsonCapture = Capture.capture_code_block("json")
113
+ PythonCapture = Capture.capture_code_block("python")
114
+ GenericCapture = Capture.capture_generic_block("String")
fabricatio/py.typed ADDED
File without changes