1. 19 9月, 2015 2 次提交
  2. 17 9月, 2015 2 次提交
  3. 13 9月, 2015 1 次提交
  4. 06 9月, 2015 1 次提交
  5. 05 9月, 2015 2 次提交
    • A
      use path escaping for email addresses · 21ffef38
      Aaron Patterson 提交于
      Due to e25fdad2, we are correctly using
      path escaping for email addresses.  This commit fixes the tests to
      expect path escaping.
      21ffef38
    • B
      `url_for` does not modify polymorphic options · ee63532d
      Bernerd Schaefer 提交于
      The `url_for` methods in `actionpack` and `actionview`
      now make a copy of the provided options
      before generating polymorphic paths or URLs.
      
      The bug in the previous behavior
      is most noticeable in a case like:
      
          url_options = [:new, :post, param: 'value']
      
          if current_page?(url_options)
            css_class = "active"
          end
      
          link_to "New Post", url_options, class: css_class
      ee63532d
  6. 03 9月, 2015 1 次提交
  7. 28 8月, 2015 1 次提交
  8. 27 8月, 2015 2 次提交
  9. 25 8月, 2015 4 次提交
  10. 18 8月, 2015 2 次提交
  11. 16 8月, 2015 1 次提交
  12. 12 8月, 2015 2 次提交
    • J
      Make disable_with default in submit_tag · 3822a322
      Justin Schiff 提交于
      Prevents double submission by making disable_with the default.
      
      Default disable_with option will only be applied if user has not
      specified her/his own disable_with option, whether that is in the
      `data-disable-with` string form or the
      `:data => { :disable_with => "Saving..." }` hash form. disable_with
      will default to the value attribute.
      
      A configuration option was added to opt out of this functionality if
      the user so desires.
      `config.action_view.automatically_disable_submit_tag = false`
      3822a322
    • M
      Sometimes you need a specific break sequence while using word wrap and as... · cf93c6ae
      Mauricio Gomez Aguinaga 提交于
      Sometimes you need a specific break sequence while using word wrap and as today the only option we have is "\n" and is hardcoded.
      
      With this change you will be able to specify any break sequence ("\r\n" for example) as an option.
      
      adding proper documentation for break_sequence in ActionView::Helpers::TextHelper.word_wrap
      
      adding some more documentation for word_wrap custom break sequence and making sure we use new hash syntax
      cf93c6ae
  13. 11 8月, 2015 3 次提交
  14. 02 8月, 2015 1 次提交
    • B
      Save a string allocation inside loop · d531edc8
      Benjamin Quorning 提交于
      In the `tag_options` method, strings are continuously added to the
      `output` string. Previously, we concatenated two strings and added the
      generated string to `output`. By adding each of the strings to
      `output`, one after the other, we will save the allocation of that
      concatenated string.
      
      Benchmark:
      
          require 'benchmark/ips'
      
          sep = " ".freeze
      
          Benchmark.ips do |x|
            x.report("string +") {
              output = ""
              output << sep + "foo"
            }
            x.report("string <<") {
              output = ""
              output << sep
              output << "foo"
            }
            x.compare!
          end
      
      Results (Ruby 2.2.2):
      
          Calculating -------------------------------------
                      string +    88.086k i/100ms
                     string <<    94.287k i/100ms
          -------------------------------------------------
                      string +      2.407M (± 5.8%) i/s -     12.068M
                     string <<      2.591M (± 7.0%) i/s -     12.917M
      
          Comparison:
                     string <<:  2591482.4 i/s
                      string +:  2406883.7 i/s - 1.08x slower
      d531edc8
  15. 31 7月, 2015 2 次提交
    • S
      zOMG 37 objects saved · 005541b8
      schneems 提交于
      005541b8
    • S
      Don't allocate array when not necessary · 1f831fef
      schneems 提交于
      In the `tag_options` method an array is used to build up elements, then `Array#*` (which is an alias for `Array#join` is called to turn the array into a string. Instead of allocating an array to build a string, we can build the string we want from the beginning.
      
      Saved: 121,743 bytes 893 objects
      1f831fef
  16. 30 7月, 2015 4 次提交
    • S
      Cut string allocations in content_tag_string · e76a8435
      schneems 提交于
      content_tag's first argument is will generate a string with an html tag so `:a` will generate: `<a></a>`. When this happens, the symbol is implicitly `to_s`-d so a new string is allocated. We can get around that by using a frozen string instead which
      
      This change buys us 74,236 bytes of memory and 1,855 fewer objects per request.
      e76a8435
    • S
      Cut string ActionView template allocations · 9b189a31
      schneems 提交于
      The instrument method creates new strings, the most common action to instrument is "!render_template` so we can detect when that action is occurring and use a frozen string instead.
      
      This change buys us 113,714 bytes of memory and 1,790 fewer objects per request.
      9b189a31
    • S
      Optimize hash key · 2e95d2ef
      schneems 提交于
      No idea why on earth this hash key isn't already optimized by MRI, but it isn't. 💩
      
      This change buys us 74,077 bytes of memory and 1,852 fewer objects per request.
      2e95d2ef
    • S
      Decrease string allocation in content_tag_string · 2a4d4301
      schneems 提交于
      When an unknonwn key is passed to the hash in `PRE_CONTENT_STRINGS` it returns nil, when you call "#{nil}" it allocates a new empty string. We can get around this allocation by using a default value `Hash.new { "".freeze }`. We can avoid the `to_sym` call by pre-populating the hash with a symbol key in addition to a string key.
      
      We can freeze some strings when using Array#* to reduce allocations.
      
      Array#join can take frozen strings.
      
      This change buys us 86,600 bytes of memory and 1,857 fewer objects per request.
      2a4d4301
  17. 27 7月, 2015 1 次提交
  18. 24 7月, 2015 1 次提交
  19. 20 7月, 2015 1 次提交
    • S
      Freeze string literals when not mutated. · 5bb1d4d2
      schneems 提交于
      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)
      5bb1d4d2
  20. 19 7月, 2015 1 次提交
  21. 18 7月, 2015 2 次提交
  22. 16 7月, 2015 1 次提交
  23. 15 7月, 2015 1 次提交
    • P
      Make AC::Parameters not inherited from Hash · 14a3bd52
      Prem Sichanugrist 提交于
      This is another take at #14384 as we decided to wait until `master` is
      targeting Rails 5.0. This commit is implementation-complete, as it
      guarantees that all the public methods on the hash-inherited Parameters
      are still working (based on test case). We can decide to follow-up later
      if we want to remove some methods out from Parameters.
      14a3bd52
  24. 14 7月, 2015 1 次提交