loc_mods 0.2.2 → 0.2.3
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 +4 -4
- data/exe/loc-mods +1 -0
- data/lib/loc_mods/base_mapper.rb +17 -0
- data/lib/loc_mods/cli.rb +84 -32
- data/lib/loc_mods/comparable_mapper.rb +46 -32
- data/lib/loc_mods/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b206d76220e77a18fd6609c3f7646eaf8fb836ac2d69a7d6da019db5820f24d
|
4
|
+
data.tar.gz: ffd23bb7508ad1fef1e0b165eb07620fc0a2420b6c436ac34cec8208affb6463
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f56bbb4bfdab2dd2820ef67d94461ac5caa47d62937762a5cbeacbea8e70497c75968d92b3ce23f5d7e79f6a737c98c43058d6e11b774d0777340f040808fea
|
7
|
+
data.tar.gz: 0ac7feedcebe5df178f6ad313ba811004de126c82adc0f5289f44b43212a26ef2acfa3f09a45afa9cd4b158b7b4ef97976413ac357b4eb11749ab227c801a168
|
data/exe/loc-mods
CHANGED
data/lib/loc_mods/base_mapper.rb
CHANGED
@@ -1,9 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# lib/loc_mods/base_mapper.rb
|
2
4
|
require "shale"
|
3
5
|
require_relative "comparable_mapper"
|
4
6
|
|
5
7
|
module LocMods
|
8
|
+
# Base class for all object definitions
|
6
9
|
class BaseMapper < Shale::Mapper
|
7
10
|
include ComparableMapper
|
8
11
|
end
|
12
|
+
|
13
|
+
# Nil class substitute for comparison
|
14
|
+
class ComparableNil < BaseMapper
|
15
|
+
end
|
16
|
+
|
17
|
+
# Comparison of two values for ComparableMapper
|
18
|
+
class Comparison
|
19
|
+
attr_accessor :original, :updated
|
20
|
+
|
21
|
+
def initialize(original:, updated:)
|
22
|
+
@original = original
|
23
|
+
@updated = updated
|
24
|
+
end
|
25
|
+
end
|
9
26
|
end
|
data/lib/loc_mods/cli.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# lib/loc_mods/cli.rb
|
2
4
|
require "thor"
|
3
5
|
require "loc_mods"
|
@@ -23,33 +25,34 @@ module LocMods
|
|
23
25
|
records_by_url = {}
|
24
26
|
all_records.each do |record|
|
25
27
|
urls = record[:record].location.flat_map { |loc| loc.url.map(&:content) }.compact
|
26
|
-
|
27
|
-
urls.each do |url|
|
28
|
-
records_by_url[url] ||= []
|
29
|
-
records_by_url[url] << record
|
30
|
-
end
|
31
|
-
else
|
28
|
+
unless urls.any?
|
32
29
|
puts "Warning: Record without URL found in file: #{record[:file]}"
|
30
|
+
next
|
31
|
+
end
|
32
|
+
|
33
|
+
urls.each do |url|
|
34
|
+
records_by_url[url] ||= []
|
35
|
+
records_by_url[url] << record
|
33
36
|
end
|
34
37
|
end
|
35
38
|
|
36
39
|
duplicate_count = 0
|
37
40
|
records_by_url.each do |url, records|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
puts "\n"
|
41
|
+
next unless records.size > 1
|
42
|
+
|
43
|
+
duplicate_count += 1
|
44
|
+
puts "Duplicate set ##{duplicate_count} found for URL: #{url}"
|
45
|
+
records.combination(2).each_with_index do |(record1, record2), index|
|
46
|
+
puts " Comparison #{index + 1}:"
|
47
|
+
puts " File 1: #{record1[:file]}"
|
48
|
+
puts " File 2: #{record2[:file]}"
|
49
|
+
differences = record1[:record].compare(record2[:record])
|
50
|
+
if differences
|
51
|
+
puts " ----"
|
52
|
+
print_differences(differences)
|
53
|
+
puts " ----"
|
52
54
|
end
|
55
|
+
puts "\n"
|
53
56
|
end
|
54
57
|
end
|
55
58
|
end
|
@@ -65,26 +68,68 @@ module LocMods
|
|
65
68
|
end
|
66
69
|
|
67
70
|
def print_differences(differences, prefix = "", path = [])
|
71
|
+
if differences.is_a?(Comparison)
|
72
|
+
print_difference(differences, path)
|
73
|
+
return
|
74
|
+
end
|
75
|
+
|
76
|
+
# Differences is a Hash here
|
68
77
|
differences.each do |key, value|
|
78
|
+
# puts "key #{key}, value #{value}"
|
69
79
|
current_path = path + [key]
|
70
|
-
|
71
|
-
|
72
|
-
|
80
|
+
# This is a comparison
|
81
|
+
if value.is_a?(Comparison)
|
82
|
+
print_difference(value, path)
|
83
|
+
next
|
84
|
+
end
|
85
|
+
|
86
|
+
raise "Differences must be in form of a Hash" unless value.is_a?(Hash)
|
87
|
+
|
88
|
+
# This is not array, end here
|
89
|
+
next unless value.keys.any? do |k|
|
90
|
+
k.is_a?(Integer) || k == :_array_size_difference
|
91
|
+
end
|
92
|
+
|
93
|
+
# if value[:_array_size_difference]
|
94
|
+
# puts " #{format_path(current_path)} [_array_size_difference]:"
|
95
|
+
# puts " Record 1: #{format_value(value[:_array_size_difference].original)}"
|
96
|
+
# puts " Record 2: #{format_value(value[:_array_size_difference].updated)}"
|
97
|
+
# puts
|
98
|
+
# end
|
99
|
+
|
100
|
+
value.each do |subkey, subvalue|
|
101
|
+
# if [:self, :other].include?(subkey)
|
102
|
+
# raise "Subkey is self or other"
|
103
|
+
# end
|
104
|
+
# puts "subkey (#{subkey})"
|
105
|
+
# puts "subvalue #{subvalue}, prefix #{prefix}, current_path + [subkey] #{current_path + [subkey]}"
|
106
|
+
|
107
|
+
if subkey.is_a?(Integer)
|
108
|
+
print_differences(subvalue, prefix, current_path + [subkey])
|
109
|
+
else
|
110
|
+
if subvalue.is_a?(Comparison)
|
111
|
+
print_difference(subvalue, current_path + [subkey])
|
112
|
+
next
|
113
|
+
end
|
114
|
+
|
115
|
+
raise "In an array diff but not an Integer!"
|
73
116
|
end
|
74
|
-
elsif value.is_a?(Hash) && (value[:self] || value[:other])
|
75
|
-
puts " #{format_path(current_path)}:"
|
76
|
-
puts " #{prefix} Record 1: #{format_value(value[:self])}"
|
77
|
-
puts " #{prefix} Record 2: #{format_value(value[:other])}"
|
78
|
-
puts
|
79
|
-
elsif value.is_a?(Hash)
|
80
|
-
print_differences(value, prefix, current_path)
|
81
117
|
end
|
82
118
|
end
|
83
119
|
end
|
84
120
|
|
121
|
+
def print_difference(value, current_path)
|
122
|
+
return unless value.original || value.updated
|
123
|
+
|
124
|
+
puts " #{format_path(current_path)}:"
|
125
|
+
puts " Record 1: #{format_value(value.original)}"
|
126
|
+
puts " Record 2: #{format_value(value.updated)}"
|
127
|
+
puts
|
128
|
+
end
|
129
|
+
|
85
130
|
def format_path(path)
|
86
131
|
path.map.with_index do |part, index|
|
87
|
-
if index
|
132
|
+
if index.zero?
|
88
133
|
part.to_s
|
89
134
|
elsif part.is_a?(Integer)
|
90
135
|
"[#{part}]"
|
@@ -95,7 +140,14 @@ module LocMods
|
|
95
140
|
end
|
96
141
|
|
97
142
|
def format_value(value)
|
98
|
-
|
143
|
+
case value
|
144
|
+
when nil, ComparableNil
|
145
|
+
"(nil)"
|
146
|
+
when String
|
147
|
+
"\"#{value}\""
|
148
|
+
else
|
149
|
+
value.to_s
|
150
|
+
end
|
99
151
|
end
|
100
152
|
end
|
101
153
|
end
|
@@ -1,30 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# lib/loc_mods/comparable_mapper.rb
|
2
4
|
|
3
5
|
module LocMods
|
6
|
+
# Enable comparison of two class models solely based on attribute values in
|
7
|
+
# a recursive manner.
|
4
8
|
module ComparableMapper
|
5
|
-
#
|
6
|
-
#
|
9
|
+
# TODO: Implement Comparable
|
10
|
+
# include Comparable
|
11
|
+
# def <=>(other)
|
12
|
+
# attributes.foo <=> other.attributes.foo
|
7
13
|
# end
|
8
|
-
|
9
|
-
#
|
10
|
-
# def attribute_mapping
|
11
|
-
# @attribute_mapping ||= attributes.to_h do |name, attribute|
|
12
|
-
# [name, attribute.type]
|
13
|
-
# end
|
14
|
-
# end
|
14
|
+
# def inspect
|
15
|
+
# @foo
|
15
16
|
# end
|
16
17
|
|
17
|
-
def
|
18
|
-
|
18
|
+
def eql?(other)
|
19
|
+
other.class == self.class &&
|
20
|
+
self.class.attributes.all? do |attr|
|
21
|
+
send(attr) == other.send(attr)
|
22
|
+
end
|
23
|
+
end
|
19
24
|
|
25
|
+
alias == eql?
|
26
|
+
|
27
|
+
def hash
|
28
|
+
([self.class] + self.class.attributes.map(&:hash)).hash
|
29
|
+
end
|
30
|
+
|
31
|
+
def compare(other)
|
20
32
|
differences = {}
|
21
33
|
|
22
34
|
# puts "Debugging: Attributes for #{self.class.name}"
|
23
35
|
# pp self.class.attributes.keys
|
24
36
|
|
25
37
|
self.class.attributes.each_key do |attr|
|
26
|
-
self_value =
|
27
|
-
other_value = other.send(attr)
|
38
|
+
self_value = respond_to?(attr) ? send(attr) : nil
|
39
|
+
other_value = other.respond_to?(attr) ? other.send(attr) : nil
|
28
40
|
|
29
41
|
# puts "Debugging: Comparing attribute '#{attr}'"
|
30
42
|
# puts " Self value: #{self_value.inspect}"
|
@@ -52,14 +64,14 @@ module LocMods
|
|
52
64
|
case self_value
|
53
65
|
when Array
|
54
66
|
# puts "compare_values case 1"
|
55
|
-
compare_arrays(self_value, other_value)
|
56
|
-
when
|
67
|
+
compare_arrays(self_value, other_value || [])
|
68
|
+
when ComparableMapper
|
57
69
|
# puts "compare_values case 2"
|
58
70
|
self_value.compare(other_value)
|
59
71
|
else
|
60
72
|
if self_value != other_value
|
61
73
|
# puts "compare_values case 3"
|
62
|
-
|
74
|
+
Comparison.new(original: self_value, updated: other_value)
|
63
75
|
end
|
64
76
|
end
|
65
77
|
end
|
@@ -69,25 +81,27 @@ module LocMods
|
|
69
81
|
max_length = [self_array.size, other_array.size].max
|
70
82
|
|
71
83
|
max_length.times do |index|
|
72
|
-
self_item = self_array[index]
|
73
|
-
other_item = other_array[index]
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
+
self_item = self_array[index] || ComparableNil.new
|
85
|
+
other_item = other_array[index] || ComparableNil.new
|
86
|
+
|
87
|
+
compared = compare_values(self_item, other_item)
|
88
|
+
differences[index] = compared if compared
|
89
|
+
|
90
|
+
# if index >= self_array.size
|
91
|
+
# puts "case 1 #{compared}"
|
92
|
+
# # differences[index] = compared
|
93
|
+
# elsif index >= other_array.size
|
94
|
+
# puts "case 2.1 #{self_item}"
|
95
|
+
# puts "case 2.2 #{compared}"
|
96
|
+
# # differences[index] = compared
|
97
|
+
# end
|
84
98
|
end
|
85
99
|
|
86
100
|
if self_array.size != other_array.size
|
87
|
-
differences[:
|
88
|
-
|
89
|
-
|
90
|
-
|
101
|
+
differences[:_array_size_difference] = Comparison.new(
|
102
|
+
original: self_array.size,
|
103
|
+
updated: other_array.size
|
104
|
+
)
|
91
105
|
end
|
92
106
|
|
93
107
|
differences.empty? ? nil : differences
|
data/lib/loc_mods/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loc_mods
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-07-
|
11
|
+
date: 2024-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|