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.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +43 -0
- data/.solargraph.yml +16 -0
- data/Changelog.md +14 -2
- data/Gemfile +5 -2
- data/README.md +11 -13
- data/Rakefile +2 -2
- data/lib/roadie/asset_provider.rb +3 -1
- data/lib/roadie/asset_scanner.rb +6 -6
- data/lib/roadie/cached_provider.rb +1 -0
- data/lib/roadie/deduplicator.rb +1 -0
- data/lib/roadie/document.rb +7 -10
- data/lib/roadie/errors.rb +18 -14
- data/lib/roadie/filesystem_provider.rb +13 -3
- data/lib/roadie/inliner.rb +49 -19
- data/lib/roadie/markup_improver.rb +22 -31
- data/lib/roadie/net_http_provider.rb +25 -11
- data/lib/roadie/null_provider.rb +18 -5
- data/lib/roadie/null_url_rewriter.rb +6 -2
- data/lib/roadie/path_rewriter_provider.rb +4 -1
- data/lib/roadie/provider_list.rb +15 -11
- data/lib/roadie/rspec/asset_provider.rb +4 -1
- data/lib/roadie/rspec.rb +2 -2
- data/lib/roadie/selector.rb +15 -5
- data/lib/roadie/style_attribute_builder.rb +2 -1
- data/lib/roadie/style_block.rb +3 -3
- data/lib/roadie/style_property.rb +3 -2
- data/lib/roadie/stylesheet.rb +2 -13
- data/lib/roadie/url_generator.rb +24 -8
- data/lib/roadie/url_rewriter.rb +6 -3
- data/lib/roadie/utils.rb +1 -1
- data/lib/roadie/version.rb +1 -2
- data/lib/roadie.rb +23 -23
- data/roadie.gemspec +23 -25
- data/spec/hash_as_cache_store_spec.rb +1 -1
- data/spec/integration_spec.rb +41 -44
- data/spec/lib/roadie/asset_scanner_spec.rb +9 -4
- data/spec/lib/roadie/cached_provider_spec.rb +4 -4
- data/spec/lib/roadie/css_not_found_spec.rb +8 -5
- data/spec/lib/roadie/deduplicator_spec.rb +3 -3
- data/spec/lib/roadie/document_spec.rb +45 -27
- data/spec/lib/roadie/filesystem_provider_spec.rb +8 -10
- data/spec/lib/roadie/inliner_spec.rb +40 -44
- data/spec/lib/roadie/markup_improver_spec.rb +17 -25
- data/spec/lib/roadie/net_http_provider_spec.rb +8 -8
- data/spec/lib/roadie/null_provider_spec.rb +2 -2
- data/spec/lib/roadie/null_url_rewriter_spec.rb +2 -2
- data/spec/lib/roadie/path_rewriter_provider_spec.rb +4 -4
- data/spec/lib/roadie/provider_list_spec.rb +25 -21
- data/spec/lib/roadie/selector_spec.rb +4 -4
- data/spec/lib/roadie/style_attribute_builder_spec.rb +5 -5
- data/spec/lib/roadie/style_block_spec.rb +1 -1
- data/spec/lib/roadie/style_property_spec.rb +8 -8
- data/spec/lib/roadie/stylesheet_spec.rb +2 -20
- data/spec/lib/roadie/test_provider_spec.rb +4 -4
- data/spec/lib/roadie/url_generator_spec.rb +1 -1
- data/spec/lib/roadie/url_rewriter_spec.rb +6 -4
- data/spec/spec_helper.rb +8 -8
- data/spec/support/have_attribute_matcher.rb +1 -2
- data/spec/support/have_node_matcher.rb +3 -3
- data/spec/support/have_selector_matcher.rb +2 -3
- data/spec/support/have_styling_matcher.rb +10 -11
- data/spec/support/have_xpath_matcher.rb +2 -3
- metadata +22 -21
- data/.travis.yml +0 -20
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
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.
|
37
|
+
if response.is_a? Net::HTTPSuccess
|
38
38
|
Stylesheet.new(url, response_body(response))
|
39
39
|
else
|
40
|
-
raise CssNotFound.new(
|
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
|
47
|
-
|
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(
|
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 ==
|
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[
|
109
|
+
supplied_charset = response.type_params["charset"]
|
96
110
|
body = response.body
|
97
111
|
|
98
112
|
if supplied_charset
|
data/lib/roadie/null_provider.rb
CHANGED
@@ -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)
|
10
|
-
|
9
|
+
def find_stylesheet(name)
|
10
|
+
empty_stylesheet
|
11
|
+
end
|
11
12
|
|
12
|
-
def
|
13
|
-
|
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
|
-
|
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)
|
11
|
-
|
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
|
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
|
data/lib/roadie/provider_list.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
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.
|
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
|
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
|
-
|
59
|
-
|
60
|
-
|
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(
|
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
|
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
|
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
data/lib/roadie/selector.rb
CHANGED
@@ -37,9 +37,17 @@ module Roadie
|
|
37
37
|
!(pseudo_element? || at_rule? || pseudo_function?)
|
38
38
|
end
|
39
39
|
|
40
|
-
def to_s
|
41
|
-
|
42
|
-
|
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
|
data/lib/roadie/style_block.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
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
|
-
"#{
|
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"
|
data/lib/roadie/stylesheet.rb
CHANGED
@@ -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(
|
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
|
data/lib/roadie/url_generator.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
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
|
-
|
27
|
-
|
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?
|
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(
|
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
|
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,
|
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
|
data/lib/roadie/url_rewriter.rb
CHANGED
@@ -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?(
|
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
|
-
|
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
|
13
|
+
return true if %r{^(\w+:|//)}.match?(path)
|
14
14
|
|
15
15
|
begin
|
16
16
|
!URI.parse(path).relative?
|
data/lib/roadie/version.rb
CHANGED
data/lib/roadie.rb
CHANGED
@@ -3,30 +3,30 @@
|
|
3
3
|
module Roadie
|
4
4
|
end
|
5
5
|
|
6
|
-
require
|
7
|
-
require
|
6
|
+
require "roadie/version"
|
7
|
+
require "roadie/errors"
|
8
8
|
|
9
|
-
require
|
10
|
-
require
|
9
|
+
require "roadie/utils"
|
10
|
+
require "roadie/deduplicator"
|
11
11
|
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
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
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
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
|
27
|
-
require
|
28
|
-
require
|
29
|
-
require
|
30
|
-
require
|
31
|
-
require
|
32
|
-
require
|
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
|
-
#
|
2
|
+
# frozen_string_literal: true
|
4
3
|
|
5
4
|
$:.push File.expand_path("../lib", __FILE__)
|
6
|
-
require
|
5
|
+
require "roadie/version"
|
7
6
|
|
8
7
|
Gem::Specification.new do |s|
|
9
|
-
s.name
|
10
|
-
s.version
|
11
|
-
s.platform
|
12
|
-
s.authors
|
13
|
-
s.email
|
14
|
-
s.homepage
|
15
|
-
s.summary
|
16
|
-
s.description =
|
17
|
-
s.license
|
18
|
-
|
19
|
-
s.required_ruby_version = ">= 2.
|
20
|
-
|
21
|
-
s.add_dependency
|
22
|
-
s.add_dependency
|
23
|
-
|
24
|
-
s.add_development_dependency
|
25
|
-
s.add_development_dependency
|
26
|
-
s.add_development_dependency
|
27
|
-
s.add_development_dependency
|
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
|
33
|
-
s.test_files
|
31
|
+
s.files = `git ls-files`.split("\n")
|
32
|
+
s.test_files = `git ls-files -- spec/*`.split("\n")
|
34
33
|
end
|
35
|
-
|