actionview 5.2.3.rc1 → 6.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of actionview might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +115 -66
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/lib/action_view.rb +1 -1
- data/lib/action_view/buffers.rb +15 -0
- data/lib/action_view/context.rb +5 -4
- data/lib/action_view/digestor.rb +7 -6
- data/lib/action_view/gem_version.rb +4 -4
- data/lib/action_view/helpers.rb +0 -2
- data/lib/action_view/helpers/asset_tag_helper.rb +4 -27
- data/lib/action_view/helpers/asset_url_helper.rb +4 -3
- data/lib/action_view/helpers/cache_helper.rb +18 -10
- data/lib/action_view/helpers/capture_helper.rb +4 -0
- data/lib/action_view/helpers/csrf_helper.rb +1 -1
- data/lib/action_view/helpers/date_helper.rb +69 -25
- data/lib/action_view/helpers/form_helper.rb +238 -6
- data/lib/action_view/helpers/form_options_helper.rb +23 -15
- data/lib/action_view/helpers/form_tag_helper.rb +9 -7
- data/lib/action_view/helpers/javascript_helper.rb +9 -8
- data/lib/action_view/helpers/number_helper.rb +5 -0
- data/lib/action_view/helpers/sanitize_helper.rb +3 -3
- data/lib/action_view/helpers/tag_helper.rb +7 -6
- data/lib/action_view/helpers/tags/base.rb +8 -4
- data/lib/action_view/helpers/tags/color_field.rb +1 -1
- data/lib/action_view/helpers/tags/translator.rb +1 -6
- data/lib/action_view/helpers/text_helper.rb +3 -3
- data/lib/action_view/helpers/translation_helper.rb +14 -10
- data/lib/action_view/helpers/url_helper.rb +13 -13
- data/lib/action_view/log_subscriber.rb +6 -6
- data/lib/action_view/lookup_context.rb +4 -4
- data/lib/action_view/railtie.rb +18 -0
- data/lib/action_view/record_identifier.rb +2 -2
- data/lib/action_view/renderer/partial_renderer.rb +2 -2
- data/lib/action_view/renderer/partial_renderer/collection_caching.rb +40 -1
- data/lib/action_view/renderer/streaming_template_renderer.rb +1 -1
- data/lib/action_view/rendering.rb +5 -4
- data/lib/action_view/routing_url_for.rb +12 -11
- data/lib/action_view/template.rb +25 -8
- data/lib/action_view/template/handlers/erb.rb +12 -2
- data/lib/action_view/template/resolver.rb +56 -16
- data/lib/action_view/test_case.rb +1 -1
- data/lib/action_view/testing/resolvers.rb +1 -1
- data/lib/assets/compiled/rails-ujs.js +34 -17
- metadata +11 -12
- data/lib/action_view/helpers/record_tag_helper.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58d19af0e853c217ca89f2167775195c7a44ebba26e4d9a682aabeb6a25b6af4
|
4
|
+
data.tar.gz: 15d2c9faa90c17d33772df3ce0eacccecb090e7310af47ab1d82bca6448a2a11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc169a10649b5f6cdfb8488bd16cbb7cab049081e7a6c53821cfab497e8035c7843c690e3bffcffc571bf2f610e5f2b7eee80283f622262d5ff9f1f20c8ef210
|
7
|
+
data.tar.gz: ed371d7bec363bafe775d5a1ed3d11a1002f96589c142c662afabc1862c71314427fc07004d0bfa4bc2ac5078f0c0b38410ccca1ee738594223a1a3a336ffa14
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,18 @@
|
|
1
|
-
## Rails
|
1
|
+
## Rails 6.0.0.beta1 (January 18, 2019) ##
|
2
|
+
|
3
|
+
* Remove deprecated `image_alt` helper.
|
4
|
+
|
5
|
+
*Rafael Mendonça França*
|
6
|
+
|
7
|
+
* Fix the need of `#protect_against_forgery?` method defined in
|
8
|
+
`ActionView::Base` subclasses. This prevents the use of forms and buttons.
|
9
|
+
|
10
|
+
*Genadi Samokovarov*
|
11
|
+
|
12
|
+
* Fix UJS permanently showing disabled text in a[data-remote][data-disable-with] elements within forms.
|
13
|
+
Fixes #33889
|
14
|
+
|
15
|
+
*Wolfgang Hobmaier*
|
2
16
|
|
3
17
|
* Prevent non-primary mouse keys from triggering Rails UJS click handlers.
|
4
18
|
Firefox fires click events even if the click was triggered by non-primary mouse keys such as right- or scroll-wheel-clicks.
|
@@ -12,28 +26,50 @@
|
|
12
26
|
|
13
27
|
*Wolfgang Hobmaier*
|
14
28
|
|
29
|
+
* Prevent `ActionView::TextHelper#word_wrap` from unexpectedly stripping white space from the _left_ side of lines.
|
30
|
+
|
31
|
+
For example, given input like this:
|
32
|
+
|
33
|
+
```
|
34
|
+
This is a paragraph with an initial indent,
|
35
|
+
followed by additional lines that are not indented,
|
36
|
+
and finally terminated with a blockquote:
|
37
|
+
"A pithy saying"
|
38
|
+
```
|
39
|
+
|
40
|
+
Calling `word_wrap` should not trim the indents on the first and last lines.
|
15
41
|
|
16
|
-
|
42
|
+
Fixes #34487
|
17
43
|
|
18
|
-
*
|
44
|
+
*Lyle Mullican*
|
19
45
|
|
46
|
+
* Add allocations to template rendering instrumentation.
|
20
47
|
|
21
|
-
|
48
|
+
Adds the allocations for template and partial rendering to the server output on render.
|
49
|
+
|
50
|
+
```
|
51
|
+
Rendered posts/_form.html.erb (Duration: 7.1ms | Allocations: 6004)
|
52
|
+
Rendered posts/new.html.erb within layouts/application (Duration: 8.3ms | Allocations: 6654)
|
53
|
+
Completed 200 OK in 858ms (Views: 848.4ms | ActiveRecord: 0.4ms | Allocations: 1539564)
|
54
|
+
```
|
22
55
|
|
23
|
-
*
|
56
|
+
*Eileen M. Uchitelle*, *Aaron Patterson*
|
24
57
|
|
58
|
+
* Respect the `only_path` option passed to `url_for` when the options are passed in as an array
|
25
59
|
|
26
|
-
|
60
|
+
Fixes #33237.
|
27
61
|
|
28
|
-
*
|
62
|
+
*Joel Ambass*
|
29
63
|
|
64
|
+
* Deprecate calling private model methods from view helpers.
|
30
65
|
|
31
|
-
|
66
|
+
For example, in methods like `options_from_collection_for_select`
|
67
|
+
and `collection_select` it is possible to call private methods from
|
68
|
+
the objects used.
|
32
69
|
|
33
|
-
|
34
|
-
to HTML attributes.
|
70
|
+
Fixes #33546.
|
35
71
|
|
36
|
-
*
|
72
|
+
*Ana María Martínez Gómez*
|
37
73
|
|
38
74
|
* Fix issue with `button_to`'s `to_form_params`
|
39
75
|
|
@@ -46,97 +82,110 @@
|
|
46
82
|
|
47
83
|
*Georgi Georgiev*
|
48
84
|
|
49
|
-
*
|
50
|
-
Content Security Policy.
|
85
|
+
* Mark arrays of translations as trusted safe by using the `_html` suffix.
|
51
86
|
|
52
|
-
|
87
|
+
Example:
|
53
88
|
|
54
|
-
|
89
|
+
en:
|
90
|
+
foo_html:
|
91
|
+
- "One"
|
92
|
+
- "<strong>Two</strong>"
|
93
|
+
- "Three 👋 🙂"
|
55
94
|
|
56
|
-
*
|
57
|
-
support automatic nonce generation for Content Security Policy.
|
58
|
-
Works the same way as `javascript_tag nonce: true` does.
|
59
|
-
|
60
|
-
*Yaroslav Markin*
|
95
|
+
*Juan Broullon*
|
61
96
|
|
97
|
+
* Add `year_format` option to date_select tag. This option makes it possible to customize year
|
98
|
+
names. Lambda should be passed to use this option.
|
62
99
|
|
63
|
-
|
100
|
+
Example:
|
64
101
|
|
65
|
-
|
102
|
+
date_select('user_birthday', '', start_year: 1998, end_year: 2000, year_format: ->year { "Heisei #{year - 1988}" })
|
66
103
|
|
67
|
-
|
104
|
+
The HTML produced:
|
68
105
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
it is now able to receive procs and other callable objects too.
|
106
|
+
<select id="user_birthday__1i" name="user_birthday[(1i)]">
|
107
|
+
<option value="1998">Heisei 10</option>
|
108
|
+
<option value="1999">Heisei 11</option>
|
109
|
+
<option value="2000">Heisei 12</option>
|
110
|
+
</select>
|
111
|
+
/* The rest is omitted */
|
76
112
|
|
77
|
-
*
|
113
|
+
*Koki Ryu*
|
78
114
|
|
79
|
-
*
|
115
|
+
* Fix JavaScript views rendering does not work with Firefox when using
|
116
|
+
Content Security Policy.
|
80
117
|
|
81
|
-
|
82
|
-
(different to the specified in `javascript_include_tag` and `stylesheet_link_tag`).
|
83
|
-
Additionally, this sends Early Hints if supported by browser.
|
118
|
+
Fixes #32577.
|
84
119
|
|
85
|
-
*
|
120
|
+
*Yuji Yaginuma*
|
86
121
|
|
87
|
-
*
|
122
|
+
* Add the `nonce: true` option for `javascript_include_tag` helper to
|
123
|
+
support automatic nonce generation for Content Security Policy.
|
124
|
+
Works the same way as `javascript_tag nonce: true` does.
|
88
125
|
|
89
|
-
|
90
|
-
that was enabled in `form_for`. This usually is not an good idea since labels don't work
|
91
|
-
when the input doesn't have an id and it made harder to test with Capybara.
|
126
|
+
*Yaroslav Markin*
|
92
127
|
|
93
|
-
|
94
|
-
to `false.`
|
128
|
+
* Remove `ActionView::Helpers::RecordTagHelper`.
|
95
129
|
|
96
|
-
*
|
130
|
+
*Yoshiyuki Hirano*
|
97
131
|
|
98
|
-
*
|
132
|
+
* Disable `ActionView::Template` finalizers in test environment.
|
99
133
|
|
100
|
-
|
134
|
+
Template finalization can be expensive in large view test suites.
|
135
|
+
Add a configuration option,
|
136
|
+
`action_view.finalize_compiled_template_methods`, and turn it off in
|
137
|
+
the test environment.
|
101
138
|
|
102
|
-
*
|
139
|
+
*Simon Coffey*
|
103
140
|
|
104
|
-
*
|
141
|
+
* Extract the `confirm` call in its own, overridable method in `rails_ujs`.
|
105
142
|
|
106
|
-
|
143
|
+
Example:
|
107
144
|
|
108
|
-
|
145
|
+
Rails.confirm = function(message, element) {
|
146
|
+
return (my_bootstrap_modal_confirm(message));
|
147
|
+
}
|
109
148
|
|
110
|
-
|
149
|
+
*Mathieu Mahé*
|
111
150
|
|
112
|
-
|
151
|
+
* Enable select tag helper to mark `prompt` option as `selected` and/or `disabled` for `required`
|
152
|
+
field.
|
113
153
|
|
114
|
-
|
154
|
+
Example:
|
115
155
|
|
116
|
-
|
156
|
+
select :post,
|
157
|
+
:category,
|
158
|
+
["lifestyle", "programming", "spiritual"],
|
159
|
+
{ selected: "", disabled: "", prompt: "Choose one" },
|
160
|
+
{ required: true }
|
117
161
|
|
118
|
-
|
162
|
+
Placeholder option would be selected and disabled.
|
119
163
|
|
120
|
-
|
164
|
+
The HTML produced:
|
121
165
|
|
122
|
-
|
166
|
+
<select required="required" name="post[category]" id="post_category">
|
167
|
+
<option disabled="disabled" selected="selected" value="">Choose one</option>
|
168
|
+
<option value="lifestyle">lifestyle</option>
|
169
|
+
<option value="programming">programming</option>
|
170
|
+
<option value="spiritual">spiritual</option></select>
|
123
171
|
|
124
|
-
*
|
172
|
+
*Sergey Prikhodko*
|
125
173
|
|
126
|
-
|
174
|
+
* Don't enforce UTF-8 by default.
|
127
175
|
|
128
|
-
|
176
|
+
With the disabling of TLS 1.0 by most major websites, continuing to run
|
177
|
+
IE8 or lower becomes increasingly difficult so default to not enforcing
|
178
|
+
UTF-8 encoding as it's not relevant to other browsers.
|
129
179
|
|
130
|
-
*
|
180
|
+
*Andrew White*
|
131
181
|
|
132
|
-
*
|
182
|
+
* Change translation key of `submit_tag` from `module_name_class_name` to `module_name/class_name`.
|
133
183
|
|
134
|
-
*
|
184
|
+
*Rui Onodera*
|
135
185
|
|
136
|
-
*
|
137
|
-
for bad input.
|
186
|
+
* Rails 6 requires Ruby 2.5.0 or newer.
|
138
187
|
|
139
|
-
*
|
188
|
+
*Jeremy Daer*, *Kasper Timm Hansen*
|
140
189
|
|
141
190
|
|
142
|
-
Please check [5-
|
191
|
+
Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/actionview/CHANGELOG.md) for previous changes.
|
data/MIT-LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -13,7 +13,7 @@ The latest version of Action View can be installed with RubyGems:
|
|
13
13
|
|
14
14
|
Source code can be downloaded as part of the Rails project on GitHub:
|
15
15
|
|
16
|
-
* https://github.com/rails/rails/tree/
|
16
|
+
* https://github.com/rails/rails/tree/master/actionview
|
17
17
|
|
18
18
|
|
19
19
|
== License
|
data/lib/action_view.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
#--
|
4
|
-
# Copyright (c) 2004-
|
4
|
+
# Copyright (c) 2004-2019 David Heinemeier Hansson
|
5
5
|
#
|
6
6
|
# Permission is hereby granted, free of charge, to any person obtaining
|
7
7
|
# a copy of this software and associated documentation files (the
|
data/lib/action_view/buffers.rb
CHANGED
@@ -3,6 +3,21 @@
|
|
3
3
|
require "active_support/core_ext/string/output_safety"
|
4
4
|
|
5
5
|
module ActionView
|
6
|
+
# Used as a buffer for views
|
7
|
+
#
|
8
|
+
# The main difference between this and ActiveSupport::SafeBuffer
|
9
|
+
# is for the methods `<<` and `safe_expr_append=` the inputs are
|
10
|
+
# checked for nil before they are assigned and `to_s` is called on
|
11
|
+
# the input. For example:
|
12
|
+
#
|
13
|
+
# obuf = ActionView::OutputBuffer.new "hello"
|
14
|
+
# obuf << 5
|
15
|
+
# puts obuf # => "hello5"
|
16
|
+
#
|
17
|
+
# sbuf = ActiveSupport::SafeBuffer.new "hello"
|
18
|
+
# sbuf << 5
|
19
|
+
# puts sbuf # => "hello\u0005"
|
20
|
+
#
|
6
21
|
class OutputBuffer < ActiveSupport::SafeBuffer #:nodoc:
|
7
22
|
def initialize(*)
|
8
23
|
super
|
data/lib/action_view/context.rb
CHANGED
@@ -10,10 +10,11 @@ module ActionView
|
|
10
10
|
# Action View contexts are supplied to Action Controller to render a template.
|
11
11
|
# The default Action View context is ActionView::Base.
|
12
12
|
#
|
13
|
-
# In order to work with
|
14
|
-
# The initialization of the variables used by the context
|
15
|
-
# and @virtual_path) is responsibility of the
|
16
|
-
# (although you can call _prepare_context
|
13
|
+
# In order to work with Action Controller, a Context must just include this
|
14
|
+
# module. The initialization of the variables used by the context
|
15
|
+
# (@output_buffer, @view_flow, and @virtual_path) is responsibility of the
|
16
|
+
# object that includes this module (although you can call _prepare_context
|
17
|
+
# defined below).
|
17
18
|
module Context
|
18
19
|
include CompiledTemplates
|
19
20
|
attr_accessor :output_buffer, :view_flow
|
data/lib/action_view/digestor.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "concurrent/map"
|
4
3
|
require "action_view/dependency_tracker"
|
5
|
-
require "monitor"
|
6
4
|
|
7
5
|
module ActionView
|
8
6
|
class Digestor
|
@@ -20,9 +18,12 @@ module ActionView
|
|
20
18
|
# * <tt>name</tt> - Template name
|
21
19
|
# * <tt>finder</tt> - An instance of <tt>ActionView::LookupContext</tt>
|
22
20
|
# * <tt>dependencies</tt> - An array of dependent views
|
23
|
-
def digest(name:, finder:, dependencies:
|
24
|
-
dependencies
|
25
|
-
|
21
|
+
def digest(name:, finder:, dependencies: nil)
|
22
|
+
if dependencies.nil? || dependencies.empty?
|
23
|
+
cache_key = "#{name}.#{finder.rendered_format}"
|
24
|
+
else
|
25
|
+
cache_key = [ name, finder.rendered_format, dependencies ].flatten.compact.join(".")
|
26
|
+
end
|
26
27
|
|
27
28
|
# this is a correctly done double-checked locking idiom
|
28
29
|
# (Concurrent::Map's lookups have volatile semantics)
|
@@ -32,7 +33,7 @@ module ActionView
|
|
32
33
|
root = tree(name, finder, partial)
|
33
34
|
dependencies.each do |injected_dep|
|
34
35
|
root.children << Injected.new(injected_dep, nil, nil)
|
35
|
-
end
|
36
|
+
end if dependencies
|
36
37
|
finder.digest_cache[cache_key] = root.digest(finder)
|
37
38
|
end
|
38
39
|
end
|
data/lib/action_view/helpers.rb
CHANGED
@@ -23,7 +23,6 @@ module ActionView #:nodoc:
|
|
23
23
|
autoload :JavaScriptHelper, "action_view/helpers/javascript_helper"
|
24
24
|
autoload :NumberHelper
|
25
25
|
autoload :OutputSafetyHelper
|
26
|
-
autoload :RecordTagHelper
|
27
26
|
autoload :RenderingHelper
|
28
27
|
autoload :SanitizeHelper
|
29
28
|
autoload :TagHelper
|
@@ -57,7 +56,6 @@ module ActionView #:nodoc:
|
|
57
56
|
include JavaScriptHelper
|
58
57
|
include NumberHelper
|
59
58
|
include OutputSafetyHelper
|
60
|
-
include RecordTagHelper
|
61
59
|
include RenderingHelper
|
62
60
|
include SanitizeHelper
|
63
61
|
include TagHelper
|
@@ -55,7 +55,7 @@ module ActionView
|
|
55
55
|
# that path.
|
56
56
|
# * <tt>:skip_pipeline</tt> - This option is used to bypass the asset pipeline
|
57
57
|
# when it is set to true.
|
58
|
-
# * <tt>:nonce
|
58
|
+
# * <tt>:nonce</tt> - When set to true, adds an automatic nonce value if
|
59
59
|
# you have Content Security Policy enabled.
|
60
60
|
#
|
61
61
|
# ==== Examples
|
@@ -98,7 +98,7 @@ module ActionView
|
|
98
98
|
if tag_options["nonce"] == true
|
99
99
|
tag_options["nonce"] = content_security_policy_nonce
|
100
100
|
end
|
101
|
-
content_tag("script"
|
101
|
+
content_tag("script", "", tag_options)
|
102
102
|
}.join("\n").html_safe
|
103
103
|
|
104
104
|
request.send_early_hints("Link" => early_hints_links.join("\n")) if respond_to?(:request) && request
|
@@ -333,9 +333,9 @@ module ActionView
|
|
333
333
|
#
|
334
334
|
# image_tag(user.avatar)
|
335
335
|
# # => <img src="/rails/active_storage/blobs/.../tiger.jpg" />
|
336
|
-
# image_tag(user.avatar.variant(
|
336
|
+
# image_tag(user.avatar.variant(resize_to_fit: [100, 100]))
|
337
337
|
# # => <img src="/rails/active_storage/variants/.../tiger.jpg" />
|
338
|
-
# image_tag(user.avatar.variant(
|
338
|
+
# image_tag(user.avatar.variant(resize_to_fit: [100, 100]), size: '100')
|
339
339
|
# # => <img width="100" height="100" src="/rails/active_storage/variants/.../tiger.jpg" />
|
340
340
|
def image_tag(source, options = {})
|
341
341
|
options = options.symbolize_keys
|
@@ -355,29 +355,6 @@ module ActionView
|
|
355
355
|
tag("img", options)
|
356
356
|
end
|
357
357
|
|
358
|
-
# Returns a string suitable for an HTML image tag alt attribute.
|
359
|
-
# The +src+ argument is meant to be an image file path.
|
360
|
-
# The method removes the basename of the file path and the digest,
|
361
|
-
# if any. It also removes hyphens and underscores from file names and
|
362
|
-
# replaces them with spaces, returning a space-separated, titleized
|
363
|
-
# string.
|
364
|
-
#
|
365
|
-
# ==== Examples
|
366
|
-
#
|
367
|
-
# image_alt('rails.png')
|
368
|
-
# # => Rails
|
369
|
-
#
|
370
|
-
# image_alt('hyphenated-file-name.png')
|
371
|
-
# # => Hyphenated file name
|
372
|
-
#
|
373
|
-
# image_alt('underscored_file_name.png')
|
374
|
-
# # => Underscored file name
|
375
|
-
def image_alt(src)
|
376
|
-
ActiveSupport::Deprecation.warn("image_alt is deprecated and will be removed from Rails 6.0. You must explicitly set alt text on images.")
|
377
|
-
|
378
|
-
File.basename(src, ".*".freeze).sub(/-[[:xdigit:]]{32,64}\z/, "".freeze).tr("-_".freeze, " ".freeze).capitalize
|
379
|
-
end
|
380
|
-
|
381
358
|
# Returns an HTML video tag for the +sources+. If +sources+ is a string,
|
382
359
|
# a single video tag will be returned. If +sources+ is an array, a video
|
383
360
|
# tag with nested source tags for each source will be returned. The
|
@@ -98,8 +98,9 @@ module ActionView
|
|
98
98
|
# have SSL certificates for each of the asset hosts this technique allows you
|
99
99
|
# to avoid warnings in the client about mixed media.
|
100
100
|
# Note that the +request+ parameter might not be supplied, e.g. when the assets
|
101
|
-
# are precompiled
|
102
|
-
# since a +Proc+ allows missing parameters and sets them
|
101
|
+
# are precompiled with the command `rails assets:precompile`. Make sure to use a
|
102
|
+
# +Proc+ instead of a lambda, since a +Proc+ allows missing parameters and sets them
|
103
|
+
# to +nil+.
|
103
104
|
#
|
104
105
|
# config.action_controller.asset_host = Proc.new { |source, request|
|
105
106
|
# if request && request.ssl?
|
@@ -187,7 +188,7 @@ module ActionView
|
|
187
188
|
return "" if source.blank?
|
188
189
|
return source if URI_REGEXP.match?(source)
|
189
190
|
|
190
|
-
tail, source = source[/([\?#].+)$/], source.sub(/([\?#].+)$/, ""
|
191
|
+
tail, source = source[/([\?#].+)$/], source.sub(/([\?#].+)$/, "")
|
191
192
|
|
192
193
|
if extname = compute_asset_extname(source, options)
|
193
194
|
source = "#{source}#{extname}"
|