ahoy_email 2.3.0 → 2.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 55896391d55a0158cdf032a2d7a29860984db55a4c116b96317e8986acdef143
4
- data.tar.gz: 6c1c742d62fa0c2b2b62832dc0030fa7dad31839fc5e015f3806766c14ce9804
3
+ metadata.gz: e11cd64d52d35113df4fe7e29042683f3f5de6aa256ef75ae8f8455d2d1eec1f
4
+ data.tar.gz: f38baf49086ddaa1759243644074da6486cddbb0793c1d71e93e352228f12b66
5
5
  SHA512:
6
- metadata.gz: 411579c14c08b65b59aaf34dafa6e37e0fdff00acc2232eb9962c31ce7077826aa228d3e7e7b09f657b2e6a2542b003b005e43237106b162ffd60930a13e9cf8
7
- data.tar.gz: a042562ba6f0a1ed0e342f823bd75b7960fdae2490699f02cbfd1320f81fd82cd19bdaabb437369825701656eb78f5a1663a14ccf918c28605257c3af966dbbf
6
+ metadata.gz: dd32bc570175e43d4b601d1b6bf7289f44c51912fe3b5f3fafc86cfbd505a4aa40b8c7ea224cfa0c29d790d0d9994acc92d0d143d4a482152539fec1904cce9b
7
+ data.tar.gz: 81e1d2e90a4a82621b5fb3b755653f6536cc755f3702c9d89a57e0be90b6ea1111b6cf5b737093f37e859c1c5742f137492b1ee41841125b6504623c6bd830da
data/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## 2.4.0 (2024-11-11)
2
+
3
+ - Added `html5` option
4
+ - Improved generator for Active Record encryption and MySQL
5
+ - Removed support for Ruby < 3.1 and Rails < 7
6
+ - Removed support for Mongoid < 8
7
+
8
+ ## 2.3.1 (2024-09-09)
9
+
10
+ - Fixed deprecation warning with Rails 7.1
11
+
1
12
  ## 2.3.0 (2024-06-01)
2
13
 
3
14
  - Added support for secret token rotation
@@ -176,4 +187,14 @@ Breaking changes
176
187
 
177
188
  ## 0.1.0 (2014-04-29)
178
189
 
179
- - First major release
190
+ - Changed option names
191
+
192
+ ## 0.0.2 (2014-04-29)
193
+
194
+ - Added open and click tracking
195
+ - Added UTM parameters
196
+ - Rescue errors
197
+
198
+ ## 0.0.1 (2014-04-28)
199
+
200
+ - First release
data/README.md CHANGED
@@ -33,7 +33,7 @@ rails generate ahoy:messages --encryption=lockbox
33
33
  rails db:migrate
34
34
  ```
35
35
 
36
- To use Active Record encryption (Rails 7+, experimental), run:
36
+ To use Active Record encryption, run:
37
37
 
38
38
  ```sh
39
39
  rails generate ahoy:messages --encryption=activerecord
@@ -106,7 +106,7 @@ user.messages
106
106
  Add extra data to messages. Create a migration like:
107
107
 
108
108
  ```ruby
109
- class AddCouponIdToAhoyMessages < ActiveRecord::Migration[7.1]
109
+ class AddCouponIdToAhoyMessages < ActiveRecord::Migration[8.0]
110
110
  def change
111
111
  add_column :ahoy_messages, :coupon_id, :integer
112
112
  end
@@ -156,7 +156,7 @@ end
156
156
  Delete older data with:
157
157
 
158
158
  ```ruby
159
- Ahoy::Message.where("created_at < ?", 1.year.ago).in_batches.delete_all
159
+ Ahoy::Message.where("sent_at < ?", 1.year.ago).in_batches.delete_all
160
160
  ```
161
161
 
162
162
  Delete data for a specific user with:
@@ -324,53 +324,15 @@ Get stats for a campaign
324
324
  AhoyEmail.stats("my-campaign")
325
325
  ```
326
326
 
327
- ## Upgrading
327
+ ## HTML Parsing
328
328
 
329
- ### 2.0
329
+ By default, Nokogiri’s default HTML parser is used to rewrite links for UTM tagging and click analytics. This currently uses HTML4, which [only allows inline elements inside links](https://github.com/sparklemotion/nokogiri/issues/1876#issuecomment-468276937).
330
330
 
331
- Ahoy Email 2.0 brings a number of changes. Here are a few to be aware of:
331
+ To use HTML5 parsing, create `config/initializers/ahoy_email.rb` with:
332
332
 
333
- - The `to` field is encrypted by default for new installations. If you’d like to encrypt an existing installation, install [Lockbox](https://github.com/ankane/lockbox) and [Blind Index](https://github.com/ankane/blind_index) and follow the Lockbox instructions for [migrating existing data](https://github.com/ankane/lockbox#migrating-existing-data).
334
-
335
- For the model, create `app/models/ahoy/message.rb` with:
336
-
337
- ```ruby
338
- class Ahoy::Message < ActiveRecord::Base
339
- self.table_name = "ahoy_messages"
340
-
341
- belongs_to :user, polymorphic: true, optional: true
342
-
343
- encrypts :to, migrating: true
344
- blind_index :to, migrating: true
345
- end
346
- ```
347
-
348
- - The `track` method has been broken into:
349
-
350
- - `has_history` for message history
351
- - `utm_params` for UTM tagging
352
- - `track_clicks` for click analytics
353
-
354
- - Message history is no longer enabled by default. Add `has_history` to individual mailers, or create an initializer with:
355
-
356
- ```ruby
357
- AhoyEmail.default_options[:message] = true
358
- ```
359
-
360
- - For privacy, open tracking has been removed.
361
-
362
- - For clicks, we encourage you to try [aggregate analytics](#click-analytics) to measure the performance of campaigns. You can use a library like [Rollup](https://github.com/ankane/rollup) to aggregate existing data, then drop the `token` and `clicked_at` columns.
363
-
364
- To keep individual analytics, use `has_history` and `track_clicks campaign: false` and create an initializer with:
365
-
366
- ```ruby
367
- AhoyEmail.save_token = true
368
- AhoyEmail.subscribers << AhoyEmail::MessageSubscriber
369
- ```
370
-
371
- If you use a custom subscriber, `:message` is no longer included in click events. You can use `:token` to query the message if needed.
372
-
373
- - Users are shown a link expired page when signature verification fails instead of being redirected to the homepage when `AhoyEmail.invalid_redirect_url` is not set
333
+ ```ruby
334
+ AhoyEmail.default_options[:html5] = true
335
+ ```
374
336
 
375
337
  ## History
376
338
 
@@ -25,7 +25,7 @@ module Ahoy
25
25
  end
26
26
 
27
27
  redirect_options = {}
28
- redirect_options[:allow_other_host] = true if ActionPack::VERSION::MAJOR >= 7
28
+ redirect_options[:allow_other_host] = true
29
29
 
30
30
  if AhoyEmail::Utils.signature_verified?(legacy: legacy, token: token, campaign: campaign, url: url, signature: signature)
31
31
  data = {}
@@ -11,7 +11,7 @@ module AhoyEmail
11
11
  creds =
12
12
  if app.respond_to?(:credentials) && app.credentials.secret_key_base
13
13
  app.credentials
14
- elsif app.respond_to?(:secrets)
14
+ elsif app.respond_to?(:secrets) && (Rails::VERSION::STRING.to_f < 7.1 || app.config.paths["config/secrets"].existent.any?)
15
15
  app.secrets
16
16
  else
17
17
  app.config
@@ -63,6 +63,9 @@ module AhoyEmail
63
63
  # only call other options if needed
64
64
  if options[key]
65
65
  AhoyEmail::Utils::OPTION_KEYS[key].each do |k|
66
+ # make sure html5 only called once
67
+ next if options.key?(k)
68
+
66
69
  v = ahoy_options[k]
67
70
  options[k] = v.respond_to?(:call) ? instance_exec(&v) : v
68
71
  end
@@ -53,7 +53,7 @@ module AhoyEmail
53
53
  if html_part?
54
54
  part = message.html_part || message
55
55
 
56
- doc = Nokogiri::HTML::Document.parse(part.body.raw_source)
56
+ doc = parser_class.parse(part.body.raw_source)
57
57
  doc.css("a[href]").each do |link|
58
58
  uri = parse_uri(link["href"])
59
59
  next unless trackable?(uri)
@@ -92,6 +92,19 @@ module AhoyEmail
92
92
  end
93
93
  end
94
94
 
95
+ # use document instead of fragment
96
+ # https://github.com/ankane/ahoy_email/pull/150
97
+ def parser_class
98
+ case options[:html5]
99
+ when true
100
+ Nokogiri::HTML5::Document
101
+ when false
102
+ Nokogiri::HTML4::Document
103
+ else
104
+ Nokogiri::HTML::Document
105
+ end
106
+ end
107
+
95
108
  def html_part?
96
109
  (message.html_part || message).content_type =~ /html/
97
110
  end
@@ -2,8 +2,8 @@ module AhoyEmail
2
2
  class Utils
3
3
  OPTION_KEYS = {
4
4
  message: %i(message mailer user extra),
5
- utm_params: %i(utm_source utm_medium utm_term utm_content utm_campaign),
6
- click: %i(campaign url_options unsubscribe_links)
5
+ utm_params: %i(utm_source utm_medium utm_term utm_content utm_campaign html5),
6
+ click: %i(campaign url_options unsubscribe_links html5)
7
7
  }
8
8
 
9
9
  class << self
@@ -1,3 +1,3 @@
1
1
  module AhoyEmail
2
- VERSION = "2.3.0"
2
+ VERSION = "2.4.0"
3
3
  end
data/lib/ahoy_email.rb CHANGED
@@ -48,7 +48,10 @@ module AhoyEmail
48
48
  click: false,
49
49
  campaign: nil,
50
50
  url_options: {},
51
- unsubscribe_links: false
51
+ unsubscribe_links: false,
52
+
53
+ # utm params and click analytics
54
+ html5: nil
52
55
  }
53
56
 
54
57
  self.track_method = lambda do |data|
@@ -34,8 +34,11 @@ module Ahoy
34
34
  when "lockbox"
35
35
  "t.text :to_ciphertext\n t.string :to_bidx, index: true"
36
36
  else
37
- # TODO add limit: 510 for Active Record encryption + MySQL?
38
- "t.string :to, index: true"
37
+ if encryption == "activerecord" && mysql?
38
+ "t.string :to, limit: 510, index: true"
39
+ else
40
+ "t.string :to, index: true"
41
+ end
39
42
  end
40
43
  end
41
44
 
@@ -63,6 +66,14 @@ module Ahoy
63
66
  "has_encrypted"
64
67
  end
65
68
  end
69
+
70
+ def mysql?
71
+ adapter =~ /mysql|trilogy/i
72
+ end
73
+
74
+ def adapter
75
+ ActiveRecord::Base.connection_db_config.adapter.to_s
76
+ end
66
77
  end
67
78
  end
68
79
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ahoy_email
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-01 00:00:00.000000000 Z
11
+ date: 2024-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionmailer
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '6.1'
19
+ version: '7'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '6.1'
26
+ version: '7'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: addressable
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -116,14 +116,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
116
  requirements:
117
117
  - - ">="
118
118
  - !ruby/object:Gem::Version
119
- version: '3'
119
+ version: '3.1'
120
120
  required_rubygems_version: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  requirements: []
126
- rubygems_version: 3.5.9
126
+ rubygems_version: 3.5.22
127
127
  signing_key:
128
128
  specification_version: 4
129
129
  summary: First-party email analytics for Rails