dashamail 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []