Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

A lot of improvements #14

Open
wants to merge 22 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
d2ed3cf
Replace `require 'spec_helper'` with RSpec option in config
AlexWayfer May 7, 2024
36f8b66
Add EditorConfig file
AlexWayfer May 7, 2024
883f5d0
Replace `:git` gem source with `:github` in `Gemfile`
AlexWayfer May 7, 2024
80ab3c4
Fix README to EditorConfig settings
AlexWayfer May 7, 2024
e6fe591
Remove extra commented code about `pry`
AlexWayfer May 7, 2024
8503b30
Replace mutating `$LOAD_PATH` with `require_relative`
AlexWayfer May 7, 2024
a4f2c62
Don't require specific version of Bundler
AlexWayfer May 7, 2024
dddd54e
Update runtime dependencies
AlexWayfer May 7, 2024
2e23aa6
Fix specs for new versions of runtime dependencies (I guess)
AlexWayfer May 7, 2024
4ec412d
Lock RuboCop version
AlexWayfer May 7, 2024
7b4c382
Require Ruby at least version 2.7
AlexWayfer May 7, 2024
bba715d
Fix RuboCop config
AlexWayfer May 7, 2024
e79bfb5
Resolve some RuboCop offenses
AlexWayfer May 7, 2024
460c10f
Resolve more RuboCop offenses
AlexWayfer May 7, 2024
d828def
Enable Ruby's warnings for specs
AlexWayfer May 7, 2024
4ae1c6e
Enable new cops in RuboCop
AlexWayfer May 7, 2024
85f50b0
Resolve some of RuboCop offenses from new enabled cops
AlexWayfer May 7, 2024
2287696
Remove lock version for Rake
AlexWayfer May 7, 2024
41155a5
Move development dependencies from `gemspec` to `Gemfile`
AlexWayfer May 7, 2024
434cffb
Remove extra development dependencies
AlexWayfer May 7, 2024
5547196
Actualize gemspec homepage URI
AlexWayfer May 7, 2024
341bab1
Actualize gemspec
AlexWayfer May 7, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 120

[*.md]
indent_style = space
indent_size = 4
2 changes: 2 additions & 0 deletions .rspec
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
--require spec_helper.rb
--format documentation
--color
--warnings
8 changes: 6 additions & 2 deletions .rubocop.yml
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
AllCops:
NewCops: enable
Exclude:
- vendor/**/*
TargetRubyVersion: 2.4
TargetRubyVersion: 2.7

inherit_from: .rubocop_todo.yml

Layout/EmptyLinesAroundArguments:
Enabled: false

Layout/IndentHash:
Layout/FirstHashElementIndentation:
EnforcedStyle: consistent

Layout/MultilineMethodCallIndentation:
EnforcedStyle: indented

Metrics/BlockLength:
Exclude:
- spec/**/*
Expand Down
9 changes: 8 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,11 @@ source 'https://rubygems.org'
# Specify your gem's dependencies in grape-swagger-representable.gemspec
gemspec

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

gem 'grape-swagger', github: 'ruby-grape/grape-swagger'
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERN
## License

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

6 changes: 1 addition & 5 deletions bin/pry
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,10 @@
# frozen_string_literal: true

require 'bundler/setup'
require 'grape-swagger/representable'
require_relative '../lib/grape-swagger/representable'

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

# (If you use this, don't forget to add pry to your Gemfile!)
# require "pry"
# Pry.start

require 'pry'
Pry.start
35 changes: 17 additions & 18 deletions grape-swagger-representable.gemspec
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
# frozen_string_literal: true

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

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

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

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

s.add_runtime_dependency 'grape-swagger', '>= 0.31.0'
s.add_runtime_dependency 'representable'

s.add_development_dependency 'bundler', '~> 1.12'
s.add_development_dependency 'multi_json'
s.add_development_dependency 'pry' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx')
s.add_development_dependency 'pry-byebug' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx')
s.add_development_dependency 'rack-cors'
s.add_development_dependency 'rack-test'
s.add_development_dependency 'rake', '~> 10.0'
s.add_development_dependency 'redcarpet' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx')
s.add_development_dependency 'rouge' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx')
s.add_development_dependency 'rspec', '~> 3.0'
s.add_development_dependency 'rubocop'
github_uri = "https://github.com/ruby-grape/#{s.name}"

s.homepage = github_uri

s.metadata = {
'rubygems_mfa_required' => 'true',
'bug_tracker_uri' => "#{github_uri}/issues",
'documentation_uri' => "http://www.rubydoc.info/gems/#{s.name}/#{s.version}",
'homepage_uri' => s.homepage,
'source_code_uri' => github_uri
}

s.required_ruby_version = '>= 2.7', '< 4'

s.add_runtime_dependency 'grape-swagger', '~> 2.0'
s.add_runtime_dependency 'representable', '~> 3.2'
end
2 changes: 1 addition & 1 deletion lib/grape-swagger-representable.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# frozen_string_literal: true

require 'grape-swagger/representable'
require_relative 'grape-swagger/representable'
6 changes: 3 additions & 3 deletions lib/grape-swagger/representable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
require 'grape-swagger'
require 'representable'

require 'grape-swagger/representable/version'
require 'grape-swagger/representable/parser'
require_relative 'representable/version'
require_relative 'representable/parser'

module GrapeSwagger
module Representable
end
end

GrapeSwagger.model_parsers.register(::GrapeSwagger::Representable::Parser, ::Representable::Decorator)
GrapeSwagger.model_parsers.register(GrapeSwagger::Representable::Parser, Representable::Decorator)
25 changes: 16 additions & 9 deletions lib/grape-swagger/representable/parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
module GrapeSwagger
module Representable
class Parser
attr_reader :model
attr_reader :endpoint
attr_reader :model, :endpoint

def initialize(model, endpoint)
@model = model
Expand Down Expand Up @@ -61,7 +60,9 @@ def parse_representer_property(property)
end
end

def representer_mapping(representer, documentation, property, is_a_collection = false, is_a_decorator = false, nested = nil)
def representer_mapping(
representer, documentation, property, is_a_collection = false, is_a_decorator = false, nested = nil
)
if nested.nil? && is_a_decorator
name = endpoint.send(:expose_params_from_model, representer)

Expand Down Expand Up @@ -105,13 +106,17 @@ def parse_representer(representer)
properties = representer.map.each_with_object({}) do |value, property|
property_name = value[:as].try(:call) || value.name
hidden_property = value[:documentation]&.[](:hidden)

next if hidden_property && (hidden_property.is_a?(Proc) ? hidden_property.call : hidden_property)

property[property_name] = parse_representer_property(value)
end

required = representer.map
.select { |value| value[:documentation] && value[:documentation][:required] }
.map { |value| value[:as] || value.name }
required =
representer
.map
.select { |value| value[:documentation] && value[:documentation][:required] }
.map { |value| value[:as] || value.name }

[properties, required]
end
Expand All @@ -125,15 +130,17 @@ def combine(representer, nested)

overrided = (attributes.keys & nested_attributes.keys)

final_required = (required + nested_required)
.uniq
.select { |k| (overrided.include?(k) && nested_required.include?(k)) || !overrided.include?(k) }
final_required =
(required + nested_required)
.uniq
.select { |k| (overrided.include?(k) && nested_required.include?(k)) || !overrided.include?(k) }

[final_attributes, final_required]
end

def with_required(hash, required)
return hash if required.empty?

hash[:required] = required
hash
end
Expand Down
2 changes: 0 additions & 2 deletions spec/grape-swagger/representable_spec.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
# frozen_string_literal: true

require 'spec_helper'

describe GrapeSwagger::Representable do
it 'has a version number' do
expect(GrapeSwagger::Representable::VERSION).not_to be nil
Expand Down
57 changes: 37 additions & 20 deletions spec/grape-swagger/representers/response_inline_representer_spec.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
# frozen_string_literal: true

require 'spec_helper'

describe 'responseInlineModel' do
before :all do
module ThisInlineApi
Expand Down Expand Up @@ -50,7 +48,7 @@ class ResponseModelApi < Grape::API
is_array: true,
http_codes: [{ code: 200, message: 'OK', model: Representers::Something }]
get '/something' do
something = OpenStruct.new text: 'something'
something = Struct.new('Something', :text).new('something')
Representers::Something.new(something).to_hash
end

Expand All @@ -66,10 +64,10 @@ class ResponseModelApi < Grape::API
end
get '/something/:id' do
if params[:id] == 1
something = OpenStruct.new text: 'something'
something = Struct.new('Something', :text).new('something')
Representers::Something.new(something).to_hash
else
error = OpenStruct.new code: 'some_error', message: 'Some error'
error = Struct.new('SomeError', :code, :message).new('some_error', 'Some error')
Representers::Error.new(error).to_hash
end
end
Expand All @@ -94,7 +92,7 @@ def app
'description' => 'OK',
'schema' => {
'type' => 'array',
'items' => { '$ref' => '#/definitions/Something' }
'items' => { '$ref' => '#/definitions/ThisInlineApi_Representers_Something' }
}
}
)
Expand All @@ -104,40 +102,51 @@ def app
expect(subject['paths']['/something/{id}']['get']['responses']).to eq(
'200' => {
'description' => 'OK',
'schema' => { '$ref' => '#/definitions/Something' }
'schema' => { '$ref' => '#/definitions/ThisInlineApi_Representers_Something' }
},
'403' => {
'description' => 'Refused to return something',
'schema' => { '$ref' => '#/definitions/Error' }
'schema' => { '$ref' => '#/definitions/ThisInlineApi_Representers_Error' }
}
)
expect(subject['definitions'].keys).to include 'Error'
expect(subject['definitions']['Error']).to eq(
expect(subject['definitions'].keys).to include 'ThisInlineApi_Representers_Error'
expect(subject['definitions']['ThisInlineApi_Representers_Error']).to eq(
'type' => 'object',
'description' => 'This returns something',
'description' => 'ThisInlineApi_Representers_Error model',
'properties' => {
'code' => { 'type' => 'string', 'description' => 'Error code', 'default' => 403 },
'message' => { 'type' => 'string', 'description' => 'Error message' }
}
)

expect(subject['definitions'].keys).to include 'Something'
expect(subject['definitions']['Something']).to eq(
expect(subject['definitions'].keys).to include 'ThisInlineApi_Representers_Something'
expect(subject['definitions']['ThisInlineApi_Representers_Something']).to eq(
'type' => 'object',
'description' => 'This returns something',
'description' => 'ThisInlineApi_Representers_Something model',
'properties' => {
'text' => { 'description' => 'Content of something.', 'type' => 'string' },
'alias' => { 'description' => 'Aliased.', 'type' => 'string' },
'kind' => { '$ref' => '#/definitions/Kind', 'description' => 'The kind of this something.' },
'kind' => {
'$ref' => '#/definitions/ThisInlineApi_Representers_Kind',
'description' => 'The kind of this something.'
},
'kind2' => {
'type' => 'object',
'properties' => {
'id' => { 'description' => 'Title of the kind.', 'type' => 'integer', 'format' => 'int32', 'example' => 123 },
'id' => {
'description' => 'Title of the kind.',
'type' => 'integer',
'format' => 'int32',
'example' => 123
},
'name' => { 'description' => 'Kind name.', 'type' => 'string' }
},
'description' => 'Secondary kind.'
},
'kind3' => { '$ref' => '#/definitions/Kind', 'description' => 'Tertiary kind.' },
'kind3' => {
'$ref' => '#/definitions/ThisInlineApi_Representers_Kind',
'description' => 'Tertiary kind.'
},
'kind4' => {
'description' => '',
'properties' => {
Expand Down Expand Up @@ -171,9 +180,17 @@ def app
'required' => ['kind4']
)

expect(subject['definitions'].keys).to include 'Kind'
expect(subject['definitions']['Kind']).to eq(
'type' => 'object', 'properties' => { 'id' => { 'description' => 'Title of the kind.', 'type' => 'integer', 'format' => 'int32', 'example' => 123 } }
expect(subject['definitions'].keys).to include 'ThisInlineApi_Representers_Kind'
expect(subject['definitions']['ThisInlineApi_Representers_Kind']).to eq(
'type' => 'object',
'properties' => {
'id' => {
'description' => 'Title of the kind.',
'type' => 'integer',
'format' => 'int32',
'example' => 123
}
}
)
end
end
Loading