dashamail 0.0.1

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: 5d2c728ffb09c95b083de2c4b08bcd8a34f1c166268c86a48439f32467b931a1
4
+ data.tar.gz: f0e530ceb02f64cdfa5609acbe77fca6b4b93b6785c003a85e5120eef6e57ca5
5
+ SHA512:
6
+ metadata.gz: 324cafa5e4245819c9a1d4b8f678661094ba3c8798faa1f105834caa574aedc533cc843a2b65a3e7efe874b5cfc84bac7d72ec9606e6ec4ec6189d5a8c46f7fe
7
+ data.tar.gz: 7e3043e79386bc7e44f00ec02f2f2a1b8fd8d793c839d53786c7a71d34b3bcce30ab028a0cb4f2e08b04d8deaea1a3f2d9b479eb65065607fefcf0abcf0f575b
@@ -0,0 +1,192 @@
1
+ module Dashamail
2
+ class APIRequest
3
+
4
+ def initialize(builder: nil)
5
+ @request_builder = builder
6
+ end
7
+
8
+ def post(params: nil, headers: nil, body: {})
9
+ validate_api_key
10
+
11
+ begin
12
+ response = self.rest_client.post do |request|
13
+ configure_request(request: request, params: params, headers: headers, body: MultiJson.dump(body))
14
+ end
15
+ parse_response(response)
16
+ rescue StandardError => e
17
+ handle_error(e)
18
+ end
19
+ end
20
+
21
+ def patch(params: nil, headers: nil, body: {})
22
+ validate_api_key
23
+
24
+ begin
25
+ response = self.rest_client.patch do |request|
26
+ configure_request(request: request, params: params, headers: headers, body: MultiJson.dump(body))
27
+ end
28
+ parse_response(response)
29
+ rescue StandardError => e
30
+ handle_error(e)
31
+ end
32
+ end
33
+
34
+ def put(params: nil, headers: nil, body: {})
35
+ validate_api_key
36
+
37
+ begin
38
+ response = self.rest_client.put do |request|
39
+ configure_request(request: request, params: params, headers: headers, body: MultiJson.dump(body))
40
+ end
41
+ parse_response(response)
42
+ rescue StandardError => e
43
+ handle_error(e)
44
+ end
45
+ end
46
+
47
+ def get(params: nil, headers: nil)
48
+ validate_api_key
49
+
50
+ begin
51
+ response = self.rest_client.get do |request|
52
+ configure_request(request: request, params: params, headers: headers)
53
+ end
54
+ parse_response(response)
55
+ rescue StandardError => e
56
+ handle_error(e)
57
+ end
58
+ end
59
+
60
+ def delete(params: nil, headers: nil)
61
+ validate_api_key
62
+
63
+ begin
64
+ response = self.rest_client.delete do |request|
65
+ configure_request(request: request, params: params, headers: headers)
66
+ end
67
+ parse_response(response)
68
+ rescue StandardError => e
69
+ handle_error(e)
70
+ end
71
+ end
72
+
73
+ protected
74
+
75
+ # Convenience accessors
76
+
77
+ def api_key
78
+ @request_builder.api_key
79
+ end
80
+
81
+ def api_endpoint
82
+ @request_builder.api_endpoint
83
+ end
84
+
85
+ def timeout
86
+ @request_builder.timeout
87
+ end
88
+
89
+ def open_timeout
90
+ @request_builder.open_timeout
91
+ end
92
+
93
+ def proxy
94
+ @request_builder.proxy
95
+ end
96
+
97
+ def adapter
98
+ @request_builder.faraday_adapter
99
+ end
100
+
101
+ def symbolize_keys
102
+ @request_builder.symbolize_keys
103
+ end
104
+
105
+ # Helpers
106
+
107
+ def handle_error(error)
108
+ error_params = {}
109
+
110
+ begin
111
+ if error.is_a?(Faraday::ClientError) && error.response
112
+ error_params[:status_code] = error.response[:status]
113
+ error_params[:raw_body] = error.response[:body]
114
+
115
+ parsed_response = MultiJson.load(error.response[:body], symbolize_keys: symbolize_keys)
116
+
117
+ if parsed_response
118
+ error_params[:body] = parsed_response
119
+
120
+ title_key = symbolize_keys ? :title : "title"
121
+ detail_key = symbolize_keys ? :detail : "detail"
122
+
123
+ error_params[:title] = parsed_response[title_key] if parsed_response[title_key]
124
+ error_params[:detail] = parsed_response[detail_key] if parsed_response[detail_key]
125
+ end
126
+
127
+ end
128
+ rescue MultiJson::ParseError
129
+ end
130
+
131
+ error_to_raise = Error.new(error.message, error_params)
132
+
133
+ raise error_to_raise
134
+ end
135
+
136
+ def configure_request(request: nil, params: nil, headers: nil, body: nil)
137
+ if request
138
+ request.params.merge!(params) if params
139
+ request.params.merge!({api_key: Dashamail::Request.api_key, method: @request_builder.path})
140
+ request.headers['Content-Type'] = 'application/json'
141
+ request.headers['User-Agent'] = "Dashamail/#{Dashamail::VERSION} Ruby gem"
142
+ request.headers.merge!(headers) if headers
143
+ request.body = body if body
144
+ request.options.timeout = self.timeout
145
+ request.options.open_timeout = self.open_timeout
146
+ end
147
+ end
148
+
149
+ def rest_client
150
+ client = Faraday.new(self.api_url, proxy: self.proxy, ssl: { version: "TLSv1_2" }) do |faraday|
151
+ faraday.response :raise_error
152
+ faraday.adapter adapter
153
+ if @request_builder.debug
154
+ faraday.response :logger, @request_builder.logger, bodies: true
155
+ end
156
+ end
157
+ client
158
+ end
159
+
160
+ def parse_response(response)
161
+ parsed_response = nil
162
+
163
+ if response.body && !response.body.empty?
164
+ begin
165
+ headers = response.headers
166
+ body = MultiJson.load(response.body, symbolize_keys: symbolize_keys)
167
+ parsed_response = Response.new(headers: headers, body: body)
168
+ rescue MultiJson::ParseError
169
+ error_params = { title: "UNPARSEABLE_RESPONSE", status_code: 500 }
170
+ error = Error.new("Unparseable response: #{response.body}", error_params)
171
+ raise error
172
+ end
173
+ end
174
+
175
+ parsed_response
176
+ end
177
+
178
+ def validate_api_key
179
+ unless self.api_key
180
+ raise Dashamail::Error, "You must set an access_token prior to making a call"
181
+ end
182
+ end
183
+
184
+ def api_url
185
+ base_api_url# + @request_builder.path
186
+ end
187
+
188
+ def base_api_url
189
+ "#{Dashamail.host}/"
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,29 @@
1
+ module Dashamail
2
+ class Error < StandardError
3
+ attr_reader :title, :detail, :body, :raw_body, :status_code
4
+
5
+ def initialize(message = "", params = {})
6
+ @title = params[:title]
7
+ @detail = params[:detail]
8
+ @body = params[:body]
9
+ @raw_body = params[:raw_body]
10
+ @status_code = params[:status_code]
11
+
12
+ super(message)
13
+ end
14
+
15
+ def to_s
16
+ super + " " + instance_variables_to_s
17
+ end
18
+
19
+ private
20
+
21
+ def instance_variables_to_s
22
+ [:title, :detail, :body, :raw_body, :status_code].map do |attr|
23
+ attr_value = send(attr)
24
+
25
+ "@#{attr}=#{attr_value.inspect}"
26
+ end.join(", ")
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,94 @@
1
+ module Dashamail
2
+ class Request
3
+ attr_accessor :api_key, :api_endpoint, :timeout, :open_timeout, :proxy, :faraday_adapter, :symbolize_keys, :debug, :logger, :test
4
+
5
+ DEFAULT_TIMEOUT = 60
6
+ DEFAULT_OPEN_TIMEOUT = 60
7
+
8
+ def initialize(api_key: nil, api_endpoint: nil, timeout: nil, open_timeout: nil, proxy: nil, faraday_adapter: nil, symbolize_keys: false, debug: false, logger: nil, test: false)
9
+ @path_parts = []
10
+ @api_key = api_key || self.class.api_key
11
+ @api_key = @api_key.strip if @api_key
12
+ @api_endpoint = api_endpoint || self.class.api_endpoint
13
+ @timeout = timeout || self.class.timeout || DEFAULT_TIMEOUT
14
+ @open_timeout = open_timeout || self.class.open_timeout || DEFAULT_OPEN_TIMEOUT
15
+ @proxy = proxy || self.class.proxy || ENV['DASHAMAIL_PROXY']
16
+ @faraday_adapter = faraday_adapter || self.class.faraday_adapter || Faraday.default_adapter
17
+ @symbolize_keys = symbolize_keys || self.class.symbolize_keys || false
18
+ @debug = debug || self.class.debug || false
19
+ @test = test || self.class.test || false
20
+ @logger = logger || self.class.logger || ::Logger.new(STDOUT)
21
+ end
22
+
23
+ def method_missing(method, *args)
24
+ @path_parts << method.to_s
25
+ @path_parts << args if args.length > 0
26
+ @path_parts.flatten!
27
+ self
28
+ end
29
+
30
+ def respond_to_missing?(method_name, include_private = false)
31
+ true
32
+ end
33
+
34
+ def send(*args)
35
+ if args.length == 0
36
+ method_missing(:send, args)
37
+ else
38
+ __send__(*args)
39
+ end
40
+ end
41
+
42
+ def path
43
+ @path_parts.join('.')
44
+ end
45
+
46
+ def create(params: nil, headers: nil, body: {})
47
+ APIRequest.new(builder: self).post(params: params, headers: headers, body: body)
48
+ ensure
49
+ reset
50
+ end
51
+
52
+ def update(params: nil, headers: nil, body: {})
53
+ APIRequest.new(builder: self).patch(params: params, headers: headers, body: body)
54
+ ensure
55
+ reset
56
+ end
57
+
58
+ def upsert(params: nil, headers: nil, body: {})
59
+ APIRequest.new(builder: self).put(params: params, headers: headers, body: body)
60
+ ensure
61
+ reset
62
+ end
63
+
64
+ def retrieve(params: nil, headers: nil)
65
+ APIRequest.new(builder: self).get(params: params, headers: headers)
66
+ ensure
67
+ reset
68
+ end
69
+
70
+ def delete(params: nil, headers: nil)
71
+ APIRequest.new(builder: self).delete(params: params, headers: headers)
72
+ ensure
73
+ reset
74
+ end
75
+
76
+ protected
77
+
78
+ def reset
79
+ @path_parts = []
80
+ end
81
+
82
+ class << self
83
+ attr_accessor :api_key, :timeout, :open_timeout, :api_endpoint, :proxy, :faraday_adapter, :symbolize_keys, :debug, :logger, :test
84
+
85
+ def method_missing(sym, *args, &block)
86
+ new(api_key: self.api_key, api_endpoint: self.api_endpoint, timeout: self.timeout, open_timeout: self.open_timeout, faraday_adapter: self.faraday_adapter, symbolize_keys: self.symbolize_keys, debug: self.debug, proxy: self.proxy, logger: self.logger, test: self.test).send(sym, *args, &block)
87
+ end
88
+
89
+ def respond_to_missing?(method_name, include_private = false)
90
+ true
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,10 @@
1
+ module Dashamail
2
+ class Response
3
+ attr_accessor :body, :headers
4
+
5
+ def initialize(body: {}, headers: {})
6
+ @body = body
7
+ @headers = headers
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ module Dashamail
2
+ VERSION = "0.0.1"
3
+ end
data/lib/dashamail.rb ADDED
@@ -0,0 +1,54 @@
1
+ require 'faraday'
2
+ require "dashamail/version"
3
+ require 'dashamail/error'
4
+ require 'dashamail/request'
5
+ require 'dashamail/api_request'
6
+ require 'dashamail/response'
7
+
8
+ module Dashamail
9
+ class << self
10
+ def setup
11
+ yield self
12
+ end
13
+
14
+ def register(name, value, type = nil)
15
+ cattr_accessor "#{name}_setting".to_sym
16
+
17
+ add_reader(name)
18
+ add_writer(name, type)
19
+ send "#{name}=", value
20
+ end
21
+
22
+ def add_reader(name)
23
+ define_singleton_method(name) do |*args|
24
+ send("#{name}_setting").value(*args)
25
+ end
26
+ end
27
+
28
+ def add_writer(name, type)
29
+ define_singleton_method("#{name}=") do |value|
30
+ send("#{name}_setting=", DynamicSetting.build(value, type))
31
+ end
32
+ end
33
+ end
34
+
35
+ class DynamicSetting
36
+ def self.build(setting, type)
37
+ (type ? klass(type) : self).new(setting)
38
+ end
39
+
40
+ def self.klass(type)
41
+ klass = "#{type.to_s.camelcase}Setting"
42
+ raise ArgumentError, "Unknown type: #{type}" unless Dashamail.const_defined?(klass)
43
+ Dashamail.const_get(klass)
44
+ end
45
+
46
+ def initialize(setting)
47
+ @setting = setting
48
+ end
49
+
50
+ def value(*_args)
51
+ @setting
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,2 @@
1
+ Description:
2
+ dashamail:install
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ module Dashamail
4
+ class InstallGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ def generate_install
8
+ copy_file 'dashamail.yml', 'config/dashamail.yml'
9
+ copy_file 'dashamail.rb', 'config/initializers/dashamail.rb'
10
+ end
11
+ end
12
+ end
13
+
@@ -0,0 +1,17 @@
1
+ require 'dashamail'
2
+
3
+ Dashamail.setup do |config|
4
+ if File.exist?('config/dashamail.yml')
5
+ processed = YAML.load_file('config/dashamail.yml')[Rails.env]
6
+
7
+ processed.each do |k, v|
8
+ config::register k.underscore.to_sym, v
9
+ end
10
+
11
+ config::Request.api_key = Dashamail::api_key || ENV['DASHAMAIL_API_KEY']
12
+ config::Request.timeout = 15
13
+ config::Request.open_timeout = 15
14
+ config::Request.symbolize_keys = true
15
+ config::Request.debug = false
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ defaults: &defaults
2
+ HOST: 'https://api.dashamail.com'
3
+ API_KEY: '***'
4
+ production:
5
+ <<: *defaults
6
+ API_KEY: '***'
7
+ development:
8
+ <<: *defaults
9
+ test:
10
+ <<: *defaults
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dashamail
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Pavel Osetrov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-05-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.16.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.16.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: multi_json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.11.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.11.0
41
+ description: ''
42
+ email: pavel.osetrov@me.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - lib/dashamail.rb
48
+ - lib/dashamail/api_request.rb
49
+ - lib/dashamail/error.rb
50
+ - lib/dashamail/request.rb
51
+ - lib/dashamail/response.rb
52
+ - lib/dashamail/version.rb
53
+ - lib/generators/dashamail/install/USAGE
54
+ - lib/generators/dashamail/install/install_generator.rb
55
+ - lib/generators/dashamail/install/templates/dashamail.rb
56
+ - lib/generators/dashamail/install/templates/dashamail.yml
57
+ homepage: https://github.com/osetrov/dashamail
58
+ licenses:
59
+ - MIT
60
+ metadata: {}
61
+ post_install_message:
62
+ rdoc_options: []
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 2.3.8
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ requirements: []
76
+ rubygems_version: 3.2.32
77
+ signing_key:
78
+ specification_version: 4
79
+ summary: DashaMail
80
+ test_files: []