oxyde-postgres 0.1.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.
Files changed (66) hide show
  1. oxyde/__init__.py +151 -0
  2. oxyde/_msgpack.py +3 -0
  3. oxyde/cli/__init__.py +7 -0
  4. oxyde/cli/app.py +107 -0
  5. oxyde/cli/codegen.py +66 -0
  6. oxyde/cli/config.py +84 -0
  7. oxyde/cli/migrations.py +536 -0
  8. oxyde/codegen/__init__.py +15 -0
  9. oxyde/codegen/stub_generator.py +1229 -0
  10. oxyde/core/__init__.py +90 -0
  11. oxyde/core/column_types.py +367 -0
  12. oxyde/core/ir.py +380 -0
  13. oxyde/core/types.py +69 -0
  14. oxyde/core/wrapper.py +242 -0
  15. oxyde/db/__init__.py +230 -0
  16. oxyde/db/pool.py +305 -0
  17. oxyde/db/registry.py +113 -0
  18. oxyde/db/schema.py +51 -0
  19. oxyde/db/transaction.py +392 -0
  20. oxyde/exceptions.py +89 -0
  21. oxyde/migrations/__init__.py +49 -0
  22. oxyde/migrations/config.py +187 -0
  23. oxyde/migrations/context.py +598 -0
  24. oxyde/migrations/executor.py +456 -0
  25. oxyde/migrations/extract.py +316 -0
  26. oxyde/migrations/generator.py +534 -0
  27. oxyde/migrations/replay.py +367 -0
  28. oxyde/migrations/squash.py +109 -0
  29. oxyde/migrations/tracker.py +162 -0
  30. oxyde/migrations/utils.py +145 -0
  31. oxyde/models/__init__.py +83 -0
  32. oxyde/models/base.py +871 -0
  33. oxyde/models/decorators.py +111 -0
  34. oxyde/models/field.py +204 -0
  35. oxyde/models/lookups.py +667 -0
  36. oxyde/models/metadata.py +174 -0
  37. oxyde/models/registry.py +170 -0
  38. oxyde/models/serializers.py +144 -0
  39. oxyde/models/utils.py +116 -0
  40. oxyde/py.typed +0 -0
  41. oxyde/queries/__init__.py +79 -0
  42. oxyde/queries/aggregates.py +145 -0
  43. oxyde/queries/base.py +249 -0
  44. oxyde/queries/conditions.py +92 -0
  45. oxyde/queries/expressions.py +171 -0
  46. oxyde/queries/insert.py +124 -0
  47. oxyde/queries/joins.py +66 -0
  48. oxyde/queries/manager.py +409 -0
  49. oxyde/queries/mixins/__init__.py +68 -0
  50. oxyde/queries/mixins/aggregation.py +335 -0
  51. oxyde/queries/mixins/debug.py +154 -0
  52. oxyde/queries/mixins/execution.py +701 -0
  53. oxyde/queries/mixins/filtering.py +144 -0
  54. oxyde/queries/mixins/joining.py +160 -0
  55. oxyde/queries/mixins/mutation.py +508 -0
  56. oxyde/queries/mixins/pagination.py +145 -0
  57. oxyde/queries/q.py +250 -0
  58. oxyde/queries/raw.py +114 -0
  59. oxyde/queries/select.py +345 -0
  60. oxyde/queries/typed.py +213 -0
  61. oxyde_postgres-0.1.0.dist-info/METADATA +141 -0
  62. oxyde_postgres-0.1.0.dist-info/RECORD +66 -0
  63. oxyde_postgres-0.1.0.dist-info/WHEEL +5 -0
  64. oxyde_postgres-0.1.0.dist-info/entry_points.txt +2 -0
  65. oxyde_postgres-0.1.0.dist-info/licenses/LICENSE +21 -0
  66. oxyde_postgres-0.1.0.dist-info/top_level.txt +1 -0
oxyde/queries/typed.py ADDED
@@ -0,0 +1,213 @@
1
+ """Typing-only Query subclasses used by generated .pyi stubs.
2
+
3
+ At runtime ``values()`` / ``values_list()`` return the same ``Query`` object
4
+ with a result-mode flag flipped; generated stubs re-type those calls with the
5
+ classes below so terminal methods reflect what actually comes back (dicts,
6
+ tuples or scalars instead of model instances). Mode-switching methods are
7
+ re-declared so chains like ``values().values_list()`` keep tracking the
8
+ actual result shape. The classes carry no behaviour of their own and are
9
+ never instantiated — if one ever were, it would behave exactly like a plain
10
+ ``Query``.
11
+ """
12
+
13
+ # pyright: reportIncompatibleMethodOverride=false
14
+
15
+ from __future__ import annotations
16
+
17
+ from typing import TYPE_CHECKING, Any, TypeVar
18
+
19
+ from oxyde.models.base import Model
20
+ from oxyde.queries.select import Query
21
+
22
+ if TYPE_CHECKING:
23
+ from collections.abc import Coroutine
24
+ from typing import Literal, overload
25
+
26
+ from oxyde.queries.base import SupportsExecute
27
+
28
+ TModel = TypeVar("TModel", bound=Model)
29
+
30
+
31
+ class ValuesQuery(Query[TModel]):
32
+ """Query in ``.values()`` mode — rows come back as dicts."""
33
+
34
+ if TYPE_CHECKING:
35
+
36
+ @overload
37
+ def values_list(
38
+ self, field: str, /, *, flat: Literal[True]
39
+ ) -> FlatValuesListQuery[TModel]: ...
40
+
41
+ @overload
42
+ def values_list(
43
+ self, *fields: str, flat: Literal[False] = ...
44
+ ) -> ValuesListQuery[TModel]: ...
45
+
46
+ @overload
47
+ def values_list(
48
+ self, *fields: str, flat: bool
49
+ ) -> ValuesListQuery[TModel] | FlatValuesListQuery[TModel]: ...
50
+
51
+ def values_list(self, *fields: str, flat: bool = False) -> Any: ...
52
+
53
+ def all( # type: ignore[override]
54
+ self,
55
+ *,
56
+ using: str | None = None,
57
+ client: SupportsExecute | None = None,
58
+ ) -> Coroutine[Any, Any, list[dict[str, Any]]]: ...
59
+
60
+ async def first( # type: ignore[override]
61
+ self,
62
+ *,
63
+ using: str | None = None,
64
+ client: SupportsExecute | None = None,
65
+ ) -> dict[str, Any] | None: ...
66
+
67
+ async def last( # type: ignore[override]
68
+ self,
69
+ *,
70
+ using: str | None = None,
71
+ client: SupportsExecute | None = None,
72
+ ) -> dict[str, Any] | None: ...
73
+
74
+ async def get( # type: ignore[override]
75
+ self,
76
+ *,
77
+ using: str | None = None,
78
+ client: SupportsExecute | None = None,
79
+ ) -> dict[str, Any]: ...
80
+
81
+ async def get_or_none( # type: ignore[override]
82
+ self,
83
+ *,
84
+ using: str | None = None,
85
+ client: SupportsExecute | None = None,
86
+ ) -> dict[str, Any] | None: ...
87
+
88
+
89
+ class ValuesListQuery(Query[TModel]):
90
+ """Query in ``.values_list()`` mode — rows come back as tuples."""
91
+
92
+ if TYPE_CHECKING:
93
+
94
+ def values(self, *fields: str) -> ValuesQuery[TModel]: ...
95
+
96
+ @overload
97
+ def values_list(
98
+ self, field: str, /, *, flat: Literal[True]
99
+ ) -> FlatValuesListQuery[TModel]: ...
100
+
101
+ @overload
102
+ def values_list(
103
+ self, *fields: str, flat: Literal[False] = ...
104
+ ) -> ValuesListQuery[TModel]: ...
105
+
106
+ @overload
107
+ def values_list(
108
+ self, *fields: str, flat: bool
109
+ ) -> ValuesListQuery[TModel] | FlatValuesListQuery[TModel]: ...
110
+
111
+ def values_list(self, *fields: str, flat: bool = False) -> Any: ...
112
+
113
+ def all( # type: ignore[override]
114
+ self,
115
+ *,
116
+ using: str | None = None,
117
+ client: SupportsExecute | None = None,
118
+ ) -> Coroutine[Any, Any, list[tuple[Any, ...]]]: ...
119
+
120
+ async def first( # type: ignore[override]
121
+ self,
122
+ *,
123
+ using: str | None = None,
124
+ client: SupportsExecute | None = None,
125
+ ) -> tuple[Any, ...] | None: ...
126
+
127
+ async def last( # type: ignore[override]
128
+ self,
129
+ *,
130
+ using: str | None = None,
131
+ client: SupportsExecute | None = None,
132
+ ) -> tuple[Any, ...] | None: ...
133
+
134
+ async def get( # type: ignore[override]
135
+ self,
136
+ *,
137
+ using: str | None = None,
138
+ client: SupportsExecute | None = None,
139
+ ) -> tuple[Any, ...]: ...
140
+
141
+ async def get_or_none( # type: ignore[override]
142
+ self,
143
+ *,
144
+ using: str | None = None,
145
+ client: SupportsExecute | None = None,
146
+ ) -> tuple[Any, ...] | None: ...
147
+
148
+
149
+ class FlatValuesListQuery(Query[TModel]):
150
+ """Query in ``.values_list(..., flat=True)`` mode — rows are scalars."""
151
+
152
+ if TYPE_CHECKING:
153
+
154
+ def values(self, *fields: str) -> ValuesQuery[TModel]: ...
155
+
156
+ @overload
157
+ def values_list(
158
+ self, field: str, /, *, flat: Literal[True]
159
+ ) -> FlatValuesListQuery[TModel]: ...
160
+
161
+ @overload
162
+ def values_list(
163
+ self, *fields: str, flat: Literal[False] = ...
164
+ ) -> ValuesListQuery[TModel]: ...
165
+
166
+ @overload
167
+ def values_list(
168
+ self, *fields: str, flat: bool
169
+ ) -> ValuesListQuery[TModel] | FlatValuesListQuery[TModel]: ...
170
+
171
+ def values_list(self, *fields: str, flat: bool = False) -> Any: ...
172
+
173
+ def all(
174
+ self,
175
+ *,
176
+ using: str | None = None,
177
+ client: SupportsExecute | None = None,
178
+ ) -> Coroutine[Any, Any, list[Any]]: ...
179
+
180
+ async def first(
181
+ self,
182
+ *,
183
+ using: str | None = None,
184
+ client: SupportsExecute | None = None,
185
+ ) -> Any: ...
186
+
187
+ async def last(
188
+ self,
189
+ *,
190
+ using: str | None = None,
191
+ client: SupportsExecute | None = None,
192
+ ) -> Any: ...
193
+
194
+ async def get(
195
+ self,
196
+ *,
197
+ using: str | None = None,
198
+ client: SupportsExecute | None = None,
199
+ ) -> Any: ...
200
+
201
+ async def get_or_none(
202
+ self,
203
+ *,
204
+ using: str | None = None,
205
+ client: SupportsExecute | None = None,
206
+ ) -> Any: ...
207
+
208
+
209
+ __all__ = [
210
+ "FlatValuesListQuery",
211
+ "ValuesListQuery",
212
+ "ValuesQuery",
213
+ ]
@@ -0,0 +1,141 @@
1
+ Metadata-Version: 2.4
2
+ Name: oxyde-postgres
3
+ Version: 0.1.0
4
+ Summary: Type-safe asynchronous ORM for PostgreSQL 18+ with a Rust core
5
+ Author-email: Nikita Ryzhenkov <nikita.ryzhenkoff@gmail.com>
6
+ License: MIT License
7
+
8
+ Copyright (c) 2025 Nikita Ryzhenkov
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Homepage, https://github.com/ebrake/oxyde-postgres
29
+ Project-URL: Documentation, https://github.com/ebrake/oxyde-postgres/tree/main/docs
30
+ Project-URL: Repository, https://github.com/ebrake/oxyde-postgres
31
+ Project-URL: Issues, https://github.com/ebrake/oxyde-postgres/issues
32
+ Keywords: orm,async,database,postgresql,pydantic
33
+ Classifier: Development Status :: 4 - Beta
34
+ Classifier: Intended Audience :: Developers
35
+ Classifier: License :: OSI Approved :: MIT License
36
+ Classifier: Programming Language :: Python :: 3
37
+ Classifier: Programming Language :: Python :: 3.10
38
+ Classifier: Programming Language :: Python :: 3.11
39
+ Classifier: Programming Language :: Python :: 3.12
40
+ Classifier: Programming Language :: Python :: 3.13
41
+ Classifier: Programming Language :: Python :: 3.14
42
+ Classifier: Programming Language :: Python :: 3.15
43
+ Classifier: Programming Language :: Rust
44
+ Classifier: Framework :: AsyncIO
45
+ Classifier: Topic :: Database
46
+ Classifier: Typing :: Typed
47
+ Requires-Python: >=3.10
48
+ Description-Content-Type: text/markdown
49
+ License-File: LICENSE
50
+ Requires-Dist: pydantic>=2.0
51
+ Requires-Dist: msgpack>=1.0
52
+ Requires-Dist: typer>=0.24
53
+ Requires-Dist: oxyde-postgres-core<0.2.0,>=0.1.0
54
+ Provides-Extra: dev
55
+ Requires-Dist: pytest>=9.0; extra == "dev"
56
+ Requires-Dist: pytest-asyncio>=1.0; extra == "dev"
57
+ Requires-Dist: pytest-cov>=7.0; extra == "dev"
58
+ Requires-Dist: ruff>=0.14.7; extra == "dev"
59
+ Requires-Dist: pre-commit>=4.5.0; extra == "dev"
60
+ Requires-Dist: mypy==1.19.1; extra == "dev"
61
+ Requires-Dist: pyright[nodejs]==1.1.411; extra == "dev"
62
+ Requires-Dist: ty==0.0.59; extra == "dev"
63
+ Requires-Dist: testcontainers[postgres]>=4.0; extra == "dev"
64
+ Requires-Dist: psycopg2-binary>=2.9; extra == "dev"
65
+ Provides-Extra: docs
66
+ Requires-Dist: mkdocs<2,>=1.6; extra == "docs"
67
+ Requires-Dist: mkdocs-material>=9.5; extra == "docs"
68
+ Dynamic: license-file
69
+
70
+ # Oxyde for PostgreSQL
71
+
72
+ Oxyde for PostgreSQL is a PostgreSQL-focused fork of [Oxyde ORM](https://github.com/mr-fatalyst/oxyde): a type-safe, Pydantic-centric asynchronous ORM with a high-performance Rust core designed for clarity, speed, and reliability. It builds on Oxyde's great work and optimizes it for PostgreSQL with bug fixes and PostgreSQL-specific features.
73
+
74
+ **Requires PostgreSQL 18+ and Python 3.10+.** The Rust core checks the server version when connecting. Both `postgres://` and `postgresql://` connection URLs are supported.
75
+
76
+ ## Features
77
+
78
+ - Pydantic v2 models with validation, type hints, and serialization.
79
+ - Familiar `Model.objects.filter()` queries, joins, aggregates, and bulk operations.
80
+ - Native PostgreSQL arrays, JSONB, enums, UUIDs, decimals, `RETURNING`, and row locks.
81
+ - Array and JSON lookups: `contains`, `contained_by`, and `overlap`.
82
+ - Async transactions with nested savepoints and public transaction-depth reporting.
83
+ - Schema migrations with PostgreSQL advisory locking and transactional DDL.
84
+ - Rust SQL generation, connection pooling, and execution, with Python 3.15 wheel support.
85
+ - Cache-disabled unnamed statements for PostgreSQL/PgBouncer, including cold custom-type decoding without replaying queries.
86
+
87
+ The initial fork release is **0.1.0**. [First-release notes](docs/changelog.md) list every addition and its source.
88
+
89
+ ## Installation
90
+
91
+ ```bash
92
+ pip install oxyde-postgres
93
+ ```
94
+
95
+ The distribution names are `oxyde-postgres` and `oxyde-postgres-core`. Python imports remain `oxyde`, the native module remains `_oxyde_core`, and the CLI remains `oxyde`. Use a separate virtual environment from upstream Oxyde because the packages share these import names.
96
+
97
+ To build this checkout:
98
+
99
+ ```bash
100
+ uv venv --python 3.13
101
+ source .venv/bin/activate
102
+ uv pip install maturin
103
+ maturin develop --manifest-path crates/oxyde-core-py/Cargo.toml
104
+ uv pip install -e './python[dev]'
105
+ ```
106
+
107
+ ## Quick start
108
+
109
+ ```python
110
+ import asyncio
111
+ from oxyde import Field, Model, db
112
+ from oxyde.db.schema import create_tables
113
+
114
+ class User(Model):
115
+ id: int | None = Field(default=None, db_pk=True)
116
+ name: str
117
+ email: str = Field(db_unique=True)
118
+ tags: list[str] = Field(default_factory=list)
119
+
120
+ class Meta:
121
+ is_table = True
122
+
123
+ async def main():
124
+ await db.init(default="postgresql://user:password@localhost:5432/app")
125
+ try:
126
+ connection = await db.get_connection()
127
+ await create_tables(connection)
128
+ await User.objects.create(name="Alice", email="alice@example.com", tags=["python"])
129
+ users = await User.objects.filter(tags__contains=["python"]).all()
130
+ print(users)
131
+ finally:
132
+ await db.close()
133
+
134
+ asyncio.run(main())
135
+ ```
136
+
137
+ For managed schema changes, run `oxyde init`, `oxyde makemigrations`, and `oxyde migrate`. See the [documentation](docs/index.md), [connection guide](docs/guide/connections.md), and [contributor guide](.github/CONTRIBUTING.md).
138
+
139
+ ## Credit and license
140
+
141
+ Oxyde for PostgreSQL is based on [Oxyde](https://github.com/mr-fatalyst/oxyde), created by Nikita Ryzhenkov and its contributors. The original MIT [license](LICENSE) is preserved. The vendored SQLx PostgreSQL driver retains its MIT and Apache-2.0 licenses.
@@ -0,0 +1,66 @@
1
+ oxyde/__init__.py,sha256=V8AAVL7--6DIgVhEX8qRMfYw_-5q8TgfQR-DnKM3bQM,3759
2
+ oxyde/_msgpack.py,sha256=tL9R1zPOL8L4pWuwH3EJpYBXiBgp3WdgH356sgDFSqo,70
3
+ oxyde/exceptions.py,sha256=sSlVlPb47SFaIvoe_UlcnvXuDWYv8yLUkJH3FSD46N8,2674
4
+ oxyde/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ oxyde/cli/__init__.py,sha256=eQT3e8zd0qaBcdKUxtQg2Livi1szzSXt7Rgn7JLT5ac,261
6
+ oxyde/cli/app.py,sha256=d5VmFDJCzh5LVm52QFHinqcKLIkwmdKeWNScZ0_6DU4,2954
7
+ oxyde/cli/codegen.py,sha256=V4SSV0hZgCu7y4tgqjkiW1nxHa9bFxJ8wTs8AcqUEkM,1944
8
+ oxyde/cli/config.py,sha256=gtmv0SdKxQERle1v81yX5-E53cgI2A3zeQszLIiw_n8,2450
9
+ oxyde/cli/migrations.py,sha256=sYg_x6SB1rkXGcOmu1JkkI22bzrC8lAKAmp-StG6MBM,18556
10
+ oxyde/codegen/__init__.py,sha256=_NmQ5917rqkmfSp85frKFINaxRte4u5a0qAOiA2zNmU,318
11
+ oxyde/codegen/stub_generator.py,sha256=iaxZBUNCsvefnTQh5DHefhv6NPjuzEdA3X2BbaLI7YI,40428
12
+ oxyde/core/__init__.py,sha256=7oLCO879yPQ_27l3lyFtjXcilCYhg7lYHhDZrBbmVzY,2763
13
+ oxyde/core/column_types.py,sha256=gq5rqL1bn92RvzhaxbfZ4bRSwE-fnlbYFnGTmOg1EIg,11341
14
+ oxyde/core/ir.py,sha256=TguwMip6uYcnPifDMsxyS7lXU8OKf3U1xfdOtxWsfQ8,12127
15
+ oxyde/core/types.py,sha256=VPR-s4TYarALJE0lvl6cwOqp4HnHlHUQtNr4wIZ-7sU,2602
16
+ oxyde/core/wrapper.py,sha256=L5bK2x-a938EKdjyxttB1oD6pq3R8IfO_S4jGQNIchw,8968
17
+ oxyde/db/__init__.py,sha256=4G-b0uXTEOsTf7l0TuP0BI57zQqtnnS3X27U_56iM-I,6299
18
+ oxyde/db/pool.py,sha256=TxVXA2nlQvFD0_FwW6jobJyy9St7waLfKesnjI-4IOo,10751
19
+ oxyde/db/registry.py,sha256=_Q0GGal3Ug3YVlMZm3wI5FAbc7wtEYL7ZZ5pm-UN3Mk,3453
20
+ oxyde/db/schema.py,sha256=BaT-_s1GCU__70ezswkmWF8XoT_9I4xoEbJ8Ld-n5fM,1615
21
+ oxyde/db/transaction.py,sha256=p4wjFYLaROGQUcrSVd4jarEXvBdAYZ2JRcz2STbjnZY,13969
22
+ oxyde/migrations/__init__.py,sha256=OW23iCM5srCOtax0vsjSinWGng_sKPySpC1jeT3pU1g,1353
23
+ oxyde/migrations/config.py,sha256=w4N0auvZPmLtb8Anyg05JW0-58ElbOx3f7eCZLZx1I8,4747
24
+ oxyde/migrations/context.py,sha256=EvMbwDje5eulQTMM6hyHsv9g81Po74meY-a7lpSrLrc,19026
25
+ oxyde/migrations/executor.py,sha256=LDOLary1KxETSi8uIMvdaHoJE0mN8h3f6ZUbNJihxzg,14148
26
+ oxyde/migrations/extract.py,sha256=9k7vOtvSP-YRgpy7r4nhhYEkrvFDfZnuGeIIttBsPGQ,11653
27
+ oxyde/migrations/generator.py,sha256=MJjjtpgAhMmnOgPe-gYA1ttQoGMc3Ul8_Ycxqf2QigE,20025
28
+ oxyde/migrations/replay.py,sha256=2ZryY-IyWpP7rpn7503e2y7c9NuzRN9il1Zss6VU8Yg,13483
29
+ oxyde/migrations/squash.py,sha256=qIl2vgH9_rhZT7hcv1HA5Tx9pDT7HHKKfSZPa8dYisE,3948
30
+ oxyde/migrations/tracker.py,sha256=hhhxU0UwxX_jRT6tEiTLf2ovt9PnIpXRvahvoQFiV94,4309
31
+ oxyde/migrations/utils.py,sha256=4ufMh_tuY6QTuNW9LL-tHO3fEjb3MhJ_oRW_r-KbtVE,5074
32
+ oxyde/models/__init__.py,sha256=yYizN3bbLTTe4JnlTKuFFhq0HRADzx9pRcix2nvuQkk,2386
33
+ oxyde/models/base.py,sha256=AwbRhHD4Ke-Nar8s1ypTj7o0up9u14s7tN2Hul6Cwno,34526
34
+ oxyde/models/decorators.py,sha256=-nDxVS7ukIr36sYCkLWe7Cf_yhi1_HYbXkrOneYm6Qs,3364
35
+ oxyde/models/field.py,sha256=EbzGqqoTwH75V8jpRTNwIGwYTjPVbKmyNtTwW0THPvQ,7490
36
+ oxyde/models/lookups.py,sha256=upEpleosKOkVwdQRI0XcnrsOoNXVNuPWvFYMSL_KlfM,22982
37
+ oxyde/models/metadata.py,sha256=RQujmLSN8_V3bWdjvAIi26MR_Cz084BHHKGlE5E-kCw,5878
38
+ oxyde/models/registry.py,sha256=hcciVB8V380GsOk0Rz-E7vd-7kxVdbguWuUzrDv0zC4,5265
39
+ oxyde/models/serializers.py,sha256=iuxU6N5MXvwTlKk1ttx55QbVOG99NvK4R7Qwoco77Hw,4991
40
+ oxyde/models/utils.py,sha256=4Ujw5LVUD58BEWLq3Hi8xAudTpevBJQbLTC5QZcJlpQ,3863
41
+ oxyde/queries/__init__.py,sha256=yDkvxC6iriHoZeVROTsbRTVebAzywnLebnnKZJvd76c,2335
42
+ oxyde/queries/aggregates.py,sha256=4wykIyztg-bvYQQO1mgW_ZSZujcZ2TfsaaZMqWHX48o,3459
43
+ oxyde/queries/base.py,sha256=OG_bgf22zFKwoGzSo_XqMoj77Z0CCfH1xPs37TiyIO8,8144
44
+ oxyde/queries/conditions.py,sha256=hjIIwB9Xxc1uEaB5hq_ZnkOUNBv_xiDVTlDP9r7FAc8,2790
45
+ oxyde/queries/expressions.py,sha256=z3yH0ECFSfINf-Y1TlYVCtBeu579ihJ1YDt_3mLlzJM,5483
46
+ oxyde/queries/insert.py,sha256=9xkRtxKynIYyA3PTRK698q3zPNICoyHEfoqEZcbf6-w,4190
47
+ oxyde/queries/joins.py,sha256=2-poUqJ_6EkYFb_hUMg16B1TCNG6eL4ytlrFTEGS83Y,2110
48
+ oxyde/queries/manager.py,sha256=ir5cok0PCzfJw92DHC0doF09sJc-zRE0JtcfXp3BHdk,12577
49
+ oxyde/queries/q.py,sha256=iv2Ex0Yj8sAT7dTnq-5BLYv_KsfMqVl__09eT6ZZ0a4,8305
50
+ oxyde/queries/raw.py,sha256=alBxPGjUGKgoO5L1sj8FA9ZI3RuwmJNCGUdMQ_KDfrs,3519
51
+ oxyde/queries/select.py,sha256=VV4k7RH5wablgzwW4NOgQIKArJCYB1M94oYlrsivV1Y,12903
52
+ oxyde/queries/typed.py,sha256=DmEI2iJ_IdikZQc82-nPHg0GaKFiSbx8pmlcl-LvS-M,6254
53
+ oxyde/queries/mixins/__init__.py,sha256=qH6qk3WskIwZI9acEUFC_VIV012cQ_929rxzCZelVHo,2405
54
+ oxyde/queries/mixins/aggregation.py,sha256=T_f2aV4cBKgIuR-rC3TAw62xGvybfvInp_OZyzcMZ9E,10943
55
+ oxyde/queries/mixins/debug.py,sha256=kvlR9RhE5XVN-qMJi-qJVeFTEf2XLk0WK1bDNonp-eY,4721
56
+ oxyde/queries/mixins/execution.py,sha256=hAYtIo_VL05gAvjxZsJ2PPx05Rpw2kME0j57iyM-EMs,25491
57
+ oxyde/queries/mixins/filtering.py,sha256=GJcNVWhHw5qqsaKQ2WEIKzu1nDMn5W75MELF7L_ITdI,4397
58
+ oxyde/queries/mixins/joining.py,sha256=Zwdn0kRsG02YBXA_mJAbjWtWpQJg3NXnAOo3vhcqbTY,5710
59
+ oxyde/queries/mixins/mutation.py,sha256=BJ8FGSs9cFuRy2FIQCOtR7hwKdZWteIVQV9dOxMlbAk,17237
60
+ oxyde/queries/mixins/pagination.py,sha256=3Ibnse9EMPVIyqnl2au5VwP3TLUu2u9rt2qZNSU2KQQ,4892
61
+ oxyde_postgres-0.1.0.dist-info/licenses/LICENSE,sha256=SXHEoXp8JhyTAsuEh8x5EqyLWRlGw8Y_Qxxuh1qoHGs,1073
62
+ oxyde_postgres-0.1.0.dist-info/METADATA,sha256=MN8WiEFdYrWBDCcCJdpKfTLCMW0p2BjqKNtUJidAtGg,6454
63
+ oxyde_postgres-0.1.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
64
+ oxyde_postgres-0.1.0.dist-info/entry_points.txt,sha256=6MxhRWdknHjayZKB86oNE2Hn8l6uwsEj0gAJQCItJT0,40
65
+ oxyde_postgres-0.1.0.dist-info/top_level.txt,sha256=wzESBpXFbFBhqmE5Xk98j3nnK5afcbNoIEdpv9bP96w,6
66
+ oxyde_postgres-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.2.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ oxyde = oxyde.cli:app
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Nikita Ryzhenkov
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 @@
1
+ oxyde