open_api_parser 1.2.2 → 1.2.3

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: 1e29cb55b6c982a638d0a344591e7e0b491770ec
4
- data.tar.gz: 4138d2987f1be3dddf22b3431ca7e56c0e6a2e23
3
+ metadata.gz: bb1e58a744378c59f9ee81c24d755d8646bf9541
4
+ data.tar.gz: 76272f7d191a2e31bfccfcb408909fa5df624574
5
5
  SHA512:
6
- metadata.gz: 4da0a3bee64fe0b9f4d0cf77fd48f8b406ff84fc01a50c3ea0a545c5577f103b795f1cf5c3b7527656def4f499f4d1c5832c3836575556c19adadd5bb073d9ea
7
- data.tar.gz: ee83943fee6d5b95faaf6f52ccce0c61bb2a76d0e91214dcca07b9f0cdae761977b7a4ae7a5daca10fe938daaad9de2f7ac917ebfca9051ef24f2d0747ea2d96
6
+ metadata.gz: 74196435e01d89cf94061e50606d0245c6d27de84778da4172289882ccf48317bd7ebdd8b75e7b7231bd6dfb13da9644da87e8420bbd16115fae4ae9ccab95cb
7
+ data.tar.gz: 97151dab417f912d4180ce34c00ed8f9d0552a7c7b6753db3c073455d172de0d1c9406e83d44aeeebd6442c493c3113c7931cc3916132de0e5735e99c14f12da
data/.gitignore CHANGED
@@ -11,3 +11,4 @@
11
11
  /.ruby-version
12
12
  /vendor/bundle
13
13
  /open_api_parser*.gem
14
+ /bin
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.2.3
4
+
5
+ * Handle circular references during resolution
6
+
3
7
  ## 1.2.2
4
8
 
5
9
  * Use `json-schema` to validate meta schema
@@ -1,6 +1,6 @@
1
1
  module OpenApiParser
2
2
  class Document
3
- def self.resolve(path, file_cache=OpenApiParser::FileCache.new)
3
+ def self.resolve(path, file_cache = OpenApiParser::FileCache.new)
4
4
  file_cache.get(path) do
5
5
  content = YAML.load_file(path)
6
6
  Document.new(path, content, file_cache).resolve
@@ -14,36 +14,36 @@ module OpenApiParser
14
14
  end
15
15
 
16
16
  def resolve
17
- deeply_expand_refs(@content)
17
+ deeply_expand_refs(@content, nil)
18
18
  end
19
19
 
20
20
  private
21
21
 
22
- def deeply_expand_refs(fragment)
23
- fragment = expand_refs(fragment)
22
+ def deeply_expand_refs(fragment, cur_path)
23
+ fragment, cur_path = expand_refs(fragment, cur_path)
24
24
 
25
25
  if fragment.is_a?(Hash)
26
26
  fragment.reduce({}) do |hash, (k, v)|
27
- hash.merge(k => deeply_expand_refs(v))
27
+ hash.merge(k => deeply_expand_refs(v, "#{cur_path}/#{k}"))
28
28
  end
29
29
  elsif fragment.is_a?(Array)
30
- fragment.map { |e| deeply_expand_refs(e) }
30
+ fragment.map { |e| deeply_expand_refs(e, cur_path) }
31
31
  else
32
32
  fragment
33
33
  end
34
34
  end
35
35
 
36
- def expand_refs(fragment)
37
- if fragment.is_a?(Hash) && fragment.has_key?("$ref")
36
+ def expand_refs(fragment, cur_path)
37
+ if fragment.is_a?(Hash) && fragment.key?("$ref")
38
38
  ref = fragment["$ref"]
39
39
 
40
- if ref =~ /\Afile:/
40
+ if ref.start_with?("file:")
41
41
  expand_file(ref)
42
42
  else
43
- expand_pointer(ref)
43
+ expand_pointer(ref, cur_path)
44
44
  end
45
45
  else
46
- fragment
46
+ [fragment, cur_path]
47
47
  end
48
48
  end
49
49
 
@@ -54,11 +54,15 @@ module OpenApiParser
54
54
  Document.resolve(absolute_path, @file_cache)
55
55
  end
56
56
 
57
- def expand_pointer(ref)
57
+ def expand_pointer(ref, cur_path)
58
58
  pointer = OpenApiParser::Pointer.new(ref)
59
- fragment = pointer.resolve(@content)
60
59
 
61
- expand_refs(fragment)
60
+ if pointer.exists_in_path?(cur_path)
61
+ { "$ref" => ref }
62
+ else
63
+ fragment = pointer.resolve(@content)
64
+ expand_refs(fragment, cur_path + pointer.escaped_pointer)
65
+ end
62
66
  end
63
67
  end
64
68
  end
@@ -12,7 +12,9 @@ module OpenApiParser
12
12
  end
13
13
  end
14
14
 
15
- private
15
+ def exists_in_path?(path)
16
+ path.include?(escaped_pointer)
17
+ end
16
18
 
17
19
  def escaped_pointer
18
20
  if @raw_pointer.start_with?("#")
@@ -22,6 +24,8 @@ module OpenApiParser
22
24
  end
23
25
  end
24
26
 
27
+ private
28
+
25
29
  def parse_token(token)
26
30
  if token =~ /\A\d+\z/
27
31
  token.to_i
@@ -32,11 +36,7 @@ module OpenApiParser
32
36
 
33
37
  def tokens
34
38
  tokens = escaped_pointer[1..-1].split("/")
35
-
36
- if @raw_pointer.end_with?("/")
37
- tokens << ""
38
- end
39
-
39
+ tokens << "" if @raw_pointer.end_with?("/")
40
40
  tokens.map do |token|
41
41
  parse_token(token)
42
42
  end
@@ -1,3 +1,3 @@
1
1
  module OpenApiParser
2
- VERSION = "1.2.2".freeze
2
+ VERSION = "1.2.3".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: open_api_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Braintree
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-10 00:00:00.000000000 Z
11
+ date: 2017-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -127,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
127
  version: '0'
128
128
  requirements: []
129
129
  rubyforge_project:
130
- rubygems_version: 2.2.2
130
+ rubygems_version: 2.6.14
131
131
  signing_key:
132
132
  specification_version: 4
133
133
  summary: A parser for Open API specifications