lifx-emulator 2.4.0__py3-none-any.whl → 3.0.1__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 (68) hide show
  1. lifx_emulator-3.0.1.dist-info/METADATA +102 -0
  2. lifx_emulator-3.0.1.dist-info/RECORD +18 -0
  3. lifx_emulator-3.0.1.dist-info/entry_points.txt +2 -0
  4. lifx_emulator_app/__init__.py +10 -0
  5. {lifx_emulator → lifx_emulator_app}/__main__.py +2 -3
  6. {lifx_emulator → lifx_emulator_app}/api/__init__.py +1 -1
  7. {lifx_emulator → lifx_emulator_app}/api/app.py +3 -3
  8. {lifx_emulator → lifx_emulator_app}/api/mappers/__init__.py +1 -1
  9. {lifx_emulator → lifx_emulator_app}/api/mappers/device_mapper.py +1 -1
  10. {lifx_emulator → lifx_emulator_app}/api/models.py +1 -2
  11. lifx_emulator_app/api/routers/__init__.py +11 -0
  12. {lifx_emulator → lifx_emulator_app}/api/routers/devices.py +2 -2
  13. {lifx_emulator → lifx_emulator_app}/api/routers/monitoring.py +1 -1
  14. {lifx_emulator → lifx_emulator_app}/api/routers/scenarios.py +1 -1
  15. lifx_emulator_app/api/services/__init__.py +8 -0
  16. {lifx_emulator → lifx_emulator_app}/api/services/device_service.py +3 -2
  17. lifx_emulator/__init__.py +0 -31
  18. lifx_emulator/api/routers/__init__.py +0 -11
  19. lifx_emulator/api/services/__init__.py +0 -8
  20. lifx_emulator/constants.py +0 -33
  21. lifx_emulator/devices/__init__.py +0 -37
  22. lifx_emulator/devices/device.py +0 -395
  23. lifx_emulator/devices/manager.py +0 -256
  24. lifx_emulator/devices/observers.py +0 -139
  25. lifx_emulator/devices/persistence.py +0 -308
  26. lifx_emulator/devices/state_restorer.py +0 -259
  27. lifx_emulator/devices/state_serializer.py +0 -157
  28. lifx_emulator/devices/states.py +0 -381
  29. lifx_emulator/factories/__init__.py +0 -39
  30. lifx_emulator/factories/builder.py +0 -375
  31. lifx_emulator/factories/default_config.py +0 -158
  32. lifx_emulator/factories/factory.py +0 -252
  33. lifx_emulator/factories/firmware_config.py +0 -77
  34. lifx_emulator/factories/serial_generator.py +0 -82
  35. lifx_emulator/handlers/__init__.py +0 -39
  36. lifx_emulator/handlers/base.py +0 -49
  37. lifx_emulator/handlers/device_handlers.py +0 -322
  38. lifx_emulator/handlers/light_handlers.py +0 -503
  39. lifx_emulator/handlers/multizone_handlers.py +0 -249
  40. lifx_emulator/handlers/registry.py +0 -110
  41. lifx_emulator/handlers/tile_handlers.py +0 -488
  42. lifx_emulator/products/__init__.py +0 -28
  43. lifx_emulator/products/generator.py +0 -1079
  44. lifx_emulator/products/registry.py +0 -1530
  45. lifx_emulator/products/specs.py +0 -284
  46. lifx_emulator/products/specs.yml +0 -386
  47. lifx_emulator/protocol/__init__.py +0 -1
  48. lifx_emulator/protocol/base.py +0 -446
  49. lifx_emulator/protocol/const.py +0 -8
  50. lifx_emulator/protocol/generator.py +0 -1384
  51. lifx_emulator/protocol/header.py +0 -159
  52. lifx_emulator/protocol/packets.py +0 -1351
  53. lifx_emulator/protocol/protocol_types.py +0 -817
  54. lifx_emulator/protocol/serializer.py +0 -379
  55. lifx_emulator/repositories/__init__.py +0 -22
  56. lifx_emulator/repositories/device_repository.py +0 -155
  57. lifx_emulator/repositories/storage_backend.py +0 -107
  58. lifx_emulator/scenarios/__init__.py +0 -22
  59. lifx_emulator/scenarios/manager.py +0 -322
  60. lifx_emulator/scenarios/models.py +0 -112
  61. lifx_emulator/scenarios/persistence.py +0 -241
  62. lifx_emulator/server.py +0 -464
  63. lifx_emulator-2.4.0.dist-info/METADATA +0 -107
  64. lifx_emulator-2.4.0.dist-info/RECORD +0 -62
  65. lifx_emulator-2.4.0.dist-info/entry_points.txt +0 -2
  66. lifx_emulator-2.4.0.dist-info/licenses/LICENSE +0 -35
  67. {lifx_emulator-2.4.0.dist-info → lifx_emulator-3.0.1.dist-info}/WHEEL +0 -0
  68. {lifx_emulator → lifx_emulator_app}/api/templates/dashboard.html +0 -0
@@ -0,0 +1,102 @@
1
+ Metadata-Version: 2.4
2
+ Name: lifx-emulator
3
+ Version: 3.0.1
4
+ Summary: Standalone LIFX Emulator with CLI and HTTP management API
5
+ Author-email: Avi Miller <me@dje.li>
6
+ Maintainer-email: Avi Miller <me@dje.li>
7
+ License-Expression: UPL-1.0
8
+ Classifier: Environment :: Console
9
+ Classifier: Framework :: AsyncIO
10
+ Classifier: Framework :: FastAPI
11
+ Classifier: Framework :: Pytest
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Natural Language :: English
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
19
+ Classifier: Topic :: Software Development :: Testing
20
+ Classifier: Typing :: Typed
21
+ Requires-Python: >=3.11
22
+ Requires-Dist: cyclopts>=4.2.0
23
+ Requires-Dist: fastapi>=0.115.0
24
+ Requires-Dist: lifx-emulator-core>=2.4.0
25
+ Requires-Dist: rich>=14.2.0
26
+ Requires-Dist: uvicorn>=0.34.0
27
+ Description-Content-Type: text/markdown
28
+
29
+ # lifx-emulator
30
+
31
+ Standalone LIFX device emulator with CLI and HTTP management API.
32
+
33
+ This package provides a ready-to-run emulator for testing LIFX LAN protocol libraries. It includes a command-line interface and an optional HTTP API for runtime device management.
34
+
35
+ ## Installation
36
+
37
+ ```bash
38
+ pip install lifx-emulator
39
+ ```
40
+
41
+ ## Quick Start
42
+
43
+ ```bash
44
+ # Start with default configuration (1 color light)
45
+ lifx-emulator
46
+
47
+ # Create multiple device types
48
+ lifx-emulator --color 2 --multizone 1 --tile 1
49
+
50
+ # Enable HTTP management API
51
+ lifx-emulator --api
52
+
53
+ # List available LIFX products
54
+ lifx-emulator list-products
55
+
56
+ # Create devices by product ID
57
+ lifx-emulator --product 27 --product 38 --product 55
58
+ ```
59
+
60
+ ## Features
61
+
62
+ - Command-line interface for quick emulator setup
63
+ - HTTP management API with web dashboard
64
+ - Real-time device monitoring and management
65
+ - Support for all LIFX device types (color, multizone, tile, infrared, HEV, switch)
66
+ - Persistent device state across restarts
67
+ - Testing scenarios for protocol edge cases
68
+
69
+ ## HTTP Management API
70
+
71
+ Enable with `--api` to get:
72
+
73
+ - **Web Dashboard**: `http://localhost:8080` - Real-time monitoring UI
74
+ - **REST API**: Device management, statistics, and scenario control
75
+ - **OpenAPI Docs**: `http://localhost:8080/docs` - Interactive API documentation
76
+
77
+ ```bash
78
+ # Start with API server
79
+ lifx-emulator --color 2 --api --api-port 9090
80
+
81
+ # Add a device via API
82
+ curl -X POST http://localhost:9090/api/devices \
83
+ -H "Content-Type: application/json" \
84
+ -d '{"product_id": 27}'
85
+ ```
86
+
87
+ ## Documentation
88
+
89
+ Full documentation is available at: **https://djelibeybi.github.io/lifx-emulator**
90
+
91
+ - [Installation Guide](https://djelibeybi.github.io/lifx-emulator/getting-started/installation/)
92
+ - [CLI Reference](https://djelibeybi.github.io/lifx-emulator/cli/cli-reference/)
93
+ - [Web Interface](https://djelibeybi.github.io/lifx-emulator/cli/web-interface/)
94
+ - [REST API](https://djelibeybi.github.io/lifx-emulator/cli/device-management-api/)
95
+
96
+ ## Related Packages
97
+
98
+ - **[lifx-emulator-core](https://pypi.org/project/lifx-emulator-core/)**: Core library for embedding the emulator in your own projects
99
+
100
+ ## License
101
+
102
+ [UPL-1.0](https://opensource.org/licenses/UPL)
@@ -0,0 +1,18 @@
1
+ lifx_emulator_app/__init__.py,sha256=AJahGiWKb8U8yLQbJX21takbf-SoxDxMOGxjJeM7M5c,222
2
+ lifx_emulator_app/__main__.py,sha256=f_VwgZfwOdp3zQshv8JQqBX7gocE9ATZbZ3wQndlBvo,22060
3
+ lifx_emulator_app/api/__init__.py,sha256=bpdhugx7PAop5IQhkKnWE-a1hfI9gJoJiNRG2CCWe5A,651
4
+ lifx_emulator_app/api/app.py,sha256=_bltPTPyw9mmPVAPHm9sJytzsovq5bgE8-CDRulnWYQ,4892
5
+ lifx_emulator_app/api/models.py,sha256=fiX9hDmR1C12tzet-kGPmbaG_qiZfiprgy-uxwIcEsE,3970
6
+ lifx_emulator_app/api/mappers/__init__.py,sha256=-lGAg-s16eTMl2_D-3bPu-EMqD2kaPzXHqSrKCnmW2w,156
7
+ lifx_emulator_app/api/mappers/device_mapper.py,sha256=WAo-_PJ2kX3J4GUW_Sjoype1d_uaIh-PtXPfMUAujUY,4155
8
+ lifx_emulator_app/api/routers/__init__.py,sha256=TKPypociZ_uo2YCyW5zIeUfalUh_PkzCVt31MHg9ZPc,381
9
+ lifx_emulator_app/api/routers/devices.py,sha256=5_0Id09Z6yOB3s-uAEAU4oNribV49IitC0-_Bmx3bCk,4218
10
+ lifx_emulator_app/api/routers/monitoring.py,sha256=i82_s61caYd9UvMb4MqWPLP7LuFh5KN8Qkw4_dZr3O0,1460
11
+ lifx_emulator_app/api/routers/scenarios.py,sha256=pWXTliY9MIk-DCxDOZ1cjeAFgHn79ExvY-6lj-yHPWk,9747
12
+ lifx_emulator_app/api/services/__init__.py,sha256=cdKZItYE-KkMX44V9xJW_PHHnJoAw5I7Uw1a1YKHgMI,285
13
+ lifx_emulator_app/api/services/device_service.py,sha256=A2rCuZ1aAJ1tThKM6BYorKAjlaDgDaFCT5C9KUHfAvc,6303
14
+ lifx_emulator_app/api/templates/dashboard.html,sha256=h-PeOH_La5bVOUBcXmTY2leRlMdL8D8yJ-NCx3S16-A,33792
15
+ lifx_emulator-3.0.1.dist-info/METADATA,sha256=SHfU2nVUc6ihUB8AYOjmMUG0YhVmJkzZILVKFeDMED8,3174
16
+ lifx_emulator-3.0.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
17
+ lifx_emulator-3.0.1.dist-info/entry_points.txt,sha256=tNZHeJTPUXNxu_nuk99ArXLKgwYLhIVVxN7YiaiXBOA,66
18
+ lifx_emulator-3.0.1.dist-info/RECORD,,
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ lifx-emulator = lifx_emulator_app.__main__:main
@@ -0,0 +1,10 @@
1
+ """LIFX Emulator Application
2
+
3
+ Standalone CLI and HTTP management API for the LIFX Emulator.
4
+ """
5
+
6
+ from importlib.metadata import version as get_version
7
+
8
+ __version__ = get_version("lifx-emulator")
9
+
10
+ __all__ = ["__version__"]
@@ -6,8 +6,6 @@ import signal
6
6
  from typing import Annotated
7
7
 
8
8
  import cyclopts
9
- from rich.logging import RichHandler
10
-
11
9
  from lifx_emulator.constants import LIFX_UDP_PORT
12
10
  from lifx_emulator.devices import (
13
11
  DEFAULT_STORAGE_DIR,
@@ -28,6 +26,7 @@ from lifx_emulator.products.registry import get_registry
28
26
  from lifx_emulator.repositories import DeviceRepository
29
27
  from lifx_emulator.scenarios import ScenarioPersistenceAsyncFile
30
28
  from lifx_emulator.server import EmulatedLifxServer
29
+ from rich.logging import RichHandler
31
30
 
32
31
  app = cyclopts.App(
33
32
  name="lifx-emulator",
@@ -529,7 +528,7 @@ async def run(
529
528
  # Start API server if enabled
530
529
  api_task = None
531
530
  if api:
532
- from lifx_emulator.api import run_api_server
531
+ from lifx_emulator_app.api import run_api_server
533
532
 
534
533
  logger.info("Starting HTTP API server on http://%s:%s", api_host, api_port)
535
534
  api_task = asyncio.create_task(run_api_server(server, api_host, api_port))
@@ -10,7 +10,7 @@ of concerns.
10
10
  """
11
11
 
12
12
  # Import from new refactored structure
13
- from lifx_emulator.api.app import create_api_app, run_api_server
13
+ from lifx_emulator_app.api.app import create_api_app, run_api_server
14
14
 
15
15
  # Note: HTML_UI remains in the old lifx_emulator/api.py file temporarily
16
16
  # TODO: Phase 1.1d - extract HTML template to separate file
@@ -19,9 +19,9 @@ from fastapi.templating import Jinja2Templates
19
19
  if TYPE_CHECKING:
20
20
  from lifx_emulator.server import EmulatedLifxServer
21
21
 
22
- from lifx_emulator.api.routers.devices import create_devices_router
23
- from lifx_emulator.api.routers.monitoring import create_monitoring_router
24
- from lifx_emulator.api.routers.scenarios import create_scenarios_router
22
+ from lifx_emulator_app.api.routers.devices import create_devices_router
23
+ from lifx_emulator_app.api.routers.monitoring import create_monitoring_router
24
+ from lifx_emulator_app.api.routers.scenarios import create_scenarios_router
25
25
 
26
26
  logger = logging.getLogger(__name__)
27
27
 
@@ -1,5 +1,5 @@
1
1
  """Mappers for converting domain models to API models."""
2
2
 
3
- from lifx_emulator.api.mappers.device_mapper import DeviceMapper
3
+ from lifx_emulator_app.api.mappers.device_mapper import DeviceMapper
4
4
 
5
5
  __all__ = ["DeviceMapper"]
@@ -7,7 +7,7 @@ from typing import TYPE_CHECKING
7
7
  if TYPE_CHECKING:
8
8
  from lifx_emulator.devices import EmulatedLifxDevice
9
9
 
10
- from lifx_emulator.api.models import ColorHsbk, DeviceInfo
10
+ from lifx_emulator_app.api.models import ColorHsbk, DeviceInfo
11
11
 
12
12
 
13
13
  class DeviceMapper:
@@ -1,9 +1,8 @@
1
1
  """Pydantic models for API requests and responses."""
2
2
 
3
- from pydantic import BaseModel, Field, field_validator
4
-
5
3
  # Import shared domain models
6
4
  from lifx_emulator.scenarios import ScenarioConfig
5
+ from pydantic import BaseModel, Field, field_validator
7
6
 
8
7
 
9
8
  class DeviceCreateRequest(BaseModel):
@@ -0,0 +1,11 @@
1
+ """API routers for LIFX emulator endpoints."""
2
+
3
+ from lifx_emulator_app.api.routers.devices import create_devices_router
4
+ from lifx_emulator_app.api.routers.monitoring import create_monitoring_router
5
+ from lifx_emulator_app.api.routers.scenarios import create_scenarios_router
6
+
7
+ __all__ = [
8
+ "create_monitoring_router",
9
+ "create_devices_router",
10
+ "create_scenarios_router",
11
+ ]
@@ -9,8 +9,8 @@ from fastapi import APIRouter, HTTPException
9
9
  if TYPE_CHECKING:
10
10
  from lifx_emulator.server import EmulatedLifxServer
11
11
 
12
- from lifx_emulator.api.models import DeviceCreateRequest, DeviceInfo
13
- from lifx_emulator.api.services.device_service import (
12
+ from lifx_emulator_app.api.models import DeviceCreateRequest, DeviceInfo
13
+ from lifx_emulator_app.api.services.device_service import (
14
14
  DeviceAlreadyExistsError,
15
15
  DeviceCreationError,
16
16
  DeviceNotFoundError,
@@ -9,7 +9,7 @@ from fastapi import APIRouter
9
9
  if TYPE_CHECKING:
10
10
  from lifx_emulator.server import EmulatedLifxServer
11
11
 
12
- from lifx_emulator.api.models import ActivityEvent, ServerStats
12
+ from lifx_emulator_app.api.models import ActivityEvent, ServerStats
13
13
 
14
14
 
15
15
  def create_monitoring_router(server: EmulatedLifxServer) -> APIRouter:
@@ -9,7 +9,7 @@ from fastapi import APIRouter, HTTPException
9
9
  if TYPE_CHECKING:
10
10
  from lifx_emulator.server import EmulatedLifxServer
11
11
 
12
- from lifx_emulator.api.models import ScenarioConfig, ScenarioResponse
12
+ from lifx_emulator_app.api.models import ScenarioConfig, ScenarioResponse
13
13
 
14
14
 
15
15
  def _validate_device_serial(serial: str) -> bool:
@@ -0,0 +1,8 @@
1
+ """Business logic services for API endpoints."""
2
+
3
+ from lifx_emulator_app.api.services.device_service import DeviceService
4
+
5
+ # TODO: Create ScenarioService (Phase 1.1b completion)
6
+ # from lifx_emulator_app.api.services.scenario_service import ScenarioService
7
+
8
+ __all__ = ["DeviceService"]
@@ -13,10 +13,11 @@ from typing import TYPE_CHECKING
13
13
  if TYPE_CHECKING:
14
14
  from lifx_emulator.server import EmulatedLifxServer
15
15
 
16
- from lifx_emulator.api.mappers import DeviceMapper
17
- from lifx_emulator.api.models import DeviceCreateRequest, DeviceInfo
18
16
  from lifx_emulator.factories import create_device
19
17
 
18
+ from lifx_emulator_app.api.mappers import DeviceMapper
19
+ from lifx_emulator_app.api.models import DeviceCreateRequest, DeviceInfo
20
+
20
21
  logger = logging.getLogger(__name__)
21
22
 
22
23
 
lifx_emulator/__init__.py DELETED
@@ -1,31 +0,0 @@
1
- """LIFX Emulator
2
-
3
- A comprehensive LIFX emulator for testing LIFX LAN protocol libraries.
4
- Implements the binary UDP protocol documented at https://lan.developer.lifx.com
5
- """
6
-
7
- from importlib.metadata import version as get_version
8
-
9
- from lifx_emulator.devices import EmulatedLifxDevice
10
- from lifx_emulator.factories import (
11
- create_color_light,
12
- create_color_temperature_light,
13
- create_hev_light,
14
- create_infrared_light,
15
- create_multizone_light,
16
- create_tile_device,
17
- )
18
- from lifx_emulator.server import EmulatedLifxServer
19
-
20
- __version__ = get_version("lifx_emulator")
21
-
22
- __all__ = [
23
- "EmulatedLifxServer",
24
- "EmulatedLifxDevice",
25
- "create_color_light",
26
- "create_color_temperature_light",
27
- "create_hev_light",
28
- "create_infrared_light",
29
- "create_multizone_light",
30
- "create_tile_device",
31
- ]
@@ -1,11 +0,0 @@
1
- """API routers for LIFX emulator endpoints."""
2
-
3
- from lifx_emulator.api.routers.devices import create_devices_router
4
- from lifx_emulator.api.routers.monitoring import create_monitoring_router
5
- from lifx_emulator.api.routers.scenarios import create_scenarios_router
6
-
7
- __all__ = [
8
- "create_monitoring_router",
9
- "create_devices_router",
10
- "create_scenarios_router",
11
- ]
@@ -1,8 +0,0 @@
1
- """Business logic services for API endpoints."""
2
-
3
- from lifx_emulator.api.services.device_service import DeviceService
4
-
5
- # TODO: Create ScenarioService (Phase 1.1b completion)
6
- # from lifx_emulator.api.services.scenario_service import ScenarioService
7
-
8
- __all__ = ["DeviceService"]
@@ -1,33 +0,0 @@
1
- """Protocol constants for LIFX LAN Protocol"""
2
-
3
- from typing import Final
4
-
5
- # ============================================================================
6
- # Network Constants
7
- # ============================================================================
8
-
9
- # LIFX UDP port for device communication
10
- LIFX_UDP_PORT: Final[int] = 56700
11
-
12
- # LIFX Protocol version
13
- LIFX_PROTOCOL_VERSION: Final[int] = 1024
14
-
15
- # Header size in bytes
16
- LIFX_HEADER_SIZE: Final[int] = 36
17
-
18
- # Backward compatibility alias
19
- HEADER_SIZE = LIFX_HEADER_SIZE
20
-
21
- # ============================================================================
22
- # Official LIFX Repository URLs
23
- # ============================================================================
24
-
25
- # Official LIFX protocol specification URL
26
- PROTOCOL_URL: Final[str] = (
27
- "https://raw.githubusercontent.com/LIFX/public-protocol/refs/heads/main/protocol.yml"
28
- )
29
-
30
- # Official LIFX products specification URL
31
- PRODUCTS_URL: Final[str] = (
32
- "https://raw.githubusercontent.com/LIFX/products/refs/heads/master/products.json"
33
- )
@@ -1,37 +0,0 @@
1
- """Device management module for LIFX emulator.
2
-
3
- This module contains all device-related functionality including:
4
- - Device core (EmulatedLifxDevice)
5
- - Device manager (DeviceManager, IDeviceManager)
6
- - Device states (DeviceState and related dataclasses)
7
- - Device persistence (async file storage)
8
- - State restoration and serialization
9
- - Device state observers (ActivityObserver, ActivityLogger, PacketEvent, NullObserver)
10
- """
11
-
12
- from lifx_emulator.devices.device import EmulatedLifxDevice
13
- from lifx_emulator.devices.manager import DeviceManager, IDeviceManager
14
- from lifx_emulator.devices.observers import (
15
- ActivityLogger,
16
- ActivityObserver,
17
- NullObserver,
18
- PacketEvent,
19
- )
20
- from lifx_emulator.devices.persistence import (
21
- DEFAULT_STORAGE_DIR,
22
- DevicePersistenceAsyncFile,
23
- )
24
- from lifx_emulator.devices.states import DeviceState
25
-
26
- __all__ = [
27
- "EmulatedLifxDevice",
28
- "DeviceManager",
29
- "IDeviceManager",
30
- "DeviceState",
31
- "DevicePersistenceAsyncFile",
32
- "DEFAULT_STORAGE_DIR",
33
- "ActivityObserver",
34
- "ActivityLogger",
35
- "PacketEvent",
36
- "NullObserver",
37
- ]