diff --git a/.travis.yml b/.travis.yml index 8cf2a6a..2754218 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,11 +5,14 @@ --- sudo: false rvm: -- 2.1.5 +- 2.3.1 gemfile: - gemfiles/activerecord-4.2/Gemfile.mysql2 - gemfiles/activerecord-4.2/Gemfile.postgresql - gemfiles/activerecord-4.2/Gemfile.sqlite3 +- gemfiles/activerecord-5.0/Gemfile.mysql2 +- gemfiles/activerecord-5.0/Gemfile.postgresql +- gemfiles/activerecord-5.0/Gemfile.sqlite3 env: POSTGRESQL_DB_USER=postgres MYSQL_DB_USER=travis addons: postgresql: '9.4' diff --git a/README.md b/README.md index 9751ec7..7c7d74a 100644 --- a/README.md +++ b/README.md @@ -174,7 +174,8 @@ As of version 1.2.0, SchemaValidations supports and is tested on: -* ruby **2.1.5** with activerecord **4.2**, using **mysql2**, **postgresql** or **sqlite3** +* ruby **2.3.1** with activerecord **4.2**, using **mysql2**, **postgresql** or **sqlite3** +* ruby **2.3.1** with activerecord **5.0**, using **mysql2**, **postgresql** or **sqlite3** diff --git a/gemfiles/activerecord-5.0/Gemfile.base b/gemfiles/activerecord-5.0/Gemfile.base new file mode 100644 index 0000000..b18bf66 --- /dev/null +++ b/gemfiles/activerecord-5.0/Gemfile.base @@ -0,0 +1,3 @@ +eval File.read File.expand_path('../../Gemfile.base', __FILE__) + +gem "activerecord", "~> 5.0.0" diff --git a/gemfiles/activerecord-5.0/Gemfile.mysql2 b/gemfiles/activerecord-5.0/Gemfile.mysql2 new file mode 100644 index 0000000..f6e58e3 --- /dev/null +++ b/gemfiles/activerecord-5.0/Gemfile.mysql2 @@ -0,0 +1,10 @@ +require "pathname" +eval(Pathname.new(__FILE__).dirname.join("Gemfile.base").read, binding) + +platform :ruby do + gem "mysql2" +end + +platform :jruby do + gem 'activerecord-jdbcmysql-adapter' +end diff --git a/gemfiles/activerecord-5.0/Gemfile.postgresql b/gemfiles/activerecord-5.0/Gemfile.postgresql new file mode 100644 index 0000000..2c00e63 --- /dev/null +++ b/gemfiles/activerecord-5.0/Gemfile.postgresql @@ -0,0 +1,10 @@ +require "pathname" +eval(Pathname.new(__FILE__).dirname.join("Gemfile.base").read, binding) + +platform :ruby do + gem "pg" +end + +platform :jruby do + gem 'activerecord-jdbcpostgresql-adapter' +end \ No newline at end of file diff --git a/gemfiles/activerecord-5.0/Gemfile.sqlite3 b/gemfiles/activerecord-5.0/Gemfile.sqlite3 new file mode 100644 index 0000000..a116d6d --- /dev/null +++ b/gemfiles/activerecord-5.0/Gemfile.sqlite3 @@ -0,0 +1,10 @@ +require "pathname" +eval(Pathname.new(__FILE__).dirname.join("Gemfile.base").read, binding) + +platform :ruby do + gem "sqlite3" +end + +platform :jruby do + gem 'activerecord-jdbcsqlite3-adapter', '>=1.3.0.beta2' +end \ No newline at end of file diff --git a/lib/schema_validations/active_record/validations.rb b/lib/schema_validations/active_record/validations.rb index d76d93d..ce2db2f 100644 --- a/lib/schema_validations/active_record/validations.rb +++ b/lib/schema_validations/active_record/validations.rb @@ -99,8 +99,8 @@ def load_column_validations #:nodoc: when respond_to?(:defined_enums) && defined_enums.has_key?(column.name) then :enum when column.type == :integer then :integer when column.type == :decimal then :decimal - when column.number? then :numeric - when column.text? then :text + when column.type == :float then :numeric + when column.type == :text || column.type == :string then :text when column.type == :boolean then :boolean end @@ -133,15 +133,15 @@ def load_column_validations #:nodoc: end def load_integer_column_validations(name, column) # :nodoc: - options = { :allow_nil => true, :only_integer => true } - - if range = column.cast_type.try(:range) - options[:greater_than_or_equal_to] = range.begin - if range.exclude_end? - options[:less_than] = range.end - else - options[:less_than_or_equal_to] = range.end - end + integer_range = ::ActiveRecord::Type::Integer.new.range + # The Ruby Range object does not support excluding the beginning of a Range, + # so we always include :greater_than_or_equal_to + options = { :allow_nil => true, :only_integer => true, greater_than_or_equal_to: integer_range.begin } + + if integer_range.exclude_end? + options[:less_than] = integer_range.end + else + options[:less_than_or_equal_to] = integer_range.end end validate_logged :validates_numericality_of, name, options diff --git a/schema_dev.yml b/schema_dev.yml index 859b5fb..93b8c0b 100644 --- a/schema_dev.yml +++ b/schema_dev.yml @@ -1,7 +1,8 @@ ruby: - - 2.1.5 + - 2.3.1 activerecord: - 4.2 + - 5.0 db: - mysql2 - postgresql diff --git a/schema_validations.gemspec b/schema_validations.gemspec index 2307ed8..986f0af 100644 --- a/schema_validations.gemspec +++ b/schema_validations.gemspec @@ -21,9 +21,9 @@ Gem::Specification.new do |s| s.require_paths = ["lib"] s.add_dependency("schema_plus_columns") - s.add_dependency("activerecord", "~> 4.2", ">= 4.2.1") + s.add_dependency("activerecord", ">= 4.2.1", "< 5.1") s.add_dependency("valuable") - + s.add_development_dependency("schema_dev", "~> 3.6") s.add_development_dependency("rake") s.add_development_dependency("rdoc") diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 6b2d8ab..aa3a4f3 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -18,6 +18,15 @@ config.around(:each) do |example| DatabaseCleaner.clean remove_all_models + + class ActiveRecord::InternalMetadata + def self.create_table + end + + def self.[]=(first, second) + end + end + ActiveRecord::Migration.suppress_messages do example.run end diff --git a/spec/validations_spec.rb b/spec/validations_spec.rb index 0474d57..010a844 100644 --- a/spec/validations_spec.rb +++ b/spec/validations_spec.rb @@ -97,12 +97,18 @@ class ArticleReview < ActiveRecord::Base expect(Article.new(votes: -2147483649).error_on(:votes).size).to eq(1) end + it "can include the end range" do + allow_any_instance_of(::ActiveRecord::Type::Integer).to receive(:range).and_return(-2147483648..2147483648) + + expect(Article.new(votes: 2147483648).error_on(:votes).size).to eq(0) + end + it "should validate the range of decimal precision with scale" do expect(Article.new(max10: 10).error_on(:max10).size).to eq(1) expect(Article.new(max10: 5).error_on(:max10).size).to eq(0) expect(Article.new(max10: -10).error_on(:max10).size).to eq(1) end - + it "should validate the range of decimal precision without scale" do expect(Article.new(max100: 100).error_on(:max100).size).to eq(1) expect(Article.new(max100: 50).error_on(:max100).size).to eq(0)