From d2ed3cf8ff948c2971c45f36bbd92d7b46e7646b Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:37:48 +0300 Subject: [PATCH 01/22] Replace `require 'spec_helper'` with RSpec option in config --- .rspec | 1 + spec/grape-swagger/representable_spec.rb | 2 -- .../representers/response_inline_representer_spec.rb | 2 -- spec/grape-swagger/representers/response_representer_spec.rb | 2 -- 4 files changed, 1 insertion(+), 6 deletions(-) diff --git a/.rspec b/.rspec index 8c18f1a..9df66fc 100644 --- a/.rspec +++ b/.rspec @@ -1,2 +1,3 @@ +--require spec_helper.rb --format documentation --color diff --git a/spec/grape-swagger/representable_spec.rb b/spec/grape-swagger/representable_spec.rb index 45b93bf..83a79f7 100644 --- a/spec/grape-swagger/representable_spec.rb +++ b/spec/grape-swagger/representable_spec.rb @@ -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 diff --git a/spec/grape-swagger/representers/response_inline_representer_spec.rb b/spec/grape-swagger/representers/response_inline_representer_spec.rb index 432b3a9..0a5bce5 100644 --- a/spec/grape-swagger/representers/response_inline_representer_spec.rb +++ b/spec/grape-swagger/representers/response_inline_representer_spec.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require 'spec_helper' - describe 'responseInlineModel' do before :all do module ThisInlineApi diff --git a/spec/grape-swagger/representers/response_representer_spec.rb b/spec/grape-swagger/representers/response_representer_spec.rb index 8cfd2ac..89dbd04 100644 --- a/spec/grape-swagger/representers/response_representer_spec.rb +++ b/spec/grape-swagger/representers/response_representer_spec.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require 'spec_helper' - describe 'responseModel' do before :all do module ThisApi From 36f8b66913c8b6c0eb77b0a1b735e5b778cb2ab3 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:39:31 +0300 Subject: [PATCH 02/22] Add EditorConfig file More info here: https://editorconfig.org/ --- .editorconfig | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..371e8fe --- /dev/null +++ b/.editorconfig @@ -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 From 883f5d02e0049fd3767833c10564181b1d59a028 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:40:03 +0300 Subject: [PATCH 03/22] Replace `:git` gem source with `:github` in `Gemfile` --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index b03157b..7eaecf1 100644 --- a/Gemfile +++ b/Gemfile @@ -5,4 +5,4 @@ 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 'grape-swagger', github: 'ruby-grape/grape-swagger' From 80ab3c4c8aa98a6366a0025cd2eb67d2285f526b Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:40:28 +0300 Subject: [PATCH 04/22] Fix README to EditorConfig settings --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 66a0782..9ce581e 100644 --- a/README.md +++ b/README.md @@ -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). - From e6fe591678ee51004e3742b84c094c3d74e25a4c Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:41:01 +0300 Subject: [PATCH 05/22] Remove extra commented code about `pry` This is commented duplicate. --- bin/pry | 4 ---- 1 file changed, 4 deletions(-) diff --git a/bin/pry b/bin/pry index 5af8e51..9c89cb0 100755 --- a/bin/pry +++ b/bin/pry @@ -7,9 +7,5 @@ require '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 From 8503b30d576c2bf39c59a1d280601127bbf445b4 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:42:06 +0300 Subject: [PATCH 06/22] Replace mutating `$LOAD_PATH` with `require_relative` --- bin/pry | 2 +- grape-swagger-representable.gemspec | 4 +--- lib/grape-swagger-representable.rb | 2 +- lib/grape-swagger/representable.rb | 4 ++-- spec/spec_helper.rb | 4 +--- 5 files changed, 6 insertions(+), 10 deletions(-) diff --git a/bin/pry b/bin/pry index 9c89cb0..b9119d7 100755 --- a/bin/pry +++ b/bin/pry @@ -2,7 +2,7 @@ # 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. diff --git a/grape-swagger-representable.gemspec b/grape-swagger-representable.gemspec index fb8b844..b77ddfd 100644 --- a/grape-swagger-representable.gemspec +++ b/grape-swagger-representable.gemspec @@ -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' diff --git a/lib/grape-swagger-representable.rb b/lib/grape-swagger-representable.rb index 3fd783b..d7020fc 100644 --- a/lib/grape-swagger-representable.rb +++ b/lib/grape-swagger-representable.rb @@ -1,3 +1,3 @@ # frozen_string_literal: true -require 'grape-swagger/representable' +require_relative 'grape-swagger/representable' diff --git a/lib/grape-swagger/representable.rb b/lib/grape-swagger/representable.rb index 0503d24..5809d68 100644 --- a/lib/grape-swagger/representable.rb +++ b/lib/grape-swagger/representable.rb @@ -3,8 +3,8 @@ 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 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 8eda29e..af0292a 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true -$LOAD_PATH.unshift File.expand_path('../lib', __dir__) - -require 'grape-swagger/representable' +require_relative '../lib/grape-swagger/representable' require 'grape' require 'representable/json' From a4f2c62e8549d16dfeceaa091b7da62271d45936 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:42:34 +0300 Subject: [PATCH 07/22] Don't require specific version of Bundler --- grape-swagger-representable.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grape-swagger-representable.gemspec b/grape-swagger-representable.gemspec index b77ddfd..f2ac58e 100644 --- a/grape-swagger-representable.gemspec +++ b/grape-swagger-representable.gemspec @@ -20,7 +20,7 @@ Gem::Specification.new do |s| 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 'bundler' 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') From dddd54e8a6551503d1c3b49a978f02da6a3c9a61 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:42:51 +0300 Subject: [PATCH 08/22] Update runtime dependencies --- grape-swagger-representable.gemspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grape-swagger-representable.gemspec b/grape-swagger-representable.gemspec index f2ac58e..5cea842 100644 --- a/grape-swagger-representable.gemspec +++ b/grape-swagger-representable.gemspec @@ -17,8 +17,8 @@ Gem::Specification.new do |s| 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_runtime_dependency 'grape-swagger', '~> 2.0' + s.add_runtime_dependency 'representable', '~> 3.2' s.add_development_dependency 'bundler' s.add_development_dependency 'multi_json' From 2e23aa60facb805324282efeef24d59342ce37b5 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:43:25 +0300 Subject: [PATCH 09/22] Fix specs for new versions of runtime dependencies (I guess) --- .../response_inline_representer_spec.rb | 49 +++++-- .../representers/response_representer_spec.rb | 130 +++++++++++++----- 2 files changed, 126 insertions(+), 53 deletions(-) diff --git a/spec/grape-swagger/representers/response_inline_representer_spec.rb b/spec/grape-swagger/representers/response_inline_representer_spec.rb index 0a5bce5..e02010f 100644 --- a/spec/grape-swagger/representers/response_inline_representer_spec.rb +++ b/spec/grape-swagger/representers/response_inline_representer_spec.rb @@ -92,7 +92,7 @@ def app 'description' => 'OK', 'schema' => { 'type' => 'array', - 'items' => { '$ref' => '#/definitions/Something' } + 'items' => { '$ref' => '#/definitions/ThisInlineApi_Representers_Something' } } } ) @@ -102,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' => { @@ -169,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 diff --git a/spec/grape-swagger/representers/response_representer_spec.rb b/spec/grape-swagger/representers/response_representer_spec.rb index 89dbd04..1a58432 100644 --- a/spec/grape-swagger/representers/response_representer_spec.rb +++ b/spec/grape-swagger/representers/response_representer_spec.rb @@ -97,7 +97,7 @@ def app 'description' => 'OK', 'schema' => { 'type' => 'array', - 'items' => { '$ref' => '#/definitions/Something' } + 'items' => { '$ref' => '#/definitions/ThisApi_Representers_Something' } } } ) @@ -105,12 +105,20 @@ def app it 'should document specified models with hidden property' do allow(ThisApi::Representers::Error).to receive(:developer?).and_return(true) - expect(subject['definitions']['Error']).to eq( + expect(subject['definitions']['ThisApi_Representers_Error']).to eq( 'type' => 'object', - 'description' => 'This returns something', - 'properties' => { 'code' => { 'description' => 'Error code', 'type' => 'string' }, - 'message' => { 'description' => 'Error message', 'type' => 'string' }, - 'developer_message' => { 'description' => 'Developer hidden error message', 'type' => 'string' } } + 'description' => 'ThisApi_Representers_Error model', + 'properties' => { + 'code' => { + 'description' => 'Error code', 'type' => 'string' + }, + 'message' => { + 'description' => 'Error message', 'type' => 'string' + }, + 'developer_message' => { + 'description' => 'Developer hidden error message', 'type' => 'string' + } + } ) end @@ -118,46 +126,57 @@ def app expect(subject['paths']['/something/{id}']['get']['responses']).to eq( '200' => { 'description' => 'OK', - 'schema' => { '$ref' => '#/definitions/Something' } + 'schema' => { '$ref' => '#/definitions/ThisApi_Representers_Something' } }, '403' => { 'description' => 'Refused to return something', - 'schema' => { '$ref' => '#/definitions/Error' } + 'schema' => { '$ref' => '#/definitions/ThisApi_Representers_Error' } } ) - expect(subject['definitions'].keys).to include 'Error' - expect(subject['definitions']['Error']).to eq( + expect(subject['definitions'].keys).to include 'ThisApi_Representers_Error' + expect(subject['definitions']['ThisApi_Representers_Error']).to eq( 'type' => 'object', - 'description' => 'This returns something', + 'description' => 'ThisApi_Representers_Error model', 'properties' => { 'code' => { 'description' => 'Error code', 'type' => 'string' }, 'message' => { 'description' => 'Error message', 'type' => 'string' } } ) - expect(subject['definitions'].keys).to include 'Something' - expect(subject['definitions']['Something']).to eq( + expect(subject['definitions'].keys).to include 'ThisApi_Representers_Something' + expect(subject['definitions']['ThisApi_Representers_Something']).to eq( 'type' => 'object', - 'description' => 'This returns something', - 'properties' => - { 'text' => { 'type' => 'string', 'description' => 'Content of something.' }, - 'alias' => { 'type' => 'string', 'description' => 'Aliased.' }, - 'kind' => { '$ref' => '#/definitions/Kind', 'description' => 'The kind of this something.' }, - 'kind2' => { '$ref' => '#/definitions/Kind', 'description' => 'Secondary kind.' }, - 'kind3' => { '$ref' => '#/definitions/Kind', 'description' => 'Tertiary kind.' }, - 'tags' => { 'type' => 'array', 'items' => { '$ref' => '#/definitions/Tag' }, 'description' => 'Tags.' }, - 'relation' => { '$ref' => '#/definitions/Relation', 'description' => 'A related model.' } } + 'description' => 'ThisApi_Representers_Something model', + 'properties' => { + 'text' => { 'type' => 'string', 'description' => 'Content of something.' }, + 'alias' => { 'type' => 'string', 'description' => 'Aliased.' }, + 'kind' => { + '$ref' => '#/definitions/ThisApi_Representers_Kind', + 'description' => 'The kind of this something.' + }, + 'kind2' => { '$ref' => '#/definitions/ThisApi_Representers_Kind', 'description' => 'Secondary kind.' }, + 'kind3' => { '$ref' => '#/definitions/ThisApi_Representers_Kind', 'description' => 'Tertiary kind.' }, + 'tags' => { + 'type' => 'array', + 'items' => { '$ref' => '#/definitions/ThisApi_Representers_Tag' }, + 'description' => 'Tags.' + }, + 'relation' => { + '$ref' => '#/definitions/ThisApi_Representers_Relation', + 'description' => 'A related model.' + } + } ) - expect(subject['definitions'].keys).to include 'Kind' - expect(subject['definitions']['Kind']).to eq( + expect(subject['definitions'].keys).to include 'ThisApi_Representers_Kind' + expect(subject['definitions']['ThisApi_Representers_Kind']).to eq( 'type' => 'object', 'properties' => { 'title' => { 'type' => 'string', 'description' => 'Title of the kind.', 'example' => 123 } } ) - expect(subject['definitions'].keys).to include 'Relation' - expect(subject['definitions']['Relation']).to eq( + expect(subject['definitions'].keys).to include 'ThisApi_Representers_Relation' + expect(subject['definitions']['ThisApi_Representers_Relation']).to eq( 'type' => 'object', 'properties' => { 'name' => { 'type' => 'string', 'description' => 'Name', 'example' => 'A relation' } } ) - expect(subject['definitions'].keys).to include 'Tag' - expect(subject['definitions']['Tag']).to eq( + expect(subject['definitions'].keys).to include 'ThisApi_Representers_Tag' + expect(subject['definitions']['ThisApi_Representers_Tag']).to eq( 'type' => 'object', 'properties' => { 'name' => { 'type' => 'string', 'description' => 'Name' } } ) end @@ -223,20 +242,55 @@ def app it 'it prefer entity over others' do expect(subject['definitions']).to eql( - 'Kind' => { 'type' => 'object', 'properties' => { 'id' => { 'description' => 'Title of the kind.', 'type' => 'integer', 'format' => 'int32' } } }, - 'Tag' => { 'type' => 'object', 'properties' => { 'name' => { 'description' => 'Name', 'type' => 'string' } } }, - 'Relation' => { 'type' => 'object', 'properties' => { 'name' => { 'description' => 'Name', 'type' => 'string' } } }, - 'SomeEntity' => { + 'TheseApi_Representers_Kind' => { + 'type' => 'object', + 'properties' => { + 'id' => { + 'description' => 'Title of the kind.', + 'type' => 'integer', + 'format' => 'int32' + } + } + }, + 'TheseApi_Representers_Tag' => { + 'type' => 'object', + 'properties' => { + 'name' => { + 'description' => 'Name', + 'type' => 'string' + } + } + }, + 'TheseApi_Representers_Relation' => { + 'type' => 'object', + 'properties' => { + 'name' => { + 'description' => 'Name', + 'type' => 'string' + } + } + }, + 'TheseApi_Representers_SomeEntity' => { 'type' => 'object', 'properties' => { 'text' => { 'description' => 'Content of something.', 'type' => 'string' }, - 'kind' => { '$ref' => '#/definitions/Kind', 'description' => 'The kind of this something.' }, - 'kind2' => { '$ref' => '#/definitions/Kind', 'description' => 'Secondary kind.' }, - 'kind3' => { '$ref' => '#/definitions/Kind', 'description' => 'Tertiary kind.' }, - 'tags' => { 'type' => 'array', 'items' => { '$ref' => '#/definitions/Tag' }, 'description' => 'Tags.' }, - 'relation' => { '$ref' => '#/definitions/Relation', 'description' => 'A related model.' } + 'kind' => { + '$ref' => '#/definitions/TheseApi_Representers_Kind', + 'description' => 'The kind of this something.' + }, + 'kind2' => { '$ref' => '#/definitions/TheseApi_Representers_Kind', 'description' => 'Secondary kind.' }, + 'kind3' => { '$ref' => '#/definitions/TheseApi_Representers_Kind', 'description' => 'Tertiary kind.' }, + 'tags' => { + 'type' => 'array', + 'items' => { '$ref' => '#/definitions/TheseApi_Representers_Tag' }, + 'description' => 'Tags.' + }, + 'relation' => { + '$ref' => '#/definitions/TheseApi_Representers_Relation', + 'description' => 'A related model.' + } }, - 'description' => 'This returns something' + 'description' => 'TheseApi_Representers_SomeEntity model' } ) end From 4ec412d3a5e927166a74d4d39db495e7b161486c Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:43:42 +0300 Subject: [PATCH 10/22] Lock RuboCop version --- grape-swagger-representable.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grape-swagger-representable.gemspec b/grape-swagger-representable.gemspec index 5cea842..fd6f054 100644 --- a/grape-swagger-representable.gemspec +++ b/grape-swagger-representable.gemspec @@ -30,5 +30,5 @@ Gem::Specification.new do |s| 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' + s.add_development_dependency 'rubocop', '~> 1.63.4' end From 7b4c382472a33574d87f45c6cad62e7282d8e507 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:50:20 +0300 Subject: [PATCH 11/22] Require Ruby at least version 2.7 --- .rubocop.yml | 2 +- grape-swagger-representable.gemspec | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index dee73d8..eb41db6 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,7 +1,7 @@ AllCops: Exclude: - vendor/**/* - TargetRubyVersion: 2.4 + TargetRubyVersion: 2.7 inherit_from: .rubocop_todo.yml diff --git a/grape-swagger-representable.gemspec b/grape-swagger-representable.gemspec index fd6f054..fed40f5 100644 --- a/grape-swagger-representable.gemspec +++ b/grape-swagger-representable.gemspec @@ -17,6 +17,8 @@ Gem::Specification.new do |s| s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) } s.require_paths = ['lib'] + s.required_ruby_version = '>= 2.7', '< 4' + s.add_runtime_dependency 'grape-swagger', '~> 2.0' s.add_runtime_dependency 'representable', '~> 3.2' From bba715d21125bdf5911d18bae3f5262c0ecc2b65 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:50:39 +0300 Subject: [PATCH 12/22] Fix RuboCop config Cop has been renamed. --- .rubocop.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index eb41db6..f0e2b5a 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -8,7 +8,7 @@ inherit_from: .rubocop_todo.yml Layout/EmptyLinesAroundArguments: Enabled: false -Layout/IndentHash: +Layout/FirstHashElementIndentation: EnforcedStyle: consistent Metrics/BlockLength: From e79bfb58733541a201f6f6e7063ebec908b7b208 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:51:06 +0300 Subject: [PATCH 13/22] Resolve some RuboCop offenses --- lib/grape-swagger/representable/parser.rb | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/grape-swagger/representable/parser.rb b/lib/grape-swagger/representable/parser.rb index 60996f2..ac4d145 100644 --- a/lib/grape-swagger/representable/parser.rb +++ b/lib/grape-swagger/representable/parser.rb @@ -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 @@ -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) @@ -105,7 +106,9 @@ 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 @@ -125,15 +128,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 From 460c10f8c4f4736971f9d0d789d9756842534a04 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:52:35 +0300 Subject: [PATCH 14/22] Resolve more RuboCop offenses Change `MultilineMethodCallIndentation` from default to `indented`. It'll help with future `LineLength` offenses. --- .rubocop.yml | 3 +++ lib/grape-swagger/representable/parser.rb | 8 +++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index f0e2b5a..7d2ec95 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -11,6 +11,9 @@ Layout/EmptyLinesAroundArguments: Layout/FirstHashElementIndentation: EnforcedStyle: consistent +Layout/MultilineMethodCallIndentation: + EnforcedStyle: indented + Metrics/BlockLength: Exclude: - spec/**/* diff --git a/lib/grape-swagger/representable/parser.rb b/lib/grape-swagger/representable/parser.rb index ac4d145..b1f1b45 100644 --- a/lib/grape-swagger/representable/parser.rb +++ b/lib/grape-swagger/representable/parser.rb @@ -112,9 +112,11 @@ def parse_representer(representer) 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 From d828def137ce22e01786e592659a13636e44cca2 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 16:52:50 +0300 Subject: [PATCH 15/22] Enable Ruby's warnings for specs --- .rspec | 1 + 1 file changed, 1 insertion(+) diff --git a/.rspec b/.rspec index 9df66fc..7a588d9 100644 --- a/.rspec +++ b/.rspec @@ -1,3 +1,4 @@ --require spec_helper.rb --format documentation --color +--warnings From 4ae1c6edf0549468e51111c64bd90b6d3c3ded35 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 17:01:42 +0300 Subject: [PATCH 16/22] Enable new cops in RuboCop --- .rubocop.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.rubocop.yml b/.rubocop.yml index 7d2ec95..a372e91 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,4 +1,5 @@ AllCops: + NewCops: enable Exclude: - vendor/**/* TargetRubyVersion: 2.7 From 85f50b053d0eef4702c8d3a732bc7d52394655df Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 17:02:08 +0300 Subject: [PATCH 17/22] Resolve some of RuboCop offenses from new enabled cops --- grape-swagger-representable.gemspec | 2 +- lib/grape-swagger/representable.rb | 2 +- .../representers/response_inline_representer_spec.rb | 6 +++--- .../representers/response_representer_spec.rb | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/grape-swagger-representable.gemspec b/grape-swagger-representable.gemspec index fed40f5..652995a 100644 --- a/grape-swagger-representable.gemspec +++ b/grape-swagger-representable.gemspec @@ -1,6 +1,6 @@ # frozen_string_literal: true -require_relative './lib/grape-swagger/representable/version' +require_relative 'lib/grape-swagger/representable/version' Gem::Specification.new do |s| s.name = 'grape-swagger-representable' diff --git a/lib/grape-swagger/representable.rb b/lib/grape-swagger/representable.rb index 5809d68..0ee21e4 100644 --- a/lib/grape-swagger/representable.rb +++ b/lib/grape-swagger/representable.rb @@ -11,4 +11,4 @@ module Representable end end -GrapeSwagger.model_parsers.register(::GrapeSwagger::Representable::Parser, ::Representable::Decorator) +GrapeSwagger.model_parsers.register(GrapeSwagger::Representable::Parser, Representable::Decorator) diff --git a/spec/grape-swagger/representers/response_inline_representer_spec.rb b/spec/grape-swagger/representers/response_inline_representer_spec.rb index e02010f..8a98811 100644 --- a/spec/grape-swagger/representers/response_inline_representer_spec.rb +++ b/spec/grape-swagger/representers/response_inline_representer_spec.rb @@ -48,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 @@ -64,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 diff --git a/spec/grape-swagger/representers/response_representer_spec.rb b/spec/grape-swagger/representers/response_representer_spec.rb index 1a58432..4abd3dc 100644 --- a/spec/grape-swagger/representers/response_representer_spec.rb +++ b/spec/grape-swagger/representers/response_representer_spec.rb @@ -53,7 +53,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 @@ -69,10 +69,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 @@ -222,7 +222,7 @@ class ResponseEntityApi < Grape::API is_array: true, entity: Representers::SomeEntity get '/some_entity' do - something = OpenStruct.new text: 'something' + something = Struct.new('Something', :text).new('something') Representers::SomeEntity.new(something).to_hash end From 22876960a68c5caf5a3bb63fbd84367f38315519 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 17:03:09 +0300 Subject: [PATCH 18/22] Remove lock version for Rake --- grape-swagger-representable.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grape-swagger-representable.gemspec b/grape-swagger-representable.gemspec index 652995a..e8ecff1 100644 --- a/grape-swagger-representable.gemspec +++ b/grape-swagger-representable.gemspec @@ -28,7 +28,7 @@ Gem::Specification.new do |s| 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 'rake' 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' From 41155a5e137613b976e79c9fee0a4ca8a2db4d58 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 17:04:28 +0300 Subject: [PATCH 19/22] Move development dependencies from `gemspec` to `Gemfile` Resolve RuboCop offenses. --- Gemfile | 12 ++++++++++++ grape-swagger-representable.gemspec | 12 ------------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Gemfile b/Gemfile index 7eaecf1..aed2ab3 100644 --- a/Gemfile +++ b/Gemfile @@ -5,4 +5,16 @@ source 'https://rubygems.org' # Specify your gem's dependencies in grape-swagger-representable.gemspec gemspec +gem 'bundler' +gem 'multi_json' +gem 'pry' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx') +gem 'pry-byebug' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx') +gem 'rack-cors' +gem 'rack-test' +gem 'rake' +gem 'redcarpet' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx') +gem 'rouge' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx') +gem 'rspec', '~> 3.0' +gem 'rubocop', '~> 1.63.4' + gem 'grape-swagger', github: 'ruby-grape/grape-swagger' diff --git a/grape-swagger-representable.gemspec b/grape-swagger-representable.gemspec index e8ecff1..65cd8fe 100644 --- a/grape-swagger-representable.gemspec +++ b/grape-swagger-representable.gemspec @@ -21,16 +21,4 @@ Gem::Specification.new do |s| s.add_runtime_dependency 'grape-swagger', '~> 2.0' s.add_runtime_dependency 'representable', '~> 3.2' - - s.add_development_dependency 'bundler' - 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' - 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', '~> 1.63.4' end From 434cffbabd6939759ce6d19c32cc2dc8774cf913 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 17:06:13 +0300 Subject: [PATCH 20/22] Remove extra development dependencies --- Gemfile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Gemfile b/Gemfile index aed2ab3..907ae0d 100644 --- a/Gemfile +++ b/Gemfile @@ -5,15 +5,10 @@ source 'https://rubygems.org' # Specify your gem's dependencies in grape-swagger-representable.gemspec gemspec -gem 'bundler' gem 'multi_json' -gem 'pry' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx') gem 'pry-byebug' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx') -gem 'rack-cors' gem 'rack-test' gem 'rake' -gem 'redcarpet' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx') -gem 'rouge' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx') gem 'rspec', '~> 3.0' gem 'rubocop', '~> 1.63.4' From 5547196d2baedee56fc411a81347972a277e3b59 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 17:39:22 +0300 Subject: [PATCH 21/22] Actualize gemspec homepage URI --- grape-swagger-representable.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grape-swagger-representable.gemspec b/grape-swagger-representable.gemspec index 65cd8fe..907ed5f 100644 --- a/grape-swagger-representable.gemspec +++ b/grape-swagger-representable.gemspec @@ -9,7 +9,7 @@ Gem::Specification.new do |s| s.email = ['kirik910@gmail.com'] s.summary = 'Grape swagger adapter to support representable object parsing' - s.homepage = 'https://github.com/Bugagazavr/grape-swagger-representable' + s.homepage = 'https://github.com/ruby-grape/grape-swagger-representable' s.license = 'MIT' s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } From 341bab1f67f59a49ffc3219a18215e5869a5b104 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 7 May 2024 17:40:15 +0300 Subject: [PATCH 22/22] Actualize gemspec Remake homepage, add a lot of metadata, including `rubygems_mfa_required` to resolve RuboCop offense. --- grape-swagger-representable.gemspec | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/grape-swagger-representable.gemspec b/grape-swagger-representable.gemspec index 907ed5f..34c39b6 100644 --- a/grape-swagger-representable.gemspec +++ b/grape-swagger-representable.gemspec @@ -9,7 +9,6 @@ Gem::Specification.new do |s| s.email = ['kirik910@gmail.com'] s.summary = 'Grape swagger adapter to support representable object parsing' - s.homepage = 'https://github.com/ruby-grape/grape-swagger-representable' s.license = 'MIT' s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } @@ -17,6 +16,18 @@ Gem::Specification.new do |s| s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) } s.require_paths = ['lib'] + 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'