pipeline_deals_api 0.1.4 → 0.1.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6682299969b7ad219bc42af20c95ad2eeaf2d1d2dfca1eeeb772b5304a390a34
4
- data.tar.gz: c8440c05a8e48466407b52a312ace43b421937037832bd45d1f8b5304324091e
3
+ metadata.gz: 1a0369766e73baf651ae94addd30794c1a18a0742a24c20110d1036742eb3c57
4
+ data.tar.gz: e657b46c2e3a7ea0d1570b8111f1b3a22793762b6e1350967db7798ebfa4f0c1
5
5
  SHA512:
6
- metadata.gz: 248a5ee91e95cad960fe2de83599deb561f60a03cac02fefa2e89a5f4f53a225119f67bb6c498b4a94dedf4790334b789ea75be4b1c71d0f0e501db09847ae03
7
- data.tar.gz: 112ea1ccb2b790af8b4acb54f89b2e34bc3b908b857a319f79782979005063dfa4573412c2c5330ecd6203375c30f5ff7bef858491486c6975f5ad7ff7743e59
6
+ metadata.gz: bf26366c15922b70c75269d1c5d67b45b2fa8224824a174329891ea467f6b8303d6f826157375d71d1109db2d4b9d923e20eec4849d255f17ec65442fe80b051
7
+ data.tar.gz: c5abf799a2ef17262a4508eaae8bd4460f45c83261a60ae01f357ba114a665105b2f3befa93e721cd3532a57a21de7c832701f3902b82f88cb0fd7faf3b62155
@@ -0,0 +1,52 @@
1
+ module PipelineDealsApi
2
+ # NOTE(asinner): The Client class is responsible for giving you an object
3
+ # for communicating with the API.
4
+ #
5
+ # To create a new client call the Client class constructor and pass your
6
+ # credentials using named parameters:
7
+ #
8
+ # ```
9
+ # client = PipelineDealsApi::Client.new(api_key: 'your-api-key')
10
+ # ```
11
+ # If you have an `app_key` token you may also pass that in addition to your
12
+ # `api_key`
13
+ #
14
+ # ```
15
+ # client = PipelineDealsApi::Client.new(
16
+ # api_key: 'your-api-key',
17
+ # app_key: 'your-app-key'
18
+ # )
19
+ # ```
20
+ class Client
21
+ attr_reader :credentials
22
+
23
+ def initialize(api_key:, app_key: nil)
24
+ @credentials = Credentials.new(
25
+ api_key: api_key,
26
+ app_key: app_key
27
+ )
28
+ init_config
29
+ init_clients
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :http_client, :deal_client
35
+
36
+ def init_clients
37
+ @deal_client = Cients::Deal.new(
38
+ http_client: http_client
39
+ )
40
+ end
41
+
42
+ def init_config
43
+ init_http_client
44
+ end
45
+
46
+ def init_http_client
47
+ @http_client ||= HttpClient.new(
48
+ credentials: @credentials
49
+ )
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,20 @@
1
+ module PipelineDealsApi
2
+ module Clients
3
+ class Deal
4
+ include Helper
5
+
6
+ def initialize(http_client:,)
7
+ @http_client = http_client
8
+ end
9
+
10
+ def create_deal(body)
11
+ body = wrap_body(body)
12
+ http_client.post('/deals.json', body)
13
+ end
14
+
15
+ private
16
+
17
+ attr_reader :http_client
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ module PipelineDealsApi
2
+ module Clients
3
+ module Helper
4
+ def body_wrap(hash, key)
5
+ return hash if hash.key?(key)
6
+ wrapped_hash = {}
7
+ wrapped_hash[key] = body
8
+ wrapped_hash
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,6 @@
1
+ module PipelineDealsApi
2
+ class Configuration
3
+ API_URL = 'https://api.pipelinedeals.com/api/v3'.freeze
4
+ FORMAT = 'json'.freeze
5
+ end
6
+ end
@@ -0,0 +1,14 @@
1
+ module PipelineDealsApi
2
+ class Credentials
3
+ attr_reader :api_key, :app_key
4
+
5
+ def initialize(api_key:, app_key: nil)
6
+ @api_key = api_key.freeze
7
+ @app_key = app_key.freeze
8
+ end
9
+
10
+ def valid?
11
+ api_key.present?
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,145 @@
1
+ module PipelineDealsApi
2
+ class HttpClient
3
+ def initialize(credentials:)
4
+ @credentials = credentials
5
+ end
6
+
7
+ def get(url, body = {}, headers = {})
8
+ http_request(:get, url, body, headers)
9
+ end
10
+
11
+ def put(url, body = {}, headers = {})
12
+ http_request(:put, url, body, headers)
13
+ end
14
+
15
+ def post(url, body = {}, headers = {})
16
+ http_request(:post, url, body, headers)
17
+ end
18
+
19
+ def delete(url, body = {}, headers = {})
20
+ http_request(:delete, url, body, headers)
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :http_client
26
+
27
+ def http_request(method, url = '', body = {}, headers = {})
28
+ body = with_default_body(body).to_json
29
+ headers = with_default_headers(headers)
30
+ resp = RestClient.send(method, url, body, headers)
31
+ handle_response(Response.new(resp))
32
+ rescue RestClient::ExceptionWithResponse => e
33
+ resp = Response.new(e.response)
34
+ handle_response(resp)
35
+ end
36
+
37
+ def handle_response(resp)
38
+ return resp.json if resp.code < 400
39
+ case resp.code
40
+ when 400
41
+ raise BadRequestError.new('400 - Bad Request', resp)
42
+ when 401
43
+ raise UnauthorizedError.new('401 - Unauthorized', resp)
44
+ when 402
45
+ raise PaymentRequiredError.new('402 - Payment Required', resp)
46
+ when 403
47
+ when 404
48
+ raise NotFoundError.new('404 - Not Found', resp)
49
+ when 405
50
+ raise MethodNotAllowed.new('405 - Method Not Allowed', resp)
51
+ when 408
52
+ raise RequestTimeoutError.new('408 - Request Timeout', resp)
53
+ when 409
54
+ raise ConflictError.new('409 - Conflict', resp)
55
+ when 414
56
+ raise RequestURITooLongError.new('414 - Request URI Too Long', resp)
57
+ when 422
58
+ raise UnprocessableEntityError.new('422 - Unprocessable Entity', resp)
59
+ when 429
60
+ raise TooManyRequestsError.new('429 - Too Many Requests', resp)
61
+ when 500
62
+ raise InternalServerError.new('500 - Internal Server', resp)
63
+ when 502
64
+ raise BadGatewayError.new('502 - Bad Gateway', resp)
65
+ when 503
66
+ raise BadGatewayError.new('503 - Service Unavailable', resp)
67
+ when 504
68
+ raise GatewayTimeoutError.new('504 - Gateway Timeout', resp)
69
+ else
70
+ raise ClientError.new("#{resp.code} - Client Error", resp) if resp.code >= 400 && resp.code < 500
71
+ raise ServerError.new("#{resp.code} - Server Error", resp) if resp.code >= 500 && resp.code < 600
72
+ raise UnknownError.new("#{resp.code} - Unhandled Response error", resp)
73
+ end
74
+ end
75
+
76
+ def with_default_headers(headers = {})
77
+ defaults = {
78
+ content_type: :json,
79
+ accept: :json
80
+ }
81
+
82
+ defaults.merge(headers)
83
+ end
84
+
85
+ def with_default_body(body = {})
86
+ defaults = {
87
+ api_key: credentials.api_key,
88
+ app_key: credentials.app_key
89
+ }
90
+
91
+ defaults.merge(body)
92
+ end
93
+
94
+ class Response
95
+ def initialize(response)
96
+ @response = response
97
+ end
98
+
99
+ def code
100
+ @response.code
101
+ end
102
+
103
+ def body
104
+ @response.body
105
+ end
106
+
107
+ def json
108
+ @json ||= JSON.parse(response.body)
109
+ end
110
+ end
111
+
112
+ class ResponseError < StandardError
113
+ attr_reader :response
114
+
115
+ def initialize(msg = '', response)
116
+ @response = response
117
+ super(msg)
118
+ end
119
+ end
120
+
121
+ # 4xx error codes
122
+ class BadRequestError < ResponseError; end
123
+ class UnauthorizedError < ResponseError; end
124
+ class PaymentRequiredError < ResponseError; end
125
+ class ForbiddenError < ResponseError; end
126
+ class NotFoundError < ResponseError; end
127
+ class MethodNotAllowed < ResponseError; end
128
+ class RequestTimeoutError < ResponseError; end
129
+ class ConflictError < ResponseError; end
130
+ class RequestURITooLongError < ResponseError; end
131
+ class UnprocessableEntityError < ResponseError; end
132
+ class TooManyRequestsError < ResponseError; end
133
+ class ClientError < ResponseError; end # Catch-all
134
+
135
+ # 5xx error codes
136
+ class InternalServerError < ResponseError; end
137
+ class BadGatewayError < ResponseError; end
138
+ class ServiceUnavailableError < ResponseError; end
139
+ class GatewayTimeoutError < ResponseError; end
140
+ class ServerError < ResponseError; end # Catch-all
141
+
142
+ # Catch-all for catch-all
143
+ class UnknownError < ResponseError; end
144
+ end
145
+ end
@@ -1,3 +1,3 @@
1
1
  module PipelineDealsApi
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
@@ -1,5 +1,8 @@
1
- require "pipeline_deals_api/version"
1
+ lib = File.dirname(__FILE__) + "./lib/**/*"
2
+
3
+ Dir[lib].each do |file|
4
+ require file
5
+ end
2
6
 
3
7
  module PipelineDealsApi
4
- # Your code goes here...
5
8
  end
@@ -15,6 +15,7 @@ Gem::Specification.new do |spec|
15
15
  spec.bindir = "exe"
16
16
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
17
17
  spec.require_paths = ["lib"]
18
+ spec.add_runtime_dependency "rest-client"
18
19
  spec.add_development_dependency "bundler", "~> 1.16"
19
20
  spec.add_development_dependency "rake", "~> 10.0"
20
21
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pipeline_deals_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Sinner
@@ -10,6 +10,20 @@ bindir: exe
10
10
  cert_chain: []
11
11
  date: 2018-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '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'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +66,12 @@ files:
52
66
  - bin/console
53
67
  - bin/setup
54
68
  - lib/pipeline_deals_api.rb
69
+ - lib/pipeline_deals_api/client.rb
70
+ - lib/pipeline_deals_api/clients/deal.rb
71
+ - lib/pipeline_deals_api/clients/helper.rb
72
+ - lib/pipeline_deals_api/configuration.rb
73
+ - lib/pipeline_deals_api/credentials.rb
74
+ - lib/pipeline_deals_api/http_client.rb
55
75
  - lib/pipeline_deals_api/version.rb
56
76
  - pipeline_deals_api.gemspec
57
77
  homepage: