aboutsummaryrefslogtreecommitdiffstats
path: root/actionview
Commit message (Collapse)AuthorAgeFilesLines
* Move templates to an anonymous subclass of AV::BaseAaron Patterson2019-02-0612-35/+75
| | | | | Now we can throw away the subclass and the generated methods will get GC'd too
* Merge pull request #35171 from rails/speed-up-partialsAaron Patterson2019-02-052-18/+40
|\ | | | | Speed up partial rendering by caching "variable" calculation
| * Speed up partial rendering by caching "variable" calculationAaron Patterson2019-02-052-18/+40
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit speeds up rendering partials by caching the variable name calculation on the template. The variable name is based on the "virtual path" used for looking up the template. The same virtual path information lives on the template, so we can just ask the cached template object for the variable. This benchmark takes a couple files, so I'll cat them below: ``` [aaron@TC ~/g/r/actionview (speed-up-partials)]$ cat render_benchmark.rb require "benchmark/ips" require "action_view" require "action_pack" require "action_controller" class TestController < ActionController::Base end TestController.view_paths = [File.expand_path("test/benchmarks")] controller_view = TestController.new.view_context result = Benchmark.ips do |x| x.report("render") do controller_view.render("many_partials") end end [aaron@TC ~/g/r/actionview (speed-up-partials)]$ cat test/benchmarks/test/_many_partials.html.erb Looping: <ul> <% 100.times do |i| %> <%= render partial: "list_item", locals: { i: i } %> <% end %> </ul> [aaron@TC ~/g/r/actionview (speed-up-partials)]$ cat test/benchmarks/test/_list_item.html.erb <li>Number: <%= i %></li> ``` Benchmark results (master): ``` [aaron@TC ~/g/r/actionview (master)]$ be ruby render_benchmark.rb Warming up -------------------------------------- render 41.000 i/100ms Calculating ------------------------------------- render 424.269 (± 3.5%) i/s - 2.132k in 5.031455s ``` Benchmark results (this branch): ``` [aaron@TC ~/g/r/actionview (speed-up-partials)]$ be ruby render_benchmark.rb Warming up -------------------------------------- render 50.000 i/100ms Calculating ------------------------------------- render 521.862 (± 3.8%) i/s - 2.650k in 5.085885s ```
* | Merge branch 'float_dom_ids'Gannon McGibbon2019-02-053-5/+27
|\ \ | | | | | | | | | Closes #34975.
| * | Fix unique DOM IDs for collection inputsMark Edmondson2019-01-253-5/+26
| | |
* | | Merge pull request #35166 from znz/improve-regexpAaron Patterson2019-02-051-1/+1
|\ \ \ | | | | | | | | Improve regexp of `html_safe_translation_key?`
| * | | Improve regexp of `html_safe_translation_key?`Kazuhiro NISHIYAMA2019-02-051-1/+1
| | |/ | |/| | | | | | | | | | | | | - Use `\z` instead of `$` - Use character class instead of alternation - Optimize alternation order
* / | Respect ENV variables when finding DBs etc for the test suiteMatthew Draper2019-02-062-3/+25
|/ / | | | | | | | | If they're not set we'll still fall back to localhost, but this makes it possible to run the tests against a remote Postgres / Redis / whatever.
* | Take in to account optional arguments when deprecatingAaron Patterson2019-02-042-1/+10
| | | | | | | | Refs: rails/jbuilder#452
* | Pass source to template handler and deprecate old style handlerAaron Patterson2019-02-0110-21/+55
| | | | | | | | | | | | | | | | | | This commit passes the mutated source to the template handler as a parameter and deprecates the old handlers. Old handlers required that templates contain a reference to mutated source code, but we would like to make template objects "read only". This change lets the template remain "read only" while still giving template handlers access to the source code after mutations.
* | Introduce a file type template, deprecate `Template#refresh`Aaron Patterson2019-02-014-3/+47
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Every template that specifies a "virtual path" loses the template source when the template gets compiled: https://github.com/rails/rails/blob/eda0f574f129fcd5ad1fc58b55cb6d1db71ea95c/actionview/lib/action_view/template.rb#L275 The "refresh" method seems to think that the source code for a template can be recovered if there is a virtual path: https://github.com/rails/rails/blob/eda0f574f129fcd5ad1fc58b55cb6d1db71ea95c/actionview/lib/action_view/template.rb#L171-L188 Every call site that allocates a template object *and* provides a "virtual path" reads the template contents from the filesystem: https://github.com/rails/rails/blob/eda0f574f129fcd5ad1fc58b55cb6d1db71ea95c/actionview/lib/action_view/template/resolver.rb#L229-L231 Templates that are inline or literals don't provide a "virtual path": https://github.com/rails/rails/blob/eda0f574f129fcd5ad1fc58b55cb6d1db71ea95c/actionview/lib/action_view/renderer/template_renderer.rb#L34 This commit introduces a `FileTemplate` type that subclasses `Template`. The `FileTemplate` keeps a reference to the filename, and reads the source from the filesystem. This effectively makes the template source immutable. Other classes depended on the source to be mutated while being compiled, so this commit also introduces a temporary way to pass the mutated source to the ERB (or whatever) compiler. See `LegacyTemplate`. I think we should consider it an error to provide a virtual path on a non file type template an non-file templates can't recover their source. Here is an example: https://github.com/rails/rails/blob/eda0f574f129fcd5ad1fc58b55cb6d1db71ea95c/actionview/lib/action_view/testing/resolvers.rb#L53 This provides a "virtual path" so the source code (a string literal) is thrown away after compilation. Clearly we can't recover that string, so I think this should be an error.
* | use the source returned from encode!Aaron Patterson2019-01-311-3/+5
| |
* | add tests to make sure deprecated API is still supportedAaron Patterson2019-01-312-2/+14
| |
* | Tighten up the AV::Base constructorAaron Patterson2019-01-2911-22/+55
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The AV::Base constructor was too complicated, and this commit tightens up the parameters it will take. At runtime, AV::Base is most commonly constructed here: https://github.com/rails/rails/blob/94d54fa4ab641a0ddeb173409cb41cc5becc02a9/actionview/lib/action_view/rendering.rb#L72-L74 This provides an AV::Renderer instance, a hash of assignments, and a controller instance. Since this is the common case for construction, we should remove logic from the constructor that handles other cases. This commit introduces special constructors for those other cases. Interestingly, most code paths that construct AV::Base "strangely" are tests.
* | Remove `with_layout_format` delegationAaron Patterson2019-01-281-1/+1
| | | | | | | | | | That method doesn't exist on LookupContext, so the delegate doesn't make sense.
* | Cache the digest path on the stack.Aaron Patterson2019-01-281-7/+5
| | | | | | | | We can remove the ivar by caching the digest on the stack
* | Pull `@template` in to a local variableAaron Patterson2019-01-283-25/+24
| | | | | | | | | | | | This gets the PartialRenderer to be a bit closer to the TemplateRenderer. TemplateRenderer already keeps its template in a local variable.
* | Remove default parameters from method signatureAaron Patterson2019-01-281-4/+2
| | | | | | | | This method is private, and we always pass something in.
* | Remove `@view` instance variable from the partial rendererAaron Patterson2019-01-282-25/+24
| | | | | | | | Similar to 1853b0d0abf87dfdd4c3a277c3badb17ca19652e
* | Remove `find_template` and `find_file` delegate methodsAaron Patterson2019-01-281-1/+1
| | | | | | | | | | | | | | | | | | | | This reduces the surface area of our API and removes a Liskov issue. Both TemplateRenderer and PartialRenderer inherit from AbstractRenderer, but since PartialRenderer implements it's own `find_template` that is private, and has the wrong method signature, an instance of PartialRenderer cannot be substituted for an instance of AbstractRenderer renderer. Removing the superclass implementation solves both issues.
* | Deprecate `with_fallbacks` using a blockAaron Patterson2019-01-283-15/+42
| | | | | | | | | | | | | | This patch changes `with_fallbacks` to be a factory method that returns a new instance of a lookup context which contains the fallback view paths in addition to the controller specific view paths. Since the lookup context is more "read only", we may be able to cache them
* | Make `@view_paths` on the lookup context mostly read-onlyAaron Patterson2019-01-282-17/+17
| | | | | | | | | | | | The `with_fallbacks` method will temporarily mutate the lookup context instance, but nobody can call the setter, and we don't have to do a push / pop dance.
* | Remove method named "hash"Aaron Patterson2019-01-282-8/+10
| | | | | | | | | | | | We can't use the FixtureResolver as a hash key because it doesn't implement `hash` correctly. This commit renames the method to "data" (which is just as unfortunately named :( )
* | Add CHANGELOG entries for npm package renames [ci skip]Javan Makhmali2019-01-281-0/+6
| |
* | Add test for Hash-like object being passed to partial `locals`Ufuk Kayserilioglu2019-01-241-0/+10
| | | | | | | | | | | | | | | | | | | | The test passes an instance of `ActionController::Parameters` that acts like a Hash but does not respond to some Hash methods like `symbolize_keys`. Moreover, if someone were to call `to_h` on the value it would fail since the parameter is not permitted. So this is a great way to ensure that the partial rendering pipeline does not mess with `locals`.
* | Revert "Allow usage of strings as locals for partial renderer"Ufuk Kayserilioglu2019-01-242-11/+1
| |
* | Prefer ImageProcessing's resize_to_limit macro over resize_to_fitGeorge Claghorn2019-01-241-5/+5
| | | | | | | | Don't upsize images smaller than the specified dimensions.
* | Pass the view around instead of using an ivarAaron Patterson2019-01-232-9/+7
| | | | | | | | | | If we pass the view instance around it's easier to understand the flow control.
* | Merge pull request #34952 from rails/template-stuffAaron Patterson2019-01-227-23/+32
|\ \ | | | | | | Template Handler Refactoring
| * | Ask the view for its method containerAaron Patterson2019-01-182-5/+5
| | | | | | | | | | | | | | | | | | Rather than doing is_a? checks, ask the view object for its compiled method container. This gives us the power to replace the method container depending on the instance of the view.
| * | Directly include "CompiledTemplates" moduleAaron Patterson2019-01-182-5/+6
| | | | | | | | | | | | | | | We always want to include this module. It'll be used in production (maybe)
| * | Only cache the view_context_class in one placeAaron Patterson2019-01-181-3/+1
| | | | | | | | | | | | | | | | | | | | | This patch removes the instance writer of view_context_class. Subclasses may override it, but it doesn't need to be written. This also eliminates the need to cache the return value of the class level `view_context_class` method.
| * | Pull up virtual path assignmentAaron Patterson2019-01-162-5/+3
| | |
| * | Pull buffer assignment upAaron Patterson2019-01-162-1/+2
| | | | | | | | | | | | | | | Since everything goes through a `run` method, we can pull the buffer assignment up.
| * | Always evaluate views against an ActionView::BaseAaron Patterson2019-01-165-9/+18
| | | | | | | | | | | | | | | Methods created by views should always be evaluated against an AV::Base instance. This way we can extract and refactor things in to classes.
| * | Pull output buffer conditional upAaron Patterson2019-01-162-2/+4
| | | | | | | | | | | | | | | | | | This pulls the "output buffer existence" conditional up. Instead of evaling the same conditional over and over, we can pull it in to "only compiled once" Ruby code.
* | | Single new line is not rendered as new line in the CHANGELOG.mdRyuta Kamizono2019-01-191-3/+4
| |/ |/| | | | | | | | | https://github.com/rails/rails/blob/v6.0.0.beta1/actionview/CHANGELOG.md [ci skip]
* | Preparing for 6.0.0.beta1 releaseRafael Mendonça França2019-01-183-2/+4
| |
* | Remove deprecated image_alt helperRafael Mendonça França2019-01-173-43/+4
| |
* | Minimize boilerplate setup code for JavaScript librariesJavan Makhmali2019-01-161-2/+1
|/
* Fix typo in collection_radio_buttons spec [ci skip]Alberto Almagro2019-01-111-1/+1
|
* Move all npm packages to @rails scopeJavan Makhmali2019-01-102-6/+6
| | | | Fixes #33083
* Revert "Revert "Merge pull request #34387 from ↵Kasper Timm Hansen2019-01-081-0/+3
| | | | | | | | yhirano55/rails_info_properties_json"" I reverted the wrong commit. Damn it. This reverts commit f66a977fc7ae30d2a07124ad91924c4ee638a703.
* Revert "Merge pull request #34387 from yhirano55/rails_info_properties_json"Kasper Timm Hansen2019-01-081-3/+0
| | | | | | | | | | | We had a discussion on the Core team and we don't want to expose this information as a JSON endpoint and not by default. It doesn't make sense to expose this JSON locally and this controller is only accessible in dev, so the proposed access from a production app seems off. This reverts commit 8eaffe7e89719ac62ff29c2e4208cfbeb1cd1c38, reversing changes made to b6e4305c3bca4c673996d0af9db0f4cfbf50215e.
* Merge pull request #34797 from ↵Eileen M. Uchitelle2019-01-045-5/+63
|\ | | | | | | | | gsamokovarov/views-without-defined-protect-against-forgery Don't expect defined protect_against_forgery? in {token,csrf_meta}_tag
| * Don't expect defined protect_against_forgery? in {token,csrf_meta}_tagGenadi Samokovarov2018-12-275-5/+63
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The `#csrf_meta_tags` and `#token_tag` Action View helper methods are expecting the class in which are included to explicitly define the method `#protect_against_forgery?` or else they will fail with `NoMethodError`. This is a problem if you want to use Action View outside of Rails applications. For example, in #34788 I used the `#button_to` helper inside of the error pages templates that have a custom `ActionView::Base` subclass, which did not defined `#protect_against_forgery?` and trying to call the button failed. I had to dig inside of Action View to find-out what's was going on. I think we should either set a default method implementation in the helpers or check for the method definition, but don't explicitly require the presence of `#protect_against_forgery?` in every `ActionViews::Base` subclass as the errors are hard to figure out.
* | Bump license years for 2019Arun Agrawal2018-12-313-3/+3
|/
* Generate doc of methods provided by form builders [ci skip]yuuji.yaginuma2018-12-261-0/+221
| | | | | | | | Because method arguments are different in the methods provided by form helpers and form builders, I think these are necessary to prevent confusion. Fixes #34787
* Merge pull request #34764 from kamipo/avoid_redundant_beginRyuta Kamizono2018-12-211-7/+5
|\ | | | | Enable `Style/RedundantBegin` cop to avoid newly adding redundant begin block
| * Enable `Style/RedundantBegin` cop to avoid newly adding redundant begin blockRyuta Kamizono2018-12-211-7/+5
| | | | | | | | | | | | | | | | | | | | Currently we sometimes find a redundant begin block in code review (e.g. https://github.com/rails/rails/pull/33604#discussion_r209784205). I'd like to enable `Style/RedundantBegin` cop to avoid that, since rescue/else/ensure are allowed inside do/end blocks in Ruby 2.5 (https://bugs.ruby-lang.org/issues/12906), so we'd probably meets with that situation than before.