zonesync 0.12.0 → 0.12.1

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: aaa6c630bddb382ab5b051983a3af48b5d59583a2e6befb51bf4098e3ccbdbb0
4
- data.tar.gz: 7005f724efb994e55bc9d581780a8ba5711729ba208b9ef4c8fb77cc48d018bc
3
+ metadata.gz: c395a08b3c2cc504eecef12cf44298872295adf778a7087128fb009b8709cfd1
4
+ data.tar.gz: 38f349d9182226d849c1a4a4688328aaa96d64dbda182803aeedffefea7d99e3
5
5
  SHA512:
6
- metadata.gz: ca2cc5e0fefcbf14efe91cb80b84ef20b485715891d92b8f2cd1f58cb2b6193bf9a7a51e822fa046a516bb275a7c5a5fb98e19d2cb9ae08cee41208434986f9e
7
- data.tar.gz: bb66c82041407b2e3d3a57e0c1c381dc9a7ac77fb1d09db52d61892fb76409541a3d5059f916205f00dbf304a71218a0df7f60c6fb995350a1928d8026e8b617
6
+ metadata.gz: 89364406f0bddc66568e3e908424699d3cc6daeb8a0b51ab7da94338369ae3a3f6be302f3c7439e23c0e771e41d5ebe0155c8cef71ad4dfa16184d2d516554d6
7
+ data.tar.gz: 282091580a65383b954a6b2da783e591d9f4f289e811ee4bc57dd9b61b004c3d3fdfa06f2f000971611b0924059573fd0000d2cf29e96d716fb2fee747f5c434
data/lib/zonesync/diff.rb CHANGED
@@ -1,8 +1,6 @@
1
1
  # typed: strict
2
2
  require "sorbet-runtime"
3
3
 
4
- require "diff/lcs"
5
-
6
4
  module Zonesync
7
5
  Operation = T.type_alias { [Symbol, T::Array[Record]] }
8
6
 
@@ -16,19 +14,47 @@ module Zonesync
16
14
 
17
15
  sig { returns(T::Array[[Symbol, T::Array[Record]]]) }
18
16
  def call
19
- changes = ::Diff::LCS.sdiff(from, to)
20
- changes.map do |change|
21
- case change.action
22
- when "-"
23
- [:remove, [change.old_element]]
24
- when "!"
25
- [:change, [change.old_element, change.new_element]]
26
- when "+"
27
- [:add, [change.new_element]]
17
+ # Group records by their primary key (name + type)
18
+ from_by_key = from.group_by { |r| [r.name, r.type] }
19
+ to_by_key = to.group_by { |r| [r.name, r.type] }
20
+
21
+ operations = []
22
+
23
+ # Process all keys that exist in from
24
+ from_by_key.each do |key, from_records|
25
+ to_records = to_by_key[key] || []
26
+
27
+ if to_records.empty?
28
+ # All records with this key were removed
29
+ from_records.each { |r| operations << [:remove, [r]] }
30
+ elsif from_records.length == 1 && to_records.length == 1
31
+ # Single record with this key - check if it changed
32
+ from_record = from_records.first
33
+ to_record = to_records.first
34
+
35
+ unless from_record == to_record
36
+ operations << [:change, [from_record, to_record]]
37
+ end
38
+ else
39
+ # Multiple records with same name+type, or count mismatch
40
+ # Use set difference to find what was added/removed
41
+ removed = from_records - to_records
42
+ added = to_records - from_records
43
+
44
+ removed.each { |r| operations << [:remove, [r]] }
45
+ added.each { |r| operations << [:add, [r]] }
46
+ end
47
+ end
48
+
49
+ # Process keys that only exist in to (new records)
50
+ to_by_key.each do |key, to_records|
51
+ unless from_by_key.key?(key)
52
+ to_records.each { |r| operations << [:add, [r]] }
28
53
  end
29
- end.compact.sort_by do |operation|
30
- operation.first
31
- end.reverse # perform remove operations first
54
+ end
55
+
56
+ # Sort operations (remove first)
57
+ operations.sort_by { |op| op.first }.reverse
32
58
  end
33
59
  end
34
60
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Zonesync
4
- VERSION = "0.12.0"
4
+ VERSION = "0.12.1"
5
5
  end
data/zonesync.gemspec CHANGED
@@ -27,7 +27,6 @@ Gem::Specification.new do |spec|
27
27
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
28
28
  spec.require_paths = ["lib"]
29
29
 
30
- spec.add_dependency "diff-lcs", "~>1.4"
31
30
  spec.add_dependency "thor", "~>1.0"
32
31
  spec.add_dependency "treetop", "~>1.6"
33
32
  spec.add_dependency "sorbet-runtime"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zonesync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Micah Geisel
@@ -9,22 +9,8 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2025-10-19 00:00:00.000000000 Z
12
+ date: 2025-10-20 00:00:00.000000000 Z
13
13
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: diff-lcs
16
- requirement: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - "~>"
19
- - !ruby/object:Gem::Version
20
- version: '1.4'
21
- type: :runtime
22
- prerelease: false
23
- version_requirements: !ruby/object:Gem::Requirement
24
- requirements:
25
- - - "~>"
26
- - !ruby/object:Gem::Version
27
- version: '1.4'
28
14
  - !ruby/object:Gem::Dependency
29
15
  name: thor
30
16
  requirement: !ruby/object:Gem::Requirement