duckrun 0.2.20.dev0__tar.gz → 0.2.20.dev1__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 (27) hide show
  1. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/PKG-INFO +1 -1
  2. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/ducklake_metadata.py +31 -13
  3. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun.egg-info/PKG-INFO +1 -1
  4. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/pyproject.toml +1 -1
  5. duckrun-0.2.20.dev1/tests/test_ducklake_export.py +4 -0
  6. duckrun-0.2.20.dev0/tests/test_ducklake_export.py +0 -7
  7. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/LICENSE +0 -0
  8. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/README.md +0 -0
  9. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/__init__.py +0 -0
  10. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/auth.py +0 -0
  11. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/core.py +0 -0
  12. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/files.py +0 -0
  13. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/lakehouse.py +0 -0
  14. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/notebook.py +0 -0
  15. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/rle.py +0 -0
  16. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/runner.py +0 -0
  17. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/semantic_model.py +0 -0
  18. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/stats.py +0 -0
  19. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/writer.py +0 -0
  20. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun.egg-info/SOURCES.txt +0 -0
  21. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun.egg-info/dependency_links.txt +0 -0
  22. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun.egg-info/requires.txt +0 -0
  23. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun.egg-info/top_level.txt +0 -0
  24. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/setup.cfg +0 -0
  25. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/tests/test_checkpoint_format.py +0 -0
  26. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/tests/test_register.py +0 -0
  27. {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/tests/test_rle.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: duckrun
3
- Version: 0.2.20.dev0
3
+ Version: 0.2.20.dev1
4
4
  Summary: Helper library for Fabric Python using duckdb, arrow and delta_rs (orchestration, queries, etc.)
5
5
  Author: mim
6
6
  License: MIT
@@ -8,20 +8,21 @@ import shutil
8
8
 
9
9
  def map_type_ducklake_to_spark(t):
10
10
  """Maps DuckDB data types to their Spark SQL equivalents for the Delta schema."""
11
- t = t.lower()
12
- if 'int' in t:
13
- return 'long' if '64' in t else 'integer'
14
- elif 'float' in t:
11
+ t_lower = t.lower()
12
+ if 'int' in t_lower:
13
+ return 'long' if '64' in t_lower else 'integer'
14
+ elif 'float' in t_lower:
15
15
  return 'double'
16
- elif 'double' in t:
16
+ elif 'double' in t_lower:
17
17
  return 'double'
18
- elif 'decimal' in t:
19
- return 'decimal(10,0)'
20
- elif 'bool' in t:
18
+ elif 'decimal' in t_lower:
19
+ # Preserve the original decimal precision and scale
20
+ return t_lower
21
+ elif 'bool' in t_lower:
21
22
  return 'boolean'
22
- elif 'timestamp' in t:
23
+ elif 'timestamp' in t_lower:
23
24
  return 'timestamp'
24
- elif 'date' in t:
25
+ elif 'date' in t_lower:
25
26
  return 'date'
26
27
  return 'string'
27
28
 
@@ -42,14 +43,31 @@ def convert_stat_value_to_json(value_str, column_type):
42
43
  column_type = column_type.lower()
43
44
 
44
45
  try:
45
- # Timestamp: Convert to ISO 8601 with .000Z suffix
46
+ # Timestamp: Convert to ISO 8601 with .000Z suffix (UTC format)
46
47
  if 'timestamp' in column_type:
47
48
  # Parse and format to ISO 8601
48
- # Assumes value_str is in format like "2025-06-22 23:55:00"
49
+ # Handle various input formats from DuckDB:
50
+ # - "2025-06-22 23:55:00" -> "2025-06-22T23:55:00.000Z"
51
+ # - "2025-06-22T23:55:00+00" -> "2025-06-22T23:55:00.000Z"
52
+ # - "2025-06-22T23:55:00.123+00:00" -> "2025-06-22T23:55:00.123Z"
53
+
54
+ # Replace space with T if needed
49
55
  if 'T' not in value_str:
50
56
  value_str = value_str.replace(' ', 'T')
57
+
58
+ # Remove timezone offset formats to normalize to UTC
59
+ # Strip patterns like: +00, +00:00, -05:00, etc.
60
+ import re
61
+ value_str = re.sub(r'[+-]\d{2}(?::\d{2})?$', '', value_str)
62
+
63
+ # Ensure milliseconds are present
64
+ if '.' not in value_str:
65
+ value_str += '.000'
66
+
67
+ # Add Z suffix for UTC if not present
51
68
  if not value_str.endswith('Z'):
52
- value_str += '.000Z' if '.000Z' not in value_str else 'Z'
69
+ value_str += 'Z'
70
+
53
71
  return value_str
54
72
 
55
73
  # Date: Keep as YYYY-MM-DD string
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: duckrun
3
- Version: 0.2.20.dev0
3
+ Version: 0.2.20.dev1
4
4
  Summary: Helper library for Fabric Python using duckdb, arrow and delta_rs (orchestration, queries, etc.)
5
5
  Author: mim
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "duckrun"
7
- version = "0.2.20.dev0"
7
+ version = "0.2.20.dev1"
8
8
  description = "Helper library for Fabric Python using duckdb, arrow and delta_rs (orchestration, queries, etc.)"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -0,0 +1,4 @@
1
+ import duckrun
2
+ con = duckrun.connect("tmp/data.lakehouse/duck")
3
+ con.export_ducklake_to_delta("duck.db")
4
+ con.get_stats("summary")
@@ -1,7 +0,0 @@
1
- import duckrun
2
- def test_ducklake_export():
3
- con = duckrun.connect("tmp/tmp.Lakehouse/dbo")
4
- result = con.export_ducklake_to_delta("meta.db")
5
- return result
6
- if __name__ == "__main__":
7
- test_ducklake_export()
File without changes
File without changes
File without changes