datastock 0.0.46__py3-none-any.whl → 0.0.49__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.
- datastock/_class2.py +9 -5
- datastock/_class2_interactivity.py +9 -3
- datastock/_generic_check.py +114 -43
- datastock/tests/test_01_DataStock.py +42 -1
- datastock/version.py +1 -1
- {datastock-0.0.46.dist-info → datastock-0.0.49.dist-info}/METADATA +36 -9
- {datastock-0.0.46.dist-info → datastock-0.0.49.dist-info}/RECORD +15 -10
- {datastock-0.0.46.dist-info → datastock-0.0.49.dist-info}/WHEEL +1 -1
- datastock-0.0.49.dist-info/entry_points.txt +2 -0
- {datastock-0.0.46.dist-info → datastock-0.0.49.dist-info}/top_level.txt +1 -0
- scripts/__init__.py +0 -0
- scripts/_bash_version.py +77 -0
- scripts/_dparser.py +109 -0
- scripts/main.py +147 -0
- {datastock-0.0.46.dist-info → datastock-0.0.49.dist-info}/LICENSE +0 -0
datastock/_class2.py
CHANGED
@@ -629,7 +629,7 @@ class DataStock2(DataStock1):
|
|
629
629
|
v0['handle'].parent(),
|
630
630
|
)
|
631
631
|
except Exception as err:
|
632
|
-
error = err
|
632
|
+
error = "1\n" + str(err)
|
633
633
|
elif hasattr(v0['handle'], 'parent'):
|
634
634
|
try:
|
635
635
|
v0['handle'].manager.toolbar.__init__(
|
@@ -637,9 +637,12 @@ class DataStock2(DataStock1):
|
|
637
637
|
v0['handle'].parent(),
|
638
638
|
)
|
639
639
|
except Exception as err:
|
640
|
-
|
640
|
+
if "can't initialize an object twice" in str(err):
|
641
|
+
pass
|
642
|
+
else:
|
643
|
+
error = "2\n" + str(err)
|
641
644
|
else:
|
642
|
-
error =
|
645
|
+
error = "3"
|
643
646
|
|
644
647
|
if error is not False:
|
645
648
|
import platform
|
@@ -648,6 +651,7 @@ class DataStock2(DataStock1):
|
|
648
651
|
lstr0 = [f"\t- {k1}" for k1 in dir(v0['handle'])]
|
649
652
|
lstr1 = [f"\t- {k1}" for k1 in dir(v0['handle'].manager.toolbar)]
|
650
653
|
msg = (
|
654
|
+
"Problem with connect()\n"
|
651
655
|
f"platform: {platform.platform()}\n"
|
652
656
|
f"python: {sys.version}\n"
|
653
657
|
f"backend: {plt.get_backend()}\n"
|
@@ -657,7 +661,7 @@ class DataStock2(DataStock1):
|
|
657
661
|
+ "\n".join(lstr1)
|
658
662
|
)
|
659
663
|
if error is not True:
|
660
|
-
msg += '\n' + str(
|
664
|
+
msg += '\n' + str(error)
|
661
665
|
warnings.warn(msg)
|
662
666
|
|
663
667
|
self._dobj['canvas'][k0]['cid'] = {
|
@@ -1393,4 +1397,4 @@ class DataStock2(DataStock1):
|
|
1393
1397
|
|
1394
1398
|
__all__ = [
|
1395
1399
|
sorted([k0 for k0 in locals() if k0.startswith('DataStock')])[-1]
|
1396
|
-
]
|
1400
|
+
]
|
@@ -459,12 +459,18 @@ def _get_ix_for_refx_only_1or2d(
|
|
459
459
|
|
460
460
|
|
461
461
|
def get_fupdate(handle=None, dtype=None, norm=None, bstr=None):
|
462
|
+
|
463
|
+
# Note: set_xdata() and set_ydata() do not accept scalar values
|
464
|
+
# Deprecation warning since matplotlib 3.7
|
465
|
+
# see https://github.com/matplotlib/matplotlib/pull/22329
|
466
|
+
# see https://github.com/matplotlib/matplotlib/issues/28927
|
467
|
+
|
462
468
|
if dtype == 'xdata':
|
463
469
|
def func(val, handle=handle):
|
464
|
-
handle.set_xdata(val)
|
470
|
+
handle.set_xdata(np.atleast_1d(val))
|
465
471
|
elif dtype == 'ydata':
|
466
472
|
def func(val, handle=handle):
|
467
|
-
handle.set_ydata(val)
|
473
|
+
handle.set_ydata(np.atleast_1d(val))
|
468
474
|
elif dtype in ['data']: # Also works for imshow
|
469
475
|
def func(val, handle=handle):
|
470
476
|
handle.set_data(val)
|
@@ -588,4 +594,4 @@ def _update_mobile(k0=None, dmobile=None, dref=None, ddata=None):
|
|
588
594
|
# ddata[dmobile[k0]['data'][ii]]['data'][
|
589
595
|
# dmobile[k0]['func_slice'][ii](iref[ii])
|
590
596
|
# ]
|
591
|
-
# )
|
597
|
+
# )
|
datastock/_generic_check.py
CHANGED
@@ -362,8 +362,6 @@ def _check_dict_valid_keys(
|
|
362
362
|
var[k0] = None
|
363
363
|
continue
|
364
364
|
|
365
|
-
vv = var.get(k0)
|
366
|
-
|
367
365
|
# routine to call
|
368
366
|
if any([ss in v0.keys() for ss in lkarray]):
|
369
367
|
var[k0] = _check_flat1darray(
|
@@ -555,47 +553,125 @@ def _obj_key(d0=None, short=None, key=None, ndigits=None):
|
|
555
553
|
# Utilities for plotting
|
556
554
|
# #############################################################################
|
557
555
|
|
558
|
-
# DEPRECATED
|
559
|
-
# def _check_inplace(coll=None, keys=None):
|
560
|
-
# """ Check key to data and inplace """
|
561
556
|
|
562
|
-
|
563
|
-
|
564
|
-
|
557
|
+
def _check_all_broadcastable(
|
558
|
+
return_full_arrays=None,
|
559
|
+
**kwdargs,
|
560
|
+
):
|
561
|
+
|
562
|
+
# -------------------
|
563
|
+
# return_full_arrays
|
564
|
+
# -------------------
|
565
|
+
|
566
|
+
return_full_arrays = _check_var(
|
567
|
+
return_full_arrays, 'return_full_arrays',
|
568
|
+
types=bool,
|
569
|
+
default=False,
|
570
|
+
)
|
571
|
+
|
572
|
+
# -------------------
|
573
|
+
# Preliminary check
|
574
|
+
# -------------------
|
575
|
+
|
576
|
+
dout = {}
|
577
|
+
dfail = {}
|
578
|
+
for k0, v0 in kwdargs.items():
|
579
|
+
try:
|
580
|
+
dout[k0] = np.atleast_1d(v0)
|
581
|
+
except Exception:
|
582
|
+
dfail[k0] = f"Not convertible to np.ndarray! - {v0}"
|
583
|
+
|
584
|
+
# Raise Exception
|
585
|
+
if len(dfail) > 0:
|
586
|
+
lstr = [f"\t- {k0}: {v0}" for k0, v0 in dfail.items()]
|
587
|
+
msg = (
|
588
|
+
"The following kwdargs are non-conform:\n"
|
589
|
+
+ "\n".join(lstr)
|
590
|
+
)
|
591
|
+
raise Exception(msg)
|
565
592
|
|
566
|
-
#
|
567
|
-
|
568
|
-
#
|
569
|
-
# keys, 'keys',
|
570
|
-
# default=None,
|
571
|
-
# types=list,
|
572
|
-
# types_iter=str,
|
573
|
-
# allowed=list(coll.ddata.keys()),
|
574
|
-
# )
|
593
|
+
# -------------------
|
594
|
+
# check ndim
|
595
|
+
# -------------------
|
575
596
|
|
576
|
-
|
577
|
-
|
578
|
-
# # ----------------------
|
597
|
+
dndim = {k0: v0.ndim for k0, v0 in dout.items() if v0.shape != (1,)}
|
598
|
+
lndim = list(set(dndim.values()))
|
579
599
|
|
580
|
-
|
581
|
-
|
600
|
+
if len(lndim) == 0:
|
601
|
+
# all scalar
|
602
|
+
if return_full_arrays:
|
603
|
+
return dout, (1,)
|
604
|
+
else:
|
605
|
+
return {k0: v0[0] for k0, v0 in dout.items()}, None
|
582
606
|
|
583
|
-
|
584
|
-
|
585
|
-
# for k0, v0 in coll._ddata.items():
|
586
|
-
# if v0['ref'] == (rr,):
|
587
|
-
# if k0 not in lk0:
|
588
|
-
# lk0.append(k0)
|
607
|
+
elif len(lndim) == 1:
|
608
|
+
ndim = lndim[0]
|
589
609
|
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
610
|
+
else:
|
611
|
+
lstr = [f"\t- {k0}: {v0}" for k0, v0 in dndim.items()]
|
612
|
+
msg = (
|
613
|
+
"Some keyword args have non-compatible dimensions:\n"
|
614
|
+
+ "\n".join(lstr)
|
615
|
+
)
|
616
|
+
raise Exception(msg)
|
595
617
|
|
596
|
-
#
|
618
|
+
# -------------------
|
619
|
+
# check shapes
|
620
|
+
# -------------------
|
597
621
|
|
598
|
-
|
622
|
+
dfail = {}
|
623
|
+
shapef = np.ones((ndim,), dtype=int)
|
624
|
+
for k0, v0 in dout.items():
|
625
|
+
|
626
|
+
if v0.shape == (1,):
|
627
|
+
continue
|
628
|
+
|
629
|
+
for ii in range(ndim):
|
630
|
+
if v0.shape[ii] == 1:
|
631
|
+
pass
|
632
|
+
elif shapef[ii] == 1:
|
633
|
+
shapef[ii] = v0.shape[ii]
|
634
|
+
elif v0.shape[ii] == shapef[ii]:
|
635
|
+
pass
|
636
|
+
else:
|
637
|
+
dfail[k0] = f"Non-compatible shape = {v0.shape} (ii = {ii})"
|
638
|
+
continue
|
639
|
+
|
640
|
+
shapef = tuple(shapef)
|
641
|
+
|
642
|
+
# raise Exception if needed
|
643
|
+
if len(dfail) > 0:
|
644
|
+
lstr = [f"\t- {k0}: {v0}" for k0, v0 in dfail.items()]
|
645
|
+
msg = (
|
646
|
+
"The following keywords args have non-compatible shape:\n"
|
647
|
+
+ "\n".join(lstr)
|
648
|
+
+ f"\nReference shape: {shapef}\n"
|
649
|
+
)
|
650
|
+
raise Exception(msg)
|
651
|
+
|
652
|
+
# -------------------
|
653
|
+
# reshape output
|
654
|
+
# -------------------
|
655
|
+
|
656
|
+
if return_full_arrays is True:
|
657
|
+
for k0, v0 in dout.items():
|
658
|
+
if v0.shape == (1,):
|
659
|
+
dout[k0] = np.full(shapef, v0[0])
|
660
|
+
elif v0.shape != shapef:
|
661
|
+
dout[k0] = np.broadcast_to(v0, shapef)
|
662
|
+
|
663
|
+
else:
|
664
|
+
for k0, v0 in dout.items():
|
665
|
+
if v0.shape == (1,):
|
666
|
+
dout[k0] = v0[0]
|
667
|
+
|
668
|
+
return dout, shapef
|
669
|
+
|
670
|
+
|
671
|
+
# #############################################################################
|
672
|
+
# #############################################################################
|
673
|
+
# Utilities for plotting
|
674
|
+
# #############################################################################
|
599
675
|
|
600
676
|
|
601
677
|
def _check_dax(dax=None, main=None):
|
@@ -724,7 +800,7 @@ def _check_lim(lim):
|
|
724
800
|
if len(dfail) > 0:
|
725
801
|
lstr = [f"\t- lim[{ii}]: {vv}" for ii, vv in dfail.items()]
|
726
802
|
msg = (
|
727
|
-
"The following non-conformities in lim have been identified:\n"
|
803
|
+
"The following non-conformities in lim have been identified:\n"
|
728
804
|
+ "\n".join(lstr)
|
729
805
|
)
|
730
806
|
raise Exception(msg)
|
@@ -780,7 +856,6 @@ def _apply_lim(lim=None, data=None, logic=None):
|
|
780
856
|
return ind
|
781
857
|
|
782
858
|
|
783
|
-
|
784
859
|
def _apply_dlim(dlim=None, logic_intervals=None, logic=None, ddata=None):
|
785
860
|
|
786
861
|
# ------------
|
@@ -840,6 +915,7 @@ def _apply_dlim(dlim=None, logic_intervals=None, logic=None, ddata=None):
|
|
840
915
|
lstr = [f"\t- {k0}: {v0}" for k0, v0 in dfail.items()]
|
841
916
|
msg = (
|
842
917
|
"The following keys have non-compatible shapes:\n"
|
918
|
+
+ "\n".join(lstr)
|
843
919
|
)
|
844
920
|
raise Exception(msg)
|
845
921
|
|
@@ -901,11 +977,6 @@ def _apply_dlim(dlim=None, logic_intervals=None, logic=None, ddata=None):
|
|
901
977
|
|
902
978
|
def _check_cmap_vminvmax(data=None, cmap=None, vmin=None, vmax=None):
|
903
979
|
# cmap
|
904
|
-
c0 = (
|
905
|
-
cmap is None
|
906
|
-
or vmin is None
|
907
|
-
or vmax is None
|
908
|
-
)
|
909
980
|
if cmap is None or vmin is None or vmax is None:
|
910
981
|
nanmax = np.nanmax(data)
|
911
982
|
nanmin = np.nanmin(data)
|
@@ -929,4 +1000,4 @@ def _check_cmap_vminvmax(data=None, cmap=None, vmin=None, vmax=None):
|
|
929
1000
|
else:
|
930
1001
|
vmax = nanmax
|
931
1002
|
|
932
|
-
return cmap, vmin, vmax
|
1003
|
+
return cmap, vmin, vmax
|
@@ -14,6 +14,7 @@ import numpy as np
|
|
14
14
|
import matplotlib.pyplot as plt
|
15
15
|
|
16
16
|
# datastock-specific
|
17
|
+
from .._generic_check import _check_all_broadcastable
|
17
18
|
from .._class import DataStock
|
18
19
|
from .._saveload import load
|
19
20
|
|
@@ -228,6 +229,46 @@ class Test01_Instanciate():
|
|
228
229
|
def test03_add_obj(self):
|
229
230
|
_add_obj(st=self.st, nc=self.nc)
|
230
231
|
|
232
|
+
# ------------------------
|
233
|
+
# Tools
|
234
|
+
# ------------------------
|
235
|
+
|
236
|
+
def test04_check_all_broadcastable(self):
|
237
|
+
# all scalar
|
238
|
+
dout, shape = _check_all_broadcastable(a=1, b=2)
|
239
|
+
|
240
|
+
# scalar + arrays
|
241
|
+
dout, shape = _check_all_broadcastable(a=1, b=(1, 2, 3))
|
242
|
+
|
243
|
+
# all arrays
|
244
|
+
dout, shape = _check_all_broadcastable(
|
245
|
+
a=(1, 2, 3),
|
246
|
+
b=(1, 2, 3),
|
247
|
+
)
|
248
|
+
|
249
|
+
# all arrays - 2d
|
250
|
+
dout, shape = _check_all_broadcastable(
|
251
|
+
a=np.r_[1, 2, 3][:, None],
|
252
|
+
b=np.r_[10, 20][None, :],
|
253
|
+
)
|
254
|
+
|
255
|
+
# check flag
|
256
|
+
err = False
|
257
|
+
try:
|
258
|
+
dout, shape = _check_all_broadcastable(a=(1, 2), b=(1, 2, 3))
|
259
|
+
except Exception:
|
260
|
+
err = True
|
261
|
+
assert err is True
|
262
|
+
|
263
|
+
# all arrays - mix
|
264
|
+
dout, shape = _check_all_broadcastable(
|
265
|
+
a=np.r_[1, 2, 3][:, None],
|
266
|
+
b=np.r_[10, 20][None, :],
|
267
|
+
c=3,
|
268
|
+
return_full_arrays=True,
|
269
|
+
)
|
270
|
+
assert all([v0.shape == (3, 2) for v0 in dout.values()])
|
271
|
+
|
231
272
|
|
232
273
|
#######################################################
|
233
274
|
#
|
@@ -639,4 +680,4 @@ class Test02_Manipulate():
|
|
639
680
|
msg = st2.__eq__(self.st, returnas=str)
|
640
681
|
if msg is not True:
|
641
682
|
raise Exception(msg)
|
642
|
-
os.remove(pfe)
|
683
|
+
os.remove(pfe)
|
datastock/version.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# Do not edit, pipeline versioning governed by git tags!
|
2
|
-
__version__ = '0.0.
|
2
|
+
__version__ = '0.0.49'
|
@@ -1,20 +1,43 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: datastock
|
3
|
-
Version: 0.0.
|
4
|
-
Summary:
|
3
|
+
Version: 0.0.49
|
4
|
+
Summary: Generic handler for multiple heterogenous numpy arrays and subclasses
|
5
5
|
Home-page: https://github.com/ToFuProject/datastock
|
6
6
|
Author: Didier VEZINET
|
7
|
-
Author-email: didier.vezinet@gmail.com
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
Author-email: Didier VEZINET <didier.vezinet@gmail.com>
|
8
|
+
Maintainer-email: Didier VEZINET <didier.vezinet@gmail.com>
|
9
|
+
License: MIT License
|
10
|
+
|
11
|
+
Copyright (c) 2022 ToFuProject
|
12
|
+
|
13
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
14
|
+
of this software and associated documentation files (the "Software"), to deal
|
15
|
+
in the Software without restriction, including without limitation the rights
|
16
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
17
|
+
copies of the Software, and to permit persons to whom the Software is
|
18
|
+
furnished to do so, subject to the following conditions:
|
19
|
+
|
20
|
+
The above copyright notice and this permission notice shall be included in all
|
21
|
+
copies or substantial portions of the Software.
|
22
|
+
|
23
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
24
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
25
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
26
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
27
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
28
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
29
|
+
SOFTWARE.
|
30
|
+
|
31
|
+
Keywords: data,analysis,interactive,heterogeneous arrays,numpy,Collection
|
32
|
+
Classifier: Development Status :: 5 - Production/Stable
|
11
33
|
Classifier: Intended Audience :: Science/Research
|
12
|
-
Classifier:
|
13
|
-
Classifier: License :: OSI Approved :: MIT License
|
34
|
+
Classifier: Programming Language :: Python :: 3
|
14
35
|
Classifier: Programming Language :: Python :: 3.6
|
15
36
|
Classifier: Programming Language :: Python :: 3.7
|
16
37
|
Classifier: Programming Language :: Python :: 3.8
|
17
|
-
Classifier:
|
38
|
+
Classifier: Programming Language :: Python :: 3.9
|
39
|
+
Classifier: Programming Language :: Python :: 3.10
|
40
|
+
Classifier: Programming Language :: Python :: 3.11
|
18
41
|
Requires-Python: >=3.6
|
19
42
|
Description-Content-Type: text/markdown
|
20
43
|
License-File: LICENSE
|
@@ -29,6 +52,10 @@ Requires-Dist: pytest; extra == "dev"
|
|
29
52
|
Requires-Dist: sphinx; extra == "dev"
|
30
53
|
Requires-Dist: sphinx-gallery; extra == "dev"
|
31
54
|
Requires-Dist: sphinx-bootstrap-theme; extra == "dev"
|
55
|
+
Provides-Extra: formatting
|
56
|
+
Requires-Dist: ruff; extra == "formatting"
|
57
|
+
Provides-Extra: linting
|
58
|
+
Requires-Dist: ruff; extra == "linting"
|
32
59
|
|
33
60
|
[](https://anaconda.org/conda-forge/datastock)
|
34
61
|
[](https://anaconda.org/conda-forge/datastock)
|
@@ -12,13 +12,13 @@ datastock/_class1_domain.py,sha256=_xUCnwWJX5wPPYrpiGGrRwrPLmiO5BMm3nmYvn_YEOg,6
|
|
12
12
|
datastock/_class1_interpolate.py,sha256=3VKGMDsiWFQUguMHxMaTQTyMhcN8Ikg1PmaH6TjIeLg,38348
|
13
13
|
datastock/_class1_show.py,sha256=hqd-FeJ1NqiOzbrHzGMrwIo8_lLsjC199Zmw68NqkDQ,11745
|
14
14
|
datastock/_class1_uniformize.py,sha256=dEJime_0SqmW8hX8ooZpHsPI_d8CIE9U9Yz9GhqsEUY,28433
|
15
|
-
datastock/_class2.py,sha256=
|
16
|
-
datastock/_class2_interactivity.py,sha256=
|
15
|
+
datastock/_class2.py,sha256=Mkqwhkl-YDAT0Wx5bHkUHwMW2L6feACkxmifvvzUnYk,45626
|
16
|
+
datastock/_class2_interactivity.py,sha256=glAqqkIyH8JBVj0AsgJPNlaltcTIXB0iCqNBq3gKSb8,17198
|
17
17
|
datastock/_class3.py,sha256=CH1oD_lTfVlcDp29L_iwzSfP78vX6_edDmZG9aSb1Ks,10848
|
18
18
|
datastock/_direct_calls.py,sha256=EHFwI2mGMDqGz8_Bv2BseMBX4J8dSdE_RcNX3pt0ZYY,1801
|
19
19
|
datastock/_export_dataframe.py,sha256=fy-uJR3EhDlHvd9ls1EQna_C8fyha1jCJLu1DTKTkdo,1576
|
20
20
|
datastock/_find_plateau.py,sha256=sqnAuy0361DXkqBb_Lo1MmIGjn35tnKFvcv6MW6hifs,2685
|
21
|
-
datastock/_generic_check.py,sha256=
|
21
|
+
datastock/_generic_check.py,sha256=4NmG7iPa02bxOC5K-6qw63UahQ2FNDbeKu_AGBpNMtc,26717
|
22
22
|
datastock/_generic_utils.py,sha256=_iV51SiujEmQfAlvyIEW4BvzIXdhPCD-vumV5DmUL44,23421
|
23
23
|
datastock/_generic_utils_plot.py,sha256=xrWzeZFtdTAs-RO2DfpCRveJPqw_p4lRFtQuuAn1pD8,3709
|
24
24
|
datastock/_plot_BvsA_as_distribution.py,sha256=fpRhlbv3Bk96buANC46Brc9hdLxkOAsoKpE5A9pohG0,15389
|
@@ -32,12 +32,17 @@ datastock/_plot_correlations.py,sha256=ITOypu_AEoKl0ihxocV-JVTXIHqut6p9TfG-xZmQy
|
|
32
32
|
datastock/_plot_old_backup.py,sha256=XixTi2CiihKjtQP0TRycH0b25caWN1m35DgpsDeiWZE,21729
|
33
33
|
datastock/_plot_text.py,sha256=wQPqjfpLyIioS2JeOt3E9C9HgYUJ49YEoOgRuKYvAR8,3143
|
34
34
|
datastock/_saveload.py,sha256=1vAMp27KfqXbo5b_Pi8hJux0stsHq6dO5vy8k1d4_iA,14141
|
35
|
-
datastock/version.py,sha256=
|
35
|
+
datastock/version.py,sha256=3LGOrbR0FKVCMYF5gFB0Z3jb_YfYLLDyuMY0M-oeJrU,80
|
36
36
|
datastock/tests/__init__.py,sha256=teOo2xP0IO7PQMuMDmum61XVHe2TuxW3BiHiL73X8jQ,35
|
37
|
-
datastock/tests/test_01_DataStock.py,sha256=
|
37
|
+
datastock/tests/test_01_DataStock.py,sha256=aUseXH2zYnFtNDJSCuEROgPxfKKNeLCkCQSR--_Fheg,19176
|
38
38
|
datastock/tests/output/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
datastock-0.0.
|
39
|
+
scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
40
|
+
scripts/_bash_version.py,sha256=B-NJPgjuqGiXVVUEBJDHP4uDc5yBDFvBX2mmvL2T4E0,1837
|
41
|
+
scripts/_dparser.py,sha256=TvJ4ZWbOX0sN8Xqa-IRhcqtyOIIewRTkeb-OE0vXWbs,2755
|
42
|
+
scripts/main.py,sha256=JrRRQK3BCnepBa0RMsG3OtpMCoVRo_RcElMScPcbvF4,3530
|
43
|
+
datastock-0.0.49.dist-info/LICENSE,sha256=V1uXqi3vxR0QhB4QdFyjkynl6jpN4wZmlB5EMYJk0NM,1068
|
44
|
+
datastock-0.0.49.dist-info/METADATA,sha256=KVm2w4WDF--bfwCyc8TaKyn_5vvc45wReU07WuhnkVY,10197
|
45
|
+
datastock-0.0.49.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
46
|
+
datastock-0.0.49.dist-info/entry_points.txt,sha256=GqmxVVp9G2ulEDaS9gLpwSVOBLF_FEBlj8k5Z6TJKsc,42
|
47
|
+
datastock-0.0.49.dist-info/top_level.txt,sha256=4mahLJQfvNnKq213ODWrMXeNzyoyjzRRke_OAw07iA8,33
|
48
|
+
datastock-0.0.49.dist-info/RECORD,,
|
scripts/__init__.py
ADDED
File without changes
|
scripts/_bash_version.py
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
|
3
|
+
# Built-in
|
4
|
+
import os
|
5
|
+
|
6
|
+
|
7
|
+
###################################################
|
8
|
+
###################################################
|
9
|
+
# DEFAULTS
|
10
|
+
###################################################
|
11
|
+
|
12
|
+
|
13
|
+
_PATH_HERE = os.path.dirname(__file__)
|
14
|
+
|
15
|
+
|
16
|
+
###################################################
|
17
|
+
###################################################
|
18
|
+
# function
|
19
|
+
###################################################
|
20
|
+
|
21
|
+
|
22
|
+
def main(
|
23
|
+
verb=None,
|
24
|
+
envvar=None,
|
25
|
+
path=None,
|
26
|
+
warn=None,
|
27
|
+
force=None,
|
28
|
+
ddef=None,
|
29
|
+
):
|
30
|
+
""" Print version """
|
31
|
+
|
32
|
+
# --------------
|
33
|
+
# Check inputs
|
34
|
+
# --------------
|
35
|
+
|
36
|
+
kwd = locals()
|
37
|
+
for k0 in set(ddef.keys()).intersection(kwd.keys()):
|
38
|
+
if kwd[k0] is None:
|
39
|
+
kwd[k0] = ddef[k0]
|
40
|
+
verb, path = kwd['verb'], kwd['path']
|
41
|
+
|
42
|
+
# verb, warn, force
|
43
|
+
dbool = {'verb': verb}
|
44
|
+
for k0, v0 in dbool.items():
|
45
|
+
if v0 is None:
|
46
|
+
dbool[k0] = ddef[k0]
|
47
|
+
if not isinstance(dbool[k0], bool):
|
48
|
+
msg = (
|
49
|
+
f"Arg '{k0}' must be a bool\n"
|
50
|
+
f"\t- provided: {dbool[k0]}\n"
|
51
|
+
)
|
52
|
+
raise Exception(msg)
|
53
|
+
|
54
|
+
# --------------
|
55
|
+
# Fetch version from git tags, and write to version.py
|
56
|
+
# Also, when git is not available (PyPi package), use stored version.py
|
57
|
+
|
58
|
+
pfe = os.path.join(path, 'version.py')
|
59
|
+
if not os.path.isfile(pfe):
|
60
|
+
msg = (
|
61
|
+
"It seems your current install has no version.py:\n"
|
62
|
+
f"\t- looked for: {pfe}"
|
63
|
+
)
|
64
|
+
raise Exception(msg)
|
65
|
+
|
66
|
+
# --------------
|
67
|
+
# Read file
|
68
|
+
|
69
|
+
with open(pfe, 'r') as fh:
|
70
|
+
version = fh.read().strip().split("=")[-1].replace("'", '')
|
71
|
+
version = version.lower().replace('v', '').replace(' ', '')
|
72
|
+
|
73
|
+
# --------------
|
74
|
+
# Outputs
|
75
|
+
|
76
|
+
if dbool['verb'] is True:
|
77
|
+
print(version)
|
scripts/_dparser.py
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
import sys
|
2
|
+
import os
|
3
|
+
import getpass
|
4
|
+
import argparse
|
5
|
+
|
6
|
+
|
7
|
+
# test if in a git repo
|
8
|
+
_HERE = os.path.abspath(os.path.dirname(__file__))
|
9
|
+
_REPOPATH = os.path.dirname(_HERE)
|
10
|
+
_REPO_NAME = 'datastock'
|
11
|
+
|
12
|
+
|
13
|
+
# #############################################################################
|
14
|
+
# utility functions
|
15
|
+
# #############################################################################
|
16
|
+
|
17
|
+
|
18
|
+
def _str2bool(v):
|
19
|
+
if isinstance(v, bool):
|
20
|
+
return v
|
21
|
+
elif v.lower() in ['yes', 'true', 'y', 't', '1']:
|
22
|
+
return True
|
23
|
+
elif v.lower() in ['no', 'false', 'n', 'f', '0']:
|
24
|
+
return False
|
25
|
+
else:
|
26
|
+
raise argparse.ArgumentTypeError('Boolean value expected!')
|
27
|
+
|
28
|
+
|
29
|
+
def _str2boolstr(v):
|
30
|
+
if isinstance(v, bool):
|
31
|
+
return v
|
32
|
+
elif isinstance(v, str):
|
33
|
+
if v.lower() in ['yes', 'true', 'y', 't', '1']:
|
34
|
+
return True
|
35
|
+
elif v.lower() in ['no', 'false', 'n', 'f', '0']:
|
36
|
+
return False
|
37
|
+
elif v.lower() == 'none':
|
38
|
+
return None
|
39
|
+
else:
|
40
|
+
return v
|
41
|
+
else:
|
42
|
+
raise argparse.ArgumentTypeError('Boolean, None or str expected!')
|
43
|
+
|
44
|
+
|
45
|
+
def _str2tlim(v):
|
46
|
+
c0 = (v.isdigit()
|
47
|
+
or ('.' in v
|
48
|
+
and len(v.split('.')) == 2
|
49
|
+
and all([vv.isdigit() for vv in v.split('.')])))
|
50
|
+
if c0 is True:
|
51
|
+
v = float(v)
|
52
|
+
elif v.lower() == 'none':
|
53
|
+
v = None
|
54
|
+
return v
|
55
|
+
|
56
|
+
|
57
|
+
# #############################################################################
|
58
|
+
# Parser for version
|
59
|
+
# #############################################################################
|
60
|
+
|
61
|
+
|
62
|
+
def parser_version():
|
63
|
+
msg = f""" Get {_REPO_NAME} version from bash
|
64
|
+
|
65
|
+
If run from a git repo containing {_REPO_NAME}, just returns git describe
|
66
|
+
Otherwise reads the version stored in {_REPO_NAME}/version.py
|
67
|
+
|
68
|
+
"""
|
69
|
+
ddef = {
|
70
|
+
'path': os.path.join(_REPOPATH, _REPO_NAME),
|
71
|
+
'envvar': False,
|
72
|
+
'verb': True,
|
73
|
+
'warn': True,
|
74
|
+
'force': False,
|
75
|
+
'name': f'{_REPO_NAME.upper()}_VERSION',
|
76
|
+
}
|
77
|
+
|
78
|
+
# Instanciate parser
|
79
|
+
parser = argparse.ArgumentParser(description=msg)
|
80
|
+
|
81
|
+
# optional path
|
82
|
+
parser.add_argument(
|
83
|
+
'-p', '--path',
|
84
|
+
type=str,
|
85
|
+
help='source directory where version.py is found',
|
86
|
+
required=False,
|
87
|
+
default=ddef['path'],
|
88
|
+
)
|
89
|
+
|
90
|
+
# verb
|
91
|
+
parser.add_argument(
|
92
|
+
'-v', '--verb',
|
93
|
+
type=_str2bool,
|
94
|
+
help='flag indicating whether to print the version',
|
95
|
+
required=False,
|
96
|
+
default=ddef['verb'],
|
97
|
+
)
|
98
|
+
|
99
|
+
return ddef, parser
|
100
|
+
|
101
|
+
|
102
|
+
# #############################################################################
|
103
|
+
# Parser dict
|
104
|
+
# #############################################################################
|
105
|
+
|
106
|
+
|
107
|
+
_DPARSER = {
|
108
|
+
'version': parser_version,
|
109
|
+
}
|
scripts/main.py
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
|
3
|
+
# Built-in
|
4
|
+
import sys
|
5
|
+
import os
|
6
|
+
import argparse
|
7
|
+
|
8
|
+
|
9
|
+
# import parser dicti
|
10
|
+
from . import _dparser
|
11
|
+
from . import _bash_version
|
12
|
+
|
13
|
+
|
14
|
+
###################################################
|
15
|
+
###################################################
|
16
|
+
# default values
|
17
|
+
###################################################
|
18
|
+
|
19
|
+
|
20
|
+
_PATH_HERE = os.path.abspath(os.path.dirname(__file__))
|
21
|
+
|
22
|
+
|
23
|
+
_LOPTIONS = ['--version']
|
24
|
+
_LOPSTRIP = [ss.strip('--') for ss in _LOPTIONS]
|
25
|
+
|
26
|
+
|
27
|
+
###################################################
|
28
|
+
###################################################
|
29
|
+
# function
|
30
|
+
###################################################
|
31
|
+
|
32
|
+
|
33
|
+
def datastock_bash(option=None, ddef=None, **kwdargs):
|
34
|
+
""" Print tofu version and / or store in environment variable """
|
35
|
+
|
36
|
+
# --------------
|
37
|
+
# Check inputs
|
38
|
+
# --------------
|
39
|
+
|
40
|
+
if option not in _LOPSTRIP:
|
41
|
+
msg = (
|
42
|
+
"Provided option is not acceptable:\n"
|
43
|
+
f"\t- available: {_LOPSTRIP}\n"
|
44
|
+
f"\t- provided: {option}"
|
45
|
+
)
|
46
|
+
raise Exception(msg)
|
47
|
+
|
48
|
+
# --------------
|
49
|
+
# call corresponding bash command
|
50
|
+
# --------------
|
51
|
+
|
52
|
+
if option == 'version':
|
53
|
+
_bash_version.main(
|
54
|
+
ddef=ddef,
|
55
|
+
**kwdargs,
|
56
|
+
)
|
57
|
+
|
58
|
+
|
59
|
+
###################################################
|
60
|
+
###################################################
|
61
|
+
# main
|
62
|
+
###################################################
|
63
|
+
|
64
|
+
|
65
|
+
def main():
|
66
|
+
# Parse input arguments
|
67
|
+
msg = """ Get tofu version from bash optionally set an enviroment variable
|
68
|
+
|
69
|
+
If run from a git repo containing tofu, simply returns git describe
|
70
|
+
Otherwise reads the tofu version stored in tofu/version.py
|
71
|
+
|
72
|
+
"""
|
73
|
+
|
74
|
+
# ------------------
|
75
|
+
# Instanciate parser
|
76
|
+
# ------------------
|
77
|
+
|
78
|
+
parser = argparse.ArgumentParser(description=msg)
|
79
|
+
|
80
|
+
# ---------------------
|
81
|
+
# which script to call
|
82
|
+
# ---------------------
|
83
|
+
|
84
|
+
parser.add_argument(
|
85
|
+
'option',
|
86
|
+
nargs='?',
|
87
|
+
type=str,
|
88
|
+
default='None',
|
89
|
+
)
|
90
|
+
|
91
|
+
#
|
92
|
+
parser.add_argument(
|
93
|
+
'-v', '--version',
|
94
|
+
help='get tofu current version',
|
95
|
+
required=False,
|
96
|
+
action='store_true',
|
97
|
+
)
|
98
|
+
|
99
|
+
# Others
|
100
|
+
# parser.add_argument('kwd', nargs='?', type=str, default='None')
|
101
|
+
|
102
|
+
# -------------------
|
103
|
+
# check options
|
104
|
+
# -------------------
|
105
|
+
|
106
|
+
if sys.argv[1] not in _LOPTIONS:
|
107
|
+
msg = (
|
108
|
+
"Provided option is not acceptable:\n"
|
109
|
+
f"\t- available: {_LOPTIONS}\n"
|
110
|
+
f"\t- provided: {sys.argv[1]}\n"
|
111
|
+
)
|
112
|
+
raise Exception(msg)
|
113
|
+
|
114
|
+
if len(sys.argv) > 2:
|
115
|
+
if any([ss in sys.argv[2:] for ss in _LOPTIONS]):
|
116
|
+
lopt = [ss for ss in sys.argv[1:] if ss in _LOPTIONS]
|
117
|
+
msg = (
|
118
|
+
"Only one option can be provided!\n"
|
119
|
+
f"\t- provided: {lopt}"
|
120
|
+
)
|
121
|
+
raise Exception(msg)
|
122
|
+
|
123
|
+
# ----------------------
|
124
|
+
# def values and parser
|
125
|
+
# ----------------------
|
126
|
+
|
127
|
+
option = sys.argv[1].strip('--')
|
128
|
+
ddef, parser = _dparser._DPARSER[option]()
|
129
|
+
if len(sys.argv) > 2:
|
130
|
+
kwdargs = dict(parser.parse_args(sys.argv[2:])._get_kwargs())
|
131
|
+
else:
|
132
|
+
kwdargs = {}
|
133
|
+
|
134
|
+
# ----------------------
|
135
|
+
# Call function
|
136
|
+
# ----------------------
|
137
|
+
|
138
|
+
datastock_bash(option=option, ddef=ddef, **kwdargs)
|
139
|
+
|
140
|
+
|
141
|
+
###################################################
|
142
|
+
###################################################
|
143
|
+
# __main__
|
144
|
+
###################################################
|
145
|
+
|
146
|
+
if __name__ == '__main__':
|
147
|
+
main()
|
File without changes
|