e6data-python-connector 2.3.14__tar.gz → 2.3.15__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 (89) hide show
  1. {e6data_python_connector-2.3.14/e6data_python_connector.egg-info → e6data_python_connector-2.3.15}/PKG-INFO +2 -2
  2. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/README.md +1 -1
  3. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/dialect.py +18 -1
  4. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15/e6data_python_connector.egg-info}/PKG-INFO +2 -2
  5. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/setup.py +1 -1
  6. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_dialect_columns.py +32 -0
  7. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/LICENSE +0 -0
  8. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/MANIFEST.in +0 -0
  9. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/__init__.py +0 -0
  10. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/cluster_manager.py +0 -0
  11. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/cluster_server/__init__.py +0 -0
  12. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/cluster_server/cluster_pb2.py +0 -0
  13. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/cluster_server/cluster_pb2_grpc.py +0 -0
  14. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/common.py +0 -0
  15. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/connection_pool.py +0 -0
  16. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/constants.py +0 -0
  17. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/datainputstream.py +0 -0
  18. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/date_time_utils.py +0 -0
  19. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/e6data_grpc.py +0 -0
  20. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/e6x_vector/__init__.py +0 -0
  21. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/e6x_vector/constants.py +0 -0
  22. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/e6x_vector/ttypes.py +0 -0
  23. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/exceptions.py +0 -0
  24. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/server/QueryEngineService.py +0 -0
  25. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/server/__init__.py +0 -0
  26. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/server/constants.py +0 -0
  27. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/server/e6x_engine_pb2.py +0 -0
  28. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/server/e6x_engine_pb2.pyi +0 -0
  29. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/server/e6x_engine_pb2_grpc.py +0 -0
  30. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/server/ttypes.py +0 -0
  31. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/strategy.py +0 -0
  32. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector/typeId.py +0 -0
  33. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector.egg-info/SOURCES.txt +0 -0
  34. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector.egg-info/dependency_links.txt +0 -0
  35. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector.egg-info/entry_points.txt +0 -0
  36. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector.egg-info/requires.txt +0 -0
  37. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/e6data_python_connector.egg-info/top_level.txt +0 -0
  38. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/gen-py/__init__.py +0 -0
  39. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/gen-py/e6x_vector/__init__.py +0 -0
  40. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/gen-py/e6x_vector/constants.py +0 -0
  41. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/gen-py/e6x_vector/ttypes.py +0 -0
  42. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/pyproject.toml +0 -0
  43. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/setup.cfg +0 -0
  44. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/__init__.py +0 -0
  45. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/analyze_38_nines.py +0 -0
  46. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/analyze_all_cases.py +0 -0
  47. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/analyze_binary.py +0 -0
  48. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/analyze_correct_value.py +0 -0
  49. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/analyze_fields.py +0 -0
  50. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/check_decimal_errors.py +0 -0
  51. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/cleanup_test_files.py +0 -0
  52. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/debug_38_nines.py +0 -0
  53. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/debug_binary.py +0 -0
  54. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/final_test.py +0 -0
  55. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/move_tests.py +0 -0
  56. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/quick_test.py +0 -0
  57. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_38_nines.py +0 -0
  58. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_all_decimal128_cases.py +0 -0
  59. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_cluster_manager_efficiency.py +0 -0
  60. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_cluster_manager_none_strategy.py +0 -0
  61. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_cluster_manager_strategy.py +0 -0
  62. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_code_optimizations.py +0 -0
  63. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_comprehensive.py +0 -0
  64. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_connection_pool.py +0 -0
  65. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_connection_pool_e2e.py +0 -0
  66. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_current_implementation.py +0 -0
  67. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_decimal128_binary_parsing.py +0 -0
  68. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_decimal128_parsing.py +0 -0
  69. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_fix.py +0 -0
  70. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_improved_parsing.py +0 -0
  71. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_known_case.py +0 -0
  72. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_manual_analysis.py +0 -0
  73. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_mock_server.py +0 -0
  74. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_multiprocessing_fix.py +0 -0
  75. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_new_implementation.py +0 -0
  76. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_pool_concurrency_simple.py +0 -0
  77. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_pool_threading_multiprocessing.py +0 -0
  78. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_simple_connection_pool.py +0 -0
  79. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_specific_binary.py +0 -0
  80. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_strategy.py +0 -0
  81. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_strategy_logic.py +0 -0
  82. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_strategy_persistence_fix.py +0 -0
  83. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_strategy_sharing_fix.py +0 -0
  84. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/test_user_binary_value.py +0 -0
  85. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/tests.py +0 -0
  86. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/tests_grpc.py +0 -0
  87. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/validate_decimal128.py +0 -0
  88. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/validate_implementation.py +0 -0
  89. {e6data_python_connector-2.3.14 → e6data_python_connector-2.3.15}/test/verify_decimal_fix.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: e6data-python-connector
3
- Version: 2.3.14
3
+ Version: 2.3.15
4
4
  Summary: Client for the e6data distributed SQL Engine.
5
5
  Home-page: https://github.com/e6x-labs/e6data-python-connector
6
6
  Author: e6data, Inc.
@@ -39,7 +39,7 @@ Dynamic: summary
39
39
 
40
40
  # e6data Python Connector
41
41
 
42
- ![version](https://img.shields.io/badge/version-2.3.14-blue.svg)
42
+ ![version](https://img.shields.io/badge/version-2.3.15-blue.svg)
43
43
 
44
44
  ## Introduction
45
45
 
@@ -1,6 +1,6 @@
1
1
  # e6data Python Connector
2
2
 
3
- ![version](https://img.shields.io/badge/version-2.3.14-blue.svg)
3
+ ![version](https://img.shields.io/badge/version-2.3.15-blue.svg)
4
4
 
5
5
  ## Introduction
6
6
 
@@ -148,6 +148,13 @@ _type_map = {
148
148
  'struct': types.String,
149
149
  'uniontype': types.String,
150
150
  'decimal': E6dataDecimal,
151
+ 'numeric': E6dataDecimal,
152
+ # aliases for the short type names the e6data engine actually emits
153
+ 'int': types.Integer,
154
+ 'long': types.BigInteger,
155
+ 'short': types.SmallInteger,
156
+ 'bool': types.Boolean,
157
+ 'real': types.Float,
151
158
  }
152
159
 
153
160
 
@@ -328,7 +335,17 @@ class E6dataDialect(default.DefaultDialect):
328
335
  row = dict()
329
336
  row["name"] = column.get('fieldName')
330
337
  field_type = str(column.get('fieldType')).lower()
331
- row["type"] = _type_map.get(field_type, types.String)
338
+ # Engine types may carry parameters: 'decimal(7,2)', 'varchar(16)',
339
+ # 'array<int>'. Strip them so the base type maps; otherwise the exact
340
+ # key lookup misses and the column silently defaults to String.
341
+ base_type = field_type.split('(', 1)[0].split('<', 1)[0].strip()
342
+ mapped = _type_map.get(base_type)
343
+ if mapped is None:
344
+ _logger.warning(
345
+ "e6data dialect: unmapped column type %r -> defaulting to String",
346
+ column.get('fieldType'))
347
+ mapped = types.String
348
+ row["type"] = mapped
332
349
  rows.append(row)
333
350
  return rows
334
351
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: e6data-python-connector
3
- Version: 2.3.14
3
+ Version: 2.3.15
4
4
  Summary: Client for the e6data distributed SQL Engine.
5
5
  Home-page: https://github.com/e6x-labs/e6data-python-connector
6
6
  Author: e6data, Inc.
@@ -39,7 +39,7 @@ Dynamic: summary
39
39
 
40
40
  # e6data Python Connector
41
41
 
42
- ![version](https://img.shields.io/badge/version-2.3.14-blue.svg)
42
+ ![version](https://img.shields.io/badge/version-2.3.15-blue.svg)
43
43
 
44
44
  ## Introduction
45
45
 
@@ -12,7 +12,7 @@
12
12
 
13
13
  import setuptools
14
14
 
15
- VERSION = (2, 3, 14,)
15
+ VERSION = (2, 3, 15,)
16
16
 
17
17
 
18
18
  def get_long_desc():
@@ -82,5 +82,37 @@ class TestDialectGetColumns(unittest.TestCase):
82
82
  self.assertIs(columns[0]["type"], types.String)
83
83
 
84
84
 
85
+ def test_get_columns_maps_engine_short_names_and_parameterized_types(self):
86
+ # The e6data engine emits short names ('int') and parameterized types
87
+ # ('decimal(7,2)', 'varchar(16)', 'array<int>'). These must resolve to the
88
+ # right SQLAlchemy type, not silently default to String.
89
+ client = FakeClient([
90
+ {"fieldName": "sk", "fieldType": "int"},
91
+ {"fieldName": "big", "fieldType": "long"},
92
+ {"fieldName": "small", "fieldType": "short"},
93
+ {"fieldName": "flag", "fieldType": "bool"},
94
+ {"fieldName": "price", "fieldType": "decimal(7,2)"},
95
+ {"fieldName": "name", "fieldType": "varchar(16)"},
96
+ {"fieldName": "code", "fieldType": "char(1)"},
97
+ {"fieldName": "tags", "fieldType": "array<int>"},
98
+ ])
99
+ connection = FakeSQLAlchemyConnection(client)
100
+ dialect = E6dataDialect()
101
+ dialect.catalog_name = "lakehouse"
102
+
103
+ with patch.object(dialect_module, "Connection", FakeSQLAlchemyConnection):
104
+ columns = dialect.get_columns(connection, "items", "sales")
105
+
106
+ by_name = {c["name"]: c["type"] for c in columns}
107
+ self.assertIs(by_name["sk"], types.Integer)
108
+ self.assertIs(by_name["big"], types.BigInteger)
109
+ self.assertIs(by_name["small"], types.SmallInteger)
110
+ self.assertIs(by_name["flag"], types.Boolean)
111
+ self.assertIs(by_name["price"], E6dataDecimal)
112
+ self.assertIs(by_name["name"], types.String)
113
+ self.assertIs(by_name["code"], types.String)
114
+ self.assertIs(by_name["tags"], types.String) # complex type normalizes, not a miss
115
+
116
+
85
117
  if __name__ == "__main__":
86
118
  unittest.main()