truework 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.
@@ -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: []