orionis 0.405.0__py3-none-any.whl → 0.406.0__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.
- orionis/console/base/command.py +57 -50
- orionis/console/base/contracts/command.py +68 -0
- orionis/console/dynamic/contracts/progress_bar.py +3 -3
- orionis/console/dynamic/progress_bar.py +8 -8
- orionis/console/output/console.py +8 -2
- orionis/console/output/contracts/console.py +1 -1
- orionis/container/container.py +2 -2
- orionis/container/context/scope.py +4 -1
- orionis/container/contracts/service_provider.py +2 -2
- orionis/container/entities/binding.py +31 -44
- orionis/container/enums/lifetimes.py +22 -1
- orionis/container/facades/facade.py +1 -2
- orionis/container/providers/service_provider.py +2 -2
- orionis/foundation/application.py +542 -248
- orionis/foundation/config/app/entities/app.py +107 -90
- orionis/foundation/config/auth/entities/auth.py +4 -33
- orionis/foundation/config/cache/entities/cache.py +18 -41
- orionis/foundation/config/cache/entities/file.py +8 -35
- orionis/foundation/config/cache/entities/stores.py +17 -38
- orionis/foundation/config/cors/entities/cors.py +41 -54
- orionis/foundation/config/database/entities/connections.py +40 -56
- orionis/foundation/config/database/entities/database.py +11 -38
- orionis/foundation/config/database/entities/mysql.py +48 -76
- orionis/foundation/config/database/entities/oracle.py +30 -57
- orionis/foundation/config/database/entities/pgsql.py +45 -61
- orionis/foundation/config/database/entities/sqlite.py +26 -53
- orionis/foundation/config/filesystems/entitites/aws.py +28 -49
- orionis/foundation/config/filesystems/entitites/disks.py +27 -47
- orionis/foundation/config/filesystems/entitites/filesystems.py +15 -37
- orionis/foundation/config/filesystems/entitites/local.py +9 -35
- orionis/foundation/config/filesystems/entitites/public.py +14 -41
- orionis/foundation/config/logging/entities/channels.py +56 -86
- orionis/foundation/config/logging/entities/chunked.py +9 -9
- orionis/foundation/config/logging/entities/daily.py +8 -8
- orionis/foundation/config/logging/entities/hourly.py +6 -6
- orionis/foundation/config/logging/entities/logging.py +12 -18
- orionis/foundation/config/logging/entities/monthly.py +7 -7
- orionis/foundation/config/logging/entities/stack.py +5 -5
- orionis/foundation/config/logging/entities/weekly.py +6 -6
- orionis/foundation/config/mail/entities/file.py +9 -36
- orionis/foundation/config/mail/entities/mail.py +22 -40
- orionis/foundation/config/mail/entities/mailers.py +29 -44
- orionis/foundation/config/mail/entities/smtp.py +47 -48
- orionis/foundation/config/queue/entities/brokers.py +19 -41
- orionis/foundation/config/queue/entities/database.py +24 -46
- orionis/foundation/config/queue/entities/queue.py +28 -40
- orionis/foundation/config/roots/paths.py +272 -468
- orionis/foundation/config/session/entities/session.py +23 -53
- orionis/foundation/config/startup.py +165 -135
- orionis/foundation/config/testing/entities/testing.py +137 -122
- orionis/foundation/config/testing/enums/__init__.py +6 -2
- orionis/foundation/config/testing/enums/drivers.py +16 -0
- orionis/foundation/config/testing/enums/verbosity.py +18 -0
- orionis/foundation/contracts/application.py +152 -362
- orionis/foundation/providers/console_provider.py +24 -2
- orionis/foundation/providers/dumper_provider.py +24 -2
- orionis/foundation/providers/logger_provider.py +24 -2
- orionis/foundation/providers/path_resolver_provider.py +25 -2
- orionis/foundation/providers/progress_bar_provider.py +24 -2
- orionis/foundation/providers/testing_provider.py +39 -0
- orionis/foundation/providers/workers_provider.py +24 -2
- orionis/metadata/framework.py +1 -1
- orionis/services/environment/helpers/functions.py +1 -2
- orionis/services/environment/key/__init__.py +0 -0
- orionis/services/environment/key/key_generator.py +37 -0
- orionis/support/entities/__init__.py +0 -0
- orionis/support/entities/base.py +104 -0
- orionis/support/facades/testing.py +15 -0
- orionis/support/facades/workers.py +1 -1
- orionis/test/cases/asynchronous.py +0 -11
- orionis/test/cases/synchronous.py +0 -9
- orionis/test/contracts/dumper.py +11 -4
- orionis/test/contracts/kernel.py +5 -110
- orionis/test/contracts/logs.py +27 -65
- orionis/test/contracts/printer.py +16 -128
- orionis/test/contracts/test_result.py +100 -0
- orionis/test/contracts/unit_test.py +87 -150
- orionis/test/core/unit_test.py +608 -554
- orionis/test/entities/result.py +22 -2
- orionis/test/enums/__init__.py +0 -2
- orionis/test/enums/status.py +14 -9
- orionis/test/exceptions/config.py +9 -1
- orionis/test/exceptions/failure.py +34 -11
- orionis/test/exceptions/persistence.py +10 -2
- orionis/test/exceptions/runtime.py +9 -1
- orionis/test/exceptions/value.py +13 -1
- orionis/test/kernel.py +87 -289
- orionis/test/output/dumper.py +82 -18
- orionis/test/output/printer.py +399 -156
- orionis/test/records/logs.py +203 -82
- orionis/test/validators/__init__.py +33 -0
- orionis/test/validators/base_path.py +45 -0
- orionis/test/validators/execution_mode.py +45 -0
- orionis/test/validators/fail_fast.py +37 -0
- orionis/test/validators/folder_path.py +34 -0
- orionis/test/validators/module_name.py +31 -0
- orionis/test/validators/name_pattern.py +40 -0
- orionis/test/validators/pattern.py +36 -0
- orionis/test/validators/persistent.py +42 -0
- orionis/test/validators/persistent_driver.py +43 -0
- orionis/test/validators/print_result.py +37 -0
- orionis/test/validators/tags.py +37 -0
- orionis/test/validators/throw_exception.py +39 -0
- orionis/test/validators/verbosity.py +37 -0
- orionis/test/validators/web_report.py +35 -0
- orionis/test/validators/workers.py +31 -0
- orionis/test/view/render.py +48 -54
- {orionis-0.405.0.dist-info → orionis-0.406.0.dist-info}/METADATA +1 -1
- {orionis-0.405.0.dist-info → orionis-0.406.0.dist-info}/RECORD +149 -98
- tests/container/__init__.py +0 -0
- tests/container/context/__init__.py +0 -0
- tests/container/context/test_manager.py +27 -0
- tests/container/context/test_scope.py +23 -0
- tests/container/entities/__init__.py +0 -0
- tests/container/entities/test_binding.py +133 -0
- tests/container/enums/__init__.py +0 -0
- tests/container/enums/test_lifetimes.py +63 -0
- tests/container/facades/__init__.py +0 -0
- tests/container/facades/test_facade.py +61 -0
- tests/container/mocks/__init__.py +0 -0
- tests/container/mocks/mock_complex_classes.py +482 -0
- tests/container/mocks/mock_simple_classes.py +32 -0
- tests/container/providers/__init__.py +0 -0
- tests/container/providers/test_providers.py +48 -0
- tests/container/resolver/__init__.py +0 -0
- tests/container/resolver/test_resolver.py +55 -0
- tests/container/test_container.py +254 -0
- tests/container/test_singleton.py +98 -0
- tests/container/test_thread_safety.py +217 -0
- tests/container/validators/__init__.py +0 -0
- tests/container/validators/test_implements.py +140 -0
- tests/container/validators/test_is_abstract_class.py +99 -0
- tests/container/validators/test_is_callable.py +73 -0
- tests/container/validators/test_is_concrete_class.py +97 -0
- tests/container/validators/test_is_instance.py +105 -0
- tests/container/validators/test_is_not_subclass.py +117 -0
- tests/container/validators/test_is_subclass.py +115 -0
- tests/container/validators/test_is_valid_alias.py +113 -0
- tests/container/validators/test_lifetime.py +75 -0
- tests/foundation/config/testing/test_foundation_config_testing.py +1 -1
- tests/metadata/test_metadata_framework.py +18 -18
- tests/testing/test_testing_result.py +117 -117
- tests/testing/test_testing_unit.py +209 -209
- orionis/foundation/config/base.py +0 -112
- orionis/test/arguments/parser.py +0 -187
- orionis/test/contracts/parser.py +0 -43
- orionis/test/entities/arguments.py +0 -38
- orionis/test/enums/execution_mode.py +0 -16
- /orionis/{test/arguments → console/base/contracts}/__init__.py +0 -0
- /orionis/foundation/config/testing/enums/{test_mode.py → mode.py} +0 -0
- {orionis-0.405.0.dist-info → orionis-0.406.0.dist-info}/WHEEL +0 -0
- {orionis-0.405.0.dist-info → orionis-0.406.0.dist-info}/licenses/LICENCE +0 -0
- {orionis-0.405.0.dist-info → orionis-0.406.0.dist-info}/top_level.txt +0 -0
- {orionis-0.405.0.dist-info → orionis-0.406.0.dist-info}/zip-safe +0 -0
orionis/test/entities/result.py
CHANGED
|
@@ -5,7 +5,14 @@ from orionis.test.enums import TestStatus
|
|
|
5
5
|
@dataclass(frozen=True, kw_only=True)
|
|
6
6
|
class TestResult:
|
|
7
7
|
"""
|
|
8
|
-
|
|
8
|
+
Data class representing the outcome of a test execution.
|
|
9
|
+
|
|
10
|
+
This class encapsulates all relevant information about a test's execution,
|
|
11
|
+
including its unique identifier, name, execution status, timing, and any
|
|
12
|
+
error details if the test did not pass. It also stores optional metadata
|
|
13
|
+
such as the class, method, module, file path, and docstring associated
|
|
14
|
+
with the test, if applicable.
|
|
15
|
+
|
|
9
16
|
Attributes:
|
|
10
17
|
id (Any): Unique identifier for the test result.
|
|
11
18
|
name (str): Name of the test.
|
|
@@ -18,33 +25,40 @@ class TestResult:
|
|
|
18
25
|
module (Optional[str]): Name of the module containing the test, if applicable.
|
|
19
26
|
file_path (Optional[str]): Path to the file containing the test, if applicable.
|
|
20
27
|
doc_string (Optional[str]): Docstring of the test, if applicable.
|
|
21
|
-
"""
|
|
22
28
|
|
|
29
|
+
Returns:
|
|
30
|
+
TestResult: An immutable instance containing all details about a single test execution.
|
|
31
|
+
"""
|
|
23
32
|
|
|
33
|
+
# Unique identifier for the test result
|
|
24
34
|
id: Any = field(
|
|
25
35
|
metadata={
|
|
26
36
|
"description": "Unique identifier for the test result."
|
|
27
37
|
}
|
|
28
38
|
)
|
|
29
39
|
|
|
40
|
+
# Name of the test
|
|
30
41
|
name: str = field(
|
|
31
42
|
metadata={
|
|
32
43
|
"description": "Name of the test."
|
|
33
44
|
}
|
|
34
45
|
)
|
|
35
46
|
|
|
47
|
+
# Status of the test execution (e.g., passed, failed)
|
|
36
48
|
status: TestStatus = field(
|
|
37
49
|
metadata={
|
|
38
50
|
"description": "Status of the test execution (e.g., passed, failed)."
|
|
39
51
|
}
|
|
40
52
|
)
|
|
41
53
|
|
|
54
|
+
# Time taken to execute the test, in seconds
|
|
42
55
|
execution_time: float = field(
|
|
43
56
|
metadata={
|
|
44
57
|
"description": "Time taken to execute the test, in seconds."
|
|
45
58
|
}
|
|
46
59
|
)
|
|
47
60
|
|
|
61
|
+
# Error message if the test failed, otherwise None
|
|
48
62
|
error_message: Optional[str] = field(
|
|
49
63
|
default=None,
|
|
50
64
|
metadata={
|
|
@@ -52,6 +66,7 @@ class TestResult:
|
|
|
52
66
|
}
|
|
53
67
|
)
|
|
54
68
|
|
|
69
|
+
# Traceback information if an error occurred, otherwise None
|
|
55
70
|
traceback: Optional[str] = field(
|
|
56
71
|
default=None,
|
|
57
72
|
metadata={
|
|
@@ -59,6 +74,7 @@ class TestResult:
|
|
|
59
74
|
}
|
|
60
75
|
)
|
|
61
76
|
|
|
77
|
+
# Name of the class containing the test, if applicable
|
|
62
78
|
class_name: Optional[str] = field(
|
|
63
79
|
default=None,
|
|
64
80
|
metadata={
|
|
@@ -66,6 +82,7 @@ class TestResult:
|
|
|
66
82
|
}
|
|
67
83
|
)
|
|
68
84
|
|
|
85
|
+
# Name of the method representing the test, if applicable
|
|
69
86
|
method: Optional[str] = field(
|
|
70
87
|
default=None,
|
|
71
88
|
metadata={
|
|
@@ -73,6 +90,7 @@ class TestResult:
|
|
|
73
90
|
}
|
|
74
91
|
)
|
|
75
92
|
|
|
93
|
+
# Name of the module containing the test, if applicable
|
|
76
94
|
module: Optional[str] = field(
|
|
77
95
|
default=None,
|
|
78
96
|
metadata={
|
|
@@ -80,6 +98,7 @@ class TestResult:
|
|
|
80
98
|
}
|
|
81
99
|
)
|
|
82
100
|
|
|
101
|
+
# Path to the file containing the test, if applicable
|
|
83
102
|
file_path: Optional[str] = field(
|
|
84
103
|
default=None,
|
|
85
104
|
metadata={
|
|
@@ -87,6 +106,7 @@ class TestResult:
|
|
|
87
106
|
}
|
|
88
107
|
)
|
|
89
108
|
|
|
109
|
+
# Docstring of the test, if applicable
|
|
90
110
|
doc_string: Optional[str] = field(
|
|
91
111
|
default=None,
|
|
92
112
|
metadata={
|
orionis/test/enums/__init__.py
CHANGED
orionis/test/enums/status.py
CHANGED
|
@@ -3,20 +3,25 @@ from enum import Enum, auto
|
|
|
3
3
|
class TestStatus(Enum):
|
|
4
4
|
"""
|
|
5
5
|
TestStatus(Enum)
|
|
6
|
-
|
|
6
|
+
An enumeration representing the possible statuses that a test can have during its execution.
|
|
7
7
|
|
|
8
8
|
Attributes
|
|
9
9
|
----------
|
|
10
10
|
PASSED : auto()
|
|
11
|
-
|
|
11
|
+
The test completed successfully without any errors or failures.
|
|
12
12
|
FAILED : auto()
|
|
13
|
-
|
|
13
|
+
The test ran to completion but did not produce the expected results.
|
|
14
14
|
ERRORED : auto()
|
|
15
|
-
|
|
15
|
+
An unexpected error occurred during the execution of the test, preventing it from completing.
|
|
16
16
|
SKIPPED : auto()
|
|
17
|
-
|
|
17
|
+
The test was intentionally not executed, typically due to configuration or conditional logic.
|
|
18
|
+
|
|
19
|
+
Returns
|
|
20
|
+
-------
|
|
21
|
+
TestStatus
|
|
22
|
+
An instance of the TestStatus enumeration indicating the current status of a test.
|
|
18
23
|
"""
|
|
19
|
-
PASSED = auto()
|
|
20
|
-
FAILED = auto()
|
|
21
|
-
ERRORED = auto()
|
|
22
|
-
SKIPPED = auto()
|
|
24
|
+
PASSED = auto() # Test executed successfully
|
|
25
|
+
FAILED = auto() # Test executed but failed
|
|
26
|
+
ERRORED = auto() # Error occurred during test execution
|
|
27
|
+
SKIPPED = auto() # Test was intentionally skipped
|
|
@@ -2,18 +2,26 @@ class OrionisTestConfigException(Exception):
|
|
|
2
2
|
|
|
3
3
|
def __init__(self, msg: str):
|
|
4
4
|
"""
|
|
5
|
+
Initializes the OrionisTestConfigException with a descriptive error message.
|
|
6
|
+
|
|
5
7
|
Parameters
|
|
6
8
|
----------
|
|
7
9
|
msg : str
|
|
8
10
|
Descriptive error message explaining the cause of the exception.
|
|
9
11
|
"""
|
|
12
|
+
|
|
13
|
+
# Call the base Exception class constructor with the message
|
|
10
14
|
super().__init__(msg)
|
|
11
15
|
|
|
12
16
|
def __str__(self) -> str:
|
|
13
17
|
"""
|
|
18
|
+
Returns a formatted string representation of the exception message.
|
|
19
|
+
|
|
14
20
|
Returns
|
|
15
21
|
-------
|
|
16
22
|
str
|
|
17
|
-
|
|
23
|
+
The error message provided during exception initialization.
|
|
18
24
|
"""
|
|
25
|
+
|
|
26
|
+
# Return the first argument as the exception message
|
|
19
27
|
return str(self.args[0])
|
|
@@ -4,7 +4,11 @@ class OrionisTestFailureException(Exception):
|
|
|
4
4
|
|
|
5
5
|
def __init__(self, result: unittest.TestResult):
|
|
6
6
|
"""
|
|
7
|
-
|
|
7
|
+
Initializes the OrionisTestFailureException with details about failed and errored tests.
|
|
8
|
+
|
|
9
|
+
This constructor extracts information from the provided unittest.TestResult object,
|
|
10
|
+
including the IDs of tests that failed or encountered errors. It then formats a summary
|
|
11
|
+
message listing all such tests and passes this message to the base Exception class.
|
|
8
12
|
|
|
9
13
|
Parameters
|
|
10
14
|
----------
|
|
@@ -13,38 +17,57 @@ class OrionisTestFailureException(Exception):
|
|
|
13
17
|
|
|
14
18
|
Attributes
|
|
15
19
|
----------
|
|
16
|
-
failed_tests : list
|
|
17
|
-
List of IDs
|
|
18
|
-
errored_tests : list
|
|
19
|
-
List of IDs
|
|
20
|
-
error_messages : list
|
|
21
|
-
List of formatted error messages for failed
|
|
20
|
+
failed_tests : list of str
|
|
21
|
+
List of test IDs that failed.
|
|
22
|
+
errored_tests : list of str
|
|
23
|
+
List of test IDs that encountered errors.
|
|
24
|
+
error_messages : list of str
|
|
25
|
+
List of formatted error messages for each failed or errored test.
|
|
22
26
|
text : str
|
|
23
|
-
Formatted string summarizing
|
|
27
|
+
Formatted string summarizing all test failures and errors.
|
|
28
|
+
|
|
29
|
+
Returns
|
|
30
|
+
-------
|
|
31
|
+
None
|
|
32
|
+
This method does not return a value. It initializes the exception instance.
|
|
24
33
|
|
|
25
34
|
Raises
|
|
26
35
|
------
|
|
27
|
-
|
|
28
|
-
|
|
36
|
+
OrionisTestFailureException
|
|
37
|
+
Raised when there are failed or errored tests, with a summary message.
|
|
29
38
|
"""
|
|
39
|
+
|
|
40
|
+
# Collect IDs of failed tests
|
|
30
41
|
failed_tests = [test.id() for test, _ in result.failures]
|
|
42
|
+
|
|
43
|
+
# Collect IDs of tests that encountered errors
|
|
31
44
|
errored_tests = [test.id() for test, _ in result.errors]
|
|
32
45
|
|
|
33
46
|
error_messages = []
|
|
47
|
+
|
|
48
|
+
# Add formatted messages for failed tests
|
|
34
49
|
for test in failed_tests:
|
|
35
50
|
error_messages.append(f"Test Fail: {test}")
|
|
51
|
+
|
|
52
|
+
# Add formatted messages for errored tests
|
|
36
53
|
for test in errored_tests:
|
|
37
54
|
error_messages.append(f"Test Error: {test}")
|
|
38
55
|
|
|
56
|
+
# Combine all error messages into a single string
|
|
39
57
|
text = "\n".join(error_messages)
|
|
40
58
|
|
|
59
|
+
# Initialize the base Exception with the summary message
|
|
41
60
|
super().__init__(f"{len(failed_tests) + len(errored_tests)} test(s) failed or errored:\n{text}")
|
|
42
61
|
|
|
43
62
|
def __str__(self) -> str:
|
|
44
63
|
"""
|
|
64
|
+
Returns a formatted string describing the exception.
|
|
65
|
+
|
|
45
66
|
Returns
|
|
46
67
|
-------
|
|
47
68
|
str
|
|
48
|
-
|
|
69
|
+
The summary message containing the number and details of failed and errored tests.
|
|
49
70
|
"""
|
|
71
|
+
|
|
72
|
+
# Return the first argument passed to the exception as a string
|
|
50
73
|
return str(self.args[0])
|
|
@@ -2,18 +2,26 @@ class OrionisTestPersistenceError(Exception):
|
|
|
2
2
|
|
|
3
3
|
def __init__(self, msg: str):
|
|
4
4
|
"""
|
|
5
|
+
Initializes the OrionisTestPersistenceError with a descriptive error message.
|
|
6
|
+
|
|
5
7
|
Parameters
|
|
6
8
|
----------
|
|
7
9
|
msg : str
|
|
8
|
-
|
|
10
|
+
A descriptive error message that explains the cause of the exception.
|
|
9
11
|
"""
|
|
12
|
+
|
|
13
|
+
# Call the base Exception class constructor with the message
|
|
10
14
|
super().__init__(msg)
|
|
11
15
|
|
|
12
16
|
def __str__(self) -> str:
|
|
13
17
|
"""
|
|
18
|
+
Returns a formatted string representation of the exception message.
|
|
19
|
+
|
|
14
20
|
Returns
|
|
15
21
|
-------
|
|
16
22
|
str
|
|
17
|
-
|
|
23
|
+
The error message provided when the exception was raised.
|
|
18
24
|
"""
|
|
25
|
+
|
|
26
|
+
# Return the first argument passed to the exception as a string
|
|
19
27
|
return str(self.args[0])
|
|
@@ -2,18 +2,26 @@ class OrionisTestRuntimeError(Exception):
|
|
|
2
2
|
|
|
3
3
|
def __init__(self, msg: str):
|
|
4
4
|
"""
|
|
5
|
+
Initializes the OrionisTestRuntimeError with a descriptive error message.
|
|
6
|
+
|
|
5
7
|
Parameters
|
|
6
8
|
----------
|
|
7
9
|
msg : str
|
|
8
10
|
Descriptive error message explaining the cause of the exception.
|
|
9
11
|
"""
|
|
12
|
+
|
|
13
|
+
# Call the base class constructor with the error message
|
|
10
14
|
super().__init__(msg)
|
|
11
15
|
|
|
12
16
|
def __str__(self) -> str:
|
|
13
17
|
"""
|
|
18
|
+
Returns a formatted string representation of the exception.
|
|
19
|
+
|
|
14
20
|
Returns
|
|
15
21
|
-------
|
|
16
22
|
str
|
|
17
|
-
|
|
23
|
+
The error message provided during exception initialization.
|
|
18
24
|
"""
|
|
25
|
+
|
|
26
|
+
# Return the error message stored in the first argument
|
|
19
27
|
return str(self.args[0])
|
orionis/test/exceptions/value.py
CHANGED
|
@@ -2,18 +2,30 @@ class OrionisTestValueError(Exception):
|
|
|
2
2
|
|
|
3
3
|
def __init__(self, msg: str):
|
|
4
4
|
"""
|
|
5
|
+
Initializes the OrionisTestValueError with a descriptive error message.
|
|
6
|
+
|
|
5
7
|
Parameters
|
|
6
8
|
----------
|
|
7
9
|
msg : str
|
|
8
10
|
Descriptive error message explaining the cause of the exception.
|
|
9
11
|
"""
|
|
12
|
+
|
|
13
|
+
# Call the base class constructor with the error message
|
|
10
14
|
super().__init__(msg)
|
|
11
15
|
|
|
12
16
|
def __str__(self) -> str:
|
|
13
17
|
"""
|
|
18
|
+
Returns a formatted string representation of the exception.
|
|
19
|
+
|
|
20
|
+
This method retrieves the error message provided during initialization
|
|
21
|
+
and returns it as a string. It ensures that when the exception is
|
|
22
|
+
converted to a string, the descriptive message is displayed.
|
|
23
|
+
|
|
14
24
|
Returns
|
|
15
25
|
-------
|
|
16
26
|
str
|
|
17
|
-
|
|
27
|
+
The descriptive error message associated with this exception.
|
|
18
28
|
"""
|
|
29
|
+
|
|
30
|
+
# Return the error message stored in the first argument
|
|
19
31
|
return str(self.args[0])
|