e6data-python-connector 3.0.1rc2__tar.gz → 3.0.1rc3__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 (125) hide show
  1. {e6data_python_connector-3.0.1rc2/e6data_python_connector.egg-info → e6data_python_connector-3.0.1rc3}/PKG-INFO +1 -1
  2. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/cluster_manager.py +54 -6
  3. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3/e6data_python_connector.egg-info}/PKG-INFO +1 -1
  4. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/setup.py +1 -1
  5. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/LICENSE +0 -0
  6. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/MANIFEST.in +0 -0
  7. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/README.md +0 -0
  8. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/__init__.py +0 -0
  9. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/aio.py +0 -0
  10. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/async_cluster_manager.py +0 -0
  11. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/async_connection.py +0 -0
  12. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/async_connection_pool.py +0 -0
  13. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/async_cursor.py +0 -0
  14. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/async_dialect.py +0 -0
  15. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/async_oauth.py +0 -0
  16. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/async_work.py +0 -0
  17. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/cluster_server/__init__.py +0 -0
  18. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/cluster_server/cluster_pb2.py +0 -0
  19. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/cluster_server/cluster_pb2_grpc.py +0 -0
  20. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/common.py +0 -0
  21. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/connection_pool.py +0 -0
  22. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/constants.py +0 -0
  23. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/datainputstream.py +0 -0
  24. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/date_time_utils.py +0 -0
  25. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/dialect.py +0 -0
  26. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/e6data_grpc.py +0 -0
  27. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/e6x_vector/__init__.py +0 -0
  28. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/e6x_vector/constants.py +0 -0
  29. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/e6x_vector/ttypes.py +0 -0
  30. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/exceptions.py +0 -0
  31. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/oauth.py +0 -0
  32. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/oauth_cache.py +0 -0
  33. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/oauth_common.py +0 -0
  34. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/result_batch.py +0 -0
  35. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/result_decode.py +0 -0
  36. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/result_decode_worker.py +0 -0
  37. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/result_prefetch.py +0 -0
  38. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/server/QueryEngineService.py +0 -0
  39. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/server/__init__.py +0 -0
  40. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/server/constants.py +0 -0
  41. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/server/e6x_engine_pb2.py +0 -0
  42. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/server/e6x_engine_pb2.pyi +0 -0
  43. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/server/e6x_engine_pb2_grpc.py +0 -0
  44. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/server/ttypes.py +0 -0
  45. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/strategy.py +0 -0
  46. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector/typeId.py +0 -0
  47. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector.egg-info/SOURCES.txt +0 -0
  48. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector.egg-info/dependency_links.txt +0 -0
  49. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector.egg-info/entry_points.txt +0 -0
  50. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector.egg-info/requires.txt +0 -0
  51. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/e6data_python_connector.egg-info/top_level.txt +0 -0
  52. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/pyproject.toml +0 -0
  53. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/setup.cfg +0 -0
  54. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/__init__.py +0 -0
  55. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/analyze_38_nines.py +0 -0
  56. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/analyze_all_cases.py +0 -0
  57. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/analyze_binary.py +0 -0
  58. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/analyze_correct_value.py +0 -0
  59. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/analyze_fields.py +0 -0
  60. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/check_decimal_errors.py +0 -0
  61. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/cleanup_test_files.py +0 -0
  62. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/conftest.py +0 -0
  63. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/debug_38_nines.py +0 -0
  64. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/debug_binary.py +0 -0
  65. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/final_test.py +0 -0
  66. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/__init__.py +0 -0
  67. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/benchmark_preflight.py +0 -0
  68. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/benchmark_result_batch_v2.py +0 -0
  69. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/benchmark_sync_async.py +0 -0
  70. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/expiry_preflight.py +0 -0
  71. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/result_batch_benchmark_support.py +0 -0
  72. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/support.py +0 -0
  73. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/test_async_connection.py +0 -0
  74. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/test_async_pool.py +0 -0
  75. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/test_async_queries.py +0 -0
  76. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/test_async_resume.py +0 -0
  77. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/test_async_sqlalchemy.py +0 -0
  78. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/test_async_token_lifecycle.py +0 -0
  79. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/test_e2e_auth_boundary.py +0 -0
  80. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/test_e2e_oauth_continuation.py +0 -0
  81. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/test_e2e_readonly_matrix.py +0 -0
  82. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/test_result_batch_v2.py +0 -0
  83. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/test_shared_token_issuance.py +0 -0
  84. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/test_sync_oauth_lifecycle.py +0 -0
  85. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/integration/token_observation.py +0 -0
  86. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/move_tests.py +0 -0
  87. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/quick_test.py +0 -0
  88. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_38_nines.py +0 -0
  89. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_all_decimal128_cases.py +0 -0
  90. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_cluster_manager_efficiency.py +0 -0
  91. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_cluster_manager_none_strategy.py +0 -0
  92. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_cluster_manager_oauth.py +0 -0
  93. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_cluster_manager_strategy.py +0 -0
  94. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_code_optimizations.py +0 -0
  95. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_comprehensive.py +0 -0
  96. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_connection_pool.py +0 -0
  97. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_connection_pool_e2e.py +0 -0
  98. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_current_implementation.py +0 -0
  99. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_decimal128_binary_parsing.py +0 -0
  100. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_decimal128_parsing.py +0 -0
  101. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_dialect_columns.py +0 -0
  102. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_fix.py +0 -0
  103. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_improved_parsing.py +0 -0
  104. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_known_case.py +0 -0
  105. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_manual_analysis.py +0 -0
  106. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_mock_server.py +0 -0
  107. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_multiprocessing_fix.py +0 -0
  108. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_new_implementation.py +0 -0
  109. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_oauth_authentication.py +0 -0
  110. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_oauth_auto_resume.py +0 -0
  111. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_oauth_resume_integration.py +0 -0
  112. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_pool_concurrency_simple.py +0 -0
  113. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_pool_threading_multiprocessing.py +0 -0
  114. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_simple_connection_pool.py +0 -0
  115. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_specific_binary.py +0 -0
  116. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_strategy.py +0 -0
  117. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_strategy_logic.py +0 -0
  118. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_strategy_persistence_fix.py +0 -0
  119. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_strategy_sharing_fix.py +0 -0
  120. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/test_user_binary_value.py +0 -0
  121. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/tests.py +0 -0
  122. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/tests_grpc.py +0 -0
  123. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/validate_decimal128.py +0 -0
  124. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/validate_implementation.py +0 -0
  125. {e6data_python_connector-3.0.1rc2 → e6data_python_connector-3.0.1rc3}/test/verify_decimal_fix.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: e6data-python-connector
3
- Version: 3.0.1rc2
3
+ Version: 3.0.1rc3
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.
@@ -1,4 +1,6 @@
1
+ import hashlib
1
2
  import logging
3
+ import os
2
4
  import threading
3
5
  import time
4
6
  import e6data_python_connector.cluster_server.cluster_pb2 as cluster_pb2
@@ -74,6 +76,7 @@ class _StatusLock:
74
76
  self._status_multiprocessing_lock = (threading.Semaphore() if is_decode_worker()
75
77
  else multiprocessing.Semaphore())
76
78
  self._is_active = False
79
+ self._resume_completion = None
77
80
 
78
81
  @property
79
82
  def is_active(self) -> bool:
@@ -109,8 +112,14 @@ class _StatusLock:
109
112
  _StatusLock: The current instance of the lock, used for context management.
110
113
  """
111
114
 
112
- self._status_thread_lock.acquire(timeout=self._LOCK_TIMEOUT)
113
- self._status_multiprocessing_lock.acquire(timeout=self._LOCK_TIMEOUT)
115
+ if not self._status_thread_lock.acquire(timeout=self._LOCK_TIMEOUT):
116
+ raise TimeoutError('Cluster recovery timed out waiting for status lock.')
117
+ try:
118
+ if not self._status_multiprocessing_lock.acquire(timeout=self._LOCK_TIMEOUT):
119
+ raise TimeoutError('Cluster recovery timed out waiting for process lock.')
120
+ except BaseException:
121
+ self._status_thread_lock.release()
122
+ raise
114
123
  return self
115
124
 
116
125
  def __exit__(self, exc_type, exc_val, exc_tb):
@@ -127,8 +136,8 @@ class _StatusLock:
127
136
  exc_tb (Traceback): The traceback object of the exception (if any).
128
137
  """
129
138
 
130
- self._status_thread_lock.release()
131
139
  self._status_multiprocessing_lock.release()
140
+ self._status_thread_lock.release()
132
141
 
133
142
  @contextmanager
134
143
  def hold_until(self, deadline):
@@ -465,6 +474,34 @@ class ClusterManager:
465
474
  logger.warning(f"Status check failed with error: {e}")
466
475
  yield None
467
476
 
477
+ def _legacy_resume_identity(self):
478
+ """Fingerprint exact connection inputs without retaining credentials.
479
+
480
+ Copy standard option containers. Unknown or mutable option values disable
481
+ sharing so their existing RPC behavior is preserved without guessing.
482
+ """
483
+ values = (self._host, self._port, self.cluster_uuid, self._secure_channel,
484
+ self._ssl_cert, self._user, self._password)
485
+ scalar_types = (type(None), str, bytes, bool, int)
486
+ if any(type(value) not in scalar_types for value in values):
487
+ return None
488
+ options = self._grpc_options
489
+ if type(options) is dict:
490
+ pairs = tuple(options.items())
491
+ elif type(options) in (list, tuple):
492
+ pairs = tuple(options)
493
+ else:
494
+ return None
495
+ frozen_options = []
496
+ for pair in pairs:
497
+ if (type(pair) not in (tuple, list) or len(pair) != 2
498
+ or any(type(value) not in scalar_types for value in pair)):
499
+ return None
500
+ frozen_options.append(tuple((type(value).__name__, value) for value in pair))
501
+ identity = (tuple((type(value).__name__, value) for value in values),
502
+ type(options).__name__, tuple(frozen_options))
503
+ return hashlib.sha256(repr(identity).encode('utf-8')).digest()
504
+
468
505
  def resume(self) -> bool:
469
506
  """
470
507
  Resumes the cluster if it is currently suspended or not in the 'active' state.
@@ -494,14 +531,21 @@ class ClusterManager:
494
531
  """
495
532
  if self._metadata_provider is not None:
496
533
  return self._resume_oauth()
534
+ call_started = time.monotonic()
497
535
  if self._debug:
498
536
  logger.info(f"Starting auto-resume for cluster {self.cluster_uuid} at {self._host}:{self._port}")
499
537
 
500
538
  with status_lock as lock:
501
- if lock.is_active:
502
- if self._debug:
503
- logger.info("Lock is already active, cluster appears to be running")
539
+ identity = self._legacy_resume_identity()
540
+ process_id = os.getpid()
541
+ completion = lock._resume_completion
542
+ if (identity is not None and completion is not None
543
+ and completion[0] == process_id and completion[1] == identity
544
+ and completion[2] > call_started):
504
545
  return True
546
+ # A fresh attempt can observe a new failure before older waiters run.
547
+ # Invalidate first, including when the attempt later raises an error.
548
+ lock._resume_completion = None
505
549
 
506
550
  # Retrieve the current cluster status with strategy header
507
551
  if self._debug:
@@ -530,6 +574,8 @@ class ClusterManager:
530
574
  elif current_status.status == 'active':
531
575
  if self._debug:
532
576
  logger.info("Cluster is already active, no action needed")
577
+ if identity is not None:
578
+ lock._resume_completion = (process_id, identity, time.monotonic())
533
579
  return True
534
580
  elif current_status.status != 'resuming':
535
581
  """
@@ -548,6 +594,8 @@ class ClusterManager:
548
594
  if status == 'active':
549
595
  if self._debug:
550
596
  logger.info(f"Cluster became active after {check_count} status checks")
597
+ if identity is not None:
598
+ lock._resume_completion = (process_id, identity, time.monotonic())
551
599
  return True
552
600
  elif status == 'failed':
553
601
  if self._debug:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: e6data-python-connector
3
- Version: 3.0.1rc2
3
+ Version: 3.0.1rc3
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.
@@ -12,7 +12,7 @@
12
12
 
13
13
  import setuptools
14
14
 
15
- VERSION = (3, 0, '1rc2',)
15
+ VERSION = (3, 0, '1rc3',)
16
16
 
17
17
 
18
18
  def get_long_desc():