yaml_ref_resolver 0.4.1 → 0.4.2

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: 2565dc38efb9a0e8317a54550ddc80e81fc312fd
4
- data.tar.gz: 08d97334000c2e541367b696b579dca8db7e9ce2
3
+ metadata.gz: b15959cdb30b6bd1175233f3c88618cd02654ace
4
+ data.tar.gz: 11dab92dca480e42528fdcaa75018099dd70fa32
5
5
  SHA512:
6
- metadata.gz: 380e942e7dd2ba9327d0d9a959d4270fa3da2af89df909b29c22afe3a1f3e26d4f3d4036bc6e4c973c73e95b95f209bd5c5cc7172ea08c6cc65ed82f6ef9c6b1
7
- data.tar.gz: eb3680a4034ea315ce9794de10f2234c3579e0f3d582c791048f32fefe35b00a9d7aee21f12db24eb34ccdf2bdccb920d866161a6154fce31f5fd3beb5cabd77
6
+ metadata.gz: 7dbe62b28a440a9be12fe06546a4f34f7d7df1b091d22297ea4c9427febbba7dbc7d1b4e721bb5d4ef330e1cfba430a9b5638198cd948bcf36fa62081b3f4ae5
7
+ data.tar.gz: 4e196c70f1a6711faad5bcc72b4539fb18c3c67797a8084a8ad1307e51c15b89adbf65a0eb6766fc0443a2387f5d2f5be7c248ee2d958884bfa3ebd687ebbdd3
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/yaml_ref_resolver.svg)](https://badge.fury.io/rb/yaml_ref_resolver)
4
4
  [![Build Status](https://travis-ci.org/Joe-noh/yaml_ref_resolver.svg?branch=master)](https://travis-ci.org/Joe-noh/yaml_ref_resolver)
5
5
 
6
- This is a gem that resolves `$ref` references to other YAML files.
6
+ This is a gem that resolves and expands `$ref` references to other YAML files.
7
7
 
8
8
  ## Installation
9
9
 
@@ -61,7 +61,7 @@ Optionally output file path with `-o` or `--output` can be given.
61
61
  $ yaml_ref_resolver -i ./path/to/index.yaml -o ./path/to/output.yaml
62
62
  ```
63
63
 
64
- `-w` or `--watch` options watches referenced yaml files and dump whole resolved yaml when one of them changed.
64
+ `-w` or `--watch` option watches referenced yaml files and dump whole resolved yaml when one of them changed.
65
65
 
66
66
  ```console
67
67
  $ yaml_ref_resolver -i ./path/to/index.yaml -w
@@ -0,0 +1,24 @@
1
+ class YamlRefResolver::Ref
2
+ def initialize(target, base_path)
3
+ @base_dir = File.dirname(base_path)
4
+
5
+ if target.start_with?("#")
6
+ @target_file = nil
7
+ @target_level = target.sub("#", "")
8
+ elsif !target.include?("#")
9
+ @target_file = target
10
+ @target_level = "/"
11
+ else
12
+ @target_file, @target_level = target.split("#")
13
+ end
14
+ end
15
+
16
+ def abs_path
17
+ File.expand_path(@target_file, @base_dir)
18
+ end
19
+
20
+ def target_keys
21
+ @target_level.split("/").reject {|s| s == "" }
22
+ end
23
+ end
24
+
@@ -1,3 +1,3 @@
1
1
  class YamlRefResolver
2
- VERSION = "0.4.1"
2
+ VERSION = "0.4.2"
3
3
  end
@@ -0,0 +1,36 @@
1
+ require "yaml_ref_resolver/ref"
2
+ require "yaml"
3
+
4
+ class YamlRefResolver::Yaml
5
+ attr_reader :content
6
+
7
+ def initialize(path:, key: '$ref')
8
+ @filepath = path
9
+ @key = key
10
+ @content = YAML.load_file(path)
11
+ end
12
+
13
+ def refs
14
+ find_refs(@content).flatten.compact.map do |ref|
15
+ YamlRefResolver::Ref.new(ref, @filepath)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def find_refs(obj)
22
+ return find_refs_hash(obj) if obj.is_a? Hash
23
+ return find_refs_array(obj) if obj.is_a? Array
24
+ return []
25
+ end
26
+
27
+ def find_refs_hash(hash)
28
+ hash.inject([]) do |acc, (key, val)|
29
+ acc << (key == @key ? val : find_refs(val))
30
+ end
31
+ end
32
+
33
+ def find_refs_array(array)
34
+ array.map {|elem| find_refs(elem) }
35
+ end
36
+ end
@@ -1,58 +1,39 @@
1
1
  require "yaml_ref_resolver/version"
2
- require "yaml"
2
+ require "yaml_ref_resolver/yaml"
3
3
 
4
4
  class YamlRefResolver
5
5
  def initialize(opts = {})
6
6
  @key = opts[:key] || '$ref'
7
- @yaml = {}
7
+ @map = {}
8
8
  end
9
9
 
10
10
  def resolve(path)
11
11
  entry_point = File.expand_path(path)
12
- preload_ref_yamls(entry_point)
12
+ preload(entry_point)
13
13
 
14
- resolve_refs(@yaml[entry_point], entry_point)
14
+ resolve_refs(@map[entry_point].content, entry_point)
15
15
  end
16
16
 
17
17
  def reload(path)
18
- @yaml.delete(path)
19
- preload_ref_yamls(path)
18
+ @map.delete(path)
19
+ preload(path)
20
20
  end
21
21
 
22
22
  def files
23
- @yaml.keys
23
+ @map.keys
24
24
  end
25
25
 
26
26
  private
27
27
 
28
- def preload_ref_yamls(abs_path)
29
- return if @yaml.has_key?(abs_path)
28
+ def preload(abs_path)
29
+ return if @map.has_key?(abs_path)
30
30
 
31
- @yaml[abs_path] = YAML.load_file(abs_path)
32
- find_refs(@yaml[abs_path]).each do |ref_target|
33
- rel_path, pos = parse_ref(ref_target)
34
- preload_ref_yamls(File.expand_path(rel_path, File.dirname(abs_path)))
31
+ @map[abs_path] = Yaml.new(path: abs_path, key: @key)
32
+ @map[abs_path].refs.each do |ref|
33
+ preload(ref.abs_path)
35
34
  end
36
35
  end
37
36
 
38
- def find_refs(obj)
39
- do_find_refs(obj).flatten.compact
40
- end
41
-
42
- def do_find_refs(obj)
43
- return do_find_refs_hash(obj) if obj.is_a? Hash
44
- return do_find_refs_array(obj) if obj.is_a? Array
45
- return []
46
- end
47
-
48
- def do_find_refs_hash(hash)
49
- hash.inject([]) {|acc, (key, val)| acc << (key == @key ? val : do_find_refs(val)) }
50
- end
51
-
52
- def do_find_refs_array(array)
53
- array.map {|e| find_refs(e) }
54
- end
55
-
56
37
  def resolve_refs(obj, referrer)
57
38
  return resolve_hash(obj, referrer) if obj.is_a? Hash
58
39
  return resolve_array(obj, referrer) if obj.is_a? Array
@@ -62,14 +43,15 @@ class YamlRefResolver
62
43
  def resolve_hash(hash, referrer)
63
44
  resolved = hash.map do |key, val|
64
45
  if key == @key
65
- path, pos = parse_ref(val)
66
- ref_path = File.expand_path(path, File.dirname(referrer))
67
- pos_keys = pos.split('/').reject {|s| s == "" }
46
+ ref = Ref.new(val, referrer)
47
+
48
+ ref_path = ref.abs_path
49
+ target_keys = ref.target_keys
68
50
 
69
- if pos_keys.size == 0
70
- resolve_refs(@yaml[ref_path], ref_path)
51
+ if target_keys.size == 0
52
+ resolve_refs(@map[ref_path].content, ref_path)
71
53
  else
72
- resolve_refs(@yaml[ref_path].dig(*pos_keys), ref_path)
54
+ resolve_refs(@map[ref_path].content.dig(*target_keys), ref_path)
73
55
  end
74
56
  else
75
57
  Hash[key, resolve_refs(val, referrer)]
@@ -82,14 +64,4 @@ class YamlRefResolver
82
64
  def resolve_array(array, referrer)
83
65
  array.map {|e| resolve_refs(e, referrer) }
84
66
  end
85
-
86
- def parse_ref(ref)
87
- splitted = ref.split('#')
88
-
89
- if splitted.size == 1
90
- splitted << '/'
91
- else
92
- splitted
93
- end
94
- end
95
67
  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.4.1
4
+ version: 0.4.2
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-02-10 00:00:00.000000000 Z
11
+ date: 2017-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: filewatcher
@@ -99,7 +99,9 @@ files:
99
99
  - exe/yaml_ref_resolver
100
100
  - lib/yaml_ref_resolver.rb
101
101
  - lib/yaml_ref_resolver/cli.rb
102
+ - lib/yaml_ref_resolver/ref.rb
102
103
  - lib/yaml_ref_resolver/version.rb
104
+ - lib/yaml_ref_resolver/yaml.rb
103
105
  - yaml_ref_resolver.gemspec
104
106
  homepage: https://github.com/Joe-noh/yaml_ref_resolver
105
107
  licenses: