api_schema 0.1.9.2 → 0.2.0

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: d2f3fa661280ba4f60948f92da8669f4013e1b63
4
- data.tar.gz: 22769f27db184bb796ee0be2ba99dea47e3e03dc
3
+ metadata.gz: ce61bc89fdc9a8d2447e7f959c2403984663af40
4
+ data.tar.gz: 04c4b334df2e0ee12b56701119da990e054c1848
5
5
  SHA512:
6
- metadata.gz: 52520e379c716b67a84f75a8903e2c89996db60b312017a57e7859f13ab4f77261c0452d8f26f6ee9a7cce085c8f885e05632b35f29663ff22204ebd92c982cc
7
- data.tar.gz: fe7b458da9aee9e783cfaf5422896bc1bcae82968c79077580dd1df4d357abbd2831d214bd16dd5aff556e5487a34d7ecc06395b6854a7fb8294827bf4d6ac56
6
+ metadata.gz: dd6866e8eda8b81328f14e72934efc3a5cf7d685b576fd90bb54bd43088a429f8c1b17e0950cbdbd0f874c1051bf1539dc76ffd0f0e4e078fca6778a37d997d8
7
+ data.tar.gz: 0f5d08c060d02c8803ad3885f7e3a94d8472029e8b69803fa3a229d89e1a12144ea2132fce6400002c038a821cc7761f42fb246ac3590aa1705b7253756eaeb0
data/api_schema.gemspec CHANGED
@@ -28,4 +28,5 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency "bundler", "~> 1.14"
29
29
  spec.add_development_dependency "rake", "~> 10.0"
30
30
  spec.add_development_dependency "rspec", "~> 3.0"
31
+ spec.add_development_dependency "pry", "~> 0.11.3"
31
32
  end
@@ -1,11 +1,95 @@
1
+ require 'pry'
1
2
  module ApiSchema
2
3
  class ApiVersion
3
- attr_accessor :configuration, :resources, :serializers
4
+ attr_accessor :configuration, :resources, :serializers, :imported_versions, :errors
4
5
 
5
6
  def initialize(configuration)
6
7
  @configuration = configuration
7
8
  @resources = []
8
9
  @serializers = []
10
+ @imported_versions = []
11
+ @errors = {}
12
+ end
13
+
14
+
15
+ def check_consistency
16
+ check_serializers_consistency
17
+ check_resources_consistency
18
+
19
+ raise UndefinedSerializersError, error_message unless errors.empty?
20
+ end
21
+
22
+ private
23
+
24
+ def check_serializers_consistency
25
+ serializers.each do |serializer|
26
+ serializer.prior_references.each do |reference|
27
+ add_errors(:undefined_reference, reference) unless find_or_import(reference.id)
28
+ end
29
+ end
30
+ end
31
+
32
+ def check_resources_consistency
33
+ resources.each do |resource|
34
+ add_errors(:undefined_body, resource) unless find_or_import(resource.body_param)
35
+ add_errors(:undefined_response, resource) unless find_or_import(resource.resp.model)
36
+ end
37
+ end
38
+
39
+ def find_or_import(serializer_id)
40
+ return true unless serializer_id
41
+ return true if find_in_version(self, serializer_id)
42
+ return true if find_in_another_version(serializer_id)
43
+ end
44
+
45
+ def find_in_another_version(serializer_id)
46
+ imported_versions.each do |import|
47
+ version = imported_version(import)
48
+ serializer = find_in_version(version, serializer_id)
49
+ return serializers << serializer if serializer
50
+ end
51
+
52
+ false
53
+ end
54
+
55
+ def find_in_version(version, serializer_id)
56
+ version.serializers.detect { |s| s.id == serializer_id }
57
+ end
58
+
59
+ def imported_version(import)
60
+ "#{import.name.capitalize}::#{import.version.capitalize}::BaseDocs".constantize.api_version
61
+ end
62
+
63
+ def add_errors(key, object)
64
+ errors[key] ||= []
65
+ errors[key] << object
66
+ end
67
+
68
+ def error_message
69
+ message = errors.reduce([]) do |memo, (key, errors)|
70
+ case key
71
+ when :undefined_body
72
+ memo += errors.map(&self.method(:body_error))
73
+ when :undefined_response
74
+ memo += errors.map(&self.method(:response_error))
75
+ when :undefined_reference
76
+ memo += errors.map(&self.method(:reference_error))
77
+ end
78
+ end
79
+
80
+ message.join(" \n")
81
+ end
82
+
83
+ def body_error(object)
84
+ "There is no '#{object.body_param}' body parameter defined for #{object.base_path} resource. Please define it with 'request_body' method"
85
+ end
86
+
87
+ def response_error(object)
88
+ "There is no '#{object.resp.model}' response defined for '#{object.summary}' resource. Please define it with 'serializer' method"
89
+ end
90
+
91
+ def reference_error(object)
92
+ "Reference #{object.id} is not defined"
9
93
  end
10
94
  end
11
95
  end
@@ -0,0 +1,5 @@
1
+ class UndefinedSerializersError < StandardError
2
+ def initialize(msg)
3
+ super
4
+ end
5
+ end
@@ -68,16 +68,6 @@ module ApiSchema
68
68
  !!body_param
69
69
  end
70
70
 
71
- def body_defined?
72
- return true if api_version.serializers.detect {|s| s.id == body_param }
73
- raise "There is no '#{body_param}' body parameter defined for #{full_path} resource. Please define it with 'request_body' method"
74
- end
75
-
76
- def response_defined?
77
- return true if resp.model.nil? || api_version.serializers.detect {|s| s.id == resp.model }
78
- raise "There is no '#{resp.model}' response defined for ''#{summary} resource'. Please define it with 'serializer' method"
79
- end
80
-
81
71
  def with_errors?
82
72
  !errors.empty?
83
73
  end
@@ -112,7 +102,7 @@ module ApiSchema
112
102
  security do
113
103
  key :authorization, []
114
104
  end
115
- body_param(r.body_param) if r.with_body? && r.body_defined?
105
+ body_param(r.body_param) if r.with_body?
116
106
 
117
107
  r.header_params.each do |p|
118
108
  header_param(p.name, p.type, p.required)
@@ -124,7 +114,7 @@ module ApiSchema
124
114
  query_param(p.name, p.type, p.required)
125
115
  end
126
116
 
127
- success_response(r.resp.code, r.resp.model, r.resp.fields) if r.response_defined?
117
+ success_response(r.resp.code, r.resp.model, r.resp.fields)
128
118
  error_responses(error_model, error_desc, *r.errors) if r.with_errors?
129
119
  end
130
120
  end
@@ -18,6 +18,11 @@ module ApiSchema
18
18
  @version_serializers = {}
19
19
  end
20
20
 
21
+ def import_serializers_from(name, version)
22
+ @api_version.imported_versions << OpenStruct.new(name: name,
23
+ version: version)
24
+ end
25
+
21
26
  def api_version
22
27
  @api_version
23
28
  end
@@ -32,6 +37,10 @@ module ApiSchema
32
37
 
33
38
  def generate_json
34
39
  @api_version.configuration.build
40
+ @api_version.serializers.each { |s| s.build_references(version_serializers) }
41
+
42
+ @api_version.check_consistency
43
+
35
44
  @api_version.serializers.each { |s| s.build(version_serializers) }
36
45
  @api_version.resources.each { |r| r.build(version_resources) }
37
46
 
@@ -5,7 +5,7 @@ module ApiSchema
5
5
  PriorReference = ::Struct.new(:id, :type, :desc)
6
6
 
7
7
  attr_reader :id, :fields, :references, :parent
8
- attr_accessor :type, :name, :description
8
+ attr_accessor :type, :name, :description, :prior_references
9
9
 
10
10
  def initialize(id, type, serializers, name=nil, parent_id = nil)
11
11
  @id = id
@@ -1,3 +1,3 @@
1
1
  module ApiSchema
2
- VERSION = "0.1.9.2"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/api_schema.rb CHANGED
@@ -14,6 +14,7 @@ require "api_schema/serializer_definition"
14
14
  require "api_schema/serializer_methods"
15
15
  require "api_schema/resource_definition"
16
16
  require "api_schema/resource_methods"
17
+ require "api_schema/exceptions/undefined_serializers_error.rb"
17
18
  require "api_schema/version"
18
19
 
19
20
  module ApiSchema
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api_schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Chopey
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-02-20 00:00:00.000000000 Z
11
+ date: 2018-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.11.3
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.11.3
83
97
  description: |-
84
98
  api_schema provides a framework and DSL for describing APIs
85
99
  and generate swagger json using minimalistic, schema.db-like syntax.
@@ -103,6 +117,7 @@ files:
103
117
  - lib/api_schema.rb
104
118
  - lib/api_schema/api_version.rb
105
119
  - lib/api_schema/configuration.rb
120
+ - lib/api_schema/exceptions/undefined_serializers_error.rb
106
121
  - lib/api_schema/field.rb
107
122
  - lib/api_schema/patches/operation_node.rb
108
123
  - lib/api_schema/patches/property_node.rb