libres 0.7.3__py3-none-any.whl → 0.9.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.
- libres/__init__.py +3 -1
- libres/context/core.py +37 -31
- libres/context/exposure.py +7 -3
- libres/context/registry.py +15 -11
- libres/context/session.py +8 -6
- libres/context/settings.py +9 -6
- libres/db/__init__.py +3 -1
- libres/db/models/__init__.py +2 -0
- libres/db/models/allocation.py +72 -59
- libres/db/models/base.py +2 -0
- libres/db/models/other.py +12 -7
- libres/db/models/reservation.py +30 -25
- libres/db/models/reserved_slot.py +12 -10
- libres/db/models/timestamp.py +9 -7
- libres/db/models/types/__init__.py +2 -0
- libres/db/models/types/json_type.py +26 -28
- libres/db/models/types/utcdatetime.py +10 -8
- libres/db/models/types/uuid_type.py +10 -8
- libres/db/queries.py +32 -27
- libres/db/scheduler.py +141 -131
- libres/modules/__init__.py +0 -1
- libres/modules/errors.py +9 -7
- libres/modules/events.py +57 -56
- libres/modules/rasterizer.py +11 -7
- libres/modules/utils.py +16 -14
- {libres-0.7.3.dist-info → libres-0.9.0.dist-info}/METADATA +49 -16
- libres-0.9.0.dist-info/RECORD +33 -0
- {libres-0.7.3.dist-info → libres-0.9.0.dist-info}/WHEEL +1 -1
- libres-0.7.3.dist-info/RECORD +0 -33
- {libres-0.7.3.dist-info → libres-0.9.0.dist-info/licenses}/LICENSE +0 -0
- {libres-0.7.3.dist-info → libres-0.9.0.dist-info}/top_level.txt +0 -0
libres/modules/__init__.py
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# remove this file from .coveragerc if code is added below!
|
libres/modules/errors.py
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
if TYPE_CHECKING:
|
|
3
5
|
from datetime import datetime
|
|
4
6
|
from libres.db.models import Allocation, Reservation, ReservedSlot
|
|
5
7
|
|
|
6
8
|
|
|
7
9
|
class LibresError(Exception):
|
|
8
10
|
__slots__ = ('reservation',)
|
|
9
|
-
reservation:
|
|
11
|
+
reservation: Reservation
|
|
10
12
|
"""
|
|
11
13
|
This attribute is not guaranteed to exist
|
|
12
14
|
"""
|
|
@@ -98,9 +100,9 @@ class OverlappingAllocationError(LibresError):
|
|
|
98
100
|
|
|
99
101
|
def __init__(
|
|
100
102
|
self,
|
|
101
|
-
start:
|
|
102
|
-
end:
|
|
103
|
-
existing:
|
|
103
|
+
start: datetime,
|
|
104
|
+
end: datetime,
|
|
105
|
+
existing: Allocation
|
|
104
106
|
):
|
|
105
107
|
self.start = start
|
|
106
108
|
self.end = end
|
|
@@ -117,7 +119,7 @@ class AffectedReservationError(LibresError):
|
|
|
117
119
|
|
|
118
120
|
def __init__(
|
|
119
121
|
self,
|
|
120
|
-
existing:
|
|
122
|
+
existing: Reservation | ReservedSlot | None
|
|
121
123
|
):
|
|
122
124
|
self.existing = existing
|
|
123
125
|
|
libres/modules/events.py
CHANGED
|
@@ -18,64 +18,49 @@ To remove the same event::
|
|
|
18
18
|
|
|
19
19
|
Events are called in the order they were added.
|
|
20
20
|
"""
|
|
21
|
+
from __future__ import annotations
|
|
21
22
|
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
from typing import overload
|
|
25
|
+
from typing import Protocol
|
|
26
|
+
from typing import TYPE_CHECKING
|
|
27
|
+
if TYPE_CHECKING:
|
|
28
|
+
from collections.abc import Callable
|
|
29
|
+
from collections.abc import Sequence
|
|
25
30
|
from datetime import datetime
|
|
26
|
-
from typing_extensions import ParamSpec
|
|
31
|
+
from typing_extensions import ParamSpec
|
|
27
32
|
from uuid import UUID
|
|
28
33
|
|
|
29
34
|
from libres.context.core import Context
|
|
30
35
|
from libres.db.models import Allocation, Reservation
|
|
31
36
|
|
|
32
37
|
_P = ParamSpec('_P')
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
#
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
__context: Context,
|
|
60
|
-
__reservation: Reservation,
|
|
61
|
-
old_time: _dtrange,
|
|
62
|
-
new_time: _dtrange
|
|
63
|
-
) -> None: ...
|
|
64
|
-
|
|
65
|
-
else:
|
|
66
|
-
class Event(list):
|
|
67
|
-
"""Event subscription. By http://stackoverflow.com/a/2022629
|
|
68
|
-
|
|
69
|
-
A list of callable objects. Calling an instance of this will cause a
|
|
70
|
-
call to each item in the list in ascending order by index.
|
|
71
|
-
|
|
72
|
-
"""
|
|
73
|
-
def __call__(self, *args: _t.Any, **kwargs: _t.Any) -> None:
|
|
74
|
-
for f in self:
|
|
75
|
-
f(*args, **kwargs)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
on_allocations_added: 'Event[Context, _t.Sequence[Allocation]]' = Event()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class Event(list['Callable[_P, object]']):
|
|
41
|
+
"""Event subscription. By http://stackoverflow.com/a/2022629
|
|
42
|
+
|
|
43
|
+
A list of callable objects. Calling an instance of this will cause a
|
|
44
|
+
call to each item in the list in ascending order by index.
|
|
45
|
+
|
|
46
|
+
"""
|
|
47
|
+
# NOTE: This is only used for binding the correct `ParamSpec` for callback
|
|
48
|
+
# protocols, otherwise we have to define a pseudo-type, that doesn't
|
|
49
|
+
# look like an instance of `Event`...
|
|
50
|
+
@overload
|
|
51
|
+
def __init__(self, f: type[Callable[_P, object]]) -> None: ...
|
|
52
|
+
@overload
|
|
53
|
+
def __init__(self) -> None: ...
|
|
54
|
+
|
|
55
|
+
def __init__(self, f: object = None) -> None:
|
|
56
|
+
return
|
|
57
|
+
|
|
58
|
+
def __call__(self, *args: _P.args, **kwargs: _P.kwargs) -> None:
|
|
59
|
+
for f in self:
|
|
60
|
+
f(*args, **kwargs)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
on_allocations_added: Event[Context, Sequence[Allocation]] = Event()
|
|
79
64
|
""" Called when an allocation is added, with the following arguments:
|
|
80
65
|
|
|
81
66
|
:context:
|
|
@@ -88,7 +73,7 @@ on_allocations_added: 'Event[Context, _t.Sequence[Allocation]]' = Event()
|
|
|
88
73
|
|
|
89
74
|
"""
|
|
90
75
|
|
|
91
|
-
on_reservations_made:
|
|
76
|
+
on_reservations_made: Event[Context, Sequence[Reservation]] = Event()
|
|
92
77
|
""" Called when a reservation is made, with the following arguments:
|
|
93
78
|
|
|
94
79
|
:context:
|
|
@@ -103,7 +88,8 @@ on_reservations_made: 'Event[Context, _t.Sequence[Reservation]]' = Event()
|
|
|
103
88
|
|
|
104
89
|
"""
|
|
105
90
|
|
|
106
|
-
on_reservations_confirmed:
|
|
91
|
+
on_reservations_confirmed: Event[Context, Sequence[Reservation], UUID]
|
|
92
|
+
on_reservations_confirmed = Event()
|
|
107
93
|
""" Called when a reservation bound to a browser session is confirmed, with
|
|
108
94
|
the following arguments:
|
|
109
95
|
|
|
@@ -119,7 +105,7 @@ the following arguments:
|
|
|
119
105
|
The session id that is being confirmed.
|
|
120
106
|
"""
|
|
121
107
|
|
|
122
|
-
on_reservations_approved:
|
|
108
|
+
on_reservations_approved: Event[Context, Sequence[Reservation]] = Event()
|
|
123
109
|
""" Called when a reservation is approved, with the following arguments:
|
|
124
110
|
|
|
125
111
|
:context:
|
|
@@ -132,7 +118,7 @@ on_reservations_approved: 'Event[Context, _t.Sequence[Reservation]]' = Event()
|
|
|
132
118
|
|
|
133
119
|
"""
|
|
134
120
|
|
|
135
|
-
on_reservations_denied:
|
|
121
|
+
on_reservations_denied: Event[Context, Sequence[Reservation]] = Event()
|
|
136
122
|
""" Called when a reservation is denied, with the following arguments:
|
|
137
123
|
|
|
138
124
|
:context:
|
|
@@ -145,7 +131,7 @@ on_reservations_denied: 'Event[Context, _t.Sequence[Reservation]]' = Event()
|
|
|
145
131
|
|
|
146
132
|
"""
|
|
147
133
|
|
|
148
|
-
on_reservations_removed:
|
|
134
|
+
on_reservations_removed: Event[Context, Sequence[Reservation]] = Event()
|
|
149
135
|
""" Called when a reservation is removed, with the following arguments:
|
|
150
136
|
|
|
151
137
|
:context:
|
|
@@ -158,8 +144,23 @@ on_reservations_removed: 'Event[Context, _t.Sequence[Reservation]]' = Event()
|
|
|
158
144
|
|
|
159
145
|
"""
|
|
160
146
|
|
|
161
|
-
|
|
162
|
-
|
|
147
|
+
|
|
148
|
+
# NOTE: We need to use a callback protocol, just because
|
|
149
|
+
# we provide old_time/new_time by name, we probably
|
|
150
|
+
# should do it positionally instead, but that would
|
|
151
|
+
# be a potentially breaking change...
|
|
152
|
+
class _OnReservationTimeChangedCallback(Protocol):
|
|
153
|
+
def __call__(
|
|
154
|
+
self,
|
|
155
|
+
context: Context,
|
|
156
|
+
reservation: Reservation,
|
|
157
|
+
/,
|
|
158
|
+
old_time: tuple[datetime, datetime],
|
|
159
|
+
new_time: tuple[datetime, datetime]
|
|
160
|
+
) -> None: ...
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
on_reservation_time_changed = Event(_OnReservationTimeChangedCallback)
|
|
163
164
|
""" Called when a reservation's time changes , with the following arguments:
|
|
164
165
|
|
|
165
166
|
:context:
|
libres/modules/rasterizer.py
CHANGED
|
@@ -26,24 +26,28 @@ If we now have a key on the start time and this time is rastered we can block
|
|
|
26
26
|
overlapping reservations on the database level.
|
|
27
27
|
|
|
28
28
|
"""
|
|
29
|
+
from __future__ import annotations
|
|
29
30
|
|
|
30
31
|
from datetime import datetime, timedelta
|
|
31
32
|
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
from typing import Literal
|
|
35
|
+
from typing import TYPE_CHECKING
|
|
36
|
+
if TYPE_CHECKING:
|
|
37
|
+
from collections.abc import Iterator
|
|
38
|
+
from typing_extensions import TypeAlias
|
|
35
39
|
from typing_extensions import TypeGuard
|
|
36
40
|
|
|
37
41
|
|
|
38
|
-
Raster =
|
|
42
|
+
Raster: TypeAlias = Literal[5, 10, 15, 30, 60]
|
|
39
43
|
|
|
40
44
|
# The raster values must divide an hour without any remaining minutes
|
|
41
|
-
VALID_RASTER:
|
|
45
|
+
VALID_RASTER: tuple[Raster, ...] = (5, 10, 15, 30, 60)
|
|
42
46
|
MIN_RASTER: Raster = min(VALID_RASTER)
|
|
43
47
|
MAX_RASTER: Raster = max(VALID_RASTER)
|
|
44
48
|
|
|
45
49
|
|
|
46
|
-
def is_valid_raster(raster: int) ->
|
|
50
|
+
def is_valid_raster(raster: int) -> TypeGuard[Raster]:
|
|
47
51
|
return raster in VALID_RASTER
|
|
48
52
|
|
|
49
53
|
|
|
@@ -76,7 +80,7 @@ def rasterize_span(
|
|
|
76
80
|
start: datetime,
|
|
77
81
|
end: datetime,
|
|
78
82
|
raster: Raster
|
|
79
|
-
) ->
|
|
83
|
+
) -> tuple[datetime, datetime]:
|
|
80
84
|
"""Rasterizes both a start and an end date."""
|
|
81
85
|
return rasterize_start(start, raster), rasterize_end(end, raster)
|
|
82
86
|
|
|
@@ -85,7 +89,7 @@ def iterate_span(
|
|
|
85
89
|
start: datetime,
|
|
86
90
|
end: datetime,
|
|
87
91
|
raster: Raster
|
|
88
|
-
) ->
|
|
92
|
+
) -> Iterator[tuple[datetime, datetime]]:
|
|
89
93
|
"""Iterates through all raster blocks within a certain timespan."""
|
|
90
94
|
start, end = rasterize_span(start, end, raster)
|
|
91
95
|
|
libres/modules/utils.py
CHANGED
|
@@ -1,26 +1,28 @@
|
|
|
1
|
-
import
|
|
1
|
+
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import sedate
|
|
3
4
|
from collections.abc import Iterable
|
|
4
|
-
from uuid import UUID
|
|
5
|
+
from uuid import UUID
|
|
6
|
+
from uuid import uuid5 as new_uuid_mirror
|
|
5
7
|
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
if
|
|
9
|
+
from typing import TYPE_CHECKING
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from collections.abc import Iterator
|
|
9
12
|
from datetime import datetime
|
|
10
13
|
from sedate.types import TzInfoOrName
|
|
14
|
+
from typing import TypeVar
|
|
11
15
|
from typing_extensions import TypeAlias
|
|
12
16
|
|
|
13
|
-
_T =
|
|
14
|
-
_NestedIterable: TypeAlias =
|
|
15
|
-
_t.Union[_T, '_NestedIterable[_T]']
|
|
16
|
-
]
|
|
17
|
+
_T = TypeVar('_T')
|
|
18
|
+
_NestedIterable: TypeAlias = Iterable['_T | _NestedIterable[_T]']
|
|
17
19
|
|
|
18
20
|
|
|
19
|
-
def generate_uuids(uuid: UUID, quota: int) ->
|
|
21
|
+
def generate_uuids(uuid: UUID, quota: int) -> list[UUID]:
|
|
20
22
|
return [new_uuid_mirror(uuid, str(n)) for n in range(1, quota)]
|
|
21
23
|
|
|
22
24
|
|
|
23
|
-
def flatten(listlike:
|
|
25
|
+
def flatten(listlike: _NestedIterable[_T]) -> Iterator[_T]:
|
|
24
26
|
"""Generator for flattening irregularly nested lists. 'Borrowed' from here:
|
|
25
27
|
|
|
26
28
|
http://stackoverflow.com/questions/2158395/
|
|
@@ -33,7 +35,7 @@ def flatten(listlike: '_NestedIterable[_T]') -> _t.Iterable['_T']:
|
|
|
33
35
|
yield el # type:ignore[misc]
|
|
34
36
|
|
|
35
37
|
|
|
36
|
-
def pairs(listlike:
|
|
38
|
+
def pairs(listlike: _NestedIterable[_T]) -> Iterator[tuple[_T, _T]]:
|
|
37
39
|
"""Takes any list and returns pairs:
|
|
38
40
|
((a,b),(c,d)) => ((a,b),(c,d))
|
|
39
41
|
(a,b,c,d) => ((a,b),(c,d))
|
|
@@ -46,9 +48,9 @@ def pairs(listlike: '_NestedIterable[_T]') -> '_t.Iterator[_t.Tuple[_T, _T]]':
|
|
|
46
48
|
|
|
47
49
|
|
|
48
50
|
def is_valid_reservation_length(
|
|
49
|
-
start:
|
|
50
|
-
end:
|
|
51
|
-
timezone:
|
|
51
|
+
start: datetime,
|
|
52
|
+
end: datetime,
|
|
53
|
+
timezone: TzInfoOrName
|
|
52
54
|
) -> bool:
|
|
53
55
|
|
|
54
56
|
start = sedate.standardize_date(start, timezone)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: libres
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.0
|
|
4
4
|
Summary: A library to reserve things
|
|
5
5
|
Home-page: http://github.com/seantis/libres/
|
|
6
6
|
Author: Denis Krienbühl
|
|
@@ -14,13 +14,13 @@ Classifier: License :: OSI Approved :: BSD License
|
|
|
14
14
|
Classifier: Operating System :: OS Independent
|
|
15
15
|
Classifier: Programming Language :: Python
|
|
16
16
|
Classifier: Programming Language :: Python :: 3
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.9
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.10
|
|
20
19
|
Classifier: Programming Language :: Python :: 3.11
|
|
21
20
|
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
22
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
23
|
-
Requires-Python: >=3.
|
|
23
|
+
Requires-Python: >=3.9
|
|
24
24
|
Description-Content-Type: text/x-rst
|
|
25
25
|
License-File: LICENSE
|
|
26
26
|
Requires-Dist: python-dateutil
|
|
@@ -30,10 +30,20 @@ Requires-Dist: sedate>=1.0.0
|
|
|
30
30
|
Requires-Dist: SQLAlchemy<2,>=0.9
|
|
31
31
|
Provides-Extra: dev
|
|
32
32
|
Requires-Dist: bandit[toml]; extra == "dev"
|
|
33
|
+
Requires-Dist: bump-my-version; extra == "dev"
|
|
33
34
|
Requires-Dist: flake8; extra == "dev"
|
|
34
|
-
Requires-Dist: flake8-
|
|
35
|
+
Requires-Dist: flake8-type-checking; extra == "dev"
|
|
35
36
|
Requires-Dist: pre-commit; extra == "dev"
|
|
37
|
+
Requires-Dist: pre-commit-uv; extra == "dev"
|
|
38
|
+
Requires-Dist: ruff; extra == "dev"
|
|
39
|
+
Requires-Dist: uv; extra == "dev"
|
|
36
40
|
Requires-Dist: tox; extra == "dev"
|
|
41
|
+
Requires-Dist: tox-uv; extra == "dev"
|
|
42
|
+
Provides-Extra: test
|
|
43
|
+
Requires-Dist: jsonpickle; extra == "test"
|
|
44
|
+
Requires-Dist: pytest; extra == "test"
|
|
45
|
+
Requires-Dist: pytest-codecov[git]; extra == "test"
|
|
46
|
+
Requires-Dist: testing.postgresql; extra == "test"
|
|
37
47
|
Provides-Extra: mypy
|
|
38
48
|
Requires-Dist: mypy; extra == "mypy"
|
|
39
49
|
Requires-Dist: sqlalchemy-stubs; extra == "mypy"
|
|
@@ -41,18 +51,14 @@ Requires-Dist: types-psycopg2; extra == "mypy"
|
|
|
41
51
|
Requires-Dist: types-python-dateutil; extra == "mypy"
|
|
42
52
|
Requires-Dist: types-pytz; extra == "mypy"
|
|
43
53
|
Requires-Dist: typing-extensions; extra == "mypy"
|
|
44
|
-
|
|
45
|
-
Requires-Dist: jsonpickle; extra == "test"
|
|
46
|
-
Requires-Dist: pytest; extra == "test"
|
|
47
|
-
Requires-Dist: pytest-codecov[git]; extra == "test"
|
|
48
|
-
Requires-Dist: testing.postgresql; extra == "test"
|
|
54
|
+
Dynamic: license-file
|
|
49
55
|
|
|
50
56
|
Libres
|
|
51
57
|
======
|
|
52
58
|
|
|
53
59
|
Libres is a reservations management library to reserve things like tables at
|
|
54
|
-
a restaurant or tickets at an event. It works with Python 3.
|
|
55
|
-
and requires Postgresql 9.
|
|
60
|
+
a restaurant or tickets at an event. It works with Python 3.9+
|
|
61
|
+
and requires Postgresql 9.2+.
|
|
56
62
|
|
|
57
63
|
`Documentation <http://libres.readthedocs.org/en/latest/>`_ | `Source <http://github.com/seantis/libres/>`_ | `Bugs <http://github.com/seantis/libres/issues>`_
|
|
58
64
|
|
|
@@ -91,19 +97,19 @@ Run the Tests
|
|
|
91
97
|
|
|
92
98
|
Install tox and run it::
|
|
93
99
|
|
|
94
|
-
pip install tox
|
|
100
|
+
pip install tox tox-uv
|
|
95
101
|
tox
|
|
96
102
|
|
|
97
103
|
Limit the tests to a specific python version::
|
|
98
104
|
|
|
99
|
-
tox -e
|
|
105
|
+
tox -e py311
|
|
100
106
|
|
|
101
107
|
Conventions
|
|
102
108
|
-----------
|
|
103
109
|
|
|
104
110
|
Libres follows PEP8 as close as possible. To test for it run::
|
|
105
111
|
|
|
106
|
-
tox -e
|
|
112
|
+
tox -e ruff,flake8
|
|
107
113
|
|
|
108
114
|
Libres uses `Semantic Versioning <http://semver.org/>`_
|
|
109
115
|
|
|
@@ -128,7 +134,7 @@ Making a new Release
|
|
|
128
134
|
|
|
129
135
|
Make sure all changes are in the HISTORY.rst, then bump the version::
|
|
130
136
|
|
|
131
|
-
|
|
137
|
+
bump-my-version bump major|minor|patch
|
|
132
138
|
git push && git push --tags
|
|
133
139
|
|
|
134
140
|
After this, create a new release on Github.
|
|
@@ -136,6 +142,33 @@ After this, create a new release on Github.
|
|
|
136
142
|
Changelog
|
|
137
143
|
---------
|
|
138
144
|
|
|
145
|
+
0.9.0 (23.05.2025)
|
|
146
|
+
~~~~~~~~~~~~~~~~~~~
|
|
147
|
+
|
|
148
|
+
- Replaces `JSON` database type with `JSONB`, this means
|
|
149
|
+
Postgres as a backend is not required. You will also need
|
|
150
|
+
to write a migration for existing JSON columns. You may use
|
|
151
|
+
the following recipe using an alembic `Operations` object::
|
|
152
|
+
|
|
153
|
+
operations.alter_column(
|
|
154
|
+
'table_name',
|
|
155
|
+
'column_name',
|
|
156
|
+
type_=JSON,
|
|
157
|
+
postgresql_using='"column_name"::jsonb'
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
0.8.0 (15.01.2025)
|
|
161
|
+
~~~~~~~~~~~~~~~~~~~
|
|
162
|
+
|
|
163
|
+
- Adds support for Python 3.13
|
|
164
|
+
[Daverball]
|
|
165
|
+
|
|
166
|
+
- Drops support for Python 3.8
|
|
167
|
+
[Daverball]
|
|
168
|
+
|
|
169
|
+
- Modernizes type hints
|
|
170
|
+
[Daverball]
|
|
171
|
+
|
|
139
172
|
0.7.3 (2024-08-21)
|
|
140
173
|
~~~~~~~~~~~~~~~~~~~
|
|
141
174
|
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
libres/.gitignore,sha256=tyWYoDW7-zMdsfiJIVONRWJ5JmqJCTHzBOsi_rkIYZg,49
|
|
2
|
+
libres/__init__.py,sha256=PvqWkTPcr2krxpiiHWHCJEJ0-goR_I_aTo41XWRlQvQ,243
|
|
3
|
+
libres/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
libres/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
libres/context/core.py,sha256=AZMmFVqTVSkK3pomhoamLWOeqynY23g_uf32yjhgrRQ,7353
|
|
6
|
+
libres/context/exposure.py,sha256=0krsky3XYplG7Uf5oLlQgdXp6XuEDjN2JGe3ljgLM14,287
|
|
7
|
+
libres/context/registry.py,sha256=9UZcTQFZnTfHS1ERC8O8wXZqTwsxIz795q5Mi7UvnMg,4894
|
|
8
|
+
libres/context/session.py,sha256=bVvZ7cvSKffGrzxpDM7vKrGgwAPWRoS4No6HK1--xlg,2488
|
|
9
|
+
libres/context/settings.py,sha256=IkdG67QUUuk_sQMXiwsJgelrsbx6M-7f72uJBA2JoJA,1374
|
|
10
|
+
libres/db/__init__.py,sha256=Fks6T8aEacYVvXB9U1v182zKX7SuEUAkC5hTK50AuQk,145
|
|
11
|
+
libres/db/queries.py,sha256=mVLMcFh7tbAOOp8fveB1T-ZBt0X3hQiaN5Krt5Mmhhs,10917
|
|
12
|
+
libres/db/scheduler.py,sha256=L9I-vj3Y71h7rtPyaqfE4dD6QzZ79NiS48oXissY35w,64355
|
|
13
|
+
libres/db/models/__init__.py,sha256=IL52K-0tg_v6zuiiE2k4UQNqneeb8CLUUVo_t_OBU-g,325
|
|
14
|
+
libres/db/models/allocation.py,sha256=Zi-H3HGz4Xt9VhwUZmoUMc8xGr8rPBNiHGumnYcjlwI,29005
|
|
15
|
+
libres/db/models/base.py,sha256=Y2Lc60vJ1Du73D0sLozVNi1TfhtrQ3i_64NV7hsnc4g,117
|
|
16
|
+
libres/db/models/other.py,sha256=REg6GlJo58eAubu4MzJqNtWqoEJrq_hTGeOs7XYU5BQ,791
|
|
17
|
+
libres/db/models/reservation.py,sha256=GmDf9r_Sr0ZOQG2q-GbOtDTeJkOa8FJSi2tpWYk_hEA,5865
|
|
18
|
+
libres/db/models/reserved_slot.py,sha256=_r8RUHlaQHDgo14oO5mPUyfS8pI4jmrP-_l5HzuCPwA,3090
|
|
19
|
+
libres/db/models/timestamp.py,sha256=EsuxdQSUsPCkHb1F7HdrDevWZ5wDWerDFRIhqfhefNw,1301
|
|
20
|
+
libres/db/models/types/__init__.py,sha256=8fx7ecDasCKsCJxGjt4qP5BbDJCG88dJRa0nzD6IetY,186
|
|
21
|
+
libres/db/models/types/json_type.py,sha256=ko6K4YRWERWCpg0wYzuwJ_u-VLJ4K3j3ksJ7cGyiMzw,1137
|
|
22
|
+
libres/db/models/types/utcdatetime.py,sha256=4Wlk0Yc6e3PljOjngUGuYvo8jps76RYVkCEwmPygzsY,1285
|
|
23
|
+
libres/db/models/types/uuid_type.py,sha256=sesgyF65JV0Zh2ty7rSeALpZxKjVg1Y68_Pv7gJAuAo,1675
|
|
24
|
+
libres/modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
|
+
libres/modules/errors.py,sha256=afcvKDfu7XYnGt6CfTG1gpmCaoMTPgtxwmTe2Cyz9qc,2146
|
|
26
|
+
libres/modules/events.py,sha256=-YHwFJKory8RSIRTths5LBn92sodEPkhARH_a1Xml3c,5299
|
|
27
|
+
libres/modules/rasterizer.py,sha256=-KYG03YkaPNnyohl_HrEJZqdHrhmGesbLgxxPahNTCc,3155
|
|
28
|
+
libres/modules/utils.py,sha256=W5Kuu9LhhUWZMKLAhw7DmQEuNYb9aXWpW_HXCn62lhU,1871
|
|
29
|
+
libres-0.9.0.dist-info/licenses/LICENSE,sha256=w1rojULT3naueSnr4r62MSQipL4VPtsfEcTFmSKpVuI,1069
|
|
30
|
+
libres-0.9.0.dist-info/METADATA,sha256=-nJfZgAP64skrmh5Xh3GwywW0Un7KznV_AbSq9CD6Xg,10048
|
|
31
|
+
libres-0.9.0.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
|
|
32
|
+
libres-0.9.0.dist-info/top_level.txt,sha256=Exs6AnhZc0UTcsD5Ylyx1P89j19hJ4Dy13jxQyZwi3k,7
|
|
33
|
+
libres-0.9.0.dist-info/RECORD,,
|
libres-0.7.3.dist-info/RECORD
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
libres/.gitignore,sha256=tyWYoDW7-zMdsfiJIVONRWJ5JmqJCTHzBOsi_rkIYZg,49
|
|
2
|
-
libres/__init__.py,sha256=gZ1PsCC77HhOe3BNP2M-JThC0Yx3p_2FMdmrke9n3VQ,207
|
|
3
|
-
libres/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
libres/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
-
libres/context/core.py,sha256=KHM0kEWtUx8OEBhkhjYMzgYQde5tO7VwvKMSvOWvd9U,7054
|
|
6
|
-
libres/context/exposure.py,sha256=vVh1RVwJ48vrAsJeZ6AqcWfJkzLc7Vl7otD66oPwziE,218
|
|
7
|
-
libres/context/registry.py,sha256=6FTPhgzpRcrP-gmpMXN7OvXLxA_Ep2kCXi7vwWfTroI,4765
|
|
8
|
-
libres/context/session.py,sha256=3aTj7Tt_xSSxCn3NqpLFnJkFfj6Eusovzx-JZLcz4FI,2476
|
|
9
|
-
libres/context/settings.py,sha256=JNMVWRdXfqdbxgiXp8nivBI49mF8J-Q5xi3Ui-_op-Q,1322
|
|
10
|
-
libres/db/__init__.py,sha256=FUqf3TZ5WGnOlOXXDfgfG8VBrzirfTR82eePQS53naU,95
|
|
11
|
-
libres/db/queries.py,sha256=V0L-QJlRkt30k6qHriwMkNGX2MU8idWreVPgsYiaZV0,10864
|
|
12
|
-
libres/db/scheduler.py,sha256=og5cDFvRNATMj-U9UGYZVj0aqxKtsWpm2ne_Ic0mj3I,64615
|
|
13
|
-
libres/db/models/__init__.py,sha256=OvQEL2iMk1GbeXyCz8rQGv0mBvzol2C3wRsDVa9zJWY,289
|
|
14
|
-
libres/db/models/allocation.py,sha256=UWwXVtb-b_9dyVVXZ_Bo0vqGIK0xbgxmvfBDl3uYQHs,28675
|
|
15
|
-
libres/db/models/base.py,sha256=UPY_Z6G4bNhkIur1d04gb4KfBrEk2ZpE0lY8bNJrhkg,81
|
|
16
|
-
libres/db/models/other.py,sha256=gvycShOdIRwHsmsozR3n5q-of4Za1zTQKX6uzlQkKJ8,725
|
|
17
|
-
libres/db/models/reservation.py,sha256=SEfa7CmtXwsTcbOYiEJS52Th97IQz-mG8evvwsTy7E8,5749
|
|
18
|
-
libres/db/models/reserved_slot.py,sha256=Nk-aBjQMzYa4qSwIP8w_YceJevJtsxTk426d6aGbtRQ,3072
|
|
19
|
-
libres/db/models/timestamp.py,sha256=h83UoMj3cqTTRJ8Il1CyQmcy_u3jVwZAi7kaq9FHLHE,1276
|
|
20
|
-
libres/db/models/types/__init__.py,sha256=ow_MhWerdHtOJkrBo8seQVmGj6mWAiZenfhnnn2esYs,150
|
|
21
|
-
libres/db/models/types/json_type.py,sha256=DTqJmdFWiw7Uf9EHYwQNnz3W7Ko-z85qLT2PQUgyiVU,1319
|
|
22
|
-
libres/db/models/types/utcdatetime.py,sha256=HwnvlMkNetcQ1RvPVxz0DlDGTtlu3yGUWmNRl0_F7Jc,1275
|
|
23
|
-
libres/db/models/types/uuid_type.py,sha256=dfFhr0Oopa_1yvlOveAilO3i8bcMVeQeApzkFOew_iM,1657
|
|
24
|
-
libres/modules/__init__.py,sha256=EMO12mDduWvrpX076WucCy6-2C3D5X6nUfy8GpW2E7M,60
|
|
25
|
-
libres/modules/errors.py,sha256=0cRiCKHekaLj0_RVdt6H-VP7dSkI3TQTzjX8u7VUOrI,2120
|
|
26
|
-
libres/modules/events.py,sha256=n1RdSmCuhCccmeKk5dOoQ-1q75f-uJh9dIcY2h33cIg,5283
|
|
27
|
-
libres/modules/rasterizer.py,sha256=9Bvp4uSCOtAW8XIfPukjwnTaine1iyFQAHH3uXZiHVo,3006
|
|
28
|
-
libres/modules/utils.py,sha256=Xy_U6074hEY_EwVGJyFqYWI4zL2Mv0-JS5bGW7S7s0M,1793
|
|
29
|
-
libres-0.7.3.dist-info/LICENSE,sha256=w1rojULT3naueSnr4r62MSQipL4VPtsfEcTFmSKpVuI,1069
|
|
30
|
-
libres-0.7.3.dist-info/METADATA,sha256=ek0WQ0MaY_WvOf0u3UUtOKn2GUuplGkZ-RDfp30JIPk,9202
|
|
31
|
-
libres-0.7.3.dist-info/WHEEL,sha256=Mdi9PDNwEZptOjTlUcAth7XJDFtKrHYaQMPulZeBCiQ,91
|
|
32
|
-
libres-0.7.3.dist-info/top_level.txt,sha256=Exs6AnhZc0UTcsD5Ylyx1P89j19hJ4Dy13jxQyZwi3k,7
|
|
33
|
-
libres-0.7.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|