zero-params_processor 0.4.0 → 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 +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +0 -3
- data/lib/params_processor.rb +24 -12
- data/lib/params_processor/config.rb +2 -0
- data/lib/params_processor/doc_converter.rb +4 -3
- data/lib/params_processor/param_doc.rb +4 -1
- data/lib/params_processor/type_convert.rb +7 -2
- data/lib/params_processor/validate.rb +12 -6
- data/lib/params_processor/version.rb +3 -1
- data/zero-params_processor.gemspec +5 -4
- metadata +15 -16
- data/Gemfile.lock +0 -157
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6af3afb1c845aebdf43201ba56f36de36be89e14b0708ae574a108070f650088
|
4
|
+
data.tar.gz: 84420bb307c78be64a6951134fed5c5984ada904253268cedcff32f8be0818c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e3e9190fab8af960cf6fd430875d3555df90c47b8c7779268f49a120f6806f6bd1d9643d4b43048f1dfa9b7b4681e1ee72b2be3b8d2f150ba497a024891468b
|
7
|
+
data.tar.gz: 602f1c9906ca11618cb2a5dfd544a33b127add743d6ffd05a8ed197de8da539869e7f446bd396c32796860c67bb149052c74c31d99a3e06b8b15de7dd3a450ab
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -3,9 +3,6 @@ language: ruby
|
|
3
3
|
rvm:
|
4
4
|
- 2.5.1
|
5
5
|
before_install: gem install bundler
|
6
|
-
env:
|
7
|
-
global:
|
8
|
-
- CC_TEST_REPORTER_ID=5f2477af6b38bd4db35abe49930cbae98e867cb3163b2da1a465176b2f0a361c
|
9
6
|
before_script:
|
10
7
|
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
11
8
|
- chmod +x ./cc-test-reporter
|
data/lib/params_processor.rb
CHANGED
@@ -1,8 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'open_api/router'
|
4
|
+
|
1
5
|
require 'params_processor/version'
|
2
6
|
require 'params_processor/validate'
|
3
7
|
require 'params_processor/type_convert'
|
4
8
|
|
5
9
|
module ParamsProcessor
|
10
|
+
cattr_accessor :docs
|
11
|
+
|
6
12
|
private
|
7
13
|
|
8
14
|
def process_params_by(*actions)
|
@@ -12,6 +18,7 @@ module ParamsProcessor
|
|
12
18
|
_validate_param!(param_doc) if actions.index(:validate!)
|
13
19
|
_convert_param(param_doc) if actions.index(:convert)
|
14
20
|
_set_instance_var(param_doc) if actions.index(:set_instance_var)
|
21
|
+
_group_params(param_doc) if param_doc.group
|
15
22
|
param_doc
|
16
23
|
end
|
17
24
|
_set_permitted(pdocs) if actions.index(:set_permitted)
|
@@ -24,7 +31,7 @@ module ParamsProcessor
|
|
24
31
|
|
25
32
|
def _validate_param!(param_doc)
|
26
33
|
input = param_doc.in == 'header' ? request.headers[param_doc.name.to_s] : params[param_doc.name.to_sym]
|
27
|
-
error_class = "
|
34
|
+
error_class = "Error::#{controller_name.camelize}".constantize rescue nil
|
28
35
|
Validate.(input, based_on: param_doc, raise: error_class)
|
29
36
|
end
|
30
37
|
|
@@ -39,14 +46,20 @@ module ParamsProcessor
|
|
39
46
|
end
|
40
47
|
|
41
48
|
def _set_instance_var(param_doc)
|
42
|
-
key = param_doc.real_name
|
43
|
-
return if (value = params[key]).nil?
|
49
|
+
return if (value = params[(key = param_doc.real_name)]).nil?
|
44
50
|
|
45
51
|
instance_variable_set("@#{key}", value)
|
46
52
|
_permit_hash_and_array(value) if param_doc.permit?
|
47
53
|
_auto_find_by_id(key, value) if @route_path.match?(/\{#{key}\}/) # e.g. "/examples/{id}"
|
48
54
|
end
|
49
55
|
|
56
|
+
def _group_params(param_doc)
|
57
|
+
return if (value = params[(key = param_doc.real_name.to_sym)]).nil?
|
58
|
+
|
59
|
+
instance_variable_get("@#{param_doc.group}")&.merge!(key => value) ||
|
60
|
+
instance_variable_set("@#{param_doc.group}", key => value)
|
61
|
+
end
|
62
|
+
|
50
63
|
# If params[:data] == [{..}, {..}], each `{..}` in the array
|
51
64
|
# is an instance of ActionController::Parameters.
|
52
65
|
# So, if :data is allowed to permit, it's values should also permit.
|
@@ -57,7 +70,7 @@ module ParamsProcessor
|
|
57
70
|
def _auto_find_by_id(key, value)
|
58
71
|
whos_id = (key.to_sym == :id ? controller_name : key.to_s.sub('_id', '')).singularize
|
59
72
|
model = whos_id.camelize.constantize rescue return
|
60
|
-
model_instance = model.find_by(id: value) ||
|
73
|
+
model_instance = model.find_by(id: value) || Error::Api.not_found! # TODO HACK
|
61
74
|
instance_variable_set("@#{whos_id}", model_instance)
|
62
75
|
end
|
63
76
|
|
@@ -65,26 +78,25 @@ module ParamsProcessor
|
|
65
78
|
exist_not_permit = params_docs.map(&:not_permit?).any?(&:present?)
|
66
79
|
keys = params_docs.map { |p| p.doced_permit? ? p.real_name : nil }.compact
|
67
80
|
keys = exist_not_permit ? params_docs.map(&:real_name) - keys : keys
|
68
|
-
@permitted = params.permit(*keys)
|
69
|
-
|
81
|
+
# @permitted = params.permit(*keys) TODO
|
82
|
+
@permitted = params.slice(*keys).to_unsafe_h.symbolize_keys
|
70
83
|
end
|
71
84
|
|
72
85
|
def permitted; @permitted end
|
73
86
|
|
74
87
|
# TODO: performance
|
75
88
|
def params_doc
|
76
|
-
current_api = OpenApi.routes_index[self.class.controller_path]
|
77
|
-
return [ ] unless current_api
|
89
|
+
return [ ] unless (current_api = OpenApi.routes_index[self.class.controller_path])
|
78
90
|
|
79
|
-
|
80
|
-
@route_path = OpenApi::
|
81
|
-
path_doc =
|
91
|
+
self.docs ||= DocConverter.new(OpenApi.docs)
|
92
|
+
@route_path = OpenApi::Router.find_path_httpverb_by(self.class.controller_path, action_name).first
|
93
|
+
path_doc = docs[current_api][:paths][@route_path]
|
82
94
|
# nil check is for skipping this before_action when the action is not doced.
|
83
95
|
path_doc&.[](request.method.downcase)&.[](:parameters) || [ ]
|
84
96
|
end
|
85
97
|
|
86
98
|
|
87
99
|
class ValidationFailed < StandardError
|
88
|
-
def info; { code: 400, msg: "#{Config.prefix}"
|
100
|
+
def info; { code: 400, msg: "#{Config.prefix}" + message, http_status: :bad_request }; end
|
89
101
|
end
|
90
102
|
end
|
@@ -1,9 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/hash_with_indifferent_access'
|
2
4
|
|
3
5
|
module ParamsProcessor
|
4
6
|
class DocConverter < HashWithIndifferentAccess
|
5
|
-
cattr_accessor :docs
|
6
|
-
|
7
7
|
def initialize(inhert_hash = { })
|
8
8
|
super(inhert_hash)
|
9
9
|
convert
|
@@ -34,7 +34,8 @@ module ParamsProcessor
|
|
34
34
|
|
35
35
|
# 将 form-data 提到 parameters,方便统一访问接口
|
36
36
|
# 在 param ref 处理之前上提,使后续可以一并将 properties 中的 schma 进行处理
|
37
|
-
form = action_doc[:requestBody]&.[](:content)
|
37
|
+
form = action_doc[:requestBody]&.[](:content)
|
38
|
+
form = form['multipart/form-data'] || form['application/json'] if form # TODO
|
38
39
|
if form.present?
|
39
40
|
required = form[:schema][:required] || [ ]
|
40
41
|
permit = form[:schema][:permit] ? true : false
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/hash_with_indifferent_access'
|
2
4
|
|
3
5
|
module ParamsProcessor
|
@@ -49,12 +51,13 @@ module ParamsProcessor
|
|
49
51
|
one_of: %i[ schema oneOf ],
|
50
52
|
any_of: %i[ schema anyOf ],
|
51
53
|
not_be: %i[ schema not ],
|
52
|
-
is: %i[ schema
|
54
|
+
is: %i[ schema is_a ],
|
53
55
|
dft: %i[ schema default ],
|
54
56
|
as: %i[ schema as ],
|
55
57
|
items: %i[ schema items ],
|
56
58
|
props: %i[ schema properties ],
|
57
59
|
blankable: %i[ schema blankable ],
|
60
|
+
group: %i[ schema group ],
|
58
61
|
permit?: %i[ schema permit ],
|
59
62
|
not_permit?: %i[ schema not_permit ],
|
60
63
|
}.each do |method, path|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ParamsProcessor
|
2
4
|
class TypeConvert
|
3
5
|
class << self
|
@@ -34,16 +36,19 @@ module ParamsProcessor
|
|
34
36
|
when 'date' then parse_time(Date)
|
35
37
|
when 'date-time' then parse_time(DateTime)
|
36
38
|
when 'base64' then @input # Base64.strict_decode64(@input)
|
39
|
+
when 'binary' then @input
|
37
40
|
else @input.to_s
|
38
41
|
end
|
39
42
|
end
|
40
43
|
|
41
44
|
def array
|
42
|
-
@input
|
45
|
+
return @input unless @input.is_a?(String)
|
46
|
+
@input = MultiJson.load(@input)
|
43
47
|
end
|
44
48
|
|
45
49
|
def object
|
46
|
-
@input
|
50
|
+
return @input unless @input.is_a?(String)
|
51
|
+
@input = MultiJson.load(@input)
|
47
52
|
end
|
48
53
|
|
49
54
|
# combined TODO
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'multi_json'
|
2
4
|
require 'params_processor/config'
|
3
5
|
require 'params_processor/doc_converter'
|
@@ -21,7 +23,7 @@ module ParamsProcessor
|
|
21
23
|
@doc = param_doc
|
22
24
|
check (if_is_passed do
|
23
25
|
check if_is_present
|
24
|
-
|
26
|
+
next if @input.nil?# || (@doc.blankable != false && @input.blank? && @input != false)
|
25
27
|
check_combined_types if @doc.combined?
|
26
28
|
check type if @doc.type
|
27
29
|
check size if @doc.size
|
@@ -48,12 +50,13 @@ module ParamsProcessor
|
|
48
50
|
case @doc.type
|
49
51
|
when 'integer' then @str_input.match?(/^-?\d*$/)
|
50
52
|
when 'boolean' then @str_input.in? %w[ true 1 false 0 ]
|
51
|
-
when 'array' then @input.is_a?
|
52
|
-
when 'object' then @input.is_a?(ActionController::Parameters) || @input.is_a?(Hash)
|
53
|
+
when 'array' then @input.is_a?(Array) || (@input.is_a?(String) && @input['['])
|
54
|
+
when 'object' then @input.is_a?(ActionController::Parameters) || @input.is_a?(Hash) ||
|
55
|
+
(@input.is_a?(String) && @input['{'] && @input['}'])
|
53
56
|
when 'number' then _number_type
|
54
57
|
when 'string' then _string_type
|
55
58
|
else true # TODO
|
56
|
-
end or [:wrong_type, @doc.format.to_s]
|
59
|
+
end or [:wrong_type, (@doc.format || @doc.type).to_s]
|
57
60
|
end
|
58
61
|
|
59
62
|
def _number_type
|
@@ -154,6 +157,7 @@ module ParamsProcessor
|
|
154
157
|
|
155
158
|
_doc, _input = @doc, @input
|
156
159
|
items_doc = ParamDoc.new name: @doc.name, schema: @doc.items
|
160
|
+
@input = MultiJson.load(@input) if @input.is_a?(String)
|
157
161
|
@input.each do |input|
|
158
162
|
Validate.(input, based_on: items_doc, raise: @error_class)
|
159
163
|
end
|
@@ -164,11 +168,12 @@ module ParamsProcessor
|
|
164
168
|
return if @doc.props.blank?
|
165
169
|
|
166
170
|
_doc = @doc
|
171
|
+
hash = @input.is_a?(String) ? MultiJson.load(@input) : @input
|
167
172
|
required = (@doc[:schema][:required] || [ ]).map(&:to_s)
|
168
173
|
@doc.props.each do |name, schema|
|
169
174
|
prop_doc = ParamDoc.new name: name, required: required.include?(name), schema: schema
|
170
175
|
_input = @input
|
171
|
-
Validate.(
|
176
|
+
Validate.(hash[name] || hash[name.to_sym], based_on: prop_doc, raise: @error_class)
|
172
177
|
@input = _input
|
173
178
|
end
|
174
179
|
@doc = _doc
|
@@ -176,13 +181,14 @@ module ParamsProcessor
|
|
176
181
|
|
177
182
|
def check msg
|
178
183
|
return unless msg.is_a? Array
|
184
|
+
@error_class.params_error! if @error_class.respond_to? :params_error
|
179
185
|
@error_class.send("#{@doc.name}_#{msg.first}!") if @error_class.respond_to? "#{@doc.name}_#{msg.first}!"
|
180
186
|
@error_class.send("#{msg.first}!") if @error_class.respond_to? msg.first
|
181
187
|
raise ValidationFailed, Config.production_msg if Config.production_msg.present?
|
182
188
|
|
183
189
|
test_msg = Config.send(msg.first) if Config.test
|
184
190
|
msg = "#{Config.send(msg.first)}#{' ' + msg.last if msg.last.present?}"
|
185
|
-
msg = " `#{@doc.name.to_sym}` "
|
191
|
+
msg = " `#{@doc.name.to_sym}` " + msg
|
186
192
|
raise ValidationFailed, test_msg || msg
|
187
193
|
end
|
188
194
|
|
@@ -22,12 +22,13 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
23
|
spec.require_paths = ['lib']
|
24
24
|
|
25
|
-
spec.add_development_dependency 'bundler'
|
26
|
-
spec.add_development_dependency 'rake'
|
27
|
-
spec.add_development_dependency 'rspec'
|
25
|
+
spec.add_development_dependency 'bundler'
|
26
|
+
spec.add_development_dependency 'rake'
|
27
|
+
spec.add_development_dependency 'rspec'
|
28
28
|
spec.add_development_dependency 'simplecov'
|
29
29
|
|
30
|
-
spec.
|
30
|
+
spec.add_dependency 'zero-rails_openapi', '>= 1.5.2'
|
31
|
+
|
31
32
|
spec.add_runtime_dependency 'rails', '>= 3'
|
32
33
|
spec.add_runtime_dependency 'activesupport', '>= 3'
|
33
34
|
spec.add_runtime_dependency 'multi_json'
|
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zero-params_processor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zhandao
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: simplecov
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -135,7 +135,6 @@ files:
|
|
135
135
|
- ".rubocop.yml"
|
136
136
|
- ".travis.yml"
|
137
137
|
- Gemfile
|
138
|
-
- Gemfile.lock
|
139
138
|
- LICENSE.txt
|
140
139
|
- README.md
|
141
140
|
- Rakefile
|
@@ -169,7 +168,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
168
|
version: '0'
|
170
169
|
requirements: []
|
171
170
|
rubyforge_project:
|
172
|
-
rubygems_version: 2.7.
|
171
|
+
rubygems_version: 2.7.3
|
173
172
|
signing_key:
|
174
173
|
specification_version: 4
|
175
174
|
summary: Process parameters base on OpenApi3 JSON documentation
|
data/Gemfile.lock
DELETED
@@ -1,157 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
zero-params_processor (0.4.0)
|
5
|
-
activesupport (>= 3)
|
6
|
-
multi_json
|
7
|
-
rails (>= 3)
|
8
|
-
zero-rails_openapi (>= 1.5.2)
|
9
|
-
|
10
|
-
GEM
|
11
|
-
remote: https://rubygems.org/
|
12
|
-
specs:
|
13
|
-
actioncable (5.2.1)
|
14
|
-
actionpack (= 5.2.1)
|
15
|
-
nio4r (~> 2.0)
|
16
|
-
websocket-driver (>= 0.6.1)
|
17
|
-
actionmailer (5.2.1)
|
18
|
-
actionpack (= 5.2.1)
|
19
|
-
actionview (= 5.2.1)
|
20
|
-
activejob (= 5.2.1)
|
21
|
-
mail (~> 2.5, >= 2.5.4)
|
22
|
-
rails-dom-testing (~> 2.0)
|
23
|
-
actionpack (5.2.1)
|
24
|
-
actionview (= 5.2.1)
|
25
|
-
activesupport (= 5.2.1)
|
26
|
-
rack (~> 2.0)
|
27
|
-
rack-test (>= 0.6.3)
|
28
|
-
rails-dom-testing (~> 2.0)
|
29
|
-
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
30
|
-
actionview (5.2.1)
|
31
|
-
activesupport (= 5.2.1)
|
32
|
-
builder (~> 3.1)
|
33
|
-
erubi (~> 1.4)
|
34
|
-
rails-dom-testing (~> 2.0)
|
35
|
-
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
36
|
-
activejob (5.2.1)
|
37
|
-
activesupport (= 5.2.1)
|
38
|
-
globalid (>= 0.3.6)
|
39
|
-
activemodel (5.2.1)
|
40
|
-
activesupport (= 5.2.1)
|
41
|
-
activerecord (5.2.1)
|
42
|
-
activemodel (= 5.2.1)
|
43
|
-
activesupport (= 5.2.1)
|
44
|
-
arel (>= 9.0)
|
45
|
-
activestorage (5.2.1)
|
46
|
-
actionpack (= 5.2.1)
|
47
|
-
activerecord (= 5.2.1)
|
48
|
-
marcel (~> 0.3.1)
|
49
|
-
activesupport (5.2.1)
|
50
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
51
|
-
i18n (>= 0.7, < 2)
|
52
|
-
minitest (~> 5.1)
|
53
|
-
tzinfo (~> 1.1)
|
54
|
-
arel (9.0.0)
|
55
|
-
builder (3.2.3)
|
56
|
-
concurrent-ruby (1.0.5)
|
57
|
-
crass (1.0.4)
|
58
|
-
diff-lcs (1.3)
|
59
|
-
docile (1.1.5)
|
60
|
-
erubi (1.7.1)
|
61
|
-
globalid (0.4.1)
|
62
|
-
activesupport (>= 4.2.0)
|
63
|
-
i18n (1.1.0)
|
64
|
-
concurrent-ruby (~> 1.0)
|
65
|
-
json (2.1.0)
|
66
|
-
loofah (2.2.2)
|
67
|
-
crass (~> 1.0.2)
|
68
|
-
nokogiri (>= 1.5.9)
|
69
|
-
mail (2.7.0)
|
70
|
-
mini_mime (>= 0.1.1)
|
71
|
-
marcel (0.3.2)
|
72
|
-
mimemagic (~> 0.3.2)
|
73
|
-
method_source (0.9.0)
|
74
|
-
mimemagic (0.3.2)
|
75
|
-
mini_mime (1.0.1)
|
76
|
-
mini_portile2 (2.3.0)
|
77
|
-
minitest (5.11.3)
|
78
|
-
multi_json (1.13.1)
|
79
|
-
nio4r (2.3.1)
|
80
|
-
nokogiri (1.8.4)
|
81
|
-
mini_portile2 (~> 2.3.0)
|
82
|
-
rack (2.0.5)
|
83
|
-
rack-test (1.1.0)
|
84
|
-
rack (>= 1.0, < 3)
|
85
|
-
rails (5.2.1)
|
86
|
-
actioncable (= 5.2.1)
|
87
|
-
actionmailer (= 5.2.1)
|
88
|
-
actionpack (= 5.2.1)
|
89
|
-
actionview (= 5.2.1)
|
90
|
-
activejob (= 5.2.1)
|
91
|
-
activemodel (= 5.2.1)
|
92
|
-
activerecord (= 5.2.1)
|
93
|
-
activestorage (= 5.2.1)
|
94
|
-
activesupport (= 5.2.1)
|
95
|
-
bundler (>= 1.3.0)
|
96
|
-
railties (= 5.2.1)
|
97
|
-
sprockets-rails (>= 2.0.0)
|
98
|
-
rails-dom-testing (2.0.3)
|
99
|
-
activesupport (>= 4.2.0)
|
100
|
-
nokogiri (>= 1.6)
|
101
|
-
rails-html-sanitizer (1.0.4)
|
102
|
-
loofah (~> 2.2, >= 2.2.2)
|
103
|
-
railties (5.2.1)
|
104
|
-
actionpack (= 5.2.1)
|
105
|
-
activesupport (= 5.2.1)
|
106
|
-
method_source
|
107
|
-
rake (>= 0.8.7)
|
108
|
-
thor (>= 0.19.0, < 2.0)
|
109
|
-
rake (10.5.0)
|
110
|
-
rspec (3.6.0)
|
111
|
-
rspec-core (~> 3.6.0)
|
112
|
-
rspec-expectations (~> 3.6.0)
|
113
|
-
rspec-mocks (~> 3.6.0)
|
114
|
-
rspec-core (3.6.0)
|
115
|
-
rspec-support (~> 3.6.0)
|
116
|
-
rspec-expectations (3.6.0)
|
117
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
118
|
-
rspec-support (~> 3.6.0)
|
119
|
-
rspec-mocks (3.6.0)
|
120
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
121
|
-
rspec-support (~> 3.6.0)
|
122
|
-
rspec-support (3.6.0)
|
123
|
-
simplecov (0.15.1)
|
124
|
-
docile (~> 1.1.0)
|
125
|
-
json (>= 1.8, < 3)
|
126
|
-
simplecov-html (~> 0.10.0)
|
127
|
-
simplecov-html (0.10.2)
|
128
|
-
sprockets (3.7.2)
|
129
|
-
concurrent-ruby (~> 1.0)
|
130
|
-
rack (> 1, < 3)
|
131
|
-
sprockets-rails (3.2.1)
|
132
|
-
actionpack (>= 4.0)
|
133
|
-
activesupport (>= 4.0)
|
134
|
-
sprockets (>= 3.0.0)
|
135
|
-
thor (0.20.0)
|
136
|
-
thread_safe (0.3.6)
|
137
|
-
tzinfo (1.2.5)
|
138
|
-
thread_safe (~> 0.1)
|
139
|
-
websocket-driver (0.7.0)
|
140
|
-
websocket-extensions (>= 0.1.0)
|
141
|
-
websocket-extensions (0.1.3)
|
142
|
-
zero-rails_openapi (1.5.2)
|
143
|
-
activesupport (>= 3)
|
144
|
-
rails (>= 3)
|
145
|
-
|
146
|
-
PLATFORMS
|
147
|
-
ruby
|
148
|
-
|
149
|
-
DEPENDENCIES
|
150
|
-
bundler (~> 1.16.a)
|
151
|
-
rake (~> 10.0)
|
152
|
-
rspec (~> 3.0)
|
153
|
-
simplecov
|
154
|
-
zero-params_processor!
|
155
|
-
|
156
|
-
BUNDLED WITH
|
157
|
-
1.16.3
|