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.
- {homesec-1.1.0 → homesec-1.1.1}/CHANGELOG.md +18 -0
- {homesec-1.1.0 → homesec-1.1.1}/PKG-INFO +1 -1
- {homesec-1.1.0 → homesec-1.1.1}/pyproject.toml +1 -1
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/cli.py +3 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_cli.py +66 -8
- {homesec-1.1.0 → homesec-1.1.1}/uv.lock +1 -1
- {homesec-1.1.0 → homesec-1.1.1}/.dockerignore +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/.env.example +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/.github/workflows/ci.yml +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/.github/workflows/release.yaml +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/.github/workflows/validate-pr-title.yaml +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/.gitignore +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/AGENTS.md +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/DESIGN.md +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/Dockerfile +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/LICENSE +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/Makefile +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/README.md +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/TESTING.md +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/alembic/env.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/alembic/script.py.mako +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/alembic/versions/e6f25df0df90_initial.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/alembic.ini +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/config/example.yaml +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/docker-compose.yml +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/docker-entrypoint.sh +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/app.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/config/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/config/loader.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/config/validation.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/errors.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/health/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/health/server.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/interfaces.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/logging_setup.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/maintenance/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/maintenance/cleanup_clips.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/alert.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/clip.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/config.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/events.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/filter.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/source.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/storage.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/models/vlm.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/pipeline/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/pipeline/alert_policy.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/pipeline/core.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/alert_policies/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/alert_policies/default.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/alert_policies/noop.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/analyzers/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/analyzers/openai.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/filters/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/filters/yolo.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/notifiers/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/notifiers/mqtt.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/notifiers/multiplex.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/notifiers/sendgrid_email.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/storage/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/storage/dropbox.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/storage/local.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/plugins/utils.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/py.typed +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/repository/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/repository/clip_repository.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/sources/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/sources/base.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/sources/ftp.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/sources/local_folder.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/sources/rtsp.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/state/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/state/postgres.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/storage_paths.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/telemetry/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/telemetry/db/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/telemetry/db/log_table.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/telemetry/db_log_handler.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/src/homesec/telemetry/postgres_settings.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/conftest.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/conftest.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/mocks/__init__.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/mocks/event_store.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/mocks/filter.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/mocks/notifier.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/mocks/state_store.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/mocks/storage.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/mocks/vlm.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_alert_policy.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_app.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_cleanup_clips.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_clip_repository.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_clip_sources.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_config.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_dropbox_storage.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_event_store.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_ftp_source.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_health.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_integration.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_local_folder_deduplication.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_local_storage.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_logging_setup.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_mqtt_notifier.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_notifiers.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_openai_vlm.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_pipeline.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_pipeline_events.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_plugin_registration.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_plugin_utils.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_rtsp_helpers.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_sendgrid_notifier.py +0 -0
- {homesec-1.1.0 → homesec-1.1.1}/tests/homesec/test_state_store.py +0 -0
- {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.
|
|
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
|
|
@@ -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
|
|
338
|
-
"""Main entrypoint calls fire.Fire
|
|
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
|
-
#
|
|
342
|
-
|
|
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
|
|
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"]
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|