yaml_ref_resolver 0.3.0 → 0.3.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
  SHA1:
3
- metadata.gz: 6ffeab1d9592dea1cb891998e1f8a804a12079f2
4
- data.tar.gz: c43a4ced279e3ab1efaa91156cb67f8ac76969f5
3
+ metadata.gz: 3d7f42af28ee1b2b85cb5657be83f8096e3f34bc
4
+ data.tar.gz: dcba469e9cf920b111a14b480a6aacb3b4d70d59
5
5
  SHA512:
6
- metadata.gz: 7b56653ef77227ba2de13f9218ad6fbb02939ba2cd123056b8a055fe67d86154690774061660540b7462d67f471ca82de278438005e8bfca7e81fd4064960f5f
7
- data.tar.gz: 3d3ee1d47be56c22ea65d255f64731f7d696b219a99e85e6e8e27d4590724636307af1c0fdc4ba3fc0ce3c4e476ba30201d48d9763f0375f63710d0652d47168
6
+ metadata.gz: 6339ebc5a39a7224861642ad2fe480196eb2c494b694d7087cdeb32f18c3cb061a18dac42a64c186929af3854e6911203a145028648734339df754f8f1976225
7
+ data.tar.gz: 689dac3c5b409db892cf78b99767142939f58dca790ef44db9d914ab0b21a5465831aa51106f07c71cc173eaa0e6f56785b77fa4ca15253808806819d55731a0
@@ -1,3 +1,3 @@
1
1
  class YamlRefResolver
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -4,37 +4,73 @@ require "yaml"
4
4
  class YamlRefResolver
5
5
  def initialize(opts = {})
6
6
  @key = opts[:key] || '$ref'
7
+ @yaml = {}
7
8
  end
8
9
 
9
10
  def resolve(path)
10
- resolve_refs(YAML.load_file(path), File.dirname(path))
11
+ entry_point = File.expand_path(path)
12
+ preload_ref_yamls(entry_point)
13
+
14
+ resolve_refs(@yaml[entry_point], entry_point)
11
15
  end
12
16
 
13
17
  private
14
18
 
15
- def resolve_refs(obj, base)
16
- return resolve_hash(obj, base) if obj.is_a? Hash
17
- return resolve_array(obj, base) if obj.is_a? Array
19
+ def preload_ref_yamls(abs_path)
20
+ return if @yaml.has_key?(abs_path)
21
+
22
+ @yaml[abs_path] = YAML.load_file(abs_path)
23
+ find_refs(@yaml[abs_path]).each do |ref_target|
24
+ rel_path, pos = ref_target.split('#')
25
+ preload_ref_yamls(File.expand_path(rel_path, File.dirname(abs_path)))
26
+ end
27
+ end
28
+
29
+ def find_refs(obj)
30
+ do_find_refs(obj).flatten.compact
31
+ end
32
+
33
+ def do_find_refs(obj)
34
+ return do_find_refs_hash(obj) if obj.is_a? Hash
35
+ return do_find_refs_array(obj) if obj.is_a? Array
36
+ return []
37
+ end
38
+
39
+ def do_find_refs_hash(hash)
40
+ hash.inject([]) {|acc, (key, val)| acc << (key == @key ? val : do_find_refs(val)) }
41
+ end
42
+
43
+ def do_find_refs_array(array)
44
+ array.map {|e| find_refs(e) }
45
+ end
46
+
47
+ def resolve_refs(obj, referrer)
48
+ return resolve_hash(obj, referrer) if obj.is_a? Hash
49
+ return resolve_array(obj, referrer) if obj.is_a? Array
18
50
  return obj
19
51
  end
20
52
 
21
- def resolve_hash(hash, base)
22
- resolved = hash.map do |k, v|
23
- if k == @key
24
- path, pos = v.split('#')
25
- ref_path = File.join(base, path)
26
- ref = self.resolve(ref_path)
53
+ def resolve_hash(hash, referrer)
54
+ resolved = hash.map do |key, val|
55
+ if key == @key
56
+ path, pos = val.split('#')
57
+ ref_path = File.expand_path(path, File.dirname(referrer))
58
+ pos_keys = pos.split('/').reject {|s| s == "" }
27
59
 
28
- pos.split('/').reject {|e| e == "" }.inject(ref) {|obj, key| obj[key] }
60
+ if pos_keys.size == 0
61
+ resolve_refs(@yaml[ref_path], ref_path)
62
+ else
63
+ resolve_refs(@yaml[ref_path].dig(*pos_keys), ref_path)
64
+ end
29
65
  else
30
- Hash[k, resolve_refs(v, base)]
66
+ Hash[key, resolve_refs(val, referrer)]
31
67
  end
32
68
  end
33
69
 
34
70
  resolved.inject{|h1, h2| h1.merge h2 }
35
71
  end
36
72
 
37
- def resolve_array(array, base)
38
- array.map {|e| resolve_refs(e, base) }
73
+ def resolve_array(array, referrer)
74
+ array.map {|e| resolve_refs(e, referrer) }
39
75
  end
40
76
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yaml_ref_resolver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe-noh
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-28 00:00:00.000000000 Z
11
+ date: 2017-01-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -107,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
107
  version: '0'
108
108
  requirements: []
109
109
  rubyforge_project:
110
- rubygems_version: 2.6.8
110
+ rubygems_version: 2.5.1
111
111
  signing_key:
112
112
  specification_version: 4
113
113
  summary: Resolves referencing to other YAML files.