datajunction-query 0.0.1a30__tar.gz → 0.0.1a32__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.

Potentially problematic release.


This version of datajunction-query might be problematic. Click here for more details.

Files changed (93) hide show
  1. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/.pylintrc +2 -1
  2. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/PKG-INFO +3 -2
  3. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/__about__.py +1 -1
  4. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/engine.py +25 -0
  5. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/models/engine.py +1 -0
  6. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/pdm.lock +251 -48
  7. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/pyproject.toml +2 -1
  8. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/api/queries_test.py +72 -0
  9. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/conftest.py +3 -1
  10. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/.coveragerc +0 -0
  11. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/.flake8 +0 -0
  12. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/.gitignore +0 -0
  13. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/.isort.cfg +0 -0
  14. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/.pre-commit-config.yaml +0 -0
  15. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/.readthedocs.yml +0 -0
  16. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/AUTHORS.rst +0 -0
  17. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/CODE_OF_CONDUCT.md +0 -0
  18. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/Dockerfile +0 -0
  19. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/LICENSE.txt +0 -0
  20. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/Makefile +0 -0
  21. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/README.rst +0 -0
  22. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/alembic/README +0 -0
  23. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/alembic/env.py +0 -0
  24. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/alembic/script.py.mako +0 -0
  25. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/alembic/versions/2023_02_28_0541-a7e11a2438b4_initial_migration.py +0 -0
  26. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/alembic/versions/2023_10_09_1858-f3407a1ec625_add_type_and_extra_para_ms_field_for_.py +0 -0
  27. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/alembic.ini +0 -0
  28. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/config.djqs.yml +0 -0
  29. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/config.jsonschema +0 -0
  30. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/__init__.py +0 -0
  31. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/api/__init__.py +0 -0
  32. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/api/catalogs.py +0 -0
  33. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/api/engines.py +0 -0
  34. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/api/helpers.py +0 -0
  35. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/api/main.py +0 -0
  36. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/api/queries.py +0 -0
  37. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/api/tables.py +0 -0
  38. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/config.py +0 -0
  39. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/constants.py +0 -0
  40. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/exceptions.py +0 -0
  41. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/fixes.py +0 -0
  42. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/models/__init__.py +0 -0
  43. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/models/catalog.py +0 -0
  44. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/models/query.py +0 -0
  45. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/models/table.py +0 -0
  46. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/typing.py +0 -0
  47. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/djqs/utils.py +0 -0
  48. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/cockroachdb/cockroachdb_examples_init.sql +0 -0
  49. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/cockroachdb/cockroachdb_metadata_init.sql +0 -0
  50. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/cockroachdb/steam-games.csv +0 -0
  51. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/cockroachdb/steam-hours-played.csv +0 -0
  52. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/default.duckdb +0 -0
  53. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/druid_environment +0 -0
  54. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/druid_init.sh +0 -0
  55. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/druid_spec.json +0 -0
  56. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/duckdb.sql +0 -0
  57. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/duckdb_load.py +0 -0
  58. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/postgres_init.roads.sql +0 -0
  59. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/postgres_init.sql +0 -0
  60. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/spark.roads.sql +0 -0
  61. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/spark_load_roads.py +0 -0
  62. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/docker/wait-for +0 -0
  63. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/openapi.json +0 -0
  64. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/scripts/generate-openapi.py +0 -0
  65. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/setup.cfg +0 -0
  66. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/__init__.py +0 -0
  67. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/api/__init__.py +0 -0
  68. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/api/catalogs_test.py +0 -0
  69. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/api/engines_test.py +0 -0
  70. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/api/table_test.py +0 -0
  71. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/config.djqs.yml +0 -0
  72. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/configs/databases/druid.yaml +0 -0
  73. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/configs/databases/gsheets.yaml +0 -0
  74. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/configs/databases/postgres.yaml +0 -0
  75. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/configs/nodes/core/comments.yaml +0 -0
  76. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/configs/nodes/core/dim_users.yaml +0 -0
  77. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/configs/nodes/core/num_comments.yaml +0 -0
  78. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/configs/nodes/core/users.yaml +0 -0
  79. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/exceptions_test.py +0 -0
  80. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/resources/contractors.parquet +0 -0
  81. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/resources/dispatchers.parquet +0 -0
  82. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/resources/hard_hat_state.parquet +0 -0
  83. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/resources/hard_hats.parquet +0 -0
  84. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/resources/municipality.parquet +0 -0
  85. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/resources/municipality_municipality_type.parquet +0 -0
  86. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/resources/municipality_type.parquet +0 -0
  87. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/resources/repair_order_details.parquet +0 -0
  88. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/resources/repair_orders.parquet +0 -0
  89. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/resources/repair_type.parquet +0 -0
  90. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/resources/us_region.parquet +0 -0
  91. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/resources/us_states.parquet +0 -0
  92. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tests/utils_test.py +0 -0
  93. {datajunction_query-0.0.1a30 → datajunction_query-0.0.1a32}/tox.ini +0 -0
@@ -1,8 +1,9 @@
1
1
  [MESSAGES CONTROL]
2
+ disable=c-extension-no-member
2
3
 
3
4
  [MASTER]
4
5
  # https://github.com/samuelcolvin/pydantic/issues/1961#issuecomment-759522422
5
- extension-pkg-whitelist=pydantic
6
+ extension-pkg-whitelist=pydantic,duckdb
6
7
  ignore=templates,docs
7
8
 
8
9
  [IMPORTS]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: datajunction-query
3
- Version: 0.0.1a30
3
+ Version: 0.0.1a32
4
4
  Summary: OSS Implementation of a DataJunction Query Service
5
5
  Project-URL: repository, https://github.com/DataJunction/dj
6
6
  Author-email: DataJunction Authors <roberto@dealmeida.net>
@@ -22,10 +22,11 @@ Requires-Dist: duckdb==0.8.1
22
22
  Requires-Dist: fastapi>=0.79.0
23
23
  Requires-Dist: importlib-metadata
24
24
  Requires-Dist: msgpack>=1.0.3
25
- Requires-Dist: pyspark==3.3.2
26
25
  Requires-Dist: python-dotenv==0.19.2
26
+ Requires-Dist: pyyaml==5.3.1
27
27
  Requires-Dist: requests<=2.29.0,>=2.28.2
28
28
  Requires-Dist: rich>=10.16.2
29
+ Requires-Dist: snowflake-connector-python>=3.3.1
29
30
  Requires-Dist: sqlalchemy-utils>=0.37.7
30
31
  Requires-Dist: sqlalchemy<2.0.0,>=1.4.41
31
32
  Requires-Dist: sqlmodel<1.0.0,>=0.0.8
@@ -1,4 +1,4 @@
1
1
  """
2
2
  Version for Hatch
3
3
  """
4
- __version__ = "0.0.1a30"
4
+ __version__ = "0.0.1a32"
@@ -3,10 +3,12 @@ Query related functions.
3
3
  """
4
4
 
5
5
  import logging
6
+ import os
6
7
  from datetime import datetime, timezone
7
8
  from typing import List, Tuple
8
9
 
9
10
  import duckdb
11
+ import snowflake.connector
10
12
  import sqlparse
11
13
  from sqlalchemy import create_engine, text
12
14
  from sqlmodel import Session, select
@@ -94,6 +96,15 @@ def run_query(
94
96
  )
95
97
  )
96
98
  return run_duckdb_query(query, conn)
99
+ if engine.type == EngineType.SNOWFLAKE:
100
+ conn = snowflake.connector.connect(
101
+ **engine.extra_params,
102
+ password=os.getenv("SNOWSQL_PWD"),
103
+ )
104
+ cur = conn.cursor()
105
+
106
+ return run_snowflake_query(query, cur)
107
+
97
108
  sqla_engine = create_engine(engine.uri, **catalog.extra_params)
98
109
  connection = sqla_engine.connect()
99
110
 
@@ -128,6 +139,20 @@ def run_duckdb_query(
128
139
  return output
129
140
 
130
141
 
142
+ def run_snowflake_query(
143
+ query: Query,
144
+ cur: snowflake.connector.cursor.SnowflakeCursor,
145
+ ) -> List[Tuple[str, List[ColumnMetadata], Stream]]:
146
+ """
147
+ Run a query against a snowflake warehouse
148
+ """
149
+ output: List[Tuple[str, List[ColumnMetadata], Stream]] = []
150
+ rows = cur.execute(query.submitted_query).fetchall()
151
+ columns: List[ColumnMetadata] = []
152
+ output.append((query.submitted_query, columns, rows))
153
+ return output
154
+
155
+
131
156
  def process_query(
132
157
  session: Session,
133
158
  settings: Settings,
@@ -15,6 +15,7 @@ class EngineType(Enum):
15
15
 
16
16
  DUCKDB = "duckdb"
17
17
  SQLALCHEMY = "sqlalchemy"
18
+ SNOWFLAKE = "snowflake"
18
19
 
19
20
 
20
21
  class Engine(SQLModel, table=True): # type: ignore
@@ -6,7 +6,7 @@ groups = ["default", "test", "uvicorn"]
6
6
  cross_platform = true
7
7
  static_urls = false
8
8
  lock_version = "4.3"
9
- content_hash = "sha256:8850b0ca6459bb35382219be17b43c10bfc14304df4e1d00f0941f446f7ee20c"
9
+ content_hash = "sha256:7fe9a0f12a679c8f55146cc8202db0387dc5c96ea0ecbd5f668d4ab1666ef9ea"
10
10
 
11
11
  [[package]]
12
12
  name = "accept-types"
@@ -49,6 +49,15 @@ files = [
49
49
  {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"},
50
50
  ]
51
51
 
52
+ [[package]]
53
+ name = "asn1crypto"
54
+ version = "1.5.1"
55
+ summary = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP"
56
+ files = [
57
+ {file = "asn1crypto-1.5.1-py2.py3-none-any.whl", hash = "sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67"},
58
+ {file = "asn1crypto-1.5.1.tar.gz", hash = "sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c"},
59
+ ]
60
+
52
61
  [[package]]
53
62
  name = "astroid"
54
63
  version = "2.15.6"
@@ -101,6 +110,69 @@ files = [
101
110
  {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"},
102
111
  ]
103
112
 
113
+ [[package]]
114
+ name = "cffi"
115
+ version = "1.16.0"
116
+ requires_python = ">=3.8"
117
+ summary = "Foreign Function Interface for Python calling C code."
118
+ dependencies = [
119
+ "pycparser",
120
+ ]
121
+ files = [
122
+ {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"},
123
+ {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"},
124
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"},
125
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"},
126
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"},
127
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"},
128
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"},
129
+ {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"},
130
+ {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"},
131
+ {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"},
132
+ {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"},
133
+ {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"},
134
+ {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"},
135
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"},
136
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"},
137
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"},
138
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"},
139
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"},
140
+ {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"},
141
+ {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"},
142
+ {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"},
143
+ {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"},
144
+ {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"},
145
+ {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"},
146
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"},
147
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"},
148
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"},
149
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"},
150
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"},
151
+ {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"},
152
+ {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"},
153
+ {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"},
154
+ {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"},
155
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"},
156
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"},
157
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"},
158
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"},
159
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"},
160
+ {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"},
161
+ {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"},
162
+ {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"},
163
+ {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"},
164
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"},
165
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"},
166
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"},
167
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"},
168
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"},
169
+ {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"},
170
+ {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"},
171
+ {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"},
172
+ {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"},
173
+ {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"},
174
+ ]
175
+
104
176
  [[package]]
105
177
  name = "cfgv"
106
178
  version = "3.3.1"
@@ -337,6 +409,40 @@ files = [
337
409
  {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"},
338
410
  ]
339
411
 
412
+ [[package]]
413
+ name = "cryptography"
414
+ version = "41.0.4"
415
+ requires_python = ">=3.7"
416
+ summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
417
+ dependencies = [
418
+ "cffi>=1.12",
419
+ ]
420
+ files = [
421
+ {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839"},
422
+ {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f"},
423
+ {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714"},
424
+ {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb"},
425
+ {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13"},
426
+ {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143"},
427
+ {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397"},
428
+ {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860"},
429
+ {file = "cryptography-41.0.4-cp37-abi3-win32.whl", hash = "sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd"},
430
+ {file = "cryptography-41.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d"},
431
+ {file = "cryptography-41.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67"},
432
+ {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e"},
433
+ {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829"},
434
+ {file = "cryptography-41.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca"},
435
+ {file = "cryptography-41.0.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d"},
436
+ {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac"},
437
+ {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9"},
438
+ {file = "cryptography-41.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f"},
439
+ {file = "cryptography-41.0.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91"},
440
+ {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8"},
441
+ {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6"},
442
+ {file = "cryptography-41.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311"},
443
+ {file = "cryptography-41.0.4.tar.gz", hash = "sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a"},
444
+ ]
445
+
340
446
  [[package]]
341
447
  name = "dill"
342
448
  version = "0.3.6"
@@ -863,6 +969,18 @@ files = [
863
969
  {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"},
864
970
  ]
865
971
 
972
+ [[package]]
973
+ name = "oscrypto"
974
+ version = "1.3.0"
975
+ summary = "TLS (SSL) sockets, key generation, encryption, decryption, signing, verification and KDFs using the OS crypto libraries. Does not require a compiler, and relies on the OS for patching. Works on Windows, OS X and Linux/BSD."
976
+ dependencies = [
977
+ "asn1crypto>=1.5.1",
978
+ ]
979
+ files = [
980
+ {file = "oscrypto-1.3.0-py2.py3-none-any.whl", hash = "sha256:2b2f1d2d42ec152ca90ccb5682f3e051fb55986e1b170ebde472b133713e7085"},
981
+ {file = "oscrypto-1.3.0.tar.gz", hash = "sha256:6f5fef59cb5b3708321db7cca56aed8ad7e662853351e7991fcf60ec606d47a4"},
982
+ ]
983
+
866
984
  [[package]]
867
985
  name = "packaging"
868
986
  version = "23.1"
@@ -939,12 +1057,42 @@ files = [
939
1057
  ]
940
1058
 
941
1059
  [[package]]
942
- name = "py4j"
943
- version = "0.10.9.5"
944
- summary = "Enables Python programs to dynamically access arbitrary Java objects"
1060
+ name = "pycparser"
1061
+ version = "2.21"
1062
+ requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
1063
+ summary = "C parser in Python"
1064
+ files = [
1065
+ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
1066
+ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
1067
+ ]
1068
+
1069
+ [[package]]
1070
+ name = "pycryptodomex"
1071
+ version = "3.19.0"
1072
+ requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
1073
+ summary = "Cryptographic library for Python"
945
1074
  files = [
946
- {file = "py4j-0.10.9.5-py2.py3-none-any.whl", hash = "sha256:52d171a6a2b031d8a5d1de6efe451cf4f5baff1a2819aabc3741c8406539ba04"},
947
- {file = "py4j-0.10.9.5.tar.gz", hash = "sha256:276a4a3c5a2154df1860ef3303a927460e02e97b047dc0a47c1c3fb8cce34db6"},
1075
+ {file = "pycryptodomex-3.19.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:a77b79852175064c822b047fee7cf5a1f434f06ad075cc9986aa1c19a0c53eb0"},
1076
+ {file = "pycryptodomex-3.19.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:5b883e1439ab63af976656446fb4839d566bb096f15fc3c06b5a99cde4927188"},
1077
+ {file = "pycryptodomex-3.19.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3866d68e2fc345162b1b9b83ef80686acfe5cec0d134337f3b03950a0a8bf56"},
1078
+ {file = "pycryptodomex-3.19.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c74eb1f73f788facece7979ce91594dc177e1a9b5d5e3e64697dd58299e5cb4d"},
1079
+ {file = "pycryptodomex-3.19.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cb51096a6a8d400724104db8a7e4f2206041a1f23e58924aa3d8d96bcb48338"},
1080
+ {file = "pycryptodomex-3.19.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a588a1cb7781da9d5e1c84affd98c32aff9c89771eac8eaa659d2760666f7139"},
1081
+ {file = "pycryptodomex-3.19.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:d4dd3b381ff5a5907a3eb98f5f6d32c64d319a840278ceea1dcfcc65063856f3"},
1082
+ {file = "pycryptodomex-3.19.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:263de9a96d2fcbc9f5bd3a279f14ea0d5f072adb68ebd324987576ec25da084d"},
1083
+ {file = "pycryptodomex-3.19.0-cp35-abi3-win32.whl", hash = "sha256:67c8eb79ab33d0fbcb56842992298ddb56eb6505a72369c20f60bc1d2b6fb002"},
1084
+ {file = "pycryptodomex-3.19.0-cp35-abi3-win_amd64.whl", hash = "sha256:09c9401dc06fb3d94cb1ec23b4ea067a25d1f4c6b7b118ff5631d0b5daaab3cc"},
1085
+ {file = "pycryptodomex-3.19.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:edbe083c299835de7e02c8aa0885cb904a75087d35e7bab75ebe5ed336e8c3e2"},
1086
+ {file = "pycryptodomex-3.19.0-pp27-pypy_73-win32.whl", hash = "sha256:136b284e9246b4ccf4f752d435c80f2c44fc2321c198505de1d43a95a3453b3c"},
1087
+ {file = "pycryptodomex-3.19.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5d73e9fa3fe830e7b6b42afc49d8329b07a049a47d12e0ef9225f2fd220f19b2"},
1088
+ {file = "pycryptodomex-3.19.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b2f1982c5bc311f0aab8c293524b861b485d76f7c9ab2c3ac9a25b6f7655975"},
1089
+ {file = "pycryptodomex-3.19.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb040b5dda1dff1e197d2ef71927bd6b8bfcb9793bc4dfe0bb6df1e691eaacb"},
1090
+ {file = "pycryptodomex-3.19.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:800a2b05cfb83654df80266692f7092eeefe2a314fa7901dcefab255934faeec"},
1091
+ {file = "pycryptodomex-3.19.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c01678aee8ac0c1a461cbc38ad496f953f9efcb1fa19f5637cbeba7544792a53"},
1092
+ {file = "pycryptodomex-3.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2126bc54beccbede6eade00e647106b4f4c21e5201d2b0a73e9e816a01c50905"},
1093
+ {file = "pycryptodomex-3.19.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b801216c48c0886742abf286a9a6b117e248ca144d8ceec1f931ce2dd0c9cb40"},
1094
+ {file = "pycryptodomex-3.19.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:50cb18d4dd87571006fd2447ccec85e6cec0136632a550aa29226ba075c80644"},
1095
+ {file = "pycryptodomex-3.19.0.tar.gz", hash = "sha256:af83a554b3f077564229865c45af0791be008ac6469ef0098152139e6bd4b5b6"},
948
1096
  ]
949
1097
 
950
1098
  [[package]]
@@ -1019,6 +1167,16 @@ files = [
1019
1167
  {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"},
1020
1168
  ]
1021
1169
 
1170
+ [[package]]
1171
+ name = "pyjwt"
1172
+ version = "2.8.0"
1173
+ requires_python = ">=3.7"
1174
+ summary = "JSON Web Token implementation in Python"
1175
+ files = [
1176
+ {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"},
1177
+ {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"},
1178
+ ]
1179
+
1022
1180
  [[package]]
1023
1181
  name = "pylint"
1024
1182
  version = "2.17.4"
@@ -1042,28 +1200,29 @@ files = [
1042
1200
  ]
1043
1201
 
1044
1202
  [[package]]
1045
- name = "pyproject-hooks"
1046
- version = "1.0.0"
1047
- requires_python = ">=3.7"
1048
- summary = "Wrappers to call pyproject.toml-based build backend hooks."
1203
+ name = "pyopenssl"
1204
+ version = "23.2.0"
1205
+ requires_python = ">=3.6"
1206
+ summary = "Python wrapper module around the OpenSSL library"
1049
1207
  dependencies = [
1050
- "tomli>=1.1.0; python_version < \"3.11\"",
1208
+ "cryptography!=40.0.0,!=40.0.1,<42,>=38.0.0",
1051
1209
  ]
1052
1210
  files = [
1053
- {file = "pyproject_hooks-1.0.0-py3-none-any.whl", hash = "sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8"},
1054
- {file = "pyproject_hooks-1.0.0.tar.gz", hash = "sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5"},
1211
+ {file = "pyOpenSSL-23.2.0-py3-none-any.whl", hash = "sha256:24f0dc5227396b3e831f4c7f602b950a5e9833d292c8e4a2e06b709292806ae2"},
1212
+ {file = "pyOpenSSL-23.2.0.tar.gz", hash = "sha256:276f931f55a452e7dea69c7173e984eb2a4407ce413c918aa34b55f82f9b8bac"},
1055
1213
  ]
1056
1214
 
1057
1215
  [[package]]
1058
- name = "pyspark"
1059
- version = "3.3.2"
1216
+ name = "pyproject-hooks"
1217
+ version = "1.0.0"
1060
1218
  requires_python = ">=3.7"
1061
- summary = "Apache Spark Python API"
1219
+ summary = "Wrappers to call pyproject.toml-based build backend hooks."
1062
1220
  dependencies = [
1063
- "py4j==0.10.9.5",
1221
+ "tomli>=1.1.0; python_version < \"3.11\"",
1064
1222
  ]
1065
1223
  files = [
1066
- {file = "pyspark-3.3.2.tar.gz", hash = "sha256:0dfd5db4300c1f6cc9c16d8dbdfb82d881b4b172984da71344ede1a9d4893da8"},
1224
+ {file = "pyproject_hooks-1.0.0-py3-none-any.whl", hash = "sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8"},
1225
+ {file = "pyproject_hooks-1.0.0.tar.gz", hash = "sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5"},
1067
1226
  ]
1068
1227
 
1069
1228
  [[package]]
@@ -1157,40 +1316,25 @@ files = [
1157
1316
  {file = "python_dotenv-0.19.2-py2.py3-none-any.whl", hash = "sha256:32b2bdc1873fd3a3c346da1c6db83d0053c3c62f28f1f38516070c4c8971b1d3"},
1158
1317
  ]
1159
1318
 
1319
+ [[package]]
1320
+ name = "pytz"
1321
+ version = "2023.3.post1"
1322
+ summary = "World timezone definitions, modern and historical"
1323
+ files = [
1324
+ {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"},
1325
+ {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"},
1326
+ ]
1327
+
1160
1328
  [[package]]
1161
1329
  name = "pyyaml"
1162
- version = "6.0"
1163
- requires_python = ">=3.6"
1330
+ version = "5.3.1"
1164
1331
  summary = "YAML parser and emitter for Python"
1165
1332
  files = [
1166
- {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
1167
- {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
1168
- {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
1169
- {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
1170
- {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
1171
- {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
1172
- {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
1173
- {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"},
1174
- {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"},
1175
- {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"},
1176
- {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"},
1177
- {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"},
1178
- {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"},
1179
- {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"},
1180
- {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
1181
- {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
1182
- {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
1183
- {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
1184
- {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
1185
- {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
1186
- {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
1187
- {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
1188
- {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
1189
- {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
1190
- {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
1191
- {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
1192
- {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
1193
- {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
1333
+ {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"},
1334
+ {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"},
1335
+ {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"},
1336
+ {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"},
1337
+ {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"},
1194
1338
  ]
1195
1339
 
1196
1340
  [[package]]
@@ -1267,6 +1411,65 @@ files = [
1267
1411
  {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"},
1268
1412
  ]
1269
1413
 
1414
+ [[package]]
1415
+ name = "snowflake-connector-python"
1416
+ version = "3.3.1"
1417
+ requires_python = ">=3.8"
1418
+ summary = "Snowflake Connector for Python"
1419
+ dependencies = [
1420
+ "asn1crypto<2.0.0,>0.24.0",
1421
+ "certifi>=2017.4.17",
1422
+ "cffi<2.0.0,>=1.9",
1423
+ "charset-normalizer<4,>=2",
1424
+ "cryptography<42.0.0,>=3.1.0",
1425
+ "filelock<4,>=3.5",
1426
+ "idna<4,>=2.5",
1427
+ "oscrypto<2.0.0",
1428
+ "packaging",
1429
+ "platformdirs<4.0.0,>=2.6.0",
1430
+ "pyOpenSSL<24.0.0,>=16.2.0",
1431
+ "pycryptodomex!=3.5.0,<4.0.0,>=3.2",
1432
+ "pyjwt<3.0.0",
1433
+ "pytz",
1434
+ "requests<3.0.0",
1435
+ "sortedcontainers>=2.4.0",
1436
+ "tomlkit",
1437
+ "typing-extensions<5,>=4.3",
1438
+ "urllib3<1.27,>=1.21.1",
1439
+ ]
1440
+ files = [
1441
+ {file = "snowflake-connector-python-3.3.1.tar.gz", hash = "sha256:bb66722bd64abcd76a6ab06a6423d674bcb729f9ba391056977ef92f383aadb8"},
1442
+ {file = "snowflake_connector_python-3.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca0b54fb08a8aac302b273432537c542b0defa0a362ed20671c56825511ddd94"},
1443
+ {file = "snowflake_connector_python-3.3.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:c46c516c81ccc85bbb7fddbcf4f341dd6f73f06151d780e25a9b414df1efbcb0"},
1444
+ {file = "snowflake_connector_python-3.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:340cc62a700165cc0024229d43dfcb81bc1cf2fc482f31fb264d48a5b28195a4"},
1445
+ {file = "snowflake_connector_python-3.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5db23975ebafe6965bc31414ad508f0bf5f2073159936956f2748f1bb1baac5e"},
1446
+ {file = "snowflake_connector_python-3.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:d92e6fe0b05f10b8b072f55ac5c4862ed9f686bac2411cb10eaca602fc54c976"},
1447
+ {file = "snowflake_connector_python-3.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3c75d151bfad1a1f904f24f584821d23c6c8af6f190bbbd7ee5e51df48bd146b"},
1448
+ {file = "snowflake_connector_python-3.3.1-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:1304ae5e0a4554e338d3a75c6755ca4a83da12bc223267d1c0fa184e30382cad"},
1449
+ {file = "snowflake_connector_python-3.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6dcd405b602d20bcd6742510c8addf1fda3a1f6afa3b80c1860f88541c9403f"},
1450
+ {file = "snowflake_connector_python-3.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:245bd5748c5e9b7c89d53ddd14d9da5fd65e5c4894a2f0cad71bc524b1ffb823"},
1451
+ {file = "snowflake_connector_python-3.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:2e483c36796eccbd982dad059c01554627cdd82bb18629ff5de51de8fc762dbb"},
1452
+ {file = "snowflake_connector_python-3.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c9899452b1c1f529ddc6bd94a50ac23d00cd2e48805262d86c2ec54c141bcae"},
1453
+ {file = "snowflake_connector_python-3.3.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:a0522bc2db9b45f95488dd895c01059d33e64538e74fa7bcc77322d6a335140c"},
1454
+ {file = "snowflake_connector_python-3.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:881f47cf80f6cf33f503af816c94bbee26ff0615ed3af398b09973ea9907fce9"},
1455
+ {file = "snowflake_connector_python-3.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfc3cf610bd0c0bf1b6e2637c7b354ae8dd6fb706b76f583a052416f44d9081f"},
1456
+ {file = "snowflake_connector_python-3.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:8dad9050dcda5c7a489e03fd0e000a2b3396e07b5fde88b2a24cec521a62a699"},
1457
+ {file = "snowflake_connector_python-3.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2941db25db16be516c185cc6ddabf0fb76212211c5fd2cf617f5899af5d7dc5"},
1458
+ {file = "snowflake_connector_python-3.3.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:d2a69ffb94a2fade8da6ebd0751d55ae23f35af8249e5e29d09a1feab08bb290"},
1459
+ {file = "snowflake_connector_python-3.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cde2473343500d522efda7257bf95a6de6d9753b73cc4c0152070f7312e52714"},
1460
+ {file = "snowflake_connector_python-3.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:709685da4ef09efea716f066dd606914e8c445c0abbc401ef5e21dc8bc53f515"},
1461
+ {file = "snowflake_connector_python-3.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:127958527cc6fe1621de71a2f06a830412e76a93d1df2524463a3be858b490ff"},
1462
+ ]
1463
+
1464
+ [[package]]
1465
+ name = "sortedcontainers"
1466
+ version = "2.4.0"
1467
+ summary = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set"
1468
+ files = [
1469
+ {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"},
1470
+ {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"},
1471
+ ]
1472
+
1270
1473
  [[package]]
1271
1474
  name = "sqlalchemy"
1272
1475
  version = "1.4.41"
@@ -27,8 +27,9 @@ dependencies = [
27
27
  "sqlalchemy<2.0.0,>=1.4.41",
28
28
  "sqlmodel<1.0.0,>=0.0.8",
29
29
  "sqlparse<1.0.0,>=0.4.3",
30
- "pyspark==3.3.2",
31
30
  "toml>=0.10.2",
31
+ "snowflake-connector-python>=3.3.1",
32
+ "pyyaml==5.3.1",
32
33
  ]
33
34
  requires-python = ">=3.8,<4.0"
34
35
  readme = "README.rst"
@@ -593,3 +593,75 @@ def test_submit_duckdb_query(
593
593
  assert data["results"][0]["columns"] == []
594
594
  assert data["results"][0]["rows"] == [[1, "a"]]
595
595
  assert data["errors"] == []
596
+
597
+
598
+ @mock.patch("djqs.engine.snowflake.connector")
599
+ def test_submit_snowflake_query(
600
+ mock_snowflake_connect,
601
+ session: Session,
602
+ client: TestClient,
603
+ ) -> None:
604
+ """
605
+ Test submitting a Snowflake query
606
+ """
607
+ mock_exec = mock.MagicMock()
608
+ mock_exec.fetchall.return_value = [[1, "a"]]
609
+ mock_cur = mock.MagicMock()
610
+ mock_cur.execute.return_value = mock_exec
611
+ mock_conn = mock.MagicMock()
612
+ mock_conn.cursor.return_value = mock_cur
613
+ mock_snowflake_connect.connect.return_value = mock_conn
614
+
615
+ engine = Engine(
616
+ name="test_snowflake_engine",
617
+ type=EngineType.SNOWFLAKE,
618
+ version="7.37",
619
+ uri="snowflake:///:memory:",
620
+ extra_params={"user": "foo", "account": "bar", "database": "foobar"},
621
+ )
622
+ catalog = Catalog(name="test_catalog", engines=[engine])
623
+ session.add(catalog)
624
+ session.commit()
625
+ session.refresh(catalog)
626
+
627
+ query_create = QueryCreate(
628
+ catalog_name=catalog.name,
629
+ engine_name=engine.name,
630
+ engine_version=engine.version,
631
+ submitted_query="SELECT 1 AS int_col, 'a' as str_col",
632
+ )
633
+ payload = query_create.json(by_alias=True)
634
+ assert payload == json.dumps(
635
+ {
636
+ "catalog_name": "test_catalog",
637
+ "engine_name": "test_snowflake_engine",
638
+ "engine_version": "7.37",
639
+ "submitted_query": "SELECT 1 AS int_col, 'a' as str_col",
640
+ "async_": False,
641
+ },
642
+ )
643
+
644
+ with freeze_time("2021-01-01T00:00:00Z"):
645
+ response = client.post(
646
+ "/queries/",
647
+ data=payload,
648
+ headers={"Content-Type": "application/json", "Accept": "application/json"},
649
+ )
650
+ data = response.json()
651
+
652
+ assert response.status_code == 200
653
+ assert data["catalog_name"] == "test_catalog"
654
+ assert data["engine_name"] == "test_snowflake_engine"
655
+ assert data["engine_version"] == "7.37"
656
+ assert data["submitted_query"] == "SELECT 1 AS int_col, 'a' as str_col"
657
+ assert data["executed_query"] == "SELECT 1 AS int_col, 'a' as str_col"
658
+ assert data["scheduled"] == "2021-01-01T00:00:00"
659
+ assert data["started"] == "2021-01-01T00:00:00"
660
+ assert data["finished"] == "2021-01-01T00:00:00"
661
+ assert data["state"] == "FINISHED"
662
+ assert data["progress"] == 1.0
663
+ assert len(data["results"]) == 1
664
+ assert data["results"][0]["sql"] == "SELECT 1 AS int_col, 'a' as str_col"
665
+ assert data["results"][0]["columns"] == []
666
+ assert data["results"][0]["rows"] == [[1, "a"]]
667
+ assert data["errors"] == []
@@ -122,4 +122,6 @@ def duckdb_conn():
122
122
  """
123
123
  A duckdb connection to a roads database
124
124
  """
125
- return duckdb.connect(database="docker/default.duckdb")
125
+ return duckdb.connect(
126
+ database="docker/default.duckdb",
127
+ )