Skip to content
Open
Show file tree
Hide file tree
Changes from 2 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 demoes
Comment thread
michael-linnane-lrn marked this conversation as resolved.
Outdated

### 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):
Comment thread
michael-linnane-lrn marked this conversation as resolved.
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