From f74e8fd8a401afb057e4f76e07f537e6297f447c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kriszti=C3=A1n=20Sz=C5=B1cs?= Date: Wed, 23 Aug 2023 08:53:34 +0200 Subject: [PATCH] chore: pin newer sqlglot version and update the implementations --- ibis/backends/base/sql/glot/datatypes.py | 33 +-- .../base/sql/glot/tests/test_datatypes.py | 6 +- ibis/backends/clickhouse/datatypes.py | 40 ++- .../clickhouse/tests/test_datatypes.py | 54 +++- .../test_union_aliasing/clickhouse/out.sql | 76 ++--- ibis/backends/tests/test_export.py | 17 +- ibis/tests/strategies.py | 5 +- poetry.lock | 269 ++---------------- pyproject.toml | 2 +- requirements-dev.txt | 20 +- 10 files changed, 169 insertions(+), 353 deletions(-) diff --git a/ibis/backends/base/sql/glot/datatypes.py b/ibis/backends/base/sql/glot/datatypes.py index 535cf2d4d41f9..90d0cffc11993 100644 --- a/ibis/backends/base/sql/glot/datatypes.py +++ b/ibis/backends/base/sql/glot/datatypes.py @@ -148,7 +148,7 @@ def to_ibis(cls, typ: sge.DataType, nullable: bool | None = None) -> dt.DataType """Convert a sqlglot type to an ibis type.""" typecode = typ.this - if method := getattr(cls, f"_to_ibis_{typecode.name}", None): + if method := getattr(cls, f"_from_sqlglot_{typecode.name}", None): dtype = method(*typ.expressions) else: dtype = _from_sqlglot_types[typecode](nullable=cls.default_nullable) @@ -180,11 +180,13 @@ def to_string(cls, dtype: dt.DataType) -> str: return cls.from_ibis(dtype).sql(dialect=cls.dialect) @classmethod - def _to_ibis_ARRAY(cls, value_type: sge.DataType) -> dt.Array: + def _from_sqlglot_ARRAY(cls, value_type: sge.DataType) -> dt.Array: return dt.Array(cls.to_ibis(value_type), nullable=cls.default_nullable) @classmethod - def _to_ibis_MAP(cls, key_type: sge.DataType, value_type: sge.DataType) -> dt.Map: + def _from_sqlglot_MAP( + cls, key_type: sge.DataType, value_type: sge.DataType + ) -> dt.Map: return dt.Map( cls.to_ibis(key_type), cls.to_ibis(value_type), @@ -192,7 +194,7 @@ def _to_ibis_MAP(cls, key_type: sge.DataType, value_type: sge.DataType) -> dt.Ma ) @classmethod - def _to_ibis_STRUCT(cls, *fields: sge.ColumnDef) -> dt.Struct: + def _from_sqlglot_STRUCT(cls, *fields: sge.ColumnDef) -> dt.Struct: types = {} for i, field in enumerate(fields): if isinstance(field, sge.ColumnDef): @@ -202,14 +204,14 @@ def _to_ibis_STRUCT(cls, *fields: sge.ColumnDef) -> dt.Struct: return dt.Struct(types, nullable=cls.default_nullable) @classmethod - def _to_ibis_TIMESTAMP(cls, scale=None) -> dt.Timestamp: + def _from_sqlglot_TIMESTAMP(cls, scale=None) -> dt.Timestamp: return dt.Timestamp( scale=cls.default_temporal_scale if scale is None else int(scale.this.this), nullable=cls.default_nullable, ) @classmethod - def _to_ibis_TIMESTAMPTZ(cls, scale=None) -> dt.Timestamp: + def _from_sqlglot_TIMESTAMPTZ(cls, scale=None) -> dt.Timestamp: return dt.Timestamp( timezone="UTC", scale=cls.default_temporal_scale if scale is None else int(scale.this.this), @@ -217,18 +219,18 @@ def _to_ibis_TIMESTAMPTZ(cls, scale=None) -> dt.Timestamp: ) @classmethod - def _to_ibis_INTERVAL( - cls, precision: sge.DataTypeSize | None = None + def _from_sqlglot_INTERVAL( + cls, precision: sge.DataTypeParam | None = None ) -> dt.Interval: if precision is None: precision = cls.default_interval_precision return dt.Interval(str(precision), nullable=cls.default_nullable) @classmethod - def _to_ibis_DECIMAL( + def _from_sqlglot_DECIMAL( cls, - precision: sge.DataTypeSize | None = None, - scale: sge.DataTypeSize | None = None, + precision: sge.DataTypeParam | None = None, + scale: sge.DataTypeParam | None = None, ) -> dt.Decimal: if precision is None: precision = cls.default_decimal_precision @@ -266,17 +268,16 @@ def _from_ibis_Decimal(cls, dtype: dt.Decimal) -> sge.DataType: return sge.DataType( this=typecode.DECIMAL, expressions=[ - sge.Literal.number(dtype.precision), - sge.Literal.number(dtype.scale), + sge.DataTypeParam(this=sge.Literal.number(dtype.precision)), + sge.DataTypeParam(this=sge.Literal.number(dtype.scale)), ], ) @classmethod def _from_ibis_Timestamp(cls, dtype: dt.Timestamp) -> sge.DataType: code = typecode.TIMESTAMP if dtype.timezone is None else typecode.TIMESTAMPTZ - if dtype.scale: - scale = sge.Literal.number(dtype.scale) - scale = sge.DataTypeSize(this=typecode.DATATYPESIZE, expressions=[scale]) + if dtype.scale is not None: + scale = sge.DataTypeParam(this=sge.Literal.number(dtype.scale)) return sge.DataType(this=code, expressions=[scale]) else: return sge.DataType(this=code) diff --git a/ibis/backends/base/sql/glot/tests/test_datatypes.py b/ibis/backends/base/sql/glot/tests/test_datatypes.py index 129747c3cc297..de9f590678f98 100644 --- a/ibis/backends/base/sql/glot/tests/test_datatypes.py +++ b/ibis/backends/base/sql/glot/tests/test_datatypes.py @@ -15,9 +15,7 @@ def assert_dtype_roundtrip(ibis_type, sqlglot_expected=None): if sqlglot_expected is not None: assert sqlglot_result == sqlglot_expected - restored_dtype = SqlglotType.to_ibis( - sqlglot_result - ) # , nullable=ibis_type.nullable) + restored_dtype = SqlglotType.to_ibis(sqlglot_result) assert ibis_type == restored_dtype @@ -38,7 +36,6 @@ def assert_dtype_roundtrip(ibis_type, sqlglot_expected=None): | its.date_dtype(nullable=true) | its.time_dtype(nullable=true) | its.timestamp_dtype(timezone=st.none(), nullable=true) - # | its.interval_dtype(nullable=true) | its.array_dtypes(roundtripable_types, nullable=true) | its.map_dtypes(roundtripable_types, roundtripable_types, nullable=true) | its.struct_dtypes(roundtripable_types, nullable=true) @@ -48,6 +45,7 @@ def assert_dtype_roundtrip(ibis_type, sqlglot_expected=None): # not roundtrippable: # - float16 # - macaddr +# - interval? @h.given(roundtripable_types) diff --git a/ibis/backends/clickhouse/datatypes.py b/ibis/backends/clickhouse/datatypes.py index db3c8b679f060..ad451fb466dc3 100644 --- a/ibis/backends/clickhouse/datatypes.py +++ b/ibis/backends/clickhouse/datatypes.py @@ -3,7 +3,6 @@ from typing import Literal import sqlglot.expressions as sge -from sqlglot.dialects.clickhouse import ClickHouse import ibis import ibis.expr.datatypes as dt @@ -12,11 +11,6 @@ typecode = sge.DataType.Type -# TODO(kszucs): it may not be the nicest way to do it, should be pushed upstream -# or just use TEXT/VARCHAR which are aliases for `String`, but our test suite -# expects `String` to be used -ClickHouse.Generator.TYPE_MAPPING[typecode.VARCHAR] = "String" - def _bool_type() -> Literal["Bool", "UInt8", "Int8"]: return getattr(getattr(ibis.options, "clickhouse", None), "bool_type", "Bool") @@ -26,6 +20,7 @@ class ClickhouseType(SqlglotType): dialect = "clickhouse" default_decimal_precision = None default_decimal_scale = None + default_temporal_scale = 3 default_nullable = False unknown_type_strings = FrozenDict( @@ -42,42 +37,44 @@ class ClickhouseType(SqlglotType): def from_ibis(cls, dtype: dt.DataType) -> sge.DataType: """Convert a sqlglot type to an ibis type.""" typ = super().from_ibis(dtype) - non_nullable_types = (dt.Map,) - if dtype.nullable and not isinstance(dtype, non_nullable_types): + if dtype.nullable and not dtype.is_map(): + # map cannot be nullable in clickhouse return sge.DataType(this=typecode.NULLABLE, expressions=[typ]) else: return typ @classmethod - def _to_ibis_NULLABLE(cls, inner_type: sge.DataType) -> dt.DataType: + def _from_sqlglot_NULLABLE(cls, inner_type: sge.DataType) -> dt.DataType: return cls.to_ibis(inner_type, nullable=True) @classmethod - def _to_ibis_DATETIME(cls, timezone: sge.Literal | None = None) -> dt.Timestamp: + def _from_sqlglot_DATETIME( + cls, timezone: sge.DataTypeParam | None = None + ) -> dt.Timestamp: return dt.Timestamp( + scale=0, timezone=None if timezone is None else timezone.this.this, - scale=cls.default_temporal_scale, nullable=cls.default_nullable, ) @classmethod - def _to_ibis_DATETIME64( + def _from_sqlglot_DATETIME64( cls, scale: sge.DataTypeSize | None = None, timezone: sge.Literal | None = None, ) -> dt.Timestamp: return dt.Timestamp( timezone=None if timezone is None else timezone.this.this, - scale=cls.default_temporal_scale if scale is None else int(scale.this.this), + scale=int(scale.this.this), nullable=cls.default_nullable, ) @classmethod - def _to_ibis_LOWCARDINALITY(cls, inner_type: sge.DataType) -> dt.DataType: + def _from_sqlglot_LOWCARDINALITY(cls, inner_type: sge.DataType) -> dt.DataType: return cls.to_ibis(inner_type) @classmethod - def _to_ibis_NESTED(cls, *fields: sge.DataType) -> dt.Struct: + def _from_sqlglot_NESTED(cls, *fields: sge.DataType) -> dt.Struct: fields = { field.name: dt.Array( cls.to_ibis(field.args["kind"]), nullable=cls.default_nullable @@ -88,16 +85,15 @@ def _to_ibis_NESTED(cls, *fields: sge.DataType) -> dt.Struct: @classmethod def _from_ibis_Timestamp(cls, dtype: dt.Timestamp) -> sge.DataType: - if dtype.scale is None: - scale = sge.Literal.number(3) + if dtype.timezone is None: + timezone = None else: - scale = sge.Literal.number(dtype.scale) + timezone = sge.DataTypeParam(this=sge.Literal.string(dtype.timezone)) - scale = sge.DataTypeSize(this=typecode.DATATYPESIZE, expressions=[scale]) - if dtype.timezone is None: - return sge.DataType(this=typecode.DATETIME64, expressions=[scale]) + if dtype.scale is None: + return sge.DataType(this=typecode.DATETIME, expressions=[timezone]) else: - timezone = sge.Literal.string(dtype.timezone) + scale = sge.DataTypeParam(this=sge.Literal.number(dtype.scale)) return sge.DataType(this=typecode.DATETIME64, expressions=[scale, timezone]) @classmethod diff --git a/ibis/backends/clickhouse/tests/test_datatypes.py b/ibis/backends/clickhouse/tests/test_datatypes.py index 7fa4b81479fa6..0dd6f6598eae0 100644 --- a/ibis/backends/clickhouse/tests/test_datatypes.py +++ b/ibis/backends/clickhouse/tests/test_datatypes.py @@ -1,9 +1,12 @@ from __future__ import annotations +import hypothesis as h +import hypothesis.strategies as st import pytest from pytest import param import ibis.expr.datatypes as dt +import ibis.tests.strategies as its from ibis.backends.clickhouse.datatypes import ClickhouseType pytest.importorskip("clickhouse_connect") @@ -114,12 +117,12 @@ def test_columns_types_with_additional_argument(con): ), param( "Array(DateTime)", - dt.Array(dt.Timestamp(nullable=False), nullable=False), + dt.Array(dt.Timestamp(scale=0, nullable=False), nullable=False), id="array_datetime", ), param( - "Array(DateTime64)", - dt.Array(dt.Timestamp(nullable=False), nullable=False), + "Array(DateTime64(9))", + dt.Array(dt.Timestamp(scale=9, nullable=False), nullable=False), id="array_datetime64", ), param("Array(Nothing)", dt.Array(dt.null, nullable=False), id="array_nothing"), @@ -207,13 +210,12 @@ def test_columns_types_with_additional_argument(con): ), id="nested", ), - param("DateTime", dt.Timestamp(nullable=False), id="datetime"), + param("DateTime", dt.Timestamp(scale=0, nullable=False), id="datetime"), param( "DateTime('Europe/Budapest')", - dt.Timestamp(timezone="Europe/Budapest", nullable=False), + dt.Timestamp(scale=0, timezone="Europe/Budapest", nullable=False), id="datetime_timezone", ), - param("DateTime64", dt.Timestamp(nullable=False), id="datetime64"), param( "DateTime64(0)", dt.Timestamp(scale=0, nullable=False), id="datetime64_zero" ), @@ -232,4 +234,42 @@ def test_columns_types_with_additional_argument(con): ], ) def test_parse_type(ch_type, ibis_type): - assert ClickhouseType.from_string(ch_type) == ibis_type + parsed_ibis_type = ClickhouseType.from_string(ch_type) + assert parsed_ibis_type == ibis_type + + +false = st.just(False) + +map_key_types = ( + its.string_dtype(nullable=false) + | its.integer_dtypes(nullable=false) + | its.date_dtype(nullable=false) + | its.timestamp_dtype(scale=st.integers(0, 9), nullable=false) +) + +roundtrippable_types = st.deferred( + lambda: ( + its.null_dtype + | its.boolean_dtype() + | its.integer_dtypes() + | st.just(dt.Float32()) + | st.just(dt.Float64()) + | its.decimal_dtypes() + | its.string_dtype() + | its.json_dtype() + | its.inet_dtype() + | its.uuid_dtype() + | its.date_dtype() + | its.time_dtype() + | its.timestamp_dtype(scale=st.integers(0, 9)) + | its.array_dtypes(roundtrippable_types) + | its.map_dtypes(map_key_types, roundtrippable_types, nullable=false) + ) +) + + +@h.given(roundtrippable_types) +def test_type_roundtrip(ibis_type): + type_string = ClickhouseType.to_string(ibis_type) + parsed_ibis_type = ClickhouseType.from_string(type_string) + assert parsed_ibis_type == ibis_type diff --git a/ibis/backends/tests/snapshots/test_sql/test_union_aliasing/clickhouse/out.sql b/ibis/backends/tests/snapshots/test_sql/test_union_aliasing/clickhouse/out.sql index 015c652df6842..50a192e470c7b 100644 --- a/ibis/backends/tests/snapshots/test_sql/test_union_aliasing/clickhouse/out.sql +++ b/ibis/backends/tests/snapshots/test_sql/test_union_aliasing/clickhouse/out.sql @@ -23,30 +23,30 @@ FROM ( FROM ( SELECT t1.field_of_study, - CAST(t1.__pivoted__.1 AS Nullable(TEXT)) AS years, + CAST(t1.__pivoted__.1 AS Nullable(String)) AS years, CAST(t1.__pivoted__.2 AS Nullable(Int64)) AS degrees FROM ( SELECT t0.field_of_study, arrayJoin( - [ CAST(('1970-71', t0."1970-71") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('1975-76', t0."1975-76") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('1980-81', t0."1980-81") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('1985-86', t0."1985-86") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('1990-91', t0."1990-91") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('1995-96', t0."1995-96") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2000-01', t0."2000-01") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2005-06', t0."2005-06") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2010-11', t0."2010-11") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2011-12', t0."2011-12") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2012-13', t0."2012-13") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2013-14', t0."2013-14") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2014-15', t0."2014-15") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2015-16', t0."2015-16") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2016-17', t0."2016-17") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2017-18', t0."2017-18") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2018-19', t0."2018-19") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2019-20', t0."2019-20") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64)))] + [ CAST(('1970-71', t0."1970-71") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('1975-76', t0."1975-76") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('1980-81', t0."1980-81") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('1985-86', t0."1985-86") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('1990-91', t0."1990-91") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('1995-96', t0."1995-96") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2000-01', t0."2000-01") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2005-06', t0."2005-06") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2010-11', t0."2010-11") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2011-12', t0."2011-12") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2012-13', t0."2012-13") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2013-14', t0."2013-14") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2014-15', t0."2014-15") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2015-16', t0."2015-16") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2016-17', t0."2016-17") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2017-18', t0."2017-18") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2018-19', t0."2018-19") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2019-20', t0."2019-20") AS Tuple(years Nullable(String), degrees Nullable(Int64)))] ) AS __pivoted__ FROM humanities AS t0 ) AS t1 @@ -85,30 +85,30 @@ FROM ( FROM ( SELECT t1.field_of_study, - CAST(t1.__pivoted__.1 AS Nullable(TEXT)) AS years, + CAST(t1.__pivoted__.1 AS Nullable(String)) AS years, CAST(t1.__pivoted__.2 AS Nullable(Int64)) AS degrees FROM ( SELECT t0.field_of_study, arrayJoin( - [ CAST(('1970-71', t0."1970-71") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('1975-76', t0."1975-76") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('1980-81', t0."1980-81") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('1985-86', t0."1985-86") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('1990-91', t0."1990-91") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('1995-96', t0."1995-96") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2000-01', t0."2000-01") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2005-06', t0."2005-06") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2010-11', t0."2010-11") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2011-12', t0."2011-12") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2012-13', t0."2012-13") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2013-14', t0."2013-14") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2014-15', t0."2014-15") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2015-16', t0."2015-16") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2016-17', t0."2016-17") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2017-18', t0."2017-18") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2018-19', t0."2018-19") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64))), - CAST(('2019-20', t0."2019-20") AS Tuple(years Nullable(TEXT), degrees Nullable(Int64)))] + [ CAST(('1970-71', t0."1970-71") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('1975-76', t0."1975-76") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('1980-81', t0."1980-81") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('1985-86', t0."1985-86") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('1990-91', t0."1990-91") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('1995-96', t0."1995-96") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2000-01', t0."2000-01") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2005-06', t0."2005-06") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2010-11', t0."2010-11") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2011-12', t0."2011-12") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2012-13', t0."2012-13") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2013-14', t0."2013-14") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2014-15', t0."2014-15") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2015-16', t0."2015-16") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2016-17', t0."2016-17") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2017-18', t0."2017-18") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2018-19', t0."2018-19") AS Tuple(years Nullable(String), degrees Nullable(Int64))), + CAST(('2019-20', t0."2019-20") AS Tuple(years Nullable(String), degrees Nullable(Int64)))] ) AS __pivoted__ FROM humanities AS t0 ) AS t1 diff --git a/ibis/backends/tests/test_export.py b/ibis/backends/tests/test_export.py index 48cd7afb56d10..5c3c2fb31802b 100644 --- a/ibis/backends/tests/test_export.py +++ b/ibis/backends/tests/test_export.py @@ -11,6 +11,7 @@ import ibis import ibis.expr.datatypes as dt from ibis import util +from ibis.formats.pyarrow import PyArrowType try: from pyspark.sql.utils import ParseException @@ -399,18 +400,16 @@ def test_roundtrip_delta(con, alltypes, tmp_path, monkeypatch): ["impala"], raises=AttributeError, reason="missing `fetchmany` on the cursor" ) def test_arrow_timestamp_with_time_zone(alltypes): - from ibis import _ - - # TODO(cpcloud): see if this can be abstracted over in tests, e.g., pandas - # is ns, most others are us - unit = "us" - t = alltypes.select( - tz=_.timestamp_col.cast("timestamp('UTC')"), - no_tz=_.timestamp_col, + tz=alltypes.timestamp_col.cast( + alltypes.timestamp_col.type().copy(timezone="UTC") + ), + no_tz=alltypes.timestamp_col, ).limit(1) - expected = [pa.timestamp(unit, tz="UTC"), pa.timestamp(unit)] + patype = PyArrowType.from_ibis(alltypes.timestamp_col.type()) + paunit = patype.unit + expected = [pa.timestamp(paunit, tz="UTC"), pa.timestamp(paunit)] assert t.to_pyarrow().schema.types == expected with t.to_pyarrow_batches() as reader: diff --git a/ibis/tests/strategies.py b/ibis/tests/strategies.py index d01bfc2beb4dc..ffe01bcad168e 100644 --- a/ibis/tests/strategies.py +++ b/ibis/tests/strategies.py @@ -115,10 +115,11 @@ def time_dtype(nullable=_nullable): _timezone = st.none() | tzst.timezones().map(str) _interval = st.sampled_from(list(IntervalUnit)) +_timestamp_scale = st.none() | st.integers(min_value=0, max_value=9) -def timestamp_dtype(timezone=_timezone, nullable=_nullable): - return st.builds(dt.Timestamp, timezone=timezone, nullable=nullable) +def timestamp_dtype(scale=_timestamp_scale, timezone=_timezone, nullable=_nullable): + return st.builds(dt.Timestamp, scale=scale, timezone=timezone, nullable=nullable) def interval_dtype(interval=_interval, nullable=_nullable): diff --git a/poetry.lock b/poetry.lock index e53e80a1ad9ef..cbe54964fe352 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. [[package]] name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -category = "dev" optional = false python-versions = "*" files = [ @@ -16,7 +15,6 @@ files = [ name = "asn1crypto" version = "1.5.1" description = "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" -category = "main" optional = true python-versions = "*" files = [ @@ -28,7 +26,6 @@ files = [ name = "asttokens" version = "2.2.1" description = "Annotate AST trees with source code positions" -category = "dev" optional = false python-versions = "*" files = [ @@ -46,7 +43,6 @@ test = ["astroid", "pytest"] name = "atpublic" version = "4.0" description = "Keep all y'all's __all__'s in sync" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -58,7 +54,6 @@ files = [ name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -77,7 +72,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "babel" version = "2.12.1" description = "Internationalization utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -89,7 +83,6 @@ files = [ name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "dev" optional = false python-versions = "*" files = [ @@ -101,7 +94,6 @@ files = [ name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" -category = "dev" optional = false python-versions = ">=3.6.0" files = [ @@ -120,7 +112,6 @@ lxml = ["lxml"] name = "bidict" version = "0.22.1" description = "The bidirectional mapping library for Python." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -137,7 +128,6 @@ test = ["hypothesis", "pytest", "pytest-benchmark[histogram]", "pytest-cov", "py name = "bitarray" version = "2.8.1" description = "efficient arrays of booleans -- C extension" -category = "main" optional = true python-versions = "*" files = [ @@ -249,7 +239,6 @@ files = [ name = "black" version = "23.7.0" description = "The uncompromising code formatter." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -296,7 +285,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "bleach" version = "6.0.0" description = "An easy safelist-based HTML-sanitizing tool." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -315,7 +303,6 @@ css = ["tinycss2 (>=1.1.0,<1.2)"] name = "cachetools" version = "5.3.1" description = "Extensible memoizing collections and decorators" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -327,7 +314,6 @@ files = [ name = "cairocffi" version = "1.6.1" description = "cffi-based cairo bindings for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -347,7 +333,6 @@ xcb = ["xcffib (>=1.4.0)"] name = "cairosvg" version = "2.7.1" description = "A Simple SVG Converter based on Cairo" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -370,7 +355,6 @@ test = ["flake8", "isort", "pytest"] name = "certifi" version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -382,7 +366,6 @@ files = [ name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = "*" files = [ @@ -459,7 +442,6 @@ pycparser = "*" name = "cfgv" version = "3.4.0" description = "Validate configuration and produce human readable error messages." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -471,7 +453,6 @@ files = [ name = "chardet" version = "5.2.0" description = "Universal encoding detector for Python 3" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -483,7 +464,6 @@ files = [ name = "charset-normalizer" version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -568,7 +548,6 @@ files = [ name = "click" version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -583,7 +562,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "click-plugins" version = "1.1.1" description = "An extension module for click to enable registering CLI commands via setuptools entry-points." -category = "main" optional = true python-versions = "*" files = [ @@ -601,7 +579,6 @@ dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] name = "clickhouse-connect" version = "0.6.8" description = "ClickHouse Database Core Driver for Python, Pandas, and Superset" -category = "main" optional = true python-versions = "~=3.7" files = [ @@ -694,7 +671,6 @@ sqlalchemy = ["sqlalchemy (>1.3.21,<2.0)"] name = "cligj" version = "0.7.2" description = "Click params for commmand line interfaces to GeoJSON" -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" files = [ @@ -712,7 +688,6 @@ test = ["pytest-cov"] name = "cloudpickle" version = "2.2.1" description = "Extended pickling support for Python objects" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -724,7 +699,6 @@ files = [ name = "codespell" version = "2.2.5" description = "Codespell" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -746,7 +720,6 @@ types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -758,7 +731,6 @@ files = [ name = "comm" version = "0.1.4" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -778,7 +750,6 @@ typing = ["mypy (>=0.990)"] name = "coverage" version = "7.3.0" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -846,7 +817,6 @@ toml = ["tomli"] name = "cryptography" version = "40.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -888,7 +858,6 @@ tox = ["tox"] name = "cssselect2" version = "0.7.0" description = "CSS selectors for Python ElementTree" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -908,7 +877,6 @@ test = ["flake8", "isort", "pytest"] name = "dask" version = "2023.8.1" description = "Parallel PyData with Task Scheduling" -category = "main" optional = true python-versions = ">=3.9" files = [ @@ -940,7 +908,6 @@ test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-rerunfailu name = "datafusion" version = "22.0.0" description = "Build and run queries against data" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -959,7 +926,6 @@ pyarrow = ">=6.0.1" name = "db-dtypes" version = "1.1.1" description = "Pandas Data Types for SQL systems (BigQuery, Spanner)" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -977,7 +943,6 @@ pyarrow = ">=3.0.0" name = "debugpy" version = "1.6.7.post1" description = "An implementation of the Debug Adapter Protocol for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1005,7 +970,6 @@ files = [ name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1017,7 +981,6 @@ files = [ name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -1029,7 +992,6 @@ files = [ name = "deltalake" version = "0.10.1" description = "Native Delta Lake Python binding based on delta-rs with Pandas integration" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1053,7 +1015,6 @@ pyspark = ["delta-spark", "numpy (==1.22.2)", "pyspark"] name = "distlib" version = "0.3.7" description = "Distribution utilities" -category = "dev" optional = false python-versions = "*" files = [ @@ -1065,7 +1026,6 @@ files = [ name = "duckdb" version = "0.8.1" description = "DuckDB embedded database" -category = "main" optional = true python-versions = "*" files = [ @@ -1127,7 +1087,6 @@ files = [ name = "duckdb-engine" version = "0.9.2" description = "SQLAlchemy driver for duckdb" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1143,7 +1102,6 @@ sqlalchemy = ">=1.3.22" name = "dunamai" version = "1.18.0" description = "Dynamic version generation" -category = "dev" optional = false python-versions = ">=3.5,<4.0" files = [ @@ -1158,7 +1116,6 @@ packaging = ">=20.9" name = "exceptiongroup" version = "1.1.3" description = "Backport of PEP 654 (exception groups)" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1173,7 +1130,6 @@ test = ["pytest (>=6)"] name = "execnet" version = "2.0.2" description = "execnet: rapid multi-Python deployment" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1188,7 +1144,6 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] name = "executing" version = "1.2.0" description = "Get the currently executing AST node of a frame, and other information" -category = "dev" optional = false python-versions = "*" files = [ @@ -1203,7 +1158,6 @@ tests = ["asttokens", "littleutils", "pytest", "rich"] name = "fastjsonschema" version = "2.18.0" description = "Fastest Python implementation of JSON schema" -category = "dev" optional = false python-versions = "*" files = [ @@ -1218,7 +1172,6 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc name = "filelock" version = "3.12.2" description = "A platform independent file lock." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1234,7 +1187,6 @@ testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "p name = "fiona" version = "1.9.4.post1" description = "Fiona reads and writes spatial data files" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1279,7 +1231,6 @@ test = ["Fiona[s3]", "pytest (>=7)", "pytest-cov", "pytz"] name = "fsspec" version = "2023.6.0" description = "File-system specification" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -1315,7 +1266,6 @@ tqdm = ["tqdm"] name = "geoalchemy2" version = "0.13.3" description = "Using SQLAlchemy with Spatial Databases" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1331,7 +1281,6 @@ SQLAlchemy = ">=1.4" name = "geopandas" version = "0.13.2" description = "Geographic pandas extensions" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -1350,7 +1299,6 @@ shapely = ">=1.7.1" name = "ghp-import" version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." -category = "dev" optional = false python-versions = "*" files = [ @@ -1368,7 +1316,6 @@ dev = ["flake8", "markdown", "twine", "wheel"] name = "gitdb" version = "4.0.10" description = "Git Object Database" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1383,7 +1330,6 @@ smmap = ">=3.0.1,<6" name = "gitpython" version = "3.1.32" description = "GitPython is a Python library used to interact with Git repositories" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1398,7 +1344,6 @@ gitdb = ">=4.0.1,<5" name = "google-api-core" version = "2.11.1" description = "Google API client core library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1411,11 +1356,11 @@ google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = [ {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, - {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\""}, + {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, - {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\""}, + {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" @@ -1429,7 +1374,6 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] name = "google-auth" version = "2.22.0" description = "Google Authentication Library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1455,7 +1399,6 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] name = "google-auth-oauthlib" version = "1.0.0" description = "Google Authentication Library" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -1474,7 +1417,6 @@ tool = ["click (>=6.0.0)"] name = "google-cloud-bigquery" version = "3.11.4" description = "Google BigQuery API client library" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1483,7 +1425,7 @@ files = [ ] [package.dependencies] -google-api-core = {version = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} +google-api-core = {version = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} google-cloud-core = ">=1.6.0,<3.0.0dev" google-resumable-media = ">=0.6.0,<3.0dev" grpcio = [ @@ -1510,7 +1452,6 @@ tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] name = "google-cloud-bigquery-storage" version = "2.22.0" description = "Google Cloud Bigquery Storage API client library" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1519,7 +1460,7 @@ files = [ ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} proto-plus = [ {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, @@ -1535,7 +1476,6 @@ pyarrow = ["pyarrow (>=0.15.0)"] name = "google-cloud-core" version = "2.3.3" description = "Google Cloud API client core library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1544,7 +1484,7 @@ files = [ ] [package.dependencies] -google-api-core = ">=1.31.6,<2.0.0 || >2.3.0,<3.0.0dev" +google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" google-auth = ">=1.25.0,<3.0dev" [package.extras] @@ -1554,7 +1494,6 @@ grpc = ["grpcio (>=1.38.0,<2.0dev)"] name = "google-cloud-storage" version = "2.10.0" description = "Google Cloud Storage API client library" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1563,7 +1502,7 @@ files = [ ] [package.dependencies] -google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" google-auth = ">=1.25.0,<3.0dev" google-cloud-core = ">=2.3.0,<3.0dev" google-resumable-media = ">=2.3.2" @@ -1576,7 +1515,6 @@ protobuf = ["protobuf (<5.0.0dev)"] name = "google-crc32c" version = "1.5.0" description = "A python wrapper of the C library 'Google CRC32C'" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1657,7 +1595,6 @@ testing = ["pytest"] name = "google-resumable-media" version = "2.5.0" description = "Utilities for Google Media Downloads and Resumable Uploads" -category = "main" optional = false python-versions = ">= 3.7" files = [ @@ -1676,7 +1613,6 @@ requests = ["requests (>=2.18.0,<3.0.0dev)"] name = "googleapis-common-protos" version = "1.60.0" description = "Common protobufs used in Google APIs" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1694,7 +1630,6 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] name = "graphviz" version = "0.20.1" description = "Simple Python interface for Graphviz" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1711,7 +1646,6 @@ test = ["coverage", "mock (>=4)", "pytest (>=7)", "pytest-cov", "pytest-mock (>= name = "greenlet" version = "2.0.2" description = "Lightweight in-process concurrent programming" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" files = [ @@ -1785,7 +1719,6 @@ test = ["objgraph", "psutil"] name = "griffe" version = "0.34.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1800,7 +1733,6 @@ colorama = ">=0.4" name = "grpcio" version = "1.57.0" description = "HTTP/2-based RPC framework" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1858,7 +1790,6 @@ protobuf = ["grpcio-tools (>=1.57.0)"] name = "grpcio-status" version = "1.57.0" description = "Status proto mapping for gRPC" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -1875,7 +1806,6 @@ protobuf = ">=4.21.6" name = "hypothesis" version = "6.82.6" description = "A library for property-based testing" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1908,7 +1838,6 @@ zoneinfo = ["backports.zoneinfo (>=0.2.1)", "tzdata (>=2023.3)"] name = "identify" version = "2.5.26" description = "File identification library for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1923,7 +1852,6 @@ license = ["ukkonen"] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1935,7 +1863,6 @@ files = [ name = "importlib-metadata" version = "6.8.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1955,7 +1882,6 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs name = "impyla" version = "0.18.0" description = "Python client for the Impala distributed query engine" -category = "main" optional = true python-versions = "*" files = [ @@ -1976,7 +1902,6 @@ kerberos = ["kerberos (>=1.3.0)"] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1988,7 +1913,6 @@ files = [ name = "ipykernel" version = "6.25.1" description = "IPython Kernel for Jupyter" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2002,7 +1926,7 @@ comm = ">=0.1.1" debugpy = ">=1.6.5" ipython = ">=7.23.1" jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" @@ -2022,7 +1946,6 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" name = "ipython" version = "8.14.0" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -2062,7 +1985,6 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa name = "jedi" version = "0.19.0" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2082,7 +2004,6 @@ testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2100,7 +2021,6 @@ i18n = ["Babel (>=2.7)"] name = "jsonschema" version = "4.19.0" description = "An implementation of JSON Schema validation for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2122,7 +2042,6 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jsonschema-specifications" version = "2023.7.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2137,7 +2056,6 @@ referencing = ">=0.28.0" name = "jupyter-client" version = "8.3.0" description = "Jupyter protocol implementation and client libraries" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2147,7 +2065,7 @@ files = [ [package.dependencies] importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" @@ -2161,7 +2079,6 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt name = "jupyter-core" version = "5.3.1" description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2182,7 +2099,6 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] name = "jupyterlab-pygments" version = "0.2.2" description = "Pygments theme using JupyterLab CSS variables" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2194,7 +2110,6 @@ files = [ name = "jupytext" version = "1.15.0" description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" -category = "dev" optional = false python-versions = "~=3.6" files = [ @@ -2217,7 +2132,6 @@ toml = ["toml"] name = "locket" version = "1.0.0" description = "File-based locks for Python on Linux and Windows" -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2229,7 +2143,6 @@ files = [ name = "lz4" version = "4.3.2" description = "LZ4 Bindings for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2279,7 +2192,6 @@ tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] name = "markdown" version = "3.4.4" description = "Python implementation of John Gruber's Markdown." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2298,7 +2210,6 @@ testing = ["coverage", "pyyaml"] name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2323,7 +2234,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2383,7 +2293,6 @@ files = [ name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2398,7 +2307,6 @@ traitlets = "*" name = "mdit-py-plugins" version = "0.4.0" description = "Collection of plugins for markdown-it-py" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2418,7 +2326,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2430,7 +2337,6 @@ files = [ name = "mergedeep" version = "1.3.4" description = "A deep merge function for 🐍." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2442,7 +2348,6 @@ files = [ name = "mistune" version = "3.0.1" description = "A sane and fast Markdown parser with useful plugins and renderers" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2454,7 +2359,6 @@ files = [ name = "mkdocs" version = "1.5.2" description = "Project documentation with Markdown." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2486,7 +2390,6 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-imp name = "mkdocs-autorefs" version = "0.5.0" description = "Automatically link across pages in MkDocs." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2502,7 +2405,6 @@ mkdocs = ">=1.1" name = "mkdocs-exclude" version = "1.0.2" description = "A mkdocs plugin that lets you exclude files or trees." -category = "dev" optional = false python-versions = "*" files = [ @@ -2516,7 +2418,6 @@ mkdocs = "*" name = "mkdocs-gen-files" version = "0.5.0" description = "MkDocs plugin to programmatically generate documentation pages during the build" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2531,7 +2432,6 @@ mkdocs = ">=1.0.3" name = "mkdocs-git-revision-date-localized-plugin" version = "1.2.0" description = "Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2549,7 +2449,6 @@ pytz = "*" name = "mkdocs-jupyter" version = "0.24.2" description = "Use Jupyter in mkdocs websites" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2572,7 +2471,6 @@ test = ["coverage[toml]", "pymdown-extensions", "pytest", "pytest-cov"] name = "mkdocs-literate-nav" version = "0.6.0" description = "MkDocs plugin to specify the navigation in Markdown instead of YAML" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2587,7 +2485,6 @@ mkdocs = ">=1.0.3" name = "mkdocs-macros-plugin" version = "1.0.4" description = "Unleash the power of MkDocs with macros and variables" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2609,7 +2506,6 @@ test = ["mkdocs-include-markdown-plugin", "mkdocs-macros-test", "mkdocs-material name = "mkdocs-material" version = "9.1.21" description = "Documentation that simply works" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2632,7 +2528,6 @@ requests = ">=2.26" name = "mkdocs-material-extensions" version = "1.1.1" description = "Extension pack for Python Markdown and MkDocs Material." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2644,7 +2539,6 @@ files = [ name = "mkdocstrings" version = "0.22.0" description = "Automatic documentation from sources, for MkDocs." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2671,7 +2565,6 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] name = "mkdocstrings-python" version = "1.5.0" description = "A Python handler for mkdocstrings." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2687,7 +2580,6 @@ mkdocstrings = ">=0.20" name = "multipledispatch" version = "1.0.0" description = "Multiple dispatch" -category = "main" optional = false python-versions = "*" files = [ @@ -2699,7 +2591,6 @@ files = [ name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -2711,7 +2602,6 @@ files = [ name = "nbclient" version = "0.8.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -2721,7 +2611,7 @@ files = [ [package.dependencies] jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" nbformat = ">=5.1" traitlets = ">=5.4" @@ -2734,7 +2624,6 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= name = "nbconvert" version = "7.7.4" description = "Converting Jupyter Notebooks" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2773,7 +2662,6 @@ webpdf = ["playwright"] name = "nbformat" version = "5.9.2" description = "The Jupyter Notebook format" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2795,7 +2683,6 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] name = "nest-asyncio" version = "1.5.7" description = "Patch asyncio to allow nested event loops" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2807,7 +2694,6 @@ files = [ name = "nodeenv" version = "1.8.0" description = "Node.js virtual environment builder" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ @@ -2822,7 +2708,6 @@ setuptools = "*" name = "numpy" version = "1.25.2" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.9" files = [ @@ -2857,7 +2742,6 @@ files = [ name = "oauthlib" version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -2874,7 +2758,6 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] name = "oracledb" version = "1.4.0" description = "Python interface to Oracle Database" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -2915,7 +2798,6 @@ cryptography = ">=3.2.1" name = "oscrypto" version = "1.3.0" description = "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." -category = "main" optional = true python-versions = "*" files = [ @@ -2930,7 +2812,6 @@ asn1crypto = ">=1.5.1" name = "packaging" version = "23.1" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2942,7 +2823,6 @@ files = [ name = "pandas" version = "2.0.3" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3010,7 +2890,6 @@ xml = ["lxml (>=4.6.3)"] name = "pandocfilters" version = "1.5.0" description = "Utilities for writing pandoc filters in python" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3022,7 +2901,6 @@ files = [ name = "parso" version = "0.8.3" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3038,7 +2916,6 @@ testing = ["docopt", "pytest (<6.0.0)"] name = "parsy" version = "2.1" description = "Easy-to-use parser combinators, for parsing in pure Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3050,7 +2927,6 @@ files = [ name = "partd" version = "1.4.0" description = "Appendable key-value storage" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -3069,7 +2945,6 @@ complete = ["blosc", "numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq"] name = "pathspec" version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3081,7 +2956,6 @@ files = [ name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "dev" optional = false python-versions = "*" files = [ @@ -3096,7 +2970,6 @@ ptyprocess = ">=0.5" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" optional = false python-versions = "*" files = [ @@ -3108,7 +2981,6 @@ files = [ name = "pillow" version = "10.0.0" description = "Python Imaging Library (Fork)" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3178,7 +3050,6 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa name = "platformdirs" version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3194,7 +3065,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co name = "pluggy" version = "1.2.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3210,7 +3080,6 @@ testing = ["pytest", "pytest-benchmark"] name = "poetry-dynamic-versioning" version = "1.0.0" description = "Plugin for Poetry to enable dynamic versioning based on VCS tags" -category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -3230,7 +3099,6 @@ plugin = ["poetry (>=1.2.0,<2.0.0)"] name = "polars" version = "0.18.15" description = "Blazingly fast DataFrame library" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -3263,7 +3131,6 @@ xlsxwriter = ["xlsxwriter"] name = "pooch" version = "1.7.0" description = "\"Pooch manages your Python library's sample data files: it automatically downloads and stores them in a local directory, with support for versioning and corruption checks.\"" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3287,7 +3154,6 @@ xxhash = ["xxhash (>=1.4.3)"] name = "pprintpp" version = "0.4.0" description = "A drop-in replacement for pprint that's actually pretty" -category = "dev" optional = false python-versions = "*" files = [ @@ -3299,7 +3165,6 @@ files = [ name = "pre-commit" version = "3.3.3" description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3318,7 +3183,6 @@ virtualenv = ">=20.10.0" name = "prompt-toolkit" version = "3.0.39" description = "Library for building powerful interactive command lines in Python" -category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -3333,7 +3197,6 @@ wcwidth = "*" name = "proto-plus" version = "1.22.3" description = "Beautiful, Pythonic protocol buffers." -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -3351,7 +3214,6 @@ testing = ["google-api-core[grpc] (>=1.31.5)"] name = "protobuf" version = "4.24.1" description = "" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3374,7 +3236,6 @@ files = [ name = "psutil" version = "5.9.5" description = "Cross-platform lib for process and system monitoring in Python." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3401,7 +3262,6 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] name = "psycopg2" version = "2.9.7" description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -3422,7 +3282,6 @@ files = [ name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -3434,7 +3293,6 @@ files = [ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" -category = "dev" optional = false python-versions = "*" files = [ @@ -3449,7 +3307,6 @@ tests = ["pytest"] name = "pure-sasl" version = "0.6.2" description = "Pure Python client SASL implementation" -category = "main" optional = true python-versions = "*" files = [ @@ -3464,7 +3321,6 @@ gssapi = ["kerberos (>=1.3.0)"] name = "py-cpuinfo" version = "9.0.0" description = "Get CPU info with pure Python" -category = "dev" optional = false python-versions = "*" files = [ @@ -3476,7 +3332,6 @@ files = [ name = "py4j" version = "0.10.9.5" description = "Enables Python programs to dynamically access arbitrary Java objects" -category = "main" optional = true python-versions = "*" files = [ @@ -3488,7 +3343,6 @@ files = [ name = "pyarrow" version = "10.0.1" description = "Python library for Apache Arrow" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3526,7 +3380,6 @@ numpy = ">=1.16.6" name = "pyasn1" version = "0.5.0" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -3538,7 +3391,6 @@ files = [ name = "pyasn1-modules" version = "0.3.0" description = "A collection of ASN.1-based protocols modules" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -3553,7 +3405,6 @@ pyasn1 = ">=0.4.6,<0.6.0" name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3565,7 +3416,6 @@ files = [ name = "pycryptodomex" version = "3.18.0" description = "Cryptographic library for Python" -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -3607,7 +3457,6 @@ files = [ name = "pydata-google-auth" version = "1.8.2" description = "PyData helpers for authenticating to Google APIs" -category = "main" optional = true python-versions = "*" files = [ @@ -3624,7 +3473,6 @@ setuptools = "*" name = "pydeps" version = "1.12.13" description = "Display module dependencies" -category = "dev" optional = false python-versions = "*" files = [ @@ -3639,7 +3487,6 @@ stdlib-list = "*" name = "pydruid" version = "0.6.5" description = "A Python connector for Druid." -category = "main" optional = true python-versions = "*" files = [ @@ -3660,7 +3507,6 @@ sqlalchemy = ["sqlalchemy"] name = "pygments" version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3675,7 +3521,6 @@ plugins = ["importlib-metadata"] name = "pyinstrument" version = "4.5.1" description = "Call stack profiler for Python. Shows you why your code is slow!" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3738,7 +3583,6 @@ jupyter = ["ipython"] name = "pyjwt" version = "2.8.0" description = "JSON Web Token implementation in Python" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -3756,7 +3600,6 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] name = "pymdown-extensions" version = "10.1" description = "Extension pack for Python Markdown." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3772,7 +3615,6 @@ pyyaml = "*" name = "pymssql" version = "2.2.8" description = "DB-API interface to Microsoft SQL Server for Python. (new Cython-based version)" -category = "main" optional = true python-versions = "*" files = [ @@ -3780,9 +3622,11 @@ files = [ {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:049f2e3de919e8e02504780a21ebbf235e21ca8ed5c7538c5b6e705aa6c43d8c"}, {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd86d8e3e346e34f3f03d12e333747b53a1daa74374a727f4714d5b82ee0dd5"}, {file = "pymssql-2.2.8-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:508226a0df7cb6faeda9f8e84e85743690ca427d7b27af9a73d75fcf0c1eef6e"}, + {file = "pymssql-2.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:47859887adeaf184766b5e0bc845dd23611f3808f9521552063bb36eabc10092"}, {file = "pymssql-2.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d873e553374d5b1c57fe1c43bb75e3bcc2920678db1ef26f6bfed396c7d21b30"}, {file = "pymssql-2.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf31b8b76634c826a91f9999e15b7bfb0c051a0f53b319fd56481a67e5b903bb"}, {file = "pymssql-2.2.8-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:821945c2214fe666fd456c61e09a29a00e7719c9e136c801bffb3a254e9c579b"}, + {file = "pymssql-2.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:cc85b609b4e60eac25fa38bbac1ff854fd2c2a276e0ca4a3614c6f97efb644bb"}, {file = "pymssql-2.2.8-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:ebe7f64d5278d807f14bea08951e02512bfbc6219fd4d4f15bb45ded885cf3d4"}, {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:253af3d39fc0235627966817262d5c4c94ad09dcbea59664748063470048c29c"}, {file = "pymssql-2.2.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c9d109df536dc5f7dd851a88d285a4c9cb12a9314b621625f4f5ab1197eb312"}, @@ -3798,11 +3642,13 @@ files = [ {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3906993300650844ec140aa58772c0f5f3e9e9d5709c061334fd1551acdcf066"}, {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7309c7352e4a87c9995c3183ebfe0ff4135e955bb759109637673c61c9f0ca8d"}, {file = "pymssql-2.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9b8d603cc1ec7ae585c5a409a1d45e8da067970c79dd550d45c238ae0aa0f79f"}, + {file = "pymssql-2.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:293cb4d0339e221d877d6b19a1905082b658f0100a1e2ccc9dda10de58938901"}, {file = "pymssql-2.2.8-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:895041edd002a2e91d8a4faf0906b6fbfef29d9164bc6beb398421f5927fa40e"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b2d9c6d38a416c6f2db36ff1cd8e69f9a5387a46f9f4f612623192e0c9404b1"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d63d6f25cf40fe6a03c49be2d4d337858362b8ab944d6684c268e4990807cf0c"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c83ad3ad20951f3a94894b354fa5fa9666dcd5ebb4a635dad507c7d1dd545833"}, {file = "pymssql-2.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3933f7f082be74698eea835df51798dab9bc727d94d3d280bffc75ab9265f890"}, + {file = "pymssql-2.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:de313375b90b0f554058992f35c4a4beb3f6ec2f5912d8cd6afb649f95b03a9f"}, {file = "pymssql-2.2.8.tar.gz", hash = "sha256:9baefbfbd07d0142756e2dfcaa804154361ac5806ab9381350aad4e780c3033e"}, ] @@ -3810,7 +3656,6 @@ files = [ name = "pymysql" version = "1.1.0" description = "Pure Python MySQL Driver" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -3826,7 +3671,6 @@ rsa = ["cryptography"] name = "pyopenssl" version = "23.2.0" description = "Python wrapper module around the OpenSSL library" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -3845,7 +3689,6 @@ test = ["flaky", "pretend", "pytest (>=3.0.1)"] name = "pyproj" version = "3.6.0" description = "Python interface to PROJ (cartographic projections and coordinate transformations library)" -category = "main" optional = true python-versions = ">=3.9" files = [ @@ -3883,7 +3726,6 @@ certifi = "*" name = "pyspark" version = "3.3.3" description = "Apache Spark Python API" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -3903,7 +3745,6 @@ sql = ["pandas (>=1.0.5)", "pyarrow (>=1.0.0)"] name = "pytest" version = "7.4.0" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3926,7 +3767,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-benchmark" version = "4.0.0" description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3947,7 +3787,6 @@ histogram = ["pygal", "pygaljs"] name = "pytest-clarity" version = "1.0.1" description = "A plugin providing an alternative, colourful diff output for failing assertions." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3963,7 +3802,6 @@ rich = ">=8.0.0" name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3982,7 +3820,6 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "pytest-httpserver" version = "1.0.8" description = "pytest-httpserver is a httpserver for pytest" -category = "dev" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -3997,7 +3834,6 @@ Werkzeug = ">=2.0.0" name = "pytest-mock" version = "3.11.1" description = "Thin-wrapper around the mock package for easier use with pytest" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4015,7 +3851,6 @@ dev = ["pre-commit", "pytest-asyncio", "tox"] name = "pytest-randomly" version = "3.15.0" description = "Pytest plugin to randomly order tests and control random.seed." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4031,7 +3866,6 @@ pytest = "*" name = "pytest-repeat" version = "0.9.1" description = "pytest plugin for repeating tests" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -4046,7 +3880,6 @@ pytest = ">=3.6" name = "pytest-snapshot" version = "0.9.0" description = "A plugin for snapshot testing with pytest." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -4061,7 +3894,6 @@ pytest = ">=3.0.0" name = "pytest-xdist" version = "3.3.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4082,7 +3914,6 @@ testing = ["filelock"] name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -4097,7 +3928,6 @@ six = ">=1.5" name = "pytz" version = "2023.3" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ @@ -4109,7 +3939,6 @@ files = [ name = "pywin32" version = "306" description = "Python for Window Extensions" -category = "dev" optional = false python-versions = "*" files = [ @@ -4133,7 +3962,6 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4183,7 +4011,6 @@ files = [ name = "pyyaml-env-tag" version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -4198,7 +4025,6 @@ pyyaml = "*" name = "pyzmq" version = "25.1.1" description = "Python bindings for 0MQ" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -4304,7 +4130,6 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} name = "referencing" version = "0.30.2" description = "JSON Referencing + Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4320,7 +4145,6 @@ rpds-py = ">=0.7.0" name = "regex" version = "2023.8.8" description = "Alternative regular expression module, to replace re." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4418,7 +4242,6 @@ files = [ name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4440,7 +4263,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "requests-oauthlib" version = "1.3.1" description = "OAuthlib authentication support for Requests." -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -4459,7 +4281,6 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] name = "rich" version = "13.5.2" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -4478,7 +4299,6 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] name = "rpds-py" version = "0.9.2" description = "Python bindings to Rust's persistent data structures (rpds)" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4585,7 +4405,6 @@ files = [ name = "rsa" version = "4.9" description = "Pure-Python RSA implementation" -category = "main" optional = false python-versions = ">=3.6,<4" files = [ @@ -4600,7 +4419,6 @@ pyasn1 = ">=0.1.3" name = "ruff" version = "0.0.285" description = "An extremely fast Python linter, written in Rust." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4627,7 +4445,6 @@ files = [ name = "setuptools" version = "68.1.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4644,7 +4461,6 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( name = "shapely" version = "2.0.1" description = "Manipulation and analysis of geometric objects" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -4692,14 +4508,13 @@ files = [ numpy = ">=1.14" [package.extras] -docs = ["matplotlib", "numpydoc (>=1.1.0,<1.2.0)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] test = ["pytest", "pytest-cov"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -4711,7 +4526,6 @@ files = [ name = "smmap" version = "5.0.0" description = "A pure Python implementation of a sliding window memory map manager" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -4723,7 +4537,6 @@ files = [ name = "snowflake-connector-python" version = "3.0.4" description = "Snowflake Connector for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -4784,7 +4597,6 @@ secure-local-storage = ["keyring (!=16.1.0,<24.0.0)"] name = "snowflake-sqlalchemy" version = "1.4.7" description = "Snowflake SQLAlchemy Dialect" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -4807,7 +4619,6 @@ pandas = ["snowflake-connector-python[pandas] (<4.0.0)"] name = "sortedcontainers" version = "2.4.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "main" optional = false python-versions = "*" files = [ @@ -4819,7 +4630,6 @@ files = [ name = "soupsieve" version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4831,7 +4641,6 @@ files = [ name = "sqlalchemy" version = "1.4.49" description = "Database Abstraction Library" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -4876,7 +4685,7 @@ files = [ ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"} [package.extras] aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] @@ -4903,7 +4712,6 @@ sqlcipher = ["sqlcipher3-binary"] name = "sqlalchemy-views" version = "0.3.2" description = "Adds CreateView and DropView constructs to SQLAlchemy" -category = "main" optional = true python-versions = "*" files = [ @@ -4916,14 +4724,13 @@ sqlalchemy = ">=1.0.0" [[package]] name = "sqlglot" -version = "17.14.2" +version = "17.15.0" description = "An easily customizable SQL parser and transpiler" -category = "main" optional = false python-versions = "*" files = [ - {file = "sqlglot-17.14.2-py3-none-any.whl", hash = "sha256:d5ed37e426c6c654eb4161687b6a83f6e06e5de86551495fcdb45b32ba3afd61"}, - {file = "sqlglot-17.14.2.tar.gz", hash = "sha256:85f4eb2f193a5fd182621b54e0eb0d38acf5d12dcd8453a0243a65db03f68663"}, + {file = "sqlglot-17.15.0-py3-none-any.whl", hash = "sha256:5746097e928e024edd88ad658c0f23b21a532787a66212a4afe66ada9a79ca96"}, + {file = "sqlglot-17.15.0.tar.gz", hash = "sha256:f924f92b24a625485e86511889c3352cfc7ac8b18a15dca9ada58373d4a74b2c"}, ] [package.extras] @@ -4933,7 +4740,6 @@ dev = ["autoflake", "black", "duckdb (>=0.6)", "isort", "mypy (>=0.990)", "panda name = "stack-data" version = "0.6.2" description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" optional = false python-versions = "*" files = [ @@ -4953,7 +4759,6 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "stdlib-list" version = "0.9.0" description = "A list of Python Standard Libraries (2.7 through 3.9)." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4972,7 +4777,6 @@ test = ["coverage[toml]", "pytest", "pytest-cov"] name = "termcolor" version = "2.3.0" description = "ANSI color formatting for output in terminal" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4987,7 +4791,6 @@ tests = ["pytest", "pytest-cov"] name = "thrift" version = "0.16.0" description = "Python bindings for the Apache Thrift RPC system" -category = "main" optional = true python-versions = "*" files = [ @@ -5006,7 +4809,6 @@ twisted = ["twisted"] name = "thrift-sasl" version = "0.4.3" description = "Thrift SASL Python module that implements SASL transports for Thrift (`TSaslClientTransport`)." -category = "main" optional = true python-versions = "*" files = [ @@ -5023,7 +4825,6 @@ thrift = {version = ">=0.10.0", markers = "python_version >= \"3.0\""} name = "tinycss2" version = "1.2.1" description = "A tiny CSS parser" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -5042,7 +4843,6 @@ test = ["flake8", "isort", "pytest"] name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -5054,7 +4854,6 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5066,7 +4865,6 @@ files = [ name = "tomlkit" version = "0.12.1" description = "Style preserving TOML library" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -5078,7 +4876,6 @@ files = [ name = "toolz" version = "0.12.0" description = "List processing tools and functional utilities" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -5090,7 +4887,6 @@ files = [ name = "tornado" version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "dev" optional = false python-versions = ">= 3.8" files = [ @@ -5111,7 +4907,6 @@ files = [ name = "tqdm" version = "4.66.1" description = "Fast, Extensible Progress Meter" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5132,7 +4927,6 @@ telegram = ["requests"] name = "traitlets" version = "5.9.0" description = "Traitlets Python configuration system" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -5148,7 +4942,6 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] name = "trino" version = "0.326.0" description = "Client for the Trino distributed SQL Engine" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -5174,7 +4967,6 @@ tests = ["black", "httpretty (<1.1)", "isort", "pre-commit", "pytest", "pytest-r name = "typing-extensions" version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5186,7 +4978,6 @@ files = [ name = "tzdata" version = "2023.3" description = "Provider of IANA time zone data" -category = "main" optional = false python-versions = ">=2" files = [ @@ -5198,7 +4989,6 @@ files = [ name = "tzlocal" version = "5.0.1" description = "tzinfo object for the local timezone" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -5216,7 +5006,6 @@ devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pyte name = "urllib3" version = "1.26.16" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -5233,7 +5022,6 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] name = "virtualenv" version = "20.24.3" description = "Virtual Python Environment builder" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -5254,7 +5042,6 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess name = "watchdog" version = "3.0.0" description = "Filesystem events monitoring" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -5294,7 +5081,6 @@ watchmedo = ["PyYAML (>=3.10)"] name = "wcwidth" version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -5306,7 +5092,6 @@ files = [ name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "dev" optional = false python-versions = "*" files = [ @@ -5318,7 +5103,6 @@ files = [ name = "werkzeug" version = "2.3.7" description = "The comprehensive WSGI web application library." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -5336,7 +5120,6 @@ watchdog = ["watchdog (>=2.3)"] name = "xxhash" version = "3.3.0" description = "Python binding for xxHash" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5431,7 +5214,6 @@ files = [ name = "zipp" version = "3.16.2" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -5447,7 +5229,6 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p name = "zstandard" version = "0.21.0" description = "Zstandard bindings for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -5503,7 +5284,7 @@ cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\ cffi = ["cffi (>=1.11)"] [extras] -all = ["black", "clickhouse-connect", "dask", "datafusion", "db-dtypes", "duckdb", "duckdb-engine", "deltalake", "fsspec", "GeoAlchemy2", "geopandas", "google-cloud-bigquery", "google-cloud-bigquery-storage", "graphviz", "impyla", "oracledb", "packaging", "polars", "psycopg2", "pydata-google-auth", "pydruid", "pymssql", "pymysql", "pyspark", "regex", "requests", "shapely", "snowflake-connector-python", "snowflake-sqlalchemy", "sqlalchemy", "sqlalchemy-views", "trino"] +all = ["GeoAlchemy2", "black", "clickhouse-connect", "dask", "datafusion", "db-dtypes", "deltalake", "duckdb", "duckdb-engine", "fsspec", "geopandas", "google-cloud-bigquery", "google-cloud-bigquery-storage", "graphviz", "impyla", "oracledb", "packaging", "polars", "psycopg2", "pydata-google-auth", "pydruid", "pymssql", "pymysql", "pyspark", "regex", "requests", "shapely", "snowflake-connector-python", "snowflake-sqlalchemy", "sqlalchemy", "sqlalchemy-views", "trino"] bigquery = ["db-dtypes", "google-cloud-bigquery", "google-cloud-bigquery-storage", "pydata-google-auth"] clickhouse = ["clickhouse-connect", "sqlalchemy"] dask = ["dask", "regex"] @@ -5515,19 +5296,19 @@ duckdb = ["duckdb", "duckdb-engine", "packaging", "sqlalchemy", "sqlalchemy-view flink = [] geospatial = ["GeoAlchemy2", "geopandas", "shapely"] impala = ["fsspec", "impyla", "requests", "sqlalchemy"] -mssql = ["sqlalchemy", "pymssql", "sqlalchemy-views"] -mysql = ["sqlalchemy", "pymysql", "sqlalchemy-views"] -oracle = ["sqlalchemy", "oracledb", "packaging", "sqlalchemy-views"] +mssql = ["pymssql", "sqlalchemy", "sqlalchemy-views"] +mysql = ["pymysql", "sqlalchemy", "sqlalchemy-views"] +oracle = ["oracledb", "packaging", "sqlalchemy", "sqlalchemy-views"] pandas = ["regex"] polars = ["polars"] postgres = ["psycopg2", "sqlalchemy", "sqlalchemy-views"] pyspark = ["pyspark", "sqlalchemy"] snowflake = ["snowflake-connector-python", "snowflake-sqlalchemy", "sqlalchemy-views"] sqlite = ["regex", "sqlalchemy", "sqlalchemy-views"] -trino = ["trino", "sqlalchemy", "sqlalchemy-views"] +trino = ["sqlalchemy", "sqlalchemy-views", "trino"] visualization = ["graphviz"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "20bf8a382abd046450418addfdc5eda4a475e10aa8c7b606a7fca3251737c95a" +content-hash = "781963b26250ab8f12a2dae2ef51a2bdba2e33bb4b43bd9fac55410d6f7902ad" diff --git a/pyproject.toml b/pyproject.toml index 503cafa3a505a..bf01e9fc38ac2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,7 @@ pyarrow = ">=2,<13" python-dateutil = ">=2.8.2,<3" pytz = ">=2022.7" rich = ">=12.4.4,<14" -sqlglot = ">=17.12.0,<18" +sqlglot = ">=17.15.0,<18" toolz = ">=0.11,<1" typing-extensions = ">=4.3.0,<5" black = { version = ">=22.1.0,<24", optional = true } diff --git a/requirements-dev.txt b/requirements-dev.txt index 6226b9bf20335..be94d2704a043 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,4 +1,4 @@ -appnope==0.1.3 ; python_version >= "3.9" and python_version < "4.0" and sys_platform == "darwin" or python_version >= "3.9" and python_version < "4.0" and platform_system == "Darwin" +appnope==0.1.3 ; python_version >= "3.9" and python_version < "4.0" and (sys_platform == "darwin" or platform_system == "Darwin") asn1crypto==1.5.1 ; python_version >= "3.9" and python_version < "4.0" asttokens==2.2.1 ; python_version >= "3.9" and python_version < "4.0" atpublic==4.0 ; python_version >= "3.9" and python_version < "4.0" @@ -62,12 +62,12 @@ google-cloud-core==2.3.3 ; python_version >= "3.9" and python_version < "4.0" google-cloud-storage==2.10.0 ; python_version >= "3.9" and python_version < "4.0" google-crc32c==1.5.0 ; python_version >= "3.9" and python_version < "4.0" google-resumable-media==2.5.0 ; python_version >= "3.9" and python_version < "4.0" -googleapis-common-protos==1.60.0 ; python_version < "4.0" and python_version >= "3.9" +googleapis-common-protos==1.60.0 ; python_version >= "3.9" and python_version < "4.0" graphviz==0.20.1 ; python_version >= "3.9" and python_version < "4.0" -greenlet==2.0.2 ; python_version >= "3.9" and (platform_machine == "aarch64" or platform_machine == "ppc64le" or platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "AMD64" or platform_machine == "win32" or platform_machine == "WIN32") and python_version < "4.0" +greenlet==2.0.2 ; python_version >= "3.9" and (platform_machine == "win32" or platform_machine == "WIN32" or platform_machine == "AMD64" or platform_machine == "amd64" or platform_machine == "x86_64" or platform_machine == "ppc64le" or platform_machine == "aarch64") and python_version < "4.0" griffe==0.34.0 ; python_version >= "3.9" and python_version < "4.0" -grpcio-status==1.57.0 ; python_version < "4.0" and python_version >= "3.9" -grpcio==1.57.0 ; python_version < "4.0" and python_version >= "3.9" +grpcio-status==1.57.0 ; python_version >= "3.9" and python_version < "4.0" +grpcio==1.57.0 ; python_version >= "3.9" and python_version < "4.0" hypothesis==6.82.6 ; python_version >= "3.9" and python_version < "4.0" identify==2.5.26 ; python_version >= "3.9" and python_version < "4.0" idna==3.4 ; python_version >= "3.9" and python_version < "4.0" @@ -113,7 +113,7 @@ nbconvert==7.7.4 ; python_version >= "3.9" and python_version < "4.0" nbformat==5.9.2 ; python_version >= "3.9" and python_version < "4.0" nest-asyncio==1.5.7 ; python_version >= "3.9" and python_version < "4.0" nodeenv==1.8.0 ; python_version >= "3.9" and python_version < "4.0" -numpy==1.25.2 ; python_version < "4.0" and python_version >= "3.9" +numpy==1.25.2 ; python_version >= "3.9" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.9" and python_version < "4.0" oracledb==1.4.0 ; python_version >= "3.9" and python_version < "4.0" oscrypto==1.3.0 ; python_version >= "3.9" and python_version < "4.0" @@ -135,8 +135,8 @@ pooch[progress,xxhash]==1.7.0 ; python_version >= "3.9" and python_version < "4. pprintpp==0.4.0 ; python_version >= "3.9" and python_version < "4.0" pre-commit==3.3.3 ; python_version >= "3.9" and python_version < "4.0" prompt-toolkit==3.0.39 ; python_version >= "3.9" and python_version < "4.0" -proto-plus==1.22.3 ; python_version < "4.0" and python_version >= "3.9" -protobuf==4.24.1 ; python_version < "4.0" and python_version >= "3.9" +proto-plus==1.22.3 ; python_version >= "3.9" and python_version < "4.0" +protobuf==4.24.1 ; python_version >= "3.9" and python_version < "4.0" psutil==5.9.5 ; python_version >= "3.9" and python_version < "4.0" psycopg2==2.9.7 ; python_version >= "3.9" and python_version < "4.0" ptyprocess==0.7.0 ; python_version >= "3.9" and python_version < "4.0" and sys_platform != "win32" @@ -196,7 +196,7 @@ sortedcontainers==2.4.0 ; python_version >= "3.9" and python_version < "4.0" soupsieve==2.4.1 ; python_version >= "3.9" and python_version < "4.0" sqlalchemy-views==0.3.2 ; python_version >= "3.9" and python_version < "4.0" sqlalchemy==1.4.49 ; python_version >= "3.9" and python_version < "4.0" -sqlglot==17.14.2 ; python_version >= "3.9" and python_version < "4.0" +sqlglot==17.15.0 ; python_version >= "3.9" and python_version < "4.0" stack-data==0.6.2 ; python_version >= "3.9" and python_version < "4.0" stdlib-list==0.9.0 ; python_version >= "3.9" and python_version < "4.0" termcolor==2.3.0 ; python_version >= "3.9" and python_version < "4.0" @@ -204,7 +204,7 @@ thrift-sasl==0.4.3 ; python_version >= "3.9" and python_version < "4.0" thrift==0.16.0 ; python_version >= "3.9" and python_version < "4.0" tinycss2==1.2.1 ; python_version >= "3.9" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.9" and python_version < "4.0" -tomli==2.0.1 ; python_version >= "3.9" and python_full_version <= "3.11.0a6" +tomli==2.0.1 ; python_version >= "3.9" and python_version < "3.11" tomlkit==0.12.1 ; python_version >= "3.9" and python_version < "4.0" toolz==0.12.0 ; python_version >= "3.9" and python_version < "4.0" tornado==6.3.3 ; python_version >= "3.9" and python_version < "4.0"