207 lines
6.5 KiB
Diff
207 lines
6.5 KiB
Diff
From 84069646544ce701e6864458378323e1e3361140 Mon Sep 17 00:00:00 2001
|
|
From: Elliot Winkler <elliot.winkler@gmail.com>
|
|
Date: Sun, 17 Sep 2017 14:33:33 -0500
|
|
Subject: [PATCH] Refactor RailsShim
|
|
|
|
* Satisfy Rubocop
|
|
* Alphabetize methods
|
|
* Use `class << self` instead of `self.` so that we can privatize one of
|
|
the methods
|
|
---
|
|
lib/shoulda/matchers/rails_shim.rb | 172 +++++++++++++++++++----------
|
|
1 file changed, 115 insertions(+), 57 deletions(-)
|
|
|
|
diff --git a/lib/shoulda/matchers/rails_shim.rb b/lib/shoulda/matchers/rails_shim.rb
|
|
index 471d9049..7aeab629 100644
|
|
--- a/lib/shoulda/matchers/rails_shim.rb
|
|
+++ b/lib/shoulda/matchers/rails_shim.rb
|
|
@@ -2,71 +2,137 @@ module Shoulda
|
|
module Matchers
|
|
# @private
|
|
class RailsShim
|
|
- def self.verb_for_update
|
|
- if action_pack_gte_4_1?
|
|
- :patch
|
|
- else
|
|
- :put
|
|
+ class << self
|
|
+ def action_pack_gte_4_1?
|
|
+ Gem::Requirement.new('>= 4.1').satisfied_by?(action_pack_version)
|
|
end
|
|
- end
|
|
|
|
- def self.type_cast_default_for(model, column)
|
|
- if model.respond_to?(:column_defaults)
|
|
- # Rails 4.2
|
|
- model.column_defaults[column.name]
|
|
- else
|
|
- column.default
|
|
+ def action_pack_version
|
|
+ Gem::Version.new(::ActionPack::VERSION::STRING)
|
|
+ end
|
|
+
|
|
+ def active_record_major_version
|
|
+ ::ActiveRecord::VERSION::MAJOR
|
|
end
|
|
- end
|
|
|
|
- def self.serialized_attributes_for(model)
|
|
- if defined?(::ActiveRecord::Type::Serialized)
|
|
- # Rails 5+
|
|
- model.columns.select do |column|
|
|
- model.type_for_attribute(column.name).is_a?(
|
|
- ::ActiveRecord::Type::Serialized,
|
|
+ def generate_validation_message(
|
|
+ record,
|
|
+ attribute,
|
|
+ type,
|
|
+ model_name,
|
|
+ options
|
|
+ )
|
|
+ if record && record.errors.respond_to?(:generate_message)
|
|
+ record.errors.generate_message(attribute.to_sym, type, options)
|
|
+ else
|
|
+ simply_generate_validation_message(
|
|
+ attribute,
|
|
+ type,
|
|
+ model_name,
|
|
+ options,
|
|
)
|
|
- end.inject({}) do |hash, column|
|
|
- hash[column.name.to_s] = model.type_for_attribute(column.name).coder
|
|
- hash
|
|
end
|
|
- else
|
|
- model.serialized_attributes
|
|
+ rescue RangeError
|
|
+ simply_generate_validation_message(
|
|
+ attribute,
|
|
+ type,
|
|
+ model_name,
|
|
+ options,
|
|
+ )
|
|
end
|
|
- end
|
|
|
|
- def self.generate_validation_message(record, attribute, type, model_name, options)
|
|
- if record && record.errors.respond_to?(:generate_message)
|
|
- record.errors.generate_message(attribute.to_sym, type, options)
|
|
- else
|
|
- simply_generate_validation_message(attribute, type, model_name, options)
|
|
+ def make_controller_request(context, verb, action, request_params)
|
|
+ params =
|
|
+ if active_record_major_version >= 5
|
|
+ { params: request_params }
|
|
+ else
|
|
+ request_params
|
|
+ end
|
|
+
|
|
+ context.__send__(verb, action, params)
|
|
end
|
|
- rescue RangeError
|
|
- simply_generate_validation_message(attribute, type, model_name, options)
|
|
- end
|
|
|
|
- def self.simply_generate_validation_message(attribute, type, model_name, options)
|
|
- default_translation_keys = [
|
|
- :"activerecord.errors.models.#{model_name}.#{type}",
|
|
- :"activerecord.errors.messages.#{type}",
|
|
- :"errors.attributes.#{attribute}.#{type}",
|
|
- :"errors.messages.#{type}"
|
|
- ]
|
|
- primary_translation_key = :"activerecord.errors.models.#{model_name}.attributes.#{attribute}.#{type}"
|
|
- translate_options = { default: default_translation_keys }.merge(options)
|
|
- I18n.translate(primary_translation_key, translate_options)
|
|
- end
|
|
+ def serialized_attributes_for(model)
|
|
+ if defined?(::ActiveRecord::Type::Serialized)
|
|
+ # Rails 5+
|
|
+ serialized_columns = model.columns.select do |column|
|
|
+ model.type_for_attribute(column.name).is_a?(
|
|
+ ::ActiveRecord::Type::Serialized,
|
|
+ )
|
|
+ end
|
|
|
|
- def self.active_record_major_version
|
|
- ::ActiveRecord::VERSION::MAJOR
|
|
- end
|
|
+ serialized_columns.inject({}) do |hash, column|
|
|
+ hash[column.name.to_s] = model.type_for_attribute(column.name).coder
|
|
+ hash
|
|
+ end
|
|
+ else
|
|
+ model.serialized_attributes
|
|
+ end
|
|
+ end
|
|
+
|
|
+ def type_cast_default_for(model, column)
|
|
+ if model.respond_to?(:column_defaults)
|
|
+ # Rails 4.2
|
|
+ model.column_defaults[column.name]
|
|
+ else
|
|
+ column.default
|
|
+ end
|
|
+ end
|
|
+
|
|
+ def tables_and_views(connection)
|
|
+ if active_record_major_version >= 5
|
|
+ connection.data_sources
|
|
+ else
|
|
+ connection.tables
|
|
+ end
|
|
+ end
|
|
+
|
|
+ def verb_for_update
|
|
+ if action_pack_gte_4_1?
|
|
+ :patch
|
|
+ else
|
|
+ :put
|
|
+ end
|
|
+ end
|
|
+
|
|
+ private
|
|
|
|
- def self.action_pack_gte_4_1?
|
|
- Gem::Requirement.new('>= 4.1').satisfied_by?(action_pack_version)
|
|
+ def simply_generate_validation_message(
|
|
+ attribute,
|
|
+ type,
|
|
+ model_name,
|
|
+ options
|
|
+ )
|
|
+ default_translation_keys = [
|
|
+ :"activerecord.errors.models.#{model_name}.#{type}",
|
|
+ :"activerecord.errors.messages.#{type}",
|
|
+ :"errors.attributes.#{attribute}.#{type}",
|
|
+ :"errors.messages.#{type}",
|
|
+ ]
|
|
+ primary_translation_key = [
|
|
+ :activerecord,
|
|
+ :errors,
|
|
+ :models,
|
|
+ model_name,
|
|
+ :attributes,
|
|
+ attribute,
|
|
+ type,
|
|
+ ]
|
|
+ translate_options =
|
|
+ { default: default_translation_keys }.merge(options)
|
|
+ I18n.translate(primary_translation_key, translate_options)
|
|
+ end
|
|
end
|
|
|
|
- def self.action_pack_version
|
|
- Gem::Version.new(::ActionPack::VERSION::STRING)
|
|
+ def self.make_controller_request(context, verb, action, request_params)
|
|
+ params =
|
|
+ if active_record_major_version >= 5
|
|
+ { params: request_params }
|
|
+ else
|
|
+ request_params
|
|
+ end
|
|
+
|
|
+ context.__send__(verb, action, params)
|
|
end
|
|
end
|
|
end
|