sevk 0.1.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.
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Sevk
6
+ module Resources
7
+ class Segments < Base
8
+ def list(audience_id, page: nil, limit: nil)
9
+ params = { page: page, limit: limit }
10
+ client.get("/audiences/#{audience_id}/segments#{build_query_string(params)}")
11
+ end
12
+
13
+ def get(audience_id, segment_id)
14
+ client.get("/audiences/#{audience_id}/segments/#{segment_id}")
15
+ end
16
+
17
+ def create(audience_id, name:, rules:, operator: "AND")
18
+ body = { name: name, rules: rules, operator: operator }
19
+ client.post("/audiences/#{audience_id}/segments", body)
20
+ end
21
+
22
+ def update(audience_id, segment_id, name: nil, rules: nil, operator: nil)
23
+ body = {}
24
+ body[:name] = name if name
25
+ body[:rules] = rules if rules
26
+ body[:operator] = operator if operator
27
+ client.put("/audiences/#{audience_id}/segments/#{segment_id}", body)
28
+ end
29
+
30
+ def delete(audience_id, segment_id)
31
+ client.delete("/audiences/#{audience_id}/segments/#{segment_id}")
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Sevk
6
+ module Resources
7
+ class Subscriptions < Base
8
+ def subscribe(email:, audience_id:, topic_ids: nil, metadata: nil)
9
+ body = { email: email, audienceId: audience_id }
10
+ body[:topicIds] = topic_ids if topic_ids
11
+ body[:metadata] = metadata if metadata
12
+ client.post("/subscriptions/subscribe", body)
13
+ end
14
+
15
+ def unsubscribe(email:, audience_id: nil, topic_ids: nil)
16
+ body = { email: email }
17
+ body[:audienceId] = audience_id if audience_id
18
+ body[:topicIds] = topic_ids if topic_ids
19
+ client.post("/subscriptions/unsubscribe", body)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Sevk
6
+ module Resources
7
+ class Templates < Base
8
+ def list(page: nil, limit: nil, search: nil)
9
+ params = { page: page, limit: limit, search: search }
10
+ client.get("/templates#{build_query_string(params)}")
11
+ end
12
+
13
+ def get(id)
14
+ client.get("/templates/#{id}")
15
+ end
16
+
17
+ def create(title:, content:)
18
+ client.post("/templates", { title: title, content: content })
19
+ end
20
+
21
+ def update(id, title: nil, content: nil)
22
+ body = {}
23
+ body[:title] = title if title
24
+ body[:content] = content if content
25
+ client.put("/templates/#{id}", body)
26
+ end
27
+
28
+ def delete(id)
29
+ client.delete("/templates/#{id}")
30
+ end
31
+
32
+ def duplicate(id)
33
+ client.post("/templates/#{id}/duplicate", {})
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Sevk
6
+ module Resources
7
+ class Topics < Base
8
+ def list(audience_id, page: nil, limit: nil)
9
+ params = { page: page, limit: limit }
10
+ client.get("/audiences/#{audience_id}/topics#{build_query_string(params)}")
11
+ end
12
+
13
+ def get(audience_id, topic_id)
14
+ client.get("/audiences/#{audience_id}/topics/#{topic_id}")
15
+ end
16
+
17
+ def create(audience_id, name:, description: nil)
18
+ body = { name: name }
19
+ body[:description] = description if description
20
+ client.post("/audiences/#{audience_id}/topics", body)
21
+ end
22
+
23
+ def update(audience_id, topic_id, name: nil, description: nil)
24
+ body = {}
25
+ body[:name] = name if name
26
+ body[:description] = description if description
27
+ client.put("/audiences/#{audience_id}/topics/#{topic_id}", body)
28
+ end
29
+
30
+ def delete(audience_id, topic_id)
31
+ client.delete("/audiences/#{audience_id}/topics/#{topic_id}")
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sevk
4
+ VERSION = "0.1.0"
5
+ end
data/lib/sevk.rb ADDED
@@ -0,0 +1,213 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "faraday"
4
+ require "faraday/retry"
5
+ require "json"
6
+
7
+ require_relative "sevk/version"
8
+ require_relative "sevk/error"
9
+ require_relative "sevk/client"
10
+ require_relative "sevk/resources/base"
11
+ require_relative "sevk/resources/contacts"
12
+ require_relative "sevk/resources/audiences"
13
+ require_relative "sevk/resources/templates"
14
+ require_relative "sevk/resources/broadcasts"
15
+ require_relative "sevk/resources/domains"
16
+ require_relative "sevk/resources/topics"
17
+ require_relative "sevk/resources/segments"
18
+ require_relative "sevk/resources/subscriptions"
19
+ require_relative "sevk/resources/emails"
20
+ require_relative "sevk/markup/renderer"
21
+
22
+ module Sevk
23
+ DEFAULT_BASE_URL = "https://api.sevk.io"
24
+
25
+ class << self
26
+ attr_accessor :api_key, :base_url
27
+
28
+ def configure
29
+ yield self
30
+ end
31
+
32
+ def client
33
+ @client ||= Client.new(api_key: api_key, base_url: base_url)
34
+ end
35
+
36
+ def reset_client!
37
+ @client = nil
38
+ end
39
+ end
40
+
41
+ # Class-based API
42
+ module Contacts
43
+ class << self
44
+ def list(params = {})
45
+ Sevk.client.contacts.list(**params)
46
+ end
47
+
48
+ def get(id)
49
+ Sevk.client.contacts.get(id)
50
+ end
51
+
52
+ def create(params)
53
+ Sevk.client.contacts.create(**params)
54
+ end
55
+
56
+ def update(id, params)
57
+ Sevk.client.contacts.update(id, **params)
58
+ end
59
+
60
+ def delete(id)
61
+ Sevk.client.contacts.delete(id)
62
+ end
63
+ end
64
+ end
65
+
66
+ module Audiences
67
+ class << self
68
+ def list(params = {})
69
+ Sevk.client.audiences.list(**params)
70
+ end
71
+
72
+ def get(id)
73
+ Sevk.client.audiences.get(id)
74
+ end
75
+
76
+ def create(params)
77
+ Sevk.client.audiences.create(**params)
78
+ end
79
+
80
+ def update(id, params)
81
+ Sevk.client.audiences.update(id, **params)
82
+ end
83
+
84
+ def delete(id)
85
+ Sevk.client.audiences.delete(id)
86
+ end
87
+
88
+ def add_contacts(id, contact_ids)
89
+ Sevk.client.audiences.add_contacts(id, contact_ids)
90
+ end
91
+ end
92
+ end
93
+
94
+ module Templates
95
+ class << self
96
+ def list(params = {})
97
+ Sevk.client.templates.list(**params)
98
+ end
99
+
100
+ def get(id)
101
+ Sevk.client.templates.get(id)
102
+ end
103
+
104
+ def create(params)
105
+ Sevk.client.templates.create(**params)
106
+ end
107
+
108
+ def update(id, params)
109
+ Sevk.client.templates.update(id, **params)
110
+ end
111
+
112
+ def delete(id)
113
+ Sevk.client.templates.delete(id)
114
+ end
115
+
116
+ def duplicate(id)
117
+ Sevk.client.templates.duplicate(id)
118
+ end
119
+ end
120
+ end
121
+
122
+ module Broadcasts
123
+ class << self
124
+ def list(params = {})
125
+ Sevk.client.broadcasts.list(**params)
126
+ end
127
+
128
+ def get(id)
129
+ Sevk.client.broadcasts.get(id)
130
+ end
131
+ end
132
+ end
133
+
134
+ module Domains
135
+ class << self
136
+ def list(params = {})
137
+ Sevk.client.domains.list(**params)
138
+ end
139
+
140
+ def get(id)
141
+ Sevk.client.domains.get(id)
142
+ end
143
+ end
144
+ end
145
+
146
+ module Topics
147
+ class << self
148
+ def list(audience_id, params = {})
149
+ Sevk.client.topics.list(audience_id, **params)
150
+ end
151
+
152
+ def get(audience_id, topic_id)
153
+ Sevk.client.topics.get(audience_id, topic_id)
154
+ end
155
+
156
+ def create(audience_id, params)
157
+ Sevk.client.topics.create(audience_id, **params)
158
+ end
159
+
160
+ def update(audience_id, topic_id, params)
161
+ Sevk.client.topics.update(audience_id, topic_id, **params)
162
+ end
163
+
164
+ def delete(audience_id, topic_id)
165
+ Sevk.client.topics.delete(audience_id, topic_id)
166
+ end
167
+ end
168
+ end
169
+
170
+ module Segments
171
+ class << self
172
+ def list(audience_id, params = {})
173
+ Sevk.client.segments.list(audience_id, **params)
174
+ end
175
+
176
+ def get(audience_id, segment_id)
177
+ Sevk.client.segments.get(audience_id, segment_id)
178
+ end
179
+
180
+ def create(audience_id, params)
181
+ Sevk.client.segments.create(audience_id, **params)
182
+ end
183
+
184
+ def update(audience_id, segment_id, params)
185
+ Sevk.client.segments.update(audience_id, segment_id, **params)
186
+ end
187
+
188
+ def delete(audience_id, segment_id)
189
+ Sevk.client.segments.delete(audience_id, segment_id)
190
+ end
191
+ end
192
+ end
193
+
194
+ module Subscriptions
195
+ class << self
196
+ def subscribe(params)
197
+ Sevk.client.subscriptions.subscribe(**params)
198
+ end
199
+
200
+ def unsubscribe(params)
201
+ Sevk.client.subscriptions.unsubscribe(**params)
202
+ end
203
+ end
204
+ end
205
+
206
+ module Emails
207
+ class << self
208
+ def send(params)
209
+ Sevk.client.emails.send(**params)
210
+ end
211
+ end
212
+ end
213
+ end
data/sevk.gemspec ADDED
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/sevk/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "sevk"
7
+ spec.version = Sevk::VERSION
8
+ spec.authors = ["Sevk"]
9
+ spec.email = ["dev@sevk.io"]
10
+
11
+ spec.summary = "Ruby SDK for Sevk API"
12
+ spec.description = "Ruby SDK for interacting with the Sevk API. Send emails, manage contacts, audiences, templates, and more."
13
+ spec.homepage = "https://sevk.io"
14
+ spec.license = "MIT"
15
+ spec.required_ruby_version = ">= 3.0.0"
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = "https://github.com/sevk-io/sevk-ruby"
19
+ spec.metadata["changelog_uri"] = "https://github.com/sevk-io/sevk-ruby/blob/main/CHANGELOG.md"
20
+
21
+ spec.files = Dir.chdir(__dir__) do
22
+ `git ls-files -z`.split("\x0").reject do |f|
23
+ (File.expand_path(f) == __FILE__) ||
24
+ f.start_with?(*%w[bin/ test/ spec/ features/ .git .github appveyor Gemfile])
25
+ end
26
+ end
27
+ spec.bindir = "exe"
28
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
29
+ spec.require_paths = ["lib"]
30
+
31
+ spec.add_dependency "faraday", "~> 2.0"
32
+ spec.add_dependency "faraday-retry", "~> 2.0"
33
+ spec.add_dependency "nokogiri", "~> 1.15"
34
+
35
+ spec.add_development_dependency "bundler", "~> 2.0"
36
+ spec.add_development_dependency "rake", "~> 13.0"
37
+ spec.add_development_dependency "rspec", "~> 3.0"
38
+ spec.add_development_dependency "webmock", "~> 3.0"
39
+ spec.add_development_dependency "rubocop", "~> 1.0"
40
+ end
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sevk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Sevk
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: faraday
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '2.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '2.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: faraday-retry
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: nokogiri
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.15'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.15'
54
+ - !ruby/object:Gem::Dependency
55
+ name: bundler
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '2.0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rake
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '13.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '13.0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rspec
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3.0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: webmock
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '3.0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rubocop
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.0'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.0'
124
+ description: Ruby SDK for interacting with the Sevk API. Send emails, manage contacts,
125
+ audiences, templates, and more.
126
+ email:
127
+ - dev@sevk.io
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - README.md
133
+ - Rakefile
134
+ - lib/sevk.rb
135
+ - lib/sevk/client.rb
136
+ - lib/sevk/error.rb
137
+ - lib/sevk/markup/renderer.rb
138
+ - lib/sevk/resources/audiences.rb
139
+ - lib/sevk/resources/base.rb
140
+ - lib/sevk/resources/broadcasts.rb
141
+ - lib/sevk/resources/contacts.rb
142
+ - lib/sevk/resources/domains.rb
143
+ - lib/sevk/resources/emails.rb
144
+ - lib/sevk/resources/segments.rb
145
+ - lib/sevk/resources/subscriptions.rb
146
+ - lib/sevk/resources/templates.rb
147
+ - lib/sevk/resources/topics.rb
148
+ - lib/sevk/version.rb
149
+ - sevk.gemspec
150
+ homepage: https://sevk.io
151
+ licenses:
152
+ - MIT
153
+ metadata:
154
+ homepage_uri: https://sevk.io
155
+ source_code_uri: https://github.com/sevk-io/sevk-ruby
156
+ changelog_uri: https://github.com/sevk-io/sevk-ruby/blob/main/CHANGELOG.md
157
+ rdoc_options: []
158
+ require_paths:
159
+ - lib
160
+ required_ruby_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: 3.0.0
165
+ required_rubygems_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ requirements: []
171
+ rubygems_version: 3.6.9
172
+ specification_version: 4
173
+ summary: Ruby SDK for Sevk API
174
+ test_files: []