diversion 0.0.1

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 (83) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +193 -0
  6. data/Rakefile +7 -0
  7. data/diversion.gemspec +40 -0
  8. data/lib/diversion.rb +35 -0
  9. data/lib/diversion/client.rb +21 -0
  10. data/lib/diversion/configurable.rb +100 -0
  11. data/lib/diversion/decode.rb +21 -0
  12. data/lib/diversion/decode/json.rb +47 -0
  13. data/lib/diversion/decode/params.rb +55 -0
  14. data/lib/diversion/encode.rb +67 -0
  15. data/lib/diversion/encode/json.rb +31 -0
  16. data/lib/diversion/encode/params.rb +26 -0
  17. data/lib/diversion/error.rb +2 -0
  18. data/lib/diversion/error/bad_url_data_format.rb +6 -0
  19. data/lib/diversion/error/configuration_error.rb +6 -0
  20. data/lib/diversion/error/key_missing_error.rb +6 -0
  21. data/lib/diversion/error/uri_missing_error.rb +6 -0
  22. data/lib/diversion/mailer.rb +11 -0
  23. data/lib/diversion/signing.rb +19 -0
  24. data/lib/diversion/url.rb +43 -0
  25. data/lib/diversion/version.rb +17 -0
  26. data/spec/coverage/assets/0.7.1/application.css +1110 -0
  27. data/spec/coverage/assets/0.7.1/application.js +626 -0
  28. data/spec/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
  29. data/spec/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
  30. data/spec/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
  31. data/spec/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
  32. data/spec/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
  33. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
  34. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
  35. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
  36. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
  37. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
  38. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
  39. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
  40. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
  41. data/spec/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
  42. data/spec/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
  43. data/spec/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
  44. data/spec/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
  45. data/spec/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
  46. data/spec/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
  47. data/spec/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
  48. data/spec/coverage/assets/0.7.1/favicon_green.png +0 -0
  49. data/spec/coverage/assets/0.7.1/favicon_red.png +0 -0
  50. data/spec/coverage/assets/0.7.1/favicon_yellow.png +0 -0
  51. data/spec/coverage/assets/0.7.1/loading.gif +0 -0
  52. data/spec/coverage/assets/0.7.1/magnify.png +0 -0
  53. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  54. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  55. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  56. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  57. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  58. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  59. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  60. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  61. data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
  62. data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  63. data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
  64. data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
  65. data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  66. data/spec/coverage/index.html +3146 -0
  67. data/spec/diversion/client_spec.rb +23 -0
  68. data/spec/diversion/configurable_spec.rb +128 -0
  69. data/spec/diversion/decode/json_decode_spec.rb +70 -0
  70. data/spec/diversion/decode/params_decode_spec.rb +74 -0
  71. data/spec/diversion/decode_spec.rb +12 -0
  72. data/spec/diversion/encode/json_encode_spec.rb +39 -0
  73. data/spec/diversion/encode/params_encode_spec.rb +39 -0
  74. data/spec/diversion/encode_spec.rb +30 -0
  75. data/spec/diversion/mailer_spec.rb +31 -0
  76. data/spec/diversion/support/global_shared_context.rb +29 -0
  77. data/spec/diversion/url_spec.rb +36 -0
  78. data/spec/fixtures/mail.html +13 -0
  79. data/spec/fixtures/sample_email.multipart +39 -0
  80. data/spec/fixtures/sample_email.text +12 -0
  81. data/spec/spec_helper.rb +84 -0
  82. metadata +323 -0
  83. metadata.gz.sig +0 -0
@@ -0,0 +1,29 @@
1
+ def use_json
2
+ { :url_encoding => Diversion::Encode::Json, :url_decoding => Diversion::Decode::Json }
3
+ end
4
+
5
+ def use_params
6
+ { :url_encoding => Diversion::Encode::Params, :url_decoding => Diversion::Decode::Params }
7
+ end
8
+
9
+ shared_context 'json' do
10
+ let(:client) { @client ||= Diversion::Client.new(use_json) }
11
+ let(:client_sign) { @client ||= Diversion::Client.new(use_json.merge({:sign_length => 32, :sign_key => SIGN_KEY})) }
12
+ let(:encode_email) { @email = client.encode(fixture('mail.html').read, {:a => 1}) }
13
+ let(:encode_json_html) { client.encode(HTML) }
14
+ let(:encode_json_html_signed) { client_sign.encode(HTML) }
15
+ let(:decode_json) { client.decode(JSON_ENCODED) }
16
+ let(:decode_json_signed) { client_sign.decode(JSON_ENCODED_SIGNED) }
17
+ let(:decode_json_bad_key) { client_sign.decode(JSON_ENCODED_SIGNED_KEY_BAD) }
18
+ end
19
+
20
+ shared_context 'params' do
21
+ let(:client) { Diversion::Client.new(use_params) }
22
+ let(:client_sign) { Diversion::Client.new(use_params.merge({:sign_length => 32, :sign_key => SIGN_KEY})) }
23
+ let(:encode_email) { @email = client.encode(fixture('mail.html').read, {:a => 1}) }
24
+ let(:encode_params_html) { client.encode(HTML) }
25
+ let(:encode_params_html_signed) { client_sign.encode(HTML) }
26
+ let(:decode_params) { client.decode(PARAMS_ENCODED) }
27
+ let(:decode_params_signed) { client_sign.decode(PARAMS_ENCODED_SIGNED) }
28
+ let(:decode_params_bad_key) { client_sign.decode(PARAMS_ENCODED_SIGNED_KEY_BAD) }
29
+ end
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+
3
+ describe Diversion::Url do
4
+
5
+ # long enough to line break with older routines
6
+ QUICK_BROWN_TEXT = "https://www.google.co.uk/search?q=if+%240+%3D~+%2Fgem%5Cz%2F&oq=if+%240+%3D~+%2Fgem%5Cz%2F&aqs=chrome.0.57j62l3.352&sourceid=chrome&ie=UTF-8"
7
+ # encoded result from 1.9.3
8
+ QUICK_BROWN_ENCODED = Diversion::Url::escape("aHR0cHM6Ly93d3cuZ29vZ2xlLmNvLnVrL3NlYXJjaD9xPWlmKyUyNDArJTNEfislMkZnZW0lNUN6JTJGJm9xPWlmKyUyNDArJTNEfislMkZnZW0lNUN6JTJGJmFxcz1jaHJvbWUuMC41N2o2MmwzLjM1MiZzb3VyY2VpZD1jaHJvbWUmaWU9VVRGLTg=")
9
+
10
+ # this tests our assumption that we can encode/decode as we'd expect
11
+ it "can encode/decode URL successfully" do
12
+ attrs = { :test => 1234, :url => 'http://somewhere.over.rainbow'}
13
+ url = "d=#{CGI::escape(attrs.to_param)}&s=testkey"
14
+ parsed = CGI::parse(url)
15
+ #puts parsed
16
+ expect(parsed.length).to eq(2)
17
+ expect(parsed.has_key?('d')).to be_true
18
+ expect(parsed.has_key?('s')).to be_true
19
+ expect(parsed.has_key?('url')).to be_false
20
+ expect(parsed.has_key?('test')).to be_false
21
+ expect(parsed['s'].first).to eq("testkey")
22
+ data = CGI::parse(parsed['d'].first)
23
+ #puts data
24
+ expect(data['test'].first).to eq("1234")
25
+ expect(data['url'].first).to eq("http://somewhere.over.rainbow")
26
+ end
27
+
28
+ it "encodes correctly" do
29
+ expect(subject.encode_url(QUICK_BROWN_TEXT)).to eq(QUICK_BROWN_ENCODED)
30
+ end
31
+
32
+ it "decodes correctly" do
33
+ expect(subject.decode_url(QUICK_BROWN_ENCODED)).to eq(QUICK_BROWN_TEXT)
34
+ end
35
+
36
+ end
@@ -0,0 +1,13 @@
1
+ <p>Dear User</p>
2
+
3
+ <p>This is a test email</p>
4
+
5
+ <p>
6
+ <a data-n="r" href="https://twitter.com/intent/tweet?in_reply_to=51113028241989632">Reply</a>
7
+ <a data-n="rt" href="https://twitter.com/intent/retweet?tweet_id=51113028241989632">Retweet</a>
8
+ <a data-n="f" href="https://twitter.com/intent/favorite?tweet_id=51113028241989632">Favorite</a>
9
+ </p>
10
+
11
+ <p>Mail: <a href="mailto:jess@doesnotexist.domain">Send us an email</a></p>
12
+
13
+ <p><a href="http://visit.our-homepage.com/">Visit our homepage</a></p>
@@ -0,0 +1,39 @@
1
+
2
+ Delivered-To: nobody@no.where
3
+ Date: Tue, 02 Apr 2013 00:00:42 +0100
4
+ From: Mr Fixture <hi@fixtures.nowhere>
5
+ To: nobody@no.where
6
+ Message-ID: <515a119a3b0af_728046196223316bf@pinpoint.mail>
7
+ Subject: Test fixture
8
+ Mime-Version: 1.0
9
+ Content-Type: multipart/alternative;
10
+ boundary="--==_mimepart_515a119a33ca7_728046196223313b8";
11
+ charset=UTF-8
12
+ Content-Transfer-Encoding: 7bit
13
+
14
+
15
+
16
+ ----==_mimepart_515a119a33ca7_728046196223313b8
17
+ Date: Tue, 02 Apr 2013 00:00:42 +0100
18
+ Mime-Version: 1.0
19
+ Content-Type: text/plain;
20
+ charset=UTF-8
21
+ Content-Transfer-Encoding: 7bit
22
+ Content-ID: <515a119a38906_72804619622331456@pinpoint.mail>
23
+
24
+ http://www.youtube.com/watch?v=FE_9CzLCbkY
25
+ https://www.youtube.com/watch?v=OyQ6pqPFwTI
26
+
27
+ ----==_mimepart_515a119a33ca7_728046196223313b8
28
+ Date: Tue, 02 Apr 2013 00:00:42 +0100
29
+ Mime-Version: 1.0
30
+ Content-Type: text/html;
31
+ charset=UTF-8
32
+ Content-Transfer-Encoding: 7bit
33
+ Content-ID: <515a119a39da8_728046196223315fd@pinpoint.mail>
34
+
35
+ <a href="http://www.youtube.com/watch?v=FE_9CzLCbkY">Dream of the 90s</a>
36
+ <a href="https://www.youtube.com/watch?v=OyQ6pqPFwTI">Customers only</a>
37
+
38
+
39
+ ----==_mimepart_515a119a33ca7_728046196223313b8--
@@ -0,0 +1,12 @@
1
+
2
+ Delivered-To: nobody@no.where
3
+ Date: Tue, 02 Apr 2013 00:00:42 +0100
4
+ From: Mr Fixture <hi@fixtures.nowhere>
5
+ To: nobody@no.where
6
+ Message-ID: <515a119a3b0af_728046196223316bf@pinpoint.mail>
7
+ Subject: Test fixture
8
+
9
+
10
+ http://www.youtube.com/watch?v=FE_9CzLCbkY
11
+ http://www.youtube.com/watch?v=OyQ6pqPFwTI
12
+
@@ -0,0 +1,84 @@
1
+ require 'simplecov'
2
+ require 'coveralls'
3
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
4
+ SimpleCov::Formatter::HTMLFormatter,
5
+ Coveralls::SimpleCov::Formatter
6
+ ]
7
+ if RUBY_VERSION >= '1.9'
8
+ SimpleCov.start do
9
+ add_group 'Libraries', 'lib'
10
+ add_group 'Spec', 'spec'
11
+ end
12
+ end
13
+
14
+ require 'action_mailer'
15
+ require 'mail'
16
+
17
+ require "diversion"
18
+ require 'diversion/support/global_shared_context'
19
+
20
+ SIGN_KEY = "abcdefghijklmnopqrstuvwzxy"
21
+
22
+ HTML = '<a data-test="1234" href="http://test.com/test">test</a>'
23
+ HTML_ATTRIBS = { :test => 1234, :url => 'http://test.com/test'}
24
+
25
+ DEFAULT_SIGN_LEN = 32
26
+ KEY_BAD = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
27
+
28
+ #json
29
+ JSON_RAW = HTML_ATTRIBS.to_json
30
+ JSON_ENCODED = Diversion::Url::encode_url(JSON_RAW)
31
+ JSON_HTML = "<a href=\"http://localhost.domain/redirect/1/#{JSON_ENCODED}\">test</a>"
32
+ JSON_KEY = HMAC::MD5.new(SIGN_KEY).update(JSON_RAW).hexdigest[0..DEFAULT_SIGN_LEN-1]
33
+ JSON_KEY_BAD = KEY_BAD
34
+ JSON_ENCODED_SIGNED = "#{JSON_ENCODED}-#{JSON_KEY}"
35
+ JSON_ENCODED_SIGNED_KEY_BAD = "#{JSON_ENCODED}-#{JSON_KEY_BAD}"
36
+
37
+ # params
38
+ PARAMS_KEY = '6b18e4b2864ab25c7fde6116eb942080'
39
+ PARAMS_KEY_BAD = KEY_BAD
40
+ PARAMS_ENCODED = "d=#{CGI::escape(HTML_ATTRIBS.to_param)}"
41
+ PARAMS_ENCODED_SIGNED = "#{PARAMS_ENCODED}&s=6b18e4b2864ab25c7fde6116eb942080"
42
+ PARAMS_ENCODED_SIGNED_KEY_BAD = "#{PARAMS_ENCODED}&s=#{PARAMS_KEY_BAD}"
43
+
44
+ RSpec.configure do |config|
45
+ config.expect_with :rspec do |c|
46
+ c.syntax = :expect
47
+ end
48
+ config.color_enabled = true
49
+ end
50
+
51
+ def fixture_path
52
+ File.expand_path("../fixtures", __FILE__)
53
+ end
54
+
55
+ def fixture(file)
56
+ File.new(fixture_path + '/' + file)
57
+ end
58
+
59
+ def sample_default_opts
60
+ { :port => 80, :sign_length => 0 }
61
+ end
62
+
63
+ def html_json_encoded(opts = {})
64
+ opts = sample_default_opts.merge(opts)
65
+ key = ""
66
+ unless opts[:sign_length] == 0
67
+ key = "-#{JSON_KEY[0..opts[:sign_length]-1]}"
68
+ end
69
+ return "<a href=\"http://localhost.domain/redirect/1/#{JSON_ENCODED}#{key}\">test</a>" if opts[:port] == 80
70
+ "<a href=\"http://localhost.domain:#{opts[:port]}/redirect/1/#{JSON_ENCODED}#{key}\">test</a>"
71
+ end
72
+
73
+ def html_params_encoded(opts = {})
74
+ opts = sample_default_opts.merge(opts)
75
+ if opts[:sign_length] == 0
76
+ path = PARAMS_ENCODED
77
+ else
78
+ path = PARAMS_ENCODED_SIGNED
79
+ key = "#{PARAMS_KEY[0..opts[:sign_length]-1]}"
80
+ path = path.gsub(PARAMS_KEY, key)
81
+ end
82
+ return "<a href=\"http://localhost.domain/redirect/1/?#{path}\">test</a>" if opts[:port] == 80
83
+ "<a href=\"http://localhost.domain:#{opts[:port]}/redirect/1/?#{path}\">test</a>"
84
+ end
metadata ADDED
@@ -0,0 +1,323 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: diversion
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Richard Hollis
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMRMwEQYDVQQDDApyaWNo
14
+ aG9sbGlzMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNj
15
+ b20wHhcNMTMwNDAyMTEzODA0WhcNMTQwNDAyMTEzODA0WjBBMRMwEQYDVQQDDApy
16
+ aWNoaG9sbGlzMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZ
17
+ FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9lueRqZlS9BWQ
18
+ KM2Vt8Ajc7goi4mivw+QfuQTbkk3quGuF/ZFrQuyh/N+GXKJmIt/GPoDphVUOBGo
19
+ nDMd10NAIdQzHsOzElTAZi85KonMJ8KUG3JTqnomNFjKtxdVSTyi4COSpSemT6Y1
20
+ WglANxXyG2PtUOypsMjdDmDrZ0zx0N/+Ovg5lGh862f6rDQDk1EGsdUAa1E7cGGu
21
+ FCIBimJ5t/YX86g0+XedXcMeu8neb7zjIb0TaH5p5N/+hRwWh155kt8EsP9Grz7t
22
+ SWhepZAEkLouOmUxPD+HdiqjG2ZpwPoANL6VxcikwSNWnLyt2rlVTmpzQO+xxLlk
23
+ XgC2R1S5AgMBAAGjOTA3MAkGA1UdEwQCMAAwHQYDVR0OBBYEFJV4Ds/CQpyNum5L
24
+ DxPQvQACsLuGMAsGA1UdDwQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAbzLguX6N
25
+ G6SZEdxRpjjOyMx7pPqcekb5cz/wkdAA/dL/FMFiYzrVOanY/dkrjjpTjy8AfT5S
26
+ nzRKDy+iNiI0BZt6SwQT0I1PAeNnwLeGcMpSLHnlKkxRfKTdce13YcfOUB+XYLBD
27
+ XhleuPSPnlUp74T4V4+/NjPd3zMBaUtxrPiL37Uf/l7pahAb8bIgRxdL7tZpWTKS
28
+ jMxngAUA3bN08JNJlGZV8l+Ivh9pqExtsQ3XOHjXKKaw3kyrVcOSFUud1sA+6vzt
29
+ AoGuclv0sqJvLuOBsZ0NvEczKVNXG6a/5yR3B+JwmMwFq1nf637VMChIMcLkLL2U
30
+ 1ABC6ICOYHjTWQ==
31
+ -----END CERTIFICATE-----
32
+ date: 2013-04-08 00:00:00.000000000 Z
33
+ dependencies:
34
+ - !ruby/object:Gem::Dependency
35
+ name: activesupport
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - - <
42
+ - !ruby/object:Gem::Version
43
+ version: '4.1'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '3.0'
51
+ - - <
52
+ - !ruby/object:Gem::Version
53
+ version: '4.1'
54
+ - !ruby/object:Gem::Dependency
55
+ name: nokogiri
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: ruby-hmac
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: multi_json
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ version: '1.0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ~>
94
+ - !ruby/object:Gem::Version
95
+ version: '1.0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: actionmailer
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '3.0'
103
+ - - <
104
+ - !ruby/object:Gem::Version
105
+ version: '4.1'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '3.0'
113
+ - - <
114
+ - !ruby/object:Gem::Version
115
+ version: '4.1'
116
+ - !ruby/object:Gem::Dependency
117
+ name: rspec
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - '>='
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - '>='
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ - !ruby/object:Gem::Dependency
131
+ name: simplecov
132
+ requirement: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ type: :development
138
+ prerelease: false
139
+ version_requirements: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - '>='
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ - !ruby/object:Gem::Dependency
145
+ name: coveralls
146
+ requirement: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ type: :development
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ description: Redirect HTML links through your preferred redirection URL
159
+ email:
160
+ - richhollis@gmail.com
161
+ executables: []
162
+ extensions: []
163
+ extra_rdoc_files: []
164
+ files:
165
+ - LICENSE.txt
166
+ - README.md
167
+ - Rakefile
168
+ - diversion.gemspec
169
+ - lib/diversion.rb
170
+ - lib/diversion/version.rb
171
+ - lib/diversion/error.rb
172
+ - lib/diversion/url.rb
173
+ - lib/diversion/signing.rb
174
+ - lib/diversion/mailer.rb
175
+ - lib/diversion/decode/json.rb
176
+ - lib/diversion/decode/params.rb
177
+ - lib/diversion/encode/json.rb
178
+ - lib/diversion/encode/params.rb
179
+ - lib/diversion/error/key_missing_error.rb
180
+ - lib/diversion/error/bad_url_data_format.rb
181
+ - lib/diversion/error/configuration_error.rb
182
+ - lib/diversion/error/uri_missing_error.rb
183
+ - lib/diversion/encode.rb
184
+ - lib/diversion/client.rb
185
+ - lib/diversion/configurable.rb
186
+ - lib/diversion/decode.rb
187
+ - spec/spec_helper.rb
188
+ - spec/diversion/client_spec.rb
189
+ - spec/diversion/decode_spec.rb
190
+ - spec/diversion/support/global_shared_context.rb
191
+ - spec/diversion/mailer_spec.rb
192
+ - spec/diversion/url_spec.rb
193
+ - spec/diversion/decode/params_decode_spec.rb
194
+ - spec/diversion/decode/json_decode_spec.rb
195
+ - spec/diversion/encode/json_encode_spec.rb
196
+ - spec/diversion/encode/params_encode_spec.rb
197
+ - spec/diversion/encode_spec.rb
198
+ - spec/diversion/configurable_spec.rb
199
+ - spec/fixtures/sample_email.multipart
200
+ - spec/fixtures/mail.html
201
+ - spec/fixtures/sample_email.text
202
+ - spec/coverage/assets/0.7.1/favicon_red.png
203
+ - spec/coverage/assets/0.7.1/application.js
204
+ - spec/coverage/assets/0.7.1/magnify.png
205
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
206
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
207
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png
208
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png
209
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
210
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png
211
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
212
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png
213
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
214
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png
215
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
216
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
217
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png
218
+ - spec/coverage/assets/0.7.1/application.css
219
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png
220
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png
221
+ - spec/coverage/assets/0.7.1/fancybox/fancy_title_right.png
222
+ - spec/coverage/assets/0.7.1/fancybox/blank.gif
223
+ - spec/coverage/assets/0.7.1/fancybox/fancy_nav_left.png
224
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png
225
+ - spec/coverage/assets/0.7.1/fancybox/fancy_nav_right.png
226
+ - spec/coverage/assets/0.7.1/fancybox/fancy_title_main.png
227
+ - spec/coverage/assets/0.7.1/fancybox/fancy_title_left.png
228
+ - spec/coverage/assets/0.7.1/fancybox/fancy_close.png
229
+ - spec/coverage/assets/0.7.1/fancybox/fancybox.png
230
+ - spec/coverage/assets/0.7.1/fancybox/fancy_loading.png
231
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png
232
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png
233
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png
234
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png
235
+ - spec/coverage/assets/0.7.1/fancybox/fancybox-y.png
236
+ - spec/coverage/assets/0.7.1/fancybox/fancy_title_over.png
237
+ - spec/coverage/assets/0.7.1/fancybox/fancybox-x.png
238
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png
239
+ - spec/coverage/assets/0.7.1/favicon_yellow.png
240
+ - spec/coverage/assets/0.7.1/loading.gif
241
+ - spec/coverage/assets/0.7.1/favicon_green.png
242
+ - spec/coverage/index.html
243
+ homepage: https://github.com/richhollis/diversion/
244
+ licenses:
245
+ - MIT
246
+ metadata: {}
247
+ post_install_message:
248
+ rdoc_options: []
249
+ require_paths:
250
+ - lib
251
+ required_ruby_version: !ruby/object:Gem::Requirement
252
+ requirements:
253
+ - - '>='
254
+ - !ruby/object:Gem::Version
255
+ version: '0'
256
+ required_rubygems_version: !ruby/object:Gem::Requirement
257
+ requirements:
258
+ - - '>='
259
+ - !ruby/object:Gem::Version
260
+ version: '0'
261
+ requirements: []
262
+ rubyforge_project:
263
+ rubygems_version: 2.0.0.rc.2
264
+ signing_key:
265
+ specification_version: 4
266
+ summary: Redirect HTML links through your preferred redirection URL
267
+ test_files:
268
+ - spec/spec_helper.rb
269
+ - spec/diversion/client_spec.rb
270
+ - spec/diversion/decode_spec.rb
271
+ - spec/diversion/support/global_shared_context.rb
272
+ - spec/diversion/mailer_spec.rb
273
+ - spec/diversion/url_spec.rb
274
+ - spec/diversion/decode/params_decode_spec.rb
275
+ - spec/diversion/decode/json_decode_spec.rb
276
+ - spec/diversion/encode/json_encode_spec.rb
277
+ - spec/diversion/encode/params_encode_spec.rb
278
+ - spec/diversion/encode_spec.rb
279
+ - spec/diversion/configurable_spec.rb
280
+ - spec/fixtures/sample_email.multipart
281
+ - spec/fixtures/mail.html
282
+ - spec/fixtures/sample_email.text
283
+ - spec/coverage/assets/0.7.1/favicon_red.png
284
+ - spec/coverage/assets/0.7.1/application.js
285
+ - spec/coverage/assets/0.7.1/magnify.png
286
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
287
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
288
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png
289
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png
290
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
291
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png
292
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
293
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png
294
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
295
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png
296
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
297
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
298
+ - spec/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png
299
+ - spec/coverage/assets/0.7.1/application.css
300
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png
301
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png
302
+ - spec/coverage/assets/0.7.1/fancybox/fancy_title_right.png
303
+ - spec/coverage/assets/0.7.1/fancybox/blank.gif
304
+ - spec/coverage/assets/0.7.1/fancybox/fancy_nav_left.png
305
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png
306
+ - spec/coverage/assets/0.7.1/fancybox/fancy_nav_right.png
307
+ - spec/coverage/assets/0.7.1/fancybox/fancy_title_main.png
308
+ - spec/coverage/assets/0.7.1/fancybox/fancy_title_left.png
309
+ - spec/coverage/assets/0.7.1/fancybox/fancy_close.png
310
+ - spec/coverage/assets/0.7.1/fancybox/fancybox.png
311
+ - spec/coverage/assets/0.7.1/fancybox/fancy_loading.png
312
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png
313
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png
314
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png
315
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png
316
+ - spec/coverage/assets/0.7.1/fancybox/fancybox-y.png
317
+ - spec/coverage/assets/0.7.1/fancybox/fancy_title_over.png
318
+ - spec/coverage/assets/0.7.1/fancybox/fancybox-x.png
319
+ - spec/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png
320
+ - spec/coverage/assets/0.7.1/favicon_yellow.png
321
+ - spec/coverage/assets/0.7.1/loading.gif
322
+ - spec/coverage/assets/0.7.1/favicon_green.png
323
+ - spec/coverage/index.html