roadie 3.0.3 → 3.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f4f6223eab7dab406f618cdc4de6561112c38883
4
- data.tar.gz: 2ecab891c4958a775437dae141628055982591ff
3
+ metadata.gz: 5824c94736e27c2a19d255fe99c7083ad42772b7
4
+ data.tar.gz: 0c8a41f35860a127e707f6fa115bb15399dbed8d
5
5
  SHA512:
6
- metadata.gz: 7c04785fd8b911957558447ca928e7001e6602ee2e98a659124b8173b7238f5e4f9ff7ee9dea71b1dade51720e007a44d142310989d5996db63845ec4316dbad
7
- data.tar.gz: 2e4e7ac1b09251ec08f1af1024b6614ea6c3663752066241063d8827faebc8782752abc6e51f140b047edcea62b9877e49520193e809b020563a20a96101aeb6
6
+ metadata.gz: 031ee1cede388f42a4bfbb05ecddcfaf7d42867e28f9e1f08e5645a6fc24efe5dc0a113553ceb6c987eb844ff1fc53e2814eb656ad9ea03709f68662d4f8dc2a
7
+ data.tar.gz: 290f00e6c0be0773af92d676ec8e7fa4524ecdad17c688ed5fbddc5afd88a7425779cf589f51822270ebc9f6936cf20f417fc2ff79b0aa0b625db63297959488
data/Changelog.md CHANGED
@@ -1,9 +1,16 @@
1
1
  ### dev
2
2
 
3
- [full changelog](https://github.com/Mange/roadie/compare/v3.0.3...master)
3
+ [full changelog](https://github.com/Mange/roadie/compare/v3.0.4...master)
4
4
 
5
5
  * Nothing yet.
6
6
 
7
+ ### 3.0.4
8
+
9
+ [full changelog](https://github.com/Mange/roadie/compare/v3.0.3...v3.0.4)
10
+
11
+ * Bug fixes:
12
+ * Schemeless URLs was accepted as-is, which isn't supported in a lot of email clients. (#104)
13
+
7
14
  ### 3.0.3
8
15
 
9
16
  [full changelog](https://github.com/Mange/roadie/compare/v3.0.2...v3.0.3)
data/README.md CHANGED
@@ -253,6 +253,14 @@ This project follows [Semantic Versioning](http://semver.org/) and has been sinc
253
253
  FAQ
254
254
  ---
255
255
 
256
+ ### Why is my markup changed in subtle ways?
257
+
258
+ Roadie uses Nokogiri to parse and regenerate the HTML of your email, which means that some unintentional changes might show up.
259
+
260
+ One example would be that Nokogiri might remove your ` `s in some cases.
261
+
262
+ Another example is Nokogiri's lack of HTML5 support, so certain new element might have spaces removed. I recommend you don't use HTML5 in emails anyway because of bad email client support (that includes web mail!).
263
+
256
264
  ### I'm getting segmentation faults (or other C-like problems)! What should I do? ###
257
265
 
258
266
  Roadie uses Nokogiri to parse the HTML of your email, so any C-like problems like segfaults are likely in that end. The best way to fix this is to first upgrade libxml2 on your system and then reinstall Nokogiri.
@@ -26,6 +26,7 @@ module Roadie
26
26
  validate_options url_options
27
27
 
28
28
  @url_options = url_options
29
+ @scheme = normalize_scheme(url_options[:scheme] || url_options[:protocol])
29
30
  @root_uri = build_root_uri
30
31
  end
31
32
 
@@ -55,21 +56,25 @@ module Roadie
55
56
  # @return [String] an absolute URL
56
57
  def generate_url(path, base = "/")
57
58
  return root_uri.to_s if path.nil? or path.empty?
59
+ return add_scheme(path) if path_is_schemeless?(path)
58
60
  return path if path_is_absolute?(path)
59
61
 
60
62
  combine_segments(root_uri, base, path).to_s
61
63
  end
62
64
 
63
65
  private
64
- attr_reader :root_uri
66
+ attr_reader :root_uri, :scheme
65
67
 
66
68
  def build_root_uri
67
69
  path = make_absolute url_options[:path]
68
70
  port = parse_port url_options[:port]
69
- scheme = normalize_scheme(url_options[:scheme] || url_options[:protocol])
70
71
  URI::Generic.build(scheme: scheme, host: url_options[:host], port: port, path: path)
71
72
  end
72
73
 
74
+ def add_scheme(path)
75
+ [scheme, path].join(":")
76
+ end
77
+
73
78
  def combine_segments(root, base, path)
74
79
  new_path = apply_base(base, path)
75
80
  if root.path
@@ -104,12 +109,18 @@ module Roadie
104
109
  end
105
110
  end
106
111
 
112
+ def path_is_schemeless?(path)
113
+ path =~ %r{^//\w}
114
+ end
115
+
107
116
  def path_is_absolute?(path)
108
117
  # Ruby's URI is pretty unforgiving, but roadie aims to be. Don't involve
109
118
  # URI for URLs that's easy to determine to be absolute.
110
- # URLs starting with a scheme (http:, data:) are absolute, as is URLs
111
- # start start with double slashes (//css/app.css).
112
- path =~ %r{^(\w+:|//)} || !parse_path(path).relative?
119
+ # URLs starting with a scheme (http:, data:) are absolute.
120
+ #
121
+ # URLs that start with double slashes (//css/app.css) are also absolute
122
+ # in modern browsers, but most email clients do not understand them it.
123
+ path =~ %r{^\w+:} || !parse_path(path).relative?
113
124
  end
114
125
 
115
126
  def parse_path(path)
@@ -1,3 +1,3 @@
1
1
  module Roadie
2
- VERSION = '3.0.3'
2
+ VERSION = '3.0.4'
3
3
  end
@@ -92,10 +92,6 @@ module Roadie
92
92
  expect(url(data_uri, host: "example.com")).to eq(data_uri)
93
93
  end
94
94
 
95
- it "does not touch absolute URLs without schemes" do
96
- expect(url("//assets.myapp.com/foo.jpg", host: "example.com")).to eq("//assets.myapp.com/foo.jpg")
97
- end
98
-
99
95
  it "does not touch custom schemes" do
100
96
  expect(url("myapp://", host: "example.com")).to eq("myapp://")
101
97
  end
@@ -106,6 +102,30 @@ module Roadie
106
102
  # markers.
107
103
  expect(url("https://foo.com/%|MARKETING_TOKEN|%", host: "example.com")).to eq("https://foo.com/%|MARKETING_TOKEN|%")
108
104
  end
105
+
106
+ # A lot of email clients do not support schemeless URLs (it's a HTML5
107
+ # feature) so we should add a scheme to them.
108
+ context "on schemeless urls" do
109
+ # Checking for host matches would be too complex, and it's not too hard
110
+ # to assume that schemeless URLs to assets comes from a shared
111
+ # configuration with a web page which uses HTTP and HTTPS in different
112
+ # cases. That also means that we'd like to match the assets URLs with
113
+ # whatever we want to link to, most likely.
114
+ it "adds given scheme, even when host does not match" do
115
+ result = url("//assets.myapp.com/foo.jpg", host: "example.com", scheme: "https")
116
+ expect(result).to eq("https://assets.myapp.com/foo.jpg")
117
+ end
118
+
119
+ it "adds standard http: scheme when no scheme given" do
120
+ result = url("//assets.myapp.com/foo.jpg", host: "example.com")
121
+ expect(result).to eq("http://assets.myapp.com/foo.jpg")
122
+ end
123
+
124
+ it "adds scheme to invalid URLs" do
125
+ result = url("//foo.com/%|TOKEN|%", scheme: "ftp", host: "example.com")
126
+ expect(result).to eq("ftp://foo.com/%|TOKEN|%")
127
+ end
128
+ end
109
129
  end
110
130
 
111
131
  # URLs in resources that are not based inside the root requires that we may
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roadie
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.3
4
+ version: 3.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Magnus Bergmark
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-04 00:00:00.000000000 Z
11
+ date: 2015-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri