jupyter-analysis-tools 1.2.0__py3-none-any.whl → 1.2.1__py3-none-any.whl
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.
- jupyter_analysis_tools/__init__.py +3 -2
- jupyter_analysis_tools/readdata.py +34 -23
- jupyter_analysis_tools/utils.py +2 -1
- {jupyter_analysis_tools-1.2.0.dist-info → jupyter_analysis_tools-1.2.1.dist-info}/METADATA +27 -5
- {jupyter_analysis_tools-1.2.0.dist-info → jupyter_analysis_tools-1.2.1.dist-info}/RECORD +9 -9
- {jupyter_analysis_tools-1.2.0.dist-info → jupyter_analysis_tools-1.2.1.dist-info}/WHEEL +0 -0
- {jupyter_analysis_tools-1.2.0.dist-info → jupyter_analysis_tools-1.2.1.dist-info}/licenses/AUTHORS.rst +0 -0
- {jupyter_analysis_tools-1.2.0.dist-info → jupyter_analysis_tools-1.2.1.dist-info}/licenses/LICENSE +0 -0
- {jupyter_analysis_tools-1.2.0.dist-info → jupyter_analysis_tools-1.2.1.dist-info}/top_level.txt +0 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
# __init__.py
|
|
3
3
|
|
|
4
|
-
__version__ = "1.2.
|
|
4
|
+
__version__ = "1.2.1"
|
|
5
5
|
|
|
6
6
|
from .binning import reBin
|
|
7
7
|
from .git import checkRepo, isNBstripoutActivated, isNBstripoutInstalled, isRepo
|
|
8
|
-
from .readdata import readdata
|
|
8
|
+
from .readdata import readdata
|
|
9
9
|
from .readdata import readdata as readPDH
|
|
10
|
+
from .readdata import readPDHmeta, readSSF
|
|
10
11
|
from .utils import setLocaleUTF8
|
|
11
12
|
from .widgets import PathSelector, showBoolStatus
|
|
12
13
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
# readdata.py
|
|
3
3
|
|
|
4
|
-
import json
|
|
5
4
|
import warnings
|
|
6
5
|
import xml.etree.ElementTree as et
|
|
7
6
|
from pathlib import Path
|
|
@@ -62,6 +61,7 @@ def convertValue(val):
|
|
|
62
61
|
pass
|
|
63
62
|
return val
|
|
64
63
|
|
|
64
|
+
|
|
65
65
|
def xmlPDHToDict(root):
|
|
66
66
|
result = {}
|
|
67
67
|
stack = [(root, result)]
|
|
@@ -70,12 +70,15 @@ def xmlPDHToDict(root):
|
|
|
70
70
|
elemCont = {}
|
|
71
71
|
key = elem.attrib.pop("key", None)
|
|
72
72
|
idx = -1
|
|
73
|
-
if (
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
if (
|
|
74
|
+
not len(list(elem)) and
|
|
75
|
+
not len(elem.attrib) and
|
|
76
|
+
not (elem.text and len(elem.text.strip()))
|
|
77
|
+
):
|
|
78
|
+
continue # skip empty elements with a key only early
|
|
76
79
|
if elem.tag == "list":
|
|
77
80
|
elemCont = []
|
|
78
|
-
else:
|
|
81
|
+
else: # add attributes & values to dict
|
|
79
82
|
# Attach text, if any
|
|
80
83
|
if elem.text and len(elem.text.strip()):
|
|
81
84
|
if elem.tag in ("value", "reference"):
|
|
@@ -84,17 +87,20 @@ def xmlPDHToDict(root):
|
|
|
84
87
|
elemCont["#text"] = convertValue(elem.text)
|
|
85
88
|
# Attach attributes, if any
|
|
86
89
|
if elem.attrib:
|
|
87
|
-
elemCont.update(
|
|
88
|
-
|
|
90
|
+
elemCont.update(
|
|
91
|
+
{k: convertValue(v) for k, v in elem.attrib.items() if len(v.strip())}
|
|
92
|
+
)
|
|
93
|
+
if key == "unit" and "value" in elemCont: # fix some units
|
|
89
94
|
elemCont["value"] = elemCont["value"].replace("_", "")
|
|
90
95
|
if "unit" in elemCont:
|
|
91
96
|
elemCont["unit"] = elemCont["unit"].replace("_", "")
|
|
92
97
|
# reduce the extracted dict&attributes
|
|
93
|
-
idx = elemCont.get("index", -1)
|
|
98
|
+
idx = elemCont.get("index", -1) # insert last/append if no index given
|
|
94
99
|
value = elemCont.get("value", None)
|
|
95
|
-
if value is not None and (
|
|
96
|
-
|
|
97
|
-
|
|
100
|
+
if value is not None and (
|
|
101
|
+
len(elemCont) == 1 or (len(elemCont) == 2 and "index" in elemCont)
|
|
102
|
+
):
|
|
103
|
+
elemCont = value # contains value only
|
|
98
104
|
parentKey = elem.tag
|
|
99
105
|
if key is not None and parentKey in ("list", "value", "group"):
|
|
100
106
|
# skip one level in hierarchy for these generic containers
|
|
@@ -103,21 +109,23 @@ def xmlPDHToDict(root):
|
|
|
103
109
|
try:
|
|
104
110
|
if isinstance(parentCont, list):
|
|
105
111
|
parentCont.insert(idx, elemCont)
|
|
106
|
-
elif parentKey not in parentCont:
|
|
107
|
-
if key is None:
|
|
112
|
+
elif parentKey not in parentCont: # add as new list
|
|
113
|
+
if key is None: # make a list
|
|
108
114
|
parentCont[parentKey] = elemCont
|
|
109
|
-
else:
|
|
115
|
+
else: # have a key
|
|
110
116
|
parentCont[parentKey] = {key: elemCont}
|
|
111
|
-
else:
|
|
112
|
-
if (
|
|
113
|
-
not isinstance(parentCont[parentKey],
|
|
117
|
+
else: # parentKey exists already
|
|
118
|
+
if (
|
|
119
|
+
not isinstance(parentCont[parentKey], list) and
|
|
120
|
+
not isinstance(parentCont[parentKey], dict)
|
|
121
|
+
):
|
|
114
122
|
# if its a plain value before, make a list out of it and append in next step
|
|
115
123
|
parentCont[parentKey] = [parentCont[parentKey]]
|
|
116
124
|
if isinstance(parentCont[parentKey], list):
|
|
117
125
|
parentCont[parentKey].append(elemCont)
|
|
118
126
|
elif key is not None:
|
|
119
127
|
parentCont[parentKey].update({key: elemCont})
|
|
120
|
-
else:
|
|
128
|
+
else: # key is None
|
|
121
129
|
parentCont[parentKey].update(elemCont)
|
|
122
130
|
except AttributeError:
|
|
123
131
|
raise
|
|
@@ -126,31 +134,34 @@ def xmlPDHToDict(root):
|
|
|
126
134
|
# fix some entry values, weird Anton Paar PDH format
|
|
127
135
|
try:
|
|
128
136
|
oldts = result["fileinfo"]["parameter"]["DateTime"]["value"]
|
|
129
|
-
|
|
137
|
+
# timestamp seems to be based on around 2009-01-01 (a day give or take)
|
|
138
|
+
delta = ((39 * 365 + 10) * 24 * 3600)
|
|
130
139
|
# make it compatible to datetime.datetime routines
|
|
131
|
-
result["fileinfo"]["parameter"]["DateTime"]["value"] = oldts+delta
|
|
140
|
+
result["fileinfo"]["parameter"]["DateTime"]["value"] = oldts + delta
|
|
132
141
|
except KeyError:
|
|
133
142
|
pass
|
|
134
143
|
return result
|
|
135
144
|
|
|
145
|
+
|
|
136
146
|
def readPDHmeta(fp):
|
|
137
147
|
fp = Path(fp)
|
|
138
148
|
if fp.suffix.lower() != ".pdh":
|
|
139
149
|
warnings.warn("readPDHmeta() supports .pdh files only!")
|
|
140
|
-
return
|
|
150
|
+
return # for PDH files
|
|
141
151
|
lines = ""
|
|
142
152
|
with open(fp) as fd:
|
|
143
153
|
lines = fd.readlines()
|
|
144
154
|
nrows = int(lines[2].split()[0])
|
|
145
|
-
xml = "".join(lines[nrows+5:])
|
|
155
|
+
xml = "".join(lines[nrows + 5 :])
|
|
146
156
|
return xmlPDHToDict(et.fromstring(xml))
|
|
147
157
|
|
|
158
|
+
|
|
148
159
|
def readSSF(fp):
|
|
149
160
|
fp = Path(fp)
|
|
150
161
|
if fp.suffix.lower() != ".ssf":
|
|
151
162
|
warnings.warn("readSession() supports .ssf files only!")
|
|
152
163
|
return # for PDH files
|
|
153
164
|
data = ""
|
|
154
|
-
with open(fp, encoding=
|
|
165
|
+
with open(fp, encoding="utf-8-sig") as fd:
|
|
155
166
|
data = fd.read()
|
|
156
167
|
return xmlPDHToDict(et.fromstring(data))
|
jupyter_analysis_tools/utils.py
CHANGED
|
@@ -89,7 +89,8 @@ def addEnvScriptsToPATH():
|
|
|
89
89
|
"""Prepends the *Scripts* directory of the current Python environment base directory to systems
|
|
90
90
|
PATH variable.
|
|
91
91
|
|
|
92
|
-
It is intended for Conda (Miniforge) environments on Windows that do not have this in their PATH
|
|
92
|
+
It is intended for Conda (Miniforge) environments on Windows that do not have this in their PATH
|
|
93
|
+
environment variable, causing them to miss many commands provided from this location.
|
|
93
94
|
"""
|
|
94
95
|
envPath = [p for p in sys.path if p.endswith("Lib")]
|
|
95
96
|
if not envPath:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: jupyter-analysis-tools
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.1
|
|
4
4
|
Summary: Yet another Python library with helpers and utilities for data analysis and processing.
|
|
5
5
|
Author-email: Ingo Breßler <dev@ingobressler.net>
|
|
6
6
|
License: MIT license
|
|
@@ -53,8 +53,8 @@ Yet another Python library with helpers and utilities for data analysis and proc
|
|
|
53
53
|
:target: https://pypi.org/project/jupyter-analysis-tools
|
|
54
54
|
:alt: PyPI Package latest release
|
|
55
55
|
|
|
56
|
-
.. |commits-since| image:: https://img.shields.io/github/commits-since/BAMresearch/jupyter-analysis-tools/v1.2.
|
|
57
|
-
:target: https://github.com/BAMresearch/jupyter-analysis-tools/compare/v1.2.
|
|
56
|
+
.. |commits-since| image:: https://img.shields.io/github/commits-since/BAMresearch/jupyter-analysis-tools/v1.2.1.svg
|
|
57
|
+
:target: https://github.com/BAMresearch/jupyter-analysis-tools/compare/v1.2.1...main
|
|
58
58
|
:alt: Commits since latest release
|
|
59
59
|
|
|
60
60
|
.. |license| image:: https://img.shields.io/pypi/l/jupyter-analysis-tools.svg
|
|
@@ -104,9 +104,9 @@ https://BAMresearch.github.io/jupyter-analysis-tools
|
|
|
104
104
|
Development
|
|
105
105
|
===========
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
Run all tests with::
|
|
108
108
|
|
|
109
|
-
tox
|
|
109
|
+
tox -e py
|
|
110
110
|
|
|
111
111
|
Note, to combine the coverage data from all the tox environments run:
|
|
112
112
|
|
|
@@ -127,6 +127,28 @@ Note, to combine the coverage data from all the tox environments run:
|
|
|
127
127
|
|
|
128
128
|
# CHANGELOG
|
|
129
129
|
|
|
130
|
+
## v1.2.1 (2025-07-11)
|
|
131
|
+
|
|
132
|
+
### Bug fixes
|
|
133
|
+
|
|
134
|
+
* readme: trigger new version after style changes ([`8b2b5e9`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/8b2b5e93c0f24ae59afaa764abdc508e994946b4))
|
|
135
|
+
|
|
136
|
+
### Code style
|
|
137
|
+
|
|
138
|
+
* __init__: imports format ([`6f07790`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/6f07790a04e43736b1c0fbce0eac54d0b661a7cf))
|
|
139
|
+
|
|
140
|
+
* utils: satisfy flake8 ([`9657474`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/9657474e94a4d9887c4a6b653e0ffa403e666d02))
|
|
141
|
+
|
|
142
|
+
* readdata: satisfy flake8 ([`36bf6e8`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/36bf6e8be67a2ebd345c5557c2352710bcebed82))
|
|
143
|
+
|
|
144
|
+
### Continuous integration
|
|
145
|
+
|
|
146
|
+
* workflow: publish only if the docs are good ([`a663ed3`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/a663ed3d1fd87079a4fd7cf419132a129280a562))
|
|
147
|
+
|
|
148
|
+
### Testing
|
|
149
|
+
|
|
150
|
+
* utils: fix imports ([`ddd5369`](https://github.com/BAMresearch/jupyter-analysis-tools/commit/ddd5369b8037f583c6900aea25522a56126c9d32))
|
|
151
|
+
|
|
130
152
|
## v1.2.0 (2025-07-11)
|
|
131
153
|
|
|
132
154
|
### Features
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
jupyter_analysis_tools/__init__.py,sha256=
|
|
1
|
+
jupyter_analysis_tools/__init__.py,sha256=JTPvYYcXYakQiDz7PPUSBwpL9F6SX5ZZaADP8iWJE6A,386
|
|
2
2
|
jupyter_analysis_tools/analysis.py,sha256=AiAvUO648f0PYXqLfal1kDH926neasE5c1RYFu9wtYg,1768
|
|
3
3
|
jupyter_analysis_tools/binning.py,sha256=d6eXRC3IOnnJIF25OfEASyWedT71EX2nF7jAgGJ9suQ,14536
|
|
4
4
|
jupyter_analysis_tools/datalocations.py,sha256=BakfiZOMcBwp-_DAn7l57lGWZmZGNnk0j73V75nLBUA,4322
|
|
5
5
|
jupyter_analysis_tools/distrib.py,sha256=uyh2jXDdXR6dfd36CAoE5_psoFF0bfA6l1wletPD7Xo,16515
|
|
6
6
|
jupyter_analysis_tools/git.py,sha256=mqSk5nnAFrmk1_2KFuKVrDWOkRbGbAQOq2N1DfxhNpg,2216
|
|
7
7
|
jupyter_analysis_tools/plotting.py,sha256=L2gwSjlBVK8OneAfSuna3vCJIg2rSEdvd9TfEbM2Als,1183
|
|
8
|
-
jupyter_analysis_tools/readdata.py,sha256=
|
|
9
|
-
jupyter_analysis_tools/utils.py,sha256=
|
|
8
|
+
jupyter_analysis_tools/readdata.py,sha256=QG0cYA0dX6kmrMIdjHJoMWuIwwZbd0uYitztcxr_AN0,5829
|
|
9
|
+
jupyter_analysis_tools/utils.py,sha256=dFE34fYQS7ivCfNy0nwwNPyBdZhIzW9QrxwjvvIHlIQ,5319
|
|
10
10
|
jupyter_analysis_tools/widgets.py,sha256=rA8qPvY9nS1OtykZwXtCTG29K-N_MYFVb5Aj8yK40_s,2996
|
|
11
|
-
jupyter_analysis_tools-1.2.
|
|
12
|
-
jupyter_analysis_tools-1.2.
|
|
13
|
-
jupyter_analysis_tools-1.2.
|
|
14
|
-
jupyter_analysis_tools-1.2.
|
|
15
|
-
jupyter_analysis_tools-1.2.
|
|
16
|
-
jupyter_analysis_tools-1.2.
|
|
11
|
+
jupyter_analysis_tools-1.2.1.dist-info/licenses/AUTHORS.rst,sha256=SUxxgElDBm6WdCbBBFfcr0ZE3SolWL0T0aS5Fym1198,100
|
|
12
|
+
jupyter_analysis_tools-1.2.1.dist-info/licenses/LICENSE,sha256=SrbIwXA1ZLTO6uwZneJMpvdgiC-3fhNl0vwb3ALoY4g,1107
|
|
13
|
+
jupyter_analysis_tools-1.2.1.dist-info/METADATA,sha256=3I-R__QvIkGKunshlZeGeAit7pOjYzAWiUGyyo5BiaQ,37099
|
|
14
|
+
jupyter_analysis_tools-1.2.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
15
|
+
jupyter_analysis_tools-1.2.1.dist-info/top_level.txt,sha256=ei_0x-BF85FLoJ_h67ySwDFowtqus_gI4_0GR466PEU,23
|
|
16
|
+
jupyter_analysis_tools-1.2.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
{jupyter_analysis_tools-1.2.0.dist-info → jupyter_analysis_tools-1.2.1.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
{jupyter_analysis_tools-1.2.0.dist-info → jupyter_analysis_tools-1.2.1.dist-info}/top_level.txt
RENAMED
|
File without changes
|