python-omnilogic-local 0.14.6__tar.gz → 0.15.1__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/PKG-INFO +4 -11
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/api.py +43 -13
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/cli.py +0 -1
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/models/filter_diagnostics.py +1 -0
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/models/mspconfig.py +2 -2
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/models/telemetry.py +4 -6
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/models/util.py +6 -6
- python_omnilogic_local-0.14.6/pyomnilogic_local/types.py → python_omnilogic_local-0.15.1/pyomnilogic_local/omnitypes.py +6 -0
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/protocol.py +27 -7
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyproject.toml +23 -92
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/LICENSE +0 -0
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/README.md +0 -0
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/__init__.py +0 -0
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/exceptions.py +0 -0
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/models/__init__.py +0 -0
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/models/const.py +0 -0
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/models/leadmessage.py +0 -0
- {python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/util.py +1 -1
@@ -1,26 +1,19 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: python-omnilogic-local
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.15.1
|
4
4
|
Summary: A library for local control of Hayward OmniHub/OmniLogic pool controllers using their local API
|
5
|
-
Home-page: https://github.com/cryptk/python-omnilogic-local
|
6
5
|
License: Apache-2.0
|
7
|
-
Author:
|
8
|
-
Author-email: cryptk@users.noreply.github.com
|
9
|
-
Requires-Python: >=3.10,<
|
10
|
-
Classifier: Development Status :: 3 - Alpha
|
11
|
-
Classifier: Intended Audience :: Developers
|
6
|
+
Author: Chris Jowett
|
7
|
+
Author-email: 421501+cryptk@users.noreply.github.com
|
8
|
+
Requires-Python: >=3.10,<3.14
|
12
9
|
Classifier: License :: OSI Approved :: Apache Software License
|
13
|
-
Classifier: Natural Language :: English
|
14
|
-
Classifier: Operating System :: OS Independent
|
15
10
|
Classifier: Programming Language :: Python :: 3
|
16
11
|
Classifier: Programming Language :: Python :: 3.10
|
17
12
|
Classifier: Programming Language :: Python :: 3.11
|
18
13
|
Classifier: Programming Language :: Python :: 3.12
|
19
14
|
Classifier: Programming Language :: Python :: 3.13
|
20
|
-
Classifier: Topic :: Software Development :: Libraries
|
21
15
|
Requires-Dist: pydantic (>=1.10.17)
|
22
16
|
Requires-Dist: xmltodict (>=0.13.0,<0.14.0)
|
23
|
-
Project-URL: Repository, https://github.com/cryptk/python-omnilogic-local
|
24
17
|
Description-Content-Type: text/markdown
|
25
18
|
|
26
19
|
# Pyomnilogic Local
|
@@ -1,22 +1,23 @@
|
|
1
|
+
# pylint: disable=too-many-positional-arguments
|
1
2
|
from __future__ import annotations
|
2
3
|
|
3
4
|
import asyncio
|
4
5
|
import logging
|
5
|
-
from typing import Literal, overload
|
6
6
|
import xml.etree.ElementTree as ET
|
7
|
+
from typing import Literal, overload
|
7
8
|
|
8
9
|
from .models.filter_diagnostics import FilterDiagnostics
|
9
10
|
from .models.mspconfig import MSPConfig
|
10
11
|
from .models.telemetry import Telemetry
|
11
12
|
from .models.util import to_pydantic
|
12
|
-
from .
|
13
|
-
from .types import (
|
13
|
+
from .omnitypes import (
|
14
14
|
ColorLogicBrightness,
|
15
15
|
ColorLogicShow,
|
16
16
|
ColorLogicSpeed,
|
17
17
|
HeaterMode,
|
18
18
|
MessageType,
|
19
19
|
)
|
20
|
+
from .protocol import OmniLogicProtocol
|
20
21
|
|
21
22
|
_LOGGER = logging.getLogger(__name__)
|
22
23
|
|
@@ -30,12 +31,10 @@ class OmniLogicAPI:
|
|
30
31
|
self._protocol_factory = OmniLogicProtocol
|
31
32
|
|
32
33
|
@overload
|
33
|
-
async def async_send_message(self, message_type: MessageType, message: str | None, need_response: Literal[True]) -> str:
|
34
|
-
...
|
34
|
+
async def async_send_message(self, message_type: MessageType, message: str | None, need_response: Literal[True]) -> str: ...
|
35
35
|
|
36
36
|
@overload
|
37
|
-
async def async_send_message(self, message_type: MessageType, message: str | None, need_response: Literal[False]) -> None:
|
38
|
-
...
|
37
|
+
async def async_send_message(self, message_type: MessageType, message: str | None, need_response: Literal[False]) -> None: ...
|
39
38
|
|
40
39
|
async def async_send_message(self, message_type: MessageType, message: str | None, need_response: bool = False) -> str | None:
|
41
40
|
"""Send a message via the Hayward Omni UDP protocol along with properly handling timeouts and responses.
|
@@ -97,7 +96,11 @@ class OmniLogicAPI:
|
|
97
96
|
return await self.async_send_message(MessageType.REQUEST_CONFIGURATION, req_body, True)
|
98
97
|
|
99
98
|
@to_pydantic(pydantic_type=FilterDiagnostics)
|
100
|
-
async def async_get_filter_diagnostics(
|
99
|
+
async def async_get_filter_diagnostics(
|
100
|
+
self,
|
101
|
+
pool_id: int,
|
102
|
+
equipment_id: int,
|
103
|
+
) -> str:
|
101
104
|
"""Retrieve filter diagnostics from the Omni, optionally parse it into a pydantic model.
|
102
105
|
|
103
106
|
Args:
|
@@ -146,7 +149,13 @@ class OmniLogicAPI:
|
|
146
149
|
|
147
150
|
return await self.async_send_message(MessageType.GET_TELEMETRY, req_body, True)
|
148
151
|
|
149
|
-
async def async_set_heater(
|
152
|
+
async def async_set_heater(
|
153
|
+
self,
|
154
|
+
pool_id: int,
|
155
|
+
equipment_id: int,
|
156
|
+
temperature: int,
|
157
|
+
unit: str,
|
158
|
+
) -> None:
|
150
159
|
"""Set the temperature for a heater on the Omni
|
151
160
|
|
152
161
|
Args:
|
@@ -175,7 +184,13 @@ class OmniLogicAPI:
|
|
175
184
|
|
176
185
|
return await self.async_send_message(MessageType.SET_HEATER_COMMAND, req_body, False)
|
177
186
|
|
178
|
-
async def async_set_solar_heater(
|
187
|
+
async def async_set_solar_heater(
|
188
|
+
self,
|
189
|
+
pool_id: int,
|
190
|
+
equipment_id: int,
|
191
|
+
temperature: int,
|
192
|
+
unit: str,
|
193
|
+
) -> None:
|
179
194
|
"""Set the solar set point for a heater on the Omni.
|
180
195
|
|
181
196
|
Args:
|
@@ -204,7 +219,12 @@ class OmniLogicAPI:
|
|
204
219
|
|
205
220
|
return await self.async_send_message(MessageType.SET_SOLAR_SET_POINT_COMMAND, req_body, False)
|
206
221
|
|
207
|
-
async def async_set_heater_mode(
|
222
|
+
async def async_set_heater_mode(
|
223
|
+
self,
|
224
|
+
pool_id: int,
|
225
|
+
equipment_id: int,
|
226
|
+
mode: HeaterMode,
|
227
|
+
) -> None:
|
208
228
|
"""Set what mode (Heat/Cool/Auto) the heater should use.
|
209
229
|
|
210
230
|
Args:
|
@@ -232,7 +252,12 @@ class OmniLogicAPI:
|
|
232
252
|
|
233
253
|
return await self.async_send_message(MessageType.SET_HEATER_MODE_COMMAND, req_body, False)
|
234
254
|
|
235
|
-
async def async_set_heater_enable(
|
255
|
+
async def async_set_heater_enable(
|
256
|
+
self,
|
257
|
+
pool_id: int,
|
258
|
+
equipment_id: int,
|
259
|
+
enabled: int | bool,
|
260
|
+
) -> None:
|
236
261
|
"""async_set_heater_enable handles sending a SetHeaterEnable XML API call to the Hayward Omni pool controller
|
237
262
|
|
238
263
|
Args:
|
@@ -472,7 +497,12 @@ class OmniLogicAPI:
|
|
472
497
|
|
473
498
|
return await self.async_send_message(MessageType.SET_CHLOR_PARAMS, req_body, False)
|
474
499
|
|
475
|
-
async def async_set_chlorinator_superchlorinate(
|
500
|
+
async def async_set_chlorinator_superchlorinate(
|
501
|
+
self,
|
502
|
+
pool_id: int,
|
503
|
+
equipment_id: int,
|
504
|
+
enabled: int | bool,
|
505
|
+
) -> None:
|
476
506
|
body_element = ET.Element("Request", {"xmlns": "http://nextgen.hayward.com/api"})
|
477
507
|
|
478
508
|
name_element = ET.SubElement(body_element, "Name")
|
@@ -13,7 +13,7 @@ from pydantic.v1 import BaseModel, Field, ValidationError
|
|
13
13
|
from xmltodict import parse as xml_parse
|
14
14
|
|
15
15
|
from ..exceptions import OmniParsingException
|
16
|
-
from ..
|
16
|
+
from ..omnitypes import (
|
17
17
|
BodyOfWaterType,
|
18
18
|
ChlorinatorCellType,
|
19
19
|
ChlorinatorDispenserType,
|
@@ -219,7 +219,7 @@ class MSPBackyard(OmniBase):
|
|
219
219
|
colorlogic_light: list[MSPColorLogicLight] | None = Field(alias="ColorLogic-Light")
|
220
220
|
|
221
221
|
|
222
|
-
class MSPSchedule(OmniBase):
|
222
|
+
class MSPSchedule(OmniBase): # type: ignore[override]
|
223
223
|
omni_type: OmniType = OmniType.SCHEDULE
|
224
224
|
system_id: int = Field(alias="schedule-system-id")
|
225
225
|
bow_id: int = Field(alias="bow-system-id")
|
@@ -6,7 +6,7 @@ from pydantic.v1 import BaseModel, Field, ValidationError
|
|
6
6
|
from xmltodict import parse as xml_parse
|
7
7
|
|
8
8
|
from ..exceptions import OmniParsingException
|
9
|
-
from ..
|
9
|
+
from ..omnitypes import (
|
10
10
|
BackyardState,
|
11
11
|
ChlorinatorOperatingMode,
|
12
12
|
ColorLogicBrightness,
|
@@ -71,7 +71,7 @@ class TelemetryChlorinator(BaseModel):
|
|
71
71
|
sc_mode: int = Field(alias="@scMode")
|
72
72
|
operating_state: int = Field(alias="@operatingState")
|
73
73
|
timed_percent: int | None = Field(alias="@Timed-Percent")
|
74
|
-
operating_mode: ChlorinatorOperatingMode = Field(alias="@operatingMode")
|
74
|
+
operating_mode: ChlorinatorOperatingMode | int = Field(alias="@operatingMode")
|
75
75
|
enable: bool = Field(alias="@enable")
|
76
76
|
|
77
77
|
# Still need to do a bit more work to determine if a chlorinator is actively chlorinating
|
@@ -200,12 +200,10 @@ class Telemetry(BaseModel):
|
|
200
200
|
TypeVar("VT", SupportsInt, Any)
|
201
201
|
|
202
202
|
@overload
|
203
|
-
def xml_postprocessor(path: Any, key: Any, value: SupportsInt) -> tuple[Any, SupportsInt]:
|
204
|
-
...
|
203
|
+
def xml_postprocessor(path: Any, key: Any, value: SupportsInt) -> tuple[Any, SupportsInt]: ...
|
205
204
|
|
206
205
|
@overload
|
207
|
-
def xml_postprocessor(path: Any, key: Any, value: Any) -> tuple[Any, Any]:
|
208
|
-
...
|
206
|
+
def xml_postprocessor(path: Any, key: Any, value: Any) -> tuple[Any, Any]: ...
|
209
207
|
|
210
208
|
def xml_postprocessor(path: Any, key: Any, value: SupportsInt | Any) -> tuple[Any, SupportsInt | Any]:
|
211
209
|
"""Post process XML to attempt to convert values to int.
|
{python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/models/util.py
RENAMED
@@ -1,5 +1,5 @@
|
|
1
|
-
from collections.abc import Awaitable, Callable
|
2
1
|
import logging
|
2
|
+
from collections.abc import Awaitable, Callable
|
3
3
|
from typing import Any, Literal, TypeVar, cast, overload
|
4
4
|
|
5
5
|
from pydantic.v1.utils import GetterDict
|
@@ -24,17 +24,17 @@ F = TypeVar("F", bound=Callable[..., Awaitable[str]])
|
|
24
24
|
TPydanticTypes = Telemetry | MSPConfig | FilterDiagnostics
|
25
25
|
|
26
26
|
|
27
|
-
def to_pydantic(
|
27
|
+
def to_pydantic(
|
28
|
+
pydantic_type: type[TPydanticTypes],
|
29
|
+
) -> Callable[..., Any]:
|
28
30
|
def inner(func: F, *args: Any, **kwargs: Any) -> F:
|
29
31
|
"""Wrap an API function that returns XML and parse it into a Pydantic model"""
|
30
32
|
|
31
33
|
@overload
|
32
|
-
async def wrapper(*args: Any, raw: Literal[True], **kwargs: Any) -> str:
|
33
|
-
...
|
34
|
+
async def wrapper(*args: Any, raw: Literal[True], **kwargs: Any) -> str: ...
|
34
35
|
|
35
36
|
@overload
|
36
|
-
async def wrapper(*args: Any, raw: Literal[False], **kwargs: Any) -> TPydanticTypes:
|
37
|
-
...
|
37
|
+
async def wrapper(*args: Any, raw: Literal[False], **kwargs: Any) -> TPydanticTypes: ...
|
38
38
|
|
39
39
|
async def wrapper(*args: Any, raw: bool = False, **kwargs: Any) -> TPydanticTypes | str:
|
40
40
|
resp_body = await func(*args, **kwargs)
|
@@ -87,14 +87,19 @@ class BodyOfWaterType(str, PrettyEnum):
|
|
87
87
|
# Chlorinator status is a bitmask that we still need to figure out
|
88
88
|
# class ChlorinatorStatus(str,Enum):
|
89
89
|
# pass
|
90
|
+
|
91
|
+
|
92
|
+
# I have seen one pool that had an operatingMode of 3, I am not sure what that means, perhaps that is an OFF mode
|
90
93
|
class ChlorinatorOperatingMode(IntEnum):
|
91
94
|
DISABLED = 0
|
92
95
|
TIMED = 1
|
93
96
|
ORP = 2
|
97
|
+
OFF = 3
|
94
98
|
|
95
99
|
|
96
100
|
class ChlorinatorDispenserType(str, PrettyEnum):
|
97
101
|
SALT = "SALT_DISPENSING"
|
102
|
+
LIQUID = "LIQUID_DISPENSING"
|
98
103
|
|
99
104
|
|
100
105
|
class ChlorinatorCellType(PrettyEnum):
|
@@ -102,6 +107,7 @@ class ChlorinatorCellType(PrettyEnum):
|
|
102
107
|
T5 = "CELL_TYPE_T5"
|
103
108
|
T9 = "CELL_TYPE_T9"
|
104
109
|
T15 = "CELL_TYPE_T15"
|
110
|
+
LIQUID = "CELL_TYPE_LIQUID"
|
105
111
|
|
106
112
|
# There is probably an easier way to do this
|
107
113
|
def __int__(self) -> int:
|
{python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/protocol.py
RENAMED
@@ -3,15 +3,15 @@ import logging
|
|
3
3
|
import random
|
4
4
|
import struct
|
5
5
|
import time
|
6
|
-
from typing import Any, cast
|
7
6
|
import xml.etree.ElementTree as ET
|
8
7
|
import zlib
|
8
|
+
from typing import Any, cast
|
9
9
|
|
10
10
|
from typing_extensions import Self
|
11
11
|
|
12
12
|
from .exceptions import OmniTimeoutException
|
13
13
|
from .models.leadmessage import LeadMessage
|
14
|
-
from .
|
14
|
+
from .omnitypes import ClientType, MessageType
|
15
15
|
|
16
16
|
_LOGGER = logging.getLogger(__name__)
|
17
17
|
|
@@ -28,7 +28,13 @@ class OmniLogicMessage:
|
|
28
28
|
compressed: bool = False
|
29
29
|
reserved_2: int = 0
|
30
30
|
|
31
|
-
def __init__(
|
31
|
+
def __init__(
|
32
|
+
self,
|
33
|
+
msg_id: int,
|
34
|
+
msg_type: MessageType,
|
35
|
+
payload: str | None = None,
|
36
|
+
version: str = "1.19",
|
37
|
+
) -> None:
|
32
38
|
self.id = msg_id
|
33
39
|
self.type = msg_type
|
34
40
|
# If we are speaking the XML API, it seems like we need client_type 0, otherwise we need client_type 1
|
@@ -67,7 +73,7 @@ class OmniLogicMessage:
|
|
67
73
|
header = data[:24]
|
68
74
|
rdata: bytes = data[24:]
|
69
75
|
|
70
|
-
msg_id, tstamp, vers, msg_type, client_type, res1, compressed, res2 = struct.unpack(cls.header_format, header)
|
76
|
+
(msg_id, tstamp, vers, msg_type, client_type, res1, compressed, res2) = struct.unpack(cls.header_format, header)
|
71
77
|
message = cls(msg_id=msg_id, msg_type=MessageType(msg_type), version=vers.decode("utf-8"))
|
72
78
|
message.timestamp = tstamp
|
73
79
|
message.client_type = ClientType(int(client_type))
|
@@ -125,7 +131,11 @@ class OmniLogicProtocol(asyncio.DatagramProtocol):
|
|
125
131
|
# eventually time out waiting for it, that way we can deal with the dropped packets
|
126
132
|
message = await self.data_queue.get()
|
127
133
|
|
128
|
-
async def _ensure_sent(
|
134
|
+
async def _ensure_sent(
|
135
|
+
self,
|
136
|
+
message: OmniLogicMessage,
|
137
|
+
max_attempts: int = 5,
|
138
|
+
) -> None:
|
129
139
|
for attempt in range(0, max_attempts):
|
130
140
|
self.transport.sendto(bytes(message))
|
131
141
|
|
@@ -143,12 +153,22 @@ class OmniLogicProtocol(asyncio.DatagramProtocol):
|
|
143
153
|
else:
|
144
154
|
raise OmniTimeoutException("Failed to receive acknowledgement of command, max retries exceeded") from exc
|
145
155
|
|
146
|
-
async def send_and_receive(
|
156
|
+
async def send_and_receive(
|
157
|
+
self,
|
158
|
+
msg_type: MessageType,
|
159
|
+
payload: str | None,
|
160
|
+
msg_id: int | None = None,
|
161
|
+
) -> str:
|
147
162
|
await self.send_message(msg_type, payload, msg_id)
|
148
163
|
return await self._receive_file()
|
149
164
|
|
150
165
|
# Send a message that you do NOT need a response to
|
151
|
-
async def send_message(
|
166
|
+
async def send_message(
|
167
|
+
self,
|
168
|
+
msg_type: MessageType,
|
169
|
+
payload: str | None,
|
170
|
+
msg_id: int | None = None,
|
171
|
+
) -> None:
|
152
172
|
# If we aren't sending a specific msg_id, lets randomize it
|
153
173
|
if not msg_id:
|
154
174
|
msg_id = random.randrange(2**32)
|
@@ -1,43 +1,32 @@
|
|
1
|
-
[
|
1
|
+
[project]
|
2
2
|
name = "python-omnilogic-local"
|
3
|
-
version = "0.
|
3
|
+
version = "0.15.1"
|
4
4
|
description = "A library for local control of Hayward OmniHub/OmniLogic pool controllers using their local API"
|
5
|
-
authors = [
|
6
|
-
|
5
|
+
authors = [
|
6
|
+
{name = "Chris Jowett",email = "421501+cryptk@users.noreply.github.com"},
|
7
|
+
{name = "djtimca"},
|
8
|
+
{name = "garionphx"}
|
9
|
+
]
|
10
|
+
license = {text = "Apache-2.0"}
|
7
11
|
readme = "README.md"
|
8
|
-
|
9
|
-
|
10
|
-
"
|
11
|
-
"
|
12
|
-
"Natural Language :: English",
|
13
|
-
"Operating System :: OS Independent",
|
14
|
-
"Topic :: Software Development :: Libraries",
|
12
|
+
requires-python = ">=3.10,<3.14"
|
13
|
+
dependencies = [
|
14
|
+
"pydantic (>=1.10.17)",
|
15
|
+
"xmltodict (>=0.13.0,<0.14.0)"
|
15
16
|
]
|
16
|
-
packages = [{include = "pyomnilogic_local"}]
|
17
17
|
|
18
|
-
[tool.poetry
|
19
|
-
|
20
|
-
|
21
|
-
[tool.poetry.dependencies]
|
22
|
-
python = "^3.10"
|
23
|
-
pydantic = ">=1.10.17"
|
24
|
-
xmltodict = "^0.13.0"
|
18
|
+
[tool.poetry]
|
19
|
+
packages = [{include = "pyomnilogic_local"}]
|
25
20
|
|
26
21
|
[tool.poetry.group.dev.dependencies]
|
27
|
-
pre-commit = "^3.
|
28
|
-
mypy = "^1.
|
29
|
-
pylint = "^3.
|
30
|
-
|
31
|
-
pytest = "^7.3.1"
|
22
|
+
pre-commit = "^3.8.0"
|
23
|
+
mypy = "^1.14.0"
|
24
|
+
pylint = "^3.3.3"
|
25
|
+
pytest = "^7.4.4"
|
32
26
|
pytest-cov = "^4.1.0"
|
33
27
|
|
34
|
-
[tool.pytest.ini_options]
|
35
|
-
addopts = [
|
36
|
-
"--import-mode=importlib",
|
37
|
-
]
|
38
|
-
|
39
28
|
[build-system]
|
40
|
-
requires = ["poetry-core"]
|
29
|
+
requires = ["poetry-core>=2.0.0,<3.0.0"]
|
41
30
|
build-backend = "poetry.core.masonry.api"
|
42
31
|
|
43
32
|
[tool.black]
|
@@ -46,43 +35,15 @@ line-length=140
|
|
46
35
|
[tool.isort]
|
47
36
|
# https://github.com/PyCQA/isort/wiki/isort-Settings
|
48
37
|
profile = "black"
|
49
|
-
# will group `import x` and `from x import` of the same module.
|
50
|
-
force_sort_within_sections = true
|
51
|
-
known_first_party = [
|
52
|
-
"homeassistant",
|
53
|
-
"tests",
|
54
|
-
]
|
55
|
-
forced_separate = [
|
56
|
-
"tests",
|
57
|
-
]
|
58
|
-
combine_as_imports = true
|
59
38
|
|
60
39
|
[tool.mypy]
|
61
|
-
python_version = "3.
|
40
|
+
python_version = "3.13"
|
62
41
|
plugins = "pydantic.mypy"
|
63
42
|
follow_imports = "silent"
|
64
43
|
strict = true
|
65
44
|
ignore_missing_imports = true
|
66
45
|
disallow_subclassing_any = false
|
67
46
|
warn_return_any = false
|
68
|
-
# local_partial_types = true
|
69
|
-
# strict_equality = true
|
70
|
-
# no_implicit_optional = true
|
71
|
-
# warn_incomplete_stub = true
|
72
|
-
# warn_redundant_casts = true
|
73
|
-
# warn_unused_configs = true
|
74
|
-
# warn_unused_ignores = true
|
75
|
-
# enable_error_code = "ignore-without-code, redundant-self, truthy-iterable"
|
76
|
-
# disable_error_code = "annotation-unchecked"
|
77
|
-
# strict_concatenate = false
|
78
|
-
# check_untyped_defs = true
|
79
|
-
# disallow_incomplete_defs = true
|
80
|
-
# disallow_untyped_calls = true
|
81
|
-
# disallow_untyped_decorators = true
|
82
|
-
# disallow_untyped_defs = true
|
83
|
-
# warn_unreachable = true
|
84
|
-
# no_implicit_reexport = true
|
85
|
-
# disallow_any_generics = true
|
86
47
|
|
87
48
|
[tool.pydantic-mypy]
|
88
49
|
init_forbid_extra = true
|
@@ -91,7 +52,7 @@ warn_required_dynamic_aliases = true
|
|
91
52
|
warn_untyped_fields = true
|
92
53
|
|
93
54
|
[tool.pylint.MAIN]
|
94
|
-
py-version = "3.
|
55
|
+
py-version = "3.13"
|
95
56
|
ignore = [
|
96
57
|
"tests",
|
97
58
|
]
|
@@ -102,31 +63,6 @@ load-plugins = [
|
|
102
63
|
"pylint.extensions.code_style",
|
103
64
|
"pylint.extensions.typing",
|
104
65
|
]
|
105
|
-
persistent = false
|
106
|
-
extension-pkg-allow-list = [
|
107
|
-
"pydantic",
|
108
|
-
]
|
109
|
-
fail-on = [
|
110
|
-
"I",
|
111
|
-
]
|
112
|
-
|
113
|
-
[tool.pylint.BASIC]
|
114
|
-
class-const-naming-style = "any"
|
115
|
-
good-names = [
|
116
|
-
"_",
|
117
|
-
"ev",
|
118
|
-
"ex",
|
119
|
-
"fp",
|
120
|
-
"i",
|
121
|
-
"id",
|
122
|
-
"j",
|
123
|
-
"k",
|
124
|
-
"Run",
|
125
|
-
"ip",
|
126
|
-
]
|
127
|
-
|
128
|
-
[tool.pylint.CODE_STYLE]
|
129
|
-
max-line-length-suggestions = 72
|
130
66
|
|
131
67
|
[tool.pylint."FORMAT"]
|
132
68
|
expected-line-ending-format = "LF"
|
@@ -175,25 +111,20 @@ disable = [
|
|
175
111
|
"wrong-import-order",
|
176
112
|
"wrong-import-position",
|
177
113
|
"consider-using-f-string",
|
178
|
-
"consider-using-namedtuple-or-dataclass",
|
179
|
-
"consider-using-assignment-expr",
|
180
114
|
# The below are only here for now, we should fully document once the codebase stops fluctuating so much
|
181
115
|
"missing-class-docstring",
|
182
116
|
"missing-function-docstring",
|
183
117
|
"missing-module-docstring",
|
184
118
|
]
|
185
119
|
enable = [
|
186
|
-
"useless-suppression",
|
120
|
+
"useless-suppression",
|
187
121
|
"use-symbolic-message-instead",
|
188
122
|
]
|
189
123
|
|
190
|
-
[tool.pylint.REPORTS]
|
191
|
-
score = false
|
192
|
-
|
193
124
|
[tool.ruff]
|
194
125
|
line-length = 140
|
195
126
|
|
196
127
|
[tool.semantic_release]
|
197
128
|
branch = "main"
|
198
|
-
version_toml = "pyproject.toml:
|
129
|
+
version_toml = "pyproject.toml:project.version"
|
199
130
|
build_command = "pip install poetry && poetry build"
|
File without changes
|
File without changes
|
{python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/__init__.py
RENAMED
File without changes
|
{python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/exceptions.py
RENAMED
File without changes
|
{python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/models/__init__.py
RENAMED
File without changes
|
{python_omnilogic_local-0.14.6 → python_omnilogic_local-0.15.1}/pyomnilogic_local/models/const.py
RENAMED
File without changes
|
File without changes
|