aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel
Commit message (Collapse)AuthorAgeFilesLines
...
| * | Fixed taking precision into count when assigning a value to timestamp attributeBogdan Gusiev2015-09-232-9/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Timestamp column can have less precision than ruby timestamp In result in how big a fraction of a second can be stored in the database. m = Model.create! m.created_at.usec == m.reload.created_at.usec # => false # due to different seconds precision in Time.now and database column If the precision is low enough, (mysql default is 0, so it is always low enough by default) the value changes when model is reloaded from the database. This patch fixes that issue ensuring that any timestamp assigned as an attribute is converted to column precision under the attribute.
* | | AMo typosAkira Matsuda2015-09-222-3/+3
|/ /
* | Fix another implicit dependency of the AM test suiteSean Griffin2015-09-211-0/+1
| | | | | | | | Hopefully this is the last one
* | Require dependencies from stdlib in the Decimal typeSean Griffin2015-09-211-0/+2
| | | | | | | | | | | | | | In Active Record, it appears these were either autoloaded, which actually was likely due to test ordering since the method `Float#to_d` wouldn't trigger it. This makes it explicit, and unlikely to fail in the future.
* | Remove no-op options being passed in AM type registrationsSean Griffin2015-09-211-11/+11
| | | | | | | | | | | | The `override` option is only a thing for Active Record registrations. We should figure out how to make this properly error out without doing anything too weird to the code.
* | Move the appropriate type tests to the Active Model suiteSean Griffin2015-09-216-2/+332
| | | | | | | | | | | | | | | | | | Any tests for a type which is not overridden by Active Record, and does not test the specifics of the attributes API interacting in more complex ways have no reason to be in the Active Record suite. Doing this revealed that the implementation of the date and time types in AM was actually completely broken, and incapable of returning any value other than `nil`.
* | Simplify the implementation of Active Model's type registrySean Griffin2015-09-212-97/+49
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Things like decorations, overrides, and priorities only matter for Active Record, so the Active Model registry can be implemented much more simply. At this point, I wonder if having Active Record's registry inherit from Active Model's is even worth the trouble? The Active Model class was also missing test cases, which have been backfilled. This removes the error when two types are registered with the same name, but given that Active Model is meant to be significantly more generic, I do not think this is an issue for now. If we want, we can raise an error at the point that someone tries to register it.
* | Various stylistic nitpicksSean Griffin2015-09-211-4/+3
| | | | | | | | | | | | | | We do not need to require each file from AM individually, the type module does that for us. Even if the classes are extremely small right now, I'd rather keep any custom classes needed by AR in their own files, as they can easily have more complex changes in the future.
* | `TypeMap` and `HashLookupTypeMap` shouldn't be in Active ModelSean Griffin2015-09-213-89/+0
| | | | | | | | | | | | These are used by the connection adapters to convert SQL type information into the appropriate type object, and makes no sense outside of the context of Active Record
* | Move ActiveRecord::Type to ActiveModelKir Shatrov2015-09-2123-0/+987
| | | | | | | | The first step of bringing typecasting to ActiveModel
* | Replaced `ThreadSafe::Map` with successor `Concurrent::Map`.Jerry D'Antonio2015-09-191-2/+2
| | | | | | | | | | | | | | The thread_safe gem is being deprecated and all its code has been merged into the concurrent-ruby gem. The new class, Concurrent::Map, is exactly the same as its predecessor except for fixes to two bugs discovered during the merge.
* | File encoding is defaulted to utf-8 in Ruby >= 2.1Akira Matsuda2015-09-181-2/+0
| |
* | Fix typo in activemodel changelogSemyon Pupkov2015-09-081-4/+4
| |
* | Validate multiple contexts on `valid?` and `invalid?` at once.Dmitry Polushkin2015-09-073-1/+38
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Example: ```ruby class Person include ActiveModel::Validations attr_reader :name, :title validates_presence_of :name, on: :create validates_presence_of :title, on: :update end person = Person.new person.valid?([:create, :update]) # => true person.errors.messages # => {:name=>["can't be blank"], :title=>["can't be blank"]} ```
* | Revert "Merge pull request #21069 from ↵Rafael Mendonça França2015-09-073-38/+1
| | | | | | | | | | | | | | | | | | dmitry/feature/validate-multiple-contexts-at-once" This reverts commit 51dd2588433457960cca592d5b5dac6e0537feac, reversing changes made to ecb4e4b21b3222b823fa24d4a0598b1f2f63ecfb. This broke Active Record tests
* | Merge pull request #21069 from dmitry/feature/validate-multiple-contexts-at-onceRafael Mendonça França2015-09-073-1/+38
|\ \ | | | | | | | | | Validate multiple contexts on `valid?` and `invalid?` at once
| * | Validate multiple contexts on `valid?` and `invalid?` at once.Dmitry Polushkin2015-07-303-1/+38
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Example: ```ruby class Person include ActiveModel::Validations attr_reader :name, :title validates_presence_of :name, on: :create validates_presence_of :title, on: :update end person = Person.new person.valid?([:create, :update]) # => true person.errors.messages # => {:name=>["can't be blank"], :title=>["can't be blank"]} ```
* | | Removed unused config filePrakash Laxkar2015-09-032-4/+0
| | |
* | | Add missing test for #17351Aditya Kapoor2015-09-011-0/+14
| | |
* | | Fix failure introduced by #17351 due to the new mocks implementationCarlos Antonio da Silva2015-09-011-1/+1
| | | | | | | | | | | | | | | | | | | | | It was not expecting the new `case_insensitive` option to be passed to `generate_message`, instead of fixing the test we can just not pass this option down since it is specific to the confirmation validator and not necessary for the error message.
* | | Fix syntax error introduced by #17351.Jashank Jeremy2015-09-011-1/+1
| | |
* | | Merge pull request #17351 from akshat-sharma/masterRafael Mendonça França2015-09-012-4/+20
|\ \ \ | | | | | | | | | | | | Add case_sensitive option for confirmation validation
| * | | Add case_sensitive option for confirmation validationAkshat Sharma2015-09-012-4/+22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Case :- 1. In case of email confirmation one needs case insensitive comparison 2. In case of password confirmation one needs case sensitive comparison [ci skip] Update Guides for case_sensitive option in confirmation validation
* | | | Tiny documentation improvements [ci skip]Robin Dupret2015-08-281-2/+3
| | | |
* | | | Removed duplicate requiring minitest/mock as it is already required in ↵Ronak Jangir2015-08-261-2/+0
| | | | | | | | | | | | | | | | method_call_assertions
* | | | discard xml Serialization documentation that is no longer available [ci skip]Gaurav Sharma2015-08-221-5/+3
| | | |
* | | | Rename match_attribute_method? to matched_attribute_methodMarcin Olichwirowicz2015-08-121-4/+4
| | | | | | | | | | | | | | | | | | | | `match_attribute_method?` is a bit confusing because it suggest that a return value is a boolean which is not true.
* | | | Remove XML Serialization from core.Zachary Scott2015-08-077-502/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | This includes the following classes: - ActiveModel::Serializers::Xml - ActiveRecord::Serialization::XmlSerializer
* | | | pass the correct argument to mock on a test of `validates_length_of`yuuji.yaginuma2015-07-281-1/+1
| | | |
* | | | Freeze string literals when not mutated.schneems2015-07-193-3/+3
| |/ / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I wrote a utility that helps find areas where you could optimize your program using a frozen string instead of a string literal, it's called [let_it_go](https://github.com/schneems/let_it_go). After going through the output and adding `.freeze` I was able to eliminate the creation of 1,114 string objects on EVERY request to [codetriage](codetriage.com). How does this impact execution? To look at memory: ```ruby require 'get_process_mem' mem = GetProcessMem.new GC.start GC.disable 1_114.times { " " } before = mem.mb after = mem.mb GC.enable puts "Diff: #{after - before} mb" ``` Creating 1,114 string objects results in `Diff: 0.03125 mb` of RAM allocated on every request. Or 1mb every 32 requests. To look at raw speed: ```ruby require 'benchmark/ips' number_of_objects_reduced = 1_114 Benchmark.ips do |x| x.report("freeze") { number_of_objects_reduced.times { " ".freeze } } x.report("no-freeze") { number_of_objects_reduced.times { " " } } end ``` We get the results ``` Calculating ------------------------------------- freeze 1.428k i/100ms no-freeze 609.000 i/100ms ------------------------------------------------- freeze 14.363k (± 8.5%) i/s - 71.400k no-freeze 6.084k (± 8.1%) i/s - 30.450k ``` Now we can do some maths: ```ruby ips = 6_226k # iterations / 1 second call_time_before = 1.0 / ips # seconds per iteration ips = 15_254 # iterations / 1 second call_time_after = 1.0 / ips # seconds per iteration diff = call_time_before - call_time_after number_of_objects_reduced * diff * 100 # => 0.4530373333993266 miliseconds saved per request ``` So we're shaving off 1 second of execution time for every 220 requests. Is this going to be an insane speed boost to any Rails app: nope. Should we merge it: yep. p.s. If you know of a method call that doesn't modify a string input such as [String#gsub](https://github.com/schneems/let_it_go/blob/b0e2da69f0cca87ab581022baa43291cdf48638c/lib/let_it_go/core_ext/string.rb#L37) please [give me a pull request to the appropriate file](https://github.com/schneems/let_it_go/blob/b0e2da69f0cca87ab581022baa43291cdf48638c/lib/let_it_go/core_ext/string.rb#L37), or open an issue in LetItGo so we can track and freeze more strings. Keep those strings Frozen ![](https://www.dropbox.com/s/z4dj9fdsv213r4v/let-it-go.gif?dl=1)
* | | Revert "Revert "Reduce allocations when running AR callbacks.""Guo Xiang Tan2015-07-162-2/+2
| |/ |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This reverts commit bdc1d329d4eea823d07cf010064bd19c07099ff3. Before: Calculating ------------------------------------- 22.000 i/100ms ------------------------------------------------- 229.700 (± 0.4%) i/s - 1.166k Total Allocated Object: 9939 After: Calculating ------------------------------------- 24.000 i/100ms ------------------------------------------------- 246.443 (± 0.8%) i/s - 1.248k Total Allocated Object: 7939 ``` begin require 'bundler/inline' rescue LoadError => e $stderr.puts 'Bundler version 1.10 or later is required. Please update your Bundler' raise e end gemfile(true) do source 'https://rubygems.org' # gem 'rails', github: 'rails/rails', ref: 'bdc1d329d4eea823d07cf010064bd19c07099ff3' gem 'rails', github: 'rails/rails', ref: 'd2876141d08341ec67cf6a11a073d1acfb920de7' gem 'arel', github: 'rails/arel' gem 'sqlite3' gem 'benchmark-ips' end require 'active_record' require 'benchmark/ips' ActiveRecord::Base.establish_connection('sqlite3::memory:') ActiveRecord::Migration.verbose = false ActiveRecord::Schema.define do create_table :users, force: true do |t| t.string :name, :email t.boolean :admin t.timestamps null: false end end class User < ActiveRecord::Base default_scope { where(admin: true) } end admin = true 1000.times do attributes = { name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", email: "foobar@email.com", admin: admin } User.create!(attributes) admin = !admin end GC.disable Benchmark.ips(5, 3) do |x| x.report { User.all.to_a } end key = if RUBY_VERSION < '2.2' :total_allocated_object else :total_allocated_objects end before = GC.stat[key] User.all.to_a after = GC.stat[key] puts "Total Allocated Object: #{after - before}" ```
* | Removes unnecessary comments from i18n validations tests [ci skip]Zamith2015-07-111-61/+2
| | | | | | | | | | | | These comments do not add a lot to the readability, grepability or overall understanding of the tests, therefore I believe they can be safely removed.
* | Remove the reference to mocha in activemodelZamith2015-07-111-27/+27
| | | | | | | | | | Activemodel is no longer dependent on mocha, so we can make the comments more generic.
* | Use private method call assertions in Active Model tests.Kasper Timm Hansen2015-07-104-59/+46
| | | | | | | | Also fix Minitest constant reference.
* | Merge pull request #20803 from TheBlasfem/marking_serialization_classRafael Mendonça França2015-07-081-1/+1
|\ \ | | | | | | marking serialization class in Readme
| * | marking serialization classJulio Lopez2015-07-071-1/+1
| | |
* | | docs, clarify the meanaing of return values from validation methods.Yves Senn2015-07-071-0/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | [ci skip] Closes #20792. Custom validation methods are implemented in terms of callbacks. The `validate` callback chain can't be halted using return values of individual callbacks.
* | | docs, remove accidental :nodoc: of ActiveModel::Validations::ClassMethods ↵Yves Senn2015-07-071-2/+1
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | methods. [ci skip] While this :nodoc: did hide the constant it also removed the following methods from the API docs: - #attribute_method? - #clear_validators! - #validate - #validators - #validators_on Those are public API and should be visible. Issue was caused by dee4fbc /cc @zzak
* | Separate the constraint and other options [ci skip]Robin Dupret2015-07-011-3/+8
| | | | | | | | | | | | | | | | | | | | Only one constraint option can be used at a time (except for the minimum and maximum ones that can eventually be combined). However, other options can be used with them (e.g. the validation failure message). So let's make the distinction between these two different options categories. [Yves Senn, Matthew Draper & Robin Dupret]
* | Improve Validation Helpers' documentation comments and testsRadan Skoric2015-06-275-7/+41
| |
* | A few documentation fixes [ci skip]Robin Dupret2015-06-231-1/+1
| |
* | Add nodoc to the Validations::Helpers [ci skip]Mehmet Emin İNAÇ2015-06-221-1/+1
| |
* | docs, :scissors: wrongly placed heading. [ci skip]Yves Senn2015-06-221-2/+0
| | | | | | | | | | The heading "Active Model Length Validator" was shown on the "ActiveModel::Validations" page without any text following it.
* | Move the validations HelperMethods to its own fileRoque Pinel2015-06-212-10/+13
| | | | | | | | | | | | Closes #11209 [Roque Pinel & Steven Yang]
* | select the AR adapter through `bin/test`.Yves Senn2015-06-111-0/+1
| |
* | use our runner (`bin/test`) for framework components.Yves Senn2015-06-111-0/+3
| | | | | | | | | | | | | | | | | | | | This adds a script `bin/test` to most Rails framework components. The script uses the rails minitest plugin to augment the runner. See https://github.com/rails/rails/pull/19571 for details about the plugin. I did not yet add `bin/test` for activerecord, activejob and railties. These components rely on specific setup performed in the rake-tasks.
* | Revert "Add code example for include option of ↵Rafael Mendonça França2015-06-101-14/+1
| | | | | | | | | | | | | | | | AM::Serialization#serializable_hash" This reverts commit 3d949f34816d6eca0a6b59cfa08d91f36e8e64dd. This was already documented in other PR.
* | Add code example for include option of AM::Serialization#serializable_hashRadan Skoric2015-06-091-1/+14
| |
* | Fix typo in AM I18n validation test name [skip ci]Anton Davydov2015-06-091-1/+1
| |
* | Tiny documentation edits [ci skip]Robin Dupret2015-06-071-2/+2
| |