Skip to content

Update sync and api classes #559

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
'flake8',
'pytest==7.0.1',
'pytest-mock==3.11.1',
'coverage',
'coverage==7.0.0',
'pytest-cov==4.1.0',
'importlib-metadata==6.7',
'tomli==1.2.3',
Expand All @@ -17,7 +17,8 @@
'pytest-asyncio==0.21.0',
'aiohttp>=3.8.4',
'aiofiles>=23.1.0',
'requests-kerberos>=0.15.0'
'requests-kerberos>=0.15.0',
'urllib3==2.2.0'
]

INSTALL_REQUIRES = [
Expand Down
20 changes: 18 additions & 2 deletions splitio/api/commons.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def record_telemetry(status_code, elapsed, metric_name, telemetry_runtime_produc
class FetchOptions(object):
"""Fetch Options object."""

def __init__(self, cache_control_headers=False, change_number=None, sets=None, spec=SPEC_VERSION):
def __init__(self, cache_control_headers=False, change_number=None, rbs_change_number=None, sets=None, spec=SPEC_VERSION):
"""
Class constructor.

Expand All @@ -72,6 +72,7 @@ def __init__(self, cache_control_headers=False, change_number=None, sets=None, s
"""
self._cache_control_headers = cache_control_headers
self._change_number = change_number
self._rbs_change_number = rbs_change_number
self._sets = sets
self._spec = spec

Expand All @@ -85,6 +86,11 @@ def change_number(self):
"""Return change number."""
return self._change_number

@property
def rbs_change_number(self):
"""Return change number."""
return self._rbs_change_number

@property
def sets(self):
"""Return sets."""
Expand All @@ -103,14 +109,19 @@ def __eq__(self, other):
if self._change_number != other._change_number:
return False

if self._rbs_change_number != other._rbs_change_number:
return False

if self._sets != other._sets:
return False

if self._spec != other._spec:
return False

return True


def build_fetch(change_number, fetch_options, metadata):
def build_fetch(change_number, fetch_options, metadata, rbs_change_number=None):
"""
Build fetch with new flags if that is the case.

Expand All @@ -123,11 +134,16 @@ def build_fetch(change_number, fetch_options, metadata):
:param metadata: Metadata Headers.
:type metadata: dict

:param rbs_change_number: Last known timestamp of a rule based segment modification.
:type rbs_change_number: int

:return: Objects for fetch
:rtype: dict, dict
"""
query = {'s': fetch_options.spec} if fetch_options.spec is not None else {}
query['since'] = change_number
if rbs_change_number is not None:
query['rbSince'] = rbs_change_number
extra_headers = metadata
if fetch_options is None:
return query, extra_headers
Expand Down
14 changes: 10 additions & 4 deletions splitio/api/splits.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,21 +31,24 @@ def __init__(self, client, sdk_key, sdk_metadata, telemetry_runtime_producer):
self._telemetry_runtime_producer = telemetry_runtime_producer
self._client.set_telemetry_data(HTTPExceptionsAndLatencies.SPLIT, self._telemetry_runtime_producer)

def fetch_splits(self, change_number, fetch_options):
def fetch_splits(self, change_number, rbs_change_number, fetch_options):
"""
Fetch feature flags from backend.

:param change_number: Last known timestamp of a split modification.
:type change_number: int

:param rbs_change_number: Last known timestamp of a rule based segment modification.
:type rbs_change_number: int

:param fetch_options: Fetch options for getting feature flag definitions.
:type fetch_options: splitio.api.commons.FetchOptions

:return: Json representation of a splitChanges response.
:rtype: dict
"""
try:
query, extra_headers = build_fetch(change_number, fetch_options, self._metadata)
query, extra_headers = build_fetch(change_number, fetch_options, self._metadata, rbs_change_number)
response = self._client.get(
'sdk',
'splitChanges',
Expand Down Expand Up @@ -86,12 +89,15 @@ def __init__(self, client, sdk_key, sdk_metadata, telemetry_runtime_producer):
self._telemetry_runtime_producer = telemetry_runtime_producer
self._client.set_telemetry_data(HTTPExceptionsAndLatencies.SPLIT, self._telemetry_runtime_producer)

async def fetch_splits(self, change_number, fetch_options):
async def fetch_splits(self, change_number, rbs_change_number, fetch_options):
"""
Fetch feature flags from backend.

:param change_number: Last known timestamp of a split modification.
:type change_number: int

:param rbs_change_number: Last known timestamp of a rule based segment modification.
:type rbs_change_number: int

:param fetch_options: Fetch options for getting feature flag definitions.
:type fetch_options: splitio.api.commons.FetchOptions
Expand All @@ -100,7 +106,7 @@ async def fetch_splits(self, change_number, fetch_options):
:rtype: dict
"""
try:
query, extra_headers = build_fetch(change_number, fetch_options, self._metadata)
query, extra_headers = build_fetch(change_number, fetch_options, self._metadata, rbs_change_number)
response = await self._client.get(
'sdk',
'splitChanges',
Expand Down
Loading