aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel/lib/active_model/validations/validates.rb
Commit message (Collapse)AuthorAgeFilesLines
* Freeze string literals when not mutated.schneems2015-07-191-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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)
* Add a note on custom validation contexts.Justin Weiss2014-08-051-3/+5
| | | | | | | | | The documentation on `:on` for validations was inconsistent, and most only referenced the `:create` and `:update` contexts. I fixed those to be consistent with the documentation on `AM::Validations.validates`, which seemed to have the best docs. [ci skip]
* revises references to :allow_(nil|blank) in some docs [ci skip] [Steven Yang ↵Xavier Noria2014-01-261-1/+3
| | | | | | & Xavier Noria] Closes #11247.
* fix email regex example code [ci skip]Angelo capilleri2013-12-031-1/+1
| | | | different from the regex in EmailValidator
* Convert ActiveModel to 1.9 hash syntax.Patrick Robertson2013-05-011-2/+2
| | | | | I also attempted to fix other styleguide violations such as { a: :b } over {a: :b} and foo(b: 'bar') over foo( b: 'bar' ).
* Set hash value instead of using merge!Carlos Antonio da Silva2012-11-041-1/+1
|
* minor edits and remove mixed titles in AM::Validations docs [ci skip]Francesco Rodriguez2012-10-251-6/+5
|
* Added forgotten :message option to ActiveModel validates documentationAnatoly Makarevich2012-09-071-3/+3
|
* AM::Validation#validates: ability to pass custom exception to `:strict` optionBogdan Gusiev2012-08-061-2/+5
|
* update #validates and #validates! documentation [ci skip]Francesco Rodriguez2012-07-291-31/+43
|
* AM::Validations: remove documentation duplicatesBogdan Gusiev2012-07-101-3/+20
|
* Don't enable validations when passing false hash values to ActiveModel.validatesSteve Purcell2012-05-281-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Passing a falsey option value for a validator currently causes that validator to be enabled, just like "true": ActiveModel.validates :foo, :presence => false This is rather counterintuitive, and makes it inconvenient to wrap `validates` in methods which may conditionally enable different validators. As an example, one is currently forced to write: def has_slug(source_field, options={:unique => true}) slugger = Proc.new { |r| r[:slug] = self.class.sluggify(r[source_field]) if r[:slug].blank? } before_validation slugger validations = { :presence => true, :slug => true } if options[:unique] validations[:uniqueness] = true end validates :slug, validations end because the following reasonable-looking alternative fails to work as expected: def has_slug(source_field, options={:unique => true}) slugger = Proc.new { |r| r[:slug] = self.class.sluggify(r[source_field]) if r[:slug].blank? } before_validation slugger validates :slug, :presence => true, :slug => true, :uniqueness => options[:unique] end (This commit includes a test, and all activemodel and activerecord tests pass as before.)
* revise docs [ci skip]Vijay Dev2012-02-011-3/+3
|
* Generate strict validation error messages with attribute nameCarlos Antonio da Silva2012-02-011-7/+6
|
* whitespacesdreamfall2012-01-171-3/+3
|
* validates method should not change options argumentdreamfall2012-01-171-1/+1
|
* Fix a tiny typo in custom validators documentationJean Boussier2011-11-101-1/+1
|
* Use .add instead of << to add errorsEvgeniy Dolzhenko2011-10-111-2/+2
|
* Typo fixBogdan Gusiev2011-08-251-1/+1
|
* Implemented strict validation conceptBogdan Gusiev2011-08-171-3/+15
| | | | | | | In order to deliver debug information to dev team instead of display error message to end user Implemented strict validation concept that suppose to define validation that always raise exception when fails
* Provide a way to specify alternate option keys for validatesCarl Lerche2011-02-051-1/+7
|
* Do not require that validation attributes be specified as symbolsCarl Lerche2011-02-051-2/+1
|
* Add support for namespaced validatorsSamuel Kadolph2010-12-161-1/+7
| | | | | | Includes test and documentation for new feature Signed-off-by: Santiago Pastorino <santiago@wyeworks.com>
* Better shortcut options for custom validators [#5672 state:resolved]Obie Fernandez2010-09-241-5/+10
| | | | Signed-off-by: José Valim <jose.valim@gmail.com>
* you rarely want ^ or $ in validations, use \A when you mean \AXavier Noria2010-08-181-2/+2
|
* Missing object for comparison in ActiveModel::EachValidator example code.Trey Bean2010-08-171-1/+1
|
* Deletes trailing whitespaces (over text files only find * -type f -exec sed ↵Santiago Pastorino2010-08-141-5/+5
| | | | 's/[ \t]*$//' -i {} \;)
* fixes a typo reported by rymaiXavier Noria2010-08-101-1/+1
|
* Add titles to the rest of the files in active_model/validations/*Rizwan Reza2010-06-151-0/+2
|
* Fix a bunch of minor spelling mistakesEvgeniy Dolzhenko2010-06-111-1/+1
|
* Validates needs hash slice.José Valim2010-01-171-0/+2
|
* Fix typos and add tests to ensure they will be caught the next time.José Valim2010-01-111-1/+1
|
* Fix typo by renaming :genre to :gender.José Valim2010-01-091-1/+1
|
* Allow validates to map some types to specific options. So now you can do:José Valim2010-01-081-12/+32
| | | | | | validates :email, :presence => true, :format => /@/ validates :genre, :inclusion => %w(m f) validates :password, :length => 6..20
* Allow :if, :unless, :on, :allow_nil and :allow_blank as shared options in ↵José Valim2010-01-071-6/+18
| | | | validates.
* Add validates method as shortcut to setup validators for a given set of ↵jamie2010-01-071-0/+74
attributes: class Person < ActiveRecord::Base include MyValidators validates :name, :presence => true, :uniqueness => true, :length => { :maximum => 100 } validates :email, :presence => true, :email => true end [#3058 status:resolved] Signed-off-by: José Valim <jose.valim@gmail.com>