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 +4 -4
- data/lib/yaml_ref_resolver/version.rb +1 -1
- data/lib/yaml_ref_resolver.rb +50 -14
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d7f42af28ee1b2b85cb5657be83f8096e3f34bc
|
4
|
+
data.tar.gz: dcba469e9cf920b111a14b480a6aacb3b4d70d59
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6339ebc5a39a7224861642ad2fe480196eb2c494b694d7087cdeb32f18c3cb061a18dac42a64c186929af3854e6911203a145028648734339df754f8f1976225
|
7
|
+
data.tar.gz: 689dac3c5b409db892cf78b99767142939f58dca790ef44db9d914ab0b21a5465831aa51106f07c71cc173eaa0e6f56785b77fa4ca15253808806819d55731a0
|
data/lib/yaml_ref_resolver.rb
CHANGED
@@ -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
|
-
|
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
|
16
|
-
return
|
17
|
-
|
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,
|
22
|
-
resolved = hash.map do |
|
23
|
-
if
|
24
|
-
path, pos =
|
25
|
-
ref_path = File.
|
26
|
-
|
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
|
-
|
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[
|
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,
|
38
|
-
array.map {|e| resolve_refs(e,
|
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.
|
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-
|
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.
|
110
|
+
rubygems_version: 2.5.1
|
111
111
|
signing_key:
|
112
112
|
specification_version: 4
|
113
113
|
summary: Resolves referencing to other YAML files.
|