roadie 4.0.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +43 -0
  3. data/.solargraph.yml +16 -0
  4. data/Changelog.md +14 -2
  5. data/Gemfile +5 -2
  6. data/README.md +11 -13
  7. data/Rakefile +2 -2
  8. data/lib/roadie/asset_provider.rb +3 -1
  9. data/lib/roadie/asset_scanner.rb +6 -6
  10. data/lib/roadie/cached_provider.rb +1 -0
  11. data/lib/roadie/deduplicator.rb +1 -0
  12. data/lib/roadie/document.rb +7 -10
  13. data/lib/roadie/errors.rb +18 -14
  14. data/lib/roadie/filesystem_provider.rb +13 -3
  15. data/lib/roadie/inliner.rb +49 -19
  16. data/lib/roadie/markup_improver.rb +22 -31
  17. data/lib/roadie/net_http_provider.rb +25 -11
  18. data/lib/roadie/null_provider.rb +18 -5
  19. data/lib/roadie/null_url_rewriter.rb +6 -2
  20. data/lib/roadie/path_rewriter_provider.rb +4 -1
  21. data/lib/roadie/provider_list.rb +15 -11
  22. data/lib/roadie/rspec/asset_provider.rb +4 -1
  23. data/lib/roadie/rspec.rb +2 -2
  24. data/lib/roadie/selector.rb +15 -5
  25. data/lib/roadie/style_attribute_builder.rb +2 -1
  26. data/lib/roadie/style_block.rb +3 -3
  27. data/lib/roadie/style_property.rb +3 -2
  28. data/lib/roadie/stylesheet.rb +2 -13
  29. data/lib/roadie/url_generator.rb +24 -8
  30. data/lib/roadie/url_rewriter.rb +6 -3
  31. data/lib/roadie/utils.rb +1 -1
  32. data/lib/roadie/version.rb +1 -2
  33. data/lib/roadie.rb +23 -23
  34. data/roadie.gemspec +23 -25
  35. data/spec/hash_as_cache_store_spec.rb +1 -1
  36. data/spec/integration_spec.rb +41 -44
  37. data/spec/lib/roadie/asset_scanner_spec.rb +9 -4
  38. data/spec/lib/roadie/cached_provider_spec.rb +4 -4
  39. data/spec/lib/roadie/css_not_found_spec.rb +8 -5
  40. data/spec/lib/roadie/deduplicator_spec.rb +3 -3
  41. data/spec/lib/roadie/document_spec.rb +45 -27
  42. data/spec/lib/roadie/filesystem_provider_spec.rb +8 -10
  43. data/spec/lib/roadie/inliner_spec.rb +40 -44
  44. data/spec/lib/roadie/markup_improver_spec.rb +17 -25
  45. data/spec/lib/roadie/net_http_provider_spec.rb +8 -8
  46. data/spec/lib/roadie/null_provider_spec.rb +2 -2
  47. data/spec/lib/roadie/null_url_rewriter_spec.rb +2 -2
  48. data/spec/lib/roadie/path_rewriter_provider_spec.rb +4 -4
  49. data/spec/lib/roadie/provider_list_spec.rb +25 -21
  50. data/spec/lib/roadie/selector_spec.rb +4 -4
  51. data/spec/lib/roadie/style_attribute_builder_spec.rb +5 -5
  52. data/spec/lib/roadie/style_block_spec.rb +1 -1
  53. data/spec/lib/roadie/style_property_spec.rb +8 -8
  54. data/spec/lib/roadie/stylesheet_spec.rb +2 -20
  55. data/spec/lib/roadie/test_provider_spec.rb +4 -4
  56. data/spec/lib/roadie/url_generator_spec.rb +1 -1
  57. data/spec/lib/roadie/url_rewriter_spec.rb +6 -4
  58. data/spec/spec_helper.rb +8 -8
  59. data/spec/support/have_attribute_matcher.rb +1 -2
  60. data/spec/support/have_node_matcher.rb +3 -3
  61. data/spec/support/have_selector_matcher.rb +2 -3
  62. data/spec/support/have_styling_matcher.rb +10 -11
  63. data/spec/support/have_xpath_matcher.rb +2 -3
  64. metadata +22 -21
  65. data/.travis.yml +0 -20
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'set'
4
- require 'uri'
5
- require 'net/http'
3
+ require "set"
4
+ require "uri"
5
+ require "net/http"
6
6
 
7
7
  module Roadie
8
8
  # @api public
@@ -34,19 +34,29 @@ module Roadie
34
34
 
35
35
  def find_stylesheet!(url)
36
36
  response = download(url)
37
- if response.kind_of? Net::HTTPSuccess
37
+ if response.is_a? Net::HTTPSuccess
38
38
  Stylesheet.new(url, response_body(response))
39
39
  else
40
- raise CssNotFound.new(url, "Server returned #{response.code}: #{truncate response.body}", self)
40
+ raise CssNotFound.new(
41
+ css_name: url,
42
+ message: "Server returned #{response.code}: #{truncate response.body}",
43
+ provider: self
44
+ )
41
45
  end
42
46
  rescue Timeout::Error
43
- raise CssNotFound.new(url, "Timeout", self)
47
+ raise CssNotFound.new(css_name: url, message: "Timeout", provider: self)
44
48
  end
45
49
 
46
- def to_s() inspect end
47
- def inspect() "#<#{self.class} whitelist: #{whitelist.inspect}>" end
50
+ def to_s
51
+ inspect
52
+ end
53
+
54
+ def inspect
55
+ "#<#{self.class} whitelist: #{whitelist.inspect}>"
56
+ end
48
57
 
49
58
  private
59
+
50
60
  def host_set(hosts)
51
61
  hosts.each { |host| validate_host(host) }.to_set
52
62
  end
@@ -63,7 +73,11 @@ module Roadie
63
73
  if access_granted_to?(uri.host)
64
74
  get_response(uri)
65
75
  else
66
- raise CssNotFound.new(url, "#{uri.host} is not part of whitelist!", self)
76
+ raise CssNotFound.new(
77
+ css_name: url,
78
+ message: "#{uri.host} is not part of whitelist!",
79
+ provider: self
80
+ )
67
81
  end
68
82
  end
69
83
 
@@ -71,7 +85,7 @@ module Roadie
71
85
  if RUBY_VERSION >= "2.0.0"
72
86
  Net::HTTP.get_response(uri)
73
87
  else
74
- Net::HTTP.start(uri.host, uri.port, use_ssl: (uri.scheme == 'https')) do |http|
88
+ Net::HTTP.start(uri.host, uri.port, use_ssl: (uri.scheme == "https")) do |http|
75
89
  http.request(Net::HTTP::Get.new(uri.request_uri))
76
90
  end
77
91
  end
@@ -92,7 +106,7 @@ module Roadie
92
106
  def response_body(response)
93
107
  # Make sure we respect encoding because Net:HTTP will encode body as ASCII by default
94
108
  # which will break if the response is not compatible.
95
- supplied_charset = response.type_params['charset']
109
+ supplied_charset = response.type_params["charset"]
96
110
  body = response.body
97
111
 
98
112
  if supplied_charset
@@ -6,13 +6,26 @@ module Roadie
6
6
  # Use it to ignore missing assets or in your tests when you need a provider
7
7
  # but you do not care what it contains or that it is even referenced at all.
8
8
  class NullProvider
9
- def find_stylesheet(name) empty_stylesheet end
10
- def find_stylesheet!(name) empty_stylesheet end
9
+ def find_stylesheet(name)
10
+ empty_stylesheet
11
+ end
11
12
 
12
- def to_s() inspect end
13
- def inspect() "#<#{self.class}>" end
13
+ def find_stylesheet!(name)
14
+ empty_stylesheet
15
+ end
16
+
17
+ def to_s
18
+ inspect
19
+ end
20
+
21
+ def inspect
22
+ "#<#{self.class}>"
23
+ end
14
24
 
15
25
  private
16
- def empty_stylesheet() Stylesheet.new "(null)", "" end
26
+
27
+ def empty_stylesheet
28
+ Stylesheet.new "(null)", ""
29
+ end
17
30
  end
18
31
  end
@@ -7,8 +7,12 @@ module Roadie
7
7
  # Used whenever client does not pass any URL options and no URL rewriting
8
8
  # should take place.
9
9
  class NullUrlRewriter
10
- def initialize(generator = nil) end
11
- def transform_dom(dom) end
10
+ def initialize(generator = nil)
11
+ end
12
+
13
+ def transform_dom(dom)
14
+ end
15
+
12
16
  def transform_css(css)
13
17
  css
14
18
  end
@@ -59,7 +59,10 @@ module Roadie
59
59
  if new_path
60
60
  provider.find_stylesheet!(new_path)
61
61
  else
62
- raise CssNotFound, "Filter returned #{new_path.inspect}"
62
+ raise CssNotFound.new(
63
+ css_name: path,
64
+ message: "Filter returned #{new_path.inspect}"
65
+ )
63
66
  end
64
67
  end
65
68
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'forwardable'
3
+ require "forwardable"
4
4
 
5
5
  module Roadie
6
6
  # An asset provider that just composes a list of other asset providers.
@@ -25,7 +25,7 @@ module Roadie
25
25
  # @overload wrap(provider1, provider2, ...)
26
26
  # @return a new {ProviderList} with all the passed providers in it.
27
27
  def self.wrap(*providers)
28
- if providers.size == 1 && providers.first.class == self
28
+ if providers.size == 1 && providers.first.instance_of?(self)
29
29
  providers.first
30
30
  else
31
31
  new(providers.flatten)
@@ -33,7 +33,9 @@ module Roadie
33
33
  end
34
34
 
35
35
  # Returns a new empty list.
36
- def self.empty() new([]) end
36
+ def self.empty
37
+ new([])
38
+ end
37
39
 
38
40
  def initialize(providers)
39
41
  @providers = providers
@@ -55,13 +57,13 @@ module Roadie
55
57
  def find_stylesheet!(name)
56
58
  errors = []
57
59
  @providers.each do |provider|
58
- begin
59
- return provider.find_stylesheet!(name)
60
- rescue CssNotFound => error
61
- errors << error
62
- end
60
+ return provider.find_stylesheet!(name)
61
+ rescue CssNotFound => error
62
+ errors << error
63
63
  end
64
- raise ProvidersFailed.new(name, self, errors)
64
+ raise ProvidersFailed.new(
65
+ css_name: name, providers: self, errors: errors
66
+ )
65
67
  end
66
68
 
67
69
  def to_s
@@ -69,12 +71,14 @@ module Roadie
69
71
  # Indent every line one level
70
72
  provider.to_s.split("\n").join("\n\t")
71
73
  }
72
- "ProviderList: [\n\t#{list.join(",\n\t")}\n]"
74
+ "ProviderList: [\n\t#{list.join(",\n\t")}\n]\n"
73
75
  end
74
76
 
75
77
  # ProviderList can be coerced to an array. This makes Array#flatten work
76
78
  # with it, among other things.
77
- def to_ary() to_a end
79
+ def to_ary
80
+ to_a
81
+ end
78
82
 
79
83
  # @!method each
80
84
  # @see Array#each
@@ -45,7 +45,10 @@ shared_examples_for "roadie asset provider" do |options|
45
45
  it "raises Roadie::CssNotFound on invalid stylesheets" do
46
46
  expect {
47
47
  subject.find_stylesheet!(invalid_name)
48
- }.to raise_error Roadie::CssNotFound, Regexp.new(Regexp.quote(invalid_name))
48
+ }.to raise_error(
49
+ Roadie::CssNotFound,
50
+ Regexp.new(Regexp.quote(invalid_name))
51
+ )
49
52
  end
50
53
  end
51
54
  end
data/lib/roadie/rspec.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'roadie/rspec/asset_provider'
4
- require 'roadie/rspec/cache_store'
3
+ require "roadie/rspec/asset_provider"
4
+ require "roadie/rspec/cache_store"
@@ -37,9 +37,17 @@ module Roadie
37
37
  !(pseudo_element? || at_rule? || pseudo_function?)
38
38
  end
39
39
 
40
- def to_s() selector end
41
- def to_str() to_s end
42
- def inspect() selector.inspect end
40
+ def to_s
41
+ selector
42
+ end
43
+
44
+ def to_str
45
+ to_s
46
+ end
47
+
48
+ def inspect
49
+ selector.inspect
50
+ end
43
51
 
44
52
  # {Selector}s are equal to other {Selector}s if, and only if, their string
45
53
  # representations are equal.
@@ -52,9 +60,11 @@ module Roadie
52
60
  end
53
61
 
54
62
  protected
63
+
55
64
  attr_reader :selector
56
65
 
57
66
  private
67
+
58
68
  BAD_PSEUDO_FUNCTIONS = %w[
59
69
  :active :focus :hover :link :target :visited
60
70
  :-ms-input-placeholder :-moz-placeholder
@@ -63,11 +73,11 @@ module Roadie
63
73
  ].freeze
64
74
 
65
75
  def pseudo_element?
66
- selector.include? '::'
76
+ selector.include? "::"
67
77
  end
68
78
 
69
79
  def at_rule?
70
- selector[0, 1] == '@'
80
+ selector[0, 1] == "@"
71
81
  end
72
82
 
73
83
  def pseudo_function?
@@ -11,10 +11,11 @@ module Roadie
11
11
  end
12
12
 
13
13
  def attribute_string
14
- Deduplicator.apply(stable_sort(@styles).map(&:to_s)).join(';')
14
+ Deduplicator.apply(stable_sort(@styles).map(&:to_s)).join(";")
15
15
  end
16
16
 
17
17
  private
18
+
18
19
  def stable_sort(list)
19
20
  # Ruby's sort is unstable for performance reasons. We need it to be
20
21
  # stable, e.g. to preserve order of elements that are compared equal in
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'forwardable'
3
+ require "forwardable"
4
4
 
5
5
  module Roadie
6
6
  # @api private
@@ -39,7 +39,7 @@ module Roadie
39
39
  # @return {String}
40
40
  def to_s
41
41
  # NB - leave off redundant final semicolon - see https://www.w3.org/TR/CSS2/syndata.html#declaration
42
- "#{selector}{#{properties.map(&:to_s).join(';')}}"
42
+ "#{selector}{#{properties.map(&:to_s).join(";")}}"
43
43
  end
44
44
 
45
45
  private
@@ -49,7 +49,7 @@ module Roadie
49
49
  # @media only screen and (max-width: 600px) {...} cannot be inlined
50
50
  # @return {Boolean}
51
51
  def inlinable_media?
52
- @media.none? { |media_query| media_query.include? '(' }
52
+ @media.none? { |media_query| media_query.include? "(" }
53
53
  end
54
54
  end
55
55
  end
@@ -38,14 +38,15 @@ module Roadie
38
38
  end
39
39
 
40
40
  def to_s
41
- [property, value_with_important].join(':')
41
+ [property, value_with_important].join(":")
42
42
  end
43
43
 
44
44
  def inspect
45
- "#{to_s} (#{specificity})"
45
+ "#{self} (#{specificity})"
46
46
  end
47
47
 
48
48
  private
49
+
49
50
  def value_with_important
50
51
  if important
51
52
  "#{value} !important"
@@ -8,7 +8,7 @@ module Roadie
8
8
  # @attr_reader [String] name the name of the stylesheet ("stylesheets/main.css", "Admin user styles", etc.). The name of the stylesheet will be visible if any errors occur.
9
9
  # @attr_reader [Array<StyleBlock>] blocks
10
10
  class Stylesheet
11
- BOM = (+"\xEF\xBB\xBF").force_encoding('UTF-8').freeze
11
+ BOM = (+"\xEF\xBB\xBF").force_encoding("UTF-8").freeze
12
12
 
13
13
  attr_reader :name, :blocks
14
14
 
@@ -21,23 +21,12 @@ module Roadie
21
21
  @blocks = parse_blocks(css.sub(BOM, ""))
22
22
  end
23
23
 
24
- # @yield [selector, properties]
25
- # @yieldparam [Selector] selector
26
- # @yieldparam [Array<StyleProperty>] properties
27
- # @deprecated Iterate over the #{blocks} instead. Will be removed on version 4.0.
28
- def each_inlinable_block(&block)
29
- # #map and then #each in order to support chained enumerations, etc. if
30
- # no block is provided
31
- inlinable_blocks.map { |style_block|
32
- [style_block.selector, style_block.properties]
33
- }.each(&block)
34
- end
35
-
36
24
  def to_s
37
25
  blocks.join("\n")
38
26
  end
39
27
 
40
28
  private
29
+
41
30
  def inlinable_blocks
42
31
  blocks.select(&:inlinable?)
43
32
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'set'
3
+ require "set"
4
4
 
5
5
  module Roadie
6
6
  # @api private
@@ -23,8 +23,15 @@ module Roadie
23
23
  # @option url_options [String] :scheme URL scheme ("http" is default)
24
24
  # @option url_options [String] :protocol alias for :scheme
25
25
  def initialize(url_options)
26
- raise ArgumentError, "No URL options were specified" unless url_options
27
- raise ArgumentError, "No :host was specified; options are: #{url_options.inspect}" unless url_options[:host]
26
+ unless url_options
27
+ raise ArgumentError, "No URL options were specified"
28
+ end
29
+
30
+ unless url_options[:host]
31
+ raise ArgumentError,
32
+ "No :host was specified; options were: #{url_options.inspect}"
33
+ end
34
+
28
35
  validate_options url_options
29
36
 
30
37
  @url_options = url_options
@@ -58,7 +65,7 @@ module Roadie
58
65
  # @param [String] base The base which the relative path comes from
59
66
  # @return [String] an absolute URL
60
67
  def generate_url(path, base = "/")
61
- return root_uri.to_s if path.nil? or path.empty?
68
+ return root_uri.to_s if path.nil? || path.empty?
62
69
  return path if path_is_anchor?(path)
63
70
  return add_scheme(path) if path_is_schemeless?(path)
64
71
  return path if Utils.path_is_absolute?(path)
@@ -67,13 +74,20 @@ module Roadie
67
74
  end
68
75
 
69
76
  protected
77
+
70
78
  attr_reader :root_uri, :scheme
71
79
 
72
80
  private
81
+
73
82
  def build_root_uri
74
83
  path = make_absolute url_options[:path]
75
84
  port = parse_port url_options[:port]
76
- URI::Generic.build(scheme: scheme, host: url_options[:host], port: port, path: path)
85
+ URI::Generic.build(
86
+ scheme: scheme,
87
+ host: url_options[:host],
88
+ port: port,
89
+ path: path
90
+ )
77
91
  end
78
92
 
79
93
  def add_scheme(path)
@@ -98,7 +112,7 @@ module Roadie
98
112
 
99
113
  # Strip :// from any scheme, if present
100
114
  def normalize_scheme(scheme)
101
- return 'http' unless scheme
115
+ return "http" unless scheme
102
116
  scheme.to_s[/^\w+/]
103
117
  end
104
118
 
@@ -119,7 +133,7 @@ module Roadie
119
133
  end
120
134
 
121
135
  def path_is_anchor?(path)
122
- path.start_with? '#'
136
+ path.start_with? "#"
123
137
  end
124
138
 
125
139
  VALID_OPTIONS = Set[:host, :port, :path, :protocol, :scheme].freeze
@@ -127,7 +141,9 @@ module Roadie
127
141
  def validate_options(options)
128
142
  keys = Set.new(options.keys)
129
143
  unless keys.subset? VALID_OPTIONS
130
- raise ArgumentError, "Passed invalid options: #{(keys - VALID_OPTIONS).to_a}, valid options are: #{VALID_OPTIONS.to_a}"
144
+ raise ArgumentError,
145
+ "Passed invalid options: #{(keys - VALID_OPTIONS).to_a}, " \
146
+ "valid options are: #{VALID_OPTIONS.to_a}"
131
147
  end
132
148
  end
133
149
  end
@@ -25,9 +25,9 @@ module Roadie
25
25
  dom.css(
26
26
  "a[href]:not([data-roadie-ignore]), " \
27
27
  "img[src]:not([data-roadie-ignore]), " \
28
- "*[style]:not([data-roadie-ignore])",
28
+ "*[style]:not([data-roadie-ignore])"
29
29
  ).each do |element|
30
- transform_element_style element if element.has_attribute?('style')
30
+ transform_element_style element if element.has_attribute?("style")
31
31
  transform_element element
32
32
  end
33
33
  nil
@@ -49,7 +49,10 @@ module Roadie
49
49
  end
50
50
 
51
51
  private
52
- def generate_url(*args) @generator.generate_url(*args) end
52
+
53
+ def generate_url(*args)
54
+ @generator.generate_url(*args)
55
+ end
53
56
 
54
57
  # Regexp matching all the url() declarations in CSS
55
58
  #
data/lib/roadie/utils.rb CHANGED
@@ -10,7 +10,7 @@ module Roadie
10
10
  #
11
11
  # URLs that start with double slashes (//css/app.css) are also absolute
12
12
  # in modern browsers, but most email clients do not understand them.
13
- return true if path =~ %r{^(\w+:|//)}
13
+ return true if %r{^(\w+:|//)}.match?(path)
14
14
 
15
15
  begin
16
16
  !URI.parse(path).relative?
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
-
4
3
  module Roadie
5
- VERSION = "4.0.0"
4
+ VERSION = "5.0.0"
6
5
  end
data/lib/roadie.rb CHANGED
@@ -3,30 +3,30 @@
3
3
  module Roadie
4
4
  end
5
5
 
6
- require 'roadie/version'
7
- require 'roadie/errors'
6
+ require "roadie/version"
7
+ require "roadie/errors"
8
8
 
9
- require 'roadie/utils'
10
- require 'roadie/deduplicator'
9
+ require "roadie/utils"
10
+ require "roadie/deduplicator"
11
11
 
12
- require 'roadie/stylesheet'
13
- require 'roadie/selector'
14
- require 'roadie/style_property'
15
- require 'roadie/style_attribute_builder'
16
- require 'roadie/style_block'
12
+ require "roadie/stylesheet"
13
+ require "roadie/selector"
14
+ require "roadie/style_property"
15
+ require "roadie/style_attribute_builder"
16
+ require "roadie/style_block"
17
17
 
18
- require 'roadie/asset_provider'
19
- require 'roadie/provider_list'
20
- require 'roadie/filesystem_provider'
21
- require 'roadie/null_provider'
22
- require 'roadie/net_http_provider'
23
- require 'roadie/cached_provider'
24
- require 'roadie/path_rewriter_provider'
18
+ require "roadie/asset_provider"
19
+ require "roadie/provider_list"
20
+ require "roadie/filesystem_provider"
21
+ require "roadie/null_provider"
22
+ require "roadie/net_http_provider"
23
+ require "roadie/cached_provider"
24
+ require "roadie/path_rewriter_provider"
25
25
 
26
- require 'roadie/asset_scanner'
27
- require 'roadie/markup_improver'
28
- require 'roadie/url_generator'
29
- require 'roadie/url_rewriter'
30
- require 'roadie/null_url_rewriter'
31
- require 'roadie/inliner'
32
- require 'roadie/document'
26
+ require "roadie/asset_scanner"
27
+ require "roadie/markup_improver"
28
+ require "roadie/url_generator"
29
+ require "roadie/url_rewriter"
30
+ require "roadie/null_url_rewriter"
31
+ require "roadie/inliner"
32
+ require "roadie/document"
data/roadie.gemspec CHANGED
@@ -1,35 +1,33 @@
1
- # frozen_string_literal: true
2
1
  # roadie.gemspec
3
- # -*- encoding: utf-8 -*-
2
+ # frozen_string_literal: true
4
3
 
5
4
  $:.push File.expand_path("../lib", __FILE__)
6
- require 'roadie/version'
5
+ require "roadie/version"
7
6
 
8
7
  Gem::Specification.new do |s|
9
- s.name = 'roadie'
10
- s.version = Roadie::VERSION
11
- s.platform = Gem::Platform::RUBY
12
- s.authors = ['Magnus Bergmark']
13
- s.email = ['magnus.bergmark@gmail.com']
14
- s.homepage = 'http://github.com/Mange/roadie'
15
- s.summary = %q{Making HTML emails comfortable for the Ruby rockstars}
16
- s.description = %q{Roadie tries to make sending HTML emails a little less painful by inlining stylesheets and rewriting relative URLs for you.}
17
- s.license = "MIT"
18
-
19
- s.required_ruby_version = ">= 2.4"
20
-
21
- s.add_dependency 'nokogiri', '~> 1.8'
22
- s.add_dependency 'css_parser', '~> 1.4'
23
-
24
- s.add_development_dependency 'rspec', '~> 3.0'
25
- s.add_development_dependency 'rspec-collection_matchers', '~> 1.0'
26
- s.add_development_dependency 'rubocop', '0.75.0'
27
- s.add_development_dependency 'webmock', '~> 3.0'
8
+ s.name = "roadie"
9
+ s.version = Roadie::VERSION
10
+ s.platform = Gem::Platform::RUBY
11
+ s.authors = ["Magnus Bergmark"]
12
+ s.email = ["magnus.bergmark@gmail.com"]
13
+ s.homepage = "http://github.com/Mange/roadie"
14
+ s.summary = "Making HTML emails comfortable for the Ruby rockstars"
15
+ s.description = "Roadie tries to make sending HTML emails a little less painful by inlining stylesheets and rewriting relative URLs for you."
16
+ s.license = "MIT"
17
+
18
+ s.required_ruby_version = ">= 2.6"
19
+
20
+ s.add_dependency "nokogiri", "~> 1.8"
21
+ s.add_dependency "css_parser", "~> 1.4"
22
+
23
+ s.add_development_dependency "rake"
24
+ s.add_development_dependency "rspec", "~> 3.0"
25
+ s.add_development_dependency "rspec-collection_matchers", "~> 1.0"
26
+ s.add_development_dependency "webmock", "~> 3.0"
28
27
 
29
28
  s.extra_rdoc_files = %w[README.md Changelog.md]
30
29
  s.require_paths = %w[lib]
31
30
 
32
- s.files = `git ls-files`.split("\n")
33
- s.test_files = `git ls-files -- spec/*`.split("\n")
31
+ s.files = `git ls-files`.split("\n")
32
+ s.test_files = `git ls-files -- spec/*`.split("\n")
34
33
  end
35
-
@@ -4,6 +4,6 @@ require "spec_helper"
4
4
  require "roadie/rspec"
5
5
 
6
6
  describe "Using Hash as a cache store" do
7
- subject(:hash) { Hash.new }
7
+ subject(:hash) { {} }
8
8
  it_behaves_like "roadie cache store"
9
9
  end