Skip to content

Commit cbbd09d

Browse files
authored
Merge pull request #1 from AlexWayfer/a_lot_of_improvements
A lot of improvements
2 parents 879fd2a + 341bab1 commit cbbd09d

14 files changed

+202
-109
lines changed

.editorconfig

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
root = true
2+
3+
[*]
4+
indent_style = space
5+
indent_size = 2
6+
end_of_line = lf
7+
charset = utf-8
8+
trim_trailing_whitespace = true
9+
insert_final_newline = true
10+
max_line_length = 120
11+
12+
[*.md]
13+
indent_style = space
14+
indent_size = 4

.rspec

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1+
--require spec_helper.rb
12
--format documentation
23
--color
4+
--warnings

.rubocop.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
AllCops:
2+
NewCops: enable
23
Exclude:
34
- vendor/**/*
4-
TargetRubyVersion: 2.4
5+
TargetRubyVersion: 2.7
56

67
inherit_from: .rubocop_todo.yml
78

89
Layout/EmptyLinesAroundArguments:
910
Enabled: false
1011

11-
Layout/IndentHash:
12+
Layout/FirstHashElementIndentation:
1213
EnforcedStyle: consistent
1314

15+
Layout/MultilineMethodCallIndentation:
16+
EnforcedStyle: indented
17+
1418
Metrics/BlockLength:
1519
Exclude:
1620
- spec/**/*

Gemfile

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,11 @@ source 'https://rubygems.org'
55
# Specify your gem's dependencies in grape-swagger-representable.gemspec
66
gemspec
77

8-
gem 'grape-swagger', git: 'https://github.com/ruby-grape/grape-swagger.git'
8+
gem 'multi_json'
9+
gem 'pry-byebug' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx')
10+
gem 'rack-test'
11+
gem 'rake'
12+
gem 'rspec', '~> 3.0'
13+
gem 'rubocop', '~> 1.63.4'
14+
15+
gem 'grape-swagger', github: 'ruby-grape/grape-swagger'

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERN
3131
## License
3232

3333
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
34-

bin/pry

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,10 @@
22
# frozen_string_literal: true
33

44
require 'bundler/setup'
5-
require 'grape-swagger/representable'
5+
require_relative '../lib/grape-swagger/representable'
66

77
# You can add fixtures and/or initialization code here to make experimenting
88
# with your gem easier. You can also use a different console, if you like.
99

10-
# (If you use this, don't forget to add pry to your Gemfile!)
11-
# require "pry"
12-
# Pry.start
13-
1410
require 'pry'
1511
Pry.start

grape-swagger-representable.gemspec

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
# frozen_string_literal: true
22

3-
lib = File.expand_path('lib', __dir__)
4-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5-
require 'grape-swagger/representable/version'
3+
require_relative 'lib/grape-swagger/representable/version'
64

75
Gem::Specification.new do |s|
86
s.name = 'grape-swagger-representable'
@@ -11,26 +9,27 @@ Gem::Specification.new do |s|
119
s.email = ['[email protected]']
1210

1311
s.summary = 'Grape swagger adapter to support representable object parsing'
14-
s.homepage = 'https://github.com/Bugagazavr/grape-swagger-representable'
1512
s.license = 'MIT'
1613

1714
s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
1815
s.bindir = 'exe'
1916
s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
2017
s.require_paths = ['lib']
2118

22-
s.add_runtime_dependency 'grape-swagger', '>= 0.31.0'
23-
s.add_runtime_dependency 'representable'
24-
25-
s.add_development_dependency 'bundler', '~> 1.12'
26-
s.add_development_dependency 'multi_json'
27-
s.add_development_dependency 'pry' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx')
28-
s.add_development_dependency 'pry-byebug' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx')
29-
s.add_development_dependency 'rack-cors'
30-
s.add_development_dependency 'rack-test'
31-
s.add_development_dependency 'rake', '~> 10.0'
32-
s.add_development_dependency 'redcarpet' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx')
33-
s.add_development_dependency 'rouge' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx')
34-
s.add_development_dependency 'rspec', '~> 3.0'
35-
s.add_development_dependency 'rubocop'
19+
github_uri = "https://github.com/ruby-grape/#{s.name}"
20+
21+
s.homepage = github_uri
22+
23+
s.metadata = {
24+
'rubygems_mfa_required' => 'true',
25+
'bug_tracker_uri' => "#{github_uri}/issues",
26+
'documentation_uri' => "http://www.rubydoc.info/gems/#{s.name}/#{s.version}",
27+
'homepage_uri' => s.homepage,
28+
'source_code_uri' => github_uri
29+
}
30+
31+
s.required_ruby_version = '>= 2.7', '< 4'
32+
33+
s.add_runtime_dependency 'grape-swagger', '~> 2.0'
34+
s.add_runtime_dependency 'representable', '~> 3.2'
3635
end

lib/grape-swagger-representable.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# frozen_string_literal: true
22

3-
require 'grape-swagger/representable'
3+
require_relative 'grape-swagger/representable'

lib/grape-swagger/representable.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
require 'grape-swagger'
44
require 'representable'
55

6-
require 'grape-swagger/representable/version'
7-
require 'grape-swagger/representable/parser'
6+
require_relative 'representable/version'
7+
require_relative 'representable/parser'
88

99
module GrapeSwagger
1010
module Representable
1111
end
1212
end
1313

14-
GrapeSwagger.model_parsers.register(::GrapeSwagger::Representable::Parser, ::Representable::Decorator)
14+
GrapeSwagger.model_parsers.register(GrapeSwagger::Representable::Parser, Representable::Decorator)

lib/grape-swagger/representable/parser.rb

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
module GrapeSwagger
44
module Representable
55
class Parser
6-
attr_reader :model
7-
attr_reader :endpoint
6+
attr_reader :model, :endpoint
87

98
def initialize(model, endpoint)
109
@model = model
@@ -61,7 +60,9 @@ def parse_representer_property(property)
6160
end
6261
end
6362

64-
def representer_mapping(representer, documentation, property, is_a_collection = false, is_a_decorator = false, nested = nil)
63+
def representer_mapping(
64+
representer, documentation, property, is_a_collection = false, is_a_decorator = false, nested = nil
65+
)
6566
if nested.nil? && is_a_decorator
6667
name = endpoint.send(:expose_params_from_model, representer)
6768

@@ -105,13 +106,17 @@ def parse_representer(representer)
105106
properties = representer.map.each_with_object({}) do |value, property|
106107
property_name = value[:as].try(:call) || value.name
107108
hidden_property = value[:documentation]&.[](:hidden)
109+
108110
next if hidden_property && (hidden_property.is_a?(Proc) ? hidden_property.call : hidden_property)
111+
109112
property[property_name] = parse_representer_property(value)
110113
end
111114

112-
required = representer.map
113-
.select { |value| value[:documentation] && value[:documentation][:required] }
114-
.map { |value| value[:as] || value.name }
115+
required =
116+
representer
117+
.map
118+
.select { |value| value[:documentation] && value[:documentation][:required] }
119+
.map { |value| value[:as] || value.name }
115120

116121
[properties, required]
117122
end
@@ -125,15 +130,17 @@ def combine(representer, nested)
125130

126131
overrided = (attributes.keys & nested_attributes.keys)
127132

128-
final_required = (required + nested_required)
129-
.uniq
130-
.select { |k| (overrided.include?(k) && nested_required.include?(k)) || !overrided.include?(k) }
133+
final_required =
134+
(required + nested_required)
135+
.uniq
136+
.select { |k| (overrided.include?(k) && nested_required.include?(k)) || !overrided.include?(k) }
131137

132138
[final_attributes, final_required]
133139
end
134140

135141
def with_required(hash, required)
136142
return hash if required.empty?
143+
137144
hash[:required] = required
138145
hash
139146
end

spec/grape-swagger/representable_spec.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
# frozen_string_literal: true
22

3-
require 'spec_helper'
4-
53
describe GrapeSwagger::Representable do
64
it 'has a version number' do
75
expect(GrapeSwagger::Representable::VERSION).not_to be nil

spec/grape-swagger/representers/response_inline_representer_spec.rb

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
# frozen_string_literal: true
22

3-
require 'spec_helper'
4-
53
describe 'responseInlineModel' do
64
before :all do
75
module ThisInlineApi
@@ -50,7 +48,7 @@ class ResponseModelApi < Grape::API
5048
is_array: true,
5149
http_codes: [{ code: 200, message: 'OK', model: Representers::Something }]
5250
get '/something' do
53-
something = OpenStruct.new text: 'something'
51+
something = Struct.new('Something', :text).new('something')
5452
Representers::Something.new(something).to_hash
5553
end
5654

@@ -66,10 +64,10 @@ class ResponseModelApi < Grape::API
6664
end
6765
get '/something/:id' do
6866
if params[:id] == 1
69-
something = OpenStruct.new text: 'something'
67+
something = Struct.new('Something', :text).new('something')
7068
Representers::Something.new(something).to_hash
7169
else
72-
error = OpenStruct.new code: 'some_error', message: 'Some error'
70+
error = Struct.new('SomeError', :code, :message).new('some_error', 'Some error')
7371
Representers::Error.new(error).to_hash
7472
end
7573
end
@@ -94,7 +92,7 @@ def app
9492
'description' => 'OK',
9593
'schema' => {
9694
'type' => 'array',
97-
'items' => { '$ref' => '#/definitions/Something' }
95+
'items' => { '$ref' => '#/definitions/ThisInlineApi_Representers_Something' }
9896
}
9997
}
10098
)
@@ -104,40 +102,51 @@ def app
104102
expect(subject['paths']['/something/{id}']['get']['responses']).to eq(
105103
'200' => {
106104
'description' => 'OK',
107-
'schema' => { '$ref' => '#/definitions/Something' }
105+
'schema' => { '$ref' => '#/definitions/ThisInlineApi_Representers_Something' }
108106
},
109107
'403' => {
110108
'description' => 'Refused to return something',
111-
'schema' => { '$ref' => '#/definitions/Error' }
109+
'schema' => { '$ref' => '#/definitions/ThisInlineApi_Representers_Error' }
112110
}
113111
)
114-
expect(subject['definitions'].keys).to include 'Error'
115-
expect(subject['definitions']['Error']).to eq(
112+
expect(subject['definitions'].keys).to include 'ThisInlineApi_Representers_Error'
113+
expect(subject['definitions']['ThisInlineApi_Representers_Error']).to eq(
116114
'type' => 'object',
117-
'description' => 'This returns something',
115+
'description' => 'ThisInlineApi_Representers_Error model',
118116
'properties' => {
119117
'code' => { 'type' => 'string', 'description' => 'Error code', 'default' => 403 },
120118
'message' => { 'type' => 'string', 'description' => 'Error message' }
121119
}
122120
)
123121

124-
expect(subject['definitions'].keys).to include 'Something'
125-
expect(subject['definitions']['Something']).to eq(
122+
expect(subject['definitions'].keys).to include 'ThisInlineApi_Representers_Something'
123+
expect(subject['definitions']['ThisInlineApi_Representers_Something']).to eq(
126124
'type' => 'object',
127-
'description' => 'This returns something',
125+
'description' => 'ThisInlineApi_Representers_Something model',
128126
'properties' => {
129127
'text' => { 'description' => 'Content of something.', 'type' => 'string' },
130128
'alias' => { 'description' => 'Aliased.', 'type' => 'string' },
131-
'kind' => { '$ref' => '#/definitions/Kind', 'description' => 'The kind of this something.' },
129+
'kind' => {
130+
'$ref' => '#/definitions/ThisInlineApi_Representers_Kind',
131+
'description' => 'The kind of this something.'
132+
},
132133
'kind2' => {
133134
'type' => 'object',
134135
'properties' => {
135-
'id' => { 'description' => 'Title of the kind.', 'type' => 'integer', 'format' => 'int32', 'example' => 123 },
136+
'id' => {
137+
'description' => 'Title of the kind.',
138+
'type' => 'integer',
139+
'format' => 'int32',
140+
'example' => 123
141+
},
136142
'name' => { 'description' => 'Kind name.', 'type' => 'string' }
137143
},
138144
'description' => 'Secondary kind.'
139145
},
140-
'kind3' => { '$ref' => '#/definitions/Kind', 'description' => 'Tertiary kind.' },
146+
'kind3' => {
147+
'$ref' => '#/definitions/ThisInlineApi_Representers_Kind',
148+
'description' => 'Tertiary kind.'
149+
},
141150
'kind4' => {
142151
'description' => '',
143152
'properties' => {
@@ -171,9 +180,17 @@ def app
171180
'required' => ['kind4']
172181
)
173182

174-
expect(subject['definitions'].keys).to include 'Kind'
175-
expect(subject['definitions']['Kind']).to eq(
176-
'type' => 'object', 'properties' => { 'id' => { 'description' => 'Title of the kind.', 'type' => 'integer', 'format' => 'int32', 'example' => 123 } }
183+
expect(subject['definitions'].keys).to include 'ThisInlineApi_Representers_Kind'
184+
expect(subject['definitions']['ThisInlineApi_Representers_Kind']).to eq(
185+
'type' => 'object',
186+
'properties' => {
187+
'id' => {
188+
'description' => 'Title of the kind.',
189+
'type' => 'integer',
190+
'format' => 'int32',
191+
'example' => 123
192+
}
193+
}
177194
)
178195
end
179196
end

0 commit comments

Comments
 (0)