yaml-search-diff 0.6.0 → 0.6.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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/ysdiff +2 -1
  3. data/lib/yaml_search_diff.rb +60 -54
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 43c8d977451539a04e29673ecd6c5fc7b14f2523ddacba5b818dfaaf6d37ab0d
4
- data.tar.gz: b534be13e379921eee993728ad8018567736542ff31904ebe5ec41c0079b2e41
3
+ metadata.gz: 0a964579c858c001a695e4e8980610a173e8a9ecda23314d6176ae4bc479b7f5
4
+ data.tar.gz: 3f433f709a403a3b763acd73e284fee83af3ab56ea6274fe5a49026c6a739c75
5
5
  SHA512:
6
- metadata.gz: e7cf20666840ea29c9427b308c527c8f7b9632539f3b6c9c29d5996cb88e4b591a2f180927dc62c1317433ba6e16c8074fc5c44e776e21357ac33a1452368757
7
- data.tar.gz: 4254b55411edb43987487a5c9d3b5028f9806fbc7640db7873ce1ab66042692ba7ee866b4174e332a66b428b3f2659c6412568d692ef3fee25df8b02e351a8c2
6
+ metadata.gz: c1f90c9aade7f5d77e35fa7ae1b6b793f0289adb5efb6d23520c6f40754719565f24fdcc5e83f165d57b9e164e86a5b4c1f395c21f5163a12c331bd802bbe818
7
+ data.tar.gz: c9449015aa16aea33c8dacc2c4b0013d423b88ae9aaf45db7a21c16c49da21d78fbaa57a50caaf5a97ad0c08a74e72f9808c0d75c5b3517ec433bcb7d8433f3c
data/bin/ysdiff CHANGED
@@ -17,7 +17,8 @@ invalid_files << file_1 unless yml_1.is_a?(Hash)
17
17
  invalid_files << file_2 unless yml_2.is_a?(Hash)
18
18
 
19
19
  if invalid_files.empty?
20
- puts YamlSearchDiff.run(key: key, yml_1: yml_1, yml_2: yml_2)
20
+ ysdiff = YamlSearchDiff.new
21
+ puts ysdiff.run(key: key, yml_1: yml_1, yml_2: yml_2)
21
22
  else
22
23
  STDERR.puts "Couldn't parse following files as Hash: #{invalid_files.join(', ')}"
23
24
  exit 1
@@ -2,76 +2,82 @@ require 'yaml'
2
2
  require 'diffy'
3
3
 
4
4
  class YamlSearchDiff
5
- class << self
6
- def run(key:, yml_1:, yml_2:)
7
- return "" unless yml_1.is_a?(Hash) && yml_2.is_a?(Hash)
8
5
 
9
- searched_1 = key.include?(':') ? search_dig(key, yml_1) : search(key, yml_1)
10
- searched_2 = key.include?(':') ? search_dig(key, yml_2) : search(key, yml_2)
6
+ def initialize
7
+ @scalar_scanner = Psych::ScalarScanner.new(Psych::ClassLoader.new)
8
+ end
11
9
 
12
- Diffy::Diff.new(
13
- YAML.dump(searched_1),
14
- YAML.dump(searched_2)
15
- )
16
- end
10
+ def run(key:, yml_1:, yml_2:)
11
+ return "" unless yml_1.is_a?(Hash) && yml_2.is_a?(Hash)
17
12
 
18
- private
13
+ searched_1 = key.include?(':') ? search_dig(key, yml_1) : search(key, yml_1)
14
+ searched_2 = key.include?(':') ? search_dig(key, yml_2) : search(key, yml_2)
19
15
 
20
- def search(key, yml)
21
- searched = catch(:has_key) { dfs(yml, key) }
22
- sort_yml(searched)
23
- end
16
+ Diffy::Diff.new(
17
+ YAML.dump(searched_1),
18
+ YAML.dump(searched_2)
19
+ )
20
+ end
24
21
 
25
- def search_dig(key, yml)
26
- splitted_keys = key.split(':')
27
- first_key = splitted_keys.first
22
+ private
28
23
 
29
- searched = catch(:has_key) { dfs(yml, first_key) }
30
- digged = searched.dig(*splitted_keys[1..])
24
+ def search(key, yml)
25
+ tokenized_key = @scalar_scanner.tokenize(key)
26
+ searched = catch(:has_key) { dfs(yml, tokenized_key) }
27
+ sort_yml(searched)
28
+ end
31
29
 
32
- sort_yml(digged)
33
- end
30
+ def search_dig(key, yml)
31
+ tokenized_keys = key.split(':').map {|k| @scalar_scanner.tokenize(k) }
32
+ return sort_yml(yml) if tokenized_keys.size.zero?
34
33
 
35
- def dfs(hash, key)
36
- keys = hash.keys.sort_by(&:to_s)
37
- keys.each do |k|
38
- throw :has_key, hash[k] if k == key
39
- dfs(hash[k], key) if hash[k].is_a?(Hash)
40
- end
41
- {}
34
+ first_key = tokenized_keys.first
35
+
36
+ searched = catch(:has_key) { dfs(yml, first_key) }
37
+ digged = searched.dig(*tokenized_keys[1..])
38
+
39
+ sort_yml(digged)
40
+ end
41
+
42
+ def dfs(hash, key)
43
+ keys = hash.keys.sort_by(&:to_s)
44
+ keys.each do |k|
45
+ throw :has_key, hash[k] if k == key
46
+ dfs(hash[k], key) if hash[k].is_a?(Hash)
42
47
  end
48
+ {}
49
+ end
43
50
 
44
- def sort_yml(yml)
45
- if yml.is_a?(Hash)
46
- nested_sort_hash(yml)
47
- elsif yml.is_a?(Array)
48
- nested_sort_array(yml)
49
- else
50
- yml
51
- end
51
+ def sort_yml(yml)
52
+ if yml.is_a?(Hash)
53
+ nested_sort_hash(yml)
54
+ elsif yml.is_a?(Array)
55
+ nested_sort_array(yml)
56
+ else
57
+ yml
52
58
  end
59
+ end
53
60
 
54
- def nested_sort_hash(hash)
55
- hash.each do |k, v|
56
- if v.is_a?(Hash)
57
- hash[k] = nested_sort_hash(v)
58
- elsif v.is_a?(Array)
59
- hash[k] = nested_sort_array(v)
60
- end
61
+ def nested_sort_hash(hash)
62
+ hash.each do |k, v|
63
+ if v.is_a?(Hash)
64
+ hash[k] = nested_sort_hash(v)
65
+ elsif v.is_a?(Array)
66
+ hash[k] = nested_sort_array(v)
61
67
  end
62
- hash.sort_by { |k, v| k.to_s }.to_h
63
68
  end
69
+ hash.sort_by { |k, v| k.to_s }.to_h
70
+ end
64
71
 
65
- def nested_sort_array(array)
66
- array.each_with_index do |v, i|
67
- if v.is_a?(Hash)
68
- array[i] = nested_sort_hash(v)
69
- elsif v.is_a?(Array)
70
- array[i] = nested_sort_array(v)
71
- end
72
+ def nested_sort_array(array)
73
+ array.each_with_index do |v, i|
74
+ if v.is_a?(Hash)
75
+ array[i] = nested_sort_hash(v)
76
+ elsif v.is_a?(Array)
77
+ array[i] = nested_sort_array(v)
72
78
  end
73
- array.sort_by(&:to_s)
74
79
  end
75
- end
80
+ array.sort_by(&:to_s)
81
+ end
76
82
  end
77
83
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yaml-search-diff
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Natsuki Inoue
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-18 00:00:00.000000000 Z
11
+ date: 2021-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diffy