pyObscuraProto 1.0__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 (33) hide show
  1. pyobscuraproto-1.0/.github/workflows/autotests.yml +74 -0
  2. pyobscuraproto-1.0/.github/workflows/pypi_publish.yml +174 -0
  3. pyobscuraproto-1.0/.gitignore +210 -0
  4. pyobscuraproto-1.0/.pre-commit-config.yaml +12 -0
  5. pyobscuraproto-1.0/CHANGELOG.md +6 -0
  6. pyobscuraproto-1.0/CMakeLists.txt +29 -0
  7. pyobscuraproto-1.0/CONTRIBUTING.md +125 -0
  8. pyobscuraproto-1.0/LICENSE +21 -0
  9. pyobscuraproto-1.0/PKG-INFO +16 -0
  10. pyobscuraproto-1.0/README.md +240 -0
  11. pyobscuraproto-1.0/README.ru.md +240 -0
  12. pyobscuraproto-1.0/dev-requirements.txt +5 -0
  13. pyobscuraproto-1.0/docs/development_guide.md +50 -0
  14. pyobscuraproto-1.0/examples/python_websocket_example.py +102 -0
  15. pyobscuraproto-1.0/examples/request_response_example/client_example.py +91 -0
  16. pyobscuraproto-1.0/examples/request_response_example/server_example.py +61 -0
  17. pyobscuraproto-1.0/examples/streaming_example.py +69 -0
  18. pyobscuraproto-1.0/pyproject.toml +34 -0
  19. pyobscuraproto-1.0/setup.cfg +4 -0
  20. pyobscuraproto-1.0/setup.py +101 -0
  21. pyobscuraproto-1.0/src/ObscuraProto/__init__.py +736 -0
  22. pyobscuraproto-1.0/src/ObscuraProto/bindings.cpp +377 -0
  23. pyobscuraproto-1.0/src/pyObscuraProto.egg-info/PKG-INFO +16 -0
  24. pyobscuraproto-1.0/src/pyObscuraProto.egg-info/SOURCES.txt +31 -0
  25. pyobscuraproto-1.0/src/pyObscuraProto.egg-info/dependency_links.txt +1 -0
  26. pyobscuraproto-1.0/src/pyObscuraProto.egg-info/not-zip-safe +1 -0
  27. pyobscuraproto-1.0/src/pyObscuraProto.egg-info/top_level.txt +1 -0
  28. pyobscuraproto-1.0/tests/test_auth_anonymous.py +306 -0
  29. pyobscuraproto-1.0/tests/test_auto_unpacking.py +118 -0
  30. pyobscuraproto-1.0/tests/test_bindings.py +294 -0
  31. pyobscuraproto-1.0/tests/test_config.py +275 -0
  32. pyobscuraproto-1.0/tests/test_streaming.py +116 -0
  33. pyobscuraproto-1.0/tests/test_websocket_session.py +142 -0
@@ -0,0 +1,74 @@
1
+ name: Auto Tests
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - develop
8
+ - 'hotfix/*'
9
+ - 'release/*'
10
+ pull_request:
11
+ branches:
12
+ - main
13
+ - develop
14
+ - 'release/*'
15
+
16
+ jobs:
17
+ build-and-test:
18
+ runs-on: ubuntu-latest
19
+
20
+ steps:
21
+ - name: Checkout code
22
+ uses: actions/checkout@v4
23
+
24
+ - name: Set up Python
25
+ uses: actions/setup-python@v5
26
+ with:
27
+ python-version: '3.14'
28
+ cache: 'pip'
29
+ cache-dependency-path: |
30
+ dev-requirements.txt
31
+ setup.py
32
+
33
+ - name: Install ccache
34
+ run: sudo apt-get install -y ccache
35
+
36
+ - name: Cache ccache
37
+ uses: actions/cache@v4
38
+ with:
39
+ path: ~/.ccache
40
+ key: ${{ runner.os }}-ccache-${{ hashFiles('CMakeLists.txt', 'src/ObscuraProto/bindings.cpp') }}
41
+ restore-keys: |
42
+ ${{ runner.os }}-ccache-
43
+
44
+ - name: Install build dependencies (CMake, etc.)
45
+ run: |
46
+ sudo apt-get update
47
+ sudo apt-get install -y cmake
48
+
49
+ - name: Install Python dependencies
50
+ run: |
51
+ python -m pip install --upgrade pip
52
+ pip install -r dev-requirements.txt
53
+
54
+ - name: Lint with Ruff
55
+ run: |
56
+ ruff check src/ tests/ examples/
57
+
58
+ - name: Check formatting with Ruff
59
+ run: |
60
+ ruff format --check src/ tests/ examples/
61
+
62
+ - name: Build and install project
63
+ env:
64
+ CMAKE_ARGS: "-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache"
65
+ run: |
66
+ pip install -e .
67
+
68
+ - name: Type-check with Pyright
69
+ run: |
70
+ pyright src/ tests/ examples/
71
+
72
+ - name: Run tests
73
+ run: |
74
+ pytest
@@ -0,0 +1,174 @@
1
+ name: Python Package
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ concurrency:
9
+ group: ${{ github.workflow }}-${{ github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ jobs:
13
+ build_wheels:
14
+ name: Build wheels (${{ matrix.os }})
15
+ runs-on: ${{ matrix.os }}
16
+ strategy:
17
+ matrix:
18
+ os:
19
+ - ubuntu-latest
20
+ - macos-26-intel
21
+ - macos-latest
22
+ - windows-latest
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - uses: actions/setup-python@v5
26
+ with:
27
+ python-version: '3.14'
28
+ cache: 'pip'
29
+ - name: Install cibuildwheel
30
+ run: pip install 'cibuildwheel>=2.16,<3'
31
+ env:
32
+ PIP_REQUIRE_VIRTUALENV: false
33
+ - name: Build wheels
34
+ run: python -m cibuildwheel --output-dir wheelhouse
35
+ env:
36
+ CIBW_BUILD_VERBOSITY: 2
37
+ CIBW_REPAIR_WHEEL_COMMAND_MACOS: |
38
+ set -e
39
+ echo "=== Wheel libraries ==="
40
+ unzip -l {wheel} | grep '\.dylib\|\.so'
41
+ echo "=== delocate-listdeps ==="
42
+ delocate-listdeps {wheel}
43
+ echo "=== delocate-wheel ==="
44
+ delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel}
45
+ CIBW_ENVIRONMENT_MACOS: MACOSX_DEPLOYMENT_TARGET=26
46
+ CIBW_ENVIRONMENT_WINDOWS: |
47
+ CMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake
48
+ CIBW_BEFORE_BUILD_MACOS: pip install --upgrade delocate
49
+ CIBW_BEFORE_BUILD_WINDOWS: |
50
+ echo "=== CMake version ==="
51
+ cmake --version
52
+ echo "=== Generator platform ==="
53
+ echo CMAKE_GENERATOR_PLATFORM=%CMAKE_GENERATOR_PLATFORM%
54
+ - uses: actions/upload-artifact@v4
55
+ with:
56
+ name: wheels-${{ matrix.os }}
57
+ path: ./wheelhouse/*.whl
58
+
59
+ build_linux_aarch64:
60
+ name: Build wheels (linux-aarch64)
61
+ runs-on: ubuntu-latest
62
+ steps:
63
+ - uses: actions/checkout@v4
64
+ - uses: actions/setup-python@v5
65
+ with:
66
+ python-version: '3.14'
67
+ cache: 'pip'
68
+ - name: Set up QEMU
69
+ uses: docker/setup-qemu-action@v3
70
+ - name: Install cibuildwheel
71
+ run: pip install 'cibuildwheel>=2.16,<3'
72
+ env:
73
+ PIP_REQUIRE_VIRTUALENV: false
74
+ - name: Build aarch64 wheels
75
+ run: python -m cibuildwheel --output-dir wheelhouse
76
+ env:
77
+ CIBW_ARCHS_LINUX: aarch64
78
+ - uses: actions/upload-artifact@v4
79
+ with:
80
+ name: wheels-linux-aarch64
81
+ path: ./wheelhouse/*.whl
82
+
83
+ build_windows_arm64:
84
+ name: Build wheels (windows-arm64)
85
+ runs-on: windows-latest
86
+ steps:
87
+ - uses: actions/checkout@v4
88
+ - uses: actions/setup-python@v5
89
+ with:
90
+ python-version: '3.14'
91
+ cache: 'pip'
92
+ - name: Set up MSVC ARM64 toolchain
93
+ uses: ilammy/msvc-dev-cmd@v1
94
+ with:
95
+ arch: x64_arm64
96
+ - name: Install cibuildwheel
97
+ run: pip install 'cibuildwheel>=2.16,<3'
98
+ - name: Build ARM64 wheels
99
+ run: python -m cibuildwheel --output-dir wheelhouse
100
+ env:
101
+ CIBW_BUILD_VERBOSITY: 2
102
+ CIBW_ARCHS_WINDOWS: ARM64
103
+ CIBW_ENVIRONMENT_WINDOWS: |
104
+ CMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake
105
+ VCPKG_TARGET_TRIPLET=arm64-windows
106
+ CIBW_BEFORE_BUILD_WINDOWS: |
107
+ echo "=== CMake version ==="
108
+ cmake --version
109
+ echo "=== Environment ==="
110
+ set | findstr "CMAKE"
111
+ echo "=== Generator platform ==="
112
+ echo CMAKE_GENERATOR_PLATFORM=%CMAKE_GENERATOR_PLATFORM%
113
+ - uses: actions/upload-artifact@v4
114
+ with:
115
+ name: wheels-windows-arm64
116
+ path: ./wheelhouse/*.whl
117
+
118
+ build_sdist:
119
+ name: Build source distribution
120
+ runs-on: ubuntu-latest
121
+ steps:
122
+ - uses: actions/checkout@v4
123
+ - uses: actions/setup-python@v5
124
+ with:
125
+ python-version: '3.14'
126
+ cache: 'pip'
127
+ - name: Build sdist
128
+ run: |
129
+ pip install build
130
+ SETUPTOOLS_SCM_PRETEND_VERSION="${GITHUB_REF_NAME#v}" python -m build --sdist
131
+ env:
132
+ PIP_REQUIRE_VIRTUALENV: false
133
+ - uses: actions/upload-artifact@v4
134
+ with:
135
+ name: sdist
136
+ path: dist/*.tar.gz
137
+
138
+ publish:
139
+ name: Release & Publish to PyPI
140
+ environment:
141
+ name: pypi
142
+ url: https://pypi.org/project/pyObscuraProto/
143
+ permissions:
144
+ id-token: write
145
+ contents: write
146
+ needs:
147
+ - build_wheels
148
+ - build_linux_aarch64
149
+ - build_windows_arm64
150
+ - build_sdist
151
+ runs-on: ubuntu-latest
152
+ steps:
153
+ - uses: actions/checkout@v4
154
+ - uses: actions/download-artifact@v4
155
+ with:
156
+ pattern: wheels-*
157
+ merge-multiple: true
158
+ path: dist
159
+ - uses: actions/download-artifact@v4
160
+ with:
161
+ name: sdist
162
+ path: dist
163
+ - name: Create GitHub Release
164
+ uses: softprops/action-gh-release@v2
165
+ with:
166
+ tag_name: ${{ github.ref_name }}
167
+ name: Release ${{ github.ref_name }}
168
+ body_path: CHANGELOG.md
169
+ files: dist/*
170
+ draft: true
171
+ env:
172
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
173
+ - name: Publish to PyPI
174
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,210 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py.cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ #uv.lock
102
+
103
+ # poetry
104
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
106
+ # commonly ignored for libraries.
107
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
+ #poetry.lock
109
+ #poetry.toml
110
+
111
+ # pdm
112
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
113
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
114
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
115
+ #pdm.lock
116
+ #pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # pixi
121
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
122
+ #pixi.lock
123
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
124
+ # in the .venv directory. It is recommended not to include this directory in version control.
125
+ .pixi
126
+
127
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
128
+ __pypackages__/
129
+
130
+ # Celery stuff
131
+ celerybeat-schedule
132
+ celerybeat.pid
133
+
134
+ # SageMath parsed files
135
+ *.sage.py
136
+
137
+ # Environments
138
+ .env
139
+ .envrc
140
+ .venv
141
+ env/
142
+ venv/
143
+ ENV/
144
+ env.bak/
145
+ venv.bak/
146
+
147
+ # Spyder project settings
148
+ .spyderproject
149
+ .spyproject
150
+
151
+ # Rope project settings
152
+ .ropeproject
153
+
154
+ # mkdocs documentation
155
+ /site
156
+
157
+ # mypy
158
+ .mypy_cache/
159
+ .dmypy.json
160
+ dmypy.json
161
+
162
+ # Pyre type checker
163
+ .pyre/
164
+
165
+ # pytype static type analyzer
166
+ .pytype/
167
+
168
+ # Cython debug symbols
169
+ cython_debug/
170
+
171
+ # PyCharm
172
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
173
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
174
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
175
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
176
+ #.idea/
177
+
178
+ # Abstra
179
+ # Abstra is an AI-powered process automation framework.
180
+ # Ignore directories containing user credentials, local state, and settings.
181
+ # Learn more at https://abstra.io/docs
182
+ .abstra/
183
+
184
+ # Visual Studio Code
185
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
186
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
187
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
188
+ # you could uncomment the following to ignore the entire vscode folder
189
+ # .vscode/
190
+
191
+ # Ruff stuff:
192
+ .ruff_cache/
193
+
194
+ # PyPI configuration file
195
+ .pypirc
196
+
197
+ # Cursor
198
+ # Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
199
+ # exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
200
+ # refer to https://docs.cursor.com/context/ignore-files
201
+ .cursorignore
202
+ .cursorindexingignore
203
+
204
+ # Marimo
205
+ marimo/_static/
206
+ marimo/_lsp/
207
+ __marimo__/
208
+
209
+ # Other
210
+ server_public_key.pem
@@ -0,0 +1,12 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.11.0
4
+ hooks:
5
+ - id: ruff
6
+ args: [--fix, --exit-non-zero-on-fix]
7
+ - id: ruff-format
8
+
9
+ - repo: https://github.com/RobertCraigie/pyright-python
10
+ rev: v1.1.398
11
+ hooks:
12
+ - id: pyright
@@ -0,0 +1,6 @@
1
+ ### 1.0: Initial Release - C++ Library Wrapper
2
+ - Implemented Python bindings for the core C++ library.
3
+ - Exposed key C++ functionalities to Python, enabling seamless integration.
4
+ - Provided initial set of features, including websocket connection and handler declaration via decorators.
5
+ - Streaming
6
+ - Authorization
@@ -0,0 +1,29 @@
1
+ cmake_minimum_required(VERSION 3.14)
2
+ project(ObscuraProto LANGUAGES CXX)
3
+
4
+ set(CMAKE_CXX_STANDARD 17)
5
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
6
+ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
7
+
8
+ set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
9
+
10
+ include(FetchContent)
11
+
12
+ FetchContent_Declare(
13
+ pybind11
14
+ GIT_REPOSITORY https://github.com/pybind/pybind11.git
15
+ GIT_TAG v2.11.1
16
+ )
17
+ FetchContent_MakeAvailable(pybind11)
18
+
19
+ FetchContent_Declare(
20
+ ObscuraProto
21
+ GIT_REPOSITORY https://github.com/ObscuraEcosystem/ObscuraProto.git
22
+ GIT_TAG v1.0.1
23
+ )
24
+ FetchContent_MakeAvailable(ObscuraProto)
25
+
26
+ target_compile_definitions(obscuraproto INTERFACE _WEBSOCKETPP_CPP11_STL_)
27
+
28
+ pybind11_add_module(_obscuraproto src/ObscuraProto/bindings.cpp)
29
+ target_link_libraries(_obscuraproto PRIVATE obscuraproto)
@@ -0,0 +1,125 @@
1
+ # Contributing to pyObscuraProto
2
+
3
+ ## System Dependencies
4
+
5
+ - **CMake** (≥ 3.14) — build system
6
+
7
+ ### macOS
8
+ ```bash
9
+ brew install cmake
10
+ ```
11
+
12
+ ### Linux (Debian/Ubuntu)
13
+ ```bash
14
+ sudo apt-get update
15
+ sudo apt-get install -y cmake
16
+ ```
17
+
18
+ ## Development Setup
19
+
20
+ 1. Clone the repository:
21
+ ```bash
22
+ git clone https://github.com/ObscuraEcosystem/pyObscuraProto.git
23
+ cd pyObscuraProto
24
+ ```
25
+
26
+ 2. Create and activate a virtual environment:
27
+ ```bash
28
+ python3 -m venv .venv
29
+ source .venv/bin/activate
30
+ ```
31
+
32
+ 3. Install development dependencies:
33
+ ```bash
34
+ pip install -r dev-requirements.txt
35
+ ```
36
+
37
+ 4. Install pre-commit hooks:
38
+ ```bash
39
+ pre-commit install
40
+ ```
41
+
42
+ 5. Build the project:
43
+ ```bash
44
+ pip install -e .
45
+ ```
46
+
47
+ ## Code Quality Tools
48
+
49
+ ### Ruff (linter & formatter)
50
+
51
+ Lint check:
52
+ ```bash
53
+ ruff check src/ tests/ examples/
54
+ ```
55
+
56
+ Auto-fix lint issues:
57
+ ```bash
58
+ ruff check --fix src/ tests/ examples/
59
+ ```
60
+
61
+ Format check:
62
+ ```bash
63
+ ruff format --check src/ tests/ examples/
64
+ ```
65
+
66
+ Format code:
67
+ ```bash
68
+ ruff format src/ tests/ examples/
69
+ ```
70
+
71
+ ### Pyright (type checker)
72
+
73
+ ```bash
74
+ pyright src/ tests/ examples/
75
+ ```
76
+
77
+ ## Pre-commit Hooks
78
+
79
+ Pre-commit hooks run automatically on `git commit` and include:
80
+
81
+ 1. **ruff** — lints and auto-fixes fixable issues
82
+ 2. **ruff-format** — ensures code is properly formatted
83
+ 3. **pyright** — checks for type errors
84
+
85
+ To run all hooks manually without committing:
86
+ ```bash
87
+ pre-commit run --all-files
88
+ ```
89
+
90
+ To bypass hooks temporarily (not recommended):
91
+ ```bash
92
+ git commit --no-verify
93
+ ```
94
+
95
+ ## CI Pipeline
96
+
97
+ Every push and pull request triggers GitHub Actions which runs:
98
+
99
+ 1. `ruff check` — lint validation
100
+ 2. `ruff format --check` — formatting validation
101
+ 3. Build the C++ extension and install the package
102
+ 4. `pyright` — type checking
103
+ 5. `pytest` — test suite
104
+
105
+ ## Code Style Guidelines
106
+
107
+ - **Line length**: 120 characters
108
+ - **Naming**: Follow PEP 8 conventions
109
+ - **Imports**: Sorted automatically by Ruff (I rule)
110
+ - **Type hints**: Use type annotations for all function signatures
111
+ - **Docstrings**: Use Google-style docstrings (auto-formatted by Ruff)
112
+
113
+ ## Testing
114
+
115
+ Run tests:
116
+ ```bash
117
+ pytest
118
+ ```
119
+
120
+ ## Pull Request Process
121
+
122
+ 1. Ensure all pre-commit hooks pass
123
+ 2. Ensure CI passes on your branch
124
+ 3. Update documentation if needed
125
+ 4. Request review from maintainers
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Kretov Artem
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.
@@ -0,0 +1,16 @@
1
+ Metadata-Version: 2.4
2
+ Name: pyObscuraProto
3
+ Version: 1.0
4
+ Summary: A Python wrapper for ObscuraProto
5
+ Author: Kretov Artem
6
+ Author-email: 20kretovartem000@gmail.com
7
+ Requires-Python: >=3.13
8
+ License-File: LICENSE
9
+ Dynamic: author
10
+ Dynamic: author-email
11
+ Dynamic: description
12
+ Dynamic: license-file
13
+ Dynamic: requires-python
14
+ Dynamic: summary
15
+
16
+ A Python wrapper for ObscuraProto, providing high-level WebSocket server and client functionalities.