dbt-adapters 1.1.0rc2__py3-none-any.whl → 1.2.1__py3-none-any.whl

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 dbt-adapters might be problematic. Click here for more details.

dbt/adapters/__about__.py CHANGED
@@ -1 +1 @@
1
- version = "1.1.0rc2"
1
+ version = "1.2.1"
@@ -170,7 +170,7 @@ class Credentials(ExtensibleDbtClassMixin, Replaceable, metaclass=abc.ABCMeta):
170
170
  def translate_aliases(cls, kwargs: Dict[str, Any], recurse: bool = False) -> Dict[str, Any]:
171
171
  return translate_aliases(kwargs, cls._ALIASES, recurse)
172
172
 
173
- def __post_serialize__(self, dct):
173
+ def __post_serialize__(self, dct: Dict, context: Optional[Dict] = None):
174
174
  # no super() -- do we need it?
175
175
  if self._ALIASES:
176
176
  dct.update(
@@ -18,8 +18,9 @@ class RelationType(StrEnum):
18
18
  View = "view"
19
19
  CTE = "cte"
20
20
  MaterializedView = "materialized_view"
21
- External = "external"
22
21
  Ephemeral = "ephemeral"
22
+ # this is a "catch all" that is better than `None` == external to anything dbt is aware of
23
+ External = "external"
23
24
 
24
25
 
25
26
  class MaterializationContract(Protocol):
dbt/adapters/record.py ADDED
@@ -0,0 +1,67 @@
1
+ import dataclasses
2
+ from io import StringIO
3
+ import json
4
+ import re
5
+ from typing import Any, Optional, Mapping
6
+
7
+ from agate import Table
8
+
9
+ from dbt_common.events.contextvars import get_node_info
10
+ from dbt_common.record import Record, Recorder
11
+
12
+ from dbt.adapters.contracts.connection import AdapterResponse
13
+
14
+
15
+ @dataclasses.dataclass
16
+ class QueryRecordParams:
17
+ sql: str
18
+ auto_begin: bool = False
19
+ fetch: bool = False
20
+ limit: Optional[int] = None
21
+ node_unique_id: Optional[str] = None
22
+
23
+ def __post_init__(self) -> None:
24
+ if self.node_unique_id is None:
25
+ node_info = get_node_info()
26
+ self.node_unique_id = node_info["unique_id"] if node_info else ""
27
+
28
+ @staticmethod
29
+ def _clean_up_sql(sql: str) -> str:
30
+ sql = re.sub(r"--.*?\n", "", sql) # Remove single-line comments (--)
31
+ sql = re.sub(r"/\*.*?\*/", "", sql, flags=re.DOTALL) # Remove multi-line comments (/* */)
32
+ return sql.replace(" ", "").replace("\n", "")
33
+
34
+ def _matches(self, other: "QueryRecordParams") -> bool:
35
+ return self.node_unique_id == other.node_unique_id and self._clean_up_sql(
36
+ self.sql
37
+ ) == self._clean_up_sql(other.sql)
38
+
39
+
40
+ @dataclasses.dataclass
41
+ class QueryRecordResult:
42
+ adapter_response: Optional["AdapterResponse"]
43
+ table: Optional[Table]
44
+
45
+ def _to_dict(self) -> Any:
46
+ buf = StringIO()
47
+ self.table.to_json(buf) # type: ignore
48
+
49
+ return {
50
+ "adapter_response": self.adapter_response.to_dict(), # type: ignore
51
+ "table": buf.getvalue(),
52
+ }
53
+
54
+ @classmethod
55
+ def _from_dict(cls, dct: Mapping) -> "QueryRecordResult":
56
+ return QueryRecordResult(
57
+ adapter_response=AdapterResponse.from_dict(dct["adapter_response"]),
58
+ table=Table.from_object(json.loads(dct["table"])),
59
+ )
60
+
61
+
62
+ class QueryRecord(Record):
63
+ params_cls = QueryRecordParams
64
+ result_cls = QueryRecordResult
65
+
66
+
67
+ Recorder.register_record_type(QueryRecord)
@@ -1,10 +1,11 @@
1
1
  import abc
2
2
  import time
3
- from typing import Any, Dict, Iterable, List, Optional, Tuple, TYPE_CHECKING
3
+ from typing import Any, Dict, Iterable, Iterator, List, Optional, Tuple, TYPE_CHECKING
4
4
 
5
5
  from dbt_common.events.contextvars import get_node_info
6
6
  from dbt_common.events.functions import fire_event
7
7
  from dbt_common.exceptions import DbtInternalError, NotImplementedError
8
+ from dbt_common.record import record_function
8
9
  from dbt_common.utils import cast_to_str
9
10
 
10
11
  from dbt.adapters.base import BaseConnectionManager
@@ -19,6 +20,7 @@ from dbt.adapters.events.types import (
19
20
  SQLQuery,
20
21
  SQLQueryStatus,
21
22
  )
23
+ from dbt.adapters.record import QueryRecord
22
24
 
23
25
  if TYPE_CHECKING:
24
26
  import agate
@@ -110,27 +112,24 @@ class SQLConnectionManager(BaseConnectionManager):
110
112
  @classmethod
111
113
  def process_results(
112
114
  cls, column_names: Iterable[str], rows: Iterable[Any]
113
- ) -> List[Dict[str, Any]]:
114
- # TODO CT-211
115
+ ) -> Iterator[Dict[str, Any]]:
115
116
  unique_col_names = dict() # type: ignore[var-annotated]
116
- # TODO CT-211
117
117
  for idx in range(len(column_names)): # type: ignore[arg-type]
118
- # TODO CT-211
119
118
  col_name = column_names[idx] # type: ignore[index]
120
119
  if col_name in unique_col_names:
121
120
  unique_col_names[col_name] += 1
122
- # TODO CT-211
123
121
  column_names[idx] = f"{col_name}_{unique_col_names[col_name]}" # type: ignore[index] # noqa
124
122
  else:
125
- # TODO CT-211
126
123
  unique_col_names[column_names[idx]] = 1 # type: ignore[index]
127
- return [dict(zip(column_names, row)) for row in rows]
124
+
125
+ for row in rows:
126
+ yield dict(zip(column_names, row))
128
127
 
129
128
  @classmethod
130
129
  def get_result_from_cursor(cls, cursor: Any, limit: Optional[int]) -> "agate.Table":
131
130
  from dbt_common.clients.agate_helper import table_from_data_flat
132
131
 
133
- data: List[Any] = []
132
+ data: Iterable[Any] = []
134
133
  column_names: List[str] = []
135
134
 
136
135
  if cursor.description is not None:
@@ -143,6 +142,7 @@ class SQLConnectionManager(BaseConnectionManager):
143
142
 
144
143
  return table_from_data_flat(data, column_names)
145
144
 
145
+ @record_function(QueryRecord, method=True, tuple_result=True)
146
146
  def execute(
147
147
  self,
148
148
  sql: str,
@@ -15,7 +15,7 @@
15
15
  {%- endif -%}
16
16
 
17
17
  {%- if not column_name_to_data_types -%}
18
- {{ exceptions.raise_compiler_error("Not able to get columns for unit test '" ~ model.name ~ "' from relation " ~ this) }}
18
+ {{ exceptions.raise_compiler_error("Not able to get columns for unit test '" ~ model.name ~ "' from relation " ~ this ~ " because the relation doesn't exist") }}
19
19
  {%- endif -%}
20
20
 
21
21
  {%- for column_name, column_type in column_name_to_data_types.items() -%}
@@ -0,0 +1,10 @@
1
+ {% macro date(year, month, day) %}
2
+ {{ return(adapter.dispatch('date', 'dbt') (year, month, day)) }}
3
+ {% endmacro %}
4
+
5
+
6
+ {% macro default__date(year, month, day) -%}
7
+ {%- set dt = modules.datetime.date(year, month, day) -%}
8
+ {%- set iso_8601_formatted_date = dt.strftime('%Y-%m-%d') -%}
9
+ to_date('{{ iso_8601_formatted_date }}', 'YYYY-MM-DD')
10
+ {%- endmacro %}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: dbt-adapters
3
- Version: 1.1.0rc2
3
+ Version: 1.2.1
4
4
  Summary: The set of adapter protocols and base functionality that supports integration with dbt-core
5
5
  Project-URL: Homepage, https://github.com/dbt-labs/dbt-adapters
6
6
  Project-URL: Documentation, https://docs.getdbt.com
@@ -1,11 +1,12 @@
1
1
  dbt/__init__.py,sha256=iY4jdvOxcDhkdr5FiyOTZPHadKtMZDQ-qC6Fw6_EHPM,277
2
- dbt/adapters/__about__.py,sha256=5kPp6baaEWzig1nonDf4dAC4T2ev_oNdhotf2H4u22E,21
2
+ dbt/adapters/__about__.py,sha256=RjiTXTvJgmB6M0imNoezYX9UmH6oTcPy1dcXfHkyvVk,18
3
3
  dbt/adapters/__init__.py,sha256=3noHsg-64qI0_Pw6OR9F7l1vU2_qrJvinq8POTtuaZM,252
4
4
  dbt/adapters/cache.py,sha256=WGy4ewnz-J13LverTACBW2iFhGswrWLgm-wiBrQnMzo,20084
5
5
  dbt/adapters/capability.py,sha256=mIAZwwKetWpG71pg9oofwOeOTTrDYrtKoWwhbtVQOmE,2160
6
6
  dbt/adapters/factory.py,sha256=JxNxhMqemZ6ARWbROQZhkhJehiIenuR9ZQYS8gvzbDg,9368
7
7
  dbt/adapters/protocol.py,sha256=qRsEFAKjUMVnoBspAiCUTICez1ckson-dFS04dTXSco,3818
8
8
  dbt/adapters/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ dbt/adapters/record.py,sha256=D7fa0wh2QSM4Xp3uhiM6fpsLN6F0mIQHwDaT7D22pfo,1972
9
10
  dbt/adapters/reference_keys.py,sha256=lRN3gPdQD6Qciy-BAGx_rz3CFlbS7zMSZ43pZ_9ondE,1046
10
11
  dbt/adapters/utils.py,sha256=OtakbxPgxwrxN5Yd2vAO-cvLETSgzBwMWebhgegAVyA,2414
11
12
  dbt/adapters/base/README.md,sha256=muHQntC07Lh6L1XfVgwKhV5RltOPBLYPdQqd8_7l34c,516
@@ -20,9 +21,9 @@ dbt/adapters/base/relation.py,sha256=r6phmxz4Uu3JG3Kxh_GUstA1NyBaiAA57u3yKTKSv80
20
21
  dbt/adapters/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
22
  dbt/adapters/clients/jinja.py,sha256=NsZOiBpOLunS46hRL5OcX1MpY3Ih6_87Vgz4qd_PNbc,768
22
23
  dbt/adapters/contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- dbt/adapters/contracts/connection.py,sha256=F1Lw75trgYUX_FZOYzYguJgOzO8TPT4qnwP3gzm2aeY,6860
24
+ dbt/adapters/contracts/connection.py,sha256=nkqIRpJqO0sB2aMrJ_hTPPQOe-jL3se__ppAoCNYiOA,6898
24
25
  dbt/adapters/contracts/macros.py,sha256=NYVDi5ww7v4ksKBwF836TXE-2xU4IBaUINqvxMY-ieU,366
25
- dbt/adapters/contracts/relation.py,sha256=EHRHUfI50YpTiw2P4ZsQXp9aVtzdIcnlCC5Px--ytio,4636
26
+ dbt/adapters/contracts/relation.py,sha256=H_IYxRtg9LV8kYAfAiWeQAf-2ByMRN-EkfxHim-7AJE,4731
26
27
  dbt/adapters/events/README.md,sha256=kVUFIsDQrHTUmk9Mmu-yXYkWh4pA5MJK_H6739rQr5I,3521
27
28
  dbt/adapters/events/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
29
  dbt/adapters/events/adapter_types.proto,sha256=wFhPMVokFgU1KFyc4h4OKzX1I0I_d2AVBcXdpS0KoW4,9648
@@ -42,7 +43,7 @@ dbt/adapters/relation_configs/config_base.py,sha256=IK9oKf9TuOTLIiKX8ms_X-p4yxZv
42
43
  dbt/adapters/relation_configs/config_change.py,sha256=hf6fDWbZpKvZdM6z-OtY-GveipzfLRR_dsUZmYmXkdk,713
43
44
  dbt/adapters/relation_configs/config_validation.py,sha256=wlJUMwOEPhYFch-LRtEWfLNJMq8jL1tRhOUHmNX8nFw,1978
44
45
  dbt/adapters/sql/__init__.py,sha256=WLWZJfqc8pr1N1BMVe9gM-KQ4URJIeKfLqTuJBD1VN0,107
45
- dbt/adapters/sql/connections.py,sha256=aRZGkiMYwfuA7hR08LOVDzDLbBQP05KUVIHOCuU0KOU,6565
46
+ dbt/adapters/sql/connections.py,sha256=MfeQw0YH3k8nu4wdkeMRukav1o0nPiEL3uifkbspRf4,6620
46
47
  dbt/adapters/sql/impl.py,sha256=DNhNcv7kMrPYn2ZviRbj23z77_SUFBbqd4HYmRJ7tGk,10722
47
48
  dbt/include/__init__.py,sha256=qEFeq3yuf3lQKVseALmL8aPM8fpCS54B_5pry00M3hk,76
48
49
  dbt/include/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -118,7 +119,7 @@ dbt/include/global_project/macros/relations/view/create.sql,sha256=FkLYXnCPj2HLC
118
119
  dbt/include/global_project/macros/relations/view/drop.sql,sha256=WszUTZrkd93_OCEha4OuRWyCucqxGRTm07Zvn25RHXs,488
119
120
  dbt/include/global_project/macros/relations/view/rename.sql,sha256=P4hpxlrR0wiBTZFJ8N3GyUUbqgKgMfgzUUbIWw8fui0,348
120
121
  dbt/include/global_project/macros/relations/view/replace.sql,sha256=5_Lky7KUixyYOOOahooD0VnmHOiOVqmxrI0ihwRjX08,2584
121
- dbt/include/global_project/macros/unit_test_sql/get_fixture_sql.sql,sha256=gv5obF7n-mKrzBHu5kCBNVfSlKbfuTqkIPl-vzUEVFs,3833
122
+ dbt/include/global_project/macros/unit_test_sql/get_fixture_sql.sql,sha256=lV-dTZmQQSl3YePl3fWqUF1Ntw5bYEzuNtJFby1JrMc,3873
122
123
  dbt/include/global_project/macros/utils/any_value.sql,sha256=leK-fCUhDNt6MFkGofafYjv-0LtL0fkb3sJXe-aIorU,213
123
124
  dbt/include/global_project/macros/utils/array_append.sql,sha256=XsC-kchlWxVwc-_1CoBs1RkGYt8qsOAVbq5JlsV2WIc,357
124
125
  dbt/include/global_project/macros/utils/array_concat.sql,sha256=0c4w5kP1N_9BY-wppx1OBCCIDOsC1HhimkSDghjjx2Y,248
@@ -128,6 +129,7 @@ dbt/include/global_project/macros/utils/cast.sql,sha256=YQRXZEIvrXDDs4sqvFCJk7a9
128
129
  dbt/include/global_project/macros/utils/cast_bool_to_text.sql,sha256=fOIW7AM7_BJIHU5GnhwMYGghh8mvkc27_sqdW0rdszQ,242
129
130
  dbt/include/global_project/macros/utils/concat.sql,sha256=qHrVhra5QSwBskYYCpaeJvsCAIFZ_eyeF4h3kgjs8B0,186
130
131
  dbt/include/global_project/macros/utils/data_types.sql,sha256=Rw6xhK02NB9TlKolqyGcUGoWgHBkKPpJ1Xh3FOBxrMc,4416
132
+ dbt/include/global_project/macros/utils/date.sql,sha256=-QVwNPMsxN_OJZ5h4YUxoBP_gZLxEIKHR5zkstPvhXI,366
131
133
  dbt/include/global_project/macros/utils/date_spine.sql,sha256=to62irsceR0IjA452TfUq0LgKJd6zEheA7pi-xlThr4,1707
132
134
  dbt/include/global_project/macros/utils/date_trunc.sql,sha256=N7eDEgKVq6BQ9qUeIMJ_yKQv5QTjIWZ6k2oMWeGlqQU,234
133
135
  dbt/include/global_project/macros/utils/dateadd.sql,sha256=-t0IDuV01WOMNsuPjyBp9D-2uvJAdhgi3kE8JIL9Jhc,374
@@ -147,7 +149,7 @@ dbt/include/global_project/macros/utils/right.sql,sha256=EwNG98CAFIwNDmarwopf7Rk
147
149
  dbt/include/global_project/macros/utils/safe_cast.sql,sha256=1mswwkDACmIi1I99JKb_-vq3kjMe4HhMRV70mW8Bt4Y,298
148
150
  dbt/include/global_project/macros/utils/split_part.sql,sha256=fXEIS0oIiYR7-4lYbb0QbZdG-q2TpV63AFd1ky4I5UM,714
149
151
  dbt/include/global_project/tests/generic/builtin.sql,sha256=p94xdyPwb2TlxgLBqCfrcRfJ1QNgsjPvBm8f0Q5eqZM,1022
150
- dbt_adapters-1.1.0rc2.dist-info/METADATA,sha256=IFsfThrVTaR0NB9FJ7Zaz4prC9NOihbJA4vycVOl_Qg,2536
151
- dbt_adapters-1.1.0rc2.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
152
- dbt_adapters-1.1.0rc2.dist-info/licenses/LICENSE,sha256=9yjigiJhWcCZvQjdagGKDwrRph58QWc5P2bVSQwXo6s,11344
153
- dbt_adapters-1.1.0rc2.dist-info/RECORD,,
152
+ dbt_adapters-1.2.1.dist-info/METADATA,sha256=zqZCobQ7YgeSwWfLnFvgSFfy3pax1-rQ6RRbPikI6F8,2533
153
+ dbt_adapters-1.2.1.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
154
+ dbt_adapters-1.2.1.dist-info/licenses/LICENSE,sha256=9yjigiJhWcCZvQjdagGKDwrRph58QWc5P2bVSQwXo6s,11344
155
+ dbt_adapters-1.2.1.dist-info/RECORD,,