ropen_pi 0.1.1 → 0.4.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 +4 -4
- data/.devcontainer/Dockerfile +77 -0
- data/.devcontainer/base.Dockerfile +43 -0
- data/.devcontainer/devcontainer.json +46 -0
- data/.gitignore +1 -0
- data/.husky/.gitignore +1 -0
- data/.husky/commit-msg +4 -0
- data/.rspec +3 -0
- data/.rubocop.yml +4 -0
- data/.rubocop_todo.yml +133 -27
- data/Gemfile.lock +176 -119
- data/LICENSE +1 -1
- data/Makefile +42 -0
- data/README.md +7 -7
- data/examples/.envrc +2 -2
- data/examples/Gemfile +7 -10
- data/examples/Gemfile.lock +13 -9
- data/examples/docker-compose.yml +1 -5
- data/lib/generators/ropen_pi/install_generator.rb +7 -6
- data/lib/generators/ropen_pi/templates/ropen_pi_helper.rb +1 -1
- data/lib/ropen_pi/config_helper.rb +34 -17
- data/lib/ropen_pi/specs/configuration.rb +32 -28
- data/lib/ropen_pi/specs/example_group_helpers.rb +8 -5
- data/lib/ropen_pi/specs/request_factory.rb +3 -3
- data/lib/ropen_pi/specs/writer.rb +1 -3
- data/lib/ropen_pi/version.rb +1 -1
- data/package-lock.json +5403 -0
- data/package.json +59 -0
- data/ropen_pi.gemspec +7 -6
- metadata +50 -12
@@ -35,6 +35,15 @@ module RopenPi
|
|
35
35
|
.merge(opts)
|
36
36
|
end
|
37
37
|
|
38
|
+
def self.param_in_header(name, schema_type, fmt: nil, desc: 'tba', opts: {})
|
39
|
+
param(name, schema_type, fmt: fmt, desc: desc, opts: opts)
|
40
|
+
.merge(
|
41
|
+
in: 'header',
|
42
|
+
required: false
|
43
|
+
)
|
44
|
+
.merge(opts)
|
45
|
+
end
|
46
|
+
|
38
47
|
def self.param(name, schema_type, fmt: nil, desc: 'tba', opts: {})
|
39
48
|
{
|
40
49
|
name: name.to_s,
|
@@ -57,51 +66,60 @@ module RopenPi
|
|
57
66
|
enum: values
|
58
67
|
}
|
59
68
|
end
|
69
|
+
|
70
|
+
class << self
|
71
|
+
alias boolean_param bool_param
|
72
|
+
alias integer_param int_param
|
73
|
+
end
|
60
74
|
end
|
61
75
|
|
62
76
|
module Type
|
63
|
-
def self.date_time_type(opts = {})
|
64
|
-
string_type(opts).merge(format: 'date-time'
|
77
|
+
def self.date_time_type(opts = { example: '2020-02-02' })
|
78
|
+
string_type(opts).merge(format: 'date-time')
|
65
79
|
end
|
66
80
|
|
67
|
-
def self.email_type(opts = {})
|
68
|
-
string_type(opts).merge(format: 'email'
|
81
|
+
def self.email_type(opts = { example: 'han.solo@example.com' })
|
82
|
+
string_type(opts).merge(format: 'email')
|
69
83
|
end
|
70
84
|
|
71
|
-
def self.uuid_type(opts = {})
|
72
|
-
string_type(opts).merge(format: 'uuid'
|
85
|
+
def self.uuid_type(opts = { example: 'abcd12-1234ab-abcdef123' })
|
86
|
+
string_type(opts).merge(format: 'uuid')
|
73
87
|
end
|
74
88
|
|
75
|
-
def self.string_type(opts = {})
|
76
|
-
type('string', opts)
|
89
|
+
def self.string_type(opts = { example: 'Example string' })
|
90
|
+
type('string', opts)
|
77
91
|
end
|
78
92
|
|
79
|
-
def self.integer_type(opts = {})
|
80
|
-
type('integer', opts)
|
93
|
+
def self.integer_type(opts = { example: 1 })
|
94
|
+
type('integer', opts)
|
81
95
|
end
|
82
96
|
|
83
|
-
def self.bool_type(opts = {})
|
84
|
-
type('boolean', opts)
|
97
|
+
def self.bool_type(opts = { example: true })
|
98
|
+
type('boolean', opts)
|
85
99
|
end
|
86
100
|
|
87
101
|
def self.type(thing, opts = {})
|
88
|
-
{ type: thing
|
102
|
+
{ type: thing }.merge(opts)
|
89
103
|
end
|
90
104
|
|
91
105
|
def self.string_array_type(opts = {})
|
92
106
|
{
|
93
107
|
type: 'array',
|
94
108
|
items: { type: 'string', example: 'Example string' }
|
95
|
-
|
109
|
+
}.merge(opts)
|
96
110
|
end
|
97
111
|
|
98
112
|
def self.ref_type(ref)
|
99
113
|
{ '$ref': ref }
|
100
114
|
end
|
115
|
+
|
116
|
+
class << self
|
117
|
+
alias boolean_type bool_type
|
118
|
+
alias int_type integer_type
|
119
|
+
end
|
101
120
|
end
|
102
121
|
|
103
122
|
module Response
|
104
|
-
# rubocop:disable Metrics/MethodLength
|
105
123
|
def self.collection(ref, desc: 'tba', type: RopenPi::APP_JSON)
|
106
124
|
{
|
107
125
|
description: desc,
|
@@ -109,7 +127,7 @@ module RopenPi
|
|
109
127
|
type => {
|
110
128
|
schema: {
|
111
129
|
type: 'object',
|
112
|
-
properties: { data: { type:
|
130
|
+
properties: { data: { type: :array, items: { '$ref': ref } } }
|
113
131
|
}
|
114
132
|
}
|
115
133
|
}
|
@@ -129,6 +147,5 @@ module RopenPi
|
|
129
147
|
}
|
130
148
|
}
|
131
149
|
end
|
132
|
-
# rubocop:enable Metrics/MethodLength
|
133
150
|
end
|
134
151
|
end
|
@@ -1,41 +1,45 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
module RopenPi
|
3
|
+
module Specs
|
4
|
+
class Configuration
|
5
|
+
def initialize(rspec_config)
|
6
|
+
@rspec_config = rspec_config
|
7
|
+
end
|
2
8
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
end
|
9
|
+
def root_dir
|
10
|
+
@root_dir ||= begin
|
11
|
+
raise ConfigurationError, 'No root_dir provided. See open_api_helper.rb' if @rspec_config.root_dir.nil?
|
7
12
|
|
8
|
-
|
9
|
-
|
10
|
-
|
13
|
+
@rspec_config.root_dir
|
14
|
+
end
|
15
|
+
end
|
11
16
|
|
12
|
-
|
13
|
-
|
14
|
-
|
17
|
+
def open_api_output_format
|
18
|
+
@open_api_output_format ||= begin
|
19
|
+
@rspec_config.open_api_output_format || :json
|
20
|
+
end
|
21
|
+
end
|
15
22
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
23
|
+
def open_api_docs
|
24
|
+
@open_api_docs ||= begin
|
25
|
+
if @rspec_config.open_api_docs.nil? || @rspec_config.open_api_docs.empty?
|
26
|
+
raise ConfigurationError, 'No open_api_docs defined. See open_api_helper.rb'
|
27
|
+
end
|
21
28
|
|
22
|
-
|
23
|
-
|
24
|
-
if @rspec_config.open_api_docs.nil? || @rspec_config.open_api_docs.empty?
|
25
|
-
raise ConfigurationError, 'No open_api_docs defined. See open_api_helper.rb'
|
29
|
+
@rspec_config.open_api_docs
|
30
|
+
end
|
26
31
|
end
|
27
32
|
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
def get_doc(name)
|
33
|
-
return open_api_docs.values.first if name.nil?
|
33
|
+
def get_doc(name)
|
34
|
+
return open_api_docs.values.first if name.nil?
|
34
35
|
|
35
|
-
|
36
|
+
raise ConfigurationError, "Unknown doc '#{name}'" unless open_api_docs[name]
|
36
37
|
|
37
|
-
|
38
|
+
open_api_docs[name]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class ConfigurationError < StandardError; end
|
38
43
|
end
|
39
44
|
end
|
40
45
|
|
41
|
-
class ConfigurationError < StandardError; end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
# @TODO: replace hashie!
|
3
4
|
require 'hashie'
|
4
5
|
|
@@ -105,18 +106,19 @@ module RopenPi
|
|
105
106
|
# rubocop:enable Metrics/MethodLength
|
106
107
|
|
107
108
|
def request_body_text_plain(required: false, description: nil, examples: nil)
|
108
|
-
content_hash = { 'test/plain' => { schema: {type: :string}, examples: examples }.compact! || {} }
|
109
|
+
content_hash = { 'test/plain' => { schema: { type: :string }, examples: examples }.compact! || {} }
|
109
110
|
request_body(description: description, required: required, content: content_hash)
|
110
111
|
end
|
111
112
|
|
112
113
|
# TODO: add examples to this like we can for json, might be large lift
|
113
114
|
# as many assumptions are made on content-type
|
114
|
-
def request_body_xml(schema:,required: false, description: nil, examples: nil)
|
115
|
-
passed_examples = Array(examples)
|
115
|
+
def request_body_xml(schema:, required: false, description: nil, examples: nil)
|
116
|
+
# passed_examples = Array(examples)
|
116
117
|
content_hash = { 'application/xml' => { schema: schema, examples: examples }.compact! || {} }
|
117
118
|
request_body(description: description, required: required, content: content_hash)
|
118
119
|
end
|
119
120
|
|
121
|
+
# rubocop:disable Metrics/MethodLength
|
120
122
|
def request_body_multipart(schema:, description: nil)
|
121
123
|
content_hash = { 'multipart/form-data' => { schema: schema } }
|
122
124
|
request_body(description: description, content: content_hash)
|
@@ -145,6 +147,7 @@ module RopenPi
|
|
145
147
|
end
|
146
148
|
end
|
147
149
|
end
|
150
|
+
# rubocop:enable Metrics/MethodLength
|
148
151
|
|
149
152
|
def parameter(attributes)
|
150
153
|
attributes[:required] = true if attributes[:in] && attributes[:in].to_sym == :path
|
@@ -165,7 +168,7 @@ module RopenPi
|
|
165
168
|
end
|
166
169
|
|
167
170
|
def schema(value, content_type: 'application/json')
|
168
|
-
content_hash = {content_type => {schema: value}}
|
171
|
+
content_hash = { content_type => { schema: value } }
|
169
172
|
metadata[:response][:content] = content_hash
|
170
173
|
end
|
171
174
|
|
@@ -173,7 +176,7 @@ module RopenPi
|
|
173
176
|
metadata[:response][:headers] ||= {}
|
174
177
|
|
175
178
|
if attributes[:type] && attributes[:schema].nil?
|
176
|
-
attributes[:schema] = {type: attributes[:type]}
|
179
|
+
attributes[:schema] = { type: attributes[:type] }
|
177
180
|
attributes.delete(:type)
|
178
181
|
end
|
179
182
|
|
@@ -77,8 +77,8 @@ class RopenPi::Specs::RequestFactory
|
|
77
77
|
def add_path(request, metadata, open_api_doc, parameters, example)
|
78
78
|
template = (open_api_doc[:basePath] || '') + metadata[:path_item][:template]
|
79
79
|
|
80
|
-
in_path = parameters.select { |p| p[:in] == :path }
|
81
|
-
in_query = parameters.select { |p| p[:in] == :query }
|
80
|
+
in_path = parameters.select { |p| p[:in].to_sym == :path }
|
81
|
+
in_query = parameters.select { |p| p[:in].to_sym == :query }
|
82
82
|
|
83
83
|
request[:path] = template.tap do |inner_template|
|
84
84
|
in_path.each do |p|
|
@@ -161,7 +161,7 @@ class RopenPi::Specs::RequestFactory
|
|
161
161
|
# Rails test infrastructure allows us to send the values directly as a hash
|
162
162
|
# PROS: simple to implement, CONS: serialization/deserialization is bypassed in test
|
163
163
|
tuples = parameters.select { |p| p[:in] == :formData }
|
164
|
-
|
164
|
+
.map { |p| [p[:name], example.send(p[:name])] }
|
165
165
|
Hash[tuples]
|
166
166
|
end
|
167
167
|
|
data/lib/ropen_pi/version.rb
CHANGED