inline_svg 1.3.1 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f01fd31a0bdd3ab4c9e7ea1f60019c63f1bab406
4
- data.tar.gz: 8e2166fe6324a179fa700c8754df55e94432f511
2
+ SHA256:
3
+ metadata.gz: 23a2c45f1e25e4266196f0e2fc23a4384cb8513be840d2b676ae848b5be1d121
4
+ data.tar.gz: 8fdb1090f9037ed6c732469ffda28023e200d758533223d4bd9c85b5a20cfb72
5
5
  SHA512:
6
- metadata.gz: 14fc0204ff18a3d6c7dd99d3e56d7c1f7f533ed249a4e62a8bc7bbfdcfc5bcd23854de446e200a60c0cc71c208f81a318e8191fed5de7ad679ef735fe9663f0a
7
- data.tar.gz: 5d2ead12b0f658e540285c62a88b4e062f1c646385bf4488e6a22813a52b39e795a61ab0aeb9524db89a7e8672ab1e4796259433c9572f9fc881387761fad412
6
+ metadata.gz: c3d98f05ba0b9ea222d1b852f87f30584ba4b775d7b6848a2366341e5e85bb6c9912bc1f8441117d129db4d63506d54dcd8ef4d633a5140359e25f5a829a8a1c
7
+ data.tar.gz: 45eb7d5c8a30f0814e9c775924690825ad3b3ee9c3ada3c9694bf3af46499ababaa1ba81f696514e08dc09aa5ae6520094820fc528ee34fbb307b856dc16b3f4
@@ -0,0 +1,47 @@
1
+ name: Integration Tests
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ build:
7
+
8
+ runs-on: ubuntu-latest
9
+ strategy:
10
+ matrix:
11
+ test-branch: [rails5, rails6, rails7]
12
+ steps:
13
+ - name: Checkout
14
+ uses: actions/checkout@v2
15
+ - name: Checkout test app
16
+ uses: actions/checkout@v2
17
+ with:
18
+ repository: jamesmartin/inline_svg_test_app
19
+ ref: ${{ matrix.test-branch }}
20
+ path: test_app
21
+ - name: Set up Ruby 2.7
22
+ uses: actions/setup-ruby@v1
23
+ with:
24
+ ruby-version: 2.7.x
25
+ - name: Build local gem
26
+ run: |
27
+ gem install bundler
28
+ bundle install --jobs 4 --retry 3
29
+ bundle exec rake build
30
+ - name: Use the local gem in the test App
31
+ id: uselocalgem
32
+ uses: jacobtomlinson/gha-find-replace@0.1.1
33
+ with:
34
+ find: "gem 'inline_svg'"
35
+ replace: "gem 'inline_svg', path: '${{github.workspace}}'"
36
+ - name: Check local gem in use
37
+ run: |
38
+ test "${{ steps.uselocalgem.outputs.modifiedFiles }}" != "0"
39
+ grep "inline_svg" $GITHUB_WORKSPACE/test_app/Gemfile
40
+ - name: Bundle
41
+ run: |
42
+ cd $GITHUB_WORKSPACE/test_app
43
+ bundle install --jobs 4 --retry 3
44
+ - name: Test
45
+ run: |
46
+ cd $GITHUB_WORKSPACE/test_app
47
+ bundle exec rake test
@@ -0,0 +1,58 @@
1
+ name: Rails 6 Webpacker Integration Tests (unreliable)
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ build:
7
+
8
+ runs-on: ubuntu-latest
9
+ strategy:
10
+ matrix:
11
+ test-branch: [rails6-webpacker]
12
+ steps:
13
+ - name: Checkout
14
+ uses: actions/checkout@v2
15
+ - name: Checkout test app
16
+ uses: actions/checkout@v2
17
+ with:
18
+ repository: jamesmartin/inline_svg_test_app
19
+ ref: ${{ matrix.test-branch }}
20
+ path: test_app
21
+ - name: Set up Ruby 2.7
22
+ uses: actions/setup-ruby@v1
23
+ with:
24
+ ruby-version: 2.7.x
25
+ - name: Build local gem
26
+ run: |
27
+ gem install bundler
28
+ bundle install --jobs 4 --retry 3
29
+ bundle exec rake build
30
+ - name: Use the local gem in the test App
31
+ id: uselocalgem
32
+ uses: jacobtomlinson/gha-find-replace@0.1.1
33
+ with:
34
+ find: "gem 'inline_svg'"
35
+ replace: "gem 'inline_svg', path: '${{github.workspace}}'"
36
+ - name: Check local gem in use
37
+ run: |
38
+ test "${{ steps.uselocalgem.outputs.modifiedFiles }}" != "0"
39
+ grep "inline_svg" $GITHUB_WORKSPACE/test_app/Gemfile
40
+ - name: Bundle
41
+ run: |
42
+ cd $GITHUB_WORKSPACE/test_app
43
+ bundle install --jobs 4 --retry 3
44
+ - name: Set up Node.js 16.x
45
+ uses: actions/setup-node@v2
46
+ with:
47
+ node-version: 16
48
+ if: matrix.test-branch == 'rails6-webpacker'
49
+ - name: Generate Webpacker config
50
+ run: |
51
+ cd $GITHUB_WORKSPACE/test_app
52
+ yarn install --check-files
53
+ bundle exec rake webpacker:compile
54
+ if: matrix.test-branch == 'rails6-webpacker'
55
+ - name: Test
56
+ run: |
57
+ cd $GITHUB_WORKSPACE/test_app
58
+ bundle exec rake test
@@ -0,0 +1,20 @@
1
+ name: Ruby
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ build:
7
+
8
+ runs-on: ubuntu-latest
9
+
10
+ steps:
11
+ - uses: actions/checkout@v2
12
+ - name: Set up Ruby 2.6
13
+ uses: actions/setup-ruby@v1
14
+ with:
15
+ ruby-version: 2.6.x
16
+ - name: Build and test with Rake
17
+ run: |
18
+ gem install bundler
19
+ bundle install --jobs 4 --retry 3
20
+ bundle exec rake
data/CHANGELOG.md CHANGED
@@ -3,7 +3,62 @@ All notable changes to this project will be documented in this file.
3
3
  This project adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
5
  ## [Unreleased][unreleased]
6
- - Nothing
6
+
7
+ Nothing.
8
+
9
+ ## [1.8.0] - 2022-01-09
10
+ ### Added
11
+ - Remove deprecation warning for `inline_svg`, as we intend to keep it in 2.0. [#131](https://github.com/jamesmartin/inline_svg/pull/131). Thanks [@DanielJackson-Oslo](https://github.com/DanielJackson-Oslo)
12
+ - Add support for Webpacker 6 beta. [#129](https://github.com/jamesmartin/inline_svg/pull/129). Thanks [@Intrepidd](https://github.com/Intrepidd) and [@tessi](https://github.com/tessi)
13
+ - Add support for Propshaft assets in Rails 7. [#134](https://github.com/jamesmartin/inline_svg/pull/134). Thanks, [@martinzamuner](https://github.com/martinzamuner)
14
+
15
+ ## [1.7.2] - 2020-12-07
16
+ ### Fixed
17
+ - Improve performance of `CachedAssetFile`. [#118](https://github.com/jamesmartin/inline_svg/pull/118). Thanks [@stevendaniels](https://github.com/stevendaniels)
18
+ - Avoid XSS by preventing malicious input of filenames. [#117](https://github.com/jamesmartin/inline_svg/pull/117). Thanks [@pbyrne](https://github.com/pbyrne).
19
+
20
+ ## [1.7.1] - 2020-03-17
21
+ ### Fixed
22
+ - Static Asset Finder uses pathname for compatibility with Sprockets 4+. [#106](https://github.com/jamesmartin/inline_svg/pull/106). Thanks [@subdigital](https://github.com/subdigital)
23
+
24
+ ## [1.7.0] - 2020-02-13
25
+ ### Added
26
+ - WebpackAssetFinder serves files from dev server if one is running. [#111](https://github.com/jamesmartin/inline_svg/pull/111). Thanks, [@connorshea](https://github.com/connorshea)
27
+
28
+ ### Fixed
29
+ - Using Webpacker and Asset Pipeline in a single App could result in SVGs not being found because the wrong `AssetFinder` was used. [#114](https://github.com/jamesmartin/inline_svg/pull/114). Thanks, [@kylefox](https://github.com/kylefox)
30
+ - Prevent "EOFError error" when using webpack dev server over HTTPS [#113](https://github.com/jamesmartin/inline_svg/pull/113). Thanks, [@kylefox](https://github.com/kylefox)
31
+
32
+ ## [1.6.0] - 2019-11-13
33
+ ### Added
34
+ - Support Webpack via the new `inline_svg_pack_tag` helper and deprecate `inline_svg` helper in preparation for v2.0.
35
+ [#103](https://github.com/jamesmartin/inline_svg/pull/103)
36
+ Thanks, [@kylefox](https://github.com/kylefox)
37
+
38
+ ## [1.5.2] - 2019-06-20
39
+ ### Fixed
40
+ - Revert automatic Webpack asset finder behavior. Make Webpack "opt-in".
41
+ [#98](https://github.com/jamesmartin/inline_svg/issues/98)
42
+
43
+ ## [1.5.1] - 2019-06-18
44
+ ### Fixed
45
+ - Prevent nil asset finder when neither Sprockets or Webpacker are available
46
+ [#97](https://github.com/jamesmartin/inline_svg/issues/97)
47
+
48
+ ## [1.5.0] - 2019-06-17
49
+ ### Added
50
+ - Support for finding assets bundled by Webpacker
51
+ [#96](https://github.com/jamesmartin/inline_svg/pull/96)
52
+
53
+ ## [1.4.0] - 2019-04-19
54
+ ### Fixed
55
+ - Prevent invalid XML names being generated via IdGenerator
56
+ [#87](https://github.com/jamesmartin/inline_svg/issues/87)
57
+ Thanks, [@endorfin](https://github.com/endorfin)
58
+
59
+ ### Added
60
+ - Raise error on file not found (if configured)
61
+ [#93](https://github.com/jamesmartin/inline_svg/issues/93)
7
62
 
8
63
  ## [1.3.1] - 2017-12-14
9
64
  ### Fixed
@@ -189,7 +244,16 @@ transformations](https://github.com/jamesmartin/inline_svg/blob/master/README.md
189
244
  ### Added
190
245
  - Basic Railtie and view helper to inline SVG documents to Rails views.
191
246
 
192
- [unreleased]: https://github.com/jamesmartin/inline_svg/compare/v1.3.1...HEAD
247
+ [unreleased]: https://github.com/jamesmartin/inline_svg/compare/v1.8.0...HEAD
248
+ [1.8.0]: https://github.com/jamesmartin/inline_svg/compare/v1.7.2...v1.8.0
249
+ [1.7.2]: https://github.com/jamesmartin/inline_svg/compare/v1.7.1...v1.7.2
250
+ [1.7.1]: https://github.com/jamesmartin/inline_svg/compare/v1.7.0...v1.7.1
251
+ [1.7.0]: https://github.com/jamesmartin/inline_svg/compare/v1.6.0...v1.7.0
252
+ [1.6.0]: https://github.com/jamesmartin/inline_svg/compare/v1.5.2...v1.6.0
253
+ [1.5.2]: https://github.com/jamesmartin/inline_svg/compare/v1.5.1...v1.5.2
254
+ [1.5.1]: https://github.com/jamesmartin/inline_svg/compare/v1.5.0...v1.5.1
255
+ [1.5.0]: https://github.com/jamesmartin/inline_svg/compare/v1.4.0...v1.5.0
256
+ [1.4.0]: https://github.com/jamesmartin/inline_svg/compare/v1.3.1...v1.4.0
193
257
  [1.3.1]: https://github.com/jamesmartin/inline_svg/compare/v1.3.0...v1.3.1
194
258
  [1.3.0]: https://github.com/jamesmartin/inline_svg/compare/v1.2.3...v1.3.0
195
259
  [1.2.3]: https://github.com/jamesmartin/inline_svg/compare/v1.2.2...v1.2.3
data/README.md CHANGED
@@ -1,15 +1,22 @@
1
1
  # Inline SVG
2
2
 
3
- [![Build Status](https://travis-ci.org/jamesmartin/inline_svg.svg?branch=master)](https://travis-ci.org/jamesmartin/inline_svg)
3
+ ![Unit tests](https://github.com/jamesmartin/inline_svg/workflows/Ruby/badge.svg)
4
+ ![Integration Tests](https://github.com/jamesmartin/inline_svg/workflows/Integration%20Tests/badge.svg)
4
5
 
5
6
  Styling a SVG document with CSS for use on the web is most reliably achieved by
6
7
  [adding classes to the document and
7
8
  embedding](http://css-tricks.com/using-svg/) it inline in the HTML.
8
9
 
9
- This gem adds a Rails helper method (`inline_svg`) that reads an SVG document (via Sprockets, so works with the Rails Asset Pipeline), applies a CSS class attribute to the root of the document and
10
+ This gem adds Rails helper methods (`inline_svg_tag` and `inline_svg_pack_tag`) that read an SVG document (via Sprockets or Webpacker, so works with the Rails Asset Pipeline), applies a CSS class attribute to the root of the document and
10
11
  then embeds it into a view.
11
12
 
12
- Inline SVG supports [Rails 3](http://weblog.rubyonrails.org/2010/8/29/rails-3-0-it-s-done/) (from [v0.12.0](https://github.com/jamesmartin/inline_svg/releases/tag/v0.12.0)), [Rails 4](http://weblog.rubyonrails.org/2013/6/25/Rails-4-0-final/) and [Rails 5](http://weblog.rubyonrails.org/2016/6/30/Rails-5-0-final/) (from [v0.10.0](https://github.com/jamesmartin/inline_svg/releases/tag/v0.10.0)).
13
+ Inline SVG supports:
14
+
15
+ - [Rails 5](http://weblog.rubyonrails.org/2016/6/30/Rails-5-0-final/) (from [v0.10.0](https://github.com/jamesmartin/inline_svg/releases/tag/v0.10.0))
16
+ - [Rails 6](https://weblog.rubyonrails.org/2019/4/24/Rails-6-0-rc1-released/) with Sprockets or Webpacker (from [v1.5.2](https://github.com/jamesmartin/inline_svg/releases/tag/v1.5.2)).
17
+ - [Rails 7](https://weblog.rubyonrails.org/2021/12/6/Rails-7-0-rc-1-released/) (experimental)
18
+
19
+ Inline SVG no longer officially supports Rails 3 or Rails 4 (although they may still work). In order to reduce the maintenance cost of this project we now follow the [Rails Maintenance Policy](https://guides.rubyonrails.org/maintenance_policy.html).
13
20
 
14
21
  ## Changelog
15
22
 
@@ -32,9 +39,15 @@ Or install it yourself as:
32
39
 
33
40
  ## Usage
34
41
 
42
+ ```ruby
43
+ # Sprockets
44
+ inline_svg_tag(file_name, options={})
45
+
46
+ # Webpacker
47
+ inline_svg_pack_tag(file_name, options={})
35
48
  ```
36
- inline_svg(file_name, options={})
37
- ```
49
+
50
+ _**Note:** The remainder of this README uses `inline_svg_tag` for examples, but the exact same principles work for `inline_svg_pack_tag`._
38
51
 
39
52
  The `file_name` can be a full path to a file, the file's basename or an `IO`
40
53
  object. The
@@ -52,7 +65,7 @@ Here's an example of embedding an SVG document and applying a 'class' attribute:
52
65
  <body>
53
66
  <h1>Embedded SVG Documents</h1>
54
67
  <div>
55
- <%= inline_svg "some-document.svg", class: 'some-class' %>
68
+ <%= inline_svg_tag "some-document.svg", class: 'some-class' %>
56
69
  </div>
57
70
  </body>
58
71
  </html>
@@ -86,11 +99,12 @@ key | description
86
99
  `preserve_aspect_ratio` | adds a `preserveAspectRatio` attribute to the SVG
87
100
  `aria` | adds common accessibility attributes to the SVG (see [PR #34](https://github.com/jamesmartin/inline_svg/pull/34#issue-152062674) for details)
88
101
  `aria_hidden` | adds the `aria-hidden=true` attribute to the SVG
102
+ `fallback` | set fallback SVG document
89
103
 
90
104
  Example:
91
105
 
92
106
  ```ruby
93
- inline_svg(
107
+ inline_svg_tag(
94
108
  "some-document.svg",
95
109
  id: 'some-id',
96
110
  class: 'some-class',
@@ -101,13 +115,14 @@ inline_svg(
101
115
  nocomment: true,
102
116
  preserve_aspect_ratio: 'xMaxYMax meet',
103
117
  aria: true,
104
- aria_hidden: true
118
+ aria_hidden: true,
119
+ fallback: 'fallback-document.svg'
105
120
  )
106
121
  ```
107
122
 
108
123
  ## Accessibility
109
124
 
110
- Use the `aria: true` option to make `inline_svg` add the following
125
+ Use the `aria: true` option to make `inline_svg_tag` add the following
111
126
  accessibility (a11y) attributes to your embedded SVG:
112
127
 
113
128
  * Adds a `role="img"` attribute to the root SVG element
@@ -118,7 +133,7 @@ Here's an example:
118
133
 
119
134
  ```erb
120
135
  <%=
121
- inline_svg('iconmonstr-glasses-12-icon.svg',
136
+ inline_svg_tag('iconmonstr-glasses-12-icon.svg',
122
137
  aria: true, title: 'An SVG',
123
138
  desc: 'This is my SVG. There are many like it. You get the picture')
124
139
  %>
@@ -132,11 +147,11 @@ Here's an example:
132
147
  </svg>
133
148
  ```
134
149
 
135
- ***Note:*** The title and desc `id` attributes generated for, and referenced by, `aria-labelled-by` are one-way digests based on the value of the title and desc elements and an optional "salt" value using the SHA1 algorithm. This reduces the chance of `inline_svg` embedding elements inside the SVG with `id` attributes that clash with other elements elsewhere on the page.
150
+ ***Note:*** The title and desc `id` attributes generated for, and referenced by, `aria-labelled-by` are one-way digests based on the value of the title and desc elements and an optional "salt" value using the SHA1 algorithm. This reduces the chance of `inline_svg_tag` embedding elements inside the SVG with `id` attributes that clash with other elements elsewhere on the page.
136
151
 
137
152
  ## Custom Transformations
138
153
 
139
- The transformation behavior of `inline_svg` can be customized by creating custom transformation classes.
154
+ The transformation behavior of `inline_svg_tag` can be customized by creating custom transformation classes.
140
155
 
141
156
  For example, inherit from `InlineSvg::CustomTransformation` and implement the `#transform` method:
142
157
 
@@ -165,7 +180,7 @@ end
165
180
  The custom transformation can then be called like so:
166
181
  ```haml
167
182
  %div
168
- = inline_svg "some-document.svg", my_custom_attribute: 'some value'
183
+ = inline_svg_tag "some-document.svg", my_custom_attribute: 'some value'
169
184
  ```
170
185
 
171
186
  In this example, the following transformation would be applied to a SVG document:
@@ -186,8 +201,8 @@ end
186
201
  The custom transformation will be triggered even if you don't pass any attribute value
187
202
  ```haml
188
203
  %div
189
- = inline_svg "some-document.svg"
190
- = inline_svg "some-document.svg", my_custom_attribute: 'some value'
204
+ = inline_svg_tag "some-document.svg"
205
+ = inline_svg_tag "some-document.svg", my_custom_attribute: 'some value'
191
206
  ```
192
207
 
193
208
  In this example, the following transformation would be applied to a SVG document:
@@ -267,7 +282,7 @@ end
267
282
 
268
283
  **Note:** Paths are read recursively, so think about keeping your SVG assets
269
284
  restricted to as few paths as possible, and using the filter option to further
270
- restrict assets to only those likely to be used by `inline_svg`.
285
+ restrict assets to only those likely to be used by `inline_svg_tag`.
271
286
 
272
287
  ## Missing SVG Files
273
288
 
@@ -294,6 +309,15 @@ Which would instead render:
294
309
  <svg class='svg-not-found'><!-- SVG file not found: 'some-missing-file.svg' --></svg>
295
310
  ```
296
311
 
312
+ Alternatively, `inline_svg_tag` can be configured to raise an exception when a file
313
+ is not found:
314
+
315
+ ```ruby
316
+ InlineSvg.configure do |config|
317
+ config.raise_on_file_not_found = true
318
+ end
319
+ ```
320
+
297
321
  ## Contributing
298
322
 
299
323
  1. Fork it ( [http://github.com/jamesmartin/inline_svg/fork](http://github.com/jamesmartin/inline_svg/fork) )
data/inline_svg.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.5"
21
+ spec.add_development_dependency "bundler", "~> 2.0"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec", "~> 3.2"
24
24
  spec.add_development_dependency "rspec_junit_formatter", "0.2.2"
@@ -4,10 +4,38 @@ require 'action_view/context' if defined?(Rails)
4
4
  module InlineSvg
5
5
  module ActionView
6
6
  module Helpers
7
+ def inline_svg_tag(filename, transform_params={})
8
+ with_asset_finder(InlineSvg.configuration.asset_finder) do
9
+ render_inline_svg(filename, transform_params)
10
+ end
11
+ end
12
+
13
+ def inline_svg_pack_tag(filename, transform_params={})
14
+ with_asset_finder(InlineSvg::WebpackAssetFinder) do
15
+ render_inline_svg(filename, transform_params)
16
+ end
17
+ end
18
+
7
19
  def inline_svg(filename, transform_params={})
20
+ render_inline_svg(filename, transform_params)
21
+ end
22
+
23
+ private
24
+
25
+ def backwards_compatible_html_escape(filename)
26
+ # html_escape_once was introduced in newer versions of Rails.
27
+ if ERB::Util.respond_to?(:html_escape_once)
28
+ ERB::Util.html_escape_once(filename)
29
+ else
30
+ ERB::Util.html_escape(filename)
31
+ end
32
+ end
33
+
34
+ def render_inline_svg(filename, transform_params={})
8
35
  begin
9
36
  svg_file = read_svg(filename)
10
- rescue InlineSvg::AssetFile::FileNotFound
37
+ rescue InlineSvg::AssetFile::FileNotFound => error
38
+ raise error if InlineSvg.configuration.raise_on_file_not_found?
11
39
  return placeholder(filename) unless transform_params[:fallback].present?
12
40
 
13
41
  if transform_params[:fallback].present?
@@ -22,8 +50,6 @@ module InlineSvg
22
50
  InlineSvg::TransformPipeline.generate_html_from(svg_file, transform_params).html_safe
23
51
  end
24
52
 
25
- private
26
-
27
53
  def read_svg(filename)
28
54
  if InlineSvg::IOResource === filename
29
55
  InlineSvg::IOResource.read filename
@@ -34,7 +60,7 @@ module InlineSvg
34
60
 
35
61
  def placeholder(filename)
36
62
  css_class = InlineSvg.configuration.svg_not_found_css_class
37
- not_found_message = "'#{filename}' #{extension_hint(filename)}"
63
+ not_found_message = "'#{backwards_compatible_html_escape(filename)}' #{extension_hint(filename)}"
38
64
 
39
65
  if css_class.nil?
40
66
  return "<svg><!-- SVG file not found: #{not_found_message}--></svg>".html_safe
@@ -47,6 +73,14 @@ module InlineSvg
47
73
  InlineSvg.configuration.asset_file
48
74
  end
49
75
 
76
+ def with_asset_finder(asset_finder)
77
+ Thread.current[:inline_svg_asset_finder] = asset_finder
78
+ output = yield
79
+ Thread.current[:inline_svg_asset_finder] = nil
80
+
81
+ output
82
+ end
83
+
50
84
  def extension_hint(filename)
51
85
  filename.ends_with?(".svg") ? "" : "(Try adding .svg to your filename) "
52
86
  end
@@ -18,6 +18,7 @@ module InlineSvg
18
18
  @paths = Array(paths).compact.map { |p| Pathname.new(p) }
19
19
  @filters = Array(filters).map { |f| Regexp.new(f) }
20
20
  @assets = @paths.reduce({}) { |assets, p| assets.merge(read_assets(assets, p)) }
21
+ @sorted_asset_keys = assets.keys.sort { |a, b| a.size <=> b.size }
21
22
  end
22
23
 
23
24
  # Public: Finds the named asset and returns the contents as a string.
@@ -39,17 +40,7 @@ module InlineSvg
39
40
  # Returns a String representing the key for the named asset or nil if there
40
41
  # is no match.
41
42
  def key_for_asset(asset_name)
42
- match = all_keys_matching(asset_name).sort do |a, b|
43
- a.string.size <=> b.string.size
44
- end.first
45
- match && match.string
46
- end
47
-
48
- # Internal: Find all potential asset keys matching the given asset name.
49
- #
50
- # Returns an array of MatchData objects for keys matching the asset name.
51
- def all_keys_matching(asset_name)
52
- assets.keys.map { |k| /(#{asset_name})/.match(k.to_s) }.compact
43
+ @sorted_asset_keys.find { |k| k.include?(asset_name) }
53
44
  end
54
45
 
55
46
  # Internal: Recursively descends through current_paths reading each file it
@@ -6,7 +6,7 @@ module InlineSvg
6
6
  end
7
7
 
8
8
  def self.configured_asset_finder
9
- InlineSvg.configuration.asset_finder
9
+ Thread.current[:inline_svg_asset_finder] || InlineSvg.configuration.asset_finder
10
10
  end
11
11
  end
12
12
  end
@@ -1,3 +1,5 @@
1
+ require 'digest'
2
+
1
3
  module InlineSvg
2
4
  class IdGenerator
3
5
  class Randomness
@@ -9,7 +11,7 @@ module InlineSvg
9
11
 
10
12
  def self.generate(base, salt, randomness: Randomness)
11
13
  bytes = Digest::SHA1.digest("#{base}-#{salt}-#{randomness.call}")
12
- Digest.hexencode(bytes).to_i(16).to_s(36)
14
+ 'a' + Digest.hexencode(bytes).to_i(16).to_s(36)
13
15
  end
14
16
  end
15
17
  end
@@ -0,0 +1,15 @@
1
+ module InlineSvg
2
+ class PropshaftAssetFinder
3
+ def self.find_asset(filename)
4
+ new(filename)
5
+ end
6
+
7
+ def initialize(filename)
8
+ @filename = filename
9
+ end
10
+
11
+ def pathname
12
+ ::Rails.application.assets.load_path.find(@filename).path
13
+ end
14
+ end
15
+ end
@@ -10,11 +10,12 @@ module InlineSvg
10
10
 
11
11
  config.after_initialize do |app|
12
12
  InlineSvg.configure do |config|
13
- # In default Rails apps, this will be a fully operational
14
- # Sprockets::Environment instance
13
+ # Configure the asset_finder:
15
14
  # Only set this when a user-configured asset finder has not been
16
15
  # configured already.
17
16
  if config.asset_finder.nil?
17
+ # In default Rails apps, this will be a fully operational
18
+ # Sprockets::Environment instance
18
19
  config.asset_finder = app.instance_variable_get(:@assets)
19
20
  end
20
21
  end
@@ -1,7 +1,9 @@
1
+ require "pathname"
2
+
1
3
  # Naive fallback asset finder for when sprockets >= 3.0 &&
2
4
  # config.assets.precompile = false
3
5
  # Thanks to @ryanswood for the original code:
4
- # https://github.com/AbleHealth/inline_svg/commit/661bbb3bef7d1b4bd6ccd63f5f018305797b9509
6
+ # https://github.com/jamesmartin/inline_svg/commit/661bbb3bef7d1b4bd6ccd63f5f018305797b9509
5
7
  module InlineSvg
6
8
  class StaticAssetFinder
7
9
  def self.find_asset(filename)
@@ -14,7 +16,7 @@ module InlineSvg
14
16
 
15
17
  def pathname
16
18
  if ::Rails.application.config.assets.compile
17
- ::Rails.application.assets[@filename].pathname
19
+ Pathname.new(::Rails.application.assets[@filename].filename)
18
20
  else
19
21
  manifest = ::Rails.application.assets_manifest
20
22
  asset_path = manifest.assets[@filename]
@@ -40,8 +40,11 @@ module InlineSvg::TransformPipeline::Transformations
40
40
  end
41
41
 
42
42
  def self.lookup(transform_params)
43
+ return [] unless transform_params.any? || custom_transformations.any?
44
+
45
+ transform_params_with_defaults = params_with_defaults(transform_params)
43
46
  all_transformations.map { |name, definition|
44
- value = params_with_defaults(transform_params)[name]
47
+ value = transform_params_with_defaults[name]
45
48
  definition.fetch(:transform, no_transform).create_with_value(value) if value
46
49
  }.compact
47
50
  end
@@ -1,3 +1,3 @@
1
1
  module InlineSvg
2
- VERSION = "1.3.1"
2
+ VERSION = "1.8.0"
3
3
  end
@@ -0,0 +1,50 @@
1
+ module InlineSvg
2
+ class WebpackAssetFinder
3
+ def self.find_asset(filename)
4
+ new(filename)
5
+ end
6
+
7
+ def initialize(filename)
8
+ @filename = filename
9
+ @asset_path = URI(Webpacker.manifest.lookup(@filename)).path
10
+ end
11
+
12
+ def pathname
13
+ return if @asset_path.blank?
14
+
15
+ if Webpacker.dev_server.running?
16
+ dev_server_asset(@asset_path)
17
+ elsif Webpacker.config.public_path.present?
18
+ File.join(Webpacker.config.public_path, @asset_path)
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def dev_server_asset(file_path)
25
+ asset = fetch_from_dev_server(file_path)
26
+
27
+ begin
28
+ Tempfile.new(file_path).tap do |file|
29
+ file.binmode
30
+ file.write(asset)
31
+ file.rewind
32
+ end
33
+ rescue StandardError => e
34
+ Rails.logger.error "[inline_svg] Error creating tempfile for #{@filename}: #{e}"
35
+ raise
36
+ end
37
+ end
38
+
39
+ def fetch_from_dev_server(file_path)
40
+ http = Net::HTTP.new(Webpacker.dev_server.host, Webpacker.dev_server.port)
41
+ http.use_ssl = Webpacker.dev_server.https?
42
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
43
+
44
+ http.request(Net::HTTP::Get.new(file_path)).body
45
+ rescue StandardError => e
46
+ Rails.logger.error "[inline_svg] Error fetching #{@filename} from webpack-dev-server: #{e}"
47
+ raise
48
+ end
49
+ end
50
+ end
data/lib/inline_svg.rb CHANGED
@@ -3,7 +3,9 @@ require "inline_svg/action_view/helpers"
3
3
  require "inline_svg/asset_file"
4
4
  require "inline_svg/cached_asset_file"
5
5
  require "inline_svg/finds_asset_paths"
6
+ require "inline_svg/propshaft_asset_finder"
6
7
  require "inline_svg/static_asset_finder"
8
+ require "inline_svg/webpack_asset_finder"
7
9
  require "inline_svg/transform_pipeline"
8
10
  require "inline_svg/io_resource"
9
11
 
@@ -21,6 +23,7 @@ module InlineSvg
21
23
  @custom_transformations = {}
22
24
  @asset_file = InlineSvg::AssetFile
23
25
  @svg_not_found_css_class = nil
26
+ @raise_on_file_not_found = false
24
27
  end
25
28
 
26
29
  def asset_file=(custom_asset_file)
@@ -39,6 +42,8 @@ module InlineSvg
39
42
  def asset_finder=(finder)
40
43
  @asset_finder = if finder.respond_to?(:find_asset)
41
44
  finder
45
+ elsif finder.class.name == "Propshaft::Assembly"
46
+ InlineSvg::PropshaftAssetFinder
42
47
  else
43
48
  # fallback to a naive static asset finder
44
49
  # (sprokects >= 3.0 && config.assets.precompile = false
@@ -61,6 +66,14 @@ module InlineSvg
61
66
  @custom_transformations.merge!(Hash[ *[options.fetch(:attribute, :no_attribute), options] ])
62
67
  end
63
68
 
69
+ def raise_on_file_not_found=(value)
70
+ @raise_on_file_not_found = value
71
+ end
72
+
73
+ def raise_on_file_not_found?
74
+ !!@raise_on_file_not_found
75
+ end
76
+
64
77
  private
65
78
 
66
79
  def incompatible_transformation?(klass)
@@ -45,4 +45,49 @@ describe InlineSvg::FindsAssetPaths do
45
45
  expect(InlineSvg::FindsAssetPaths.by_filename('some-file')).to be_nil
46
46
  end
47
47
  end
48
+
49
+ context "when propshaft finder returns an object which supports only the pathname method" do
50
+ it "returns fully qualified file paths from Propshaft" do
51
+ propshaft = double('PropshaftDouble')
52
+
53
+ expect(propshaft).to receive(:find_asset).with('some-file').
54
+ and_return(double(pathname: Pathname('/full/path/to/some-file')))
55
+
56
+ InlineSvg.configure do |config|
57
+ config.asset_finder = propshaft
58
+ end
59
+
60
+ expect(InlineSvg::FindsAssetPaths.by_filename('some-file')).to eq Pathname('/full/path/to/some-file')
61
+ end
62
+ end
63
+
64
+ context "when webpack finder returns an object with a relative asset path" do
65
+ it "returns the fully qualified file path" do
66
+ webpacker = double('WebpackerDouble')
67
+
68
+ expect(webpacker).to receive(:find_asset).with('some-file').
69
+ and_return(double(filename: Pathname('/full/path/to/some-file')))
70
+
71
+ InlineSvg.configure do |config|
72
+ config.asset_finder = webpacker
73
+ end
74
+
75
+ expect(InlineSvg::FindsAssetPaths.by_filename('some-file')).to eq Pathname('/full/path/to/some-file')
76
+ end
77
+ end
78
+
79
+ context "when webpack finder returns an object with an absolute http asset path" do
80
+ it "returns the fully qualified file path" do
81
+ webpacker = double('WebpackerDouble')
82
+
83
+ expect(webpacker).to receive(:find_asset).with('some-file').
84
+ and_return(double(filename: Pathname('https://my-fancy-domain.test/full/path/to/some-file')))
85
+
86
+ InlineSvg.configure do |config|
87
+ config.asset_finder = webpacker
88
+ end
89
+
90
+ expect(InlineSvg::FindsAssetPaths.by_filename('some-file')).to eq Pathname('https://my-fancy-domain.test/full/path/to/some-file')
91
+ end
92
+ end
48
93
  end
@@ -13,29 +13,56 @@ describe InlineSvg::ActionView::Helpers do
13
13
 
14
14
  let(:helper) { ( Class.new { include InlineSvg::ActionView::Helpers } ).new }
15
15
 
16
- describe "#inline_svg" do
16
+ shared_examples "inline_svg helper" do |helper_method:|
17
17
 
18
18
  context "when passed the name of an SVG that does not exist" do
19
19
  after(:each) do
20
20
  InlineSvg.reset_configuration!
21
21
  end
22
22
 
23
+ context "and configured to raise" do
24
+ it "raises an exception" do
25
+ InlineSvg.configure do |config|
26
+ config.raise_on_file_not_found = true
27
+ end
28
+
29
+ allow(InlineSvg::AssetFile).to receive(:named).
30
+ with('some-missing-file.svg').
31
+ and_raise(InlineSvg::AssetFile::FileNotFound.new)
32
+
33
+ expect {
34
+ helper.send(helper_method, 'some-missing-file.svg')
35
+ }.to raise_error(InlineSvg::AssetFile::FileNotFound)
36
+ end
37
+ end
38
+
23
39
  it "returns an empty, html safe, SVG document as a placeholder" do
24
40
  allow(InlineSvg::AssetFile).to receive(:named).
25
41
  with('some-missing-file.svg').
26
42
  and_raise(InlineSvg::AssetFile::FileNotFound.new)
27
43
 
28
- output = helper.inline_svg('some-missing-file.svg')
44
+ output = helper.send(helper_method, 'some-missing-file.svg')
29
45
  expect(output).to eq "<svg><!-- SVG file not found: 'some-missing-file.svg' --></svg>"
30
46
  expect(output).to be_html_safe
31
47
  end
32
48
 
49
+ it "escapes malicious input" do
50
+ malicious = "--></svg><script>alert(1)</script><svg>.svg"
51
+ allow(InlineSvg::AssetFile).to receive(:named).
52
+ with(malicious).
53
+ and_raise(InlineSvg::AssetFile::FileNotFound.new)
54
+
55
+ output = helper.send(helper_method, malicious)
56
+ expect(output).to eq "<svg><!-- SVG file not found: '--&gt;&lt;/svg&gt;&lt;script&gt;alert(1)&lt;/script&gt;&lt;svg&gt;.svg' --></svg>"
57
+ expect(output).to be_html_safe
58
+ end
59
+
33
60
  it "gives a helpful hint when no .svg extension is provided in the filename" do
34
61
  allow(InlineSvg::AssetFile).to receive(:named).
35
62
  with('missing-file-with-no-extension').
36
63
  and_raise(InlineSvg::AssetFile::FileNotFound.new)
37
64
 
38
- output = helper.inline_svg('missing-file-with-no-extension')
65
+ output = helper.send(helper_method, 'missing-file-with-no-extension')
39
66
  expect(output).to eq "<svg><!-- SVG file not found: 'missing-file-with-no-extension' (Try adding .svg to your filename) --></svg>"
40
67
  end
41
68
 
@@ -48,7 +75,7 @@ describe InlineSvg::ActionView::Helpers do
48
75
  with('some-other-missing-file.svg').
49
76
  and_raise(InlineSvg::AssetFile::FileNotFound.new)
50
77
 
51
- output = helper.inline_svg('some-other-missing-file.svg')
78
+ output = helper.send(helper_method, 'some-other-missing-file.svg')
52
79
  expect(output).to eq "<svg class='missing-svg'><!-- SVG file not found: 'some-other-missing-file.svg' --></svg>"
53
80
  expect(output).to be_html_safe
54
81
  end
@@ -63,7 +90,7 @@ describe InlineSvg::ActionView::Helpers do
63
90
  <svg xmlns="http://www.w3.org/2000/svg" xml:lang="en"><!-- This is a comment --></svg>
64
91
  SVG
65
92
  allow(InlineSvg::AssetFile).to receive(:named).with('fallback.svg').and_return(fallback_file)
66
- expect(helper.inline_svg('missing.svg', fallback: 'fallback.svg')).to eq fallback_file
93
+ expect(helper.send(helper_method, 'missing.svg', fallback: 'fallback.svg')).to eq fallback_file
67
94
  end
68
95
  end
69
96
  end
@@ -76,7 +103,7 @@ SVG
76
103
  <svg xmlns="http://www.w3.org/2000/svg" xml:lang="en"><!-- This is a comment --></svg>
77
104
  SVG
78
105
  allow(InlineSvg::AssetFile).to receive(:named).with('some-file').and_return(example_file)
79
- expect(helper.inline_svg('some-file')).to eq example_file
106
+ expect(helper.send(helper_method, 'some-file')).to eq example_file
80
107
  end
81
108
  end
82
109
 
@@ -89,7 +116,7 @@ SVG
89
116
  <svg xmlns="http://www.w3.org/2000/svg" role="presentation" xml:lang="en"><title>A title</title></svg>
90
117
  SVG
91
118
  allow(InlineSvg::AssetFile).to receive(:named).with('some-file').and_return(input_svg)
92
- expect(helper.inline_svg('some-file', title: 'A title')).to eq expected_output
119
+ expect(helper.send(helper_method, 'some-file', title: 'A title')).to eq expected_output
93
120
  end
94
121
  end
95
122
 
@@ -102,7 +129,7 @@ SVG
102
129
  <svg xmlns="http://www.w3.org/2000/svg" role="presentation" xml:lang="en"><desc>A description</desc></svg>
103
130
  SVG
104
131
  allow(InlineSvg::AssetFile).to receive(:named).with('some-file').and_return(input_svg)
105
- expect(helper.inline_svg('some-file', desc: 'A description')).to eq expected_output
132
+ expect(helper.send(helper_method, 'some-file', desc: 'A description')).to eq expected_output
106
133
  end
107
134
  end
108
135
 
@@ -115,7 +142,7 @@ SVG
115
142
  <svg xmlns="http://www.w3.org/2000/svg" xml:lang="en"></svg>
116
143
  SVG
117
144
  allow(InlineSvg::AssetFile).to receive(:named).with('some-file').and_return(input_svg)
118
- expect(helper.inline_svg('some-file', nocomment: true)).to eq expected_output
145
+ expect(helper.send(helper_method, 'some-file', nocomment: true)).to eq expected_output
119
146
  end
120
147
  end
121
148
 
@@ -128,7 +155,7 @@ SVG
128
155
  <svg xmlns="http://www.w3.org/2000/svg" xml:lang="en" aria-hidden="true"></svg>
129
156
  SVG
130
157
  allow(InlineSvg::AssetFile).to receive(:named).with('some-file').and_return(input_svg)
131
- expect(helper.inline_svg('some-file', aria_hidden: true)).to eq expected_output
158
+ expect(helper.send(helper_method, 'some-file', aria_hidden: true)).to eq expected_output
132
159
  end
133
160
  end
134
161
 
@@ -141,7 +168,7 @@ SVG
141
168
  <svg xmlns="http://www.w3.org/2000/svg" xml:lang="en"><title>A title</title><desc>A description</desc></svg>
142
169
  SVG
143
170
  allow(InlineSvg::AssetFile).to receive(:named).with('some-file').and_return(input_svg)
144
- expect(helper.inline_svg('some-file', title: 'A title', desc: 'A description', nocomment: true)).to eq expected_output
171
+ expect(helper.send(helper_method, 'some-file', title: 'A title', desc: 'A description', nocomment: true)).to eq expected_output
145
172
  end
146
173
  end
147
174
 
@@ -164,7 +191,7 @@ SVG
164
191
  <svg custom="some value"></svg>
165
192
  SVG
166
193
  allow(InlineSvg::AssetFile).to receive(:named).with('some-file').and_return(input_svg)
167
- expect(helper.inline_svg('some-file', custom: 'some value')).to eq expected_output
194
+ expect(helper.send(helper_method, 'some-file', custom: 'some value')).to eq expected_output
168
195
  end
169
196
  end
170
197
 
@@ -185,7 +212,7 @@ SVG
185
212
 
186
213
  allow(InlineSvg::AssetFile).to receive(:named).with('some-file').and_return(input_svg)
187
214
 
188
- expect(helper.inline_svg('some-file')).to eq "<svg custom=\"default value\"></svg>\n"
215
+ expect(helper.send(helper_method, 'some-file')).to eq "<svg custom=\"default value\"></svg>\n"
189
216
  end
190
217
  end
191
218
 
@@ -195,7 +222,7 @@ SVG
195
222
 
196
223
  allow(InlineSvg::AssetFile).to receive(:named).with('some-file').and_return(input_svg)
197
224
 
198
- expect(helper.inline_svg('some-file', custom: 'some value')).to eq "<svg custom=\"some value\"></svg>\n"
225
+ expect(helper.send(helper_method, 'some-file', custom: 'some value')).to eq "<svg custom=\"some value\"></svg>\n"
199
226
  end
200
227
  end
201
228
  end
@@ -207,13 +234,13 @@ SVG
207
234
  expect(InlineSvg::IOResource).to receive(:===).with(argument).and_return(true)
208
235
  expect(InlineSvg::IOResource).to receive(:read).with(argument)
209
236
  expect(InlineSvg::AssetFile).to_not receive(:named)
210
- helper.inline_svg(argument)
237
+ helper.send(helper_method, argument)
211
238
  end
212
239
  it 'accept filename' do
213
240
  expect(InlineSvg::IOResource).to receive(:===).with(argument).and_return(false)
214
241
  expect(InlineSvg::IOResource).to_not receive(:read)
215
242
  expect(InlineSvg::AssetFile).to receive(:named).with(argument)
216
- helper.inline_svg(argument)
243
+ helper.send(helper_method, argument)
217
244
  end
218
245
  end
219
246
  context 'when passed IO object argument' do
@@ -223,17 +250,29 @@ SVG
223
250
  it 'return valid svg' do
224
251
  expect(InlineSvg::IOResource).to receive(:===).with(io_object).and_return(true)
225
252
  expect(InlineSvg::IOResource).to receive(:read).with(io_object).and_return("<svg><!-- Test IO --></svg>")
226
- output = helper.inline_svg(io_object)
253
+ output = helper.send(helper_method, io_object)
227
254
  expect(output).to eq "<svg><!-- Test IO --></svg>\n"
228
255
  expect(output).to be_html_safe
229
256
  end
230
257
 
231
258
  it 'return valid svg for file' do
232
- output = helper.inline_svg(File.new(file_path))
259
+ output = helper.send(helper_method, File.new(file_path))
233
260
  expect(output).to eq "<svg xmlns=\"http://www.w3.org/2000/svg\" xml:lang=\"en\" role=\"presentation\"><!-- This is a test comment --></svg>\n"
234
261
  expect(output).to be_html_safe
235
262
  end
236
263
 
237
264
  end
238
265
  end
266
+
267
+ describe '#inline_svg' do
268
+ it_behaves_like "inline_svg helper", helper_method: :inline_svg
269
+ end
270
+
271
+ describe '#inline_svg_tag' do
272
+ it_behaves_like "inline_svg helper", helper_method: :inline_svg_tag
273
+ end
274
+
275
+ describe '#inline_svg_tag' do
276
+ it_behaves_like "inline_svg helper", helper_method: :inline_svg_pack_tag
277
+ end
239
278
  end
@@ -5,6 +5,6 @@ describe InlineSvg::IdGenerator do
5
5
  randomizer = -> { "some-random-value" }
6
6
 
7
7
  expect(InlineSvg::IdGenerator.generate("some-base", "some-salt", randomness: randomizer)).
8
- to eq("t2c17mkqnvopy36iccxspura7wnreqf")
8
+ to eq("at2c17mkqnvopy36iccxspura7wnreqf")
9
9
  end
10
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inline_svg
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Martin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-13 00:00:00.000000000 Z
11
+ date: 2022-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.5'
19
+ version: '2.0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.5'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -129,6 +129,9 @@ executables: []
129
129
  extensions: []
130
130
  extra_rdoc_files: []
131
131
  files:
132
+ - ".github/workflows/integration_test.yml"
133
+ - ".github/workflows/rails_6_webpacker_integration_tests.yaml"
134
+ - ".github/workflows/ruby.yml"
132
135
  - ".gitignore"
133
136
  - ".rubocop.yml"
134
137
  - ".rubocop_todo.yml"
@@ -137,7 +140,6 @@ files:
137
140
  - LICENSE.txt
138
141
  - README.md
139
142
  - Rakefile
140
- - circle.yml
141
143
  - inline_svg.gemspec
142
144
  - lib/inline_svg.rb
143
145
  - lib/inline_svg/action_view/helpers.rb
@@ -146,6 +148,7 @@ files:
146
148
  - lib/inline_svg/finds_asset_paths.rb
147
149
  - lib/inline_svg/id_generator.rb
148
150
  - lib/inline_svg/io_resource.rb
151
+ - lib/inline_svg/propshaft_asset_finder.rb
149
152
  - lib/inline_svg/railtie.rb
150
153
  - lib/inline_svg/static_asset_finder.rb
151
154
  - lib/inline_svg/transform_pipeline.rb
@@ -166,6 +169,7 @@ files:
166
169
  - lib/inline_svg/transform_pipeline/transformations/transformation.rb
167
170
  - lib/inline_svg/transform_pipeline/transformations/width.rb
168
171
  - lib/inline_svg/version.rb
172
+ - lib/inline_svg/webpack_asset_finder.rb
169
173
  - spec/asset_file_spec.rb
170
174
  - spec/cached_asset_file_spec.rb
171
175
  - spec/files/example.svg
@@ -213,8 +217,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
213
217
  - !ruby/object:Gem::Version
214
218
  version: '0'
215
219
  requirements: []
216
- rubyforge_project:
217
- rubygems_version: 2.6.11
220
+ rubygems_version: 3.1.2
218
221
  signing_key:
219
222
  specification_version: 4
220
223
  summary: Embeds an SVG document, inline.
data/circle.yml DELETED
@@ -1,3 +0,0 @@
1
- machine:
2
- ruby:
3
- version: 2.2.2