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.
@@ -1 +0,0 @@
1
- # remove this file from .coveragerc if code is added below!
libres/modules/errors.py CHANGED
@@ -1,12 +1,14 @@
1
- import typing as _t
2
- if _t.TYPE_CHECKING:
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: '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: 'datetime',
102
- end: 'datetime',
103
- existing: 'Allocation'
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: _t.Union['Reservation', 'ReservedSlot', None]
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
- import typing as _t
24
- if _t.TYPE_CHECKING:
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, TypeAlias
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
- _dtrange: TypeAlias = _t.Tuple[datetime, datetime]
34
-
35
- class Event(_t.List[_t.Callable[_P, _t.Any]]):
36
- def __call__(self, *args: _P.args, **kwargs: _P.kwargs) -> None: ...
37
-
38
- _OnReservationsConfirmed: TypeAlias = Event[
39
- Context, _t.Sequence[Reservation], UUID
40
- ]
41
-
42
- # FIXME: This is unnecessarily complex, because we call
43
- # start_time and end_time on this callback by name
44
- # rather than positionally.
45
- class _OnReservationTimeChangedCallback(_t.Protocol):
46
- def __call__(
47
- self,
48
- __context: Context,
49
- __reservation: Reservation,
50
- old_time: _dtrange,
51
- new_time: _dtrange
52
- ) -> None: ...
53
-
54
- class _OnReservationTimeChanged(
55
- _t.List[_OnReservationTimeChangedCallback]
56
- ):
57
- def __call__(
58
- self,
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: 'Event[Context, _t.Sequence[Reservation]]' = Event()
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: '_OnReservationsConfirmed' = Event()
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: 'Event[Context, _t.Sequence[Reservation]]' = Event()
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: 'Event[Context, _t.Sequence[Reservation]]' = Event()
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: 'Event[Context, _t.Sequence[Reservation]]' = Event()
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
- on_reservation_time_changed: '_OnReservationTimeChanged'
162
- on_reservation_time_changed = Event() # type:ignore[assignment]
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:
@@ -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
- import typing as _t
34
- if _t.TYPE_CHECKING:
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 = _t.Literal[5, 10, 15, 30, 60]
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: _t.Tuple[Raster, ...] = (5, 10, 15, 30, 60)
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) -> 'TypeGuard[Raster]':
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
- ) -> _t.Tuple[datetime, datetime]:
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
- ) -> '_t.Iterator[_t.Tuple[datetime, datetime]]':
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 sedate
1
+ from __future__ import annotations
2
2
 
3
+ import sedate
3
4
  from collections.abc import Iterable
4
- from uuid import UUID, uuid5 as new_uuid_mirror
5
+ from uuid import UUID
6
+ from uuid import uuid5 as new_uuid_mirror
5
7
 
6
8
 
7
- import typing as _t
8
- if _t.TYPE_CHECKING:
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 = _t.TypeVar('_T')
14
- _NestedIterable: TypeAlias = _t.Iterable[
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) -> _t.List[UUID]:
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: '_NestedIterable[_T]') -> _t.Iterable['_T']:
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: '_NestedIterable[_T]') -> '_t.Iterator[_t.Tuple[_T, _T]]':
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: 'datetime',
50
- end: 'datetime',
51
- timezone: 'TzInfoOrName'
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
1
+ Metadata-Version: 2.4
2
2
  Name: libres
3
- Version: 0.7.3
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.8
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-bugbear; extra == "dev"
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
- Provides-Extra: test
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.8+
55
- and requires Postgresql 9.1+.
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 py27
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 pep8
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
- bump2version major|minor|patch
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (73.0.1)
2
+ Generator: setuptools (80.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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,,