truework 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Truework
4
+ class ClientException < StandardError; end
5
+ class NonExistentRecord < ClientException; end
6
+ class RecordAlreadyExists < ClientException; end
7
+ class InvalidCredentials < ClientException; end
8
+ class BadRequest < ClientException; end
9
+ class Forbidden < ClientException; end
10
+ class UnexpectedHTTPException < ClientException; end
11
+
12
+ class ServerException < StandardError; end
13
+ class InternalServerError < ServerException; end
14
+ class BadGateway < ServerException; end
15
+ class ServiceUnavailable < ServerException; end
16
+ class GatewayTimeout < ServerException; end
17
+ end
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/https'
4
+ require 'uri'
5
+ require 'json'
6
+ require 'openssl'
7
+
8
+ require 'truework/exceptions'
9
+
10
+ module Truework
11
+ module HTTPRequest
12
+ def get(path, params = {})
13
+ request(:get, path, params)
14
+ end
15
+
16
+ def post(path, params = {})
17
+ request(:post, path, params)
18
+ end
19
+
20
+ def put(path, params = {})
21
+ request(:put, path, params)
22
+ end
23
+
24
+ def delete(path, params = {})
25
+ request(:delete, path, params)
26
+ end
27
+
28
+ def request(method, path, params = {})
29
+ uri = URI.parse("#{Truework.api_base}#{path}")
30
+
31
+ request = build_request(method, uri, params)
32
+ http = Net::HTTP.new(uri.host, uri.port)
33
+
34
+ if uri.scheme == 'https'
35
+ http.use_ssl = true
36
+ http.ca_file = Truework::DEFAULT_CA_BUNDLE_PATH
37
+ end
38
+
39
+ response = http.request(request)
40
+ handle_errors(response)
41
+ response
42
+ end
43
+
44
+ private
45
+
46
+ def handle_errors(response)
47
+ case response
48
+ when Net::HTTPSuccess
49
+ response
50
+ else
51
+ EXCEPTION_MAP.each do |response_class, exception_class|
52
+ raise exception_class, error_message_from_response(response) if response.is_a?(response_class)
53
+ end
54
+
55
+ raise Truework::UnexpectedHTTPException, "#{response.code} #{response.body}"
56
+ end
57
+ end
58
+
59
+ EXCEPTION_MAP = {
60
+ Net::HTTPUnauthorized => Truework::InvalidCredentials,
61
+ Net::HTTPNotFound => Truework::NonExistentRecord,
62
+ Net::HTTPConflict => Truework::RecordAlreadyExists,
63
+ Net::HTTPBadRequest => Truework::BadRequest,
64
+ Net::HTTPForbidden => Truework::Forbidden,
65
+ Net::HTTPInternalServerError => Truework::InternalServerError,
66
+ Net::HTTPBadGateway => Truework::BadGateway,
67
+ Net::HTTPServiceUnavailable => Truework::ServiceUnavailable,
68
+ Net::HTTPGatewayTimeOut => Truework::GatewayTimeout
69
+ }.freeze
70
+
71
+ def error_message_from_response(response)
72
+ body = response.body
73
+ json = JSON.parse(body) if body && body.strip != ''
74
+ return json['error'] if json&.key?('error')
75
+
76
+ body
77
+ rescue JSON::ParserError
78
+ body
79
+ end
80
+
81
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
82
+ def build_request(method, uri, params)
83
+ klass = case method
84
+ when :get
85
+ Net::HTTP::Get
86
+ when :post
87
+ Net::HTTP::Post
88
+ when :put
89
+ Net::HTTP::Put
90
+ when :delete
91
+ Net::HTTP::Delete
92
+ end
93
+
94
+ case method
95
+ when :get, :delete
96
+ uri.query = URI.encode_www_form(params) if params && !params.empty?
97
+ req = klass.new(uri.request_uri)
98
+ when :post, :put
99
+ req = klass.new(uri.request_uri)
100
+ req.body = JSON.generate(params) unless params.empty?
101
+ end
102
+
103
+ req['Content-Type'] = 'application/json'
104
+ req['Accept'] = "application/json#{"; version=#{Truework.api_version}" if Truework.api_version}"
105
+ req['User-Agent'] = "Truework Ruby SDK #{Truework::VERSION};"\
106
+ "#{RUBY_PLATFORM};#{RUBY_ENGINE};#{RUBY_VERSION} p#{RUBY_PATCHLEVEL}"
107
+ req['Authorization'] = "Bearer #{Truework.api_key}"
108
+
109
+ req
110
+ end
111
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
112
+ end
113
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'truework/api_response'
4
+
5
+ module Truework
6
+ class ListResponse < APIResponse
7
+ attr_reader :data
8
+
9
+ def initialize(url, status_code, http_body: '', api_version: nil, klass: Truework::APIResource)
10
+ super
11
+ results = json && json[:results]
12
+ @data = klass.convert_to_truework_object(results) if results
13
+ end
14
+
15
+ def self.from_response(response, klass: Truework::APIResource)
16
+ new(
17
+ response.uri,
18
+ response.code.to_i,
19
+ http_body: response.body,
20
+ api_version: extract_version(response),
21
+ klass: klass
22
+ )
23
+ end
24
+
25
+ def num_results
26
+ json && json[:count]
27
+ end
28
+
29
+ def next_url
30
+ json && json[:next]
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'truework/resources/address'
4
+ require 'truework/resources/company'
5
+ require 'truework/resources/document'
6
+ require 'truework/resources/earnings'
7
+ require 'truework/resources/employee'
8
+ require 'truework/resources/employer'
9
+ require 'truework/resources/position'
10
+ require 'truework/resources/price'
11
+ require 'truework/resources/report'
12
+ require 'truework/resources/salary'
13
+ require 'truework/resources/target'
14
+ require 'truework/resources/turnaround_time'
15
+ require 'truework/resources/verification_request'
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Truework
4
+ class Address < APIResource
5
+ attribute? :line_one, Types::String
6
+ attribute? :line_two, Types::String
7
+ attribute? :city, Types::String
8
+ attribute? :state, Types::String
9
+ attribute? :country, Types::String
10
+ attribute? :postal_code, Types::String
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Truework
4
+ class Company < APIResource
5
+ extend APIOperations::List
6
+
7
+ attribute :name, Types::String
8
+ attribute? :id, Types::Integer
9
+ attribute? :domain, Types::String
10
+
11
+ def self.resource_path
12
+ '/companies/'
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Truework
4
+ class Document < APIResource
5
+ attribute :filename, Types::String
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Truework
4
+ class Earnings < APIResource
5
+ attribute :year, Types::Integer
6
+ attribute :base, Types::JSON::Decimal
7
+ attribute :overtime, Types::JSON::Decimal
8
+ attribute :commission, Types::JSON::Decimal
9
+ attribute :bonus, Types::JSON::Decimal
10
+ attribute :total, Types::JSON::Decimal
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'truework/resources/earnings'
4
+ require 'truework/resources/position'
5
+ require 'truework/resources/salary'
6
+
7
+ module Truework
8
+ class Employee < APIResource
9
+ attribute :first_name, Types::String
10
+ attribute :last_name, Types::String
11
+ attribute :status, Types::String
12
+ attribute? :hired_date, Types::JSON::Date
13
+ attribute? :end_of_employment, Types::JSON::Date
14
+ attribute? :earnings, Types::Array.of(Earnings)
15
+ attribute? :positions, Types::Array.of(Position)
16
+ attribute? :salary, Salary
17
+ end
18
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'truework/resources/address'
4
+
5
+ module Truework
6
+ class Employer < APIResource
7
+ attribute :name, Types::String
8
+ attribute? :address, Truework::Address
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Truework
4
+ class Position < APIResource
5
+ attribute :title, Types::String
6
+ attribute :start_date, Types::JSON::Date
7
+ attribute? :end_date, Types::JSON::Date
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Truework
4
+ class Price < APIResource
5
+ attribute :amount, Types::JSON::Decimal
6
+ attribute :currency, Types::String
7
+ end
8
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'truework/resources/employee'
4
+ require 'truework/resources/employer'
5
+ require 'truework/resources/verification_request'
6
+
7
+ module Truework
8
+ class Report < APIResource
9
+ extend APIOperations::Retrieve
10
+
11
+ attribute :created, Types::JSON::DateTime
12
+ attribute :current_as_of, Types::JSON::DateTime
13
+ attribute :verification_request, VerificationRequest
14
+ attribute :employer, Employer
15
+ attribute :employee, Employee
16
+
17
+ def self.instance_url(verification_request_id)
18
+ "/verification-requests/#{verification_request_id}/report/"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Truework
4
+ class Salary < APIResource
5
+ attribute :gross_pay, Types::JSON::Decimal
6
+ attribute? :pay_frequency, Types::String
7
+ attribute? :hours_per_week, Types::Coercible::Integer
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Truework
4
+ class Target < APIResource
5
+ attribute :company, Company
6
+ attribute :first_name, Types::String
7
+ attribute :last_name, Types::String
8
+ attribute :contact_email, Types::String
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Truework
4
+ class TurnaroundTime < APIResource
5
+ attribute? :upper_bound, Types::Params::Integer
6
+ attribute? :lower_bound, Types::Params::Integer
7
+ end
8
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'truework/resources/document'
4
+ require 'truework/resources/target'
5
+ require 'truework/resources/turnaround_time'
6
+
7
+ module Truework
8
+ class VerificationRequest < APIResource
9
+ extend APIOperations::Create
10
+ extend APIOperations::List
11
+ extend APIOperations::Retrieve
12
+
13
+ attribute :id, Types::String
14
+ attribute? :type, Types::String
15
+ attribute :created, Types::Params::DateTime
16
+ attribute? :state, Types::String
17
+ attribute? :price, Price
18
+ attribute? :turnaround_time, TurnaroundTime
19
+ attribute? :permissible_purpose, Types::String
20
+ attribute? :target, Target
21
+ attribute? :documents, Types::Array.of(Document)
22
+
23
+ def self.resource_path
24
+ '/verification-requests/'
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Truework
4
+ module Types
5
+ include Dry.Types()
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Truework
4
+ VERSION = '0.0.1'
5
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'truework/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'truework'
9
+ spec.version = Truework::VERSION
10
+ spec.required_ruby_version = '>= 2.4'
11
+ spec.authors = ['Truework']
12
+ spec.email = ['ruby-sdk@truework.com']
13
+
14
+ spec.summary = 'Ruby bindings for the Truework API.'
15
+ spec.homepage = 'https://www.github.com/truework/truework-ruby-sdk'
16
+ spec.license = 'MIT'
17
+
18
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
+ f.match(%r{^(test|spec|features)/})
20
+ end
21
+ spec.bindir = 'exe'
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.add_dependency 'dry-struct', '~> 1.2'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 2.1'
28
+ spec.add_development_dependency 'rake', '~> 10.0'
29
+ spec.add_development_dependency 'rspec', '~> 3.0'
30
+ spec.add_development_dependency 'rubocop', '~> 0.79'
31
+ spec.add_development_dependency 'webmock', '~> 3.8'
32
+ end
metadata ADDED
@@ -0,0 +1,165 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: truework
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Truework
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-02-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-struct
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.79'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.79'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.8'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.8'
97
+ description:
98
+ email:
99
+ - ruby-sdk@truework.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".rubocop.yml"
107
+ - ".travis.yml"
108
+ - Gemfile
109
+ - LICENSE.txt
110
+ - README.md
111
+ - Rakefile
112
+ - bin/console
113
+ - bin/setup
114
+ - lib/truework.rb
115
+ - lib/truework/api_operations/create.rb
116
+ - lib/truework/api_operations/list.rb
117
+ - lib/truework/api_operations/retrieve.rb
118
+ - lib/truework/api_resource.rb
119
+ - lib/truework/api_response.rb
120
+ - lib/truework/data/ca-certificates.crt
121
+ - lib/truework/exceptions.rb
122
+ - lib/truework/http_request.rb
123
+ - lib/truework/list_response.rb
124
+ - lib/truework/resources.rb
125
+ - lib/truework/resources/address.rb
126
+ - lib/truework/resources/company.rb
127
+ - lib/truework/resources/document.rb
128
+ - lib/truework/resources/earnings.rb
129
+ - lib/truework/resources/employee.rb
130
+ - lib/truework/resources/employer.rb
131
+ - lib/truework/resources/position.rb
132
+ - lib/truework/resources/price.rb
133
+ - lib/truework/resources/report.rb
134
+ - lib/truework/resources/salary.rb
135
+ - lib/truework/resources/target.rb
136
+ - lib/truework/resources/turnaround_time.rb
137
+ - lib/truework/resources/verification_request.rb
138
+ - lib/truework/types.rb
139
+ - lib/truework/version.rb
140
+ - truework.gemspec
141
+ homepage: https://www.github.com/truework/truework-ruby-sdk
142
+ licenses:
143
+ - MIT
144
+ metadata: {}
145
+ post_install_message:
146
+ rdoc_options: []
147
+ require_paths:
148
+ - lib
149
+ required_ruby_version: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '2.4'
154
+ required_rubygems_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ requirements: []
160
+ rubyforge_project:
161
+ rubygems_version: 2.6.14.4
162
+ signing_key:
163
+ specification_version: 4
164
+ summary: Ruby bindings for the Truework API.
165
+ test_files: []