onvif-python 0.2.0__tar.gz → 0.2.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 (132) hide show
  1. {onvif_python-0.2.0/onvif_python.egg-info → onvif_python-0.2.1}/PKG-INFO +4 -4
  2. {onvif_python-0.2.0 → onvif_python-0.2.1}/README.md +3 -3
  3. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/cli/interactive.py +2 -2
  4. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/cli/main.py +17 -4
  5. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/operator.py +1 -3
  6. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/utils/discovery.py +1 -0
  7. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/utils/error_handlers.py +1 -0
  8. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/utils/service.py +5 -9
  9. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/utils/wsdl.py +1 -0
  10. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/utils/xml_capture.py +1 -0
  11. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/utils/zeep.py +1 -0
  12. {onvif_python-0.2.0 → onvif_python-0.2.1/onvif_python.egg-info}/PKG-INFO +4 -4
  13. {onvif_python-0.2.0 → onvif_python-0.2.1}/pyproject.toml +1 -1
  14. {onvif_python-0.2.0 → onvif_python-0.2.1}/LICENSE.md +0 -0
  15. {onvif_python-0.2.0 → onvif_python-0.2.1}/MANIFEST.in +0 -0
  16. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/__init__.py +0 -0
  17. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/cli/__init__.py +0 -0
  18. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/cli/__main__.py +0 -0
  19. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/cli/utils.py +0 -0
  20. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/client.py +0 -0
  21. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/db/companies.db +0 -0
  22. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/db/products.db +0 -0
  23. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/__init__.py +0 -0
  24. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/accesscontrol.py +0 -0
  25. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/accessrules.py +0 -0
  26. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/actionengine.py +0 -0
  27. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/analytics/analytics.py +0 -0
  28. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/analytics/ruleengine.py +0 -0
  29. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/analyticsdevice.py +0 -0
  30. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/appmgmt.py +0 -0
  31. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/authenticationbehavior.py +0 -0
  32. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/credential.py +0 -0
  33. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/deviceio.py +0 -0
  34. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/devicemgmt.py +0 -0
  35. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/display.py +0 -0
  36. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/doorcontrol.py +0 -0
  37. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/events/events.py +0 -0
  38. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/events/notification.py +0 -0
  39. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/events/pullpoint.py +0 -0
  40. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/events/subscription.py +0 -0
  41. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/imaging.py +0 -0
  42. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/media.py +0 -0
  43. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/media2.py +0 -0
  44. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/provisioning.py +0 -0
  45. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/ptz.py +0 -0
  46. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/receiver.py +0 -0
  47. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/recording.py +0 -0
  48. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/replay.py +0 -0
  49. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/schedule.py +0 -0
  50. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/search.py +0 -0
  51. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/security/advancedsecurity.py +0 -0
  52. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/security/authorizationserver.py +0 -0
  53. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/security/dot1x.py +0 -0
  54. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/security/jwt.py +0 -0
  55. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/security/keystore.py +0 -0
  56. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/security/mediasigning.py +0 -0
  57. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/security/tlsserver.py +0 -0
  58. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/thermal.py +0 -0
  59. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/services/uplink.py +0 -0
  60. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/utils/__init__.py +0 -0
  61. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/utils/exceptions.py +0 -0
  62. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/LICENSE.md +0 -0
  63. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/accesscontrol/wsdl/index.html +0 -0
  64. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/accessrules/wsdl/accessrules.wsdl +0 -0
  65. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/accessrules/wsdl/index.html +0 -0
  66. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/actionengine.wsdl +0 -0
  67. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl +0 -0
  68. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/advancedsecurity/wsdl/index.html +0 -0
  69. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/analyticsdevice.wsdl +0 -0
  70. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/appmgmt/wsdl/appmgmt.wsdl +0 -0
  71. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/appmgmt/wsdl/index.html +0 -0
  72. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/authenticationbehavior/wsdl/authenticationbehavior.wsdl +0 -0
  73. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/authenticationbehavior/wsdl/index.html +0 -0
  74. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/credential/wsdl/credential.wsdl +0 -0
  75. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/credential/wsdl/index.html +0 -0
  76. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/device/wsdl/devicemgmt.wsdl +0 -0
  77. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/deviceio.wsdl +0 -0
  78. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/display/display.wsdl +0 -0
  79. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/display/wsdl/index.htm +0 -0
  80. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/display.wsdl +0 -0
  81. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/doorcontrol/wsdl/index.html +0 -0
  82. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/events/wsdl/bw-2-vs-mod.wsdl +0 -0
  83. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/events/wsdl/event-vs.wsdl +0 -0
  84. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/events/wsdl/event.wsdl +0 -0
  85. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/events/wsdl/index.html +0 -0
  86. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/federatedsearch.wsdl +0 -0
  87. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/media/wsdl/media.wsdl +0 -0
  88. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/pacs/accesscontrol.wsdl +0 -0
  89. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/pacs/doorcontrol.wsdl +0 -0
  90. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/pacs/types.xsd +0 -0
  91. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/provisioning/wsdl/provisioning.wsdl +0 -0
  92. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/receiver.wsdl +0 -0
  93. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/recording.wsdl +0 -0
  94. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/replay.wsdl +0 -0
  95. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/schedule/wsdl/index.html +0 -0
  96. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/schedule/wsdl/schedule.wsdl +0 -0
  97. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/schema/common.xsd +0 -0
  98. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/schema/metadatastream.xsd +0 -0
  99. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/schema/onvif.xsd +0 -0
  100. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/search.wsdl +0 -0
  101. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/thermal/wsdl/index.html +0 -0
  102. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/thermal/wsdl/thermal.wsdl +0 -0
  103. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/topics/topicns.xml +0 -0
  104. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/uplink/wsdl/index.html +0 -0
  105. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver10/uplink/wsdl/uplink.wsdl +0 -0
  106. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/analytics/humanbody.xsd +0 -0
  107. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/analytics/humanface.xsd +0 -0
  108. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/analytics/index.html +0 -0
  109. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/analytics/radiometry.xsd +0 -0
  110. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/analytics/rules.xsd +0 -0
  111. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/analytics/wsdl/analytics.wsdl +0 -0
  112. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/analytics/wsdl/index.html +0 -0
  113. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/imaging/wsdl/imaging.wsdl +0 -0
  114. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/media/wsdl/index.html +0 -0
  115. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/media/wsdl/media.wsdl +0 -0
  116. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/ptz/wsdl/ptz.wsdl +0 -0
  117. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/util/federated_search_documentation.html +0 -0
  118. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/util/fedsearch-docu-viewer.xsl +0 -0
  119. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/util/onvif-wsdl-viewer.xsl +0 -0
  120. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif/wsdl/ver20/util/operationIndex.html +0 -0
  121. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif_python.egg-info/SOURCES.txt +0 -0
  122. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif_python.egg-info/dependency_links.txt +0 -0
  123. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif_python.egg-info/entry_points.txt +0 -0
  124. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif_python.egg-info/requires.txt +0 -0
  125. {onvif_python-0.2.0 → onvif_python-0.2.1}/onvif_python.egg-info/top_level.txt +0 -0
  126. {onvif_python-0.2.0 → onvif_python-0.2.1}/setup.cfg +0 -0
  127. {onvif_python-0.2.0 → onvif_python-0.2.1}/setup.py +0 -0
  128. {onvif_python-0.2.0 → onvif_python-0.2.1}/tests/test_client.py +0 -0
  129. {onvif_python-0.2.0 → onvif_python-0.2.1}/tests/test_core.py +0 -0
  130. {onvif_python-0.2.0 → onvif_python-0.2.1}/tests/test_error_handlers.py +0 -0
  131. {onvif_python-0.2.0 → onvif_python-0.2.1}/tests/test_exceptions.py +0 -0
  132. {onvif_python-0.2.0 → onvif_python-0.2.1}/tests/test_wsdl_map.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onvif-python
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: A modern Python library for ONVIF-compliant devices
5
5
  Author-email: Nirsimetri Technologies® <open@nirsimetri.com>
6
6
  Maintainer: Kaburagi
@@ -47,7 +47,7 @@ Dynamic: license-file
47
47
 
48
48
  [![Codacy grade](https://img.shields.io/codacy/grade/bff08a94e4d447b690cea49c6594826d?label=Code%20Quality&logo=codacy)](https://app.codacy.com/gh/nirsimetri/onvif-python/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
49
49
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/nirsimetri/onvif-python)
50
- [![PyPI](https://img.shields.io/badge/PyPI-0.2.0-orange?logo=archive)](https://pypi.org/project/onvif-python/)
50
+ [![PyPI](https://img.shields.io/badge/PyPI-0.2.1-orange?logo=archive)](https://pypi.org/project/onvif-python/)
51
51
  [![Downloads](https://img.shields.io/pypi/dm/onvif-python?label=Downloads&color=red)](https://clickpy.clickhouse.com/dashboard/onvif-python)
52
52
  <br>
53
53
  [![Build](https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml/badge.svg?branch=main)](https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml)
@@ -356,7 +356,7 @@ usage: onvif [-h] [--host HOST] [--port PORT] [--username USERNAME] [--password
356
356
  [--no-verify] [--no-patch] [--interactive] [--debug] [--wsdl WSDL] [--cache {all,db,mem,none}] [--health-check-interval HEALTH_CHECK_INTERVAL] [--version]
357
357
  [service] [method] [params ...]
358
358
 
359
- ONVIF Terminal Client — v0.2.0
359
+ ONVIF Terminal Client — v0.2.1
360
360
  https://github.com/nirsimetri/onvif-python
361
361
 
362
362
  positional arguments:
@@ -429,7 +429,7 @@ Examples:
429
429
  <summary><b>2. Interactive Shell</b></summary>
430
430
 
431
431
  ```bash
432
- ONVIF Interactive Shell — v0.2.0
432
+ ONVIF Interactive Shell — v0.2.1
433
433
  https://github.com/nirsimetri/onvif-python
434
434
 
435
435
  Basic Commands:
@@ -4,7 +4,7 @@
4
4
 
5
5
  [![Codacy grade](https://img.shields.io/codacy/grade/bff08a94e4d447b690cea49c6594826d?label=Code%20Quality&logo=codacy)](https://app.codacy.com/gh/nirsimetri/onvif-python/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
6
6
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/nirsimetri/onvif-python)
7
- [![PyPI](https://img.shields.io/badge/PyPI-0.2.0-orange?logo=archive)](https://pypi.org/project/onvif-python/)
7
+ [![PyPI](https://img.shields.io/badge/PyPI-0.2.1-orange?logo=archive)](https://pypi.org/project/onvif-python/)
8
8
  [![Downloads](https://img.shields.io/pypi/dm/onvif-python?label=Downloads&color=red)](https://clickpy.clickhouse.com/dashboard/onvif-python)
9
9
  <br>
10
10
  [![Build](https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml/badge.svg?branch=main)](https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml)
@@ -313,7 +313,7 @@ usage: onvif [-h] [--host HOST] [--port PORT] [--username USERNAME] [--password
313
313
  [--no-verify] [--no-patch] [--interactive] [--debug] [--wsdl WSDL] [--cache {all,db,mem,none}] [--health-check-interval HEALTH_CHECK_INTERVAL] [--version]
314
314
  [service] [method] [params ...]
315
315
 
316
- ONVIF Terminal Client — v0.2.0
316
+ ONVIF Terminal Client — v0.2.1
317
317
  https://github.com/nirsimetri/onvif-python
318
318
 
319
319
  positional arguments:
@@ -386,7 +386,7 @@ Examples:
386
386
  <summary><b>2. Interactive Shell</b></summary>
387
387
 
388
388
  ```bash
389
- ONVIF Interactive Shell — v0.2.0
389
+ ONVIF Interactive Shell — v0.2.1
390
390
  https://github.com/nirsimetri/onvif-python
391
391
 
392
392
  Basic Commands:
@@ -194,7 +194,7 @@ class InteractiveShell(cmd.Cmd):
194
194
  " / __ \\/ | / / | / / _/ ____/",
195
195
  " / / / / |/ /| | / // // /_ ",
196
196
  "/ /_/ / /| / | |/ // // __/ ",
197
- "\\____/_/ |_/ |___/___/_/ v0.2.0",
197
+ "\\____/_/ |_/ |___/___/_/ v0.2.1",
198
198
  " ",
199
199
  ]
200
200
 
@@ -1400,7 +1400,7 @@ class InteractiveShell(cmd.Cmd):
1400
1400
  super().do_help(line)
1401
1401
  else:
1402
1402
  help_text = f"""
1403
- {colorize('ONVIF Interactive Shell — v0.2.0', 'cyan')}\n{colorize('https://github.com/nirsimetri/onvif-python', 'white')}
1403
+ {colorize('ONVIF Interactive Shell — v0.2.1', 'cyan')}\n{colorize('https://github.com/nirsimetri/onvif-python', 'white')}
1404
1404
 
1405
1405
  {colorize('Basic Commands:', 'yellow')}
1406
1406
  capabilities, caps - Show device capabilities
@@ -21,7 +21,7 @@ def create_parser():
21
21
  """Create argument parser for ONVIF CLI"""
22
22
  parser = argparse.ArgumentParser(
23
23
  prog="onvif",
24
- description=f"{colorize('ONVIF Terminal Client', 'yellow')} — v0.2.0\nhttps://github.com/nirsimetri/onvif-python",
24
+ description=f"{colorize('ONVIF Terminal Client', 'yellow')} — v0.2.1\nhttps://github.com/nirsimetri/onvif-python",
25
25
  formatter_class=argparse.RawDescriptionHelpFormatter,
26
26
  epilog=f"""
27
27
  Examples:
@@ -198,10 +198,14 @@ def search_products(search_term: str, page: int = 1, per_page: int = 20) -> None
198
198
  WHERE LOWER(model) LIKE LOWER(?)
199
199
  OR LOWER(post_title) LIKE LOWER(?)
200
200
  OR LOWER(company_name) LIKE LOWER(?)
201
+ OR LOWER(product_category) LIKE LOWER(?)
201
202
  """
202
203
 
203
204
  search_pattern = f"%{search_term}%"
204
- cursor.execute(count_query, (search_pattern, search_pattern, search_pattern))
205
+ cursor.execute(
206
+ count_query,
207
+ (search_pattern, search_pattern, search_pattern, search_pattern),
208
+ )
205
209
  total_count = cursor.fetchone()[0]
206
210
 
207
211
  if total_count == 0:
@@ -229,12 +233,21 @@ def search_products(search_term: str, page: int = 1, per_page: int = 20) -> None
229
233
  WHERE LOWER(model) LIKE LOWER(?)
230
234
  OR LOWER(post_title) LIKE LOWER(?)
231
235
  OR LOWER(company_name) LIKE LOWER(?)
236
+ OR LOWER(product_category) LIKE LOWER(?)
232
237
  ORDER BY test_date DESC
233
238
  LIMIT ? OFFSET ?
234
239
  """
235
240
 
236
241
  cursor.execute(
237
- query, (search_pattern, search_pattern, search_pattern, per_page, offset)
242
+ query,
243
+ (
244
+ search_pattern,
245
+ search_pattern,
246
+ search_pattern,
247
+ search_pattern,
248
+ per_page,
249
+ offset,
250
+ ),
238
251
  )
239
252
  results = cursor.fetchall()
240
253
 
@@ -448,7 +461,7 @@ def main():
448
461
 
449
462
  # Show ONVIF CLI version
450
463
  if args.version:
451
- print(colorize("0.2.0", "yellow"))
464
+ print(colorize("0.2.1", "yellow"))
452
465
  sys.exit(0)
453
466
 
454
467
  # Handle product search
@@ -15,6 +15,7 @@ from zeep.wsse.username import UsernameToken
15
15
  from .utils import ONVIFOperationException, ZeepPatcher
16
16
 
17
17
  logger = logging.getLogger(__name__)
18
+ logger.addHandler(logging.NullHandler())
18
19
 
19
20
 
20
21
  class CacheMode(Enum):
@@ -194,7 +195,6 @@ class ONVIFOperator:
194
195
  try:
195
196
  func = getattr(self.service, method)
196
197
  except AttributeError as e:
197
- logger.error(f"Method {method} not found in {self.service_name} service")
198
198
  raise ONVIFOperationException(operation=method, original_exception=e)
199
199
 
200
200
  try:
@@ -207,10 +207,8 @@ class ONVIFOperator:
207
207
  return result
208
208
 
209
209
  except Fault as e:
210
- logger.error(f"SOAP Fault in {self.service_name}.{method}: {e}")
211
210
  raise ONVIFOperationException(operation=method, original_exception=e)
212
211
  except Exception as e:
213
- logger.error(f"ONVIF call error in {self.service_name}.{method}: {e}")
214
212
  raise ONVIFOperationException(operation=method, original_exception=e)
215
213
 
216
214
  def create_type(self, type_name: str):
@@ -8,6 +8,7 @@ from lxml import etree
8
8
  from typing import List, Dict, Any, Optional
9
9
 
10
10
  logger = logging.getLogger(__name__)
11
+ logger.addHandler(logging.NullHandler())
11
12
 
12
13
 
13
14
  class ONVIFDiscovery:
@@ -5,6 +5,7 @@ from zeep.exceptions import Fault
5
5
  from .exceptions import ONVIFOperationException
6
6
 
7
7
  logger = logging.getLogger(__name__)
8
+ logger.addHandler(logging.NullHandler())
8
9
 
9
10
 
10
11
  class ONVIFErrorHandler:
@@ -4,6 +4,7 @@ import logging
4
4
  from .exceptions import ONVIFOperationException
5
5
 
6
6
  logger = logging.getLogger(__name__)
7
+ logger.addHandler(logging.NullHandler())
7
8
 
8
9
 
9
10
  def _is_zeep_object(obj):
@@ -40,13 +41,6 @@ class ONVIFService:
40
41
  3. Is not a private method (doesn't start with underscore)
41
42
  4. Is not an internal attribute (like 'operator')
42
43
 
43
- Benefits:
44
- 1. **DRY Principle**: No need to repeat error handling in every method
45
- 2. **Consistency**: All ONVIF operations behave the same way
46
- 3. **Maintainability**: Error handling logic in one place
47
- 4. **Debuggability**: Always know which operation failed
48
- 5. **Transparency**: No boilerplate code in service implementations
49
-
50
44
  Notes:
51
45
  - This is an abstract base class - don't instantiate directly
52
46
  - Subclasses must implement their own __init__ and ONVIF methods
@@ -113,11 +107,13 @@ class ONVIFService:
113
107
  return result
114
108
  except ONVIFOperationException as oe:
115
109
  # Re-raise ONVIF exceptions as-is
116
- logger.error(f"ONVIF operation exception in {name}: {oe}")
110
+ service_name = getattr(self.operator, "service_name", "Unknown")
111
+ logger.error(f"{service_name}.{name}: {oe}")
117
112
  raise
118
113
  except Exception as e:
119
114
  # Convert any other exception (including TypeError) to ONVIFOperationException
120
- logger.error(f"ONVIF operation exception in {name}: {e}")
115
+ service_name = getattr(self.operator, "service_name", "Unknown")
116
+ logger.error(f"{service_name}.{name}: {e}")
121
117
  raise ONVIFOperationException(name, e)
122
118
 
123
119
  return wrapped_method
@@ -4,6 +4,7 @@ import os
4
4
  import logging
5
5
 
6
6
  logger = logging.getLogger(__name__)
7
+ logger.addHandler(logging.NullHandler())
7
8
 
8
9
 
9
10
  class ONVIFWSDL:
@@ -5,6 +5,7 @@ from zeep import Plugin
5
5
  from lxml import etree
6
6
 
7
7
  logger = logging.getLogger(__name__)
8
+ logger.addHandler(logging.NullHandler())
8
9
 
9
10
 
10
11
  class XMLCapturePlugin(Plugin):
@@ -6,6 +6,7 @@ from zeep.xsd.elements.any import Any
6
6
  from zeep.xsd.utils import max_occurs_iter
7
7
 
8
8
  logger = logging.getLogger(__name__)
9
+ logger.addHandler(logging.NullHandler())
9
10
 
10
11
 
11
12
  class ZeepPatcher:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onvif-python
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: A modern Python library for ONVIF-compliant devices
5
5
  Author-email: Nirsimetri Technologies® <open@nirsimetri.com>
6
6
  Maintainer: Kaburagi
@@ -47,7 +47,7 @@ Dynamic: license-file
47
47
 
48
48
  [![Codacy grade](https://img.shields.io/codacy/grade/bff08a94e4d447b690cea49c6594826d?label=Code%20Quality&logo=codacy)](https://app.codacy.com/gh/nirsimetri/onvif-python/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
49
49
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/nirsimetri/onvif-python)
50
- [![PyPI](https://img.shields.io/badge/PyPI-0.2.0-orange?logo=archive)](https://pypi.org/project/onvif-python/)
50
+ [![PyPI](https://img.shields.io/badge/PyPI-0.2.1-orange?logo=archive)](https://pypi.org/project/onvif-python/)
51
51
  [![Downloads](https://img.shields.io/pypi/dm/onvif-python?label=Downloads&color=red)](https://clickpy.clickhouse.com/dashboard/onvif-python)
52
52
  <br>
53
53
  [![Build](https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml/badge.svg?branch=main)](https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml)
@@ -356,7 +356,7 @@ usage: onvif [-h] [--host HOST] [--port PORT] [--username USERNAME] [--password
356
356
  [--no-verify] [--no-patch] [--interactive] [--debug] [--wsdl WSDL] [--cache {all,db,mem,none}] [--health-check-interval HEALTH_CHECK_INTERVAL] [--version]
357
357
  [service] [method] [params ...]
358
358
 
359
- ONVIF Terminal Client — v0.2.0
359
+ ONVIF Terminal Client — v0.2.1
360
360
  https://github.com/nirsimetri/onvif-python
361
361
 
362
362
  positional arguments:
@@ -429,7 +429,7 @@ Examples:
429
429
  <summary><b>2. Interactive Shell</b></summary>
430
430
 
431
431
  ```bash
432
- ONVIF Interactive Shell — v0.2.0
432
+ ONVIF Interactive Shell — v0.2.1
433
433
  https://github.com/nirsimetri/onvif-python
434
434
 
435
435
  Basic Commands:
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "onvif-python"
7
- version = "0.2.0"
7
+ version = "0.2.1"
8
8
  description = "A modern Python library for ONVIF-compliant devices"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
File without changes
File without changes
File without changes
File without changes