edsl 0.1.49__py3-none-any.whl → 0.1.50__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.
Files changed (239) hide show
  1. edsl/__init__.py +124 -53
  2. edsl/__version__.py +1 -1
  3. edsl/agents/agent.py +21 -21
  4. edsl/agents/agent_list.py +2 -5
  5. edsl/agents/exceptions.py +119 -5
  6. edsl/base/__init__.py +10 -35
  7. edsl/base/base_class.py +71 -36
  8. edsl/base/base_exception.py +204 -0
  9. edsl/base/data_transfer_models.py +1 -1
  10. edsl/base/exceptions.py +94 -0
  11. edsl/buckets/__init__.py +15 -1
  12. edsl/buckets/bucket_collection.py +3 -4
  13. edsl/buckets/exceptions.py +75 -0
  14. edsl/buckets/model_buckets.py +1 -2
  15. edsl/buckets/token_bucket.py +11 -6
  16. edsl/buckets/token_bucket_api.py +1 -2
  17. edsl/buckets/token_bucket_client.py +9 -7
  18. edsl/caching/cache.py +7 -2
  19. edsl/caching/cache_entry.py +10 -9
  20. edsl/caching/exceptions.py +113 -7
  21. edsl/caching/remote_cache_sync.py +1 -2
  22. edsl/caching/sql_dict.py +17 -12
  23. edsl/cli.py +43 -0
  24. edsl/config/config_class.py +30 -6
  25. edsl/conversation/Conversation.py +3 -2
  26. edsl/conversation/exceptions.py +58 -0
  27. edsl/conversation/mug_negotiation.py +0 -2
  28. edsl/coop/__init__.py +20 -1
  29. edsl/coop/coop.py +120 -29
  30. edsl/coop/exceptions.py +188 -9
  31. edsl/coop/price_fetcher.py +3 -6
  32. edsl/coop/utils.py +4 -6
  33. edsl/dataset/__init__.py +5 -4
  34. edsl/dataset/dataset.py +53 -43
  35. edsl/dataset/dataset_operations_mixin.py +86 -72
  36. edsl/dataset/dataset_tree.py +9 -5
  37. edsl/dataset/display/table_display.py +0 -2
  38. edsl/dataset/display/table_renderers.py +0 -1
  39. edsl/dataset/exceptions.py +125 -0
  40. edsl/dataset/file_exports.py +18 -11
  41. edsl/dataset/r/ggplot.py +13 -6
  42. edsl/display/__init__.py +27 -0
  43. edsl/display/core.py +147 -0
  44. edsl/display/plugin.py +189 -0
  45. edsl/display/utils.py +52 -0
  46. edsl/inference_services/__init__.py +9 -1
  47. edsl/inference_services/available_model_cache_handler.py +1 -1
  48. edsl/inference_services/available_model_fetcher.py +4 -5
  49. edsl/inference_services/data_structures.py +9 -6
  50. edsl/inference_services/exceptions.py +132 -1
  51. edsl/inference_services/inference_service_abc.py +2 -2
  52. edsl/inference_services/inference_services_collection.py +2 -6
  53. edsl/inference_services/registry.py +4 -3
  54. edsl/inference_services/service_availability.py +2 -1
  55. edsl/inference_services/services/anthropic_service.py +4 -1
  56. edsl/inference_services/services/aws_bedrock.py +13 -12
  57. edsl/inference_services/services/azure_ai.py +12 -10
  58. edsl/inference_services/services/deep_infra_service.py +1 -4
  59. edsl/inference_services/services/deep_seek_service.py +1 -5
  60. edsl/inference_services/services/google_service.py +6 -2
  61. edsl/inference_services/services/groq_service.py +1 -1
  62. edsl/inference_services/services/mistral_ai_service.py +4 -2
  63. edsl/inference_services/services/ollama_service.py +1 -1
  64. edsl/inference_services/services/open_ai_service.py +7 -5
  65. edsl/inference_services/services/perplexity_service.py +6 -2
  66. edsl/inference_services/services/test_service.py +8 -7
  67. edsl/inference_services/services/together_ai_service.py +2 -3
  68. edsl/inference_services/services/xai_service.py +1 -1
  69. edsl/instructions/__init__.py +1 -1
  70. edsl/instructions/change_instruction.py +3 -2
  71. edsl/instructions/exceptions.py +61 -0
  72. edsl/instructions/instruction.py +5 -2
  73. edsl/instructions/instruction_collection.py +2 -1
  74. edsl/instructions/instruction_handler.py +4 -9
  75. edsl/interviews/ReportErrors.py +0 -3
  76. edsl/interviews/__init__.py +9 -2
  77. edsl/interviews/answering_function.py +11 -13
  78. edsl/interviews/exception_tracking.py +14 -7
  79. edsl/interviews/exceptions.py +79 -0
  80. edsl/interviews/interview.py +32 -29
  81. edsl/interviews/interview_status_dictionary.py +4 -2
  82. edsl/interviews/interview_status_log.py +2 -1
  83. edsl/interviews/interview_task_manager.py +3 -3
  84. edsl/interviews/request_token_estimator.py +3 -1
  85. edsl/interviews/statistics.py +2 -3
  86. edsl/invigilators/__init__.py +7 -1
  87. edsl/invigilators/exceptions.py +79 -0
  88. edsl/invigilators/invigilator_base.py +0 -1
  89. edsl/invigilators/invigilators.py +8 -12
  90. edsl/invigilators/prompt_constructor.py +1 -5
  91. edsl/invigilators/prompt_helpers.py +8 -4
  92. edsl/invigilators/question_instructions_prompt_builder.py +1 -1
  93. edsl/invigilators/question_option_processor.py +9 -5
  94. edsl/invigilators/question_template_replacements_builder.py +3 -2
  95. edsl/jobs/__init__.py +3 -3
  96. edsl/jobs/async_interview_runner.py +24 -22
  97. edsl/jobs/check_survey_scenario_compatibility.py +7 -6
  98. edsl/jobs/data_structures.py +7 -4
  99. edsl/jobs/exceptions.py +177 -8
  100. edsl/jobs/fetch_invigilator.py +1 -1
  101. edsl/jobs/jobs.py +72 -67
  102. edsl/jobs/jobs_checks.py +2 -3
  103. edsl/jobs/jobs_component_constructor.py +2 -2
  104. edsl/jobs/jobs_pricing_estimation.py +3 -2
  105. edsl/jobs/jobs_remote_inference_logger.py +5 -4
  106. edsl/jobs/jobs_runner_asyncio.py +1 -2
  107. edsl/jobs/jobs_runner_status.py +8 -9
  108. edsl/jobs/remote_inference.py +26 -23
  109. edsl/jobs/results_exceptions_handler.py +8 -5
  110. edsl/key_management/__init__.py +3 -1
  111. edsl/key_management/exceptions.py +62 -0
  112. edsl/key_management/key_lookup.py +1 -1
  113. edsl/key_management/key_lookup_builder.py +37 -14
  114. edsl/key_management/key_lookup_collection.py +2 -0
  115. edsl/language_models/__init__.py +1 -1
  116. edsl/language_models/exceptions.py +302 -14
  117. edsl/language_models/language_model.py +4 -7
  118. edsl/language_models/model.py +4 -4
  119. edsl/language_models/model_list.py +1 -1
  120. edsl/language_models/price_manager.py +1 -1
  121. edsl/language_models/raw_response_handler.py +14 -9
  122. edsl/language_models/registry.py +17 -21
  123. edsl/language_models/repair.py +0 -6
  124. edsl/language_models/unused/fake_openai_service.py +0 -1
  125. edsl/load_plugins.py +69 -0
  126. edsl/logger.py +146 -0
  127. edsl/notebooks/notebook.py +1 -1
  128. edsl/notebooks/notebook_to_latex.py +0 -1
  129. edsl/plugins/__init__.py +63 -0
  130. edsl/plugins/built_in/export_example.py +50 -0
  131. edsl/plugins/built_in/pig_latin.py +67 -0
  132. edsl/plugins/cli.py +372 -0
  133. edsl/plugins/cli_typer.py +283 -0
  134. edsl/plugins/exceptions.py +31 -0
  135. edsl/plugins/hookspec.py +51 -0
  136. edsl/plugins/plugin_host.py +128 -0
  137. edsl/plugins/plugin_manager.py +633 -0
  138. edsl/plugins/plugins_registry.py +168 -0
  139. edsl/prompts/__init__.py +2 -0
  140. edsl/prompts/exceptions.py +107 -5
  141. edsl/prompts/prompt.py +14 -6
  142. edsl/questions/HTMLQuestion.py +5 -11
  143. edsl/questions/Quick.py +0 -1
  144. edsl/questions/__init__.py +2 -0
  145. edsl/questions/answer_validator_mixin.py +318 -318
  146. edsl/questions/compose_questions.py +2 -2
  147. edsl/questions/descriptors.py +10 -49
  148. edsl/questions/exceptions.py +278 -22
  149. edsl/questions/loop_processor.py +7 -5
  150. edsl/questions/prompt_templates/question_list.jinja +3 -0
  151. edsl/questions/question_base.py +14 -16
  152. edsl/questions/question_base_gen_mixin.py +2 -2
  153. edsl/questions/question_base_prompts_mixin.py +9 -3
  154. edsl/questions/question_budget.py +9 -5
  155. edsl/questions/question_check_box.py +3 -5
  156. edsl/questions/question_dict.py +171 -194
  157. edsl/questions/question_extract.py +1 -1
  158. edsl/questions/question_free_text.py +4 -6
  159. edsl/questions/question_functional.py +4 -3
  160. edsl/questions/question_list.py +36 -9
  161. edsl/questions/question_matrix.py +95 -61
  162. edsl/questions/question_multiple_choice.py +6 -4
  163. edsl/questions/question_numerical.py +2 -4
  164. edsl/questions/question_registry.py +4 -2
  165. edsl/questions/register_questions_meta.py +0 -1
  166. edsl/questions/response_validator_abc.py +7 -13
  167. edsl/questions/templates/dict/answering_instructions.jinja +1 -0
  168. edsl/questions/templates/rank/question_presentation.jinja +1 -1
  169. edsl/results/__init__.py +1 -1
  170. edsl/results/exceptions.py +141 -7
  171. edsl/results/report.py +0 -1
  172. edsl/results/result.py +4 -5
  173. edsl/results/results.py +10 -51
  174. edsl/results/results_selector.py +8 -4
  175. edsl/scenarios/PdfExtractor.py +2 -2
  176. edsl/scenarios/construct_download_link.py +69 -35
  177. edsl/scenarios/directory_scanner.py +33 -14
  178. edsl/scenarios/document_chunker.py +1 -1
  179. edsl/scenarios/exceptions.py +238 -14
  180. edsl/scenarios/file_methods.py +1 -1
  181. edsl/scenarios/file_store.py +7 -3
  182. edsl/scenarios/handlers/__init__.py +17 -0
  183. edsl/scenarios/handlers/docx_file_store.py +0 -5
  184. edsl/scenarios/handlers/pdf_file_store.py +0 -1
  185. edsl/scenarios/handlers/pptx_file_store.py +0 -5
  186. edsl/scenarios/handlers/py_file_store.py +0 -1
  187. edsl/scenarios/handlers/sql_file_store.py +1 -4
  188. edsl/scenarios/handlers/sqlite_file_store.py +0 -1
  189. edsl/scenarios/handlers/txt_file_store.py +1 -1
  190. edsl/scenarios/scenario.py +0 -1
  191. edsl/scenarios/scenario_list.py +152 -18
  192. edsl/scenarios/scenario_list_pdf_tools.py +1 -0
  193. edsl/scenarios/scenario_selector.py +0 -1
  194. edsl/surveys/__init__.py +3 -4
  195. edsl/surveys/dag/__init__.py +4 -2
  196. edsl/surveys/descriptors.py +1 -1
  197. edsl/surveys/edit_survey.py +1 -0
  198. edsl/surveys/exceptions.py +165 -9
  199. edsl/surveys/memory/__init__.py +5 -3
  200. edsl/surveys/memory/memory_management.py +1 -0
  201. edsl/surveys/memory/memory_plan.py +6 -15
  202. edsl/surveys/rules/__init__.py +5 -3
  203. edsl/surveys/rules/rule.py +1 -2
  204. edsl/surveys/rules/rule_collection.py +1 -1
  205. edsl/surveys/survey.py +12 -24
  206. edsl/surveys/survey_export.py +6 -3
  207. edsl/surveys/survey_flow_visualization.py +10 -1
  208. edsl/tasks/__init__.py +2 -0
  209. edsl/tasks/question_task_creator.py +3 -3
  210. edsl/tasks/task_creators.py +1 -3
  211. edsl/tasks/task_history.py +5 -7
  212. edsl/tasks/task_status_log.py +1 -2
  213. edsl/tokens/__init__.py +3 -1
  214. edsl/tokens/token_usage.py +1 -1
  215. edsl/utilities/__init__.py +21 -1
  216. edsl/utilities/decorators.py +1 -2
  217. edsl/utilities/markdown_to_docx.py +2 -2
  218. edsl/utilities/markdown_to_pdf.py +1 -1
  219. edsl/utilities/repair_functions.py +0 -1
  220. edsl/utilities/restricted_python.py +0 -1
  221. edsl/utilities/template_loader.py +2 -3
  222. edsl/utilities/utilities.py +8 -29
  223. {edsl-0.1.49.dist-info → edsl-0.1.50.dist-info}/METADATA +32 -2
  224. edsl-0.1.50.dist-info/RECORD +363 -0
  225. edsl-0.1.50.dist-info/entry_points.txt +3 -0
  226. edsl/dataset/smart_objects.py +0 -96
  227. edsl/exceptions/BaseException.py +0 -21
  228. edsl/exceptions/__init__.py +0 -54
  229. edsl/exceptions/configuration.py +0 -16
  230. edsl/exceptions/general.py +0 -34
  231. edsl/study/ObjectEntry.py +0 -173
  232. edsl/study/ProofOfWork.py +0 -113
  233. edsl/study/SnapShot.py +0 -80
  234. edsl/study/Study.py +0 -520
  235. edsl/study/__init__.py +0 -6
  236. edsl/utilities/interface.py +0 -135
  237. edsl-0.1.49.dist-info/RECORD +0 -347
  238. {edsl-0.1.49.dist-info → edsl-0.1.50.dist-info}/LICENSE +0 -0
  239. {edsl-0.1.49.dist-info → edsl-0.1.50.dist-info}/WHEEL +0 -0
@@ -7,7 +7,6 @@ that can occur when working with Scenarios, ScenarioLists, and related component
7
7
  """
8
8
 
9
9
  import re
10
- from typing import List
11
10
 
12
11
  from ..base import BaseException
13
12
 
@@ -16,11 +15,13 @@ class AgentListError(BaseException):
16
15
  """
17
16
  Exception raised for errors related to AgentList operations.
18
17
 
19
- This exception is raised when there are issues with creating, modifying,
20
- or using an AgentList in conjunction with scenarios.
18
+ This exception appears to be a duplicate of the exception defined in
19
+ edsl.agents.exceptions. It exists here for legacy reasons but is not
20
+ actively used from this module.
21
21
 
22
- Args:
23
- message: A description of the error that occurred.
22
+ Note: This exception is defined but not used from this module. The AgentListError
23
+ from edsl.agents.exceptions is used instead. This raises Exception("not used")
24
+ to indicate this state.
24
25
  """
25
26
 
26
27
  def __init__(self, message: str):
@@ -37,9 +38,24 @@ class ScenarioError(BaseException):
37
38
  """
38
39
  Exception raised for errors related to Scenario operations.
39
40
 
40
- This exception is raised when there are issues with creating, modifying,
41
- or using Scenarios. It automatically includes a link to the documentation
42
- in the error message and makes URLs clickable in terminal output.
41
+ This exception is raised when:
42
+ - Invalid data is passed to initialize a Scenario (not convertible to dictionary)
43
+ - Required fields are missing in scenario data
44
+ - File operations fail when loading scenarios from files
45
+ - Scenario content cannot be properly parsed or processed
46
+ - Scenario lists encounter issues with data formats or operations
47
+
48
+ To fix this error:
49
+ 1. Check that your scenario data is properly formatted (valid dictionary or convertible to one)
50
+ 2. Ensure all required fields for a scenario are present
51
+ 3. Verify file paths and permissions when loading from files
52
+ 4. Check for syntax or format errors in scenario content
53
+
54
+ Examples:
55
+ ```python
56
+ Scenario(123) # Raises ScenarioError (not convertible to dictionary)
57
+ Scenario({"invalid_format": True}) # May raise ScenarioError (missing required fields)
58
+ ```
43
59
 
44
60
  Args:
45
61
  message: A description of the error that occurred.
@@ -84,9 +100,10 @@ class ScenarioError(BaseException):
84
100
  The text with URLs converted to clickable links.
85
101
 
86
102
  Example:
87
- >>> error = ScenarioError("See docs at https://example.com")
88
- >>> s = str(error) # Returns the message with clickable link
89
- ...
103
+ ```python
104
+ error = ScenarioError("See docs at https://example.com")
105
+ s = str(error) # Returns the message with clickable link
106
+ ```
90
107
  """
91
108
  url_pattern = r"https?://[^\s]+"
92
109
  urls = re.findall(url_pattern, text)
@@ -96,6 +113,213 @@ class ScenarioError(BaseException):
96
113
  return text
97
114
 
98
115
 
99
- if __name__ == "__main__":
100
- import doctest
101
- doctest.testmod(optionflags=doctest.ELLIPSIS)
116
+ class FileNotFoundScenarioError(ScenarioError):
117
+ """
118
+ Exception raised when a file needed for a scenario cannot be found.
119
+
120
+ This exception occurs when:
121
+ - A file specified in a file path does not exist
122
+ - A referenced image, document, or other resource is missing
123
+ - A directory expected to contain scenario files is not found
124
+
125
+ To fix this error:
126
+ 1. Check that the file path is correct and the file exists
127
+ 2. Verify file system permissions allow access to the file
128
+ 3. Ensure any referenced external resources are properly available
129
+
130
+ Examples:
131
+ ```python
132
+ Scenario.from_file("/path/to/nonexistent/file.json") # Raises FileNotFoundScenarioError
133
+ ```
134
+ """
135
+
136
+ def __init__(self, message: str):
137
+ """
138
+ Initialize the FileNotFoundScenarioError with a message.
139
+
140
+ Args:
141
+ message: A description of the error that occurred.
142
+ """
143
+ super().__init__(message)
144
+
145
+
146
+ class ImportScenarioError(ScenarioError):
147
+ """
148
+ Exception raised when importing a library needed for scenario operations fails.
149
+
150
+ This exception occurs when:
151
+ - A required library for handling specific file types is not installed
152
+ - A module needed for processing scenario data cannot be imported
153
+ - Optional dependencies for advanced features are missing
154
+
155
+ To fix this error:
156
+ 1. Install the required dependencies mentioned in the error message
157
+ 2. Check for version conflicts between dependencies
158
+ 3. Ensure your environment has all necessary packages
159
+
160
+ Examples:
161
+ ```python
162
+ # When attempting to load a PDF without the pdf dependencies
163
+ Scenario.from_pdf("document.pdf") # Raises ImportScenarioError
164
+ ```
165
+ """
166
+
167
+ def __init__(self, message: str):
168
+ """
169
+ Initialize the ImportScenarioError with a message.
170
+
171
+ Args:
172
+ message: A description of the error that occurred.
173
+ """
174
+ super().__init__(message)
175
+
176
+
177
+ class TypeScenarioError(ScenarioError):
178
+ """
179
+ Exception raised when there's a type mismatch in scenario operations.
180
+
181
+ This exception occurs when:
182
+ - A parameter is of the wrong type for a scenario operation
183
+ - Incompatible types are used in scenario methods
184
+ - Type conversion fails during scenario processing
185
+
186
+ To fix this error:
187
+ 1. Check the types of parameters passed to scenario methods
188
+ 2. Ensure data structures match what scenario operations expect
189
+ 3. Verify that operations between scenarios and other objects are compatible
190
+
191
+ Examples:
192
+ ```python
193
+ scenario * "invalid_operand" # Raises TypeScenarioError
194
+ ```
195
+ """
196
+
197
+ def __init__(self, message: str):
198
+ """
199
+ Initialize the TypeScenarioError with a message.
200
+
201
+ Args:
202
+ message: A description of the error that occurred.
203
+ """
204
+ super().__init__(message)
205
+
206
+
207
+ class ValueScenarioError(ScenarioError):
208
+ """
209
+ Exception raised when there's an invalid value in scenario operations.
210
+
211
+ This exception occurs when:
212
+ - A parameter value is out of its acceptable range
213
+ - Invalid formats are provided for scenario data
214
+ - Operation parameters are invalid for the requested action
215
+
216
+ To fix this error:
217
+ 1. Check parameter values against allowed ranges or formats
218
+ 2. Verify inputs meet the requirements for specific operations
219
+ 3. Ensure data formats match what's expected by scenario methods
220
+
221
+ Examples:
222
+ ```python
223
+ scenario_list.to_table(output_type="invalid_format") # Raises ValueScenarioError
224
+ ```
225
+ """
226
+
227
+ def __init__(self, message: str):
228
+ """
229
+ Initialize the ValueScenarioError with a message.
230
+
231
+ Args:
232
+ message: A description of the error that occurred.
233
+ """
234
+ super().__init__(message)
235
+
236
+
237
+ class AttributeScenarioError(ScenarioError):
238
+ """
239
+ Exception raised when accessing a non-existent attribute in a scenario.
240
+
241
+ This exception occurs when:
242
+ - Attempting to access a field not present in a scenario
243
+ - Using an attribute accessor on a scenario for a missing property
244
+ - CSV or dataframe column access issues
245
+
246
+ To fix this error:
247
+ 1. Check that the attribute name is correct
248
+ 2. Verify the scenario contains the expected fields
249
+ 3. Use hasattr() to check for attribute existence before access
250
+
251
+ Examples:
252
+ ```python
253
+ scenario.nonexistent_attribute # Raises AttributeScenarioError
254
+ ```
255
+ """
256
+
257
+ def __init__(self, message: str):
258
+ """
259
+ Initialize the AttributeScenarioError with a message.
260
+
261
+ Args:
262
+ message: A description of the error that occurred.
263
+ """
264
+ super().__init__(message)
265
+
266
+
267
+ class IndexScenarioError(ScenarioError):
268
+ """
269
+ Exception raised when an index is out of range in scenario operations.
270
+
271
+ This exception occurs when:
272
+ - Accessing a scenario index outside the valid range
273
+ - Using an invalid index in a scenario list operation
274
+ - Sequence operations with invalid indices
275
+
276
+ To fix this error:
277
+ 1. Check array boundaries before accessing elements
278
+ 2. Verify indices are within valid ranges for the collection
279
+ 3. Use len() to determine the valid index range
280
+
281
+ Examples:
282
+ ```python
283
+ scenario_list[999] # Raises IndexScenarioError if fewer items exist
284
+ ```
285
+ """
286
+
287
+ def __init__(self, message: str):
288
+ """
289
+ Initialize the IndexScenarioError with a message.
290
+
291
+ Args:
292
+ message: A description of the error that occurred.
293
+ """
294
+ super().__init__(message)
295
+
296
+
297
+ class KeyScenarioError(ScenarioError):
298
+ """
299
+ Exception raised when a key is missing in scenario operations.
300
+
301
+ This exception occurs when:
302
+ - Accessing a non-existent key in a scenario
303
+ - Using key-based access for missing fields
304
+ - Dictionary operations with invalid keys
305
+
306
+ To fix this error:
307
+ 1. Check if the key exists before attempting access
308
+ 2. Use dictionary get() method with default values for safer access
309
+ 3. Verify the scenario contains the expected keys
310
+
311
+ Examples:
312
+ ```python
313
+ scenario["missing_key"] # Raises KeyScenarioError
314
+ ```
315
+ """
316
+
317
+ def __init__(self, message: str):
318
+ """
319
+ Initialize the KeyScenarioError with a message.
320
+
321
+ Args:
322
+ message: A description of the error that occurred.
323
+ """
324
+ super().__init__(message)
325
+
@@ -40,7 +40,7 @@ class FileMethods(ABC):
40
40
 
41
41
  for ep in entries:
42
42
  try:
43
- handler_class = ep.load()
43
+ ep.load()
44
44
  # Registration happens automatically via __init_subclass__
45
45
  except Exception as e:
46
46
  print(f"Failed to load external handler {ep.name}: {e}")
@@ -4,16 +4,19 @@ import tempfile
4
4
  import mimetypes
5
5
  import asyncio
6
6
  import os
7
- from typing import Dict, Any, IO, Optional
7
+ from typing import Dict, IO, Optional
8
8
  from typing import Union
9
9
  from uuid import UUID
10
10
  import time
11
- from typing import Dict, Any, IO, Optional, List, Union, Literal
11
+ from typing import List, Literal, TYPE_CHECKING
12
12
 
13
13
  from .scenario import Scenario
14
14
  from ..utilities import remove_edsl_version
15
15
  from .file_methods import FileMethods
16
16
 
17
+ if TYPE_CHECKING:
18
+ from .scenario_list import ScenarioList
19
+
17
20
  class FileStore(Scenario):
18
21
  """
19
22
  A specialized Scenario subclass for managing file content and metadata.
@@ -246,6 +249,7 @@ class FileStore(Scenario):
246
249
  Returns:
247
250
  ScenarioList containing FileStore objects with their corresponding URLs
248
251
  """
252
+ # Import here to avoid circular imports
249
253
  from .scenario_list import ScenarioList
250
254
 
251
255
  try:
@@ -282,7 +286,7 @@ class FileStore(Scenario):
282
286
 
283
287
  @property
284
288
  def size(self) -> int:
285
- if self.base64_string != None:
289
+ if self.base64_string is not None:
286
290
  return (len(self.base64_string) / 4.0) * 3 # from base64 to char size
287
291
  return os.path.getsize(self.path)
288
292
 
@@ -1,3 +1,20 @@
1
+ __all__ = [
2
+ "PdfMethods",
3
+ "DocxMethods",
4
+ "PngMethods",
5
+ "TxtMethods",
6
+ "HtmlMethods",
7
+ "MarkdownMethods",
8
+ "CsvMethods",
9
+ "JsonMethods",
10
+ "SqlMethods",
11
+ "PptxMethods",
12
+ "LaTeXMethods",
13
+ "PyMethods",
14
+ "SQLiteMethods",
15
+ "JpegMethods"
16
+ ]
17
+
1
18
  from .pdf_file_store import PdfMethods
2
19
  from .docx_file_store import DocxMethods
3
20
  from .png_file_store import PngMethods
@@ -2,9 +2,6 @@ import os
2
2
  import tempfile
3
3
 
4
4
  from ..file_methods import FileMethods
5
- from ..scenario import Scenario
6
- from ..scenario_list import ScenarioList
7
- from ..file_store import FileStore
8
5
 
9
6
  class DocxMethods(FileMethods):
10
7
  suffix = "docx"
@@ -59,8 +56,6 @@ class DocxMethods(FileMethods):
59
56
 
60
57
  def example(self):
61
58
  from docx import Document
62
- from ..scenario import Scenario
63
- from ..scenario_list import ScenarioList
64
59
 
65
60
  os.makedirs("test_dir", exist_ok=True)
66
61
  doc1 = Document()
@@ -27,7 +27,6 @@ class PdfMethods(FileMethods):
27
27
  return text
28
28
 
29
29
  def view_system(self):
30
- import os
31
30
  import subprocess
32
31
 
33
32
  if os.path.exists(self.path):
@@ -2,9 +2,6 @@ from ..file_methods import FileMethods
2
2
  import os
3
3
  import tempfile
4
4
 
5
- from ..scenario import Scenario
6
- from ..scenario_list import ScenarioList
7
- from ..file_store import FileStore
8
5
 
9
6
  class PptxMethods(FileMethods):
10
7
  suffix = "pptx"
@@ -76,8 +73,6 @@ class PptxMethods(FileMethods):
76
73
 
77
74
  def example(self):
78
75
  from pptx import Presentation
79
- from ..scenario import Scenario
80
- from ..scenario_list import ScenarioList
81
76
 
82
77
  os.makedirs("test_dir", exist_ok=True)
83
78
 
@@ -35,7 +35,6 @@ class PyMethods(FileMethods):
35
35
  import pygments
36
36
  from pygments.lexers import PythonLexer
37
37
  from pygments.formatters import HtmlFormatter
38
- from pygments.styles import get_style_by_name
39
38
 
40
39
  try:
41
40
  with open(self.path, "r", encoding="utf-8") as f:
@@ -1,6 +1,6 @@
1
1
  import tempfile
2
2
  import re
3
- from typing import List, Optional
3
+ from typing import List
4
4
  import textwrap
5
5
 
6
6
 
@@ -217,9 +217,6 @@ class SqlMethods(FileMethods):
217
217
  This is a simple check and doesn't replace proper SQL parsing.
218
218
  """
219
219
  try:
220
- with open(self.path, "r", encoding="utf-8") as f:
221
- content = f.read()
222
-
223
220
  statements = self.split_statements()
224
221
  for stmt in statements:
225
222
  # Check for basic SQL keywords
@@ -50,7 +50,6 @@ class SQLiteMethods(FileMethods):
50
50
  """
51
51
  Opens the database with the system's default SQLite viewer if available.
52
52
  """
53
- import os
54
53
  import subprocess
55
54
 
56
55
  if os.path.exists(self.path):
@@ -23,7 +23,7 @@ class TxtMethods(FileMethods):
23
23
  print("TXT file was not found.")
24
24
 
25
25
  def view_notebook(self):
26
- from IPython.display import FileLink, display
26
+ from ...display import FileLink, display
27
27
 
28
28
  display(FileLink(self.path))
29
29
 
@@ -20,7 +20,6 @@ information to questions in surveys.
20
20
  from __future__ import annotations
21
21
  import copy
22
22
  import os
23
- import json
24
23
  from collections import UserDict
25
24
  from typing import Union, List, Optional, TYPE_CHECKING, Collection
26
25
  from uuid import uuid4