Commit Graph

738 Commits

Author SHA1 Message Date
Aaron Patterson
f443ae670d Use ERB::Utils to percent encode hfvalue parts of mailto
`hfvalue` parts should always be percent encoded, so lets do that!

Revert "use path escaping for email addresses"

This reverts commit 21ffef38a5dc5a6a21f7e841aecab5b51f4fd185.
2015-09-05 10:59:46 -07:00
Aaron Patterson
21ffef38a5 use path escaping for email addresses
Due to e25fdad2f147e6f368958f9a06a5ac9d10288408, we are correctly using
path escaping for email addresses.  This commit fixes the tests to
expect path escaping.
2015-09-04 15:20:07 -07:00
Lachlan Sylvester
a9c6a583b6 Fix calling cache helper with a relation 2015-08-28 17:26:09 +10:00
Aaron Patterson
2ceb16e539 Pull plain content type handling up to render
`render` is the only possible source for the `plain` option.  Pulling
the conditional up to the `render` method removes far away conditionals
2015-08-26 14:04:04 -07:00
Aaron Patterson
fa09bf44db stop passing the options hash to _process_format
We don't need to pass the full hash just to pull one value out.  It's
better to just pass the value that the method needs to know about so
that we can abstract it away from "options"
2015-08-26 13:51:28 -07:00
Rafael Mendonça França
518ae9f055 Pass the correct formats 2015-08-24 15:36:14 -03:00
Rafael Mendonça França
face604266 Pass formats to lookup_context
Before we were changing the state of the lookup_context for the duration
of the with_layout_format block, but since we already know the formats
we can just pass it explicitly.

Related with 8d7ce0f22aee09d20091a4dc58cb379a09d13e26
2015-08-24 15:16:59 -03:00
Nick Sutterer
c0daa02c24 remove useless case in #resolve_layout. 2015-08-24 15:07:25 -03:00
Nick Sutterer
8d7ce0f22a remove LookupContext#with_layout_format by passing formats for layouts explicitely. 2015-08-24 15:07:25 -03:00
amitkumarsuroliya
bb289b9409 fix Docs [ci skip] 2015-08-18 00:41:17 +05:30
amitkumarsuroliya
f2c04d77ba typo fix [ci skip] 2015-08-18 00:02:16 +05:30
Sean Griffin
249a06d3be Merge pull request #21135 from DropsOfSerenity/master
make disable_with default in submit_tag
2015-08-17 06:49:00 -06:00
Vince Francesi
cfde3786e7 Add documentation for ActionView::Helpers::DateHelper :use_hidden option [ci skip] 2015-08-15 12:36:54 -07:00
Justin Schiff
3822a322a8 Make disable_with default in submit_tag
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`
2015-08-11 16:35:10 -07:00
Mauricio Gomez Aguinaga
cf93c6ae48 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
2015-08-11 14:15:47 -07:00
Arthur Nogueira Neves
2117a535b5 Merge pull request #21187 from arthurnn/method_missing_routes_av
Dont try to call method missing in routes if thats not what we want
2015-08-11 16:10:41 +02:00
Arthur Neves
0ffaa56d51
Dont try to call method missing in routes if thats not what we want
If, doing a test like this:

```
class BugTest < ActionView::TestCase
  def test_foo
    omg
  end
```

Will raise with:
```
RuntimeError: In order to use #url_for, you must include routing helpers
explicitly. For instance, `include
Rails.application.routes.url_helpers`.
```

Thats a bit confusing, as we are not calling url_for at all.
2015-08-10 22:16:52 +02:00
Kasper Timm Hansen
44a7fe673a [ci skip] Fix simultaneous spelling 2015-08-10 22:00:09 +02:00
Derek Prior
0d8b552c68
Update info on browser connection limits [ci skip]
Browsers have not been limited to two connections per host for quite
some time now. With more connections allowed, the trade-off involved in
asset host distribution isn't so clear and it becomes more important
that developers measure actual performance before and after.
2015-08-10 15:44:35 -04:00
Benjamin Quorning
d531edc829 Save a string allocation inside loop
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
2015-08-02 14:31:07 +02:00
schneems
005541b83e zOMG 37 objects saved 2015-07-30 12:31:05 -05:00
schneems
1f831fefe2 Don't allocate array when not necessary
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
2015-07-30 12:31:05 -05:00
schneems
e76a843505 Cut string allocations in content_tag_string
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.
2015-07-29 20:41:58 -05:00
schneems
9b189a3169 Cut string ActionView template allocations
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.
2015-07-29 20:41:58 -05:00
schneems
2e95d2ef90 Optimize hash key
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.
2015-07-29 20:41:58 -05:00
schneems
2a4d4301d4 Decrease string allocation in content_tag_string
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.
2015-07-29 20:41:58 -05:00
Kasper Timm Hansen
c5583cd79c Merge pull request #20904 from kaspth/wildcard-template-dependencies
Add wildcard template dependencies.
2015-07-27 20:27:57 +02:00
Kasper Timm Hansen
a6509d3112 Add wildcard template dependencies. 2015-07-26 19:21:14 +02:00
Clayton Smith
6a38782477 Encode the email address as prescribed in RFC 6068 section 2. 2015-07-23 16:56:21 -04:00
Sean Griffin
fd9c952f14 Merge pull request #20895 from brian-davis/brian-davis
grammar fix to content_for method documentation in capture_helper.rb [ci skip]
2015-07-20 08:36:49 -06:00
David Heinemeier Hansson
068865a7d5 Merge pull request #20384 from kaspth/per-request-cache
Use digest cache in development.
2015-07-20 13:15:55 +02:00
schneems
5bb1d4d288 Freeze string literals when not mutated.
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](b0e2da69f0/lib/let_it_go/core_ext/string.rb (L37)) please [give me a pull request to the appropriate file](b0e2da69f0/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)
2015-07-19 17:45:10 -05:00
Kasper Timm Hansen
40f79da8f2 Make digest cache work in development.
Avoid computing the same fragment digest many times when looping over templates.

The cache is cleared on every request so template changes are still picked up.
2015-07-18 21:54:19 +02:00
Prem Sichanugrist
8cb8ce98d9 Stop using deprecated render :text in test
This will silence deprecation warnings.

Most of the test can be changed from `render :text` to render `:plain`
or `render :body` right away. However, there are some tests that needed
to be fixed by hand as they actually assert the default Content-Type
returned from `render :body`.
2015-07-17 22:27:33 -04:00
Jon Atack
ea747f7d2e [skip ci] Lookup can be a noun but it is not a verb
Various grammar corrections and wrap to 80 characters.
2015-07-17 20:18:57 +02:00
Brian Davis
5334889a27 grammar fix to content_for method documentation in capture_helper.rb 2015-07-15 21:19:17 -06:00
Prem Sichanugrist
14a3bd520d Make AC::Parameters not inherited from Hash
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.
2015-07-15 11:11:36 -04:00
Prem Sichanugrist
e26d11c876 Change AC::TestResponse to AD::TestResponse
ActionController::TestResponse was removed in d9fe10c and caused a test
failure on Action View as its test case still refers to it.
2015-07-14 09:27:42 -04:00
Kasper Timm Hansen
87b4f3105f Merge pull request #20813 from noniq/locale-argument-for-pluralize-helper
Allow `pluralize` helper to take a locale.
2015-07-09 21:24:24 +02:00
Stefan Daschek
bb851651f1 Allow pluralize helper to take a locale.
This is already supported in `ActiveSupport::Inflector#pluralize` and `String#pluralize`, so we just forward the locale.
2015-07-09 14:51:13 +02:00
Aaron Patterson
2838a1f4ac use new constructor. (Oops! 💣) 2015-07-08 16:38:01 -07:00
Dov Murik
5a41d00455 Support explicit defintion of resouce name for collection caching.
If a template includes `# Template Collection: ...` anywhere in its
source, that name will be used as the cache name for the partial that is
rendered for the collection.

This allows users to enable collection caching even if the template
doesn't start with `<% cache ... do %>`.

Moreover, the `# Template Collection: ...` notation is recognized in all
template types (and template types other than ERB can define a
resource_cache_call_pattern method to allow the `cache ... do` pattern
to be recognized too).
2015-07-07 16:57:09 -04:00
Thomas Osborn
b3bfbbf10e changes names in guides to better reflect diversity [ci-skip] 2015-07-02 16:21:28 -07:00
Yves Senn
d4b0e5f59f Merge pull request #20669 from akolomiychuk/image-path
Passing nil to image_tag
2015-06-29 10:52:00 +02:00
Anton Kolomiychuk
42a1b0c7c3 Add nil check in asset_path 2015-06-29 14:03:29 +06:00
Roque Pinel
da1674576d Fix cache issue when different partials use the same collection
Adds the `virtual_path` option to `cache_fragment_name` so it can
be provided when needed.

That allows `cache_collection_render` to get the appropriate cache
key with the digest generated based on the template and prevent
collision with other templates that cache the same collection.
2015-06-28 20:41:59 -05:00
Kasper Timm Hansen
f9996803f8 Merge pull request #20417 from dubek/fix-template-cache-call-pattern
Improve detection of partial templates eligible for collection caching.
2015-06-26 23:01:07 +02:00
Robin Dupret
e09129c94c A few documentation fixes [ci skip] 2015-06-23 17:55:37 +02:00
Dov Murik
d51e2eefd5 Improve detection of partial templates eligible for collection caching.
The regular expression which was used to detect partial templates that
begin with a `<% cache ... do %>` call missed some cases.  This commits
attempts to improve the detection for some cases such as multi-line
comments at the beginning of the template.  The different templates are
listed in two new unit test methods.

Note that specially crafted Ruby code can still evade such `cache`-call
detection: for example, a user might have its own method which itself
calls the Rails `cache` helper. In such a case, the template's code
doesn't start with a literal `cache` string and therefore will not be
eligible for collection caching.
2015-06-22 14:17:08 -04:00
Richard Schneeman
0fccf646e1 Merge pull request #20654 from repinel/remove-duplicate-private
Remove duplicate private statement
2015-06-21 21:26:03 -05:00