boneIO 0.9.0.dev3__tar.gz → 0.9.0.dev4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/PKG-INFO +1 -1
  2. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/config.py +8 -2
  3. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/yaml_util.py +36 -3
  4. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/sensor.py +1 -1
  5. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/runner.py +3 -1
  6. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/schema/schema.yaml +5 -2
  7. boneIO-0.9.0.dev4/boneio/version.py +2 -0
  8. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/webui/app.py +13 -1
  9. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/webui/web_server.py +4 -1
  10. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/pyproject.toml +1 -1
  11. boneIO-0.9.0.dev3/boneio/version.py +0 -2
  12. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/LICENSE +0 -0
  13. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/README.md +0 -0
  14. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/__init__.py +0 -0
  15. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/boards/0.7/output_32_10.yaml +0 -0
  16. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/boards/0.8/input.yaml +0 -0
  17. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/boards/0.8/output_32_10.yaml +0 -0
  18. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/bonecli.py +0 -0
  19. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/const.py +0 -0
  20. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/cover.py +0 -0
  21. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/example_config/__init__.py +0 -0
  22. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/example_config/adc.yaml +0 -0
  23. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/example_config/binary_sensor.yaml +0 -0
  24. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/example_config/binary_sensor_v_0_7.yaml +0 -0
  25. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/example_config/config.yaml +0 -0
  26. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/example_config/cover.yaml +0 -0
  27. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/example_config/event.yaml +0 -0
  28. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/example_config/event_all.yaml +0 -0
  29. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/example_config/event_v_0_7.yaml +0 -0
  30. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/example_config/led32x4A.yaml +0 -0
  31. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/example_config/output24x16A.yaml +0 -0
  32. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/example_config/output24x16A_v0.3.yaml +0 -0
  33. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/example_config/output32x10A.yaml +0 -0
  34. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/example_config/output32x5A.yaml +0 -0
  35. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/fonts/danube__.ttf +0 -0
  36. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/group/__init__.py +0 -0
  37. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/group/output.py +0 -0
  38. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/__init__.py +0 -0
  39. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/async_updater.py +0 -0
  40. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/click_timer.py +0 -0
  41. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/events.py +0 -0
  42. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/exceptions.py +0 -0
  43. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/filter.py +0 -0
  44. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/gpio.py +0 -0
  45. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/gpiod.py +0 -0
  46. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/ha_discovery.py +0 -0
  47. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/loader.py +0 -0
  48. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/logger.py +0 -0
  49. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/message_bus.py +0 -0
  50. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/mqtt.py +0 -0
  51. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/oled.py +0 -0
  52. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/onewire/W1ThermSensor.py +0 -0
  53. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/onewire/__init__.py +0 -0
  54. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/onewire/ds2482.py +0 -0
  55. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/onewire/onewire.py +0 -0
  56. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/pcf8575.py +0 -0
  57. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/queue.py +0 -0
  58. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/sensor/ina_219_smbus.py +0 -0
  59. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/state_manager.py +0 -0
  60. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/stats.py +0 -0
  61. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/timeperiod.py +0 -0
  62. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/helper/util.py +0 -0
  63. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/input/__init__.py +0 -0
  64. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/input/gpio.py +0 -0
  65. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/input/gpio_new.py +0 -0
  66. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/manager.py +0 -0
  67. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/__init__.py +0 -0
  68. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/client.py +0 -0
  69. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/cwt.json +0 -0
  70. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/dts1964_3f.json +0 -0
  71. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/liquid-sensor.json +0 -0
  72. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/modbuscli.py +0 -0
  73. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/orno-or-we-517.json +0 -0
  74. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/pt100.json +0 -0
  75. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/r4dcb08.json +0 -0
  76. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/sdm120.json +0 -0
  77. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/sdm630.json +0 -0
  78. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/sht20.json +0 -0
  79. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/sht30.json +0 -0
  80. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/single_sensor.py +0 -0
  81. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/socomec_e03.json +0 -0
  82. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/socomec_e23.json +0 -0
  83. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/sofar.json +0 -0
  84. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/modbus/utils.py +0 -0
  85. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/models/__init__.py +0 -0
  86. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/models/files.py +0 -0
  87. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/models/logs.py +0 -0
  88. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/mqtt_client.py +0 -0
  89. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/oled.py +0 -0
  90. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/relay/__init__.py +0 -0
  91. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/relay/basic.py +0 -0
  92. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/relay/gpio.py +0 -0
  93. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/relay/mcp.py +0 -0
  94. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/relay/pca.py +0 -0
  95. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/relay/pcf.py +0 -0
  96. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/schema/actions.yaml +0 -0
  97. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/schema/actions_sensor.yaml +0 -0
  98. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/schema/actions_switch.yaml +0 -0
  99. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/schema/filters.yaml +0 -0
  100. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/schema/filters_adc.yaml +0 -0
  101. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/schema/id.yaml +0 -0
  102. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/schema/temp_unit.yaml +0 -0
  103. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/schema/update_interval.yaml +0 -0
  104. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/sensor/__init__.py +0 -0
  105. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/sensor/adc.py +0 -0
  106. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/sensor/gpio.py +0 -0
  107. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/sensor/gpio_new.py +0 -0
  108. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/sensor/ina219.py +0 -0
  109. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/sensor/temp/__init__.py +0 -0
  110. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/sensor/temp/dallas.py +0 -0
  111. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/sensor/temp/lm75.py +0 -0
  112. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/sensor/temp/mcp9808.py +0 -0
  113. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/boneio/webui/websocket_manager.py +0 -0
  114. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/tests/32_5_config.yaml +0 -0
  115. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/tests/bandit.yaml +0 -0
  116. {boneIO-0.9.0.dev3 → boneIO-0.9.0.dev4}/tests/relay_32_5.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: boneIO
3
- Version: 0.9.0.dev3
3
+ Version: 0.9.0.dev4
4
4
  Summary: Python App for BoneIO
5
5
  License: GNU General Public License v3.0
6
6
  Author-email: Paweł Szafer <pszafer@gmail.com>
@@ -22,11 +22,13 @@ from boneio.const import (
22
22
  class ConfigHelper:
23
23
  def __init__(
24
24
  self,
25
- topic_prefix: str = BONEIO,
25
+ topic_prefix: str,
26
+ name: str = BONEIO,
26
27
  ha_discovery: bool = True,
27
28
  ha_discovery_prefix: str = HOMEASSISTANT,
28
29
  ):
29
- self._topic_prefix = topic_prefix
30
+ self._name = name
31
+ self._topic_prefix = topic_prefix if topic_prefix else name
30
32
  self._ha_discovery = ha_discovery
31
33
  self._ha_discovery_prefix = ha_discovery_prefix
32
34
  self._fetch_old_discovery = None
@@ -45,6 +47,10 @@ class ConfigHelper:
45
47
  def topic_prefix(self) -> str:
46
48
  return self._topic_prefix
47
49
 
50
+ @property
51
+ def name(self) -> str:
52
+ return self._name
53
+
48
54
  @property
49
55
  def ha_discovery(self) -> bool:
50
56
  return self._ha_discovery
@@ -180,16 +180,49 @@ def get_board_config_path(board_name: str, version: str) -> str:
180
180
  )
181
181
 
182
182
 
183
+ def normalize_board_name(name: str) -> str:
184
+ """Normalize board name to a standard format.
185
+
186
+ Examples:
187
+ 32x10a, 32x10A, 32 -> 32_10
188
+ cover -> cover
189
+ cover mix, cm -> cover_mix
190
+ 24x16A, 24x16, 24 -> 24_16
191
+ """
192
+ if not name:
193
+ return name
194
+
195
+ name = name.lower().strip()
196
+
197
+ # Handle cover mix variations
198
+ if name in ('cm', 'cover mix', 'covermix', "cover_mix"):
199
+ return 'cover_mix'
200
+
201
+ # Handle simple cover case
202
+ if name == 'cover':
203
+ return 'cover'
204
+
205
+ # Handle 32x10A variations
206
+ if name.startswith('32'):
207
+ return '32_10'
208
+
209
+ # Handle 24x16A variations
210
+ if name.startswith('24'):
211
+ return '24_16'
212
+
213
+ return name
214
+
215
+
183
216
  def merge_board_config(config: dict) -> dict:
184
217
  """Merge predefined board configuration with user config."""
185
- if not config.get("boneio", {}).get("relay_board"):
218
+ if not config.get("boneio", {}).get("device_type"):
186
219
  return config
187
220
 
188
- board_name = config["boneio"]["relay_board"]
221
+ board_name = normalize_board_name(config["boneio"]["device_type"])
189
222
  version = config["boneio"]["version"]
190
223
 
191
224
  try:
192
- board_file = get_board_config_path(board_name, version)
225
+ board_file = get_board_config_path(f"output_{board_name}", version)
193
226
  input_file = get_board_config_path("input", version)
194
227
  board_config = load_yaml_file(board_file)
195
228
  input_config = load_yaml_file(input_file)
@@ -243,7 +243,7 @@ class ModbusSensor(BasicMqtt, AsyncUpdater, Filter):
243
243
  id=sensor.id,
244
244
  name=sensor.name,
245
245
  state=sensor.state,
246
- unit_of_measurement=sensor.unit_of_measurement,
246
+ unit=sensor.unit_of_measurement,
247
247
  timestamp=sensor.last_timestamp,
248
248
  ),
249
249
  )
@@ -83,7 +83,8 @@ async def async_run(
83
83
 
84
84
  main_config = config.get(BONEIO, {})
85
85
  _config_helper = ConfigHelper(
86
- topic_prefix=config.get(MQTT, {}).get(TOPIC_PREFIX, main_config.get(NAME, BONEIO)),
86
+ name=main_config.get(NAME, BONEIO),
87
+ topic_prefix=config.get(MQTT, {}).get(TOPIC_PREFIX, None),
87
88
  ha_discovery=config.get(MQTT, {}).get(HA_DISCOVERY, {}).get(ENABLED, False),
88
89
  ha_discovery_prefix=config.get(MQTT, {}).get(HA_DISCOVERY, {}).get(TOPIC_PREFIX, "homeassistant"),
89
90
  )
@@ -146,6 +147,7 @@ async def async_run(
146
147
  _LOGGER.info("Starting Web server.")
147
148
  web_server = WebServer(
148
149
  config_file=config_file,
150
+ config_helper=_config_helper,
149
151
  manager=manager,
150
152
  port=web_config.get("port", 8090),
151
153
  auth=web_config.get("auth", {}),
@@ -906,8 +906,11 @@ boneio:
906
906
  required: False
907
907
  meta:
908
908
  label: BoneIO Black Hardware version
909
- relay_board:
909
+ device_type:
910
910
  type: string
911
911
  required: False
912
+ coerce:
913
+ - str
914
+ - lower
912
915
  meta:
913
- label: Predefined relay board configuration
916
+ label: Predefined device type configuration
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "0.9.0dev4"
@@ -31,6 +31,7 @@ from starlette.responses import JSONResponse
31
31
  from starlette.types import Receive, Scope, Send
32
32
  from starlette.websockets import WebSocketState
33
33
 
34
+ from boneio.helper.config import ConfigHelper
34
35
  from boneio.helper.events import GracefulExit
35
36
  from boneio.manager import Manager
36
37
  from boneio.models import (
@@ -121,6 +122,10 @@ def get_manager():
121
122
  """Get manager instance."""
122
123
  return app.state.manager
123
124
 
125
+ def get_config_helper():
126
+ """Get config helper instance."""
127
+ return app.state.config_helper
128
+
124
129
 
125
130
  # Add auth required endpoint
126
131
  @app.get("/api/auth/required")
@@ -457,7 +462,7 @@ async def toggle_output(output_id: str, manager: Manager = Depends(get_manager))
457
462
 
458
463
 
459
464
  @app.post("/api/restart")
460
- async def restart_service(background_tasks: BackgroundTasks, manager: Manager = Depends(get_manager)):
465
+ async def restart_service(background_tasks: BackgroundTasks):
461
466
  """Restart the BoneIO service."""
462
467
  if not is_running_as_service():
463
468
  return {"status": "not available"}
@@ -477,6 +482,11 @@ async def get_version():
477
482
  """Get application version."""
478
483
  return {"version": __version__}
479
484
 
485
+ @app.get("/api/name")
486
+ async def get_name(config_helper: ConfigHelper = Depends(get_config_helper)):
487
+ """Get application version."""
488
+ return {"name": config_helper.name}
489
+
480
490
 
481
491
  @app.get("/api/files")
482
492
  async def list_files(path: str = None):
@@ -594,6 +604,7 @@ async def modbus_sensor_state_changed(event: SensorState):
594
604
  def init_app(
595
605
  manager: Manager,
596
606
  yaml_config_file: str,
607
+ config_helper: ConfigHelper,
597
608
  auth_config: dict = {},
598
609
  jwt_secret: str = None,
599
610
  web_server = None,
@@ -611,6 +622,7 @@ def init_app(
611
622
  app.state.auth_config = auth_config
612
623
  app.state.yaml_config_file = yaml_config_file
613
624
  app.state.web_server = web_server
625
+ app.state.config_helper = config_helper
614
626
  app.state.websocket_manager = WebSocketManager(
615
627
  jwt_secret=jwt_secret,
616
628
  auth_required=bool(auth_config)
@@ -9,15 +9,17 @@ from pathlib import Path
9
9
  from hypercorn.asyncio import serve
10
10
  from hypercorn.config import Config
11
11
 
12
+ from boneio.helper.config import ConfigHelper
12
13
  from boneio.manager import Manager
13
14
  from boneio.webui.app import BoneIOApp, init_app
14
15
 
15
16
  _LOGGER = logging.getLogger(__name__)
16
17
 
17
18
  class WebServer:
18
- def __init__(self, config_file: str, manager: Manager, port: int = 8080, auth: dict = {}, logger: dict = {}, debug_level: int = 0) -> None:
19
+ def __init__(self, config_file: str, config_helper: ConfigHelper, manager: Manager, port: int = 8080, auth: dict = {}, logger: dict = {}, debug_level: int = 0) -> None:
19
20
  """Initialize the web server."""
20
21
  self.config_file = config_file
22
+ self.config_helper = config_helper
21
23
  self.manager = manager
22
24
  self._shutdown_event = asyncio.Event()
23
25
 
@@ -34,6 +36,7 @@ class WebServer:
34
36
  yaml_config_file=self._yaml_config_file,
35
37
  auth_config=auth,
36
38
  jwt_secret=self.jwt_secret,
39
+ config_helper=self.config_helper,
37
40
  web_server=self
38
41
  )
39
42
 
@@ -34,7 +34,7 @@ dependencies = [
34
34
  "python-jose[cryptography]==3.3.0",
35
35
  ]
36
36
  requires-python = ">=3.7"
37
- version = "0.9.0.dev3"
37
+ version = "0.9.0.dev4"
38
38
 
39
39
  [project.license]
40
40
  text = "GNU General Public License v3.0"
@@ -1,2 +0,0 @@
1
- # flake8: noqa
2
- __version__ = "0.9.0dev3"
File without changes
File without changes
File without changes
File without changes
File without changes