aboutsummaryrefslogtreecommitdiffstats
path: root/actionview/lib/action_view/template.rb
Commit message (Collapse)AuthorAgeFilesLines
...
* Add `action_view.finalize_compiled_template_methods` config optionSimon Coffey2018-04-021-1/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | ActionView::Template instances compile their source to methods on the ActionView::CompiledTemplates module. To prevent leaks in development mode, where templates can frequently change, a finalizer is added that undefines these methods[1] when the templates are garbage-collected. This is undesirable in the test environment, however, as templates don't change during the life of the test. Moreover, the cost of undefining a method is proportional to the number of descendants a class or module has, since the method cache must be cleared for all descendant classes. As ActionView::CompiledTemplates is mixed into every ActionView::TestCase (or in RSpec suites, every view spec example group), it can end up with a very large number of descendants, and undefining its methods can become very expensive. In large test suites, this results in a long delay at the end of the test suite as all template finalizers are run, only for the process to then exit. To avoid this unnecessary cost, this change adds a config option, `action_view.finalize_compiled_template_methods`, defaulting to true, and sets it to false in the test environment only. [1] https://github.com/rails/rails/blob/09b2348f7fc8d4e7191e70e06608c5909067e2aa/actionview/lib/action_view/template.rb#L118-L126
* Fix outdated comment [ci skip]yuuji.yaginuma2017-09-021-1/+1
| | | | We do not use double assign since 61f92f8bc5fa0b486fc56f249fa23f1102e79759.
* double assign is no longer an effective workaround for unused variable warningAkira Matsuda2017-09-011-1/+1
| | | | `def a() x = x = 1; end` warns since Ruby 2.5 (r59585)
* [Action View] `rubocop -a --only Layout/EmptyLineAfterMagicComment`Koichi ITO2017-07-111-0/+1
|
* Prepare AP and AR to be frozen string friendlyKir Shatrov2017-07-061-0/+1
|
* Revert "Merge pull request #29540 from kirs/rubocop-frozen-string"Matthew Draper2017-07-021-1/+0
| | | | | This reverts commit 3420a14590c0e6915d8b6c242887f74adb4120f9, reversing changes made to afb66a5a598ce4ac74ad84b125a5abf046dcf5aa.
* Merge pull request #29540 from kirs/rubocop-frozen-stringMatthew Draper2017-07-021-0/+1
|\ | | | | | | Enforce frozen string in Rubocop
| * Enforce frozen string in RubocopKir Shatrov2017-07-011-0/+1
| |
* | Make ActionView frozen string literal friendly.Pat Allan2017-06-201-1/+1
| | | | | | | | Plus a couple of related ActionPack patches.
* | Make ActionMailer frozen string literal friendly.Pat Allan2017-06-201-2/+2
|/
* Unfreeze interpolated string because it's useless.Stan Lo2017-02-191-1/+1
|
* Allow render locals to be assigned to instance variablesAndrew White2017-01-151-1/+1
| | | | | | | | | In #26672 we blocked use of Ruby keywords as identifiers for view locals but inadvertently broke the use of instance variable names as identifiers. Whilst not explicitly documented this behavior has been around for a long time and there's no need to break it now. Fixes #27480.
* Fix typo in action_view/template.rb [ci skip]kenta-s2016-12-281-1/+1
|
* self. is not needed when calling its own instance methodAkira Matsuda2016-12-241-2/+1
|
* Privatize unneededly protected methods in Action ViewAkira Matsuda2016-12-241-10/+8
|
* split DELEGATION_RESERVED_METHOD_NAMES in halfToshimaru2016-12-091-1/+1
|
* Enable `block` variable in viewToshimaru2016-12-091-1/+1
| | | | Remove `block` keyword from reserved method names
* Add more rubocop rules about whitespacesRafael Mendonça França2016-10-291-1/+1
|
* removes requires already present in active_support/railsXavier Noria2016-10-271-1/+0
|
* Change render to support any hash keys in localsPeter Schilling2016-10-021-1/+7
| | | | | | | | | | | | | | | | | | | this lets you pass ruby keywords to templates: <%= render 'example', class: "cool" %> <%= render 'example', "spaces are" => "a-ok" %> <%= render 'example', Foo: "bar" %> Previously you'd see confusing syntax errors like this: SyntaxError (.../_example.html.erb:1: syntax error, unexpected '=' Now you can reference invalid identifiers through local_assigns. If you try to use an invalid keyword (e.g. class) in your template, you get a syntax error on the line where you use it.
* kick different instrumentation methodAaron Patterson2016-08-241-8/+12
| | | | | | | We can eliminate a conditional by calling a different instrumentation method depending on the situation. In this case, we'll call the special case "!render_template" instrumentation method and eliminate the case / when clause from the `instrument` method.
* remove useless freezeAaron Patterson2016-08-241-1/+1
| | | | Ruby already does this freeze for us.
* code gardening: removes redundant selfsXavier Noria2016-08-081-2/+1
| | | | | | | | | A few have been left for aesthetic reasons, but have made a pass and removed most of them. Note that if the method `foo` returns an array, `foo << 1` is a regular push, nothing to do with assignments, so no self required.
* applies new string literal convention in actionview/libXavier Noria2016-08-061-9/+9
| | | | | The current code base is not uniform. After some discussion, we have chosen to go with double quotes by default.
* Make collection caching explicit.Kasper Timm Hansen2016-02-201-23/+0
| | | | | | | | | | | | Having collection caching that wraps templates and automatically tries to infer if they are cachable proved to be too much of a hassle. We'd rather have it be something you explicitly turn on. This removes much of the code and docs to explain the previous automatic behavior. This change also removes scoped cache keys and passing cache_options.
* Deprecate exception#original_exception in favor of exception#causeYuki Nishijima2015-11-031-1/+1
|
* adding description of return value [ci skip]amitkumarsuroliya2015-09-031-1/+1
|
* Cut string ActionView template allocationsschneems2015-07-291-2/+7
| | | | | | 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.
* Freeze string literals when not mutated.schneems2015-07-191-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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)
* Support explicit defintion of resouce name for collection caching.Dov Murik2015-07-071-4/+13
| | | | | | | | | | | | | | 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).
* Merge pull request #18948 from kaspth/automatic-collection-cachingRafael Mendonça França2015-02-251-0/+14
|\ | | | | Merge multi_fetch_fragments.
| * Collections automatically cache and fetch partials.Kasper Timm Hansen2015-02-211-0/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Collections can take advantage of `multi_read` if they render one template and their partials begin with a cache call. The cache call must correspond to either what the collections elements are rendered as, or match the inferred name of the partial. So with a notifications/_notification.html.erb template like: ```ruby <% cache notification %> <%# ... %> <% end %> ``` A collection would be able to use `multi_read` if rendered like: ```ruby <%= render @notifications %> <%= render partial: 'notifications/notification', collection: @notifications, as: :notification %> ```
* | Add nodoc to private constant [ci skip]Rafael Mendonça França2015-02-181-1/+1
| |
* | Improve documentation of local_assignsRafael Mendonça França2015-02-181-7/+13
| |
* | Merge pull request #15700 from maurogeorge/guides-local_assignsRafael Mendonça França2015-02-181-0/+7
|\ \ | |/ |/| | | Add docs about local_assigns on guides
| * Add RDoc about local_assignsMauro George2014-06-131-0/+7
| | | | | | | | [ci skip]
* | Reduce object allocationAkira Matsuda2014-10-251-1/+5
| |
* | Reduce object allocationAkira Matsuda2014-10-251-1/+1
| |
* | Use #tr instead of #gsub where possibleAlex Weidmann2014-10-021-1/+1
| |
* | use tr instead of gsub when possibleAdrian Rangel2014-10-011-1/+1
| |
* | remove useless parameterAaron Patterson2014-08-271-2/+2
| |
* | remove dead codeAaron Patterson2014-08-271-12/+2
|/ | | | | | the ERB has already been compiled to Ruby code by the time we're calling module_eval. Nothing that module eval raises will be caught by a blank `rescue`, so I think we can remove this
* Add variants to Template classŁukasz Strzałkowski2014-03-141-1/+2
|
* Introduce `render :html` for render HTML stringPrem Sichanugrist2014-02-181-0/+1
| | | | | | | | | This is an option for to HTML content with a content type of `text/html`. This rendering option calls `ERB::Util.html_escape` internally to escape unsafe HTML string, so you will have to mark your string as html safe if you have any HTML tag in it. Please see #12374 for more detail.
* Avoid unnecessary catching of Exception instead of StandardError (converting ↵stopdropandrew2013-10-241-2/+2
| | | | Exceptions into StandardErrors)
* Move actionpack/lib/action_view* into actionview/libPiotr Sarnacki2013-06-201-0/+340