quantalogic 0.33.0__py3-none-any.whl → 0.33.2__py3-none-any.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.
quantalogic/xml_parser.py CHANGED
@@ -7,7 +7,6 @@ with support for handling malformed XML and CDATA sections.
7
7
  import html
8
8
  import re
9
9
  from collections import defaultdict
10
- from functools import lru_cache
11
10
  from typing import Self
12
11
 
13
12
  from loguru import logger
@@ -53,29 +52,22 @@ class ToleranceXMLParser:
53
52
  """
54
53
 
55
54
  # Default mappings for element name normalization
56
- DEFAULT_NAME_MAP = {
57
- "o": "output",
58
- "i": "input",
59
- "opt": "optional"
60
- }
55
+ DEFAULT_NAME_MAP = {"o": "output", "i": "input", "opt": "optional"}
61
56
 
62
57
  def __init__(self: Self) -> None:
63
58
  """Initialize the parser with regex patterns for matching XML-like elements."""
64
59
  # Pattern for matching individual XML elements with better whitespace handling
65
- self.element_pattern = re.compile(
66
- r"<\s*([^/>]+?)\s*>(.*?)(?:</\s*\1\s*>|<\s*\1\s*>)",
67
- re.DOTALL
68
- )
60
+ self.element_pattern = re.compile(r"<\s*([^/>]+?)\s*>(.*?)(?:</\s*\1\s*>|<\s*\1\s*>)", re.DOTALL)
69
61
  # Pattern for matching CDATA sections
70
62
  self.cdata_pattern = re.compile(r"<!\[CDATA\[(.*?)]]>", re.DOTALL)
71
63
  logger.debug("Initialized ToleranceXMLParser with regex patterns")
72
64
 
73
65
  def _validate_input(self, text: str) -> None:
74
66
  """Validate input text before processing.
75
-
67
+
76
68
  Args:
77
69
  text: Input text to validate.
78
-
70
+
79
71
  Raises:
80
72
  ValueError: If input text is invalid.
81
73
  """
@@ -120,7 +112,6 @@ class ToleranceXMLParser:
120
112
  # Only unescape HTML entities, preserve everything else exactly as is
121
113
  return html.unescape(content)
122
114
 
123
- @lru_cache(maxsize=128)
124
115
  def _map_element_name(self: Self, name: str) -> str:
125
116
  """Map element names to their canonical form.
126
117
 
@@ -134,10 +125,10 @@ class ToleranceXMLParser:
134
125
 
135
126
  def _build_element_pattern(self, element_name: str) -> re.Pattern[str]:
136
127
  """Build regex pattern for finding specific XML elements.
137
-
128
+
138
129
  Args:
139
130
  element_name: Name of the element to match.
140
-
131
+
141
132
  Returns:
142
133
  Compiled regex pattern for matching the element.
143
134
  """
@@ -145,53 +136,45 @@ class ToleranceXMLParser:
145
136
  cdata_section = r"(?:<!\[CDATA\[.*?]]>)?"
146
137
  content_pattern = f"({non_cdata}{cdata_section}{non_cdata})"
147
138
  closing_pattern = "(?:</\1>|<\1>)"
148
-
149
- return re.compile(
150
- f"<{element_name}>{content_pattern}{closing_pattern}",
151
- re.DOTALL
152
- )
139
+
140
+ return re.compile(f"<{element_name}>{content_pattern}{closing_pattern}", re.DOTALL)
153
141
 
154
142
  def _find_all_elements(self, text: str) -> list[tuple[str, str]]:
155
143
  """Find all XML elements in text.
156
-
144
+
157
145
  Args:
158
146
  text: Input text to search.
159
-
147
+
160
148
  Returns:
161
149
  List of tuples containing element names and their content.
162
150
  """
163
- return [(match.group(1), match.group(2) or "")
164
- for match in self.element_pattern.finditer(text)]
151
+ return [(match.group(1), match.group(2) or "") for match in self.element_pattern.finditer(text)]
165
152
 
166
153
  def _process_element_content(self, content: str, preserve_cdata: bool) -> str:
167
154
  """Process content of a single element.
168
-
155
+
169
156
  Args:
170
157
  content: Raw element content.
171
158
  preserve_cdata: Whether to preserve CDATA sections.
172
-
159
+
173
160
  Returns:
174
161
  Processed content string.
175
162
  """
176
163
  content, cdata_sections = self._extract_and_remove_cdata(content, preserve_cdata)
177
164
  content = self._clean_content(content)
178
-
165
+
179
166
  # If content is empty but we have CDATA sections and we're not preserving them
180
167
  if not content.strip() and cdata_sections and not preserve_cdata:
181
168
  return cdata_sections[0]
182
169
  return content
183
170
 
184
- def _process_elements(
185
- self,
186
- elements: list[tuple[str, str]],
187
- preserve_cdata: bool
188
- ) -> dict[str, str]:
171
+ def _process_elements(self, elements: list[tuple[str, str]], preserve_cdata: bool) -> dict[str, str]:
189
172
  """Process found elements and handle CDATA sections.
190
-
173
+
191
174
  Args:
192
175
  elements: List of element name and content tuples.
193
176
  preserve_cdata: Whether to preserve CDATA sections.
194
-
177
+
195
178
  Returns:
196
179
  Dictionary mapping element names to their processed content.
197
180
  """
@@ -199,12 +182,12 @@ class ToleranceXMLParser:
199
182
  for name, content in elements:
200
183
  name = self._map_element_name(name)
201
184
  result[name] = self._process_element_content(content, preserve_cdata)
202
-
185
+
203
186
  # Handle nested elements
204
187
  nested_elements = self._find_all_elements(content)
205
188
  nested_results = self._process_elements(nested_elements, preserve_cdata)
206
189
  result.update(nested_results)
207
-
190
+
208
191
  return dict(result)
209
192
 
210
193
  def _extract_element_content(self: Self, text: str, preserve_cdata: bool = False) -> dict[str, str]:
@@ -301,3 +284,22 @@ class ToleranceXMLParser:
301
284
  error_msg = error_msg + f"\n{text}\n"
302
285
  logger.error(error_msg)
303
286
  raise ValueError(error_msg)
287
+
288
+
289
+ if __name__ == "__main__":
290
+ xml_content = """
291
+ <action>
292
+ <task_complete>
293
+ <answer>Hello</answer>
294
+ </task_complete>
295
+ </action>
296
+ """
297
+
298
+ parser = ToleranceXMLParser()
299
+ parsed_values = parser.extract_elements(xml_content)
300
+ print(parsed_values)
301
+ if "action" in parsed_values:
302
+ print(parsed_values["action"])
303
+ action = parser.extract_elements(text=xml_content, element_names=["action"])
304
+ print(action["action"])
305
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: quantalogic
3
- Version: 0.33.0
3
+ Version: 0.33.2
4
4
  Summary: QuantaLogic ReAct Agents
5
5
  Author: Raphaël MANSUY
6
6
  Author-email: raphael.mansuy@gmail.com
@@ -1,14 +1,14 @@
1
1
  quantalogic/__init__.py,sha256=Su8CnOEdqKu4zTytjiP9P5olg-oIDuUA3fMWM1WUdRY,925
2
- quantalogic/agent.py,sha256=3LllyyFILkmm6wz1CmT6942jIgT1oymqiYNzRYO6fAg,34272
3
- quantalogic/agent_config.py,sha256=SIRVSF0kkrYfvtyHiMCJhnm_nYqJCD2p1pN-reMIy24,7868
2
+ quantalogic/agent.py,sha256=NPCcqXPf3YfxnKxxgZQayV3vNsjF_27jj-oCZnZyWJw,34510
3
+ quantalogic/agent_config.py,sha256=jkjEjZe47DJoZlUTsKzcKQ4_3sYrEKpG0kcOWjvdBC0,8110
4
4
  quantalogic/agent_factory.py,sha256=HWKwN_DN57EPmME-hoCD2uJE0DqsPCzGU_V7nq54XzI,5284
5
- quantalogic/coding_agent.py,sha256=Z7ik6LUvLKDnaW9Ax1iZGC7p1WMnlYEUIlE5lkBP414,4975
5
+ quantalogic/coding_agent.py,sha256=UbuvtTedt6rtIdgfSgTn3Z-Nkfq0Y24N2eRfN59gHuY,5124
6
6
  quantalogic/config.py,sha256=S_SAdsCoTa1jS8GIJW2TjlCtE5vjGDbMBg-6E0j8K1o,355
7
- quantalogic/console_print_events.py,sha256=KB-DGi52As8M96eUs1N_vgNqKIFtqv_H8NTOd3TLTgQ,2163
7
+ quantalogic/console_print_events.py,sha256=md1CwNBoi58nW7KRVESna3QfkWDJo8PvugXSKjL-c-k,2129
8
8
  quantalogic/console_print_token.py,sha256=qSU-3kmoZk4T5-1ybrEBi8tIXDPcz7eyWKhGh3E8uIg,395
9
9
  quantalogic/docs_cli.py,sha256=3giVbUpespB9ZdTSJ955A3BhcOaBl5Lwsn1AVy9XAeY,1663
10
10
  quantalogic/event_emitter.py,sha256=jqot2g4JRXc88K6PW837Oqxbf7shZfO-xdPaUWmzupk,7901
11
- quantalogic/generative_model.py,sha256=K0lbtZuuQrI5McPC4pUZ_FdjL32dAy1vM18egmPGaa8,13638
11
+ quantalogic/generative_model.py,sha256=3OLEPwsKEvtc0JYISeim_gEU8MY45FBN3q2rcixGVsk,13729
12
12
  quantalogic/get_model_info.py,sha256=_9Nb9JQ09HZzT-_gZUSvl4Er7uCXs5ys36sIBa-8DXA,3005
13
13
  quantalogic/interactive_text_editor.py,sha256=1vW4poJl7SItRGEeGQgtCFcmRDXmfCM8PE-uBtDBJuE,16658
14
14
  quantalogic/llm.py,sha256=98osu6LmjuYw4g-CDIp1SJkYlfoHNwdvq6yJqI-K5NA,5692
@@ -18,7 +18,7 @@ quantalogic/model_info.py,sha256=j7QqvjEFQDGpDOgQs8uTkVyI3a50Oa_nrsQjyxizTLc,272
18
18
  quantalogic/model_info_list.py,sha256=qGDKI5oBbu5oyJSH4o4jGYGqyqYEUMXFRi_qMDAQ2nU,1997
19
19
  quantalogic/model_info_litellm.py,sha256=m1Yt4SIiOBRWLx7S8f8k4fcTiKJZKtOvcPN_QvQ_Oxk,1880
20
20
  quantalogic/model_names.py,sha256=UZlz25zG9B2dpfwdw_e1Gw5qFsKQ7iME9FJh9Ts4u6s,938
21
- quantalogic/prompts.py,sha256=2DgL979NBXzSfHfBw3KBf7-55wSzIk5vK-uDZbzRQTY,3158
21
+ quantalogic/prompts.py,sha256=LZ82J_IVZy_G3Cabz_XnCmdM5RAPGuxyAsViCX8ldl4,2939
22
22
  quantalogic/search_agent.py,sha256=EA_FAPP0dVuUbJ_lAGKfYq1FIJ6oLYzGMgKLMvBL4ZQ,2472
23
23
  quantalogic/server/__init__.py,sha256=8sz_PYAUCrkM6JM5EAUeIzNM4NPW6j6UT72JVkc21WQ,91
24
24
  quantalogic/server/agent_server.py,sha256=VXaaWqReUSZOCX7CaKS14jria8yZn1kLEc52E2hV7ZA,22510
@@ -31,7 +31,7 @@ quantalogic/server/templates/index.html,sha256=nDnXJoQEm1vXbhXtgaYk0G5VXj0wwzE6K
31
31
  quantalogic/task_file_reader.py,sha256=AMIJoeVY9Hhu0dBJ-C5EyaOFsXLkhn2oBhVs-WTnnLk,1460
32
32
  quantalogic/task_runner.py,sha256=6kL7o0br2YU8FNKyq-rKJo1oGKZKl73vtATpHusPIWQ,10038
33
33
  quantalogic/tool_manager.py,sha256=Uh-ufrJPufHqDUrFwKlXw3MOsVGc_4lQxuc6cRvZ7wU,7186
34
- quantalogic/tools/__init__.py,sha256=pTirT5UBynuTkAzFYebu7ttGAMP3_A0idFvDp6lGZJQ,2146
34
+ quantalogic/tools/__init__.py,sha256=syshfk5d0_HV6A_mG4OBBJXy3H7ky-x57MnvlrDVXgI,2331
35
35
  quantalogic/tools/agent_tool.py,sha256=MXCXxWHRch7VK4UWhtRP1jeI8Np9Ne2CUGo8vm1oZiM,3064
36
36
  quantalogic/tools/dalle_e.py,sha256=nur2kl6DKjaWWaHcmF_y9vS5bvty2fW8hQfdgf5KWfs,10948
37
37
  quantalogic/tools/download_http_file_tool.py,sha256=wTfanbXjIRi5-qrbluuLvNmDNhvmYAnlMVb3dO8C2ss,2210
@@ -64,7 +64,9 @@ quantalogic/tools/read_file_tool.py,sha256=l6k-SOIV9krpXAmUTkxzua51S-KHgzGqkcDlD
64
64
  quantalogic/tools/read_html_tool.py,sha256=Vq2rHY8a36z1-4rN6c_kYjPUTQ4I2UT154PMpaoWSkA,11139
65
65
  quantalogic/tools/replace_in_file_tool.py,sha256=95GqcOC0sZzbWHWzYDVwq7rEwChlOgKxb5cxKk-Y7W8,13844
66
66
  quantalogic/tools/ripgrep_tool.py,sha256=sRzHaWac9fa0cCGhECJN04jw_Ko0O3u45KDWzMIYcvY,14291
67
+ quantalogic/tools/safe_python_interpreter_tool.py,sha256=I8e33-S_6K-1JxgkcTL0J79Op57kp2dzQBsXgwKFm8w,8140
67
68
  quantalogic/tools/search_definition_names.py,sha256=ui0304UgUke6Ca-H3-S4JP9TsdHhRCR5uk9kPuobIDA,18769
69
+ quantalogic/tools/sequence_tool.py,sha256=NQAtd89d6hscyGe2GzGkHsmdtpAEX_fRa98hvo93EyA,11322
68
70
  quantalogic/tools/serpapi_search_tool.py,sha256=sX-Noch77kGP2XiwislPNFyy3_4TH6TwMK6C81L3q9Y,5316
69
71
  quantalogic/tools/sql_query_tool.py,sha256=5Jgr5m8Xv0B-3oHk560LmF0DgphGKWoAitElwqY9xCc,6120
70
72
  quantalogic/tools/task_complete_tool.py,sha256=L8tuyVoN07Q2hOsxx17JTW0C5Jd_N-C0i_0PtCUQUKU,929
@@ -75,7 +77,7 @@ quantalogic/tools/utils/create_sample_database.py,sha256=Aus9xRLGfQfsYnxsAkJ5CW-
75
77
  quantalogic/tools/utils/generate_database_report.py,sha256=0D-5fWOfpAh1jEcld5OTQP5x6XkJE5jpNY6FyHv1L2s,10345
76
78
  quantalogic/tools/wikipedia_search_tool.py,sha256=bdZ_0dYTxpEfU04tBFsatnLM5P9Z3kAZgKQEjsopJLA,5405
77
79
  quantalogic/tools/write_file_tool.py,sha256=_mx9_Zjg2oMAAVzlcHEKjZVZUxQVgbRfcoMKgWnoZcg,3764
78
- quantalogic/utils/__init__.py,sha256=E442CJQuTohKzgI0Wrd4NZEpKascFjz6F4Vy8Y1c_0Y,634
80
+ quantalogic/utils/__init__.py,sha256=hsS3hXH5lsBQcZh2QBANY1Af2Zs1jtrgxA7kXJEWi58,680
79
81
  quantalogic/utils/ask_user_validation.py,sha256=F0jkbFJVXAImcSSP7op6dov5i80hRvZGRvBHbfcZrxg,340
80
82
  quantalogic/utils/check_version.py,sha256=grxTfJE85GMue1OAk8z8_q8tjEJxQ8RO6fN3fJ_qedg,1136
81
83
  quantalogic/utils/download_http_file.py,sha256=FTN3brq9WvCFvuBX-lYAhjsdYTzQT4m9m2vqlcyjkNk,3472
@@ -85,15 +87,16 @@ quantalogic/utils/get_environment.py,sha256=7wWruSHYTUlnQWW27qU3WFYZnncqqqdofsxA
85
87
  quantalogic/utils/get_quantalogic_rules_content.py,sha256=fnEFTyClXzpI0MLaM-gB9R6l4CJlu2NnaYiR09ciJC8,673
86
88
  quantalogic/utils/git_ls.py,sha256=_k6QIQtc0aM1bsG340jBp4VrdevbcH8Pg2CV4r9oHok,5264
87
89
  quantalogic/utils/lm_studio_model_info.py,sha256=1eDvZ-I9W8AZbCch1l5rdiSpUxL7qMnfZItdFZkmAWs,1819
90
+ quantalogic/utils/python_interpreter.py,sha256=VQdLdh0Jk-cWkXLwzPY5lwl8LFWPp8RzI9pKbfoieZg,33534
88
91
  quantalogic/utils/read_file.py,sha256=tSRVHk8dIP4nNLL89v5kRki4hOTjVyjbmuEb2zwvwCY,2077
89
92
  quantalogic/utils/read_http_text_content.py,sha256=n3IayT5KcqctIVVF2gOQQAMf3Ow6eenlVgfXTpLcQbw,4410
90
93
  quantalogic/version.py,sha256=ea_cRutaQk5_lwlLbUUvPFuOT7Of7-gAsDl7wdveS-g,107
91
94
  quantalogic/version_check.py,sha256=cttR1lR3OienGLl7NrK1Te1fhDkqSjCci7HC1vFUTSY,1627
92
95
  quantalogic/welcome_message.py,sha256=IXMhem8h7srzNUwvw8G_lmEkHU8PFfote021E_BXmVk,3039
93
- quantalogic/xml_parser.py,sha256=8yDxvKzAEnefNwUAR-wjerMDOj5T5cxak4WPIA83SBw,11516
96
+ quantalogic/xml_parser.py,sha256=iUQZC4a8uqBsP7RAZaY0Ed9k8TCd-ImuF41eF7MR2WM,11615
94
97
  quantalogic/xml_tool_parser.py,sha256=Vz4LEgDbelJynD1siLOVkJ3gLlfHsUk65_gCwbYJyGc,3784
95
- quantalogic-0.33.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
96
- quantalogic-0.33.0.dist-info/METADATA,sha256=ZPa-Y4-EhqTp_3ixcWa0hLI_grOtN8v5SnoWoZP9to0,23461
97
- quantalogic-0.33.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
98
- quantalogic-0.33.0.dist-info/entry_points.txt,sha256=h74O_Q3qBRCrDR99qvwB4BpBGzASPUIjCfxHq6Qnups,183
99
- quantalogic-0.33.0.dist-info/RECORD,,
98
+ quantalogic-0.33.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
99
+ quantalogic-0.33.2.dist-info/METADATA,sha256=NeED0MxKm7Mt6uC70-FmbRWwQv7NBhyKAmcJB7A1Vec,23461
100
+ quantalogic-0.33.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
101
+ quantalogic-0.33.2.dist-info/entry_points.txt,sha256=h74O_Q3qBRCrDR99qvwB4BpBGzASPUIjCfxHq6Qnups,183
102
+ quantalogic-0.33.2.dist-info/RECORD,,