tdc 1.3 → 1.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ea0b752fe9e2b0de8af863a24943c1f9b3761361c954daeb30a8af0d19ff3618
4
- data.tar.gz: '08057115b222377b4ec89752f2e45d6044d12ab3907efd0c2d6544ea888ab186'
3
+ metadata.gz: 96f4dcb68a0b66da5d24ceb550ea17484044c4489dbc898f72b76529287b9d8a
4
+ data.tar.gz: b56e406533429d735cce8c26c338b111c66965d8341cd744d672d9ff8bc642d1
5
5
  SHA512:
6
- metadata.gz: 9dda429b7527bc63a9152e34197f15e6846d7ea99c54acbc6a6fa629efeacddea67e8416ea493f94c709d1a556b49cc1a7d3b34bedb5cfdac9d03c59d448de6d
7
- data.tar.gz: 471e6576c1d97bed8ada0a23b4de078c9f8aec8adbae16893e0c4ddeaf5018add54edfa1784a3b53dd01ebc5ecc370ed2624dde9e64e3be691e7c8d5c1912675
6
+ metadata.gz: cb7c52792c80baac6651a2fa434cebd9a1331cd00a41350f34409d7d083dbf21aaf40717006ed72012be7b2cd07055eca0b0bf5784d0431efb52bc7b4b5cdd70
7
+ data.tar.gz: 6e761091a8cb869f160d28e652563fa88c8b5de959fef37f4f2a60aaadbfc9e4beae1323aa851c714422de05f73888c6730ec86079a50ee1e44bc8e9d883b3a1
data/CHANGELOG.md CHANGED
@@ -6,6 +6,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.4] - 2026-04-04
10
+
11
+ #### New Features
12
+
13
+ - Update-or-create support in `StandardGenerator`: when an extension row's tag matches a previously created
14
+ record, the generator routes to `update_instance` instead of `generate_instance`
15
+ - `GenerationContext` tracks updating state via `with_updating` / `updating?`
16
+ - `DefinitionResolver` exposes `updating?` via generation context so subclass resolvers can skip missing keys
17
+ when updating
18
+
9
19
  ## [1.3] - 2025-10-25
10
20
 
11
21
  - Support Ruby 3.4
@@ -6,7 +6,7 @@ module Tdc
6
6
  # Base class for any definition resolver.
7
7
  #
8
8
  class DefinitionResolver
9
- attr_reader :current_catalog
9
+ attr_reader :current_catalog, :generation_context
10
10
 
11
11
  def configure_current_catalog(current_catalog)
12
12
  @current_catalog = current_catalog
@@ -14,6 +14,16 @@ module Tdc
14
14
  self
15
15
  end
16
16
 
17
+ def configure_generation_context(generation_context)
18
+ @generation_context = generation_context
19
+
20
+ self
21
+ end
22
+
23
+ def updating?
24
+ generation_context&.updating? == true
25
+ end
26
+
17
27
  def resolve(_instance_definition)
18
28
  raise Tdc::MissingOverrideError, "Implement the 'resolve' method"
19
29
  end
@@ -42,6 +42,7 @@ module Tdc
42
42
  def run_definition_resolvers(instance_definition)
43
43
  _definition_resolvers.each do |definition_resolver|
44
44
  definition_resolver.configure_current_catalog(current_catalog)
45
+ definition_resolver.configure_generation_context(generation_context)
45
46
 
46
47
  definition_resolver.resolve(instance_definition)
47
48
  end
@@ -11,6 +11,18 @@ module Tdc
11
11
  def initialize(current_catalog:, data_definition:)
12
12
  @current_catalog = current_catalog
13
13
  @data_definition = data_definition
14
+ @updating = false
15
+ end
16
+
17
+ def updating?
18
+ @updating
19
+ end
20
+
21
+ def with_updating
22
+ @updating = true
23
+ yield
24
+ ensure
25
+ @updating = false
14
26
  end
15
27
  end
16
28
  end
@@ -20,7 +20,13 @@ module Tdc
20
20
  # Delete the tag so that the models do not need to filter it out.
21
21
  tag = instance_definition.delete("tag")
22
22
 
23
- generated = run_resolvers_and_generate_instance
23
+ existing_record = find_existing_record(tag, catalog_entries)
24
+
25
+ if existing_record
26
+ generated = run_resolvers_and_update_instance(existing_record)
27
+ else
28
+ generated = run_resolvers_and_generate_instance
29
+ end
24
30
 
25
31
  # Add generated instance to the catalog entries whenever a tag provided.
26
32
  catalog_entries.add_catalog_entry(tag, generated) if tag
@@ -35,6 +41,15 @@ module Tdc
35
41
  generate_instance
36
42
  end
37
43
 
44
+ def run_resolvers_and_update_instance(existing_record)
45
+ generation_context.with_updating do
46
+ run_extended_attribute_interpreters(instance_definition)
47
+ run_definition_resolvers(instance_definition)
48
+
49
+ update_instance(existing_record)
50
+ end
51
+ end
52
+
38
53
  #
39
54
  # Hook method: subclasses are expected to define how to generate a model instance.
40
55
  #
@@ -42,6 +57,14 @@ module Tdc
42
57
  raise Tdc::MissingOverrideError, "Implement the 'generate_instance' method"
43
58
  end
44
59
 
60
+ #
61
+ # Hook method: subclasses may override to customize update behavior for existing records.
62
+ #
63
+ def update_instance(existing_record)
64
+ existing_record.update!(instance_definition)
65
+ existing_record
66
+ end
67
+
45
68
  #
46
69
  # Hook method: subclasses may include the DefinitionResolvable concern to override.
47
70
  #
@@ -51,6 +74,12 @@ module Tdc
51
74
 
52
75
  private
53
76
 
77
+ def find_existing_record(tag, catalog_entries)
78
+ return unless tag
79
+
80
+ catalog_entries.respond_to?(tag) ? catalog_entries.send(tag) : nil
81
+ end
82
+
54
83
  def configure_instance_definition(instance_definition)
55
84
  @instance_definition = instance_definition
56
85
 
data/lib/tdc/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tdc
4
- VERSION = "1.3"
4
+ VERSION = "1.4"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tdc
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.3'
4
+ version: '1.4'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alistair McKinnell
@@ -130,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
132
  requirements: []
133
- rubygems_version: 3.6.9
133
+ rubygems_version: 4.0.8
134
134
  specification_version: 4
135
135
  summary: A simple framework for creating a Test Data Catalog
136
136
  test_files: []