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 +4 -4
- data/CHANGELOG.md +9 -0
- data/Gemfile.lock +1 -1
- data/README.md +1 -0
- data/lib/mailtrap/marketing_stats.rb +39 -0
- data/lib/mailtrap/marketing_stats_api.rb +43 -0
- data/lib/mailtrap/stats_api.rb +2 -34
- data/lib/mailtrap/stats_query_params.rb +29 -0
- data/lib/mailtrap/version.rb +1 -1
- data/lib/mailtrap.rb +1 -0
- metadata +5 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2749218455a3db4dce0286b7c6aacda197ac2fa7e97547def63703d5df982aa9
|
|
4
|
+
data.tar.gz: c324fcd9a6d8b788609ae48f5a4a1ca68aaf74887a036c6625631b1e643f79b6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
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
|
data/lib/mailtrap/stats_api.rb
CHANGED
|
@@ -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
|
data/lib/mailtrap/version.rb
CHANGED
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.
|
|
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-
|
|
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
|