From e9c6885a8b11bd4c86277423724a16c9113ac491 Mon Sep 17 00:00:00 2001 From: dblock Date: Tue, 26 Apr 2016 16:05:27 -0400 Subject: [PATCH 1/3] Fix: Ruby 2.1 build. --- .travis.yml | 2 ++ Gemfile | 21 ++++++++++++ Rakefile | 64 ++++++++++++++++++++----------------- gemfiles/rack_1.5.2.gemfile | 19 +++++++++++ gemfiles/rails_3.gemfile | 21 +++++++++++- gemfiles/rails_4.gemfile | 19 +++++++++++ grape.gemspec | 14 -------- 7 files changed, 115 insertions(+), 45 deletions(-) diff --git a/.travis.yml b/.travis.yml index f93bca740..0ec2a830c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,3 +23,5 @@ gemfile: - gemfiles/rails_3.gemfile - gemfiles/rails_4.gemfile - gemfiles/rack_1.5.2.gemfile + +bundler_args: --without development diff --git a/Gemfile b/Gemfile index 6a46bf87c..533afd993 100644 --- a/Gemfile +++ b/Gemfile @@ -1,9 +1,30 @@ +# when changing this file, run appraisal install ; rubocop -a gemfiles/* + source 'https://rubygems.org' gemspec group :development, :test do + gem 'bundler' + gem 'rake' + gem 'rubocop', '0.35.1' +end + +group :development do gem 'guard' gem 'guard-rspec' gem 'guard-rubocop' + gem 'yard' + gem 'appraisal' + gem 'benchmark-ips' +end + +group :test do + gem 'grape-entity', '0.5.0' + gem 'maruku' + gem 'rack-test' + gem 'rspec', '~> 3.0' + gem 'cookiejar' + gem 'rack-contrib' + gem 'mime-types', '< 3.0' end diff --git a/Rakefile b/Rakefile index 242685393..0aa5e5709 100644 --- a/Rakefile +++ b/Rakefile @@ -23,43 +23,47 @@ RuboCop::RakeTask.new task default: [:rubocop, :spec] -require 'yard' -DOC_FILES = ['lib/**/*.rb', 'README.md'] +begin + require 'yard' + DOC_FILES = ['lib/**/*.rb', 'README.md'] -YARD::Rake::YardocTask.new(:doc) do |t| - t.files = DOC_FILES -end - -namespace :doc do - YARD::Rake::YardocTask.new(:pages) do |t| - t.files = DOC_FILES - t.options = ['-o', '../grape.doc/docs'] + YARD::Rake::YardocTask.new(:doc) do |t| + t.files = DOC_FILES end - namespace :pages do - desc 'Check out gh-pages.' - task :checkout do - dir = File.dirname(__FILE__) + '/../grape.doc' - unless Dir.exist?(dir) - Dir.mkdir(dir) - Dir.chdir(dir) do - system('git init') - system('git remote add origin git@github.com:ruby-grape/grape.git') - system('git pull') - system('git checkout gh-pages') + namespace :doc do + YARD::Rake::YardocTask.new(:pages) do |t| + t.files = DOC_FILES + t.options = ['-o', '../grape.doc/docs'] + end + + namespace :pages do + desc 'Check out gh-pages.' + task :checkout do + dir = File.dirname(__FILE__) + '/../grape.doc' + unless Dir.exist?(dir) + Dir.mkdir(dir) + Dir.chdir(dir) do + system('git init') + system('git remote add origin git@github.com:ruby-grape/grape.git') + system('git pull') + system('git checkout gh-pages') + end end end - end - desc 'Generate and publish YARD docs to GitHub pages.' - task publish: ['doc:pages:checkout', 'doc:pages'] do - Dir.chdir(File.dirname(__FILE__) + '/../grape.doc') do - system('git checkout gh-pages') - system('git add .') - system('git add -u') - system("git commit -m 'Generating docs for version #{Grape::VERSION}.'") - system('git push origin gh-pages') + desc 'Generate and publish YARD docs to GitHub pages.' + task publish: ['doc:pages:checkout', 'doc:pages'] do + Dir.chdir(File.dirname(__FILE__) + '/../grape.doc') do + system('git checkout gh-pages') + system('git add .') + system('git add -u') + system("git commit -m 'Generating docs for version #{Grape::VERSION}.'") + system('git push origin gh-pages') + end end end end +rescue LoadError # rubocop:disable Lint/HandleExceptions + # ignore end diff --git a/gemfiles/rack_1.5.2.gemfile b/gemfiles/rack_1.5.2.gemfile index 3ba7ea3a7..ea96ee147 100644 --- a/gemfiles/rack_1.5.2.gemfile +++ b/gemfiles/rack_1.5.2.gemfile @@ -5,9 +5,28 @@ source 'https://rubygems.org' gem 'rack', '1.5.2' group :development, :test do + gem 'bundler' + gem 'rake' + gem 'rubocop', '0.35.1' +end + +group :development do gem 'guard' gem 'guard-rspec' gem 'guard-rubocop' + gem 'yard' + gem 'appraisal' + gem 'benchmark-ips' +end + +group :test do + gem 'grape-entity', '0.5.0' + gem 'maruku' + gem 'rack-test' + gem 'rspec', '~> 3.0' + gem 'cookiejar' + gem 'rack-contrib' + gem 'mime-types', '< 3.0' end gemspec path: '../' diff --git a/gemfiles/rails_3.gemfile b/gemfiles/rails_3.gemfile index 55a7d5747..cd4dfbc0f 100644 --- a/gemfiles/rails_3.gemfile +++ b/gemfiles/rails_3.gemfile @@ -2,13 +2,32 @@ source 'https://rubygems.org' -gem 'rails', '3.2.22' +gem 'rails', '3.2.19' gem 'rack-cache', '<= 1.2' group :development, :test do + gem 'bundler' + gem 'rake' + gem 'rubocop', '0.35.1' +end + +group :development do gem 'guard' gem 'guard-rspec' gem 'guard-rubocop' + gem 'yard' + gem 'appraisal' + gem 'benchmark-ips' +end + +group :test do + gem 'grape-entity', '0.5.0' + gem 'maruku' + gem 'rack-test' + gem 'rspec', '~> 3.0' + gem 'cookiejar' + gem 'rack-contrib' + gem 'mime-types', '< 3.0' end gemspec path: '../' diff --git a/gemfiles/rails_4.gemfile b/gemfiles/rails_4.gemfile index 8c386c724..136ec2b81 100644 --- a/gemfiles/rails_4.gemfile +++ b/gemfiles/rails_4.gemfile @@ -5,9 +5,28 @@ source 'https://rubygems.org' gem 'rails', '4.1.6' group :development, :test do + gem 'bundler' + gem 'rake' + gem 'rubocop', '0.35.1' +end + +group :development do gem 'guard' gem 'guard-rspec' gem 'guard-rubocop' + gem 'yard' + gem 'appraisal' + gem 'benchmark-ips' +end + +group :test do + gem 'grape-entity', '0.5.0' + gem 'maruku' + gem 'rack-test' + gem 'rspec', '~> 3.0' + gem 'cookiejar' + gem 'rack-contrib' + gem 'mime-types', '< 3.0' end gemspec path: '../' diff --git a/grape.gemspec b/grape.gemspec index c6529951c..328781b18 100644 --- a/grape.gemspec +++ b/grape.gemspec @@ -22,20 +22,6 @@ Gem::Specification.new do |s| s.add_runtime_dependency 'virtus', '>= 1.0.0' s.add_runtime_dependency 'builder' - s.add_development_dependency 'grape-entity', '0.5.0' - s.add_development_dependency 'rake', '~> 10' - s.add_development_dependency 'maruku' - s.add_development_dependency 'yard' - s.add_development_dependency 'rack-test' - s.add_development_dependency 'rspec', '~> 3.0' - s.add_development_dependency 'bundler' - s.add_development_dependency 'cookiejar' - s.add_development_dependency 'rack-contrib' - s.add_development_dependency 'mime-types', '< 3.0' - s.add_development_dependency 'appraisal' - s.add_development_dependency 'benchmark-ips' - s.add_development_dependency 'rubocop', '0.35.1' - s.files = Dir['**/*'].keep_if { |file| File.file?(file) } s.test_files = Dir['spec/**/*'] s.require_paths = ['lib'] From f1ec68451bea9c4b051f7be0f47648bc7aace065 Mon Sep 17 00:00:00 2001 From: dblock Date: Tue, 26 Apr 2016 16:18:35 -0400 Subject: [PATCH 2/3] Upgraded to RuboCop 0.39.0. --- .rubocop_todo.yml | 35 +++++--- Gemfile | 2 +- Rakefile | 2 +- lib/grape/dsl/headers.rb | 2 +- lib/grape/dsl/inside_route.rb | 27 +++---- lib/grape/dsl/parameters.rb | 28 +++---- lib/grape/dsl/request_response.rb | 30 +++---- lib/grape/dsl/routing.rb | 14 ++-- lib/grape/endpoint.rb | 8 +- lib/grape/exceptions/validation.rb | 2 +- lib/grape/formatter/xml.rb | 2 +- lib/grape/middleware/error.rb | 7 +- lib/grape/middleware/formatter.rb | 18 ++--- lib/grape/middleware/versioner.rb | 2 +- lib/grape/middleware/versioner/header.rb | 4 +- lib/grape/request.rb | 2 +- lib/grape/router.rb | 2 +- lib/grape/router/pattern.rb | 4 +- lib/grape/router/route.rb | 6 +- lib/grape/util/content_types.rb | 2 +- lib/grape/util/stackable_values.rb | 2 +- lib/grape/validations/params_scope.rb | 28 +++---- lib/grape/validations/types.rb | 8 +- .../validations/validators/all_or_none.rb | 4 +- .../validations/validators/allow_blank.rb | 19 +++-- .../validations/validators/at_least_one_of.rb | 2 +- lib/grape/validations/validators/base.rb | 8 +- lib/grape/validations/validators/coerce.rb | 9 +-- .../validations/validators/exactly_one_of.rb | 2 +- .../validators/mutual_exclusion.rb | 2 +- lib/grape/validations/validators/presence.rb | 2 +- lib/grape/validations/validators/regexp.rb | 2 +- lib/grape/validations/validators/values.rb | 2 +- lib/grape/version.rb | 2 +- spec/grape/api/custom_validations_spec.rb | 6 +- spec/grape/api_spec.rb | 80 +++++++++---------- spec/grape/dsl/logger_spec.rb | 2 +- spec/grape/dsl/validations_spec.rb | 2 +- spec/grape/endpoint_spec.rb | 2 +- .../exceptions/validation_errors_spec.rb | 6 +- .../global_namespace_function_spec.rb | 2 +- spec/grape/middleware/base_spec.rb | 2 +- spec/grape/middleware/exception_spec.rb | 4 +- spec/grape/middleware/formatter_spec.rb | 8 +- spec/grape/validations/params_scope_spec.rb | 2 +- .../validations/validators/coerce_spec.rb | 9 ++- .../validations/validators/values_spec.rb | 2 +- spec/grape/validations_spec.rb | 8 +- spec/support/versioned_helpers.rb | 6 +- 49 files changed, 215 insertions(+), 217 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index f738a8a06..554bb2ceb 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,15 +1,15 @@ # This configuration was generated by # `rubocop --auto-gen-config` -# on 2016-03-14 21:22:57 +0300 using RuboCop version 0.35.1. +# on 2016-04-26 16:12:14 -0400 using RuboCop version 0.39.0. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of RuboCop, may require this file to be generated again. # Offense count: 1 -Lint/NestedMethodDefinition: +Lint/IneffectiveAccessModifier: Exclude: - - 'lib/grape/util/strict_hash_configuration.rb' + - 'lib/grape/router.rb' # Offense count: 39 Metrics/AbcSize: @@ -19,29 +19,30 @@ Metrics/AbcSize: Metrics/BlockNesting: Max: 4 -# Offense count: 6 +# Offense count: 7 # Configuration parameters: CountComments. Metrics/ClassLength: - Max: 281 + Max: 267 # Offense count: 24 Metrics/CyclomaticComplexity: Max: 14 -# Offense count: 853 -# Configuration parameters: AllowURI, URISchemes. +# Offense count: 871 +# Configuration parameters: AllowHeredoc, AllowURI, URISchemes. +# URISchemes: http, https Metrics/LineLength: Max: 215 -# Offense count: 48 +# Offense count: 49 # Configuration parameters: CountComments. Metrics/MethodLength: - Max: 36 + Max: 34 -# Offense count: 8 +# Offense count: 7 # Configuration parameters: CountComments. Metrics/ModuleLength: - Max: 277 + Max: 212 # Offense count: 15 Metrics/PerceivedComplexity: @@ -50,6 +51,10 @@ Metrics/PerceivedComplexity: # Offense count: 44 # Cop supports --auto-correct. # Configuration parameters: EnforcedStyle, SupportedStyles, ProceduralMethods, FunctionalMethods, IgnoredMethods. +# SupportedStyles: line_count_based, semantic, braces_for_chaining +# ProceduralMethods: benchmark, bm, bmbm, create, each_with_object, measure, new, realtime, tap, with_object +# FunctionalMethods: let, let!, subject, watch +# IgnoredMethods: lambda, proc, it Style/BlockDelimiters: Exclude: - 'spec/grape/api_spec.rb' @@ -58,7 +63,6 @@ Style/BlockDelimiters: - 'spec/grape/request_spec.rb' # Offense count: 111 -# Configuration parameters: Exclude. Style/Documentation: Enabled: false @@ -70,7 +74,14 @@ Style/DoubleNegation: - 'lib/grape/middleware/versioner/header.rb' - 'lib/grape/path.rb' +# Offense count: 1 +# Configuration parameters: MinBodyLength. +Style/GuardClause: + Exclude: + - 'lib/grape/endpoint.rb' + # Offense count: 14 # Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: compact, exploded Style/RaiseArgs: Enabled: false diff --git a/Gemfile b/Gemfile index 533afd993..3b09625a7 100644 --- a/Gemfile +++ b/Gemfile @@ -7,7 +7,7 @@ gemspec group :development, :test do gem 'bundler' gem 'rake' - gem 'rubocop', '0.35.1' + gem 'rubocop', '0.39.0' end group :development do diff --git a/Rakefile b/Rakefile index 0aa5e5709..f4e330c03 100644 --- a/Rakefile +++ b/Rakefile @@ -25,7 +25,7 @@ task default: [:rubocop, :spec] begin require 'yard' - DOC_FILES = ['lib/**/*.rb', 'README.md'] + DOC_FILES = ['lib/**/*.rb', 'README.md'].freeze YARD::Rake::YardocTask.new(:doc) do |t| t.files = DOC_FILES diff --git a/lib/grape/dsl/headers.rb b/lib/grape/dsl/headers.rb index e634cdfc5..cf7849352 100644 --- a/lib/grape/dsl/headers.rb +++ b/lib/grape/dsl/headers.rb @@ -10,7 +10,7 @@ def header(key = nil, val = nil) @header ||= {} end end - alias_method :headers, :header + alias headers header end end end diff --git a/lib/grape/dsl/inside_route.rb b/lib/grape/dsl/inside_route.rb index dc05f9b54..3e2e99740 100644 --- a/lib/grape/dsl/inside_route.rb +++ b/lib/grape/dsl/inside_route.rb @@ -31,7 +31,7 @@ def declared(params, options = {}, declared_params = nil) declared_params ||= (!options[:include_parent_namespaces] ? route_setting(:declared_params) : (route_setting(:saved_declared_params) || [])).flatten(1) || [] - fail ArgumentError, 'Tried to filter for declared parameters but none exist.' unless declared_params + raise ArgumentError, 'Tried to filter for declared parameters but none exist.' unless declared_params if params.is_a? Array params.map do |param| @@ -70,7 +70,7 @@ def declared(params, options = {}, declared_params = nil) # options. `:include_parent_namespaces` defaults to true, hence must be set to false if # you want only to return params declared against the current/target endpoint. def declared(*) - fail MethodNotYetAvailable, '#declared is not available prior to parameter validation.' + raise MethodNotYetAvailable, '#declared is not available prior to parameter validation.' end # The API version as specified in the URL. @@ -100,14 +100,12 @@ def redirect(url, options = {}) if permanent status 301 body_message ||= "This resource has been moved permanently to #{url}." + elsif env[Grape::Http::Headers::HTTP_VERSION] == 'HTTP/1.1' && request.request_method.to_s.upcase != Grape::Http::Headers::GET + status 303 + body_message ||= "An alternate resource is located at #{url}." else - if env[Grape::Http::Headers::HTTP_VERSION] == 'HTTP/1.1' && request.request_method.to_s.upcase != Grape::Http::Headers::GET - status 303 - body_message ||= "An alternate resource is located at #{url}." - else - status 302 - body_message ||= "This resource has been moved temporarily to #{url}." - end + status 302 + body_message ||= "This resource has been moved temporarily to #{url}." end header 'Location', url content_type 'text/plain' @@ -120,11 +118,8 @@ def redirect(url, options = {}) def status(status = nil) case status when Symbol - if Rack::Utils::SYMBOL_TO_STATUS_CODE.keys.include?(status) - @status = Rack::Utils.status_code(status) - else - fail ArgumentError, "Status code :#{status} is invalid." - end + raise ArgumentError, "Status code :#{status} is invalid." unless Rack::Utils::SYMBOL_TO_STATUS_CODE.keys.include?(status) + @status = Rack::Utils.status_code(status) when Fixnum @status = status when nil @@ -136,7 +131,7 @@ def status(status = nil) 200 end else - fail ArgumentError, 'Status code must be Fixnum or Symbol.' + raise ArgumentError, 'Status code must be Fixnum or Symbol.' end end @@ -260,7 +255,7 @@ def present(*args) if key representation = (@body || {}).merge(key => representation) elsif entity_class.present? && @body - fail ArgumentError, "Representation of type #{representation.class} cannot be merged." unless representation.respond_to?(:merge) + raise ArgumentError, "Representation of type #{representation.class} cannot be merged." unless representation.respond_to?(:merge) representation = @body.merge(representation) end diff --git a/lib/grape/dsl/parameters.rb b/lib/grape/dsl/parameters.rb index 2a4b4be15..bafe14754 100644 --- a/lib/grape/dsl/parameters.rb +++ b/lib/grape/dsl/parameters.rb @@ -34,13 +34,13 @@ def use(*names) options = names.extract_options! names.each do |name| params_block = named_params.fetch(name) do - fail "Params :#{name} not found!" + raise "Params :#{name} not found!" end instance_exec(options, ¶ms_block) end end - alias_method :use_scope, :use - alias_method :includes, :use + alias use_scope use + alias includes use # Require one or more parameters for the current endpoint. # @@ -121,8 +121,8 @@ def optional(*attrs, &block) # check type for optional parameter group if attrs && block_given? - fail Grape::Exceptions::MissingGroupTypeError.new if type.nil? - fail Grape::Exceptions::UnsupportedGroupTypeError.new unless Grape::Validations::Types.group?(type) + raise Grape::Exceptions::MissingGroupTypeError.new if type.nil? + raise Grape::Exceptions::UnsupportedGroupTypeError.new unless Grape::Validations::Types.group?(type) end if opts[:using] @@ -167,7 +167,7 @@ def all_or_none_of(*attrs) # @yield a parameter definition DSL def given(*attrs, &block) attrs.each do |attr| - fail Grape::Exceptions::UnknownParameter.new(attr) unless declared_param?(attr) + raise Grape::Exceptions::UnknownParameter.new(attr) unless declared_param?(attr) end new_lateral_scope(dependent_on: attrs, &block) end @@ -181,7 +181,7 @@ def declared_param?(param) @declared_params.flatten.include?(param) end - alias_method :group, :requires + alias group requires # @param params [Hash] initial hash of parameters # @return hash of parameters relevant for the current scope @@ -189,13 +189,13 @@ def declared_param?(param) def params(params) params = @parent.params(params) if @parent if @element - if params.is_a?(Array) - params = params.flat_map { |el| el[@element] || {} } - elsif params.is_a?(Hash) - params = params[@element] || {} - else - params = {} - end + params = if params.is_a?(Array) + params.flat_map { |el| el[@element] || {} } + elsif params.is_a?(Hash) + params[@element] || {} + else + {} + end end params end diff --git a/lib/grape/dsl/request_response.rb b/lib/grape/dsl/request_response.rb index f745209d7..9933bb279 100644 --- a/lib/grape/dsl/request_response.rb +++ b/lib/grape/dsl/request_response.rb @@ -23,7 +23,7 @@ def format(new_format = nil) namespace_inheritable(:default_error_formatter, Grape::ErrorFormatter.formatter_for(new_format, {})) # define a single mime type mime_type = content_types[new_format.to_sym] - fail Grape::Exceptions::MissingMimeType.new(new_format) unless mime_type + raise Grape::Exceptions::MissingMimeType.new(new_format) unless mime_type namespace_stackable(:content_types, new_format.to_sym => mime_type) else namespace_inheritable(:format) @@ -51,11 +51,11 @@ def default_error_formatter(new_formatter_name = nil) end def error_formatter(format, options) - if options.is_a?(Hash) && options.key?(:with) - formatter = options[:with] - else - formatter = options - end + formatter = if options.is_a?(Hash) && options.key?(:with) + options[:with] + else + options + end namespace_stackable(:error_formatters, format.to_sym => formatter) end @@ -106,7 +106,7 @@ def rescue_from(*args, &block) options = args.extract_options! if block_given? && options.key?(:with) - fail ArgumentError, 'both :with option and block cannot be passed' + raise ArgumentError, 'both :with option and block cannot be passed' end handler ||= extract_with(options) @@ -115,12 +115,12 @@ def rescue_from(*args, &block) namespace_inheritable :all_rescue_handler, handler else handler_type = - case options[:rescue_subclasses] - when nil, true - :rescue_handlers - else - :base_only_rescue_handlers - end + case options[:rescue_subclasses] + when nil, true + :rescue_handlers + else + :base_only_rescue_handlers + end namespace_stackable handler_type, Hash[args.map { |arg| [arg, handler] }] end @@ -149,7 +149,7 @@ def rescue_from(*args, &block) # @param model_class [Class] The model class that will be represented. # @option options [Class] :with The entity class that will represent the model. def represent(model_class, options) - fail Grape::Exceptions::InvalidWithOptionForRepresent.new unless options[:with] && options[:with].is_a?(Class) + raise Grape::Exceptions::InvalidWithOptionForRepresent.new unless options[:with] && options[:with].is_a?(Class) namespace_stackable(:representations, model_class => options[:with]) end @@ -160,7 +160,7 @@ def extract_with(options) with_option = options.delete(:with) return with_option if with_option.instance_of?(Proc) return with_option.to_sym if with_option.instance_of?(Symbol) || with_option.instance_of?(String) - fail ArgumentError, "with: #{with_option.class}, expected Symbol, String or Proc" + raise ArgumentError, "with: #{with_option.class}, expected Symbol, String or Proc" end end end diff --git a/lib/grape/dsl/routing.rb b/lib/grape/dsl/routing.rb index 5e55f1e5d..000aa7342 100644 --- a/lib/grape/dsl/routing.rb +++ b/lib/grape/dsl/routing.rb @@ -31,7 +31,7 @@ def version(*args, &block) options = args.extract_options! options = options.reverse_merge(using: :path) - fail Grape::Exceptions::MissingVendorOption.new if options[:using] == :header && !options.key?(:vendor) + raise Grape::Exceptions::MissingVendorOption.new if options[:using] == :header && !options.key?(:vendor) @versions = versions | args @@ -121,9 +121,9 @@ def route(methods, paths = ['/'], route_options = {}, &block) method: methods, path: paths, for: self, - route_options: ({ + route_options: { params: namespace_stackable_with_hash(:params) || {} - }).deep_merge(route_setting(:description) || {}).deep_merge(route_options || {}) + }.deep_merge(route_setting(:description) || {}).deep_merge(route_options || {}) } new_endpoint = Grape::Endpoint.new(inheritable_setting, endpoint_options, &block) @@ -170,10 +170,10 @@ def namespace(space = nil, options = {}, &block) end end - alias_method :group, :namespace - alias_method :resource, :namespace - alias_method :resources, :namespace - alias_method :segment, :namespace + alias group namespace + alias resource namespace + alias resources namespace + alias segment namespace # An array of API routes. def routes diff --git a/lib/grape/endpoint.rb b/lib/grape/endpoint.rb index 88fb71869..32eaa0708 100644 --- a/lib/grape/endpoint.rb +++ b/lib/grape/endpoint.rb @@ -54,7 +54,7 @@ def run_before_each(endpoint) # @raise [NameError] an instance method with the same name already exists def generate_api_method(method_name, &block) if instance_methods.include?(method_name.to_sym) || instance_methods.include?(method_name.to_s) - fail NameError.new("method #{method_name.inspect} already exists and cannot be used as an unbound method name") + raise NameError.new("method #{method_name.inspect} already exists and cannot be used as an unbound method name") end define_method(method_name, &block) @@ -98,7 +98,7 @@ def initialize(new_settings, options = {}, &block) end def require_option(options, key) - fail Grape::Exceptions::MissingOption.new(key) unless options.key?(key) + raise Grape::Exceptions::MissingOption.new(key) unless options.key?(key) end def method_name @@ -171,7 +171,7 @@ def prepare_default_route_attributes def prepare_version version = namespace_inheritable(:version) || [] - return if version.length == 0 + return if version.empty? version.length == 1 ? version.first.to_s : version end @@ -326,7 +326,7 @@ def run_validators(validators, request) end end - validation_errors.any? && fail(Grape::Exceptions::ValidationErrors, errors: validation_errors, headers: header) + validation_errors.any? && raise(Grape::Exceptions::ValidationErrors, errors: validation_errors, headers: header) end def run_filters(filters, type = :other) diff --git a/lib/grape/exceptions/validation.rb b/lib/grape/exceptions/validation.rb index 46ba5b991..893aacc94 100644 --- a/lib/grape/exceptions/validation.rb +++ b/lib/grape/exceptions/validation.rb @@ -7,7 +7,7 @@ class Validation < Grape::Exceptions::Base attr_accessor :message_key def initialize(args = {}) - fail 'Params are missing:' unless args.key? :params + raise 'Params are missing:' unless args.key? :params @params = args[:params] if args.key?(:message) @message_key = args[:message] if args[:message].is_a?(Symbol) diff --git a/lib/grape/formatter/xml.rb b/lib/grape/formatter/xml.rb index 1f89a814e..2e6853920 100644 --- a/lib/grape/formatter/xml.rb +++ b/lib/grape/formatter/xml.rb @@ -4,7 +4,7 @@ module Xml class << self def call(object, _env) return object.to_xml if object.respond_to?(:to_xml) - fail Grape::Exceptions::InvalidFormatter.new(object.class, 'xml') + raise Grape::Exceptions::InvalidFormatter.new(object.class, 'xml') end end end diff --git a/lib/grape/middleware/error.rb b/lib/grape/middleware/error.rb index 854c76427..d50fa2ba9 100644 --- a/lib/grape/middleware/error.rb +++ b/lib/grape/middleware/error.rb @@ -47,11 +47,8 @@ def find_handler(klass) handler ||= options[:all_rescue_handler] if handler.instance_of?(Symbol) - if respond_to?(handler) - handler = self.class.instance_method(handler).bind(self) - else - fail NoMethodError, "undefined method `#{handler}'" - end + raise NoMethodError, "undefined method `#{handler}'" unless respond_to?(handler) + handler = self.class.instance_method(handler).bind(self) end handler diff --git a/lib/grape/middleware/formatter.rb b/lib/grape/middleware/formatter.rb index 9dc6d299a..ea5705e1f 100644 --- a/lib/grape/middleware/formatter.rb +++ b/lib/grape/middleware/formatter.rb @@ -74,7 +74,7 @@ def read_body_input return unless (request.post? || request.put? || request.patch? || request.delete?) && (!request.form_data? || !request.media_type) && - (!request.parseable_data?) && + !request.parseable_data? && (request.content_length.to_i > 0 || request.env[Grape::Http::Headers::HTTP_TRANSFER_ENCODING] == CHUNKED) return unless (input = env[Grape::Env::RACK_INPUT]) @@ -82,7 +82,7 @@ def read_body_input input.rewind body = env[Grape::Env::API_REQUEST_INPUT] = input.read begin - read_rack_input(body) if body && body.length > 0 + read_rack_input(body) if body && !body.empty? ensure input.rewind end @@ -98,11 +98,11 @@ def read_rack_input(body) begin body = (env[Grape::Env::API_REQUEST_BODY] = parser.call(body, env)) if body.is_a?(Hash) - if env[Grape::Env::RACK_REQUEST_FORM_HASH] - env[Grape::Env::RACK_REQUEST_FORM_HASH] = env[Grape::Env::RACK_REQUEST_FORM_HASH].merge(body) - else - env[Grape::Env::RACK_REQUEST_FORM_HASH] = body - end + env[Grape::Env::RACK_REQUEST_FORM_HASH] = if env[Grape::Env::RACK_REQUEST_FORM_HASH] + env[Grape::Env::RACK_REQUEST_FORM_HASH].merge(body) + else + body + end env[Grape::Env::RACK_REQUEST_FORM_INPUT] = env[Grape::Env::RACK_INPUT] end rescue Grape::Exceptions::Base => e @@ -168,8 +168,8 @@ def mime_array vendor_prefix_pattern = /vnd\.[^+]+\+/ accept.scan(accept_into_mime_and_quality) - .sort_by { |_, quality_preference| -quality_preference.to_f } - .flat_map { |mime, _| [mime, mime.sub(vendor_prefix_pattern, '')] } + .sort_by { |_, quality_preference| -quality_preference.to_f } + .flat_map { |mime, _| [mime, mime.sub(vendor_prefix_pattern, '')] } end end end diff --git a/lib/grape/middleware/versioner.rb b/lib/grape/middleware/versioner.rb index 9caea4983..82ba1ba74 100644 --- a/lib/grape/middleware/versioner.rb +++ b/lib/grape/middleware/versioner.rb @@ -24,7 +24,7 @@ def using(strategy) when :accept_version_header AcceptVersionHeader else - fail Grape::Exceptions::InvalidVersionerOption.new(strategy) + raise Grape::Exceptions::InvalidVersionerOption.new(strategy) end end end diff --git a/lib/grape/middleware/versioner/header.rb b/lib/grape/middleware/versioner/header.rb index 48e825566..1e15551dc 100644 --- a/lib/grape/middleware/versioner/header.rb +++ b/lib/grape/middleware/versioner/header.rb @@ -87,12 +87,12 @@ def media_type_header_handler end def fail_with_invalid_accept_header!(message) - fail Grape::Exceptions::InvalidAcceptHeader + raise Grape::Exceptions::InvalidAcceptHeader .new(message, error_headers) end def fail_with_invalid_version_header!(message) - fail Grape::Exceptions::InvalidVersionHeader + raise Grape::Exceptions::InvalidVersionHeader .new(message, error_headers) end diff --git a/lib/grape/request.rb b/lib/grape/request.rb index a687dfa71..21f3c0086 100644 --- a/lib/grape/request.rb +++ b/lib/grape/request.rb @@ -2,7 +2,7 @@ module Grape class Request < Rack::Request HTTP_PREFIX = 'HTTP_'.freeze - alias_method :rack_params, :params + alias rack_params params def params @params ||= build_params diff --git a/lib/grape/router.rb b/lib/grape/router.rb index 0f04c403e..a63c43822 100644 --- a/lib/grape/router.rb +++ b/lib/grape/router.rb @@ -132,7 +132,7 @@ def method_not_allowed(env, methods, endpoint) lazy_initialize! run_filters befores, :before @block = proc do - fail Grape::Exceptions::MethodNotAllowed, header.merge('Allow' => methods) + raise Grape::Exceptions::MethodNotAllowed, header.merge('Allow' => methods) end end current.call(env) diff --git a/lib/grape/router/pattern.rb b/lib/grape/router/pattern.rb index 4e3ca75b9..7c404c719 100644 --- a/lib/grape/router/pattern.rb +++ b/lib/grape/router/pattern.rb @@ -12,7 +12,7 @@ class Pattern extend Forwardable def_delegators :pattern, :named_captures, :params def_delegators :@regexp, :=== - alias_method :match?, :=== + alias match? === def initialize(pattern, options = {}) @origin = pattern @@ -30,7 +30,7 @@ def to_regexp def pattern_options options = DEFAULT_PATTERN_OPTIONS.dup - options.merge!(capture: capture) if capture.present? + options[:capture] = capture if capture.present? options end diff --git a/lib/grape/router/route.rb b/lib/grape/router/route.rb index 351b6c79b..a682a554f 100644 --- a/lib/grape/router/route.rb +++ b/lib/grape/router/route.rb @@ -6,13 +6,13 @@ module Grape class Router class Route - ROUTE_ATTRIBUTE_REGEXP = /route_([_a-zA-Z]\w*)/.freeze - SOURCE_LOCATION_REGEXP = /^(.*?):(\d+?)(?::in `.+?')?$/.freeze + ROUTE_ATTRIBUTE_REGEXP = /route_([_a-zA-Z]\w*)/ + SOURCE_LOCATION_REGEXP = /^(.*?):(\d+?)(?::in `.+?')?$/ FIXED_NAMED_CAPTURES = %w(format version).freeze attr_accessor :pattern, :translator, :app, :index, :regexp, :options - alias_method :attributes, :translator + alias attributes translator extend Forwardable def_delegators :pattern, :path, :origin diff --git a/lib/grape/util/content_types.rb b/lib/grape/util/content_types.rb index c80aee63f..8b2122402 100644 --- a/lib/grape/util/content_types.rb +++ b/lib/grape/util/content_types.rb @@ -1,7 +1,7 @@ module Grape module ContentTypes # Content types are listed in order of preference. - CONTENT_TYPES = { + CONTENT_TYPES = { # rubocop:disable Style/MutableConstant xml: 'application/xml', serializable_hash: 'application/json', json: 'application/json', diff --git a/lib/grape/util/stackable_values.rb b/lib/grape/util/stackable_values.rb index 5f876e8ae..7a94eb3e5 100644 --- a/lib/grape/util/stackable_values.rb +++ b/lib/grape/util/stackable_values.rb @@ -20,7 +20,7 @@ def [](name) end def []=(name, value) - fail if @froozen_values.key? name + raise if @froozen_values.key? name @new_values[name] ||= [] @new_values[name].push value end diff --git a/lib/grape/validations/params_scope.rb b/lib/grape/validations/params_scope.rb index 7466ce5f3..b338faac3 100644 --- a/lib/grape/validations/params_scope.rb +++ b/lib/grape/validations/params_scope.rb @@ -111,7 +111,7 @@ def require_required_and_optional_fields(context, opts) end required_fields.each do |field| field_opts = opts[:using][field] - fail ArgumentError, "required field not exist: #{field}" unless field_opts + raise ArgumentError, "required field not exist: #{field}" unless field_opts requires(field, field_opts) end optional_fields.each do |field| @@ -146,8 +146,8 @@ def new_scope(attrs, optional = false, &block) # if required params are grouped and no type or unsupported type is provided, raise an error type = attrs[1] ? attrs[1][:type] : nil if attrs.first && !optional - fail Grape::Exceptions::MissingGroupTypeError.new if type.nil? - fail Grape::Exceptions::UnsupportedGroupTypeError.new unless Grape::Validations::Types.group?(type) + raise Grape::Exceptions::MissingGroupTypeError.new if type.nil? + raise Grape::Exceptions::UnsupportedGroupTypeError.new unless Grape::Validations::Types.group?(type) end opts = attrs[1] || { type: Array } @@ -204,7 +204,7 @@ def validates(attrs, validations) default = validations[:default] doc_attrs[:default] = default if validations.key?(:default) - values = (options_key?(:values, :value, validations)) ? validations[:values][:value] : validations[:values] + values = options_key?(:values, :value, validations) ? validations[:values][:value] : validations[:values] doc_attrs[:values] = values if values coerce_type = guess_coerce_type(coerce_type, values) @@ -252,7 +252,7 @@ def validates(attrs, validations) # @raise [ArgumentError] if the given type options are invalid def infer_coercion(validations) if validations.key?(:type) && validations.key?(:types) - fail ArgumentError, ':type may not be supplied with :types' + raise ArgumentError, ':type may not be supplied with :types' end validations[:coerce] = (options_key?(:type, :value, validations) ? validations[:type][:value] : validations[:type]) if validations.key?(:type) @@ -284,12 +284,12 @@ def infer_coercion(validations) def check_coerce_with(validations) return unless validations.key?(:coerce_with) # type must be supplied for coerce_with.. - fail ArgumentError, 'must supply type for coerce_with' unless validations.key?(:coerce) + raise ArgumentError, 'must supply type for coerce_with' unless validations.key?(:coerce) # but not special JSON types, which # already imply coercion method return unless [JSON, Array[JSON]].include? validations[:coerce] - fail ArgumentError, 'coerce_with disallowed for type: JSON' + raise ArgumentError, 'coerce_with disallowed for type: JSON' end # Add type coercion validation to this scope, @@ -324,18 +324,16 @@ def check_incompatible_option_values(values, default) return unless values && default return if values.is_a?(Proc) || default.is_a?(Proc) return if values.include?(default) || (Array(default) - Array(values)).empty? - fail Grape::Exceptions::IncompatibleOptionValues.new(:default, default, :values, values) + raise Grape::Exceptions::IncompatibleOptionValues.new(:default, default, :values, values) end def validate(type, options, attrs, doc_attrs) validator_class = Validations.validators[type.to_s] - if validator_class - value = validator_class.new(attrs, options, doc_attrs[:required], self) - @api.namespace_stackable(:validations, value) - else - fail Grape::Exceptions::UnknownValidator.new(type) - end + raise Grape::Exceptions::UnknownValidator.new(type) unless validator_class + + value = validator_class.new(attrs, options, doc_attrs[:required], self) + @api.namespace_stackable(:validations, value) end def validate_value_coercion(coerce_type, values) @@ -347,7 +345,7 @@ def validate_value_coercion(coerce_type, values) value_types = value_types.map { |type| Virtus::Attribute.build(type) } end return unless value_types.any? { |v| !v.is_a?(coerce_type) } - fail Grape::Exceptions::IncompatibleOptionValues.new(:type, coerce_type, :values, values) + raise Grape::Exceptions::IncompatibleOptionValues.new(:type, coerce_type, :values, values) end def extract_message_option(attrs) diff --git a/lib/grape/validations/types.rb b/lib/grape/validations/types.rb index 5a7481a33..7cd4118b8 100644 --- a/lib/grape/validations/types.rb +++ b/lib/grape/validations/types.rb @@ -45,14 +45,14 @@ class InvalidValue; end String, Symbol, Rack::Multipart::UploadedFile - ] + ].freeze # Types representing data structures. STRUCTURES = [ Hash, Array, Set - ] + ].freeze # Types for which Grape provides special coercion # and type-checking logic. @@ -61,14 +61,14 @@ class InvalidValue; end Array[JSON] => JsonArray, ::File => File, Rack::Multipart::UploadedFile => File - } + }.freeze GROUPS = [ Array, Hash, JSON, Array[JSON] - ] + ].freeze # Is the given class a primitive type as recognized by Grape? # diff --git a/lib/grape/validations/validators/all_or_none.rb b/lib/grape/validations/validators/all_or_none.rb index 2c9b54037..02a06851d 100644 --- a/lib/grape/validations/validators/all_or_none.rb +++ b/lib/grape/validations/validators/all_or_none.rb @@ -5,7 +5,7 @@ class AllOrNoneOfValidator < MultipleParamsBase def validate!(params) super if scope_requires_params && only_subset_present - fail Grape::Exceptions::Validation, params: all_keys, message: message(:all_or_none) + raise Grape::Exceptions::Validation, params: all_keys, message: message(:all_or_none) end params end @@ -13,7 +13,7 @@ def validate!(params) private def only_subset_present - scoped_params.any? { |resource_params| keys_in_common(resource_params).length > 0 && keys_in_common(resource_params).length < attrs.length } + scoped_params.any? { |resource_params| !keys_in_common(resource_params).empty? && keys_in_common(resource_params).length < attrs.length } end end end diff --git a/lib/grape/validations/validators/allow_blank.rb b/lib/grape/validations/validators/allow_blank.rb index e4216bf42..dc3324426 100644 --- a/lib/grape/validations/validators/allow_blank.rb +++ b/lib/grape/validations/validators/allow_blank.rb @@ -9,21 +9,20 @@ def validate_param!(attr_name, params) key_exists = params.key?(attr_name) - if @scope.root? - # root scope. validate if it's a required param. if it's optional, validate only if key exists in hash - should_validate = @required || key_exists - else # nested scope - should_validate = # required param, and scope contains some values (if scoping element contains no values, treat as blank) - (@required && params.present?) || - # optional param but key inside scoping element exists - (!@required && params.key?(attr_name)) - end + should_validate = if @scope.root? + # root scope. validate if it's a required param. if it's optional, validate only if key exists in hash + @required || key_exists + else # nested scope + (@required && params.present?) || + # optional param but key inside scoping element exists + (!@required && params.key?(attr_name)) + end return unless should_validate return if value == false || value.present? - fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:blank) + raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:blank) end end end diff --git a/lib/grape/validations/validators/at_least_one_of.rb b/lib/grape/validations/validators/at_least_one_of.rb index 9e7f47b51..077393b63 100644 --- a/lib/grape/validations/validators/at_least_one_of.rb +++ b/lib/grape/validations/validators/at_least_one_of.rb @@ -5,7 +5,7 @@ class AtLeastOneOfValidator < MultipleParamsBase def validate!(params) super if scope_requires_params && no_exclusive_params_are_present - fail Grape::Exceptions::Validation, params: all_keys, message: message(:at_least_one) + raise Grape::Exceptions::Validation, params: all_keys, message: message(:at_least_one) end params end diff --git a/lib/grape/validations/validators/base.rb b/lib/grape/validations/validators/base.rb index 35c5cfc5b..9082c222b 100644 --- a/lib/grape/validations/validators/base.rb +++ b/lib/grape/validations/validators/base.rb @@ -44,10 +44,10 @@ def validate!(params) def self.convert_to_short_name(klass) ret = klass.name.gsub(/::/, '/') - .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2') - .gsub(/([a-z\d])([A-Z])/, '\1_\2') - .tr('-', '_') - .downcase + .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2') + .gsub(/([a-z\d])([A-Z])/, '\1_\2') + .tr('-', '_') + .downcase File.basename(ret, '_validator') end diff --git a/lib/grape/validations/validators/coerce.rb b/lib/grape/validations/validators/coerce.rb index 8980659cc..f4710a6bb 100644 --- a/lib/grape/validations/validators/coerce.rb +++ b/lib/grape/validations/validators/coerce.rb @@ -11,13 +11,10 @@ def initialize(*_args) end def validate_param!(attr_name, params) - fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:coerce) unless params.is_a? Hash + raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:coerce) unless params.is_a? Hash new_value = coerce_value(params[attr_name]) - if valid_type?(new_value) - params[attr_name] = new_value - else - fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:coerce) - end + raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:coerce) unless valid_type?(new_value) + params[attr_name] = new_value end private diff --git a/lib/grape/validations/validators/exactly_one_of.rb b/lib/grape/validations/validators/exactly_one_of.rb index 4b23cd8a0..07283c783 100644 --- a/lib/grape/validations/validators/exactly_one_of.rb +++ b/lib/grape/validations/validators/exactly_one_of.rb @@ -5,7 +5,7 @@ class ExactlyOneOfValidator < MutualExclusionValidator def validate!(params) super if scope_requires_params && none_of_restricted_params_is_present - fail Grape::Exceptions::Validation, params: all_keys, message: message(:exactly_one) + raise Grape::Exceptions::Validation, params: all_keys, message: message(:exactly_one) end params end diff --git a/lib/grape/validations/validators/mutual_exclusion.rb b/lib/grape/validations/validators/mutual_exclusion.rb index 32bdd1f5a..d46d56351 100644 --- a/lib/grape/validations/validators/mutual_exclusion.rb +++ b/lib/grape/validations/validators/mutual_exclusion.rb @@ -7,7 +7,7 @@ class MutualExclusionValidator < MultipleParamsBase def validate!(params) super if two_or_more_exclusive_params_are_present - fail Grape::Exceptions::Validation, params: processing_keys_in_common, message: message(:mutual_exclusion) + raise Grape::Exceptions::Validation, params: processing_keys_in_common, message: message(:mutual_exclusion) end params end diff --git a/lib/grape/validations/validators/presence.rb b/lib/grape/validations/validators/presence.rb index cc11c4c4b..0993407eb 100644 --- a/lib/grape/validations/validators/presence.rb +++ b/lib/grape/validations/validators/presence.rb @@ -8,7 +8,7 @@ def validate!(params) def validate_param!(attr_name, params) return if params.respond_to?(:key?) && params.key?(attr_name) - fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:presence) + raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:presence) end end end diff --git a/lib/grape/validations/validators/regexp.rb b/lib/grape/validations/validators/regexp.rb index 8e5c78f63..80fe4c12d 100644 --- a/lib/grape/validations/validators/regexp.rb +++ b/lib/grape/validations/validators/regexp.rb @@ -3,7 +3,7 @@ module Validations class RegexpValidator < Base def validate_param!(attr_name, params) return unless params.key?(attr_name) && !params[attr_name].nil? && !(params[attr_name].to_s =~ (options_key?(:value) ? @option[:value] : @option)) - fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:regexp) + raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:regexp) end end end diff --git a/lib/grape/validations/validators/values.rb b/lib/grape/validations/validators/values.rb index 26f11cec6..27c186ff5 100644 --- a/lib/grape/validations/validators/values.rb +++ b/lib/grape/validations/validators/values.rb @@ -13,7 +13,7 @@ def validate_param!(attr_name, params) values = @values.is_a?(Proc) ? @values.call : @values param_array = params[attr_name].nil? ? [nil] : Array.wrap(params[attr_name]) return if param_array.all? { |param| values.include?(param) } - fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:values) + raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:values) end private diff --git a/lib/grape/version.rb b/lib/grape/version.rb index 96c744247..b503dbc62 100644 --- a/lib/grape/version.rb +++ b/lib/grape/version.rb @@ -1,4 +1,4 @@ module Grape # The current version of Grape. - VERSION = '0.16.3' + VERSION = '0.16.3'.freeze end diff --git a/spec/grape/api/custom_validations_spec.rb b/spec/grape/api/custom_validations_spec.rb index 3b3da1268..278beb7a9 100644 --- a/spec/grape/api/custom_validations_spec.rb +++ b/spec/grape/api/custom_validations_spec.rb @@ -8,7 +8,7 @@ class DefaultLength < Grape::Validations::Base def validate_param!(attr_name, params) @option = params[:max].to_i if params.key?(:max) return if params[attr_name].length <= @option - fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: "must be at the most #{@option} characters long" + raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: "must be at the most #{@option} characters long" end end end @@ -87,7 +87,7 @@ def app module CustomValidationsSpec class WithMessageKey < Grape::Validations::PresenceValidator def validate_param!(attr_name, _params) - fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: :presence + raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: :presence end end end @@ -126,7 +126,7 @@ def validate(request) return unless @option # check if user is admin or not # as an example get a token from request and check if it's admin or not - fail Grape::Exceptions::Validation, params: @attrs, message: 'Can not set Admin only field.' unless request.headers['X-Access-Token'] == 'admin' + raise Grape::Exceptions::Validation, params: @attrs, message: 'Can not set Admin only field.' unless request.headers['X-Access-Token'] == 'admin' end end end diff --git a/spec/grape/api_spec.rb b/spec/grape/api_spec.rb index 476c8556f..2d1a6d70c 100644 --- a/spec/grape/api_spec.rb +++ b/spec/grape/api_spec.rb @@ -258,7 +258,7 @@ def app end end get '/route_param/1234' - expect(last_response.body).to eq("{\"foo\":1234}") + expect(last_response.body).to eq('{"foo":1234}') end end end @@ -1383,7 +1383,7 @@ def three describe '.rescue_from' do it 'does not rescue errors when rescue_from is not set' do subject.get '/exception' do - fail 'rain!' + raise 'rain!' end expect { get '/exception' }.to raise_error(RuntimeError, 'rain!') end @@ -1396,7 +1396,7 @@ def custom_error!(name) end subject.rescue_from(ArgumentError) { custom_error! :bob } subject.get '/custom_error' do - fail ArgumentError + raise ArgumentError end get '/custom_error' expect(last_response.body).to eq 'hello bob' @@ -1405,7 +1405,7 @@ def custom_error!(name) it 'rescues all errors if rescue_from :all is called' do subject.rescue_from :all subject.get '/exception' do - fail 'rain!' + raise 'rain!' end get '/exception' expect(last_response.status).to eql 500 @@ -1417,7 +1417,7 @@ def custom_error!(name) subject.default_format :json subject.rescue_from :all subject.get '/exception' do - fail 'rain!' + raise 'rain!' end get '/exception' expect(last_response.status).to eql 500 @@ -1426,8 +1426,8 @@ def custom_error!(name) it 'rescues only certain errors if rescue_from is called with specific errors' do subject.rescue_from ArgumentError - subject.get('/rescued') { fail ArgumentError } - subject.get('/unrescued') { fail 'beefcake' } + subject.get('/rescued') { raise ArgumentError } + subject.get('/unrescued') { raise 'beefcake' } get '/rescued' expect(last_response.status).to eql 500 @@ -1443,7 +1443,7 @@ class CustomError < Grape::Exceptions::Base; end end it 'does not re-raise exceptions of type Grape::Exceptions::Base' do - subject.get('/custom_exception') { fail ApiSpec::CustomError } + subject.get('/custom_exception') { raise ApiSpec::CustomError } expect { get '/custom_exception' }.not_to raise_error end @@ -1453,7 +1453,7 @@ class CustomError < Grape::Exceptions::Base; end rack_response('New Error', e.status) end subject.get '/custom_error' do - fail ApiSpec::CustomError, status: 400, message: 'Custom Error' + raise ApiSpec::CustomError, status: 400, message: 'Custom Error' end get '/custom_error' @@ -1464,7 +1464,7 @@ class CustomError < Grape::Exceptions::Base; end it 'can rescue exceptions raised in the formatter' do formatter = double(:formatter) - allow(formatter).to receive(:call) { fail StandardError } + allow(formatter).to receive(:call) { raise StandardError } allow(Grape::Formatter).to receive(:formatter_for) { formatter } subject.rescue_from :all do |_e| @@ -1484,7 +1484,7 @@ class CustomError < Grape::Exceptions::Base; end rack_response("rescued from #{e.message}", 202) end subject.get '/exception' do - fail 'rain!' + raise 'rain!' end get '/exception' expect(last_response.status).to eql 202 @@ -1503,7 +1503,7 @@ class CommunicationError < StandardError; end rack_response("rescued from #{e.class.name}", 500) end subject.get '/exception' do - fail ConnectionError + raise ConnectionError end get '/exception' expect(last_response.status).to eql 500 @@ -1514,7 +1514,7 @@ class CommunicationError < StandardError; end rack_response("rescued from #{e.class.name}", 500) end subject.get '/exception' do - fail ConnectionError + raise ConnectionError end get '/exception' expect(last_response.status).to eql 500 @@ -1525,7 +1525,7 @@ class CommunicationError < StandardError; end rack_response("rescued from #{e.class.name}", 500) end subject.get '/exception' do - fail ConnectionError + raise ConnectionError end get '/exception' expect(last_response.status).to eql 500 @@ -1539,10 +1539,10 @@ class CommunicationError < StandardError; end rack_response("rescued from #{e.class.name}", 500) end subject.get '/connection' do - fail ConnectionError + raise ConnectionError end subject.get '/database' do - fail DatabaseError + raise DatabaseError end get '/connection' expect(last_response.status).to eql 500 @@ -1556,7 +1556,7 @@ class CommunicationError < StandardError; end rack_response("rescued from #{e.class.name}", 500) end subject.get '/uncaught' do - fail CommunicationError + raise CommunicationError end expect { get '/uncaught' }.to raise_error(CommunicationError) end @@ -1568,7 +1568,7 @@ class CommunicationError < StandardError; end subject.rescue_from ArgumentError, lambda { rack_response('rescued with a lambda', 400) } - subject.get('/rescue_lambda') { fail ArgumentError } + subject.get('/rescue_lambda') { raise ArgumentError } get '/rescue_lambda' expect(last_response.status).to eq(400) @@ -1579,7 +1579,7 @@ class CommunicationError < StandardError; end subject.rescue_from ArgumentError, lambda { |e| rack_response(e.message, 400) } - subject.get('/rescue_lambda') { fail ArgumentError, 'lambda takes an argument' } + subject.get('/rescue_lambda') { raise ArgumentError, 'lambda takes an argument' } get '/rescue_lambda' expect(last_response.status).to eq(400) @@ -1600,8 +1600,8 @@ def rescue_no_method_error end subject.rescue_from ArgumentError, with: :rescue_arg_error subject.rescue_from NoMethodError, with: :rescue_no_method_error - subject.get('/rescue_arg_error') { fail ArgumentError } - subject.get('/rescue_no_method_error') { fail NoMethodError } + subject.get('/rescue_arg_error') { raise ArgumentError } + subject.get('/rescue_no_method_error') { raise NoMethodError } get '/rescue_arg_error' expect(last_response.status).to eq(500) @@ -1614,7 +1614,7 @@ def rescue_no_method_error it 'aborts if the specified method name does not exist' do subject.rescue_from :all, with: :not_exist_method - subject.get('/rescue_method') { fail StandardError } + subject.get('/rescue_method') { raise StandardError } expect { get '/rescue_method' }.to raise_error(NoMethodError, 'undefined method `not_exist_method\'') end @@ -1632,8 +1632,8 @@ def rescue_all_errors subject.rescue_from ArgumentError, with: :rescue_arg_error subject.rescue_from :all, with: :rescue_all_errors - subject.get('/argument_error') { fail ArgumentError } - subject.get('/another_error') { fail NoMethodError } + subject.get('/argument_error') { raise ArgumentError } + subject.get('/another_error') { raise NoMethodError } get '/argument_error' expect(last_response.status).to eq(500) @@ -1660,13 +1660,13 @@ class ChildError < ParentError; end rack_response("rescued from #{e.class.name}", 500) end subject.get '/caught_child' do - fail ApiSpec::APIErrors::ChildError + raise ApiSpec::APIErrors::ChildError end subject.get '/caught_parent' do - fail ApiSpec::APIErrors::ParentError + raise ApiSpec::APIErrors::ParentError end subject.get '/uncaught_parent' do - fail StandardError + raise StandardError end get '/caught_child' @@ -1681,7 +1681,7 @@ class ChildError < ParentError; end rack_response("rescued from #{e.class.name}", 500) end subject.get '/caught_child' do - fail ApiSpec::APIErrors::ChildError + raise ApiSpec::APIErrors::ChildError end get '/caught_child' @@ -1693,7 +1693,7 @@ class ChildError < ParentError; end rack_response("rescued from #{e.class.name}", 500) end subject.get '/uncaught' do - fail ApiSpec::APIErrors::ChildError + raise ApiSpec::APIErrors::ChildError end expect { get '/uncaught' }.to raise_error(ApiSpec::APIErrors::ChildError) end @@ -1704,7 +1704,7 @@ class ChildError < ParentError; end subject.rescue_from :all subject.format :txt subject.get '/exception' do - fail 'rain!' + raise 'rain!' end get '/exception' expect(last_response.body).to eql 'rain!' @@ -1714,7 +1714,7 @@ class ChildError < ParentError; end subject.rescue_from :all, backtrace: true subject.format :txt subject.get '/exception' do - fail 'rain!' + raise 'rain!' end get '/exception' expect(last_response.body.start_with?("rain!\r\n")).to be true @@ -1725,7 +1725,7 @@ class ChildError < ParentError; end subject.content_type :foo, 'text/foo' subject.rescue_from :all subject.get '/exception' do - fail 'rain!' + raise 'rain!' end get '/exception.foo' expect(last_response.body).to start_with 'rain!' @@ -1737,7 +1737,7 @@ class ChildError < ParentError; end subject.content_type :json, 'application/json' subject.content_type :foo, 'text/foo' subject.get '/exception' do - fail 'rain!' + raise 'rain!' end get '/exception.json' expect(last_response.body).to eq('{"error":"rain!"}') @@ -1759,7 +1759,7 @@ def self.call(message, _backtrace, _options, _env) subject.rescue_from :all, backtrace: true subject.error_formatter :txt, ApiSpec::CustomErrorFormatter subject.get '/exception' do - fail 'rain!' + raise 'rain!' end get '/exception' expect(last_response.body).to eq('message: rain! @backtrace') @@ -1781,7 +1781,7 @@ def self.call(message, _backtrace, _option, _env) it 'returns a custom error format' do subject.rescue_from :all, backtrace: true subject.error_formatter :txt, with: ApiSpec::CustomErrorFormatter - subject.get('/exception') { fail 'rain!' } + subject.get('/exception') { raise 'rain!' } get '/exception' expect(last_response.body).to eq('message: rain! @backtrace') @@ -1793,7 +1793,7 @@ def self.call(message, _backtrace, _option, _env) subject.rescue_from :all subject.format :json subject.get '/exception' do - fail 'rain!' + raise 'rain!' end get '/exception' expect(last_response.body).to eql '{"error":"rain!"}' @@ -1802,7 +1802,7 @@ def self.call(message, _backtrace, _option, _env) subject.rescue_from :all, backtrace: true subject.format :json subject.get '/exception' do - fail 'rain!' + raise 'rain!' end get '/exception' json = MultiJson.load(last_response.body) @@ -2030,7 +2030,7 @@ def self.call(object, _env) subject.rescue_from :all subject.default_error_status 200 subject.get '/exception' do - fail 'rain!' + raise 'rain!' end get '/exception' expect(last_response.status).to eql 200 @@ -2038,7 +2038,7 @@ def self.call(object, _env) it 'has a default error status' do subject.rescue_from :all subject.get '/exception' do - fail 'rain!' + raise 'rain!' end get '/exception' expect(last_response.status).to eql 500 @@ -2604,7 +2604,7 @@ def static subject.namespace :mounted do app.rescue_from ArgumentError - app.get('/fail') { fail 'doh!' } + app.get('/fail') { raise 'doh!' } mount app end diff --git a/spec/grape/dsl/logger_spec.rb b/spec/grape/dsl/logger_spec.rb index bc7884ba0..4a4ce831c 100644 --- a/spec/grape/dsl/logger_spec.rb +++ b/spec/grape/dsl/logger_spec.rb @@ -18,7 +18,7 @@ class Dummy end it 'returns a logger' do - expect(subject.logger logger).to eq logger + expect(subject.logger(logger)).to eq logger end end end diff --git a/spec/grape/dsl/validations_spec.rb b/spec/grape/dsl/validations_spec.rb index 6f84dafed..a97bac5ed 100644 --- a/spec/grape/dsl/validations_spec.rb +++ b/spec/grape/dsl/validations_spec.rb @@ -51,7 +51,7 @@ class Dummy end it 'evaluates block' do - expect { subject.params { fail 'foo' } }.to raise_error RuntimeError, 'foo' + expect { subject.params { raise 'foo' } }.to raise_error RuntimeError, 'foo' end end diff --git a/spec/grape/endpoint_spec.rb b/spec/grape/endpoint_spec.rb index 139200e37..934728822 100644 --- a/spec/grape/endpoint_spec.rb +++ b/spec/grape/endpoint_spec.rb @@ -577,7 +577,7 @@ def app params[:person_email] end - namespace :inner, requirements: { number: /[0-9]/, person_email: /someone@(.*).com/ }do + namespace :inner, requirements: { number: /[0-9]/, person_email: /someone@(.*).com/ } do get '/:person_email/test/:number' do params[:person_email] << params[:number] end diff --git a/spec/grape/exceptions/validation_errors_spec.rb b/spec/grape/exceptions/validation_errors_spec.rb index b29b52cd9..54816a7e3 100644 --- a/spec/grape/exceptions/validation_errors_spec.rb +++ b/spec/grape/exceptions/validation_errors_spec.rb @@ -69,9 +69,9 @@ def app get '/exactly_one_of', beer: 'string', wine: 'anotherstring' expect(last_response.status).to eq(400) expect(JSON.parse(last_response.body)).to eq([ - 'params' => %w(beer wine), - 'messages' => ['are mutually exclusive'] - ]) + 'params' => %w(beer wine), + 'messages' => ['are mutually exclusive'] + ]) end end end diff --git a/spec/grape/integration/global_namespace_function_spec.rb b/spec/grape/integration/global_namespace_function_spec.rb index 78c99da2d..014280cd6 100644 --- a/spec/grape/integration/global_namespace_function_spec.rb +++ b/spec/grape/integration/global_namespace_function_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' def namespace - fail + raise end describe Grape::API do diff --git a/spec/grape/middleware/base_spec.rb b/spec/grape/middleware/base_spec.rb index 6ec58059a..8163fd1f1 100644 --- a/spec/grape/middleware/base_spec.rb +++ b/spec/grape/middleware/base_spec.rb @@ -30,7 +30,7 @@ end context 'callbacks on error' do - let(:blank_app) { ->(_) { fail StandardError } } + let(:blank_app) { ->(_) { raise StandardError } } it 'calls #after' do expect(subject).to receive(:after) diff --git a/spec/grape/middleware/exception_spec.rb b/spec/grape/middleware/exception_spec.rb index 413050e10..362cc3eba 100644 --- a/spec/grape/middleware/exception_spec.rb +++ b/spec/grape/middleware/exception_spec.rb @@ -6,7 +6,7 @@ module ExceptionSpec class ExceptionApp class << self def call(_env) - fail 'rain!' + raise 'rain!' end end end @@ -44,7 +44,7 @@ class CustomError < Grape::Exceptions::Base class CustomErrorApp class << self def call(_env) - fail CustomError, status: 400, message: 'failed validation' + raise CustomError, status: 400, message: 'failed validation' end end end diff --git a/spec/grape/middleware/formatter_spec.rb b/spec/grape/middleware/formatter_spec.rb index e2cfe2444..5a1fd1120 100644 --- a/spec/grape/middleware/formatter_spec.rb +++ b/spec/grape/middleware/formatter_spec.rb @@ -17,7 +17,7 @@ @body = ['foo'] @body.instance_eval do def to_json - "\"bar\"" + '"bar"' end end @@ -28,7 +28,7 @@ def to_json @body = { 'foos' => [{ 'bar' => 'baz' }] } @body.instance_eval do def to_json - "{\"foos\":[{\"bar\":\"baz\"}] }" + '{"foos":[{"bar":"baz"}] }' end end @@ -54,7 +54,7 @@ def to_xml end it 'rescues formatter-specific exceptions' do - allow(formatter).to receive(:call) { fail Grape::Exceptions::InvalidFormatter.new(String, 'xml') } + allow(formatter).to receive(:call) { raise Grape::Exceptions::InvalidFormatter.new(String, 'xml') } expect do catch(:error) { subject.call('PATH_INFO' => '/somewhere.xml', 'HTTP_ACCEPT' => 'application/json') } @@ -62,7 +62,7 @@ def to_xml end it 'does not rescue other exceptions' do - allow(formatter).to receive(:call) { fail StandardError } + allow(formatter).to receive(:call) { raise StandardError } expect do catch(:error) { subject.call('PATH_INFO' => '/somewhere.xml', 'HTTP_ACCEPT' => 'application/json') } diff --git a/spec/grape/validations/params_scope_spec.rb b/spec/grape/validations/params_scope_spec.rb index f26daa826..693205ca9 100644 --- a/spec/grape/validations/params_scope_spec.rb +++ b/spec/grape/validations/params_scope_spec.rb @@ -95,7 +95,7 @@ class CustomType attr_reader :value def self.parse(value) - fail if value == 'invalid' + raise if value == 'invalid' new(value) end diff --git a/spec/grape/validations/validators/coerce_spec.rb b/spec/grape/validations/validators/coerce_spec.rb index ad5d65105..370cf39d3 100644 --- a/spec/grape/validations/validators/coerce_spec.rb +++ b/spec/grape/validations/validators/coerce_spec.rb @@ -1,3 +1,4 @@ + # encoding: utf-8 require 'spec_helper' @@ -453,8 +454,8 @@ class User subject.get '/' do if params[:splines].is_a? Hash params[:splines][:obj][:y] - else - 'arrays work' if params[:splines].any? { |s| s.key? :obj } + elsif params[:splines].any? { |s| s.key? :obj } + 'arrays work' end end @@ -488,8 +489,8 @@ class User subject.get '/' do if params[:splines].is_a? Hash params[:splines][:obj][:y] - else - 'arrays work' if params[:splines].any? { |s| s.key? :obj } + elsif params[:splines].any? { |s| s.key? :obj } + 'arrays work' end end diff --git a/spec/grape/validations/validators/values_spec.rb b/spec/grape/validations/validators/values_spec.rb index 064dffc54..5fef15506 100644 --- a/spec/grape/validations/validators/values_spec.rb +++ b/spec/grape/validations/validators/values_spec.rb @@ -3,7 +3,7 @@ describe Grape::Validations::ValuesValidator do module ValidationsSpec class ValuesModel - DEFAULT_VALUES = ['valid-type1', 'valid-type2', 'valid-type3'] + DEFAULT_VALUES = ['valid-type1', 'valid-type2', 'valid-type3'].freeze class << self def values @values ||= [] diff --git a/spec/grape/validations_spec.rb b/spec/grape/validations_spec.rb index cd6437832..d37968323 100644 --- a/spec/grape/validations_spec.rb +++ b/spec/grape/validations_spec.rb @@ -396,7 +396,7 @@ def define_requires_none end end - it 'errors when group param is invalid'do + it 'errors when group param is invalid' do post '/group_with_nested', items: invalid_items expect(last_response.status).to eq(400) end @@ -408,7 +408,7 @@ module DateRangeValidations class DateRangeValidator < Grape::Validations::Base def validate_param!(attr_name, params) return if params[attr_name][:from] <= params[attr_name][:to] - fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: "'from' must be lower or equal to 'to'" + raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: "'from' must be lower or equal to 'to'" end end end @@ -794,7 +794,7 @@ module CustomValidations class Customvalidator < Grape::Validations::Base def validate_param!(attr_name, params) return if params[attr_name] == 'im custom' - fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: 'is not custom!' + raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: 'is not custom!' end end end @@ -942,7 +942,7 @@ module CustomValidations class CustomvalidatorWithOptions < Grape::Validations::Base def validate_param!(attr_name, params) return if params[attr_name] == @option[:text] - fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message + raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message end end end diff --git a/spec/support/versioned_helpers.rb b/spec/support/versioned_helpers.rb index 96ef4ba89..045c9f521 100644 --- a/spec/support/versioned_helpers.rb +++ b/spec/support/versioned_helpers.rb @@ -13,7 +13,7 @@ def versioned_path(options = {}) when :accept_version_header File.join('/', options[:prefix] || '', options[:path]) else - fail ArgumentError.new("unknown versioning strategy: #{options[:using]}") + raise ArgumentError.new("unknown versioning strategy: #{options[:using]}") end end @@ -32,10 +32,10 @@ def versioned_headers(options) } when :accept_version_header { - 'HTTP_ACCEPT_VERSION' => "#{options[:version]}" + 'HTTP_ACCEPT_VERSION' => options[:version].to_s } else - fail ArgumentError.new("unknown versioning strategy: #{options[:using]}") + raise ArgumentError.new("unknown versioning strategy: #{options[:using]}") end end From 77b47c45cc34bb64b9b360b5fb809fa88caf8360 Mon Sep 17 00:00:00 2001 From: dblock Date: Tue, 26 Apr 2016 16:28:42 -0400 Subject: [PATCH 3/3] Fix: RDoc documentation generation. --- Gemfile | 3 ++- README.md | 2 +- gemfiles/rack_1.5.2.gemfile | 3 ++- gemfiles/rails_3.gemfile | 3 ++- gemfiles/rails_4.gemfile | 3 ++- spec/grape/validations/validators/coerce_spec.rb | 1 - 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 3b09625a7..add53e6b9 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,4 @@ -# when changing this file, run appraisal install ; rubocop -a gemfiles/* +# when changing this file, run appraisal install ; rubocop -a gemfiles/*.gemfile source 'https://rubygems.org' @@ -17,6 +17,7 @@ group :development do gem 'yard' gem 'appraisal' gem 'benchmark-ips' + gem 'redcarpet' end group :test do diff --git a/README.md b/README.md index f760b20d7..eeaae503e 100644 --- a/README.md +++ b/README.md @@ -2316,7 +2316,7 @@ module API expose :text, documentation: { type: 'string', desc: 'Status update text.' } expose :ip, if: { type: :full } expose :user_type, :user_id, if: ->(status, options) { status.user.public? } - expose :digest do |status, options| + expose :digest do |status, options| Digest::MD5.hexdigest(status.txt) end expose :replies, using: API::Status, as: :replies diff --git a/gemfiles/rack_1.5.2.gemfile b/gemfiles/rack_1.5.2.gemfile index ea96ee147..c37797677 100644 --- a/gemfiles/rack_1.5.2.gemfile +++ b/gemfiles/rack_1.5.2.gemfile @@ -7,7 +7,7 @@ gem 'rack', '1.5.2' group :development, :test do gem 'bundler' gem 'rake' - gem 'rubocop', '0.35.1' + gem 'rubocop', '0.39.0' end group :development do @@ -17,6 +17,7 @@ group :development do gem 'yard' gem 'appraisal' gem 'benchmark-ips' + gem 'redcarpet' end group :test do diff --git a/gemfiles/rails_3.gemfile b/gemfiles/rails_3.gemfile index cd4dfbc0f..cd0073123 100644 --- a/gemfiles/rails_3.gemfile +++ b/gemfiles/rails_3.gemfile @@ -8,7 +8,7 @@ gem 'rack-cache', '<= 1.2' group :development, :test do gem 'bundler' gem 'rake' - gem 'rubocop', '0.35.1' + gem 'rubocop', '0.39.0' end group :development do @@ -18,6 +18,7 @@ group :development do gem 'yard' gem 'appraisal' gem 'benchmark-ips' + gem 'redcarpet' end group :test do diff --git a/gemfiles/rails_4.gemfile b/gemfiles/rails_4.gemfile index 136ec2b81..a768239aa 100644 --- a/gemfiles/rails_4.gemfile +++ b/gemfiles/rails_4.gemfile @@ -7,7 +7,7 @@ gem 'rails', '4.1.6' group :development, :test do gem 'bundler' gem 'rake' - gem 'rubocop', '0.35.1' + gem 'rubocop', '0.39.0' end group :development do @@ -17,6 +17,7 @@ group :development do gem 'yard' gem 'appraisal' gem 'benchmark-ips' + gem 'redcarpet' end group :test do diff --git a/spec/grape/validations/validators/coerce_spec.rb b/spec/grape/validations/validators/coerce_spec.rb index 370cf39d3..5e399833d 100644 --- a/spec/grape/validations/validators/coerce_spec.rb +++ b/spec/grape/validations/validators/coerce_spec.rb @@ -1,4 +1,3 @@ - # encoding: utf-8 require 'spec_helper'