edsl 0.1.48__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.
- edsl/__init__.py +124 -53
- edsl/__version__.py +1 -1
- edsl/agents/agent.py +21 -21
- edsl/agents/agent_list.py +2 -5
- edsl/agents/exceptions.py +119 -5
- edsl/base/__init__.py +10 -35
- edsl/base/base_class.py +71 -36
- edsl/base/base_exception.py +204 -0
- edsl/base/data_transfer_models.py +1 -1
- edsl/base/exceptions.py +94 -0
- edsl/buckets/__init__.py +15 -1
- edsl/buckets/bucket_collection.py +3 -4
- edsl/buckets/exceptions.py +75 -0
- edsl/buckets/model_buckets.py +1 -2
- edsl/buckets/token_bucket.py +11 -6
- edsl/buckets/token_bucket_api.py +1 -2
- edsl/buckets/token_bucket_client.py +9 -7
- edsl/caching/cache.py +7 -2
- edsl/caching/cache_entry.py +10 -9
- edsl/caching/exceptions.py +113 -7
- edsl/caching/remote_cache_sync.py +1 -2
- edsl/caching/sql_dict.py +17 -12
- edsl/cli.py +43 -0
- edsl/config/config_class.py +30 -6
- edsl/conversation/Conversation.py +3 -2
- edsl/conversation/exceptions.py +58 -0
- edsl/conversation/mug_negotiation.py +0 -2
- edsl/coop/__init__.py +20 -1
- edsl/coop/coop.py +129 -38
- edsl/coop/exceptions.py +188 -9
- edsl/coop/price_fetcher.py +3 -6
- edsl/coop/utils.py +4 -6
- edsl/dataset/__init__.py +5 -4
- edsl/dataset/dataset.py +53 -43
- edsl/dataset/dataset_operations_mixin.py +86 -72
- edsl/dataset/dataset_tree.py +9 -5
- edsl/dataset/display/table_display.py +0 -2
- edsl/dataset/display/table_renderers.py +0 -1
- edsl/dataset/exceptions.py +125 -0
- edsl/dataset/file_exports.py +18 -11
- edsl/dataset/r/ggplot.py +13 -6
- edsl/display/__init__.py +27 -0
- edsl/display/core.py +147 -0
- edsl/display/plugin.py +189 -0
- edsl/display/utils.py +52 -0
- edsl/inference_services/__init__.py +9 -1
- edsl/inference_services/available_model_cache_handler.py +1 -1
- edsl/inference_services/available_model_fetcher.py +4 -5
- edsl/inference_services/data_structures.py +9 -6
- edsl/inference_services/exceptions.py +132 -1
- edsl/inference_services/inference_service_abc.py +2 -2
- edsl/inference_services/inference_services_collection.py +2 -6
- edsl/inference_services/registry.py +4 -3
- edsl/inference_services/service_availability.py +2 -1
- edsl/inference_services/services/anthropic_service.py +4 -1
- edsl/inference_services/services/aws_bedrock.py +13 -12
- edsl/inference_services/services/azure_ai.py +12 -10
- edsl/inference_services/services/deep_infra_service.py +1 -4
- edsl/inference_services/services/deep_seek_service.py +1 -5
- edsl/inference_services/services/google_service.py +6 -2
- edsl/inference_services/services/groq_service.py +1 -1
- edsl/inference_services/services/mistral_ai_service.py +4 -2
- edsl/inference_services/services/ollama_service.py +1 -1
- edsl/inference_services/services/open_ai_service.py +7 -5
- edsl/inference_services/services/perplexity_service.py +6 -2
- edsl/inference_services/services/test_service.py +8 -7
- edsl/inference_services/services/together_ai_service.py +2 -3
- edsl/inference_services/services/xai_service.py +1 -1
- edsl/instructions/__init__.py +1 -1
- edsl/instructions/change_instruction.py +3 -2
- edsl/instructions/exceptions.py +61 -0
- edsl/instructions/instruction.py +5 -2
- edsl/instructions/instruction_collection.py +2 -1
- edsl/instructions/instruction_handler.py +4 -9
- edsl/interviews/ReportErrors.py +0 -3
- edsl/interviews/__init__.py +9 -2
- edsl/interviews/answering_function.py +11 -13
- edsl/interviews/exception_tracking.py +14 -7
- edsl/interviews/exceptions.py +79 -0
- edsl/interviews/interview.py +32 -29
- edsl/interviews/interview_status_dictionary.py +4 -2
- edsl/interviews/interview_status_log.py +2 -1
- edsl/interviews/interview_task_manager.py +3 -3
- edsl/interviews/request_token_estimator.py +3 -1
- edsl/interviews/statistics.py +2 -3
- edsl/invigilators/__init__.py +7 -1
- edsl/invigilators/exceptions.py +79 -0
- edsl/invigilators/invigilator_base.py +0 -1
- edsl/invigilators/invigilators.py +8 -12
- edsl/invigilators/prompt_constructor.py +1 -5
- edsl/invigilators/prompt_helpers.py +8 -4
- edsl/invigilators/question_instructions_prompt_builder.py +1 -1
- edsl/invigilators/question_option_processor.py +9 -5
- edsl/invigilators/question_template_replacements_builder.py +3 -2
- edsl/jobs/__init__.py +3 -3
- edsl/jobs/async_interview_runner.py +24 -22
- edsl/jobs/check_survey_scenario_compatibility.py +7 -6
- edsl/jobs/data_structures.py +7 -4
- edsl/jobs/exceptions.py +177 -8
- edsl/jobs/fetch_invigilator.py +1 -1
- edsl/jobs/jobs.py +72 -67
- edsl/jobs/jobs_checks.py +2 -3
- edsl/jobs/jobs_component_constructor.py +2 -2
- edsl/jobs/jobs_pricing_estimation.py +3 -2
- edsl/jobs/jobs_remote_inference_logger.py +5 -4
- edsl/jobs/jobs_runner_asyncio.py +1 -2
- edsl/jobs/jobs_runner_status.py +8 -9
- edsl/jobs/remote_inference.py +26 -23
- edsl/jobs/results_exceptions_handler.py +8 -5
- edsl/key_management/__init__.py +3 -1
- edsl/key_management/exceptions.py +62 -0
- edsl/key_management/key_lookup.py +1 -1
- edsl/key_management/key_lookup_builder.py +37 -14
- edsl/key_management/key_lookup_collection.py +2 -0
- edsl/language_models/__init__.py +1 -1
- edsl/language_models/exceptions.py +302 -14
- edsl/language_models/language_model.py +4 -7
- edsl/language_models/model.py +4 -4
- edsl/language_models/model_list.py +1 -1
- edsl/language_models/price_manager.py +1 -1
- edsl/language_models/raw_response_handler.py +14 -9
- edsl/language_models/registry.py +17 -21
- edsl/language_models/repair.py +0 -6
- edsl/language_models/unused/fake_openai_service.py +0 -1
- edsl/load_plugins.py +69 -0
- edsl/logger.py +146 -0
- edsl/notebooks/notebook.py +1 -1
- edsl/notebooks/notebook_to_latex.py +0 -1
- edsl/plugins/__init__.py +63 -0
- edsl/plugins/built_in/export_example.py +50 -0
- edsl/plugins/built_in/pig_latin.py +67 -0
- edsl/plugins/cli.py +372 -0
- edsl/plugins/cli_typer.py +283 -0
- edsl/plugins/exceptions.py +31 -0
- edsl/plugins/hookspec.py +51 -0
- edsl/plugins/plugin_host.py +128 -0
- edsl/plugins/plugin_manager.py +633 -0
- edsl/plugins/plugins_registry.py +168 -0
- edsl/prompts/__init__.py +2 -0
- edsl/prompts/exceptions.py +107 -5
- edsl/prompts/prompt.py +14 -6
- edsl/questions/HTMLQuestion.py +5 -11
- edsl/questions/Quick.py +0 -1
- edsl/questions/__init__.py +2 -0
- edsl/questions/answer_validator_mixin.py +318 -318
- edsl/questions/compose_questions.py +2 -2
- edsl/questions/descriptors.py +10 -49
- edsl/questions/exceptions.py +278 -22
- edsl/questions/loop_processor.py +7 -5
- edsl/questions/prompt_templates/question_list.jinja +3 -0
- edsl/questions/question_base.py +14 -16
- edsl/questions/question_base_gen_mixin.py +2 -2
- edsl/questions/question_base_prompts_mixin.py +9 -3
- edsl/questions/question_budget.py +9 -5
- edsl/questions/question_check_box.py +3 -5
- edsl/questions/question_dict.py +171 -194
- edsl/questions/question_extract.py +1 -1
- edsl/questions/question_free_text.py +4 -6
- edsl/questions/question_functional.py +4 -3
- edsl/questions/question_list.py +36 -9
- edsl/questions/question_matrix.py +95 -61
- edsl/questions/question_multiple_choice.py +6 -4
- edsl/questions/question_numerical.py +2 -4
- edsl/questions/question_registry.py +4 -2
- edsl/questions/register_questions_meta.py +0 -1
- edsl/questions/response_validator_abc.py +7 -13
- edsl/questions/templates/dict/answering_instructions.jinja +1 -0
- edsl/questions/templates/rank/question_presentation.jinja +1 -1
- edsl/results/__init__.py +1 -1
- edsl/results/exceptions.py +141 -7
- edsl/results/report.py +0 -1
- edsl/results/result.py +4 -5
- edsl/results/results.py +10 -51
- edsl/results/results_selector.py +8 -4
- edsl/scenarios/PdfExtractor.py +2 -2
- edsl/scenarios/construct_download_link.py +69 -35
- edsl/scenarios/directory_scanner.py +33 -14
- edsl/scenarios/document_chunker.py +1 -1
- edsl/scenarios/exceptions.py +238 -14
- edsl/scenarios/file_methods.py +1 -1
- edsl/scenarios/file_store.py +7 -3
- edsl/scenarios/handlers/__init__.py +17 -0
- edsl/scenarios/handlers/docx_file_store.py +0 -5
- edsl/scenarios/handlers/pdf_file_store.py +0 -1
- edsl/scenarios/handlers/pptx_file_store.py +0 -5
- edsl/scenarios/handlers/py_file_store.py +0 -1
- edsl/scenarios/handlers/sql_file_store.py +1 -4
- edsl/scenarios/handlers/sqlite_file_store.py +0 -1
- edsl/scenarios/handlers/txt_file_store.py +1 -1
- edsl/scenarios/scenario.py +0 -1
- edsl/scenarios/scenario_list.py +152 -18
- edsl/scenarios/scenario_list_pdf_tools.py +1 -0
- edsl/scenarios/scenario_selector.py +0 -1
- edsl/surveys/__init__.py +3 -4
- edsl/surveys/dag/__init__.py +4 -2
- edsl/surveys/descriptors.py +1 -1
- edsl/surveys/edit_survey.py +1 -0
- edsl/surveys/exceptions.py +165 -9
- edsl/surveys/memory/__init__.py +5 -3
- edsl/surveys/memory/memory_management.py +1 -0
- edsl/surveys/memory/memory_plan.py +6 -15
- edsl/surveys/rules/__init__.py +5 -3
- edsl/surveys/rules/rule.py +1 -2
- edsl/surveys/rules/rule_collection.py +1 -1
- edsl/surveys/survey.py +12 -24
- edsl/surveys/survey_export.py +6 -3
- edsl/surveys/survey_flow_visualization.py +10 -1
- edsl/tasks/__init__.py +2 -0
- edsl/tasks/question_task_creator.py +3 -3
- edsl/tasks/task_creators.py +1 -3
- edsl/tasks/task_history.py +5 -7
- edsl/tasks/task_status_log.py +1 -2
- edsl/tokens/__init__.py +3 -1
- edsl/tokens/token_usage.py +1 -1
- edsl/utilities/__init__.py +21 -1
- edsl/utilities/decorators.py +1 -2
- edsl/utilities/markdown_to_docx.py +2 -2
- edsl/utilities/markdown_to_pdf.py +1 -1
- edsl/utilities/repair_functions.py +0 -1
- edsl/utilities/restricted_python.py +0 -1
- edsl/utilities/template_loader.py +2 -3
- edsl/utilities/utilities.py +8 -29
- {edsl-0.1.48.dist-info → edsl-0.1.50.dist-info}/METADATA +32 -2
- edsl-0.1.50.dist-info/RECORD +363 -0
- edsl-0.1.50.dist-info/entry_points.txt +3 -0
- edsl/dataset/smart_objects.py +0 -96
- edsl/exceptions/BaseException.py +0 -21
- edsl/exceptions/__init__.py +0 -54
- edsl/exceptions/configuration.py +0 -16
- edsl/exceptions/general.py +0 -34
- edsl/study/ObjectEntry.py +0 -173
- edsl/study/ProofOfWork.py +0 -113
- edsl/study/SnapShot.py +0 -80
- edsl/study/Study.py +0 -520
- edsl/study/__init__.py +0 -6
- edsl/utilities/interface.py +0 -135
- edsl-0.1.48.dist-info/RECORD +0 -347
- {edsl-0.1.48.dist-info → edsl-0.1.50.dist-info}/LICENSE +0 -0
- {edsl-0.1.48.dist-info → edsl-0.1.50.dist-info}/WHEEL +0 -0
edsl/scenarios/exceptions.py
CHANGED
@@ -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
|
20
|
-
|
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
|
-
|
23
|
-
|
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
|
41
|
-
|
42
|
-
|
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
|
-
|
88
|
-
|
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
|
-
|
100
|
-
|
101
|
-
|
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
|
+
|
edsl/scenarios/file_methods.py
CHANGED
edsl/scenarios/file_store.py
CHANGED
@@ -4,16 +4,19 @@ import tempfile
|
|
4
4
|
import mimetypes
|
5
5
|
import asyncio
|
6
6
|
import os
|
7
|
-
from typing import Dict,
|
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
|
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
|
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()
|
@@ -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
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import tempfile
|
2
2
|
import re
|
3
|
-
from typing import List
|
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
|
edsl/scenarios/scenario.py
CHANGED