Skip to content

Commit 59711ca

Browse files
authored
Feat/v1.1.6 (#12)
* feat: opt flag change listener * bug fix and compatibility with 3.12
1 parent c97af1f commit 59711ca

File tree

8 files changed

+25
-24
lines changed

8 files changed

+25
-24
lines changed

.github/workflows/code-quality.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
strategy:
1515
# You can use PyPy versions in python-version.
1616
matrix:
17-
python-version: ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11"]
17+
python-version: ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
1818

1919
steps:
2020
- uses: actions/checkout@v3

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ Note that a flag value change listener is bound to a specific user and flag key.
165165
The flag value change listener will be notified whenever the SDK receives any change to any feature flag's configuration,
166166
or to a user segment that is referenced by a feature flag. To register a flag value change listener, use `add_flag_value_may_changed_listener` or `add_flag_value_changed_listener`
167167

168-
When you track a flag change using `add_flag_value_may_changed_listener`, this does not necessarily mean the flag's value has changed for any particular flag, only that some part of the flag configuration was changed so that it *_MAY_* return a different value than it previously returned for some user.
168+
When you track a flag change using `add_flag_value_maybe_changed_listener`, this does not necessarily mean the flag's value has changed for any particular flag, only that some part of the flag configuration was changed so that it *_MAY_* return a different value than it previously returned for some user.
169169

170170
If you want to track a flag whose value *_MUST_* be changed, `add_flag_value_changed_listener` will register a listener that will be notified if and only if the flag value changes.
171171

@@ -175,9 +175,9 @@ If the SDK is in offline mode, then it cannot know when there is a change, becau
175175
```python
176176
if client.initialize:
177177
# flag value may be changed
178-
client.flag_tracker.add_flag_value_may_changed_listener(flag_key, user, callback_fn)
178+
client.flag_tracker.add_flag_value_maybe_changed_listener(flag_key, user, flag_value_maybe_changed_callback_fn)
179179
# flag value must be changed
180-
client.flag_tracker.add_flag_value_changed_listener(flag_key, user, callback_fn)
180+
client.flag_tracker.add_flag_value_changed_listener(flag_key, user, flag_value_changed_callback_fn)
181181

182182
```
183183
`flag_key`: the key of the feature flag to track

fbclient/client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ def track_metric(self, user: dict, event_name: str, metric_value: float = 1.0):
343343
:param event_name: the name of the event, which may correspond to a goal in A/B tests
344344
:param metric_value: a numeric value used by the experiment, default value is 1.0
345345
"""
346-
if not event_name or metric_value <= 0:
346+
if not event_name:
347347
log.warning('FB Python SDK: event/metric invalid')
348348
return
349349
try:
@@ -375,7 +375,7 @@ def track_metrics(self, user: dict, metrics: Mapping[str, float]):
375375

376376
metric_event = MetricEvent(fb_user)
377377
for event_name, metric_value in metrics.items():
378-
if event_name and metric_value > 0:
378+
if event_name:
379379
metric_event.add(Metric(event_name, metric_value))
380380
self._event_handler(metric_event)
381381

fbclient/flag_change_notification.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def __init__(self,
3838
flag_key: str,
3939
user: dict,
4040
evaluate_fn: Callable[[str, dict, Any], Any],
41-
flag_value_changed_fn: Callable[[str, Any], None]):
41+
flag_value_changed_fn: Callable[[str, Any, Any], None]):
4242
self.__flag_key = flag_key
4343
self.__user = user
4444
self.__evaluate_fn = evaluate_fn
@@ -51,20 +51,20 @@ def on_flag_change(self, notice: FlagChangedNotice):
5151
prev_flag_value = self.__prvious_flag_value
5252
curr_flag_value = self.__evaluate_fn(self.__flag_key, self.__user, None)
5353
if prev_flag_value != curr_flag_value:
54-
self.__fn(self.__flag_key, curr_flag_value)
54+
self.__fn(self.__flag_key, prev_flag_value, curr_flag_value)
5555
self.__prvious_flag_value = curr_flag_value
5656

5757

58-
class FlagValueMayChangedListener(FlagChangedListener):
58+
class FlagValueMaybeChangedListener(FlagChangedListener):
5959
def __init__(self,
6060
flag_key: str,
6161
user: dict,
6262
evaluate_fn: Callable[[str, dict, Any], Any],
63-
flag_value_changed_fn: Callable[[str, Any], None]):
63+
flag_value_maybe_changed_fn: Callable[[str, Any], None]):
6464
self.__flag_key = flag_key
6565
self.__user = user
6666
self.__evaluate_fn = evaluate_fn
67-
self.__fn = flag_value_changed_fn
67+
self.__fn = flag_value_maybe_changed_fn
6868

6969
def on_flag_change(self, notice: FlagChangedNotice):
7070
if notice.flag_key == self.__flag_key:
@@ -95,7 +95,7 @@ def __init__(self,
9595
def add_flag_value_changed_listener(self,
9696
flag_key: str,
9797
user: dict,
98-
flag_value_changed_fn: Callable[[str, Any], None]) -> FlagValueChangedListener:
98+
flag_value_changed_fn: Callable[[str, Any, Any], None]) -> FlagValueChangedListener:
9999
"""
100100
Registers a listener to be notified of a change in a specific feature flag's value for a specific FeatBit user.
101101
@@ -110,7 +110,8 @@ def add_flag_value_changed_listener(self,
110110
:param user: The user to evaluate the flag value
111111
:param flag_value_changed_fn: The function to be called only when this flag value changes
112112
* the first argument is the flag key
113-
* the second argument is the latest flag value, this value must be different from the previous value
113+
* the second argument is the previous flag value
114+
* the third argument is the current flag value
114115
115116
:return: A listener object that can be used to remove it later on.
116117
"""
@@ -128,10 +129,10 @@ def add_flag_value_changed_listener(self,
128129
self.add_flag_changed_listener(listener)
129130
return listener
130131

131-
def add_flag_value_may_changed_listener(self,
132-
flag_key: str,
133-
user: dict,
134-
flag_value_changed_fn: Callable[[str, Any], None]) -> FlagValueMayChangedListener:
132+
def add_flag_value_maybe_changed_listener(self,
133+
flag_key: str,
134+
user: dict,
135+
flag_value_maybe_changed_fn: Callable[[str, Any], None]) -> FlagValueMaybeChangedListener:
135136
"""
136137
Registers a listener to be notified of a change in a specific feature flag's value for a specific FeatBit user.
137138
@@ -145,7 +146,7 @@ def add_flag_value_may_changed_listener(self,
145146
146147
:param flag_key: The key of the feature flag to track
147148
:param user: The user to evaluate the flag value
148-
:param flag_value_changed_fn: The function to be called only if any changes to a specific flag
149+
:param flag_value_maybe_changed_fn: The function to be called if any changes to a specific flag
149150
* the first argument is the flag key
150151
* the second argument is the latest flag value, this value may be same as the previous value
151152
@@ -159,10 +160,10 @@ def add_flag_value_may_changed_listener(self,
159160
# check user
160161
FBUser.from_dict(user)
161162
# check flag_value_changed_fn
162-
if not isinstance(flag_value_changed_fn, Callable) or not flag_value_changed_fn:
163+
if not isinstance(flag_value_maybe_changed_fn, Callable) or not flag_value_maybe_changed_fn:
163164
raise ValueError('flag_value_changed_fn must be a callable function')
164165

165-
listener = FlagValueMayChangedListener(flag_key, user, self.__evaluate_fn, flag_value_changed_fn)
166+
listener = FlagValueMaybeChangedListener(flag_key, user, self.__evaluate_fn, flag_value_maybe_changed_fn)
166167
self.add_flag_changed_listener(listener)
167168
return listener
168169

fbclient/utils/rwlock.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def release_read_lock(self):
2525
with self._read_ready:
2626
self._readers = self._readers - 1 if self._readers > 0 else 0
2727
if self._readers == 0:
28-
self._read_ready.notifyAll()
28+
self._read_ready.notify_all()
2929

3030
def write_lock(self):
3131
""" Acquire a write lock. Blocks until there are no

fbclient/version.py

Lines changed: 0 additions & 1 deletion
This file was deleted.

release/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"version":"1.1.5"
2+
"version":"1.1.6"
33
}

setup.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,11 @@ def parse_requirements(filename):
5050
'Programming Language :: Python :: 3.9',
5151
'Programming Language :: Python :: 3.10',
5252
'Programming Language :: Python :: 3.11',
53+
'Programming Language :: Python :: 3.12',
5354
],
5455
extras_require={
5556
"dev": dev_reqs
5657
},
5758
tests_require=dev_reqs,
58-
python_requires='>=3.6, <=3.11'
59+
python_requires='>=3.6, <=3.12'
5960
)

0 commit comments

Comments
 (0)