qodalis-cli-server 1.0.0b1__tar.gz

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 (122) hide show
  1. qodalis_cli_server-1.0.0b1/.dockerignore +10 -0
  2. qodalis_cli_server-1.0.0b1/.github/.tmp/.generated-actions/run-pypi-publish-in-docker-container/action.yml +1 -0
  3. qodalis_cli_server-1.0.0b1/.github/workflows/build.yml +31 -0
  4. qodalis_cli_server-1.0.0b1/.github/workflows/publish.yml +150 -0
  5. qodalis_cli_server-1.0.0b1/.gitignore +43 -0
  6. qodalis_cli_server-1.0.0b1/Dockerfile +21 -0
  7. qodalis_cli_server-1.0.0b1/LICENSE +21 -0
  8. qodalis_cli_server-1.0.0b1/PKG-INFO +689 -0
  9. qodalis_cli_server-1.0.0b1/README.md +656 -0
  10. qodalis_cli_server-1.0.0b1/demo/Dockerfile +24 -0
  11. qodalis_cli_server-1.0.0b1/demo/main.py +124 -0
  12. qodalis_cli_server-1.0.0b1/demo/processors/__init__.py +13 -0
  13. qodalis_cli_server-1.0.0b1/demo/processors/cli_echo_command_processor.py +15 -0
  14. qodalis_cli_server-1.0.0b1/demo/processors/cli_hello_command_processor.py +35 -0
  15. qodalis_cli_server-1.0.0b1/demo/processors/cli_math_command_processor.py +76 -0
  16. qodalis_cli_server-1.0.0b1/demo/processors/cli_status_command_processor.py +22 -0
  17. qodalis_cli_server-1.0.0b1/demo/processors/cli_time_command_processor.py +46 -0
  18. qodalis_cli_server-1.0.0b1/demo/requirements.txt +1 -0
  19. qodalis_cli_server-1.0.0b1/dist-abstractions/qodalis_cli_server_abstractions-1.0.0b1-py3-none-any.whl +0 -0
  20. qodalis_cli_server-1.0.0b1/dist-abstractions/qodalis_cli_server_abstractions-1.0.0b1.tar.gz +0 -0
  21. qodalis_cli_server-1.0.0b1/docker-compose.yml +12 -0
  22. qodalis_cli_server-1.0.0b1/docker-run.sh +7 -0
  23. qodalis_cli_server-1.0.0b1/packages/abstractions/LICENSE +21 -0
  24. qodalis_cli_server-1.0.0b1/packages/abstractions/README.md +92 -0
  25. qodalis_cli_server-1.0.0b1/packages/abstractions/pyproject.toml +33 -0
  26. qodalis_cli_server-1.0.0b1/packages/abstractions/src/qodalis_cli_server_abstractions/__init__.py +21 -0
  27. qodalis_cli_server-1.0.0b1/packages/abstractions/src/qodalis_cli_server_abstractions/cli_command_author.py +18 -0
  28. qodalis_cli_server-1.0.0b1/packages/abstractions/src/qodalis_cli_server_abstractions/cli_command_parameter_descriptor.py +31 -0
  29. qodalis_cli_server-1.0.0b1/packages/abstractions/src/qodalis_cli_server_abstractions/cli_command_processor.py +58 -0
  30. qodalis_cli_server-1.0.0b1/packages/abstractions/src/qodalis_cli_server_abstractions/cli_module.py +45 -0
  31. qodalis_cli_server-1.0.0b1/packages/abstractions/src/qodalis_cli_server_abstractions/cli_process_command.py +14 -0
  32. qodalis_cli_server-1.0.0b1/plugins/filesystem/LICENSE +21 -0
  33. qodalis_cli_server-1.0.0b1/plugins/filesystem/__init__.py +30 -0
  34. qodalis_cli_server-1.0.0b1/plugins/filesystem/errors.py +11 -0
  35. qodalis_cli_server-1.0.0b1/plugins/filesystem/i_file_storage_provider.py +5 -0
  36. qodalis_cli_server-1.0.0b1/plugins/filesystem/models.py +5 -0
  37. qodalis_cli_server-1.0.0b1/plugins/filesystem/providers/__init__.py +18 -0
  38. qodalis_cli_server-1.0.0b1/plugins/filesystem/providers/in_memory_provider.py +5 -0
  39. qodalis_cli_server-1.0.0b1/plugins/filesystem/providers/os_provider.py +8 -0
  40. qodalis_cli_server-1.0.0b1/plugins/filesystem/pyproject.toml +36 -0
  41. qodalis_cli_server-1.0.0b1/plugins/filesystem/qodalis_cli_filesystem/__init__.py +24 -0
  42. qodalis_cli_server-1.0.0b1/plugins/filesystem/qodalis_cli_filesystem/errors.py +41 -0
  43. qodalis_cli_server-1.0.0b1/plugins/filesystem/qodalis_cli_filesystem/i_file_storage_provider.py +74 -0
  44. qodalis_cli_server-1.0.0b1/plugins/filesystem/qodalis_cli_filesystem/models.py +26 -0
  45. qodalis_cli_server-1.0.0b1/plugins/filesystem/qodalis_cli_filesystem/providers/__init__.py +12 -0
  46. qodalis_cli_server-1.0.0b1/plugins/filesystem/qodalis_cli_filesystem/providers/in_memory_provider.py +286 -0
  47. qodalis_cli_server-1.0.0b1/plugins/filesystem/qodalis_cli_filesystem/providers/os_provider.py +215 -0
  48. qodalis_cli_server-1.0.0b1/plugins/filesystem-json/LICENSE +21 -0
  49. qodalis_cli_server-1.0.0b1/plugins/filesystem-json/__init__.py +13 -0
  50. qodalis_cli_server-1.0.0b1/plugins/filesystem-json/json_file_provider.py +8 -0
  51. qodalis_cli_server-1.0.0b1/plugins/filesystem-json/pyproject.toml +39 -0
  52. qodalis_cli_server-1.0.0b1/plugins/filesystem-json/qodalis_cli_filesystem_json/__init__.py +10 -0
  53. qodalis_cli_server-1.0.0b1/plugins/filesystem-json/qodalis_cli_filesystem_json/json_file_provider.py +380 -0
  54. qodalis_cli_server-1.0.0b1/plugins/filesystem-s3/LICENSE +21 -0
  55. qodalis_cli_server-1.0.0b1/plugins/filesystem-s3/__init__.py +13 -0
  56. qodalis_cli_server-1.0.0b1/plugins/filesystem-s3/pyproject.toml +40 -0
  57. qodalis_cli_server-1.0.0b1/plugins/filesystem-s3/qodalis_cli_filesystem_s3/__init__.py +10 -0
  58. qodalis_cli_server-1.0.0b1/plugins/filesystem-s3/qodalis_cli_filesystem_s3/s3_provider.py +459 -0
  59. qodalis_cli_server-1.0.0b1/plugins/filesystem-s3/s3_provider.py +8 -0
  60. qodalis_cli_server-1.0.0b1/plugins/filesystem-sqlite/LICENSE +21 -0
  61. qodalis_cli_server-1.0.0b1/plugins/filesystem-sqlite/__init__.py +13 -0
  62. qodalis_cli_server-1.0.0b1/plugins/filesystem-sqlite/pyproject.toml +39 -0
  63. qodalis_cli_server-1.0.0b1/plugins/filesystem-sqlite/qodalis_cli_filesystem_sqlite/__init__.py +10 -0
  64. qodalis_cli_server-1.0.0b1/plugins/filesystem-sqlite/qodalis_cli_filesystem_sqlite/sqlite_provider.py +410 -0
  65. qodalis_cli_server-1.0.0b1/plugins/filesystem-sqlite/sqlite_provider.py +8 -0
  66. qodalis_cli_server-1.0.0b1/plugins/weather/LICENSE +21 -0
  67. qodalis_cli_server-1.0.0b1/plugins/weather/__init__.py +8 -0
  68. qodalis_cli_server-1.0.0b1/plugins/weather/pyproject.toml +39 -0
  69. qodalis_cli_server-1.0.0b1/plugins/weather/qodalis_cli_weather/__init__.py +5 -0
  70. qodalis_cli_server-1.0.0b1/plugins/weather/qodalis_cli_weather/weather_module.py +153 -0
  71. qodalis_cli_server-1.0.0b1/plugins/weather/weather_module.py +5 -0
  72. qodalis_cli_server-1.0.0b1/pyproject.toml +56 -0
  73. qodalis_cli_server-1.0.0b1/src/qodalis_cli/__init__.py +112 -0
  74. qodalis_cli_server-1.0.0b1/src/qodalis_cli/abstractions/__init__.py +25 -0
  75. qodalis_cli_server-1.0.0b1/src/qodalis_cli/abstractions/cli_command_author.py +7 -0
  76. qodalis_cli_server-1.0.0b1/src/qodalis_cli/abstractions/cli_command_parameter_descriptor.py +6 -0
  77. qodalis_cli_server-1.0.0b1/src/qodalis_cli/abstractions/cli_command_processor.py +6 -0
  78. qodalis_cli_server-1.0.0b1/src/qodalis_cli/abstractions/cli_process_command.py +3 -0
  79. qodalis_cli_server-1.0.0b1/src/qodalis_cli/controllers/__init__.py +11 -0
  80. qodalis_cli_server-1.0.0b1/src/qodalis_cli/controllers/cli_controller.py +111 -0
  81. qodalis_cli_server-1.0.0b1/src/qodalis_cli/controllers/cli_controller_v2.py +91 -0
  82. qodalis_cli_server-1.0.0b1/src/qodalis_cli/controllers/cli_version_controller.py +45 -0
  83. qodalis_cli_server-1.0.0b1/src/qodalis_cli/controllers/filesystem_controller.py +329 -0
  84. qodalis_cli_server-1.0.0b1/src/qodalis_cli/create_cli_server.py +157 -0
  85. qodalis_cli_server-1.0.0b1/src/qodalis_cli/extensions/__init__.py +3 -0
  86. qodalis_cli_server-1.0.0b1/src/qodalis_cli/extensions/cli_builder.py +51 -0
  87. qodalis_cli_server-1.0.0b1/src/qodalis_cli/filesystem/__init__.py +4 -0
  88. qodalis_cli_server-1.0.0b1/src/qodalis_cli/filesystem/filesystem_options.py +16 -0
  89. qodalis_cli_server-1.0.0b1/src/qodalis_cli/filesystem/filesystem_path_validator.py +42 -0
  90. qodalis_cli_server-1.0.0b1/src/qodalis_cli/models/__init__.py +13 -0
  91. qodalis_cli_server-1.0.0b1/src/qodalis_cli/models/cli_server_command_descriptor.py +30 -0
  92. qodalis_cli_server-1.0.0b1/src/qodalis_cli/models/cli_server_output.py +47 -0
  93. qodalis_cli_server-1.0.0b1/src/qodalis_cli/models/cli_server_response.py +12 -0
  94. qodalis_cli_server-1.0.0b1/src/qodalis_cli/processors/__init__.py +17 -0
  95. qodalis_cli_server-1.0.0b1/src/qodalis_cli/processors/cli_base64_command_processor.py +61 -0
  96. qodalis_cli_server-1.0.0b1/src/qodalis_cli/processors/cli_echo_command_processor.py +17 -0
  97. qodalis_cli_server-1.0.0b1/src/qodalis_cli/processors/cli_hash_command_processor.py +49 -0
  98. qodalis_cli_server-1.0.0b1/src/qodalis_cli/processors/cli_http_command_processor.py +143 -0
  99. qodalis_cli_server-1.0.0b1/src/qodalis_cli/processors/cli_status_command_processor.py +24 -0
  100. qodalis_cli_server-1.0.0b1/src/qodalis_cli/processors/cli_system_command_processor.py +34 -0
  101. qodalis_cli_server-1.0.0b1/src/qodalis_cli/processors/cli_uuid_command_processor.py +39 -0
  102. qodalis_cli_server-1.0.0b1/src/qodalis_cli/server.py +44 -0
  103. qodalis_cli_server-1.0.0b1/src/qodalis_cli/services/__init__.py +19 -0
  104. qodalis_cli_server-1.0.0b1/src/qodalis_cli/services/cli_command_executor_service.py +62 -0
  105. qodalis_cli_server-1.0.0b1/src/qodalis_cli/services/cli_command_registry.py +68 -0
  106. qodalis_cli_server-1.0.0b1/src/qodalis_cli/services/cli_event_socket_manager.py +46 -0
  107. qodalis_cli_server-1.0.0b1/src/qodalis_cli/services/cli_log_socket_manager.py +153 -0
  108. qodalis_cli_server-1.0.0b1/src/qodalis_cli/services/cli_response_builder.py +73 -0
  109. qodalis_cli_server-1.0.0b1/src/qodalis_cli/services/cli_shell_session_manager.py +201 -0
  110. qodalis_cli_server-1.0.0b1/tests/__init__.py +0 -0
  111. qodalis_cli_server-1.0.0b1/tests/conftest.py +142 -0
  112. qodalis_cli_server-1.0.0b1/tests/test_api_version.py +17 -0
  113. qodalis_cli_server-1.0.0b1/tests/test_cli_log_socket_manager.py +170 -0
  114. qodalis_cli_server-1.0.0b1/tests/test_command_executor.py +40 -0
  115. qodalis_cli_server-1.0.0b1/tests/test_command_registry.py +59 -0
  116. qodalis_cli_server-1.0.0b1/tests/test_controllers.py +137 -0
  117. qodalis_cli_server-1.0.0b1/tests/test_filesystem_controller.py +176 -0
  118. qodalis_cli_server-1.0.0b1/tests/test_in_memory_provider.py +229 -0
  119. qodalis_cli_server-1.0.0b1/tests/test_json_file_provider.py +189 -0
  120. qodalis_cli_server-1.0.0b1/tests/test_response_builder.py +89 -0
  121. qodalis_cli_server-1.0.0b1/tests/test_s3_provider.py +369 -0
  122. qodalis_cli_server-1.0.0b1/tests/test_sqlite_provider.py +351 -0
@@ -0,0 +1,10 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ dist/
5
+ build/
6
+ .venv/
7
+ venv/
8
+ .git/
9
+ *.md
10
+ !README.md
@@ -0,0 +1 @@
1
+ {"name": "🏃", "description": "Run Docker container to upload Python distribution packages to PyPI", "inputs": {"user": {"description": "PyPI user", "required": false}, "password": {"description": "Password for your PyPI user or an access token", "required": false}, "repository-url": {"description": "The repository URL to use", "required": false}, "packages-dir": {"description": "The target directory for distribution", "required": false}, "verify-metadata": {"description": "Check metadata before uploading", "required": false}, "skip-existing": {"description": "Do not fail if a Python package distribution exists in the target package index", "required": false}, "verbose": {"description": "Show verbose output.", "required": false}, "print-hash": {"description": "Show hash values of files to be uploaded", "required": false}, "attestations": {"description": "[EXPERIMENTAL] Enable experimental support for PEP 740 attestations. Only works with PyPI and TestPyPI via Trusted Publishing.", "required": false}}, "runs": {"using": "docker", "image": "docker://ghcr.io/pypa/gh-action-pypi-publish:release-v1"}}
@@ -0,0 +1,31 @@
1
+ name: Build & Test
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main, develop]
6
+ push:
7
+ branches: [develop]
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+
16
+ - uses: actions/setup-python@v5
17
+ with:
18
+ python-version: "3.12"
19
+
20
+ - name: Install dependencies
21
+ run: |
22
+ pip install -e packages/abstractions/
23
+ pip install -e plugins/filesystem/
24
+ pip install -e plugins/filesystem-json/
25
+ pip install -e plugins/filesystem-sqlite/
26
+ pip install -e "plugins/filesystem-s3/[test]" || pip install -e plugins/filesystem-s3/
27
+ pip install -e plugins/weather/
28
+ pip install -e ".[test]"
29
+
30
+ - name: Test
31
+ run: pytest tests/ -v
@@ -0,0 +1,150 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+
7
+ jobs:
8
+ publish:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v4
12
+
13
+ - uses: actions/setup-python@v5
14
+ with:
15
+ python-version: "3.12"
16
+
17
+ - name: Install build and test tools
18
+ run: pip install build pytest pytest-asyncio httpx
19
+
20
+ - name: Install packages for testing
21
+ run: |
22
+ pip install ./packages/abstractions
23
+ pip install ./plugins/filesystem
24
+ pip install ./plugins/filesystem-json
25
+ pip install ./plugins/filesystem-sqlite
26
+ pip install ./plugins/filesystem-s3
27
+ pip install ./plugins/weather
28
+ pip install -e ".[test]"
29
+
30
+ - name: Run tests
31
+ run: python -m pytest tests/ -v
32
+
33
+ - name: Build abstractions package
34
+ run: python -m build packages/abstractions/ --outdir dist-abstractions/
35
+
36
+ - name: Publish abstractions to PyPI
37
+ uses: pypa/gh-action-pypi-publish@release/v1
38
+ with:
39
+ password: ${{ secrets.PYPI_TOKEN }}
40
+ packages-dir: dist-abstractions/
41
+ skip-existing: true
42
+ verbose: true
43
+ attestations: false
44
+
45
+ - name: Build server package
46
+ run: python -m build
47
+
48
+ - name: Publish server to PyPI
49
+ uses: pypa/gh-action-pypi-publish@release/v1
50
+ with:
51
+ password: ${{ secrets.PYPI_TOKEN }}
52
+ skip-existing: true
53
+ verbose: true
54
+ attestations: false
55
+
56
+ # -- Plugin packages --
57
+
58
+ - name: Build filesystem plugin
59
+ run: python -m build plugins/filesystem/ --outdir dist-plugin-filesystem/
60
+
61
+ - name: Publish filesystem plugin to PyPI
62
+ uses: pypa/gh-action-pypi-publish@release/v1
63
+ with:
64
+ password: ${{ secrets.PYPI_TOKEN }}
65
+ packages-dir: dist-plugin-filesystem/
66
+ skip-existing: true
67
+ verbose: true
68
+ attestations: false
69
+
70
+ - name: Build filesystem-json plugin
71
+ run: python -m build plugins/filesystem-json/ --outdir dist-plugin-filesystem-json/
72
+
73
+ - name: Publish filesystem-json plugin to PyPI
74
+ uses: pypa/gh-action-pypi-publish@release/v1
75
+ with:
76
+ password: ${{ secrets.PYPI_TOKEN }}
77
+ packages-dir: dist-plugin-filesystem-json/
78
+ skip-existing: true
79
+ verbose: true
80
+ attestations: false
81
+
82
+ - name: Build filesystem-sqlite plugin
83
+ run: python -m build plugins/filesystem-sqlite/ --outdir dist-plugin-filesystem-sqlite/
84
+
85
+ - name: Publish filesystem-sqlite plugin to PyPI
86
+ uses: pypa/gh-action-pypi-publish@release/v1
87
+ with:
88
+ password: ${{ secrets.PYPI_TOKEN }}
89
+ packages-dir: dist-plugin-filesystem-sqlite/
90
+ skip-existing: true
91
+ verbose: true
92
+ attestations: false
93
+
94
+ - name: Build filesystem-s3 plugin
95
+ run: python -m build plugins/filesystem-s3/ --outdir dist-plugin-filesystem-s3/
96
+
97
+ - name: Publish filesystem-s3 plugin to PyPI
98
+ uses: pypa/gh-action-pypi-publish@release/v1
99
+ with:
100
+ password: ${{ secrets.PYPI_TOKEN }}
101
+ packages-dir: dist-plugin-filesystem-s3/
102
+ skip-existing: true
103
+ verbose: true
104
+ attestations: false
105
+
106
+ - name: Build weather plugin
107
+ run: python -m build plugins/weather/ --outdir dist-plugin-weather/
108
+
109
+ - name: Publish weather plugin to PyPI
110
+ uses: pypa/gh-action-pypi-publish@release/v1
111
+ with:
112
+ password: ${{ secrets.PYPI_TOKEN }}
113
+ packages-dir: dist-plugin-weather/
114
+ skip-existing: true
115
+ verbose: true
116
+ attestations: false
117
+
118
+ docker:
119
+ needs: publish
120
+ runs-on: ubuntu-latest
121
+ permissions:
122
+ contents: read
123
+ packages: write
124
+
125
+ steps:
126
+ - uses: actions/checkout@v4
127
+
128
+ - name: Log in to GitHub Container Registry
129
+ uses: docker/login-action@v3
130
+ with:
131
+ registry: ghcr.io
132
+ username: ${{ github.actor }}
133
+ password: ${{ secrets.GITHUB_TOKEN }}
134
+
135
+ - name: Extract metadata
136
+ id: meta
137
+ uses: docker/metadata-action@v5
138
+ with:
139
+ images: ghcr.io/${{ github.repository }}
140
+ tags: |
141
+ type=sha
142
+ type=raw,value=latest
143
+
144
+ - name: Build and push Docker image
145
+ uses: docker/build-push-action@v6
146
+ with:
147
+ context: .
148
+ push: true
149
+ tags: ${{ steps.meta.outputs.tags }}
150
+ labels: ${{ steps.meta.outputs.labels }}
@@ -0,0 +1,43 @@
1
+ # Byte-compiled / optimized
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # Distribution / packaging
7
+ *.egg-info/
8
+ dist/
9
+ build/
10
+ .eggs/
11
+ *.egg
12
+
13
+ # Virtual environments
14
+ .venv/
15
+ venv/
16
+ env/
17
+
18
+ # Environment variables
19
+ .env
20
+
21
+ # Testing
22
+ .pytest_cache/
23
+ .coverage
24
+ htmlcov/
25
+ TestResults/
26
+
27
+ # Type checking / linting
28
+ .mypy_cache/
29
+ .ruff_cache/
30
+
31
+ # C extensions
32
+ *.so
33
+
34
+ # IDEs and editors
35
+ .idea/
36
+ .vscode/*
37
+ !.vscode/settings.json
38
+ !.vscode/launch.json
39
+ !.vscode/extensions.json
40
+
41
+ # System files
42
+ .DS_Store
43
+ Thumbs.db
@@ -0,0 +1,21 @@
1
+ FROM python:3.12-slim
2
+ WORKDIR /app
3
+
4
+ COPY packages/abstractions/ packages/abstractions/
5
+ RUN pip install --no-cache-dir ./packages/abstractions
6
+
7
+ COPY plugins/ plugins/
8
+ RUN pip install --no-cache-dir ./plugins/filesystem \
9
+ && pip install --no-cache-dir ./plugins/filesystem-json \
10
+ && pip install --no-cache-dir ./plugins/filesystem-sqlite \
11
+ && pip install --no-cache-dir ./plugins/weather
12
+
13
+ COPY pyproject.toml README.md LICENSE ./
14
+ COPY src/ src/
15
+ RUN pip install --no-cache-dir .
16
+
17
+ ENV PORT=8048
18
+ ENV HOST=0.0.0.0
19
+ EXPOSE 8048
20
+
21
+ CMD ["qodalis-cli-server"]
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-2026 Qodalis Solutions
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.