mailtrap 2.18.0 → 2.19.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: df2746012d3720b47808a3bd7b8f44f473b49f53bf30b0b758d4467e0b8a578d
4
- data.tar.gz: ba58958bb95d0344e5107c82b76a2a3a1586ea9bfe16211e07d39e167c119d82
3
+ metadata.gz: 2749218455a3db4dce0286b7c6aacda197ac2fa7e97547def63703d5df982aa9
4
+ data.tar.gz: c324fcd9a6d8b788609ae48f5a4a1ca68aaf74887a036c6625631b1e643f79b6
5
5
  SHA512:
6
- metadata.gz: b3e163c56c0f08fc0be204e73a471fa451d5d8ae2eb87700f223c9e44a8a14161b88f916ac6d0d88b37b14c19807fd4d49424aa71b8075b4d7cbd8c87edbe487
7
- data.tar.gz: f7cde5772e9b716761678f4d230b8f8e2d0ed6ba7b0f4afb5546377f36add5a991cc0f4e4e7cb2a44ee0f7c97419f56f732f31cb4f771ef698f154920007b3d5
6
+ metadata.gz: 2c739fdf5614960c3e36a239ab922d879a91fe6063652f8bf3ef7dfd2b22f145a969fd72cbd2c6b0dcdf977481e1fa5f35d37104fad2d6fc2d71f83eed136fa2
7
+ data.tar.gz: cfd90df52872218ddfbb80082a885ccb07898e7e1fc42fef8da12361d9e614e58bfe0e8672a75c5e4238974dd22615000a997001b9c78eac19709e09396aa45b
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## [2.19.0] - 2026-10-29
2
+
3
+ ## What's Changed
4
+ * Add MarketingStatsAPI for GET /api/marketing/stats by @Rabsztok in https://github.com/mailtrap/mailtrap-ruby/pull/136
5
+ * Fix CI on Ubuntu 26.04 by testing Ruby series, not exact patches by @Rabsztok in https://github.com/mailtrap/mailtrap-ruby/pull/137
6
+
7
+
8
+ **Full Changelog**: https://github.com/mailtrap/mailtrap-ruby/compare/v2.18.0...v2.19.0
9
+
1
10
  ## [2.18.0] - 2026-10-07
2
11
 
3
12
  ## What's Changed
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mailtrap (2.18.0)
4
+ mailtrap (2.19.0)
5
5
  base64
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -204,6 +204,7 @@ Contact management:
204
204
  Email marketing:
205
205
 
206
206
  - Email Campaigns CRUD, Lifecycle Actions & Stats – [`email_campaigns_api.rb`](examples/email_campaigns_api.rb)
207
+ - Email Marketing Stats API – [`marketing_stats_api.rb`](examples/marketing_stats_api.rb)
207
208
 
208
209
  General:
209
210
 
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mailtrap
4
+ # Data Transfer Object for Email Marketing Stats
5
+ #
6
+ # Aggregated metrics of the account's Email Marketing traffic (campaigns and automations) for
7
+ # the requested period and filters. Rates are fractions from 0 to 1. Every count and rate is +0+
8
+ # when nothing matched.
9
+ # @see https://docs.mailtrap.io/developers/email-marketing/marketing-stats
10
+ # @attr_reader delivery_count [Integer] Number of delivered messages
11
+ # @attr_reader delivery_rate [Float, Integer] Share of sent messages that were delivered (0–1)
12
+ # @attr_reader bounce_count [Integer] Number of bounced messages
13
+ # @attr_reader bounce_rate [Float, Integer] Share of sent messages that bounced (0–1)
14
+ # @attr_reader open_count [Integer] Number of opened messages
15
+ # @attr_reader open_rate [Float, Integer] Share of delivered messages that were opened (0–1)
16
+ # @attr_reader click_count [Integer] Number of clicked messages
17
+ # @attr_reader click_rate [Float, Integer] Share of delivered messages that were clicked (0–1)
18
+ # @attr_reader spam_count [Integer] Number of spam complaints
19
+ # @attr_reader spam_rate [Float, Integer] Share of delivered messages marked as spam (0–1)
20
+ # @attr_reader unsubscription_count [Integer] Number of unsubscriptions
21
+ # @attr_reader unsubscription_rate [Float, Integer] Share of delivered messages that unsubscribed (0–1)
22
+ # @attr_reader sent_count [Integer] Number of sent messages (delivered plus bounced)
23
+ MarketingStats = Struct.new(
24
+ :delivery_count,
25
+ :delivery_rate,
26
+ :bounce_count,
27
+ :bounce_rate,
28
+ :open_count,
29
+ :open_rate,
30
+ :click_count,
31
+ :click_rate,
32
+ :spam_count,
33
+ :spam_rate,
34
+ :unsubscription_count,
35
+ :unsubscription_rate,
36
+ :sent_count,
37
+ keyword_init: true
38
+ )
39
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_api'
4
+ require_relative 'stats_query_params'
5
+ require_relative 'marketing_stats'
6
+
7
+ module Mailtrap
8
+ class MarketingStatsAPI
9
+ include BaseAPI
10
+ include StatsQueryParams
11
+
12
+ # @param client [Mailtrap::Client] The client instance
13
+ def initialize(client = Mailtrap::Client.new)
14
+ @client = client
15
+ end
16
+
17
+ # Get aggregated Email Marketing stats: campaigns and automations together, the same numbers
18
+ # as Email Marketing > Stats Overview in the app. Email API/SMTP traffic is reported by {StatsAPI}.
19
+ # @param start_date [String, Date, Time] Start of the period, inclusive (required)
20
+ # @param end_date [String, Date, Time] End of the period, inclusive (required)
21
+ # @param sending_domain_ids [Array<Integer>] Filter by sending domain IDs
22
+ # @param sources [Array<String>] Filter by source: +campaigns+ or +automations+;
23
+ # omit it, or pass both, to include campaigns and automations together
24
+ # @param email_service_providers [Array<String>] Filter by recipient email service providers
25
+ # @return [MarketingStats] Aggregated Email Marketing stats
26
+ # @!macro api_errors
27
+ # @raise [ArgumentError] If a date is not a Date, Time, or String in +YYYY-MM-DD+ format
28
+ def get(start_date:, end_date:, sending_domain_ids: nil, sources: nil, email_service_providers: nil)
29
+ query_params = build_query_params(
30
+ start_date, end_date,
31
+ { sending_domain_ids:, sources:, email_service_providers: }
32
+ )
33
+ response = client.get(base_path, query_params)
34
+ build_entity(response[:data], MarketingStats)
35
+ end
36
+
37
+ private
38
+
39
+ def base_path
40
+ '/api/marketing/stats'
41
+ end
42
+ end
43
+ end
@@ -1,15 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'date'
4
3
  require_relative 'base_api'
4
+ require_relative 'stats_query_params'
5
5
  require_relative 'sending_stats'
6
6
  require_relative 'sending_stat_group'
7
7
 
8
8
  module Mailtrap
9
9
  class StatsAPI
10
10
  include BaseAPI
11
+ include StatsQueryParams
11
12
 
12
- ARRAY_FILTERS = %i[sending_domain_ids sending_streams categories email_service_providers].freeze
13
13
  GROUP_KEYS = {
14
14
  'domains' => :sending_domain_id,
15
15
  'categories' => :category,
@@ -112,38 +112,6 @@ module Mailtrap
112
112
  end
113
113
  end
114
114
 
115
- def build_query_params(start_date, end_date, filters)
116
- params = { start_date: normalize_date(start_date), end_date: normalize_date(end_date) }
117
-
118
- ARRAY_FILTERS.each do |filter_key|
119
- values = filters[filter_key]
120
- params["#{filter_key}[]"] = values if values
121
- end
122
-
123
- params
124
- end
125
-
126
- def normalize_date(value)
127
- case value
128
- when Date
129
- value.iso8601
130
- when Time
131
- value.strftime('%F')
132
- when String
133
- unless /\A\d{4}-\d{2}-\d{2}\z/.match?(value)
134
- raise ArgumentError,
135
- "Invalid date: #{value.inspect}. Expected a Date, Time, or String in YYYY-MM-DD format."
136
- end
137
-
138
- Date.iso8601(value).iso8601
139
- else
140
- raise ArgumentError,
141
- "Invalid date: #{value.inspect}. Expected a Date, Time, or String in YYYY-MM-DD format."
142
- end
143
- rescue Date::Error
144
- raise ArgumentError, "Invalid date: #{value.inspect}. Expected a Date, Time, or String in YYYY-MM-DD format."
145
- end
146
-
147
115
  def base_path
148
116
  "/api/accounts/#{account_id}/stats"
149
117
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+
5
+ module Mailtrap
6
+ # Query parameters of the sending stats and Email Marketing stats endpoints: the period as
7
+ # +YYYY-MM-DD+ dates and every array filter as a repeated +key[]+ parameter. A +nil+ or empty
8
+ # filter is left out.
9
+ module StatsQueryParams
10
+ private
11
+
12
+ def build_query_params(start_date, end_date, filters)
13
+ params = { start_date: normalize_date(start_date), end_date: normalize_date(end_date) }
14
+ filters.each { |filter_key, values| params["#{filter_key}[]"] = values unless Array(values).empty? }
15
+ params
16
+ end
17
+
18
+ def normalize_date(value)
19
+ case value
20
+ when Date, Time # DateTime is a Date, but its #iso8601 includes the time of day
21
+ return value.strftime('%F')
22
+ when String
23
+ return value if /\A\d{4}-\d{2}-\d{2}\z/.match?(value) && Date.valid_date?(*value.split('-').map(&:to_i))
24
+ end
25
+
26
+ raise ArgumentError, "Invalid date: #{value.inspect}. Expected a Date, Time, or String in YYYY-MM-DD format."
27
+ end
28
+ end
29
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mailtrap
4
- VERSION = '2.18.0'
4
+ VERSION = '2.19.0'
5
5
  end
data/lib/mailtrap.rb CHANGED
@@ -21,6 +21,7 @@ require_relative 'mailtrap/contact_events_api'
21
21
  require_relative 'mailtrap/suppressions_api'
22
22
  require_relative 'mailtrap/tracking_opt_outs_api'
23
23
  require_relative 'mailtrap/email_campaigns_api'
24
+ require_relative 'mailtrap/marketing_stats_api'
24
25
  require_relative 'mailtrap/sending_domains_api'
25
26
  require_relative 'mailtrap/company_info_api'
26
27
  require_relative 'mailtrap/email_logs_api'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mailtrap
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.18.0
4
+ version: 2.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Railsware Products Studio LLC
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-10-12 00:00:00.000000000 Z
11
+ date: 2026-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64
@@ -106,6 +106,8 @@ files:
106
106
  - lib/mailtrap/mail.rb
107
107
  - lib/mailtrap/mail/base.rb
108
108
  - lib/mailtrap/mail/from_template.rb
109
+ - lib/mailtrap/marketing_stats.rb
110
+ - lib/mailtrap/marketing_stats_api.rb
109
111
  - lib/mailtrap/permission_resource.rb
110
112
  - lib/mailtrap/permissions_api.rb
111
113
  - lib/mailtrap/project.rb
@@ -119,6 +121,7 @@ files:
119
121
  - lib/mailtrap/sending_stat_group.rb
120
122
  - lib/mailtrap/sending_stats.rb
121
123
  - lib/mailtrap/stats_api.rb
124
+ - lib/mailtrap/stats_query_params.rb
122
125
  - lib/mailtrap/sub_account.rb
123
126
  - lib/mailtrap/sub_accounts_api.rb
124
127
  - lib/mailtrap/suppression.rb