FeatureManagement 2.1.0__tar.gz → 2.2.0__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 (68) hide show
  1. {featuremanagement-2.1.0 → featuremanagement-2.2.0/FeatureManagement.egg-info}/PKG-INFO +21 -10
  2. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/FeatureManagement.egg-info/SOURCES.txt +1 -21
  3. featuremanagement-2.2.0/FeatureManagement.egg-info/requires.txt +20 -0
  4. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/FeatureManagement.egg-info/top_level.txt +0 -1
  5. {featuremanagement-2.1.0/FeatureManagement.egg-info → featuremanagement-2.2.0}/PKG-INFO +21 -10
  6. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/__init__.py +2 -0
  7. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_defaultfilters.py +2 -0
  8. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_featurefilters.py +2 -0
  9. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_featuremanager.py +2 -0
  10. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_featuremanagerbase.py +42 -48
  11. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/__init__.py +2 -0
  12. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_allocation.py +2 -0
  13. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_constants.py +1 -0
  14. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_evaluation_event.py +2 -0
  15. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_feature_conditions.py +2 -0
  16. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_feature_flag.py +2 -0
  17. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_targeting_context.py +1 -0
  18. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_telemetry.py +2 -0
  19. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_variant.py +2 -0
  20. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_variant_assignment_reason.py +2 -0
  21. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_variant_reference.py +2 -0
  22. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_time_window_filter/__init__.py +2 -0
  23. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_time_window_filter/_models.py +2 -0
  24. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_time_window_filter/_recurrence_evaluator.py +2 -0
  25. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_time_window_filter/_recurrence_validator.py +2 -1
  26. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_version.py +2 -1
  27. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/aio/__init__.py +2 -0
  28. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/aio/_defaultfilters.py +2 -0
  29. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/aio/_featurefilters.py +2 -0
  30. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/aio/_featuremanager.py +2 -0
  31. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/azuremonitor/__init__.py +2 -1
  32. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/azuremonitor/_send_telemetry.py +37 -12
  33. featuremanagement-2.2.0/pyproject.toml +78 -0
  34. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_default_feature_flags.py +2 -0
  35. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_default_feature_flags_async.py +2 -0
  36. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_feature_manager.py +32 -0
  37. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_feature_manager_async.py +34 -0
  38. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_feature_manager_refresh.py +2 -0
  39. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_feature_variants.py +2 -0
  40. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_feature_variants_async.py +2 -0
  41. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_send_telemetry_appinsights.py +110 -62
  42. featuremanagement-2.1.0/CHANGELOG.md +0 -3
  43. featuremanagement-2.1.0/CODE_OF_CONDUCT.md +0 -9
  44. featuremanagement-2.1.0/FeatureManagement.egg-info/not-zip-safe +0 -1
  45. featuremanagement-2.1.0/FeatureManagement.egg-info/requires.txt +0 -3
  46. featuremanagement-2.1.0/MANIFEST.in +0 -6
  47. featuremanagement-2.1.0/SECURITY.md +0 -41
  48. featuremanagement-2.1.0/SUPPORT.md +0 -25
  49. featuremanagement-2.1.0/pyproject.toml +0 -47
  50. featuremanagement-2.1.0/samples/feature_flag_sample.py +0 -34
  51. featuremanagement-2.1.0/samples/feature_flag_with_azure_app_configuration_sample.py +0 -46
  52. featuremanagement-2.1.0/samples/feature_variant_sample.py +0 -25
  53. featuremanagement-2.1.0/samples/feature_variant_sample_with_targeting_accessor.py +0 -36
  54. featuremanagement-2.1.0/samples/feature_variant_sample_with_telemetry.py +0 -36
  55. featuremanagement-2.1.0/samples/formatted_feature_flags.json +0 -230
  56. featuremanagement-2.1.0/samples/quarty_sample.py +0 -60
  57. featuremanagement-2.1.0/samples/random_filter.py +0 -21
  58. featuremanagement-2.1.0/setup.py +0 -64
  59. featuremanagement-2.1.0/tests/__init__.py +0 -0
  60. featuremanagement-2.1.0/tests/time_window_filter/test_recurrence_evaluator.py +0 -281
  61. featuremanagement-2.1.0/tests/time_window_filter/test_recurrence_validator.py +0 -321
  62. featuremanagement-2.1.0/tests/time_window_filter/test_time_window_filter_models.py +0 -133
  63. featuremanagement-2.1.0/tests/validation_tests/test_json_validations.py +0 -101
  64. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/FeatureManagement.egg-info/dependency_links.txt +0 -0
  65. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/LICENSE +0 -0
  66. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/README.md +0 -0
  67. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/py.typed +0 -0
  68. {featuremanagement-2.1.0 → featuremanagement-2.2.0}/setup.cfg +0 -0
@@ -1,9 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: FeatureManagement
3
- Version: 2.1.0
3
+ Version: 2.2.0
4
4
  Summary: A library for enabling/disabling features at runtime.
5
- Home-page: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/appconfiguration/feature-management
6
- Author: Microsoft Corporation
7
5
  Author-email: Microsoft Corporation <appconfig@microsoft.com>
8
6
  License: MIT License
9
7
 
@@ -33,20 +31,33 @@ Classifier: Development Status :: 5 - Production/Stable
33
31
  Classifier: Programming Language :: Python
34
32
  Classifier: Programming Language :: Python :: 3 :: Only
35
33
  Classifier: Programming Language :: Python :: 3
36
- Classifier: Programming Language :: Python :: 3.8
37
- Classifier: Programming Language :: Python :: 3.9
38
34
  Classifier: Programming Language :: Python :: 3.10
39
35
  Classifier: Programming Language :: Python :: 3.11
36
+ Classifier: Programming Language :: Python :: 3.12
37
+ Classifier: Programming Language :: Python :: 3.13
38
+ Classifier: Programming Language :: Python :: 3.14
40
39
  Classifier: License :: OSI Approved :: MIT License
41
- Requires-Python: >=3.6
40
+ Requires-Python: >=3.10
42
41
  Description-Content-Type: text/markdown
43
42
  License-File: LICENSE
44
43
  Provides-Extra: azuremonitor
45
- Requires-Dist: azure-monitor-events-extension<2.0.0; extra == "azuremonitor"
46
- Dynamic: author
47
- Dynamic: home-page
44
+ Requires-Dist: opentelemetry-sdk~=1.20; extra == "azuremonitor"
45
+ Provides-Extra: test
46
+ Requires-Dist: azure-monitor-opentelemetry<2.0.0; extra == "test"
47
+ Provides-Extra: dev
48
+ Requires-Dist: pytest<10.0.0,>=7.0.0; extra == "dev"
49
+ Requires-Dist: pytest-cov<8.0.0,>=4.0.0; extra == "dev"
50
+ Requires-Dist: pytest-asyncio<2.0.0,>=0.21.0; extra == "dev"
51
+ Requires-Dist: black<27.0.0,>=23.0.0; extra == "dev"
52
+ Requires-Dist: pylint<5.0.0,>=3.0.0; extra == "dev"
53
+ Requires-Dist: mypy<2.0.0,>=1.0.0; extra == "dev"
54
+ Requires-Dist: sphinx<10.0.0,>=7.0.0; extra == "dev"
55
+ Requires-Dist: sphinx_rtd_theme<4.0.0,>=2.0.0; extra == "dev"
56
+ Requires-Dist: sphinx-toolbox<5.0.0,>=3.0.0; extra == "dev"
57
+ Requires-Dist: myst_parser<6.0.0,>=2.0.0; extra == "dev"
58
+ Requires-Dist: opentelemetry-api~=1.20; extra == "dev"
59
+ Requires-Dist: opentelemetry-sdk~=1.20; extra == "dev"
48
60
  Dynamic: license-file
49
- Dynamic: requires-python
50
61
 
51
62
  # Microsoft Feature Management for Python
52
63
 
@@ -1,16 +1,9 @@
1
- CHANGELOG.md
2
- CODE_OF_CONDUCT.md
3
1
  LICENSE
4
- MANIFEST.in
5
2
  README.md
6
- SECURITY.md
7
- SUPPORT.md
8
3
  pyproject.toml
9
- setup.py
10
4
  FeatureManagement.egg-info/PKG-INFO
11
5
  FeatureManagement.egg-info/SOURCES.txt
12
6
  FeatureManagement.egg-info/dependency_links.txt
13
- FeatureManagement.egg-info/not-zip-safe
14
7
  FeatureManagement.egg-info/requires.txt
15
8
  FeatureManagement.egg-info/top_level.txt
16
9
  featuremanagement/__init__.py
@@ -41,15 +34,6 @@ featuremanagement/aio/_featurefilters.py
41
34
  featuremanagement/aio/_featuremanager.py
42
35
  featuremanagement/azuremonitor/__init__.py
43
36
  featuremanagement/azuremonitor/_send_telemetry.py
44
- samples/feature_flag_sample.py
45
- samples/feature_flag_with_azure_app_configuration_sample.py
46
- samples/feature_variant_sample.py
47
- samples/feature_variant_sample_with_targeting_accessor.py
48
- samples/feature_variant_sample_with_telemetry.py
49
- samples/formatted_feature_flags.json
50
- samples/quarty_sample.py
51
- samples/random_filter.py
52
- tests/__init__.py
53
37
  tests/test_default_feature_flags.py
54
38
  tests/test_default_feature_flags_async.py
55
39
  tests/test_feature_manager.py
@@ -57,8 +41,4 @@ tests/test_feature_manager_async.py
57
41
  tests/test_feature_manager_refresh.py
58
42
  tests/test_feature_variants.py
59
43
  tests/test_feature_variants_async.py
60
- tests/test_send_telemetry_appinsights.py
61
- tests/time_window_filter/test_recurrence_evaluator.py
62
- tests/time_window_filter/test_recurrence_validator.py
63
- tests/time_window_filter/test_time_window_filter_models.py
64
- tests/validation_tests/test_json_validations.py
44
+ tests/test_send_telemetry_appinsights.py
@@ -0,0 +1,20 @@
1
+
2
+ [AzureMonitor]
3
+ opentelemetry-sdk~=1.20
4
+
5
+ [dev]
6
+ pytest<10.0.0,>=7.0.0
7
+ pytest-cov<8.0.0,>=4.0.0
8
+ pytest-asyncio<2.0.0,>=0.21.0
9
+ black<27.0.0,>=23.0.0
10
+ pylint<5.0.0,>=3.0.0
11
+ mypy<2.0.0,>=1.0.0
12
+ sphinx<10.0.0,>=7.0.0
13
+ sphinx_rtd_theme<4.0.0,>=2.0.0
14
+ sphinx-toolbox<5.0.0,>=3.0.0
15
+ myst_parser<6.0.0,>=2.0.0
16
+ opentelemetry-api~=1.20
17
+ opentelemetry-sdk~=1.20
18
+
19
+ [test]
20
+ azure-monitor-opentelemetry<2.0.0
@@ -1,9 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: FeatureManagement
3
- Version: 2.1.0
3
+ Version: 2.2.0
4
4
  Summary: A library for enabling/disabling features at runtime.
5
- Home-page: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/appconfiguration/feature-management
6
- Author: Microsoft Corporation
7
5
  Author-email: Microsoft Corporation <appconfig@microsoft.com>
8
6
  License: MIT License
9
7
 
@@ -33,20 +31,33 @@ Classifier: Development Status :: 5 - Production/Stable
33
31
  Classifier: Programming Language :: Python
34
32
  Classifier: Programming Language :: Python :: 3 :: Only
35
33
  Classifier: Programming Language :: Python :: 3
36
- Classifier: Programming Language :: Python :: 3.8
37
- Classifier: Programming Language :: Python :: 3.9
38
34
  Classifier: Programming Language :: Python :: 3.10
39
35
  Classifier: Programming Language :: Python :: 3.11
36
+ Classifier: Programming Language :: Python :: 3.12
37
+ Classifier: Programming Language :: Python :: 3.13
38
+ Classifier: Programming Language :: Python :: 3.14
40
39
  Classifier: License :: OSI Approved :: MIT License
41
- Requires-Python: >=3.6
40
+ Requires-Python: >=3.10
42
41
  Description-Content-Type: text/markdown
43
42
  License-File: LICENSE
44
43
  Provides-Extra: azuremonitor
45
- Requires-Dist: azure-monitor-events-extension<2.0.0; extra == "azuremonitor"
46
- Dynamic: author
47
- Dynamic: home-page
44
+ Requires-Dist: opentelemetry-sdk~=1.20; extra == "azuremonitor"
45
+ Provides-Extra: test
46
+ Requires-Dist: azure-monitor-opentelemetry<2.0.0; extra == "test"
47
+ Provides-Extra: dev
48
+ Requires-Dist: pytest<10.0.0,>=7.0.0; extra == "dev"
49
+ Requires-Dist: pytest-cov<8.0.0,>=4.0.0; extra == "dev"
50
+ Requires-Dist: pytest-asyncio<2.0.0,>=0.21.0; extra == "dev"
51
+ Requires-Dist: black<27.0.0,>=23.0.0; extra == "dev"
52
+ Requires-Dist: pylint<5.0.0,>=3.0.0; extra == "dev"
53
+ Requires-Dist: mypy<2.0.0,>=1.0.0; extra == "dev"
54
+ Requires-Dist: sphinx<10.0.0,>=7.0.0; extra == "dev"
55
+ Requires-Dist: sphinx_rtd_theme<4.0.0,>=2.0.0; extra == "dev"
56
+ Requires-Dist: sphinx-toolbox<5.0.0,>=3.0.0; extra == "dev"
57
+ Requires-Dist: myst_parser<6.0.0,>=2.0.0; extra == "dev"
58
+ Requires-Dist: opentelemetry-api~=1.20; extra == "dev"
59
+ Requires-Dist: opentelemetry-sdk~=1.20; extra == "dev"
48
60
  Dynamic: license-file
49
- Dynamic: requires-python
50
61
 
51
62
  # Microsoft Feature Management for Python
52
63
 
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Feature management library for Python."""
7
+
6
8
  from ._featuremanager import FeatureManager
7
9
  from ._featurefilters import FeatureFilter
8
10
  from ._defaultfilters import TimeWindowFilter, TargetingFilter
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Built-in feature filter implementations."""
7
+
6
8
  import logging
7
9
  import hashlib
8
10
  from datetime import datetime, timezone
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Base class for feature filters."""
7
+
6
8
  from abc import ABC, abstractmethod
7
9
  from typing import Mapping, Callable, Any, Optional
8
10
 
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Synchronous feature manager implementation."""
7
+
6
8
  import logging
7
9
  from typing import cast, overload, Any, Optional, Dict, Mapping, List, Tuple
8
10
  from ._defaultfilters import TimeWindowFilter, TargetingFilter
@@ -3,13 +3,14 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Base class for feature manager implementations."""
7
+
6
8
  import hashlib
7
9
  import logging
8
10
  from abc import ABC
9
- from typing import List, Optional, Dict, Tuple, Any, Mapping, Callable
11
+ from typing import List, Optional, Dict, Tuple, Any, Mapping, Callable, cast
10
12
  from ._models import FeatureFlag, Variant, VariantAssignmentReason, TargetingContext, EvaluationEvent, VariantReference
11
13
 
12
-
13
14
  FEATURE_MANAGEMENT_KEY = "feature_management"
14
15
  FEATURE_FLAG_KEY = "feature_flags"
15
16
 
@@ -24,50 +25,6 @@ FEATURE_FILTER_PARAMETERS = "parameters"
24
25
  logger = logging.getLogger(__name__)
25
26
 
26
27
 
27
- def _get_feature_flag(configuration: Mapping[str, Any], feature_flag_name: str) -> Optional[FeatureFlag]:
28
- """
29
- Gets the FeatureFlag json from the configuration, if it exists it gets converted to a FeatureFlag object.
30
-
31
- :param Mapping configuration: Configuration object.
32
- :param str feature_flag_name: Name of the feature flag.
33
- :return: FeatureFlag
34
- :rtype: FeatureFlag
35
- """
36
- feature_management = configuration.get(FEATURE_MANAGEMENT_KEY)
37
- if not feature_management or not isinstance(feature_management, Mapping):
38
- return None
39
- feature_flags = feature_management.get(FEATURE_FLAG_KEY)
40
- if not feature_flags or not isinstance(feature_flags, list):
41
- return None
42
-
43
- for feature_flag in feature_flags:
44
- if feature_flag.get("id") == feature_flag_name:
45
- return FeatureFlag.convert_from_json(feature_flag)
46
-
47
- return None
48
-
49
-
50
- def _list_feature_flag_names(configuration: Mapping[str, Any]) -> List[str]:
51
- """
52
- List of all feature flag names.
53
-
54
- :param Mapping configuration: Configuration object.
55
- :return: List of feature flag names.
56
- """
57
- feature_flag_names = []
58
- feature_management = configuration.get(FEATURE_MANAGEMENT_KEY)
59
- if not feature_management or not isinstance(feature_management, Mapping):
60
- return []
61
- feature_flags = feature_management.get(FEATURE_FLAG_KEY)
62
- if not feature_flags or not isinstance(feature_flags, list):
63
- return []
64
-
65
- for feature_flag in feature_flags:
66
- feature_flag_names.append(feature_flag.get("id"))
67
-
68
- return feature_flag_names
69
-
70
-
71
28
  class FeatureManagerBase(ABC):
72
29
  """
73
30
  Base class for Feature Manager. This class is responsible for all shared logic between the sync and async.
@@ -272,7 +229,7 @@ class FeatureManagerBase(ABC):
272
229
  self._copy = self._configuration.get(FEATURE_MANAGEMENT_KEY)
273
230
 
274
231
  if not self._cache.get(feature_flag_id):
275
- feature_flag = _get_feature_flag(self._configuration, feature_flag_id)
232
+ feature_flag = self._get_feature_flag(feature_flag_id)
276
233
  self._cache[feature_flag_id] = feature_flag
277
234
  else:
278
235
  feature_flag = self._cache.get(feature_flag_id)
@@ -299,4 +256,41 @@ class FeatureManagerBase(ABC):
299
256
  """
300
257
  List of all feature flag names.
301
258
  """
302
- return _list_feature_flag_names(self._configuration)
259
+ feature_flag_names: Dict[str, None] = {}
260
+ for feature_flag in self._get_feature_flags():
261
+ feature_flag_name = feature_flag.get("id")
262
+ # Only include entries with a valid string id; duplicates are listed once.
263
+ if isinstance(feature_flag_name, str):
264
+ feature_flag_names[feature_flag_name] = None
265
+
266
+ return list(feature_flag_names)
267
+
268
+ def _get_feature_flag(self, feature_flag_name: str) -> Optional[FeatureFlag]:
269
+ """
270
+ Gets the FeatureFlag json from the configuration, if it exists it gets converted to a FeatureFlag object.
271
+
272
+ :param str feature_flag_name: Name of the feature flag.
273
+ :return: FeatureFlag
274
+ :rtype: FeatureFlag
275
+ """
276
+ for feature_flag in reversed(self._get_feature_flags()):
277
+ # If multiple feature flags share the same id, the last one defined wins.
278
+ if feature_flag.get("id") == feature_flag_name:
279
+ return FeatureFlag.convert_from_json(feature_flag)
280
+
281
+ return None
282
+
283
+ def _get_feature_flags(self) -> List[Any]:
284
+ """
285
+ Gets the list of raw feature flag definitions from the configuration.
286
+
287
+ :return: List of feature flag definitions, or an empty list if none are configured.
288
+ :rtype: list
289
+ """
290
+ feature_management = self._configuration.get(FEATURE_MANAGEMENT_KEY)
291
+ if not feature_management or not isinstance(feature_management, Mapping):
292
+ return []
293
+ feature_flags = feature_management.get(FEATURE_FLAG_KEY)
294
+ if not feature_flags or not isinstance(feature_flags, list):
295
+ return []
296
+ return cast(List[Any], feature_flags)
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Data models for feature management."""
7
+
6
8
  from ._feature_flag import FeatureFlag
7
9
  from ._variant import Variant
8
10
  from ._evaluation_event import EvaluationEvent
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Allocation model for feature variant assignment."""
7
+
6
8
  from typing import cast, List, Optional, Mapping, Dict, Any, Union
7
9
  from dataclasses import dataclass
8
10
  from ._constants import DEFAULT_WHEN_ENABLED, DEFAULT_WHEN_DISABLED, USER, GROUP, PERCENTILE, SEED
@@ -3,6 +3,7 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Constants used by feature management models."""
6
7
 
7
8
  # Feature Flag
8
9
  FEATURE_FLAG_ID = "id"
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Evaluation event model for feature flag telemetry."""
7
+
6
8
  from dataclasses import dataclass
7
9
  from typing import Optional
8
10
  from ._feature_flag import FeatureFlag
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Feature flag condition models."""
7
+
6
8
  from collections.abc import Mapping
7
9
  from typing import Any, Dict, List
8
10
  from ._constants import (
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Feature flag model."""
7
+
6
8
  from typing import cast, List, Union, Optional, Mapping, Any
7
9
  from ._feature_conditions import FeatureConditions
8
10
  from ._allocation import Allocation
@@ -3,6 +3,7 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
+ """Targeting context model for user and group targeting."""
6
7
 
7
8
  from typing import NamedTuple, List
8
9
 
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Telemetry metadata model."""
7
+
6
8
  from typing import Dict
7
9
  from dataclasses import dataclass, field
8
10
 
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Variant model representing a feature flag variant."""
7
+
6
8
  from typing import Any
7
9
 
8
10
 
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Enum for variant assignment reasons."""
7
+
6
8
  from enum import Enum
7
9
 
8
10
 
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Variant reference model."""
7
+
6
8
  from dataclasses import dataclass
7
9
  from typing import Optional, Mapping, Any
8
10
  from ._constants import VARIANT_REFERENCE_NAME, CONFIGURATION_VALUE, STATUS_OVERRIDE
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Time window filter with recurrence support."""
7
+
6
8
  from ._recurrence_evaluator import is_match
7
9
  from ._models import Recurrence, TimeWindowFilterSettings
8
10
 
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Data models for the time window filter."""
7
+
6
8
  from enum import Enum
7
9
  from typing import Dict, Any, Optional, List
8
10
  from datetime import datetime
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Recurrence evaluation logic for the time window filter."""
7
+
6
8
  from datetime import datetime, timedelta
7
9
  from typing import Optional
8
10
  from ._models import RecurrencePatternType, RecurrenceRangeType, TimeWindowFilterSettings, OccurrenceInfo, Recurrence
@@ -3,11 +3,12 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Validation logic for recurrence settings."""
7
+
6
8
  from datetime import datetime, timedelta
7
9
  from typing import List
8
10
  from ._models import RecurrencePatternType, RecurrenceRangeType, Recurrence, RecurrencePattern, RecurrenceRange
9
11
 
10
-
11
12
  DAYS_PER_WEEK = 7
12
13
  TEN_YEARS = 3650
13
14
  RECURRENCE_PATTERN = "Pattern"
@@ -3,5 +3,6 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Package version."""
6
7
 
7
- VERSION = "2.1.0"
8
+ VERSION = "2.2.0"
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Async feature management support."""
7
+
6
8
  from ._featuremanager import FeatureManager
7
9
  from ._featurefilters import FeatureFilter
8
10
  from ._defaultfilters import TimeWindowFilter, TargetingFilter
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Built-in async feature filter implementations."""
7
+
6
8
  from typing import Mapping, Any
7
9
  from ._featurefilters import FeatureFilter
8
10
  from .._defaultfilters import (
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Base class for async feature filters."""
7
+
6
8
  from abc import ABC, abstractmethod
7
9
  from typing import Mapping, Callable, Any, Optional
8
10
 
@@ -3,6 +3,8 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
+ """Async feature manager implementation."""
7
+
6
8
  import inspect
7
9
  import logging
8
10
  from typing import cast, overload, Any, Optional, Dict, Mapping, List, Tuple
@@ -3,8 +3,9 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
- from ._send_telemetry import publish_telemetry, track_event, TargetingSpanProcessor
6
+ """Azure Monitor telemetry integration for feature management."""
7
7
 
8
+ from ._send_telemetry import publish_telemetry, track_event, TargetingSpanProcessor
8
9
 
9
10
  __all__ = [
10
11
  "publish_telemetry",