homesec 1.1.0__tar.gz → 1.1.1__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 (118) hide show
  1. {homesec-1.1.0 → homesec-1.1.1}/CHANGELOG.md +18 -0
  2. {homesec-1.1.0 → homesec-1.1.1}/PKG-INFO +1 -1
  3. {homesec-1.1.0 → homesec-1.1.1}/pyproject.toml +1 -1
  4. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/cli.py +3 -0
  5. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_cli.py +66 -8
  6. {homesec-1.1.0 → homesec-1.1.1}/uv.lock +1 -1
  7. {homesec-1.1.0 → homesec-1.1.1}/.dockerignore +0 -0
  8. {homesec-1.1.0 → homesec-1.1.1}/.env.example +0 -0
  9. {homesec-1.1.0 → homesec-1.1.1}/.github/workflows/ci.yml +0 -0
  10. {homesec-1.1.0 → homesec-1.1.1}/.github/workflows/release.yaml +0 -0
  11. {homesec-1.1.0 → homesec-1.1.1}/.github/workflows/validate-pr-title.yaml +0 -0
  12. {homesec-1.1.0 → homesec-1.1.1}/.gitignore +0 -0
  13. {homesec-1.1.0 → homesec-1.1.1}/AGENTS.md +0 -0
  14. {homesec-1.1.0 → homesec-1.1.1}/DESIGN.md +0 -0
  15. {homesec-1.1.0 → homesec-1.1.1}/Dockerfile +0 -0
  16. {homesec-1.1.0 → homesec-1.1.1}/LICENSE +0 -0
  17. {homesec-1.1.0 → homesec-1.1.1}/Makefile +0 -0
  18. {homesec-1.1.0 → homesec-1.1.1}/README.md +0 -0
  19. {homesec-1.1.0 → homesec-1.1.1}/TESTING.md +0 -0
  20. {homesec-1.1.0 → homesec-1.1.1}/alembic/env.py +0 -0
  21. {homesec-1.1.0 → homesec-1.1.1}/alembic/script.py.mako +0 -0
  22. {homesec-1.1.0 → homesec-1.1.1}/alembic/versions/e6f25df0df90_initial.py +0 -0
  23. {homesec-1.1.0 → homesec-1.1.1}/alembic.ini +0 -0
  24. {homesec-1.1.0 → homesec-1.1.1}/config/example.yaml +0 -0
  25. {homesec-1.1.0 → homesec-1.1.1}/docker-compose.yml +0 -0
  26. {homesec-1.1.0 → homesec-1.1.1}/docker-entrypoint.sh +0 -0
  27. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/__init__.py +0 -0
  28. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/app.py +0 -0
  29. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/config/__init__.py +0 -0
  30. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/config/loader.py +0 -0
  31. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/config/validation.py +0 -0
  32. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/errors.py +0 -0
  33. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/health/__init__.py +0 -0
  34. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/health/server.py +0 -0
  35. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/interfaces.py +0 -0
  36. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/logging_setup.py +0 -0
  37. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/maintenance/__init__.py +0 -0
  38. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/maintenance/cleanup_clips.py +0 -0
  39. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/__init__.py +0 -0
  40. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/alert.py +0 -0
  41. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/clip.py +0 -0
  42. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/config.py +0 -0
  43. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/events.py +0 -0
  44. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/filter.py +0 -0
  45. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/source.py +0 -0
  46. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/storage.py +0 -0
  47. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/vlm.py +0 -0
  48. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/pipeline/__init__.py +0 -0
  49. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/pipeline/alert_policy.py +0 -0
  50. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/pipeline/core.py +0 -0
  51. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/__init__.py +0 -0
  52. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/alert_policies/__init__.py +0 -0
  53. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/alert_policies/default.py +0 -0
  54. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/alert_policies/noop.py +0 -0
  55. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/analyzers/__init__.py +0 -0
  56. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/analyzers/openai.py +0 -0
  57. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/filters/__init__.py +0 -0
  58. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/filters/yolo.py +0 -0
  59. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/notifiers/__init__.py +0 -0
  60. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/notifiers/mqtt.py +0 -0
  61. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/notifiers/multiplex.py +0 -0
  62. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/notifiers/sendgrid_email.py +0 -0
  63. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/storage/__init__.py +0 -0
  64. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/storage/dropbox.py +0 -0
  65. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/storage/local.py +0 -0
  66. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/utils.py +0 -0
  67. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/py.typed +0 -0
  68. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/repository/__init__.py +0 -0
  69. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/repository/clip_repository.py +0 -0
  70. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/sources/__init__.py +0 -0
  71. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/sources/base.py +0 -0
  72. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/sources/ftp.py +0 -0
  73. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/sources/local_folder.py +0 -0
  74. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/sources/rtsp.py +0 -0
  75. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/state/__init__.py +0 -0
  76. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/state/postgres.py +0 -0
  77. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/storage_paths.py +0 -0
  78. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/telemetry/__init__.py +0 -0
  79. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/telemetry/db/__init__.py +0 -0
  80. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/telemetry/db/log_table.py +0 -0
  81. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/telemetry/db_log_handler.py +0 -0
  82. {homesec-1.1.0 → homesec-1.1.1}/src/homesec/telemetry/postgres_settings.py +0 -0
  83. {homesec-1.1.0 → homesec-1.1.1}/tests/__init__.py +0 -0
  84. {homesec-1.1.0 → homesec-1.1.1}/tests/conftest.py +0 -0
  85. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/__init__.py +0 -0
  86. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/conftest.py +0 -0
  87. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/mocks/__init__.py +0 -0
  88. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/mocks/event_store.py +0 -0
  89. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/mocks/filter.py +0 -0
  90. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/mocks/notifier.py +0 -0
  91. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/mocks/state_store.py +0 -0
  92. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/mocks/storage.py +0 -0
  93. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/mocks/vlm.py +0 -0
  94. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_alert_policy.py +0 -0
  95. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_app.py +0 -0
  96. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_cleanup_clips.py +0 -0
  97. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_clip_repository.py +0 -0
  98. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_clip_sources.py +0 -0
  99. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_config.py +0 -0
  100. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_dropbox_storage.py +0 -0
  101. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_event_store.py +0 -0
  102. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_ftp_source.py +0 -0
  103. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_health.py +0 -0
  104. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_integration.py +0 -0
  105. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_local_folder_deduplication.py +0 -0
  106. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_local_storage.py +0 -0
  107. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_logging_setup.py +0 -0
  108. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_mqtt_notifier.py +0 -0
  109. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_notifiers.py +0 -0
  110. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_openai_vlm.py +0 -0
  111. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_pipeline.py +0 -0
  112. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_pipeline_events.py +0 -0
  113. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_plugin_registration.py +0 -0
  114. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_plugin_utils.py +0 -0
  115. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_rtsp_helpers.py +0 -0
  116. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_sendgrid_notifier.py +0 -0
  117. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_state_store.py +0 -0
  118. {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_yolo_filter.py +0 -0
@@ -2,6 +2,24 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v1.1.1 (2026-01-16)
6
+
7
+ ### Bug Fixes
8
+
9
+ - Improve CLI help output to show available commands ([#8](https://github.com/lan17/homesec/pull/8),
10
+ [`4c8342f`](https://github.com/lan17/homesec/commit/4c8342f71274f2110231f112b77d68c8bb119c17))
11
+
12
+ ### Chores
13
+
14
+ - Sync uv.lock version ([#8](https://github.com/lan17/homesec/pull/8),
15
+ [`4c8342f`](https://github.com/lan17/homesec/commit/4c8342f71274f2110231f112b77d68c8bb119c17))
16
+
17
+ ### Refactoring
18
+
19
+ - Use Fire's native help output for CLI commands ([#8](https://github.com/lan17/homesec/pull/8),
20
+ [`4c8342f`](https://github.com/lan17/homesec/commit/4c8342f71274f2110231f112b77d68c8bb119c17))
21
+
22
+
5
23
  ## v1.1.0 (2026-01-12)
6
24
 
7
25
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: homesec
3
- Version: 1.1.0
3
+ Version: 1.1.1
4
4
  Summary: Pluggable async home security camera pipeline with detection, VLM analysis, and alerts.
5
5
  Project-URL: Homepage, https://github.com/lan17/homesec
6
6
  Project-URL: Source, https://github.com/lan17/homesec
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "homesec"
3
- version = "1.1.0"
3
+ version = "1.1.1"
4
4
  description = "Pluggable async home security camera pipeline with detection, VLM analysis, and alerts."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -155,6 +155,9 @@ class HomeSec:
155
155
 
156
156
  def main() -> None:
157
157
  """Main CLI entrypoint."""
158
+ # Strip --help/-h when it's the only arg so Fire shows its commands list
159
+ if len(sys.argv) == 2 and sys.argv[1] in ("--help", "-h"):
160
+ sys.argv.pop()
158
161
  fire.Fire(HomeSec)
159
162
 
160
163
 
@@ -8,7 +8,7 @@ from unittest.mock import AsyncMock, MagicMock, patch
8
8
  import pytest
9
9
  import yaml
10
10
 
11
- from homesec.cli import HomeSec, setup_logging
11
+ from homesec.cli import HomeSec, main, setup_logging
12
12
  from homesec.config import ConfigError
13
13
 
14
14
 
@@ -334,15 +334,73 @@ class TestHomeSecCleanup:
334
334
  class TestMain:
335
335
  """Tests for main entrypoint."""
336
336
 
337
- def test_main_calls_fire(self) -> None:
338
- """Main entrypoint calls fire.Fire with HomeSec."""
339
- # Given: Mocked fire module
337
+ def test_main_calls_fire_with_command(self) -> None:
338
+ """Main entrypoint calls fire.Fire when command is provided."""
339
+ # Given: Mocked fire module and sys.argv with a command
340
+ with (
341
+ patch("homesec.cli.fire.Fire") as mock_fire,
342
+ patch("homesec.cli.sys.argv", ["homesec", "validate", "--config", "x.yaml"]),
343
+ ):
344
+ # When: Calling main
345
+ main()
340
346
 
341
- # When: Calling main
342
- with patch("homesec.cli.fire.Fire") as mock_fire:
343
- from homesec.cli import main
347
+ # Then: fire.Fire called with HomeSec
348
+ mock_fire.assert_called_once_with(HomeSec)
344
349
 
350
+ def test_main_calls_fire_with_no_args(self) -> None:
351
+ """Main calls fire.Fire when called with no arguments (Fire shows commands)."""
352
+ # Given: sys.argv with only the program name
353
+ with (
354
+ patch("homesec.cli.fire.Fire") as mock_fire,
355
+ patch("homesec.cli.sys.argv", ["homesec"]),
356
+ ):
357
+ # When: Calling main
345
358
  main()
346
359
 
347
- # Then: fire.Fire called with HomeSec
360
+ # Then: fire.Fire is called (Fire will show commands list)
361
+ mock_fire.assert_called_once_with(HomeSec)
362
+
363
+ def test_main_strips_help_flag_before_fire(self) -> None:
364
+ """Main strips --help flag so Fire shows commands list."""
365
+ # Given: sys.argv with --help
366
+ argv = ["homesec", "--help"]
367
+ with (
368
+ patch("homesec.cli.fire.Fire") as mock_fire,
369
+ patch("homesec.cli.sys.argv", argv),
370
+ ):
371
+ # When: Calling main
372
+ main()
373
+
374
+ # Then: fire.Fire is called and --help was stripped from argv
375
+ mock_fire.assert_called_once_with(HomeSec)
376
+ assert argv == ["homesec"]
377
+
378
+ def test_main_strips_h_flag_before_fire(self) -> None:
379
+ """Main strips -h flag so Fire shows commands list."""
380
+ # Given: sys.argv with -h
381
+ argv = ["homesec", "-h"]
382
+ with (
383
+ patch("homesec.cli.fire.Fire") as mock_fire,
384
+ patch("homesec.cli.sys.argv", argv),
385
+ ):
386
+ # When: Calling main
387
+ main()
388
+
389
+ # Then: fire.Fire is called and -h was stripped from argv
390
+ mock_fire.assert_called_once_with(HomeSec)
391
+ assert argv == ["homesec"]
392
+
393
+ def test_main_preserves_command_help_flag(self) -> None:
394
+ """Main preserves --help when used with a command."""
395
+ # Given: sys.argv with command and --help
396
+ argv = ["homesec", "run", "--help"]
397
+ with (
398
+ patch("homesec.cli.fire.Fire") as mock_fire,
399
+ patch("homesec.cli.sys.argv", argv),
400
+ ):
401
+ # When: Calling main
402
+ main()
403
+
404
+ # Then: fire.Fire is called and argv is unchanged
348
405
  mock_fire.assert_called_once_with(HomeSec)
406
+ assert argv == ["homesec", "run", "--help"]
@@ -1125,7 +1125,7 @@ wheels = [
1125
1125
 
1126
1126
  [[package]]
1127
1127
  name = "homesec"
1128
- version = "1.0.2"
1128
+ version = "1.1.0"
1129
1129
  source = { editable = "." }
1130
1130
  dependencies = [
1131
1131
  { name = "aiohttp" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes