diff --git a/ChangeLog.md b/ChangeLog.md index 15c44a3..e317ca6 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -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. diff --git a/learnosity_sdk/request/init.py b/learnosity_sdk/request/init.py index 1f0ead1..a6ba66e 100644 --- a/learnosity_sdk/request/init.py +++ b/learnosity_sdk/request/init.py @@ -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 @@ -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: @@ -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() @@ -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'] = { diff --git a/setup.py b/setup.py index 52f531f..ddde1a6 100644 --- a/setup.py +++ b/setup.py @@ -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: @@ -27,6 +27,7 @@ 'responses >=0.8.1', 'types-requests', 'types-Jinja2', + 'types-setuptools', 'mypy', ]