diff --git a/.trunk/configs/.cspell.json b/.trunk/configs/.cspell.json index ccdbc4d4..59538e69 100644 --- a/.trunk/configs/.cspell.json +++ b/.trunk/configs/.cspell.json @@ -123,6 +123,9 @@ "Doctests", "linenums", "XLYOFNOQVPJJNP", - "CRIPTUUID" + "CRIPTUUID", + "rootdir", + "startswith", + "pluggy" ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index c6157326..304380ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,94 @@ # CRIPT Python SDK Changelog +## Version 2.4.0 + +### New Features + +- `cript.API` searches work as intended. +- SDK initiated searches can be controlled and interrupted for large queries. + +### Known Issues and Bugs + +- Saving projects is not supported. Temporarily, you can use `get_expanded_json` to store a JSON representation of projects, which can be uploaded into CRIPT at a later time. +- Permission settings in CRIPT do not influence the behavior of the SDK objects. +- Tests that require valid tokens (like saving or searching) are not included in CI/CD tests. +- BigSMILES searches can contain duplicates. + +### Bug Fixes + +- Search is now matched with the API requirements. + +### Breaking Changes + +- The Paginator interface changed to reflect the backend requirements. + +### Health Report + +````shell +=============================================================================================== test session starts =============================================================================================== +platform linux -- Python 3.11.2, pytest-7.4.3, pluggy-1.3.0 +rootdir: /home/ludwig/git/Python-SDK +plugins: cov-4.1.0 +collected 124 items + +tests/test_node_util.py ........... [ 8%] +tests/api/test_api.py ..... [ 12%] +tests/api/test_db_schema.py ..... [ 16%] +tests/api/test_search.py .....F [ 21%] +tests/nodes/test_utils.py .. [ 23%] +tests/nodes/primary_nodes/test_collection.py .....F [ 28%] +tests/nodes/primary_nodes/test_computation.py .....F [ 33%] +tests/nodes/primary_nodes/test_computational_process.py ....F [ 37%] +tests/nodes/primary_nodes/test_data.py ....F [ 41%] +tests/nodes/primary_nodes/test_experiment.py ....F [ 45%] +tests/nodes/primary_nodes/test_inventory.py ..F [ 47%] +tests/nodes/primary_nodes/test_material.py ...F [ 50%] +tests/nodes/primary_nodes/test_process.py .....F [ 55%] +tests/nodes/primary_nodes/test_project.py ...F [ 58%] +tests/nodes/primary_nodes/test_reference.py ......F [ 64%] +tests/nodes/subobjects/test_algorithm.py ..F [ 66%] +tests/nodes/subobjects/test_citation.py ..F [ 69%] +tests/nodes/subobjects/test_computational_forcefield.py ..F [ 71%] +tests/nodes/subobjects/test_condition.py ..F [ 74%] +tests/nodes/subobjects/test_equipment.py ..F [ 76%] +tests/nodes/subobjects/test_ingredient.py ..F [ 79%] +tests/nodes/subobjects/test_parameter.py ..F [ 81%] +tests/nodes/subobjects/test_property.py ..F [ 83%] +tests/nodes/subobjects/test_quantity.py ..F [ 86%] +tests/nodes/subobjects/test_software.py ...F [ 89%] +tests/nodes/subobjects/test_software_configuration.py ..F [ 91%] +tests/nodes/supporting_nodes/test_file.py ..s....F [ 98%] +tests/nodes/supporting_nodes/test_user.py .. + +FAILED tests/nodes/primary_nodes/test_collection.py::test_integration_collection - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/primary_nodes/test_computation.py::test_integration_computation - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/primary_nodes/test_computational_process.py::test_integration_computational_process - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/primary_nodes/test_data.py::test_integration_data - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/primary_nodes/test_experiment.py::test_integration_experiment - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/primary_nodes/test_inventory.py::test_integration_inventory - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/primary_nodes/test_material.py::test_integration_material - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/primary_nodes/test_process.py::test_integration_complex_process - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/primary_nodes/test_project.py::test_integration_project - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/primary_nodes/test_reference.py::test_integration_reference - IndexError: list index out of range +FAILED tests/nodes/subobjects/test_algorithm.py::test_integration_algorithm - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/subobjects/test_citation.py::test_integration_citation - IndexError: list index out of range +FAILED tests/nodes/subobjects/test_computational_forcefield.py::test_integration_computational_forcefield - AttributeError: 'NoneType' object has no attribute 'description' +FAILED tests/nodes/subobjects/test_condition.py::test_integration_process_condition - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/subobjects/test_equipment.py::test_integration_equipment - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/subobjects/test_ingredient.py::test_integration_ingredient - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/subobjects/test_parameter.py::test_integration_parameter - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/subobjects/test_property.py::test_integration_material_property - IndexError: list index out of range +FAILED tests/nodes/subobjects/test_quantity.py::test_integration_quantity - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/subobjects/test_software.py::test_integration_software - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/subobjects/test_software_configuration.py::test_integration_software_configuration - AttributeError: 'list' object has no attribute 'startswith' +FAILED tests/nodes/supporting_nodes/test_file.py::test_integration_file - AttributeError: 'list' object has no attribute 'startswith' +======================================================================== 22 failed, 101 passed, 1 skipped, 1 warning in 1506.18s (0:25:06) ======================================================================== + + + ## Version 2.3.0 -**New Features:** +### New Features - `cript.API` objects now have a `DataSchema` attribute called `schema`, representing the JSON schema for node validation. - This includes the ability to enable and disable node validation. @@ -19,7 +105,7 @@ - Debugging messages show full API requests and responses for debugging. - Automated UUID caching for nodes can now be explicitly circumvented when using `cript.load_nodes_from_json`. Mostly useful for development. -**Known Issues and Bugs:** +### Known Issues and Bugs - Saving projects is not supported. Temporarily, you can use `get_expanded_json` to store a JSON representation of projects, which can be uploaded into CRIPT at a later time. - BigSMILES search patterns are not supported. @@ -27,14 +113,14 @@ - Permission settings in CRIPT do not influence the behavior of the SDK objects. - Tests that require valid tokens (like saving or searching) are not included in CI/CD tests. -**Bugfixes:** +### Bugfixes - `cript.load_nodes_from_json` can now load JSON files that store different nodes in lists or dictionaries. - Not all nodes were correctly validated at all times, especially if instantiated from JSON. All nodes are automatically validated now. - The documentation has been updated to remove certain mistakes. - Users can have only one Python object with the same UUID to avoid mis-updates. This did not work in all cases, but it works in all cases now. -**Breaking Changes:** +### Breaking Changes - `cript.API()` objects no longer have functions related to JSON schema validation. Please use the new `DataSchema` class instead. The `DataSchema` class can be accessed via the `schema` property of the API class. - Indirect logging control via the API is defunct. Please use the direct access to the `logger` attribute of API classes to control logging output. @@ -102,4 +188,4 @@ FAILED tests/nodes/subobjects/test_software.py::test_integration_software - Attr FAILED tests/nodes/subobjects/test_software_configuration.py::test_integration_software_configuration - AttributeError: 'list' object has no attribute 'starts with' FAILED tests/nodes/supporting_nodes/test_file.py::test_integration_file - AttributeError: 'list' object has no attribute 'starts with' ======================================================================== 23 failed, 100 passed, 1 skipped, 1 warning in 905.51s (0:15:05) ========================================================================= -``` +```` diff --git a/tests/api/test_search.py b/tests/api/test_search.py index 4b9909eb..4a674a7a 100644 --- a/tests/api/test_search.py +++ b/tests/api/test_search.py @@ -62,8 +62,7 @@ def test_api_search_node_type(cript_api: cript.API) -> None: if mat["uuid"] in uuid_list: print(mat["uuid"]) - # TODO enable duplicate test - # assert mat["uuid"] not in uuid_list + assert mat["uuid"] not in uuid_list assert i < 21