sdata 0.25.0__tar.gz → 0.25.3__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 (107) hide show
  1. {sdata-0.25.0/sdata.egg-info → sdata-0.25.3}/PKG-INFO +16 -3
  2. {sdata-0.25.0 → sdata-0.25.3}/README.md +1 -1
  3. sdata-0.25.3/pyproject.toml +3 -0
  4. {sdata-0.25.0 → sdata-0.25.3}/sdata/__init__.py +2 -1
  5. sdata-0.25.3/sdata/base.py +131 -0
  6. {sdata-0.25.0 → sdata-0.25.3}/sdata/data.py +29 -6
  7. sdata-0.25.3/sdata/iolib/json1sqlitestore.py +596 -0
  8. sdata-0.25.3/sdata/iolib/jsonsqlitestore.py +691 -0
  9. sdata-0.25.3/sdata/iolib/owncloudfs.py +105 -0
  10. {sdata-0.25.0 → sdata-0.25.3}/sdata/suuid.py +18 -0
  11. {sdata-0.25.0 → sdata-0.25.3/sdata.egg-info}/PKG-INFO +16 -3
  12. {sdata-0.25.0 → sdata-0.25.3}/sdata.egg-info/SOURCES.txt +6 -0
  13. sdata-0.25.3/tests/iolib/test_jsonsqlitestore.py +156 -0
  14. {sdata-0.25.0 → sdata-0.25.3}/LICENSE-MIT +0 -0
  15. {sdata-0.25.0 → sdata-0.25.3}/MANIFEST.in +0 -0
  16. {sdata-0.25.0 → sdata-0.25.3}/sdata/blob.py +0 -0
  17. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/__init__.py +0 -0
  18. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/attrdict/__init__.py +0 -0
  19. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/attrdict/default.py +0 -0
  20. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/attrdict/dictionary.py +0 -0
  21. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/attrdict/mapping.py +0 -0
  22. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/attrdict/merge.py +0 -0
  23. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/attrdict/mixins.py +0 -0
  24. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/piexif/__init__.py +0 -0
  25. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/piexif/_common.py +0 -0
  26. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/piexif/_dump.py +0 -0
  27. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/piexif/_exceptions.py +0 -0
  28. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/piexif/_exif.py +0 -0
  29. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/piexif/_insert.py +0 -0
  30. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/piexif/_load.py +0 -0
  31. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/piexif/_remove.py +0 -0
  32. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/piexif/_transplant.py +0 -0
  33. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/piexif/_webp.py +0 -0
  34. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/piexif/helper.py +0 -0
  35. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/ranger/__init__.py +0 -0
  36. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/ranger/collections/__init__.py +0 -0
  37. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/ranger/collections/rangebucketmap.py +0 -0
  38. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/ranger/collections/rangemap.py +0 -0
  39. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/ranger/collections/rangeset.py +0 -0
  40. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/ranger/range/__init__.py +0 -0
  41. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/ranger/range/cut.py +0 -0
  42. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/ranger/range/range.py +0 -0
  43. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/semver.py +0 -0
  44. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/simple_graph_db/LICENSE +0 -0
  45. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/simple_graph_db/__init__.py +0 -0
  46. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/simple_graph_db/database.py +0 -0
  47. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/simple_graph_db/schema.sql +0 -0
  48. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/sobol_seq.py +0 -0
  49. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/sortedcontainers/LICENSE +0 -0
  50. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/sortedcontainers/__init__.py +0 -0
  51. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/sortedcontainers/sorteddict.py +0 -0
  52. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/sortedcontainers/sortedlist.py +0 -0
  53. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/sortedcontainers/sortedset.py +0 -0
  54. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/sqlitedict.py +0 -0
  55. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/timeflake/__init__.py +0 -0
  56. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/timeflake/flake.py +0 -0
  57. {sdata-0.25.0 → sdata-0.25.3}/sdata/contrib/timeflake/utils.py +0 -0
  58. {sdata-0.25.0 → sdata-0.25.3}/sdata/doe.py +0 -0
  59. {sdata-0.25.0 → sdata-0.25.3}/sdata/experiments/__init__.py +0 -0
  60. {sdata-0.25.0 → sdata-0.25.3}/sdata/experiments/ks2.py +0 -0
  61. {sdata-0.25.0 → sdata-0.25.3}/sdata/experiments/lapshear.py +0 -0
  62. {sdata-0.25.0 → sdata-0.25.3}/sdata/experiments/material.py +0 -0
  63. {sdata-0.25.0 → sdata-0.25.3}/sdata/image.py +0 -0
  64. {sdata-0.25.0 → sdata-0.25.3}/sdata/iolib/__init__.py +0 -0
  65. {sdata-0.25.0 → sdata-0.25.3}/sdata/iolib/db.py +0 -0
  66. {sdata-0.25.0 → sdata-0.25.3}/sdata/iolib/hashtree.py +0 -0
  67. {sdata-0.25.0 → sdata-0.25.3}/sdata/iolib/hdf.py +0 -0
  68. {sdata-0.25.0 → sdata-0.25.3}/sdata/iolib/isomme.py +0 -0
  69. {sdata-0.25.0 → sdata-0.25.3}/sdata/iolib/pgp.py +0 -0
  70. {sdata-0.25.0 → sdata-0.25.3}/sdata/iolib/pud.py +0 -0
  71. {sdata-0.25.0 → sdata-0.25.3}/sdata/iolib/simple_signature.py +0 -0
  72. {sdata-0.25.0 → sdata-0.25.3}/sdata/iolib/vault.py +0 -0
  73. {sdata-0.25.0 → sdata-0.25.3}/sdata/metadata.py +0 -0
  74. {sdata-0.25.0 → sdata-0.25.3}/sdata/node.py +0 -0
  75. {sdata-0.25.0 → sdata-0.25.3}/sdata/parameter.py +0 -0
  76. {sdata-0.25.0 → sdata-0.25.3}/sdata/parameters_deprecated.py +0 -0
  77. {sdata-0.25.0 → sdata-0.25.3}/sdata/timestamp.py +0 -0
  78. {sdata-0.25.0 → sdata-0.25.3}/sdata/tools.py +0 -0
  79. {sdata-0.25.0 → sdata-0.25.3}/sdata/workbook.py +0 -0
  80. {sdata-0.25.0 → sdata-0.25.3}/sdata.egg-info/dependency_links.txt +0 -0
  81. {sdata-0.25.0 → sdata-0.25.3}/sdata.egg-info/requires.txt +0 -0
  82. {sdata-0.25.0 → sdata-0.25.3}/sdata.egg-info/top_level.txt +0 -0
  83. {sdata-0.25.0 → sdata-0.25.3}/setup.cfg +0 -0
  84. {sdata-0.25.0 → sdata-0.25.3}/setup.py +0 -0
  85. {sdata-0.25.0 → sdata-0.25.3}/tests/__init__.py +0 -0
  86. {sdata-0.25.0 → sdata-0.25.3}/tests/iolib/__init__.py +0 -0
  87. {sdata-0.25.0 → sdata-0.25.3}/tests/iolib/pud/__init__.py +0 -0
  88. {sdata-0.25.0 → sdata-0.25.3}/tests/iolib/pud/test_pud.py +0 -0
  89. {sdata-0.25.0 → sdata-0.25.3}/tests/iolib/test_hasttree.py +0 -0
  90. {sdata-0.25.0 → sdata-0.25.3}/tests/iolib/test_hdf.py +0 -0
  91. {sdata-0.25.0 → sdata-0.25.3}/tests/test_attribute.py +0 -0
  92. {sdata-0.25.0 → sdata-0.25.3}/tests/test_blob.py +0 -0
  93. {sdata-0.25.0 → sdata-0.25.3}/tests/test_data.py +0 -0
  94. {sdata-0.25.0 → sdata-0.25.3}/tests/test_image.py +0 -0
  95. {sdata-0.25.0 → sdata-0.25.3}/tests/test_io.py +0 -0
  96. {sdata-0.25.0 → sdata-0.25.3}/tests/test_ks2.py +0 -0
  97. {sdata-0.25.0 → sdata-0.25.3}/tests/test_metadata.py +0 -0
  98. {sdata-0.25.0 → sdata-0.25.3}/tests/test_parameter.py +0 -0
  99. {sdata-0.25.0 → sdata-0.25.3}/tests/test_sqlite.py +0 -0
  100. {sdata-0.25.0 → sdata-0.25.3}/tests/test_suuid.py +0 -0
  101. {sdata-0.25.0 → sdata-0.25.3}/tests/test_table.py +0 -0
  102. {sdata-0.25.0 → sdata-0.25.3}/tests/test_testprogram.py +0 -0
  103. {sdata-0.25.0 → sdata-0.25.3}/tests/test_timeflake.py +0 -0
  104. {sdata-0.25.0 → sdata-0.25.3}/tests/test_timestamp.py +0 -0
  105. {sdata-0.25.0 → sdata-0.25.3}/tests/test_tools.py +0 -0
  106. {sdata-0.25.0 → sdata-0.25.3}/tests/test_vault.py +0 -0
  107. {sdata-0.25.0 → sdata-0.25.3}/tests/test_workbook.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: sdata
3
- Version: 0.25.0
3
+ Version: 0.25.3
4
4
  Summary: a structured data format
5
5
  Home-page: https://github.com/lepy/sdata
6
6
  Author: Lepy
@@ -34,6 +34,19 @@ Requires-Dist: xlsxwriter
34
34
  Requires-Dist: pytz
35
35
  Requires-Dist: requests
36
36
  Requires-Dist: Pillow
37
+ Dynamic: author
38
+ Dynamic: author-email
39
+ Dynamic: classifier
40
+ Dynamic: description
41
+ Dynamic: description-content-type
42
+ Dynamic: home-page
43
+ Dynamic: keywords
44
+ Dynamic: license
45
+ Dynamic: license-file
46
+ Dynamic: maintainer
47
+ Dynamic: maintainer-email
48
+ Dynamic: requires-dist
49
+ Dynamic: summary
37
50
 
38
51
 
39
52
  [![PyPI version](https://badge.fury.io/py/sdata.svg)](https://badge.fury.io/py/sdata)
@@ -94,7 +107,7 @@ force force 1.234 float kN x force
94
107
 
95
108
 
96
109
  * [Das sdata-Format - slides](https://lepy.github.io/sdata/ipynb/Das_sdata_Format.slides.html#)
97
-
110
+ * https://deepwiki.com/lepy/sdata
98
111
 
99
112
  ## Demo App
100
113
 
@@ -57,7 +57,7 @@ force force 1.234 float kN x force
57
57
 
58
58
 
59
59
  * [Das sdata-Format - slides](https://lepy.github.io/sdata/ipynb/Das_sdata_Format.slides.html#)
60
-
60
+ * https://deepwiki.com/lepy/sdata
61
61
 
62
62
  ## Demo App
63
63
 
@@ -0,0 +1,3 @@
1
+ [build-system]
2
+ requires = ["setuptools>=64.0.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
@@ -1,7 +1,7 @@
1
1
  # -*-coding: utf-8-*-
2
2
  from __future__ import division
3
3
 
4
- __version__ = '0.25.0'
4
+ __version__ = '0.25.3'
5
5
  __revision__ = None
6
6
  __version_info__ = tuple([int(num) for num in __version__.split('.')])
7
7
 
@@ -20,6 +20,7 @@ import pandas
20
20
 
21
21
  from sdata.metadata import Metadata, Attribute
22
22
  from sdata.data import Data
23
+ from sdata.base import Base
23
24
  from sdata.blob import Blob
24
25
  from sdata.suuid import SUUID
25
26
  from sdata.image import Image
@@ -0,0 +1,131 @@
1
+ import sdata
2
+ from sdata import __version__
3
+ from sdata.suuid import SUUID
4
+ from sdata.metadata import Metadata, Attribute, extract_name_unit
5
+ from sdata.timestamp import now_utc_str, now_local_str, today_str
6
+ import uuid
7
+ import copy
8
+
9
+
10
+ class Base:
11
+
12
+ SDATA_VERSION = "!sdata_version"
13
+ SDATA_NAME = "!sdata_name"
14
+ SDATA_SNAME = "!sdata_sname"
15
+ SDATA_UUID = "!sdata_uuid"
16
+ SDATA_SUUID = "!sdata_suuid"
17
+ SDATA_CTIME = "!sdata_ctime"
18
+ SDATA_MTIME = "!sdata_mtime"
19
+ SDATA_PARENT = "!sdata_parent"
20
+ SDATA_CLASS = "!sdata_class"
21
+ SDATA_PROJECT = "!sdata_project"
22
+ SDATA_URL = "!sdata_url"
23
+ SDATA_COLUMN = "!sdata_column"
24
+
25
+ SDATA_ATTRIBUTES = [SDATA_VERSION, SDATA_NAME, SDATA_UUID, SDATA_SUUID, SDATA_CLASS, SDATA_PARENT, SDATA_PROJECT,
26
+ SDATA_CTIME, SDATA_MTIME, SDATA_URL]
27
+
28
+ def __init__(self, **kwargs):
29
+ name = kwargs.get("name", "N.N.")
30
+ suuid = SUUID.from_name(class_name=self.__class__.__name__, name=name)
31
+ self.metadata = Metadata(name=suuid.sname)
32
+ self.metadata.add(self.SDATA_VERSION, __version__, dtype="str", description="sdata package version")
33
+ self.metadata.add(self.SDATA_NAME, name, dtype="str", description="name of the data object")
34
+ self.metadata.add(self.SDATA_SNAME, suuid.sname, dtype="str", description="sname of the data object")
35
+ self.metadata.add(self.SDATA_UUID, suuid.huuid, dtype="str", description="Universally Unique Identifier")
36
+ self.metadata.add(self.SDATA_SUUID, suuid.suuid, dtype="str", description="Super Universally Unique Identifier")
37
+ self.metadata.add(self.SDATA_PARENT, str(kwargs.get("parent", "")), dtype="str", description="suuid of the parent sdata object")
38
+ self.metadata.add(self.SDATA_CLASS, self.__class__.__name__, dtype="str", description="sdata class")
39
+ self.metadata.add(self.SDATA_CTIME, now_utc_str(), dtype="str", description="creation date")
40
+ self.metadata.add(self.SDATA_MTIME, now_utc_str(), dtype="str", description="modification date")
41
+ self.metadata.add(self.SDATA_URL, str(kwargs.get("url", "")), dtype="str", description="url of the data object")
42
+ self.metadata.add(self.SDATA_PROJECT, str(kwargs.get("project", "")), dtype="str", description="project name")
43
+
44
+ @property
45
+ def md(self):
46
+ return self.metadata
47
+
48
+ @property
49
+ def mdf(self):
50
+ return self.metadata.df
51
+
52
+ @property
53
+ def osname(self):
54
+ """:returns: os compatible name (ascii?)"""
55
+ return self.asciiname(self.name)
56
+
57
+ @staticmethod
58
+ def asciiname(name):
59
+ name = copy.copy(name)
60
+ mapper = [("ä", "ae"), ("ö", "oe"), ("ü", "ue"), ("Ä", "Ae"), ("Ö", "Oe"), ("Ü", "Ue"),
61
+ ("ß", "sz"), (" ", "_"), ("/", "_"), ("\\", "_")]
62
+ for k, v in mapper:
63
+ name = name.replace(k, v)
64
+ name = name.lower()
65
+ return name.encode('ascii', 'replace').decode("ascii")
66
+
67
+ def __str__(self):
68
+ return f"({self.__class__.__name__} '{self.name}':{self.uuid})"
69
+
70
+ def _get_uuid(self):
71
+ return self.metadata.get(self.SDATA_UUID).value
72
+ # return self._uuid
73
+
74
+ def _set_uuid(self, value):
75
+ if isinstance(value, str):
76
+ try:
77
+ uuid.UUID(value)
78
+ self.metadata.set_attr(self.SDATA_UUID, uuid.UUID(value).hex)
79
+ except ValueError as exp:
80
+ logger.warning("data.uuid: %s" % exp)
81
+ raise Sdata_Uuid_Exeption("got invalid uuid str '{}'".format(str(value)))
82
+ elif isinstance(value, uuid.UUID):
83
+ self.metadata.set_attr(self.SDATA_UUID, value.hex)
84
+ else:
85
+ logger.error("Data.uuid: invalid uuid '{}'".format(value))
86
+ raise Exception("Data.uuid: invalid uuid '{}'".format(value))
87
+
88
+ uuid = property(fget=_get_uuid, fset=_set_uuid, doc="uuid of the object")
89
+
90
+ def get_uuid(self):
91
+ return uuid.UUID(self.uuid)
92
+
93
+ def _get_suuid(self):
94
+ return self.metadata.get(self.SDATA_SUUID).value
95
+
96
+ def _set_suuid(self, value):
97
+ self.metadata.set_attr(self.SDATA_SUUID, value)
98
+
99
+ suuid = property(fget=_get_suuid, fset=_set_suuid, doc="suuid of the object")
100
+
101
+ def get_suuid(self):
102
+ return sdata.SUUID.from_suuid_sname(self.sname)
103
+
104
+ def _get_sname(self):
105
+ return self.metadata.get(self.SDATA_SNAME).value
106
+
107
+ def _set_sname(self, value):
108
+ self.metadata.set_attr(self.SDATA_SNAME, value)
109
+
110
+ sname = property(fget=_get_sname, fset=_set_sname, doc="sname of the object")
111
+
112
+ def _get_name(self):
113
+ return self.metadata.get(self.SDATA_NAME).value
114
+
115
+ def _set_name(self, value):
116
+ self.metadata.set_attr(self.SDATA_NAME, value)
117
+
118
+ name = property(fget=_get_name, fset=_set_name, doc="name of the object")
119
+
120
+ if __name__ == '__main__':
121
+ class MyFancyClass(Base):
122
+ def __init__(self, **kwargs):
123
+ super().__init__(**kwargs)
124
+ pass
125
+
126
+
127
+ c = MyFancyClass(name="Hello Spencer")
128
+ print(c)
129
+ print(c.osname)
130
+ print(c.mdf)
131
+
@@ -838,6 +838,20 @@ class Data(object):
838
838
  """
839
839
  return [(x.name, x.dir()) for x in self.group.values()]
840
840
 
841
+ def to_dataframe(self):
842
+ """Export the DataFrame with additional metadata and description.
843
+
844
+ Returns:
845
+ pandas.DataFrame: A copy of the DataFrame with added attributes.
846
+ """
847
+ df = self.df.copy()
848
+ df.attrs["!sdata"] = {
849
+ "metadata": self.metadata.to_dict(),
850
+ "description": self.description
851
+ }
852
+ return df
853
+
854
+
841
855
  def to_parquet(self, filepath=None, **kwargs):
842
856
  """
843
857
 
@@ -846,7 +860,7 @@ class Data(object):
846
860
  df = self.df.copy()
847
861
  #df["!sdata_index"] = df.index
848
862
  #df.reset_index(inplace=True)
849
- df.attrs = {"metadata": self.metadata.to_dict(),
863
+ df.attrs["!sdata"] = {"metadata": self.metadata.to_dict(),
850
864
  "description": self.description}
851
865
  df.to_parquet(filepath, engine=engine)
852
866
 
@@ -862,12 +876,21 @@ class Data(object):
862
876
  df = pd.read_parquet(filepath)
863
877
  tt = cls(name=filepath)
864
878
  tt.table = df
865
- attrs = df.attrs
866
- tt.metadata = tt.metadata.from_dict(attrs["metadata"])
867
- tt.description = attrs.get("description")
879
+
880
+ attrs = df.attrs.get("!sdata")
881
+ try:
882
+ tt.metadata = tt.metadata.from_dict(attrs["metadata"])
883
+ except:
884
+ logger.warning(f"ignore metadata {filepath}")
885
+ try:
886
+ tt.description = attrs.get("description")
887
+ except:
888
+ logger.warning(f"ignore description {filepath}")
889
+ if attrs is not None:
890
+ tt.df.attrs.pop("!sdata")
891
+ else:
892
+ raise Exception("parquet file '{}' not available".format(filepath))
868
893
  return tt
869
- else:
870
- raise Exception("parquet file '{}' not available".format(filepath))
871
894
  except Exception as exp:
872
895
  raise
873
896