roadie 3.5.1 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +46 -0
  3. data/.rubocop.yml +5 -0
  4. data/.solargraph.yml +16 -0
  5. data/Changelog.md +35 -4
  6. data/Gemfile +7 -2
  7. data/README.md +14 -14
  8. data/Rakefile +4 -3
  9. data/lib/roadie/asset_provider.rb +5 -1
  10. data/lib/roadie/asset_scanner.rb +8 -6
  11. data/lib/roadie/cached_provider.rb +3 -0
  12. data/lib/roadie/deduplicator.rb +3 -0
  13. data/lib/roadie/document.rb +24 -17
  14. data/lib/roadie/errors.rb +22 -16
  15. data/lib/roadie/filesystem_provider.rb +15 -3
  16. data/lib/roadie/inliner.rb +51 -19
  17. data/lib/roadie/markup_improver.rb +24 -31
  18. data/lib/roadie/net_http_provider.rb +27 -12
  19. data/lib/roadie/null_provider.rb +20 -5
  20. data/lib/roadie/null_url_rewriter.rb +11 -3
  21. data/lib/roadie/path_rewriter_provider.rb +6 -1
  22. data/lib/roadie/provider_list.rb +17 -11
  23. data/lib/roadie/rspec/asset_provider.rb +6 -1
  24. data/lib/roadie/rspec/cache_store.rb +2 -0
  25. data/lib/roadie/rspec.rb +4 -2
  26. data/lib/roadie/selector.rb +18 -5
  27. data/lib/roadie/style_attribute_builder.rb +4 -1
  28. data/lib/roadie/style_block.rb +5 -3
  29. data/lib/roadie/style_property.rb +5 -2
  30. data/lib/roadie/stylesheet.rb +4 -13
  31. data/lib/roadie/url_generator.rb +26 -8
  32. data/lib/roadie/url_rewriter.rb +12 -9
  33. data/lib/roadie/utils.rb +3 -1
  34. data/lib/roadie/version.rb +1 -1
  35. data/lib/roadie.rb +25 -23
  36. data/roadie.gemspec +23 -23
  37. data/spec/hash_as_cache_store_spec.rb +3 -1
  38. data/spec/integration_spec.rb +75 -44
  39. data/spec/lib/roadie/asset_scanner_spec.rb +11 -5
  40. data/spec/lib/roadie/cached_provider_spec.rb +6 -4
  41. data/spec/lib/roadie/css_not_found_spec.rb +10 -5
  42. data/spec/lib/roadie/deduplicator_spec.rb +5 -3
  43. data/spec/lib/roadie/document_spec.rb +57 -28
  44. data/spec/lib/roadie/filesystem_provider_spec.rb +10 -11
  45. data/spec/lib/roadie/inliner_spec.rb +42 -45
  46. data/spec/lib/roadie/markup_improver_spec.rb +19 -26
  47. data/spec/lib/roadie/net_http_provider_spec.rb +16 -14
  48. data/spec/lib/roadie/null_provider_spec.rb +4 -3
  49. data/spec/lib/roadie/null_url_rewriter_spec.rb +4 -3
  50. data/spec/lib/roadie/path_rewriter_provider_spec.rb +6 -4
  51. data/spec/lib/roadie/provider_list_spec.rb +27 -22
  52. data/spec/lib/roadie/selector_spec.rb +7 -5
  53. data/spec/lib/roadie/style_attribute_builder_spec.rb +7 -5
  54. data/spec/lib/roadie/style_block_spec.rb +3 -2
  55. data/spec/lib/roadie/style_property_spec.rb +10 -8
  56. data/spec/lib/roadie/stylesheet_spec.rb +4 -21
  57. data/spec/lib/roadie/test_provider_spec.rb +6 -4
  58. data/spec/lib/roadie/url_generator_spec.rb +3 -2
  59. data/spec/lib/roadie/url_rewriter_spec.rb +10 -7
  60. data/spec/lib/roadie/utils_spec.rb +2 -0
  61. data/spec/shared_examples/asset_provider.rb +2 -0
  62. data/spec/shared_examples/url_rewriter.rb +5 -3
  63. data/spec/spec_helper.rb +10 -8
  64. data/spec/support/have_attribute_matcher.rb +3 -2
  65. data/spec/support/have_node_matcher.rb +5 -3
  66. data/spec/support/have_selector_matcher.rb +4 -3
  67. data/spec/support/have_styling_matcher.rb +12 -11
  68. data/spec/support/have_xpath_matcher.rb +4 -3
  69. data/spec/support/test_provider.rb +2 -0
  70. metadata +24 -8
  71. data/.travis.yml +0 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 19c2bb2df5f06249e20336bee272088f2224749fcb20741c411647428221e20e
4
- data.tar.gz: cd7e290f724bf71fd8b56d8f013ebc2dd246b5594fc730d5899639d1dbdada38
3
+ metadata.gz: 39c01590157057fcedad04740a1594a45f18150d74c7e8fe071dd3aea6908e1f
4
+ data.tar.gz: 490cc578b42057ca635ce613d8e50b05401b0a07597761f70423467aa99aa673
5
5
  SHA512:
6
- metadata.gz: 8767e97ed3592ff69e969d646537775b9a0c571d62f54bb02555e102f5acedf5813435d0f4b1b58b52adb4187608cfe33020a7019c98aebd8ad5077ef3e3b4e8
7
- data.tar.gz: 220fdd872e42acea4e4aebe9dc04f34d3a9e996254d5135af4663d98534362ade3b0d1c21368afd6c046282814b4f0d061f8e20f14451d295fb511f0c4888366
6
+ metadata.gz: d71f85f1aba91c711351972b65074835f690f62d0cd4a0feb663f67df89a86d8acddc855fe7be4e23601fe3b0508c1558f6c18cc260c69c1ad5b1b1857ad04e2
7
+ data.tar.gz: 1d708c10a62800d44efbe825601546a8713b953f81a2549d91a23e74e26048839adc418d38c38bbd08bd885bc6504a3a07c5cca46f94d3ad147d347f3086ffaa
@@ -0,0 +1,46 @@
1
+ name: Main
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+ - master
7
+
8
+ pull_request:
9
+ types: [opened, synchronize, reopened]
10
+
11
+ jobs:
12
+ base:
13
+ name: Ruby ${{ matrix.ruby }}
14
+ runs-on: ubuntu-20.04
15
+ strategy:
16
+ fail-fast: false
17
+ matrix:
18
+ ruby: ["2.6", "2.7", "3.0", "3.1"]
19
+
20
+ steps:
21
+ - name: Checkout code
22
+ uses: actions/checkout@v2
23
+
24
+ # This setup is not compatible with the way Travis CI was
25
+ # setup, so the cache will only work for the root folder.
26
+ - name: Setup Ruby
27
+ uses: ruby/setup-ruby@v1
28
+ with:
29
+ ruby-version: ${{ matrix.ruby }}
30
+ bundler-cache: true
31
+
32
+ - name: Rake
33
+ run: bundle exec rake
34
+
35
+ - uses: codecov/codecov-action@v2
36
+
37
+ lint:
38
+ runs-on: ubuntu-latest
39
+ steps:
40
+ - name: standardrb
41
+ env:
42
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
43
+ uses: amoeba/standardrb-action@v2
44
+ permissions:
45
+ checks: write
46
+ contents: read
data/.rubocop.yml ADDED
@@ -0,0 +1,5 @@
1
+ AllCops:
2
+ DisabledByDefault: true
3
+
4
+ Style/FrozenStringLiteralComment:
5
+ Enabled: true
data/.solargraph.yml ADDED
@@ -0,0 +1,16 @@
1
+ ---
2
+ include:
3
+ - "**/*.rb"
4
+ exclude:
5
+ - spec/**/*
6
+ - test/**/*
7
+ - vendor/**/*
8
+ - ".bundle/**/*"
9
+ require: []
10
+ domains: []
11
+ plugins:
12
+ - solargraph-standardrb
13
+ reporters:
14
+ - standardrb
15
+ require_paths: []
16
+ max_files: 5000
data/Changelog.md CHANGED
@@ -1,10 +1,42 @@
1
1
  ### dev
2
2
 
3
- ### dev
3
+ [full changelog](https://github.com/Mange/roadie/compare/v5.1.0...master)
4
+
5
+ ### 5.1.0
6
+
7
+ [full changelog](https://github.com/Mange/roadie/compare/v5.0.1...v5.1.0)
8
+
9
+ * Support passing serialization options to Nokogiri with `serialization_options=` method -
10
+ [Dmytro Savochkin](https://github.com/dmytro-savochkin). (#171)
11
+
12
+ ### 5.0.1
13
+
14
+ [full changelog](https://github.com/Mange/roadie/compare/v5.0.0...v5.0.1)
4
15
 
5
- [full changelog](https://github.com/Mange/roadie/compare/v3.5.1...master)
16
+ * Don't try to inline [the `:host`
17
+ pseudo-class](https://developer.mozilla.org/en-US/docs/Web/CSS/:host) -
18
+ [viamin (Bart Agapinan)](https://github.com/viamin). (#170)
6
19
 
7
- * Nothing yet.
20
+ ### 5.0.0
21
+
22
+ [full changelog](https://github.com/Mange/roadie/compare/v4.0.0...v5.0.0)
23
+
24
+ * Drop support for Ruby 2.4 and Ruby 2.5
25
+ * Drop support for JRuby and Rubinius
26
+ * Test with Ruby 2.7 - [aried3r (Anton Rieder)](https://github.com/aried3r) (#167)
27
+ * Test with Ruby 3.0 and Ruby 3.1
28
+ * Add standardrb as code formatter
29
+ * Drop support for callbacks that accepts only a single argument.
30
+ * Change signature of `Roadie::CssNotFound` and `Roadie::ProvidersFailed`.
31
+
32
+ ### 4.0.0
33
+
34
+ [full changelog](https://github.com/Mange/roadie/compare/v3.5.1...v4.0.0)
35
+
36
+ * Drop support for Ruby 2.1, 2.2, and 2.3 and
37
+ add support for frozen string literals and Ruby 2.6 - [adamkiczula (Adam
38
+ Kiczula)](https://github.com/adamkiczula) (#164)
39
+ * `Roadie::Stylesheet#each_inlinable_block` is now removed.
8
40
 
9
41
  ### 3.5.1
10
42
 
@@ -380,4 +412,3 @@ Roadie fork!
380
412
  * + some other enhancements
381
413
  * Deprecations:
382
414
  * Removed support for Rails 2.x
383
-
data/Gemfile CHANGED
@@ -1,5 +1,10 @@
1
- source 'https://rubygems.org'
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
2
4
  gemspec
3
5
 
4
6
  # Added here so it does not show up on the Gemspec; I only want it for CI builds
5
- gem 'codecov', group: :test, require: false
7
+ gem "codecov", group: :test, require: false
8
+ # Not actually required to run the tests for the gem, but a real convenience
9
+ # for local development.
10
+ gem "standard", group: [:test, :development], require: false
data/README.md CHANGED
@@ -1,7 +1,6 @@
1
1
  Roadie
2
2
  ======
3
3
 
4
- [![Build history and status](https://travis-ci.org/Mange/roadie.svg?branch=master)](http://travis-ci.org/#!/Mange/roadie)
5
4
  [![Code Climate](https://codeclimate.com/github/Mange/roadie.png)](https://codeclimate.com/github/Mange/roadie)
6
5
  [![Code coverage status](https://codecov.io/github/Mange/roadie/coverage.svg?branch=master)](https://codecov.io/github/Mange/roadie?branch=master)
7
6
  [![Gem](https://img.shields.io/gem/v/roadie.svg)](https://rubygems.org/gems/roadie)
@@ -55,7 +54,7 @@ Install & Usage
55
54
  [Add this gem to your Gemfile as recommended by Rubygems](http://rubygems.org/gems/roadie) and run `bundle install`.
56
55
 
57
56
  ```ruby
58
- gem 'roadie', '~> 3.5'
57
+ gem 'roadie', '~> 4.0'
59
58
  ```
60
59
 
61
60
  You can then create a new instance of a Roadie document:
@@ -95,6 +94,8 @@ Your document instance can be configured with several options:
95
94
  * `external_asset_providers` - A list of asset providers that are invoked when absolute CSS URLs are referenced. See below.
96
95
  * `before_transformation` - A callback run before transformation starts.
97
96
  * `after_transformation` - A callback run after transformation is completed.
97
+ * `serialization_options` - An integer bitmap of options passed along to Nokogiri during serialization.
98
+ By default it's `Nokogiri::XML::Node::SaveOptions::NO_DECLARATION | Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS`.
98
99
 
99
100
  ### Making URLs absolute ###
100
101
 
@@ -333,7 +334,10 @@ class UserAssetsProvider
333
334
  end
334
335
 
335
336
  def find_stylesheet!(name)
336
- find_stylesheet(name) or raise Roadie::CssNotFound.new(name, "does not match a user stylesheet", self)
337
+ find_stylesheet(name) or
338
+ raise Roadie::CssNotFound.new(
339
+ css_name: name, message: "does not match a user stylesheet", provider: self
340
+ )
337
341
  end
338
342
 
339
343
  # Instead of implementing #find_stylesheet!, you could also:
@@ -444,18 +448,14 @@ Partial documents does not have a `<!DOCTYPE>`.
444
448
  Build Status
445
449
  ------------
446
450
 
447
- Tested with [Travis CI](http://travis-ci.org) using:
451
+ Tested with Github CI using:
448
452
 
449
- * MRI 2.1
450
- * MRI 2.2
451
- * MRI 2.3
452
- * MRI 2.4
453
- * JRuby (latest)
454
- * Rubinius (failures on Rubinius will not fail the build due to a long history of instability in `rbx`)
453
+ * MRI 2.6
454
+ * MRI 2.7
455
+ * MRI 3.0
456
+ * MRI 3.1
455
457
 
456
- [(Build status)](http://travis-ci.org/#!/Mange/roadie)
457
-
458
- Let me know if you want any other VM supported officially.
458
+ Let me know if you want any other runtime supported officially.
459
459
 
460
460
  ### Versioning ###
461
461
 
@@ -565,7 +565,7 @@ License
565
565
 
566
566
  (The MIT License)
567
567
 
568
- Copyright (c) 2009-2018 Magnus Bergmark, Jim Neath / Purify, and contributors.
568
+ Copyright (c) 2009-2022 Magnus Bergmark, Jim Neath / Purify, and contributors.
569
569
 
570
570
  * [Magnus Bergmark](https://github.com/Mange) <magnus.bergmark@gmail.com>
571
571
 
data/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
- # encoding: utf-8
2
- require 'bundler/setup'
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
3
4
 
4
5
  Bundler::GemHelper.install_tasks
5
6
 
@@ -9,4 +10,4 @@ task :spec do
9
10
  end
10
11
 
11
12
  desc "Default: Run specs"
12
- task :default => :spec
13
+ task default: :spec
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Roadie
2
4
  # This module can be included in your own code to help you implement the
3
5
  # standard behavior for asset providers.
@@ -5,7 +7,9 @@ module Roadie
5
7
  # It helps you by declaring {#find_stylesheet!} in the terms of #find_stylesheet in your own class.
6
8
  module AssetProvider
7
9
  def find_stylesheet!(name)
8
- find_stylesheet(name) or raise CssNotFound.new(name, nil, self)
10
+ find_stylesheet(name) or raise(
11
+ CssNotFound.new(css_name: name, provider: self)
12
+ )
9
13
  end
10
14
  end
11
15
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Roadie
2
4
  # @api private
3
5
  #
@@ -41,15 +43,15 @@ module Roadie
41
43
  # @see #find_css
42
44
  # @return [Enumerable<Stylesheet>] every extracted stylesheet
43
45
  def extract_css
44
- stylesheets = @dom.css(STYLE_ELEMENT_QUERY).map { |element|
46
+ @dom.css(STYLE_ELEMENT_QUERY).map { |element|
45
47
  stylesheet = read_stylesheet(element)
46
48
  element.remove if stylesheet
47
49
  stylesheet
48
50
  }.compact
49
- stylesheets
50
51
  end
51
52
 
52
53
  private
54
+
53
55
  STYLE_ELEMENT_QUERY = (
54
56
  "style:not([data-roadie-ignore]), " +
55
57
  # TODO: When using Nokogiri 1.6.1 and later; we may use a double :not here
@@ -73,7 +75,7 @@ module Roadie
73
75
  def read_stylesheet(element)
74
76
  if element.name == "style"
75
77
  read_style_element element
76
- elsif element.name == "link" && element['media'] != "print" && element["href"]
78
+ elsif element.name == "link" && element["media"] != "print" && element["href"]
77
79
  read_link_element element
78
80
  end
79
81
  end
@@ -84,14 +86,14 @@ module Roadie
84
86
 
85
87
  def read_link_element(element)
86
88
  if Utils.path_is_absolute?(element["href"])
87
- external_asset_provider.find_stylesheet! element['href'] if should_find_external?
89
+ external_asset_provider.find_stylesheet! element["href"] if should_find_external?
88
90
  else
89
- normal_asset_provider.find_stylesheet! element['href']
91
+ normal_asset_provider.find_stylesheet! element["href"]
90
92
  end
91
93
  end
92
94
 
93
95
  def clean_css(css)
94
- css.gsub(CLEANING_MATCHER, '')
96
+ css.gsub(CLEANING_MATCHER, "")
95
97
  end
96
98
 
97
99
  def should_find_external?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Roadie
2
4
  # @api public
3
5
  # The {CachedProvider} wraps another provider (or {ProviderList}) and caches
@@ -67,6 +69,7 @@ module Roadie
67
69
  end
68
70
 
69
71
  private
72
+
70
73
  def cache_fetch(name)
71
74
  cache[name] || cache[name] = yield
72
75
  rescue CssNotFound
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Roadie
2
4
  class Deduplicator
3
5
  def self.apply(input)
@@ -24,6 +26,7 @@ module Roadie
24
26
  end
25
27
 
26
28
  private
29
+
27
30
  attr_reader :input, :latest_occurance
28
31
 
29
32
  def has_duplicates?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Roadie
2
4
  # The main entry point for Roadie. A document represents a working unit and
3
5
  # is built with the input HTML and the configuration options you need.
@@ -40,6 +42,10 @@ module Roadie
40
42
  # which would change the styling on the page
41
43
  attr_accessor :merge_media_queries
42
44
 
45
+ # Integer representing a bitmap set of options used by Nokogiri during serialization.
46
+ # For the complete set of available options look into +Nokogiri::XML::Node::SaveOptions+.
47
+ attr_reader :serialization_options
48
+
43
49
  # The mode to generate markup in. Valid values are `:html` (default) and `:xhtml`.
44
50
  attr_reader :mode
45
51
 
@@ -47,10 +53,13 @@ module Roadie
47
53
  def initialize(html)
48
54
  @keep_uninlinable_css = true
49
55
  @merge_media_queries = true
56
+ @serialization_options =
57
+ Nokogiri::XML::Node::SaveOptions::NO_DECLARATION |
58
+ Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS
50
59
  @html = html
51
60
  @asset_providers = ProviderList.wrap(FilesystemProvider.new)
52
61
  @external_asset_providers = ProviderList.empty
53
- @css = ""
62
+ @css = +""
54
63
  @mode = :html
55
64
  end
56
65
 
@@ -135,11 +144,19 @@ module Roadie
135
144
  @external_asset_providers = ProviderList.wrap(list)
136
145
  end
137
146
 
147
+ # Integer representing a bitmap set of options used by Nokogiri during serialization.
148
+ # For the complete set of available options look into +Nokogiri::XML::Node::SaveOptions+.
149
+ # (To change the mode in which the document is generated use {#mode=} however.)
150
+ def serialization_options=(options)
151
+ @serialization_options = options || 0
152
+ end
153
+
138
154
  # Change the mode. The mode affects how the resulting markup is generated.
139
155
  #
140
156
  # Valid modes:
141
157
  # `:html` (default)
142
158
  # `:xhtml`
159
+ # `:xml`
143
160
  def mode=(mode)
144
161
  if VALID_MODES.include?(mode)
145
162
  @mode = mode
@@ -149,7 +166,8 @@ module Roadie
149
166
  end
150
167
 
151
168
  private
152
- VALID_MODES = %i[html xhtml].freeze
169
+
170
+ VALID_MODES = %i[html xhtml xml].freeze
153
171
  private_constant :VALID_MODES
154
172
 
155
173
  def stylesheet
@@ -166,7 +184,7 @@ module Roadie
166
184
  Inliner.new(dom_stylesheets + [stylesheet], dom).inline(
167
185
  keep_uninlinable_css: keep_uninlinable_css,
168
186
  keep_uninlinable_in: keep_uninlinable_in,
169
- merge_media_queries: merge_media_queries,
187
+ merge_media_queries: merge_media_queries
170
188
  )
171
189
  end
172
190
 
@@ -180,15 +198,10 @@ module Roadie
180
198
  format = {
181
199
  html: save_options::AS_HTML,
182
200
  xhtml: save_options::AS_XHTML,
201
+ xml: save_options::AS_XML
183
202
  }.fetch(mode)
184
203
 
185
- dom.dup.to_html(
186
- save_with: (
187
- save_options::NO_DECLARATION |
188
- save_options::NO_EMPTY_TAGS |
189
- format
190
- ),
191
- )
204
+ dom.dup.to_html(save_with: (serialization_options | format))
192
205
  end
193
206
 
194
207
  def make_url_rewriter
@@ -201,13 +214,7 @@ module Roadie
201
214
 
202
215
  def callback(callable, dom)
203
216
  if callable.respond_to?(:call)
204
- # Arity checking is to support the API without bumping a major version.
205
- # TODO: Remove on next major version (v4.0)
206
- if !callable.respond_to?(:parameters) || callable.parameters.size == 1
207
- callable.(dom)
208
- else
209
- callable.(dom, self)
210
- end
217
+ callable.call(dom, self)
211
218
  end
212
219
  end
213
220
 
data/lib/roadie/errors.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Roadie
2
4
  # Base class for all Roadie errors. Rescue this if you want to catch errors
3
5
  # from Roadie.
@@ -16,10 +18,10 @@ module Roadie
16
18
 
17
19
  def initialize(given_path, cause = nil)
18
20
  @cause = cause
19
- if cause
20
- cause_message = " Caused by: #{cause}"
21
+ cause_message = if cause
22
+ " Caused by: #{cause}"
21
23
  else
22
- cause_message = ""
24
+ ""
23
25
  end
24
26
  super "Cannot use path \"#{given_path}\" in URL generation.#{cause_message}"
25
27
  end
@@ -41,24 +43,23 @@ module Roadie
41
43
  # Extra message
42
44
  attr_reader :extra_message
43
45
 
44
- # TODO: Change signature in the next major version of Roadie.
45
- def initialize(css_name, extra_message = nil, provider = nil)
46
+ def initialize(css_name:, message: nil, provider: nil)
46
47
  @css_name = css_name
47
48
  @provider = provider
48
- @extra_message = extra_message
49
- super build_message(extra_message)
49
+ @extra_message = message
50
+ super build_message
50
51
  end
51
52
 
52
53
  protected
54
+
53
55
  def error_row
54
- "#{provider || "Unknown provider"}: #{extra_message || message}"
56
+ "#{provider || "Unknown provider"}: #{extra_message}"
55
57
  end
56
58
 
57
59
  private
58
- # Redundant method argument is to keep API compatability without major version bump.
59
- # TODO: Remove argument on version 4.0.
60
- def build_message(extra_message = @extra_message)
61
- message = %(Could not find stylesheet "#{css_name}")
60
+
61
+ def build_message
62
+ message = +%(Could not find stylesheet "#{css_name}")
62
63
  message << ": #{extra_message}" if extra_message
63
64
  message << "\nUsed provider:\n#{provider}" if provider
64
65
  message
@@ -68,14 +69,19 @@ module Roadie
68
69
  class ProvidersFailed < CssNotFound
69
70
  attr_reader :errors
70
71
 
71
- def initialize(css_name, provider_list, errors)
72
+ def initialize(css_name:, providers:, errors:)
72
73
  @errors = errors
73
- super(css_name, "All providers failed", provider_list)
74
+ super(
75
+ css_name: css_name,
76
+ message: "All providers failed",
77
+ provider: providers
78
+ )
74
79
  end
75
80
 
76
81
  private
77
- def build_message(extra_message)
78
- message = %(Could not find stylesheet "#{css_name}": #{extra_message}\nUsed providers:\n)
82
+
83
+ def build_message
84
+ message = +%(Could not find stylesheet "#{css_name}": #{extra_message}\nUsed providers:\n)
79
85
  each_error_row(errors) do |row|
80
86
  message << "\t" << row << "\n"
81
87
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Roadie
2
4
  # Asset provider that looks for files on your local filesystem.
3
5
  #
@@ -30,14 +32,24 @@ module Roadie
30
32
  Stylesheet.new file_path, File.read(file_path)
31
33
  else
32
34
  basename = File.basename file_path
33
- raise CssNotFound.new(basename, %{#{file_path} does not exist. (Original name was "#{name}")}, self)
35
+ raise CssNotFound.new(
36
+ css_name: basename,
37
+ message: %{#{file_path} does not exist. (Original name was "#{name}")},
38
+ provider: self
39
+ )
34
40
  end
35
41
  end
36
42
 
37
- def to_s() inspect end
38
- def inspect() "#<#{self.class} #@path>" end
43
+ def to_s
44
+ inspect
45
+ end
46
+
47
+ def inspect
48
+ "#<#{self.class} #{@path}>"
49
+ end
39
50
 
40
51
  private
52
+
41
53
  def build_file_path(name)
42
54
  raise InsecurePathError, name if name.include?("..")
43
55
  File.join(@path, name[/^([^?]+)/])