yaml-search-diff 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
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