jupyter-analysis-tools 1.5.1__tar.gz → 1.6.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/.copier-answers.yml +1 -1
  2. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/.pre-commit-config.yaml +4 -4
  3. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/CHANGELOG.md +22 -0
  4. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/PKG-INFO +25 -3
  5. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/README.md +2 -2
  6. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/docs/conf.py +1 -1
  7. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools/__init__.py +1 -1
  8. jupyter_analysis_tools-1.6.1/src/jupyter_analysis_tools/datastore.py +170 -0
  9. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools.egg-info/PKG-INFO +25 -3
  10. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools.egg-info/SOURCES.txt +1 -0
  11. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/tests/requirements.txt +1 -0
  12. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/.editorconfig +0 -0
  13. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/AUTHORS.rst +0 -0
  14. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/CONTRIBUTING.rst +0 -0
  15. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/LICENSE +0 -0
  16. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/MANIFEST.in +0 -0
  17. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/ci/requirements.txt +0 -0
  18. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/docs/_templates/class.rst +0 -0
  19. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/docs/_templates/module.rst +0 -0
  20. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/docs/authors.rst +0 -0
  21. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/docs/changelog.rst +0 -0
  22. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/docs/contributing.rst +0 -0
  23. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/docs/index.rst +0 -0
  24. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/docs/installation.rst +0 -0
  25. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/docs/readme.rst +0 -0
  26. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/docs/reference/index.rst +0 -0
  27. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/docs/requirements.txt +0 -0
  28. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/docs/spelling_wordlist.txt +0 -0
  29. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/docs/usage.rst +0 -0
  30. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/pyproject.toml +0 -0
  31. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/setup.cfg +0 -0
  32. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools/analysis.py +0 -0
  33. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools/binning.py +0 -0
  34. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools/datalocations.py +0 -0
  35. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools/distrib.py +0 -0
  36. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools/git.py +0 -0
  37. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools/plotting.py +0 -0
  38. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools/readdata.py +0 -0
  39. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools/ssfz2json.py +0 -0
  40. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools/ssfz_compare.py +0 -0
  41. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools/utils.py +0 -0
  42. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools/widgets.py +0 -0
  43. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools.egg-info/dependency_links.txt +0 -0
  44. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools.egg-info/entry_points.txt +0 -0
  45. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools.egg-info/requires.txt +0 -0
  46. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/src/jupyter_analysis_tools.egg-info/top_level.txt +0 -0
  47. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/templates/CHANGELOG.md.j2 +0 -0
  48. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/testdata/2015-03-20-Silica.ssf.json +0 -0
  49. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/testdata/2015-03-20-Silica.ssfz +0 -0
  50. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/testdata/S2842 water.json +0 -0
  51. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/testdata/S2842 water.pdh +0 -0
  52. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/testdata/S2843[9].pdh +0 -0
  53. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/tests/readdata.py +0 -0
  54. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/tests/utils.py +0 -0
  55. {jupyter_analysis_tools-1.5.1 → jupyter_analysis_tools-1.6.1}/tox.ini +0 -0
@@ -22,4 +22,4 @@ repo_main_branch: main
22
22
  repo_name: jupyter-analysis-tools
23
23
  repo_userorg: BAMresearch
24
24
  sphinx_theme: furo
25
- version: 1.5.1
25
+ version: 1.6.1
@@ -5,20 +5,20 @@
5
5
  exclude: '^(\.tox|ci/templates|\.bumpversion\.cfg|testdata|docs/\w+\.xml|\w+\.drawio)(/|$)'
6
6
  repos:
7
7
  - repo: https://github.com/pre-commit/pre-commit-hooks
8
- rev: v4.4.0
8
+ rev: v6.0.0
9
9
  hooks:
10
10
  - id: trailing-whitespace
11
11
  - id: end-of-file-fixer
12
12
  - id: debug-statements
13
13
  - repo: https://github.com/pycqa/isort
14
- rev: 5.12.0
14
+ rev: 6.0.1
15
15
  hooks:
16
16
  - id: isort
17
17
  - repo: https://github.com/psf/black
18
- rev: 23.1.0
18
+ rev: 25.9.0
19
19
  hooks:
20
20
  - id: black
21
21
  - repo: https://github.com/pycqa/flake8
22
- rev: 6.0.0
22
+ rev: 7.3.0
23
23
  hooks:
24
24
  - id: flake8
@@ -1,5 +1,27 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## v1.6.1 (2025-09-19)
4
+
5
+ ### Bug fixes
6
+
7
+ * **DataStore**: regression of handling of existing objects ([`28bd44c`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/28bd44cf019aea0203ad252fd434860f45a1e54a))
8
+
9
+ * **DataStore**: proper forwarding of spacePrefix for filtering relevant spaces ([`c4117f3`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/c4117f3b04b9f6237f6d8471bef2d76c379e6f11))
10
+
11
+ * **DataStore**: use the URL provided by constructor ([`fcc46fb`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/fcc46fb941006b489054dc492f433e62d77cb605))
12
+
13
+ ## v1.6.0 (2025-09-19)
14
+
15
+ ### Bug fixes
16
+
17
+ * **DataStore**: f-string syntax ([`9166382`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/916638264be58e75fdfba15d9c6a6584ace92199))
18
+
19
+ * **Tests**: pybis module required for collecting in new datastore module ([`ea6a21d`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/ea6a21df3656dcc5f926aa7ff67a7136806ded3b))
20
+
21
+ ### Features
22
+
23
+ * **DataStore**: new module for managing objects in OpenBIS ([`cdf0a27`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/cdf0a27c0ae1412acd5329532ec8ec1fa7e6be94))
24
+
3
25
  ## v1.5.1 (2025-08-04)
4
26
 
5
27
  ### Bug fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jupyter-analysis-tools
3
- Version: 1.5.1
3
+ Version: 1.6.1
4
4
  Summary: Yet another Python library with helpers and utilities for data analysis and processing.
5
5
  Author-email: Ingo Breßler <ingo.bressler@bam.de>, "Brian R. Pauw" <brian.pauw@bam.de>
6
6
  License-Expression: MIT
@@ -35,10 +35,10 @@ Requires-Dist: matplotlib
35
35
  Requires-Dist: ipywidgets
36
36
  Dynamic: license-file
37
37
 
38
- # Jupyter Analysis Tools (v1.5.1)
38
+ # Jupyter Analysis Tools (v1.6.1)
39
39
 
40
40
  [![PyPI Package latest release](https://img.shields.io/pypi/v/jupyter-analysis-tools.svg)](https://pypi.org/project/jupyter-analysis-tools)
41
- [![Commits since latest release](https://img.shields.io/github/commits-since/BAMresearch/jupyter-analysis-tools/v1.5.1.svg)](https://github.com/BAMresearch/jupyter-analysis-tools/compare/v1.5.1...main)
41
+ [![Commits since latest release](https://img.shields.io/github/commits-since/BAMresearch/jupyter-analysis-tools/v1.6.1.svg)](https://github.com/BAMresearch/jupyter-analysis-tools/compare/v1.6.1...main)
42
42
  [![License](https://img.shields.io/pypi/l/jupyter-analysis-tools.svg)](https://en.wikipedia.org/wiki/MIT_license)
43
43
  [![Supported versions](https://img.shields.io/pypi/pyversions/jupyter-analysis-tools.svg)](https://pypi.org/project/jupyter-analysis-tools)
44
44
  [![PyPI Wheel](https://img.shields.io/pypi/wheel/jupyter-analysis-tools.svg)](https://pypi.org/project/jupyter-analysis-tools#files)
@@ -97,6 +97,28 @@ are installed:
97
97
 
98
98
  # CHANGELOG
99
99
 
100
+ ## v1.6.1 (2025-09-19)
101
+
102
+ ### Bug fixes
103
+
104
+ * **DataStore**: regression of handling of existing objects ([`28bd44c`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/28bd44cf019aea0203ad252fd434860f45a1e54a))
105
+
106
+ * **DataStore**: proper forwarding of spacePrefix for filtering relevant spaces ([`c4117f3`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/c4117f3b04b9f6237f6d8471bef2d76c379e6f11))
107
+
108
+ * **DataStore**: use the URL provided by constructor ([`fcc46fb`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/fcc46fb941006b489054dc492f433e62d77cb605))
109
+
110
+ ## v1.6.0 (2025-09-19)
111
+
112
+ ### Bug fixes
113
+
114
+ * **DataStore**: f-string syntax ([`9166382`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/916638264be58e75fdfba15d9c6a6584ace92199))
115
+
116
+ * **Tests**: pybis module required for collecting in new datastore module ([`ea6a21d`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/ea6a21df3656dcc5f926aa7ff67a7136806ded3b))
117
+
118
+ ### Features
119
+
120
+ * **DataStore**: new module for managing objects in OpenBIS ([`cdf0a27`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/cdf0a27c0ae1412acd5329532ec8ec1fa7e6be94))
121
+
100
122
  ## v1.5.1 (2025-08-04)
101
123
 
102
124
  ### Bug fixes
@@ -1,7 +1,7 @@
1
- # Jupyter Analysis Tools (v1.5.1)
1
+ # Jupyter Analysis Tools (v1.6.1)
2
2
 
3
3
  [![PyPI Package latest release](https://img.shields.io/pypi/v/jupyter-analysis-tools.svg)](https://pypi.org/project/jupyter-analysis-tools)
4
- [![Commits since latest release](https://img.shields.io/github/commits-since/BAMresearch/jupyter-analysis-tools/v1.5.1.svg)](https://github.com/BAMresearch/jupyter-analysis-tools/compare/v1.5.1...main)
4
+ [![Commits since latest release](https://img.shields.io/github/commits-since/BAMresearch/jupyter-analysis-tools/v1.6.1.svg)](https://github.com/BAMresearch/jupyter-analysis-tools/compare/v1.6.1...main)
5
5
  [![License](https://img.shields.io/pypi/l/jupyter-analysis-tools.svg)](https://en.wikipedia.org/wiki/MIT_license)
6
6
  [![Supported versions](https://img.shields.io/pypi/pyversions/jupyter-analysis-tools.svg)](https://pypi.org/project/jupyter-analysis-tools)
7
7
  [![PyPI Wheel](https://img.shields.io/pypi/wheel/jupyter-analysis-tools.svg)](https://pypi.org/project/jupyter-analysis-tools#files)
@@ -32,7 +32,7 @@ project = "Jupyter Analysis Tools"
32
32
  year = "2018-2025"
33
33
  author = "Ingo Breßler and Brian R. Pauw"
34
34
  copyright = "{0}, {1}".format(year, author)
35
- version = "1.5.1"
35
+ version = "1.6.1"
36
36
  release = version
37
37
  commit_id = None
38
38
  try:
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # __init__.py
3
3
 
4
- __version__ = "1.5.1"
4
+ __version__ = "1.6.1"
5
5
 
6
6
  from .binning import reBin
7
7
  from .git import checkRepo, isNBstripoutActivated, isNBstripoutInstalled, isRepo
@@ -0,0 +1,170 @@
1
+ # -*- coding: utf-8 -*-
2
+ # datastore.py
3
+
4
+ import filecmp
5
+ import getpass
6
+ import tempfile
7
+ import warnings
8
+ from pathlib import Path
9
+
10
+ from pybis import Openbis
11
+
12
+
13
+ class DataStore:
14
+ url = None
15
+ _availObj = None
16
+ _userspace = None
17
+
18
+ def __init__(self, url, username=None):
19
+ self.url = url
20
+ self.username = username
21
+ if self.username is None:
22
+ self.username = getpass.getuser()
23
+ print(f"Working as user '{self.username}'.")
24
+ # to generate PAT you need to login normally
25
+ self.ds = Openbis(url=self.url, verify_certificates=True)
26
+ # arg. *save_token* saves the openBIS token to ~/.pybis permanently
27
+ self.ds.login(
28
+ self.username,
29
+ getpass.getpass(prompt=f"Password for {self.username}: "),
30
+ save_token=False,
31
+ )
32
+ # create the PAT with the given name, don't store it
33
+ self.ds.get_or_create_personal_access_token("test-session")
34
+
35
+ @property
36
+ def userspace(self):
37
+ uspace = self._userspace
38
+ if uspace is None:
39
+ allspaces = self.ds.get_spaces()
40
+ uspace = allspaces.df[
41
+ allspaces.df.code.str.endswith(self.username.upper())
42
+ ].code.values[0]
43
+ self._userspace = uspace
44
+ return uspace
45
+
46
+ @userspace.setter
47
+ def userspace(self, name):
48
+ name = name.upper()
49
+ if name in self.ds.get_spaces().df.code.values:
50
+ self._userspace = name
51
+
52
+ @staticmethod
53
+ def identifier(objects, code):
54
+ return objects[objects.code == code].identifier.tolist()[0]
55
+
56
+ def createProject(self, projectName, space, spacePrefix=None):
57
+ """Finds the requested project in the DataStore.
58
+ Matching project names can be limited to a given *spacePrefix*.
59
+ If the project is not found, a new project with the given code in the given space
60
+ is created."""
61
+ # get available projects, accessible by the current user
62
+ projectsAvail = self.ds.get_projects()
63
+ if spacePrefix:
64
+ projectsAvail = [prj for prj in projectsAvail if f"/{spacePrefix}_" in prj.identifier]
65
+ projects = [prj for prj in projectsAvail if prj.code == projectName]
66
+ assert len(projects) <= 1, f"Multiple projects found for '{projectName}'"
67
+ dsProject = None
68
+ if len(projects): # get the existing object
69
+ dsProject = projects[0]
70
+ else: # create it, if not found
71
+ print(f"Creating project '{projectName}'")
72
+ dsProject = self.ds.new_project(code=projectName, space=space)
73
+ dsProject.save()
74
+ assert dsProject
75
+ return dsProject
76
+
77
+ def createCollection(self, collName, projectObj, defaultObjType=None):
78
+ collections = self.ds.get_collections(project=projectObj)
79
+ dsColl = [coll for coll in collections if coll.code == collName.upper()]
80
+ if len(dsColl):
81
+ dsColl = dsColl[0]
82
+ else: # create it, if not found
83
+ print(f"Creating collection '{collName}'")
84
+ dsColl = self.ds.new_collection(
85
+ code=collName, type="COLLECTION", project=projectObj, props={"$name": collName}
86
+ )
87
+ dsColl.save()
88
+ assert dsColl
89
+ # update properties (name, default view and object type) if not set)
90
+ props = dsColl.props.all() # props as dict
91
+ propKey = "$name"
92
+ if propKey in props and props[propKey] is None:
93
+ props[propKey] = collName
94
+ propKey = "$default_collection_view"
95
+ if propKey in props.keys() and props[propKey] is None:
96
+ propVal = [
97
+ item
98
+ for item in self.ds.get_vocabulary(propKey + "s").get_terms().df.code
99
+ if "list" in item.lower()
100
+ ]
101
+ assert len(propVal)
102
+ props[propKey] = propVal[0]
103
+ if defaultObjType:
104
+ propKey = "$default_object_type"
105
+ if propKey in props.keys() and props[propKey] is None:
106
+ props[propKey] = defaultObjType
107
+ # print(f"Setting '{collName}' properties:\n {props}")
108
+ dsColl.set_props(props)
109
+ dsColl.save()
110
+ return dsColl
111
+
112
+ def createObject(
113
+ self,
114
+ projectName: str,
115
+ collectionName: str = None,
116
+ space: str = None,
117
+ spacePrefix: str = None,
118
+ objType: str = None,
119
+ props: dict = None,
120
+ ):
121
+ dsProject = self.createProject(projectName, space, spacePrefix=spacePrefix)
122
+ dsColl = None
123
+ if collectionName is None: # collectionName is required
124
+ return None
125
+ dsColl = self.createCollection(collectionName, dsProject, defaultObjType=objType)
126
+ obj = self.ds.get_objects(type=objType, where={"$name": props["$name"]}).objects
127
+ if len(obj):
128
+ obj = obj[0]
129
+ prefix = objType
130
+ msg = "'{}' exists already in {}! Updating ...".format(
131
+ obj.props["$name"], obj.project.identifier
132
+ )
133
+ warnings.warn_explicit(msg, UserWarning, prefix, 0)
134
+ else: # does not exist yet
135
+ objName = f" '{props['$name']}'" if len(props.get("$name", "")) else ""
136
+ print(f"Creating new {objType}{objName} in {dsColl.identifier}")
137
+ obj = self.ds.new_object(type=objType, props=props, collection=dsColl)
138
+ obj.set_props(props)
139
+ return obj
140
+
141
+ def findObjects(self, *args, **kwargs):
142
+ return self.ds.get_objects(**kwargs)
143
+
144
+ def uploadDataset(self, obj, datasetType, fpaths=[]):
145
+ def _checkFile(localPath, remoteFiles):
146
+ remoteFile = [f for f in remoteFiles if f.name == localPath.name]
147
+ if not len(remoteFile): # file exists in the dataset as well
148
+ return False
149
+ return filecmp.cmp(localPath, remoteFile[0], shallow=False)
150
+
151
+ if not len(fpaths):
152
+ return # nothing to do
153
+ for dataset in obj.get_datasets(type=datasetType):
154
+ with tempfile.TemporaryDirectory() as tempdir:
155
+ dataset.download(destination=tempdir)
156
+ dsFiles = [f for f in Path(tempdir).rglob("*") if f.is_file()]
157
+ if len(fpaths) == len(dsFiles):
158
+ if all([_checkFile(fpath, dsFiles) for fpath in fpaths]):
159
+ print(
160
+ f"All local files of {datasetType} match files in dataset, "
161
+ "not updating."
162
+ )
163
+ continue # skip deletion below
164
+ print(f"Dataset {datasetType} needs update, deleting existing dataset:")
165
+ dataset.delete("Needs update")
166
+ if not len(obj.get_datasets(type=datasetType)): # didn't exist yet or all deleted
167
+ dataset = self.ds.new_dataset(
168
+ type=datasetType, collection=obj.collection, object=obj, files=fpaths
169
+ )
170
+ dataset.save()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jupyter-analysis-tools
3
- Version: 1.5.1
3
+ Version: 1.6.1
4
4
  Summary: Yet another Python library with helpers and utilities for data analysis and processing.
5
5
  Author-email: Ingo Breßler <ingo.bressler@bam.de>, "Brian R. Pauw" <brian.pauw@bam.de>
6
6
  License-Expression: MIT
@@ -35,10 +35,10 @@ Requires-Dist: matplotlib
35
35
  Requires-Dist: ipywidgets
36
36
  Dynamic: license-file
37
37
 
38
- # Jupyter Analysis Tools (v1.5.1)
38
+ # Jupyter Analysis Tools (v1.6.1)
39
39
 
40
40
  [![PyPI Package latest release](https://img.shields.io/pypi/v/jupyter-analysis-tools.svg)](https://pypi.org/project/jupyter-analysis-tools)
41
- [![Commits since latest release](https://img.shields.io/github/commits-since/BAMresearch/jupyter-analysis-tools/v1.5.1.svg)](https://github.com/BAMresearch/jupyter-analysis-tools/compare/v1.5.1...main)
41
+ [![Commits since latest release](https://img.shields.io/github/commits-since/BAMresearch/jupyter-analysis-tools/v1.6.1.svg)](https://github.com/BAMresearch/jupyter-analysis-tools/compare/v1.6.1...main)
42
42
  [![License](https://img.shields.io/pypi/l/jupyter-analysis-tools.svg)](https://en.wikipedia.org/wiki/MIT_license)
43
43
  [![Supported versions](https://img.shields.io/pypi/pyversions/jupyter-analysis-tools.svg)](https://pypi.org/project/jupyter-analysis-tools)
44
44
  [![PyPI Wheel](https://img.shields.io/pypi/wheel/jupyter-analysis-tools.svg)](https://pypi.org/project/jupyter-analysis-tools#files)
@@ -97,6 +97,28 @@ are installed:
97
97
 
98
98
  # CHANGELOG
99
99
 
100
+ ## v1.6.1 (2025-09-19)
101
+
102
+ ### Bug fixes
103
+
104
+ * **DataStore**: regression of handling of existing objects ([`28bd44c`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/28bd44cf019aea0203ad252fd434860f45a1e54a))
105
+
106
+ * **DataStore**: proper forwarding of spacePrefix for filtering relevant spaces ([`c4117f3`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/c4117f3b04b9f6237f6d8471bef2d76c379e6f11))
107
+
108
+ * **DataStore**: use the URL provided by constructor ([`fcc46fb`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/fcc46fb941006b489054dc492f433e62d77cb605))
109
+
110
+ ## v1.6.0 (2025-09-19)
111
+
112
+ ### Bug fixes
113
+
114
+ * **DataStore**: f-string syntax ([`9166382`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/916638264be58e75fdfba15d9c6a6584ace92199))
115
+
116
+ * **Tests**: pybis module required for collecting in new datastore module ([`ea6a21d`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/ea6a21df3656dcc5f926aa7ff67a7136806ded3b))
117
+
118
+ ### Features
119
+
120
+ * **DataStore**: new module for managing objects in OpenBIS ([`cdf0a27`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/cdf0a27c0ae1412acd5329532ec8ec1fa7e6be94))
121
+
100
122
  ## v1.5.1 (2025-08-04)
101
123
 
102
124
  ### Bug fixes
@@ -27,6 +27,7 @@ src/jupyter_analysis_tools/__init__.py
27
27
  src/jupyter_analysis_tools/analysis.py
28
28
  src/jupyter_analysis_tools/binning.py
29
29
  src/jupyter_analysis_tools/datalocations.py
30
+ src/jupyter_analysis_tools/datastore.py
30
31
  src/jupyter_analysis_tools/distrib.py
31
32
  src/jupyter_analysis_tools/git.py
32
33
  src/jupyter_analysis_tools/plotting.py
@@ -2,3 +2,4 @@ pytest
2
2
  pytest-cov
3
3
  pytest_notebook @ git+https://github.com/BAMresearch/pytest-notebook@master
4
4
  ipykernel
5
+ pybis