dbt-common 1.29.0__tar.gz → 1.31.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. {dbt_common-1.29.0 → dbt_common-1.31.0}/CHANGELOG.md +28 -1
  2. {dbt_common-1.29.0 → dbt_common-1.31.0}/PKG-INFO +1 -1
  3. dbt_common-1.31.0/dbt_common/__about__.py +1 -0
  4. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/clients/system.py +3 -0
  5. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/invocation.py +3 -3
  6. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/record.py +43 -16
  7. dbt_common-1.29.0/dbt_common/__about__.py +0 -1
  8. {dbt_common-1.29.0 → dbt_common-1.31.0}/.gitignore +0 -0
  9. {dbt_common-1.29.0 → dbt_common-1.31.0}/LICENSE +0 -0
  10. {dbt_common-1.29.0 → dbt_common-1.31.0}/README.md +0 -0
  11. {dbt_common-1.29.0 → dbt_common-1.31.0}/codecov.yml +0 -0
  12. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/__init__.py +0 -0
  13. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/behavior_flags.py +0 -0
  14. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/clients/__init__.py +0 -0
  15. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/clients/_jinja_blocks.py +0 -0
  16. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/clients/agate_helper.py +0 -0
  17. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/clients/jinja.py +0 -0
  18. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/constants.py +0 -0
  19. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/context.py +0 -0
  20. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/contracts/__init__.py +0 -0
  21. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/contracts/config/__init__.py +0 -0
  22. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/contracts/config/base.py +0 -0
  23. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/contracts/config/materialization.py +0 -0
  24. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/contracts/config/metadata.py +0 -0
  25. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/contracts/config/properties.py +0 -0
  26. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/contracts/constraints.py +0 -0
  27. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/contracts/metadata.py +0 -0
  28. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/contracts/util.py +0 -0
  29. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/dataclass_schema.py +0 -0
  30. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/events/README.md +0 -0
  31. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/events/__init__.py +0 -0
  32. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/events/base_types.py +0 -0
  33. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/events/contextvars.py +0 -0
  34. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/events/event_handler.py +0 -0
  35. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/events/event_manager.py +0 -0
  36. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/events/event_manager_client.py +0 -0
  37. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/events/format.py +0 -0
  38. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/events/functions.py +0 -0
  39. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/events/helpers.py +0 -0
  40. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/events/interfaces.py +0 -0
  41. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/events/logger.py +0 -0
  42. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/events/types.py +0 -0
  43. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/events/types_pb2.py +0 -0
  44. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/exceptions/__init__.py +0 -0
  45. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/exceptions/base.py +0 -0
  46. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/exceptions/cache.py +0 -0
  47. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/exceptions/connection.py +0 -0
  48. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/exceptions/contracts.py +0 -0
  49. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/exceptions/events.py +0 -0
  50. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/exceptions/jinja.py +0 -0
  51. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/exceptions/macros.py +0 -0
  52. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/exceptions/system.py +0 -0
  53. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/helper_types.py +0 -0
  54. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/py.typed +0 -0
  55. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/semver.py +0 -0
  56. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/tests.py +0 -0
  57. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/ui.py +0 -0
  58. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/utils/__init__.py +0 -0
  59. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/utils/casting.py +0 -0
  60. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/utils/connection.py +0 -0
  61. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/utils/dict.py +0 -0
  62. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/utils/encoding.py +0 -0
  63. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/utils/executor.py +0 -0
  64. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/utils/formatting.py +0 -0
  65. {dbt_common-1.29.0 → dbt_common-1.31.0}/dbt_common/utils/jinja.py +0 -0
  66. {dbt_common-1.29.0 → dbt_common-1.31.0}/docs/README.md +0 -0
  67. {dbt_common-1.29.0 → dbt_common-1.31.0}/docs/arch/adr-0001-build-tooling.md +0 -0
  68. {dbt_common-1.29.0 → dbt_common-1.31.0}/docs/guides/record_replay.md +0 -0
  69. {dbt_common-1.29.0 → dbt_common-1.31.0}/pyproject.toml +0 -0
  70. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/agate/__init__.pyi +0 -0
  71. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/agate/data_types.pyi +0 -0
  72. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/colorama/__init__.pyi +0 -0
  73. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/isodate/__init__.pyi +0 -0
  74. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/__init__.pyi +0 -0
  75. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/config.pyi +0 -0
  76. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/core/__init__.pyi +0 -0
  77. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/core/const.pyi +0 -0
  78. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/core/helpers.pyi +0 -0
  79. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/core/meta/__init__.pyi +0 -0
  80. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/core/meta/code/__init__.pyi +0 -0
  81. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/core/meta/code/builder.pyi +0 -0
  82. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/core/meta/code/lines.pyi +0 -0
  83. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/core/meta/helpers.pyi +0 -0
  84. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/core/meta/mixin.pyi +0 -0
  85. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/core/meta/types/__init__.pyi +0 -0
  86. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/core/meta/types/common.pyi +0 -0
  87. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/core/meta/types/pack.pyi +0 -0
  88. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/core/meta/types/unpack.pyi +0 -0
  89. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/dialect.pyi +0 -0
  90. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/exceptions.pyi +0 -0
  91. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/helper.pyi +0 -0
  92. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/jsonschema/__init__.pyi +0 -0
  93. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/jsonschema/annotations.pyi +0 -0
  94. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/jsonschema/builder.pyi +0 -0
  95. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/jsonschema/dialects.pyi +0 -0
  96. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/jsonschema/models.pyi +0 -0
  97. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/jsonschema/schema.pyi +0 -0
  98. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/mixins/__init__.pyi +0 -0
  99. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/mixins/dict.pyi +0 -0
  100. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/mixins/json.pyi +0 -0
  101. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/mixins/msgpack.pyi +0 -0
  102. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/mixins/orjson.pyi +0 -0
  103. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/mixins/toml.pyi +0 -0
  104. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/mixins/yaml.pyi +0 -0
  105. {dbt_common-1.29.0 → dbt_common-1.31.0}/third-party-stubs/mashumaro/types.pyi +0 -0
@@ -5,6 +5,34 @@
5
5
  - "Breaking changes" listed under a version may require action from end users or external maintainers when upgrading to that version.
6
6
  - Do not edit this file directly. This file is auto-generated using [changie](https://github.com/miniscruff/changie). For details on how to document a change, see [the contributing guide](https://github.com/dbt-labs/dbt-common/blob/main/CONTRIBUTING.md#adding-changelog-entry)
7
7
 
8
+ ## dbt-common 1.31.0 - September 17, 2025
9
+
10
+ ### Fixes
11
+
12
+ - Replace deprecated datetime.datetime.utcnow() for datetime.now(timezone.utc).replace(tzinfo=None) to reduce stdout spam. ([#301](https://github.com/dbt-labs/dbt-common/issues/301))
13
+
14
+ ### Under the Hood
15
+
16
+ - Safer Param class instantiation for auto-recorded methods with overrides ([#313](https://github.com/dbt-labs/dbt-common/issues/313))
17
+
18
+ ### Contributors
19
+ - [@axellpadilla](https://github.com/axellpadilla) ([#301](https://github.com/dbt-labs/dbt-common/issues/301))
20
+ - [@edgarrmondragon](https://github.com/edgarrmondragon) ([#301](https://github.com/dbt-labs/dbt-common/issues/301))
21
+
22
+
23
+ ## dbt-common 1.30.0 - September 11, 2025
24
+
25
+ ### Fixes
26
+
27
+ - Fix edge-case in system.rename that deleted source before moving cuasing FileNotFoundError ([#307](https://github.com/dbt-labs/dbt-common/issues/307))
28
+
29
+ ### Under the Hood
30
+
31
+ - Lock recordings.json during streamed recording ([#312](https://github.com/dbt-labs/dbt-common/issues/312))
32
+
33
+ ### Contributors
34
+ - [@ahaugerud](https://github.com/ahaugerud) ([#307](https://github.com/dbt-labs/dbt-common/issues/307))
35
+
8
36
  ## dbt-common 1.29.0 - September 04, 2025
9
37
 
10
38
  ### Security
@@ -14,7 +42,6 @@
14
42
  ### Contributors
15
43
  - [@joshuataylor](https://github.com/joshuataylor) ([#303](https://github.com/dbt-labs/dbt-common/pull/303))
16
44
 
17
-
18
45
  ## dbt-common 1.28.0 - August 14, 2025
19
46
 
20
47
  ### Dependencies
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dbt-common
3
- Version: 1.29.0
3
+ Version: 1.31.0
4
4
  Summary: The shared common utilities that dbt-core and adapter implementations use
5
5
  Project-URL: Homepage, https://github.com/dbt-labs/dbt-common
6
6
  Project-URL: Repository, https://github.com/dbt-labs/dbt-common.git
@@ -0,0 +1 @@
1
+ version = "1.31.0"
@@ -600,6 +600,9 @@ def rename(from_path: str, to_path: str, force: bool = False) -> None:
600
600
  to_path = convert_path(to_path)
601
601
  is_symlink = path_is_symlink(to_path)
602
602
 
603
+ if from_path == to_path:
604
+ return
605
+
603
606
  if os.path.exists(to_path) and force:
604
607
  if is_symlink:
605
608
  remove_file(to_path)
@@ -1,8 +1,8 @@
1
1
  import uuid
2
- from datetime import datetime
2
+ from datetime import datetime, timezone
3
3
 
4
4
  _INVOCATION_ID = str(uuid.uuid4())
5
- _INVOCATION_STARTED_AT = datetime.utcnow()
5
+ _INVOCATION_STARTED_AT = datetime.now(timezone.utc).replace(tzinfo=None)
6
6
 
7
7
 
8
8
  def get_invocation_id() -> str:
@@ -16,4 +16,4 @@ def get_invocation_started_at() -> datetime:
16
16
  def reset_invocation_id() -> None:
17
17
  global _INVOCATION_ID, _INVOCATION_STARTED_AT
18
18
  _INVOCATION_ID = str(uuid.uuid4())
19
- _INVOCATION_STARTED_AT = datetime.utcnow()
19
+ _INVOCATION_STARTED_AT = datetime.now(timezone.utc).replace(tzinfo=None)
@@ -179,6 +179,7 @@ class Recorder:
179
179
 
180
180
  self._record_added = False
181
181
  self._recording_file: Optional[TextIO] = None
182
+ self._recording_file_lock = Lock()
182
183
  if mode == RecorderMode.RECORD and not in_memory:
183
184
  self._recording_file = open(current_recording_path, "w")
184
185
  self._recording_file.write("[")
@@ -200,16 +201,19 @@ class Recorder:
200
201
  self._counter += 1
201
202
 
202
203
  if self._recording_file is not None:
203
- if self._record_added:
204
- self._recording_file.write(",")
205
- try:
206
- dct = Recorder._get_tagged_dict(record, rec_cls_name)
207
- json.dump(dct, self._recording_file)
208
- self._record_added = True
209
- except Exception:
210
- json.dump(
211
- {"type": "RecordingError", "record_type": rec_cls_name}, self._recording_file
212
- )
204
+ # Lock recording file during streamed recording to avoid race conditions across recording threads
205
+ with self._recording_file_lock:
206
+ if self._record_added:
207
+ self._recording_file.write(",")
208
+ try:
209
+ dct = Recorder._get_tagged_dict(record, rec_cls_name)
210
+ json.dump(dct, self._recording_file)
211
+ self._record_added = True
212
+ except Exception:
213
+ json.dump(
214
+ {"type": "RecordingError", "record_type": rec_cls_name},
215
+ self._recording_file,
216
+ )
213
217
  else:
214
218
  if rec_cls_name not in self._records_by_type:
215
219
  self._records_by_type[rec_cls_name] = []
@@ -444,8 +448,9 @@ class AutoValues(DataClassJSONMixin):
444
448
  def _to_dict(self):
445
449
  return self.to_dict()
446
450
 
447
- def _from_dict(self, data):
448
- return self.from_dict(data)
451
+ @classmethod
452
+ def _from_dict(cls, data):
453
+ return cls.from_dict(data)
449
454
 
450
455
 
451
456
  def _record_function_inner(
@@ -530,16 +535,37 @@ def _record_function_inner(
530
535
  else:
531
536
  param_args = (getattr(args[0], id_field_name),) + param_args
532
537
 
533
- params = record_type.params_cls(*param_args, **kwargs)
538
+ # Build params - this can be dangerous if a subclass overrides the method in such a way that
539
+ # changes the signature of the base recorded method, and so is wrapped in a try/except.
540
+ params = None
541
+ try:
542
+ # Omits any additional properties that are not fields of the params class
543
+ params_dict = {
544
+ field.name: value
545
+ for field, value in zip(dataclasses.fields(record_type.params_cls), param_args)
546
+ }
547
+ params_dict.update(kwargs)
548
+ try:
549
+ params = record_type.params_cls._from_dict(params_dict)
550
+ except (TypeError, AttributeError):
551
+ params = record_type.params_cls(*param_args, **kwargs)
552
+ except Exception:
553
+ # Unfortunately it is not possible to fire an event here because it would cause a circular import
554
+ # This means we lose visibility into the issue, but it is better than crashing the entire node or command
555
+ pass
556
+ except Exception:
557
+ # Unfortunately it is not possible to fire an event here because it would cause a circular import
558
+ # This means we lose visibility into the issue, but it is better than crashing the entire node or command
559
+ pass
534
560
 
535
561
  include = True
536
- if hasattr(params, "_include"):
562
+ if params is not None and hasattr(params, "_include"):
537
563
  include = params._include()
538
564
 
539
565
  if not include:
540
566
  return func_to_record(*call_args, **kwargs)
541
567
 
542
- if recorder.mode == RecorderMode.REPLAY:
568
+ if recorder.mode == RecorderMode.REPLAY and params is not None:
543
569
  return recorder.expect_record(params)
544
570
  if RECORDED_BY_HIGHER_FUNCTION.get():
545
571
  return func_to_record(*call_args, **kwargs)
@@ -554,7 +580,8 @@ def _record_function_inner(
554
580
  else record_type.result_cls(r)
555
581
  )
556
582
  RECORDED_BY_HIGHER_FUNCTION.set(False)
557
- recorder.add_record(record_type(params=params, result=result))
583
+ if params is not None:
584
+ recorder.add_record(record_type(params=params, result=result))
558
585
  return r
559
586
 
560
587
  setattr(
@@ -1 +0,0 @@
1
- version = "1.29.0"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes