hisend 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e8cf15bd446a532daa5f3d6037ba959697017299c1ab53d9e0d0d5428b2607ae
4
+ data.tar.gz: b105cc09f5cd95fbf0f05ba0121c859ff21bae60cfa2a36653f71773711a9666
5
+ SHA512:
6
+ metadata.gz: 4bde86c3c218112b8a668f2315d5f27f8ff9c9aca7e38675c2760ca632e73021b2c235a0fa3ddc3c0fc3ce806749159767e60e020f1edde36eb4358419e9048e
7
+ data.tar.gz: 55b06063de5c084426cc5dd69898a9deb5dd33b80c5248df23a7ac15715efc5b6c698ca259c65924b5a7f6ff0796e47fc5aaf7e73a8613a3370b302b3d526e96
@@ -0,0 +1,55 @@
1
+ module Hisend
2
+ class Client
3
+ attr_reader :emails, :domains, :routing, :threads
4
+
5
+ def initialize(api_key:, base_url: 'https://api.hisend.app/v1')
6
+ @api_key = api_key
7
+ @base_url = base_url.chomp('/')
8
+
9
+ @emails = Hisend::Resources::Emails.new(self)
10
+ @domains = Hisend::Resources::Domains.new(self)
11
+ @routing = Hisend::Resources::Routing.new(self)
12
+ @threads = Hisend::Resources::Threads.new(self)
13
+ end
14
+
15
+ def request(method, endpoint, payload = nil)
16
+ uri = URI("#{@base_url}/#{endpoint.sub(/^\//, '')}")
17
+
18
+ http = Net::HTTP.new(uri.host, uri.port)
19
+ http.use_ssl = uri.scheme == 'https'
20
+
21
+ req_class = case method.to_s.upcase
22
+ when 'GET' then Net::HTTP::Get
23
+ when 'POST' then Net::HTTP::Post
24
+ when 'PUT' then Net::HTTP::Put
25
+ when 'DELETE' then Net::HTTP::Delete
26
+ else raise ArgumentError, "Unsupported method: #{method}"
27
+ end
28
+
29
+ req = req_class.new(uri)
30
+ req['Authorization'] = "Bearer #{@api_key}"
31
+ req['Content-Type'] = 'application/json'
32
+ req['Accept'] = 'application/json'
33
+
34
+ if payload
35
+ # Map :from_ to :from internally for ruby aesthetics if passed as a symbol
36
+ if payload.key?(:from_)
37
+ payload[:from] = payload.delete(:from_)
38
+ end
39
+ req.body = JSON.generate(payload)
40
+ end
41
+
42
+ response = http.request(req)
43
+ body = response.body.to_s.empty? ? nil : JSON.parse(response.body, symbolize_names: true)
44
+
45
+ unless response.is_a?(Net::HTTPSuccess)
46
+ error_msg = body.is_a?(Hash) && (body[:message] || body[:error]) ? (body[:message] || body[:error]) : response.body
47
+ raise Hisend::Error.new("API request failed: #{error_msg}", response.code.to_i)
48
+ end
49
+
50
+ body
51
+ rescue JSON::ParserError
52
+ raise Hisend::Error.new("Invalid JSON response from server: #{response.body}", response&.code&.to_i)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,10 @@
1
+ module Hisend
2
+ class Error < StandardError
3
+ attr_reader :status_code
4
+
5
+ def initialize(message = "Hisend API Error", status_code = nil)
6
+ super(message)
7
+ @status_code = status_code
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,29 @@
1
+ module Hisend
2
+ module Resources
3
+ class Domains
4
+ def initialize(client)
5
+ @client = client
6
+ end
7
+
8
+ def list
9
+ @client.request(:get, 'domains')
10
+ end
11
+
12
+ def get(id)
13
+ @client.request(:get, "domains/#{id}")
14
+ end
15
+
16
+ def verify(id)
17
+ @client.request(:get, "domains/#{id}/verify")
18
+ end
19
+
20
+ def add(data)
21
+ @client.request(:post, 'domains', data)
22
+ end
23
+
24
+ def delete(id)
25
+ @client.request(:delete, "domains/#{id}")
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,25 @@
1
+ module Hisend
2
+ module Resources
3
+ class Emails
4
+ def initialize(client)
5
+ @client = client
6
+ end
7
+
8
+ def list
9
+ @client.request(:get, 'emails')
10
+ end
11
+
12
+ def get(id)
13
+ @client.request(:get, "emails/#{id}")
14
+ end
15
+
16
+ def send(data)
17
+ @client.request(:post, 'emails', data)
18
+ end
19
+
20
+ def send_batch(data)
21
+ @client.request(:post, 'emails/batch', data)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ module Hisend
2
+ module Resources
3
+ class Routing
4
+ def initialize(client)
5
+ @client = client
6
+ end
7
+
8
+ def list(domain_id)
9
+ @client.request(:get, "domains/#{domain_id}/routing")
10
+ end
11
+
12
+ def create(domain_id, data)
13
+ @client.request(:post, "domains/#{domain_id}/routing", data)
14
+ end
15
+
16
+ def update(domain_id, id, data)
17
+ @client.request(:put, "domains/#{domain_id}/routing/#{id}", data)
18
+ end
19
+
20
+ def get(domain_id, id)
21
+ @client.request(:get, "domains/#{domain_id}/routing/#{id}")
22
+ end
23
+
24
+ def delete(domain_id, id)
25
+ @client.request(:delete, "domains/#{domain_id}/routing/#{id}")
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ module Hisend
2
+ module Resources
3
+ class Threads
4
+ def initialize(client)
5
+ @client = client
6
+ end
7
+
8
+ def list
9
+ @client.request(:get, 'threads')
10
+ end
11
+
12
+ def get_emails(id)
13
+ @client.request(:get, "threads/#{id}/emails")
14
+ end
15
+ end
16
+ end
17
+ end
data/lib/hisend.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'json'
2
+ require 'net/http'
3
+ require 'uri'
4
+
5
+ require_relative 'hisend/errors'
6
+ require_relative 'hisend/client'
7
+ require_relative 'hisend/resources/domains'
8
+ require_relative 'hisend/resources/emails'
9
+ require_relative 'hisend/resources/routing'
10
+ require_relative 'hisend/resources/threads'
11
+
12
+ module Hisend
13
+ # Entry point is Hisend::Client
14
+ end
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hisend
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Hisend
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-03-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.0'
27
+ description: The official Hisend Ruby client for interacting with the Hisend API.
28
+ email: support@hisend.app
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/hisend.rb
34
+ - lib/hisend/client.rb
35
+ - lib/hisend/errors.rb
36
+ - lib/hisend/resources/domains.rb
37
+ - lib/hisend/resources/emails.rb
38
+ - lib/hisend/resources/routing.rb
39
+ - lib/hisend/resources/threads.rb
40
+ homepage: https://hisend.app
41
+ licenses:
42
+ - MIT
43
+ metadata: {}
44
+ post_install_message:
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 2.6.0
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ requirements: []
59
+ rubygems_version: 3.0.3.1
60
+ signing_key:
61
+ specification_version: 4
62
+ summary: Official Ruby SDK for Hisend
63
+ test_files: []