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.
- {featuremanagement-2.1.0 → featuremanagement-2.2.0/FeatureManagement.egg-info}/PKG-INFO +21 -10
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/FeatureManagement.egg-info/SOURCES.txt +1 -21
- featuremanagement-2.2.0/FeatureManagement.egg-info/requires.txt +20 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/FeatureManagement.egg-info/top_level.txt +0 -1
- {featuremanagement-2.1.0/FeatureManagement.egg-info → featuremanagement-2.2.0}/PKG-INFO +21 -10
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/__init__.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_defaultfilters.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_featurefilters.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_featuremanager.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_featuremanagerbase.py +42 -48
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/__init__.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_allocation.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_constants.py +1 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_evaluation_event.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_feature_conditions.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_feature_flag.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_targeting_context.py +1 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_telemetry.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_variant.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_variant_assignment_reason.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_variant_reference.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_time_window_filter/__init__.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_time_window_filter/_models.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_time_window_filter/_recurrence_evaluator.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_time_window_filter/_recurrence_validator.py +2 -1
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_version.py +2 -1
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/aio/__init__.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/aio/_defaultfilters.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/aio/_featurefilters.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/aio/_featuremanager.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/azuremonitor/__init__.py +2 -1
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/azuremonitor/_send_telemetry.py +37 -12
- featuremanagement-2.2.0/pyproject.toml +78 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_default_feature_flags.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_default_feature_flags_async.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_feature_manager.py +32 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_feature_manager_async.py +34 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_feature_manager_refresh.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_feature_variants.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_feature_variants_async.py +2 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/tests/test_send_telemetry_appinsights.py +110 -62
- featuremanagement-2.1.0/CHANGELOG.md +0 -3
- featuremanagement-2.1.0/CODE_OF_CONDUCT.md +0 -9
- featuremanagement-2.1.0/FeatureManagement.egg-info/not-zip-safe +0 -1
- featuremanagement-2.1.0/FeatureManagement.egg-info/requires.txt +0 -3
- featuremanagement-2.1.0/MANIFEST.in +0 -6
- featuremanagement-2.1.0/SECURITY.md +0 -41
- featuremanagement-2.1.0/SUPPORT.md +0 -25
- featuremanagement-2.1.0/pyproject.toml +0 -47
- featuremanagement-2.1.0/samples/feature_flag_sample.py +0 -34
- featuremanagement-2.1.0/samples/feature_flag_with_azure_app_configuration_sample.py +0 -46
- featuremanagement-2.1.0/samples/feature_variant_sample.py +0 -25
- featuremanagement-2.1.0/samples/feature_variant_sample_with_targeting_accessor.py +0 -36
- featuremanagement-2.1.0/samples/feature_variant_sample_with_telemetry.py +0 -36
- featuremanagement-2.1.0/samples/formatted_feature_flags.json +0 -230
- featuremanagement-2.1.0/samples/quarty_sample.py +0 -60
- featuremanagement-2.1.0/samples/random_filter.py +0 -21
- featuremanagement-2.1.0/setup.py +0 -64
- featuremanagement-2.1.0/tests/__init__.py +0 -0
- featuremanagement-2.1.0/tests/time_window_filter/test_recurrence_evaluator.py +0 -281
- featuremanagement-2.1.0/tests/time_window_filter/test_recurrence_validator.py +0 -321
- featuremanagement-2.1.0/tests/time_window_filter/test_time_window_filter_models.py +0 -133
- featuremanagement-2.1.0/tests/validation_tests/test_json_validations.py +0 -101
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/FeatureManagement.egg-info/dependency_links.txt +0 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/LICENSE +0 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/README.md +0 -0
- {featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/py.typed +0 -0
- {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.
|
|
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.
|
|
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:
|
|
46
|
-
|
|
47
|
-
|
|
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.
|
|
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.
|
|
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:
|
|
46
|
-
|
|
47
|
-
|
|
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
|
{featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_featuremanagerbase.py
RENAMED
|
@@ -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(
|
|
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
|
-
|
|
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
|
{featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_allocation.py
RENAMED
|
@@ -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"
|
{featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_evaluation_event.py
RENAMED
|
@@ -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
|
{featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_feature_conditions.py
RENAMED
|
@@ -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 (
|
{featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_feature_flag.py
RENAMED
|
@@ -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
|
{featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_targeting_context.py
RENAMED
|
@@ -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
|
|
{featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_models/_variant_reference.py
RENAMED
|
@@ -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
|
|
{featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/_time_window_filter/_models.py
RENAMED
|
@@ -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,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
|
{featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/aio/_defaultfilters.py
RENAMED
|
@@ -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 (
|
{featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/aio/_featurefilters.py
RENAMED
|
@@ -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
|
|
{featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/aio/_featuremanager.py
RENAMED
|
@@ -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
|
{featuremanagement-2.1.0 → featuremanagement-2.2.0}/featuremanagement/azuremonitor/__init__.py
RENAMED
|
@@ -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
|
-
|
|
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",
|