roadie 4.0.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
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