Skip to content
Open
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
9 changes: 9 additions & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).

## [unreleased] - 2025-12-11
### Added
- Added Data API configuration to request signatures
- Added Data API Demo to standalone demos

### Fixed
- Fixed mypy errors failing lint check on ci build
- Fixed missing import on setuptools types for testing

## [v0.3.12] - 2024-11-22
### Added
- Added pre-commit hooks and Github CI action for code formatting and linting.
Expand Down
14 changes: 7 additions & 7 deletions learnosity_sdk/request/init.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,14 @@ def generate(self, encode: bool = True) -> Union[str, Dict[str, Any]]:
del output['domain']

# Stringify the request packet if necessary
if self.request is not None:
if isinstance(self.request, dict):
output.update(self.request)

elif self.service == 'events':
output['security'] = self.security
output['config'] = self.request
elif self.service == 'assess':
if self.request is not None:
if isinstance(self.request, dict):
output.update(self.request)
elif self.service == 'data':
# We ignore the encode param for data API
Expand Down Expand Up @@ -193,7 +193,7 @@ def set_service_options(self) -> None:
elif self.service == 'assess':
self.sign_request_data = False

if self.request is not None and 'questionsApiActivity' in self.request:
if isinstance(self.request, dict) and 'questionsApiActivity' in self.request and isinstance(self.request['questionsApiActivity'], dict):
questionsApi = self.request['questionsApiActivity']

if 'domain' in self.security:
Expand Down Expand Up @@ -223,13 +223,13 @@ def set_service_options(self) -> None:
self.request['questionsApiActivity'].update(questionsApi)

elif self.service == 'items' or self.service == 'reports':
if self.request is not None and ('user_id' not in self.security and 'user_id' in self.request):
if isinstance(self.request, dict) and ('user_id' not in self.security and 'user_id' in self.request):
self.security['user_id'] = self.request['user_id']

elif self.service == 'events':
self.sign_request_data = False
hashed_users = {}
users = self.request.get('users', []) if self.request is not None else []
users = self.request.get('users', []) if isinstance(self.request, dict) else []
for user in users:
concat = "{}{}".format(user, self.secret)
hashed_users[user] = hashlib.sha256(concat.encode('utf-8')).hexdigest()
Expand All @@ -244,8 +244,8 @@ def hash_list(self, l: Iterable[Any]) -> str:
return '$02$' + signature

def add_telemetry_data(self) -> None:
if self.request is not None and self.__telemetry_enabled:
if 'meta' in self.request:
if isinstance(self.request, dict) and self.__telemetry_enabled:
if 'meta' in self.request and isinstance(self.request['meta'], dict):
self.request['meta']['sdk'] = self.get_sdk_meta()
else:
self.request['meta'] = {
Expand Down
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import setuptools

# Loads __version__ using exec as setup.py can't import its own package
version = {}
version: dict[str, str] = {}
version_file = 'learnosity_sdk/_version.py'
exec(open(version_file).read(), { '__builtins__': None }, version)
if '__version__' not in version:
Expand All @@ -27,6 +27,7 @@
'responses >=0.8.1',
'types-requests',
'types-Jinja2',
'types-setuptools',
'mypy',
]

Expand Down