yaml_ref_resolver 0.3.0 → 0.3.1

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