paychex_api 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +85 -0
- data/lib/paychex_api.rb +2 -0
- data/lib/paychex_api/api_array.rb +143 -0
- data/lib/paychex_api/client.rb +79 -0
- data/lib/paychex_api/client/companies.rb +24 -0
- data/lib/paychex_api/client/workers.rb +31 -0
- data/lib/paychex_api/version.rb +3 -0
- data/paychex_api.gemspec +34 -0
- data/spec/fixtures/auth.json +6 -0
- data/spec/fixtures/communications.json +99 -0
- data/spec/fixtures/companies.json +38 -0
- data/spec/fixtures/organizations.json +32 -0
- data/spec/fixtures/workers.json +85 -0
- data/spec/paychex_api/client/companies_spec.rb +23 -0
- data/spec/paychex_api/client/workers_spec.rb +33 -0
- data/spec/paychex_api/client_spec.rb +26 -0
- data/spec/support/fake_paychex.rb +61 -0
- data/spec/test_helper.rb +20 -0
- metadata +240 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 758c001f0cf47cdd37c2e59088fbba2a9ffa8c2e
|
4
|
+
data.tar.gz: bde50ccd01aeb9f777074b41ac4fd766cb893437
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 005a408302d26519b98a7cfcb04b602d1290e452cebf794880f14350626c3e6983ce0d8fb3b54ba90b698f1d0f2814ed0b25c132c972acc48974c77cd9e09be0
|
7
|
+
data.tar.gz: fa0bb1560f60452e3220bd045a2bf383660de76fa5d8436d497ec1cdcab92b0baea68070e823c94e7192c275c4dba06c7d8b51046e1a64abb8ddc89a18beba0b
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
bridge_api (0.0.1)
|
5
|
+
faraday (~> 0.9.0)
|
6
|
+
faraday_middleware (~> 0.9.0)
|
7
|
+
footrest (>= 0.5.1)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
activesupport (5.1.4)
|
13
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
14
|
+
i18n (~> 0.7)
|
15
|
+
minitest (~> 5.1)
|
16
|
+
tzinfo (~> 1.1)
|
17
|
+
addressable (2.5.2)
|
18
|
+
public_suffix (>= 2.0.2, < 4.0)
|
19
|
+
byebug (8.2.5)
|
20
|
+
coderay (1.1.2)
|
21
|
+
concurrent-ruby (1.0.5)
|
22
|
+
crack (0.4.3)
|
23
|
+
safe_yaml (~> 1.0.0)
|
24
|
+
diff-lcs (1.3)
|
25
|
+
faraday (0.9.2)
|
26
|
+
multipart-post (>= 1.2, < 3)
|
27
|
+
faraday_middleware (0.9.2)
|
28
|
+
faraday (>= 0.7.4, < 0.10)
|
29
|
+
footrest (0.5.1)
|
30
|
+
activesupport (>= 3.0.0)
|
31
|
+
faraday (~> 0.9.0)
|
32
|
+
link_header (>= 0.0.7)
|
33
|
+
hashdiff (0.3.7)
|
34
|
+
i18n (0.9.1)
|
35
|
+
concurrent-ruby (~> 1.0)
|
36
|
+
link_header (0.0.8)
|
37
|
+
method_source (0.9.0)
|
38
|
+
minitest (5.11.1)
|
39
|
+
multipart-post (2.0.0)
|
40
|
+
pry (0.11.3)
|
41
|
+
coderay (~> 1.1.0)
|
42
|
+
method_source (~> 0.9.0)
|
43
|
+
public_suffix (3.0.1)
|
44
|
+
rack (1.6.8)
|
45
|
+
rack-protection (1.5.3)
|
46
|
+
rack
|
47
|
+
rake (0.9.6)
|
48
|
+
rspec (2.99.0)
|
49
|
+
rspec-core (~> 2.99.0)
|
50
|
+
rspec-expectations (~> 2.99.0)
|
51
|
+
rspec-mocks (~> 2.99.0)
|
52
|
+
rspec-core (2.99.2)
|
53
|
+
rspec-expectations (2.99.2)
|
54
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
55
|
+
rspec-mocks (2.99.4)
|
56
|
+
safe_yaml (1.0.4)
|
57
|
+
sinatra (1.4.8)
|
58
|
+
rack (~> 1.5)
|
59
|
+
rack-protection (~> 1.4)
|
60
|
+
tilt (>= 1.3, < 3)
|
61
|
+
thread_safe (0.3.6)
|
62
|
+
tilt (1.4.1)
|
63
|
+
tzinfo (1.2.4)
|
64
|
+
thread_safe (~> 0.1)
|
65
|
+
webmock (1.22.6)
|
66
|
+
addressable (>= 2.3.6)
|
67
|
+
crack (>= 0.3.2)
|
68
|
+
hashdiff
|
69
|
+
|
70
|
+
PLATFORMS
|
71
|
+
ruby
|
72
|
+
|
73
|
+
DEPENDENCIES
|
74
|
+
bridge_api!
|
75
|
+
bundler (~> 1.0, >= 1.0.0)
|
76
|
+
byebug (~> 8.2.2)
|
77
|
+
pry (~> 0)
|
78
|
+
rake (~> 0)
|
79
|
+
rspec (~> 2.6)
|
80
|
+
sinatra (~> 1.0)
|
81
|
+
tilt (~> 1.3, >= 1.3.4)
|
82
|
+
webmock (~> 1.22.6)
|
83
|
+
|
84
|
+
BUNDLED WITH
|
85
|
+
1.16.0
|
data/lib/paychex_api.rb
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
|
2
|
+
module PaychexAPI
|
3
|
+
class ApiArray
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
@next_page = nil
|
7
|
+
@prev_page = nil
|
8
|
+
|
9
|
+
attr_reader :status, :headers, :members, :links, :metadata, :members
|
10
|
+
|
11
|
+
def self.process_response(response, api_client)
|
12
|
+
ApiArray.new(response, api_client)
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(response, api_client)
|
16
|
+
@meta_fields = %w(metadata links)
|
17
|
+
@api_client = api_client
|
18
|
+
@links = []
|
19
|
+
@metadata = {}
|
20
|
+
case response.status
|
21
|
+
when *((200..206).to_a + [302])
|
22
|
+
apply_response_metadata(response)
|
23
|
+
@members = get_response_content(response)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def length
|
28
|
+
@members.length
|
29
|
+
end
|
30
|
+
|
31
|
+
def [](i)
|
32
|
+
@members[i]
|
33
|
+
end
|
34
|
+
|
35
|
+
def last
|
36
|
+
@members.last
|
37
|
+
end
|
38
|
+
|
39
|
+
def each(&block)
|
40
|
+
@members.each { |member| block.call(member) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def pages?
|
44
|
+
!@next_page.nil?
|
45
|
+
end
|
46
|
+
|
47
|
+
def next_page
|
48
|
+
load_page(@next_page)
|
49
|
+
end
|
50
|
+
|
51
|
+
def each_page(&block)
|
52
|
+
block.call(@members, @linked, @meta)
|
53
|
+
while @next_page
|
54
|
+
response = get_page(@next_page)
|
55
|
+
apply_response_metadata(response, false)
|
56
|
+
@members = get_response_content(response)
|
57
|
+
block.call(@members, @linked, @meta)
|
58
|
+
end
|
59
|
+
@link_hash = {}
|
60
|
+
end
|
61
|
+
|
62
|
+
def all_pages!
|
63
|
+
if pages?
|
64
|
+
response = get_page(@next_page)
|
65
|
+
apply_response_metadata(response)
|
66
|
+
@members.concat(get_response_content(response))
|
67
|
+
while @next_page
|
68
|
+
response = get_page(@next_page)
|
69
|
+
apply_response_metadata(response)
|
70
|
+
@members.concat(get_response_content(response))
|
71
|
+
end
|
72
|
+
end
|
73
|
+
self
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def get_page(url, params = {})
|
79
|
+
query = URI.parse(url).query
|
80
|
+
p = CGI.parse(query).merge(params)
|
81
|
+
u = url.gsub("?#{query}", '')
|
82
|
+
p.each { |k, v| p[k] = v.first if v.is_a?(Array) }
|
83
|
+
@api_client.connection.send(:get) do |r|
|
84
|
+
r.url(u, p)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def load_page(url)
|
89
|
+
response = get_page(url)
|
90
|
+
ApiArray.process_response(response, @api_client)
|
91
|
+
end
|
92
|
+
|
93
|
+
def get_response_content(response)
|
94
|
+
return [] unless response.body.is_a?(Hash)
|
95
|
+
content = response.body['content']
|
96
|
+
if content.length > 0
|
97
|
+
return content
|
98
|
+
end
|
99
|
+
[]
|
100
|
+
end
|
101
|
+
|
102
|
+
def apply_response_metadata(response, concat = true)
|
103
|
+
unless concat
|
104
|
+
@links = {}
|
105
|
+
@metadata = {}
|
106
|
+
end
|
107
|
+
@status = response.status
|
108
|
+
@headers = response.headers
|
109
|
+
@method = response.env[:method]
|
110
|
+
init_pages(response)
|
111
|
+
init_linked(response)
|
112
|
+
init_meta(response)
|
113
|
+
end
|
114
|
+
|
115
|
+
def init_linked(response)
|
116
|
+
if response.body.is_a?(Hash) && response.body.key?('links')
|
117
|
+
@links = @links.concat(response.body['links'])
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def init_meta(response)
|
122
|
+
if response.body.is_a?(Hash) && response.body.key?('metadata')
|
123
|
+
@metadata = response.body['metadata']
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def init_pages(response)
|
128
|
+
@next_page = nil
|
129
|
+
@prev_page = nil
|
130
|
+
if response.body.is_a?(Hash) && response.body.key?('links')
|
131
|
+
response.body['links'].each do |link|
|
132
|
+
case link['rel']
|
133
|
+
when 'next'
|
134
|
+
@next_page = link['href']
|
135
|
+
when 'prev'
|
136
|
+
@prev_page = link['href']
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'footrest/client'
|
2
|
+
require 'faraday'
|
3
|
+
require 'footrest'
|
4
|
+
require 'footrest/http_error'
|
5
|
+
require 'footrest/pagination'
|
6
|
+
require 'footrest/follow_redirects'
|
7
|
+
require 'footrest/parse_json'
|
8
|
+
require 'base64'
|
9
|
+
require 'active_support/time'
|
10
|
+
require 'paychex_api/api_array'
|
11
|
+
|
12
|
+
module PaychexAPI
|
13
|
+
class Client < Footrest::Client
|
14
|
+
|
15
|
+
API_PATH = ""
|
16
|
+
COMPANIES_PATH = '/companies'
|
17
|
+
ORGANIZATIONS_PATH = '/organizations'
|
18
|
+
JOB_TITLES_PATH = '/jobtitles'
|
19
|
+
WORKER_STATUSES_PATH = '/workerstatuses'
|
20
|
+
WORKERS_PATH = '/workers'
|
21
|
+
COMMUNICATIONS_PATH = '/communications'
|
22
|
+
COMPENSATION_PATH = '/compensation'
|
23
|
+
DIRECT_DEPOSITS_PATH = '/directdeposits'
|
24
|
+
PAY_PERIODS_PATH = '/payperiods'
|
25
|
+
PAY_COMPONENTS_PATH = '/paycomponents'
|
26
|
+
CHECKS_PATH = '/checks'
|
27
|
+
OAUTH_TOKEN_PATH = '/auth/oauth/v2/token'
|
28
|
+
|
29
|
+
attr_reader :authorization
|
30
|
+
|
31
|
+
Dir[File.dirname(__FILE__) + '/client/*.rb'].each do |file|
|
32
|
+
require file
|
33
|
+
include self.const_get("#{File.basename(file).gsub('.rb','').split("_").map{|ea| ea.capitalize}.join('')}")
|
34
|
+
end
|
35
|
+
|
36
|
+
# Override Footrest request for ApiArray support
|
37
|
+
def request(method, &block)
|
38
|
+
if @authorization.blank? || @authorization['expiration'] <= DateTime.now - 30.seconds
|
39
|
+
temp_client = get_default_faraday
|
40
|
+
response = temp_client.post(
|
41
|
+
OAUTH_TOKEN_PATH,
|
42
|
+
{
|
43
|
+
client_id: config[:client_id],
|
44
|
+
client_secret: config[:client_secret],
|
45
|
+
grant_type: 'client_credentials'
|
46
|
+
}
|
47
|
+
)
|
48
|
+
@authorization = response.body
|
49
|
+
@authorization['expiration'] = DateTime.now + @authorization['expires_in'].to_i.seconds
|
50
|
+
end
|
51
|
+
connection.headers[:authorization] = "Bearer #{@authorization['access_token']}"
|
52
|
+
ApiArray::process_response(connection.send(method, &block), self)
|
53
|
+
end
|
54
|
+
|
55
|
+
def set_connection(config)
|
56
|
+
config[:logger] = config[:logging] if config[:logging]
|
57
|
+
@connection = get_default_faraday
|
58
|
+
end
|
59
|
+
|
60
|
+
def get_default_faraday
|
61
|
+
Faraday.new(url: config[:prefix]) do |faraday|
|
62
|
+
faraday.request :multipart
|
63
|
+
faraday.request :url_encoded
|
64
|
+
if config[:logger] == true
|
65
|
+
faraday.response :logger
|
66
|
+
elsif config[:logger]
|
67
|
+
faraday.use Faraday::Response::Logger, config[:logger]
|
68
|
+
end
|
69
|
+
faraday.use Footrest::FollowRedirects, limit: 5 unless config[:follow_redirects] == false
|
70
|
+
faraday.adapter Faraday.default_adapter
|
71
|
+
faraday.use Footrest::ParseJson, :content_type => /\bjson$/
|
72
|
+
faraday.use Footrest::RaiseFootrestErrors
|
73
|
+
faraday.use Footrest::Pagination
|
74
|
+
faraday.headers[:accept] = "application/json"
|
75
|
+
faraday.headers[:user_agent] = "Footrest"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module PaychexAPI
|
2
|
+
class Client
|
3
|
+
module Companies
|
4
|
+
|
5
|
+
def get_company(company_id, params = {})
|
6
|
+
get("#{API_PATH}#{COMPANIES_PATH}/#{company_id}", params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_company_by_display_id(display_id, params = {})
|
10
|
+
params = params.merge({displayid: display_id})
|
11
|
+
get("#{API_PATH}#{COMPANIES_PATH}", params)
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_organizations(company_id, organization_id, params = {})
|
15
|
+
get("#{API_PATH}#{COMPANIES_PATH}/#{company_id}#{ORGANIZATIONS_PATH}", params)
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_organization(company_id, organization_id, params = {})
|
19
|
+
get("#{API_PATH}#{COMPANIES_PATH}/#{company_id}#{ORGANIZATIONS_PATH}/#{organization_id}", params)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module PaychexAPI
|
2
|
+
class Client
|
3
|
+
module Workers
|
4
|
+
|
5
|
+
def get_all_workers(company_id, params = {})
|
6
|
+
get("#{API_PATH}#{COMPANIES_PATH}/#{company_id}#{WORKERS_PATH}", params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_communications(worker_id, params = {})
|
10
|
+
get("#{API_PATH}#{WORKERS_PATH}/#{worker_id}#{COMMUNICATIONS_PATH}", params)
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_communication(worker_id, communication_id, params = {})
|
14
|
+
get("#{API_PATH}#{WORKERS_PATH}/#{worker_id}#{COMMUNICATIONS_PATH}/#{communication_id}", params)
|
15
|
+
end
|
16
|
+
|
17
|
+
def create_communication(worker_id, params = {})
|
18
|
+
post("#{API_PATH}#{WORKERS_PATH}/#{worker_id}#{COMMUNICATIONS_PATH}", params)
|
19
|
+
end
|
20
|
+
|
21
|
+
def update_communication(worker_id, communication_id, params = {})
|
22
|
+
put("#{API_PATH}#{WORKERS_PATH}/#{worker_id}#{COMMUNICATIONS_PATH}/#{communication_id}", params)
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete_communication(worker_id, communication_id, params = {})
|
26
|
+
delete("#{API_PATH}#{WORKERS_PATH}/#{worker_id}#{COMMUNICATIONS_PATH}/#{communication_id}", params)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/paychex_api.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require 'paychex_api/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.authors = ["Jay Shaffer"]
|
7
|
+
gem.email = ["jshaffer@instructure.com"]
|
8
|
+
gem.description = %q{Interface for interacting with the paychex enterprise API}
|
9
|
+
gem.summary = %q{Paychex API}
|
10
|
+
gem.homepage = ""
|
11
|
+
gem.license = 'MIT'
|
12
|
+
|
13
|
+
gem.files = `git ls-files`.split("\n")
|
14
|
+
gem.files += Dir.glob("lib/**/*.rb")
|
15
|
+
gem.files += Dir.glob("spec/**/*")
|
16
|
+
gem.test_files = Dir.glob("spec/**/*")
|
17
|
+
gem.name = "paychex_api"
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
gem.version = PaychexAPI::VERSION
|
20
|
+
|
21
|
+
gem.add_development_dependency 'rake', '~> 0'
|
22
|
+
gem.add_development_dependency 'bundler', '~> 1.0', '>= 1.0.0'
|
23
|
+
gem.add_development_dependency 'rspec', '~> 2.6'
|
24
|
+
gem.add_development_dependency 'webmock', '~>1.22.6'
|
25
|
+
gem.add_development_dependency 'pry', '~> 0'
|
26
|
+
gem.add_development_dependency 'tilt', '>= 1.3.4', '~> 1.3'
|
27
|
+
gem.add_development_dependency 'sinatra', '~> 1.0'
|
28
|
+
gem.add_development_dependency 'byebug', '~> 8.2.2'
|
29
|
+
|
30
|
+
gem.add_dependency 'footrest', '>= 0.5.1'
|
31
|
+
gem.add_dependency 'faraday', '~> 0.9.0'
|
32
|
+
gem.add_dependency 'faraday_middleware', '~> 0.9.0'
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
{
|
2
|
+
"content": [
|
3
|
+
{
|
4
|
+
"communicationId": "00Z5V9BTINBT97UMERCA",
|
5
|
+
"type": "EMAIL",
|
6
|
+
"usageType": "BUSINESS",
|
7
|
+
"uri": "jd_work@noreplay.com",
|
8
|
+
"links": [
|
9
|
+
{
|
10
|
+
"rel": "self",
|
11
|
+
"href": "https://api.paychex.com/workers/00Z5V9BTIHRQF2CF7BTH/communications/00Z5V9BTINBT97UMERCA"
|
12
|
+
}
|
13
|
+
]
|
14
|
+
},
|
15
|
+
{
|
16
|
+
"communicationId": "00Z5V9BTINBT97UMERCB",
|
17
|
+
"type": "PHONE",
|
18
|
+
"usageType": "BUSINESS",
|
19
|
+
"dialCountry": "1",
|
20
|
+
"dialArea": "999",
|
21
|
+
"dialNumber": "8887777",
|
22
|
+
"dialExtension": "6",
|
23
|
+
"links": [
|
24
|
+
{
|
25
|
+
"rel": "self",
|
26
|
+
"href": "https://api.paychex.com/workers/00Z5V9BTIHRQF2CF7BTH/communications/00Z5V9BTINBT97UMERCB"
|
27
|
+
}
|
28
|
+
]
|
29
|
+
},
|
30
|
+
{
|
31
|
+
"communicationId": "00Z5V9BTINBT97UMERCC",
|
32
|
+
"type": "MOBILE_PHONE",
|
33
|
+
"usageType": "BUSINESS",
|
34
|
+
"dialCountry": "1",
|
35
|
+
"dialArea": "777",
|
36
|
+
"dialNumber": "6665555",
|
37
|
+
"links": [
|
38
|
+
{
|
39
|
+
"rel": "self",
|
40
|
+
"href": "https://api.paychex.com/workers/00Z5V9BTIHRQF2CF7BTH/communications/00Z5V9BTINBT97UMERCC"
|
41
|
+
}
|
42
|
+
]
|
43
|
+
},
|
44
|
+
{
|
45
|
+
"communicationId": "00Z5V9BTINBT97UMERCD",
|
46
|
+
"type": "FAX",
|
47
|
+
"usageType": "BUSINESS",
|
48
|
+
"dialCountry": "1",
|
49
|
+
"dialArea": "555",
|
50
|
+
"dialNumber": "4443333",
|
51
|
+
"links": [
|
52
|
+
{
|
53
|
+
"rel": "self",
|
54
|
+
"href": "https://api.paychex.com/workers/00Z5V9BTIHRQF2CF7BTH/communications/00Z5V9BTINBT97UMERCD"
|
55
|
+
}
|
56
|
+
]
|
57
|
+
},
|
58
|
+
{
|
59
|
+
"communicationId": "00Z5V9BTINBT97UMERCE",
|
60
|
+
"type": "PAGER",
|
61
|
+
"usageType": "BUSINESS",
|
62
|
+
"dialCountry": "1",
|
63
|
+
"dialArea": "666",
|
64
|
+
"dialNumber": "5554444",
|
65
|
+
"links": [
|
66
|
+
{
|
67
|
+
"rel": "self",
|
68
|
+
"href": "https://api.paychex.com/workers/00Z5V9BTIHRQF2CF7BTH/communications/00Z5V9BTINBT97UMERCE"
|
69
|
+
}
|
70
|
+
]
|
71
|
+
},
|
72
|
+
{
|
73
|
+
"communicationId": "00Z5V9BTINBT97UMERCF",
|
74
|
+
"type": "STREET_ADDRESS",
|
75
|
+
"streetLineOne": "1 Main Street",
|
76
|
+
"streetLineTwo": "Office 3",
|
77
|
+
"city": "Webster",
|
78
|
+
"countrySubdivisionCode": "NEW_YORK",
|
79
|
+
"postalCode": "14580",
|
80
|
+
"countryCode": "US",
|
81
|
+
"links": [
|
82
|
+
{
|
83
|
+
"rel": "self",
|
84
|
+
"href": "https://api.paychex.com/workers/00Z5V9BTIHRQF2CF7BTH/communications/00Z5V9BTINBT97UMERCF"
|
85
|
+
}
|
86
|
+
]
|
87
|
+
}
|
88
|
+
],
|
89
|
+
"links": [
|
90
|
+
{
|
91
|
+
"rel": "self",
|
92
|
+
"href": "https://api.paychex.com/workers/00Z5V9BTIHRQF2CF7BTH/communications"
|
93
|
+
},
|
94
|
+
{
|
95
|
+
"rel": "create",
|
96
|
+
"href": "https://api.paychex.com/workers/00Z5V9BTIHRQF2CF7BTH/communications"
|
97
|
+
}
|
98
|
+
]
|
99
|
+
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
{
|
2
|
+
"metadata": {"contentItemCount": 1},
|
3
|
+
"content": [ {
|
4
|
+
"companyId": "99Z5V9BTI8J2FCGESC05",
|
5
|
+
"displayId": "09620579",
|
6
|
+
"legalName": "Monsters, Inc",
|
7
|
+
"legalId": {
|
8
|
+
"legalIdType": "FEIN",
|
9
|
+
"legalIdValue": "995886885"
|
10
|
+
},
|
11
|
+
"communications": [ {
|
12
|
+
"type": "STREET_ADDRESS",
|
13
|
+
"usageType": "BUSINESS",
|
14
|
+
"streetLineOne": "Mike St",
|
15
|
+
"streetLineTwo": "Sulley Ln",
|
16
|
+
"city": "ANAHEIM",
|
17
|
+
"countrySubdivisionCode": "CA",
|
18
|
+
"postalCode": "92802",
|
19
|
+
"countryCode": "US"
|
20
|
+
}],
|
21
|
+
"links": [
|
22
|
+
{
|
23
|
+
"rel": "self",
|
24
|
+
"href": "https://api.paychex.com/companies/99Z5V9BTI8J2FCGESC05"
|
25
|
+
},
|
26
|
+
{
|
27
|
+
"rel": "workers",
|
28
|
+
"href": "https://api.paychex.com/companies/99Z5V9BTI8J2FCGESC05/workers"
|
29
|
+
}
|
30
|
+
]
|
31
|
+
}],
|
32
|
+
"links": [
|
33
|
+
{
|
34
|
+
"rel": "self",
|
35
|
+
"href": "https://api.paychex.com/companies"
|
36
|
+
}
|
37
|
+
]
|
38
|
+
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
{
|
2
|
+
"content": [
|
3
|
+
{
|
4
|
+
"organizationId": "970000055981384",
|
5
|
+
"name": "2 Division B",
|
6
|
+
"links": [
|
7
|
+
{
|
8
|
+
"rel": "self",
|
9
|
+
"href": "https://api.paychex.com/companies/99Z5V9BTI8J2FCGESC05/organizations/970000055981384"
|
10
|
+
},
|
11
|
+
{
|
12
|
+
"rel": "parent",
|
13
|
+
"href": "https://api.paychex.com/companies/99Z5V9BTI8J2FCGESC05/organizations/970000055981383"
|
14
|
+
},
|
15
|
+
{
|
16
|
+
"rel": "child",
|
17
|
+
"href": "https://api.paychex.com/companies/99Z5V9BTI8J2FCGESC05/organizations/970000055981385"
|
18
|
+
},
|
19
|
+
{
|
20
|
+
"rel": "child",
|
21
|
+
"href": "https://api.paychex.com/companies/99Z5V9BTI8J2FCGESC05/organizations/970000055981386"
|
22
|
+
}
|
23
|
+
]
|
24
|
+
}
|
25
|
+
],
|
26
|
+
"links": [
|
27
|
+
{
|
28
|
+
"rel": "self",
|
29
|
+
"href": "https://api.paychex.com/companies/99Z5V9BTI8J2FCGESC05/organizations"
|
30
|
+
}
|
31
|
+
]
|
32
|
+
}
|
@@ -0,0 +1,85 @@
|
|
1
|
+
{
|
2
|
+
"metadata": {
|
3
|
+
"contentItemCount": 5,
|
4
|
+
"pagination": {
|
5
|
+
"offset": 5,
|
6
|
+
"limit": 5,
|
7
|
+
"itemCount": 56
|
8
|
+
}
|
9
|
+
},
|
10
|
+
"content": [
|
11
|
+
{
|
12
|
+
"workerId": "00Z5V9BTIHRQF2CF7BTH",
|
13
|
+
"employeeId": "3052",
|
14
|
+
"workerType": "EMPLOYEE",
|
15
|
+
"employmentType": "FULL_TIME",
|
16
|
+
"exemptionType": "NON_EXEMPT",
|
17
|
+
"birthDate": "1899-07-01T00:00:00Z",
|
18
|
+
"clockId": "4321",
|
19
|
+
"sex": "MALE",
|
20
|
+
"ethnicityCode": "WHITE_NOT_OF_HISPANIC_ORIGIN",
|
21
|
+
"hireDate": "2015-06-15T00:00:00Z",
|
22
|
+
"name": {
|
23
|
+
"familyName": "JONES",
|
24
|
+
"middleName": "H",
|
25
|
+
"givenName": "INDIANA",
|
26
|
+
"preferredName": "Indi",
|
27
|
+
"qualificationAffixCode": "Jr",
|
28
|
+
"titleAffixCode": "DR"
|
29
|
+
},
|
30
|
+
"legalId": {
|
31
|
+
"legalIdType": "SSN",
|
32
|
+
"legalIdValue": "333221111"
|
33
|
+
},
|
34
|
+
"currentStatus": {
|
35
|
+
"workerStatusId": "00DWS906IMW2JSH8AQJ9",
|
36
|
+
"statusReason": "HIRED",
|
37
|
+
"statusType": "ACTIVE",
|
38
|
+
"effectiveDate": "2015-06-15T00:00:00Z"
|
39
|
+
},
|
40
|
+
"job": {
|
41
|
+
"jobTitleId": "00DWS906IMW2JSH8AQJ8",
|
42
|
+
"title": "Archaeologist"
|
43
|
+
},
|
44
|
+
"organization": {
|
45
|
+
"organizationId": "970000055981384",
|
46
|
+
"name": "2 Division B"
|
47
|
+
},
|
48
|
+
"supervisor": {
|
49
|
+
"workerId": "00H2A1IUJ4IPERJ589YE",
|
50
|
+
"name": {
|
51
|
+
"familyName": "Scott",
|
52
|
+
"givenName": "Willie"
|
53
|
+
}
|
54
|
+
},
|
55
|
+
"links": [
|
56
|
+
{
|
57
|
+
"rel": "self",
|
58
|
+
"href": "https://api.paychex.com/workers/00Z5V9BTIHRQF2CF7BTH"
|
59
|
+
},
|
60
|
+
{
|
61
|
+
"rel": "communications",
|
62
|
+
"href": "https://api.paychex.com/workers/00Z5V9BTIHRQF2CF7BTF/communications"
|
63
|
+
},
|
64
|
+
{
|
65
|
+
"rel": "supervisor",
|
66
|
+
"href": "https://api.paychex.com/workers/00H2A1IUJ4IPERJ589YE"
|
67
|
+
}
|
68
|
+
]
|
69
|
+
}
|
70
|
+
],
|
71
|
+
"links": [
|
72
|
+
{
|
73
|
+
"rel": "self",
|
74
|
+
"href": "https://api.paychex.com/companies/00Z5V9BTI8J2FCGESC05/workers?offset=5&limit=5"
|
75
|
+
},
|
76
|
+
{
|
77
|
+
"rel": "next",
|
78
|
+
"href": "https://api.paychex.com/companies/00Z5V9BTI8J2FCGESC05/workers?offset=10&limit=5"
|
79
|
+
},
|
80
|
+
{
|
81
|
+
"rel": "prev",
|
82
|
+
"href": "https://api.paychex.com/companies/00Z5V9BTI8J2FCGESC05/workers?offset=0&limit=5"
|
83
|
+
}
|
84
|
+
]
|
85
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
describe PaychexAPI::Client::Companies do
|
3
|
+
|
4
|
+
before do
|
5
|
+
@client = PaychexAPI::Client.new(prefix: "http://test.paychex.com", client_id: "client_id", client_secret: 'client_secret')
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should get a company' do
|
9
|
+
response = @client.get_company(1)
|
10
|
+
expect(response.first['companyId']).to(eq("99Z5V9BTI8J2FCGESC05"))
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should get a company by display id' do
|
14
|
+
response = @client.get_company_by_display_id(1)
|
15
|
+
expect(response.first['companyId']).to(eq("99Z5V9BTI8J2FCGESC05"))
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should get organizations' do
|
19
|
+
response = @client.get_organizations(1, 2)
|
20
|
+
expect(response.first['organizationId']).to(eq("970000055981384"))
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
describe PaychexAPI::Client::Workers do
|
3
|
+
|
4
|
+
before do
|
5
|
+
@client = PaychexAPI::Client.new(prefix: "http://test.paychex.com", client_id: "client_id", client_secret: 'client_secret')
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should get all workers' do
|
9
|
+
response = @client.get_all_workers("1")
|
10
|
+
expect(response.first['workerId']).to(eq("00Z5V9BTIHRQF2CF7BTH"))
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should get all communications' do
|
14
|
+
response = @client.get_communications(1)
|
15
|
+
expect(response.first['communicationId']).to(eq("00Z5V9BTINBT97UMERCA"))
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should get a communication' do
|
19
|
+
response = @client.get_communication(1, 1)
|
20
|
+
expect(response.first['communicationId']).to(eq("00Z5V9BTINBT97UMERCA"))
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should get create a communication' do
|
24
|
+
response = @client.create_communication(1)
|
25
|
+
expect(response.first['communicationId']).to(eq("00Z5V9BTINBT97UMERCA"))
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should update a communication' do
|
29
|
+
response = @client.update_communication(1, 1, {something: 'something'})
|
30
|
+
expect(response.first['communicationId']).to(eq("00Z5V9BTINBT97UMERCA"))
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe PaychexAPI::Client do
|
4
|
+
|
5
|
+
it 'should pull the auth token' do
|
6
|
+
client = PaychexAPI::Client.new(prefix: "https://www.fake.com", client_id: "client_id", client_secret: 'client_secret')
|
7
|
+
client.get_all_workers("1")
|
8
|
+
expect(client.authorization['access_token']).to(eq('99f9c30a-8134-4a30-a789-7c7665add41e'))
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should skip pulling the auth token' do
|
12
|
+
client = PaychexAPI::Client.new(prefix: "https://www.fake.com", client_id: "client_id", client_secret: 'client_secret')
|
13
|
+
expect(client.authorization).to(eq(nil))
|
14
|
+
client.get_all_workers("1")
|
15
|
+
expect(client.authorization['access_token']).to(eq('99f9c30a-8134-4a30-a789-7c7665add41e'))
|
16
|
+
expect_any_instance_of(Faraday).not_to receive(:post)
|
17
|
+
client.get_all_workers("1")
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should set the auth header to bearer auth' do
|
21
|
+
client = PaychexAPI::Client.new(prefix: "https://www.fake.com", client_id: "client_id", client_secret: 'client_secret')
|
22
|
+
client.get_all_workers("1")
|
23
|
+
expect(client.connection.headers['Authorization']).to(eq("Bearer 99f9c30a-8134-4a30-a789-7c7665add41e"))
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
require 'tilt'
|
3
|
+
|
4
|
+
class FakePaychex < Sinatra::Base
|
5
|
+
|
6
|
+
#auth
|
7
|
+
post %r{/auth/oauth/v2/token$} do
|
8
|
+
get_json_data 200, 'auth.json'
|
9
|
+
end
|
10
|
+
|
11
|
+
#workers
|
12
|
+
get %r{/companies/\d+/workers$} do
|
13
|
+
get_json_data 200, 'workers.json'
|
14
|
+
end
|
15
|
+
|
16
|
+
get %r{/workers/\d+/communications$} do
|
17
|
+
get_json_data 200, 'communications.json'
|
18
|
+
end
|
19
|
+
|
20
|
+
get %r{/workers/\d+/communications/\d+$} do
|
21
|
+
get_json_data 200, 'communications.json'
|
22
|
+
end
|
23
|
+
|
24
|
+
post %r{/workers/\d+/communications$} do
|
25
|
+
get_json_data 200, 'communications.json'
|
26
|
+
end
|
27
|
+
|
28
|
+
put %r{/workers/\d+/communications/\d+$} do
|
29
|
+
get_json_data 200, 'communications.json'
|
30
|
+
end
|
31
|
+
|
32
|
+
delete %r{/workers/\d+/communications/\d+$} do
|
33
|
+
get_json_data 200, 'communications.json'
|
34
|
+
end
|
35
|
+
|
36
|
+
#companies
|
37
|
+
get %r{/companies/\d+$} do
|
38
|
+
get_json_data 200, 'companies.json'
|
39
|
+
end
|
40
|
+
|
41
|
+
get %r{/companies$} do
|
42
|
+
get_json_data 200, 'companies.json'
|
43
|
+
end
|
44
|
+
|
45
|
+
get %r{/companies/\d/organizations+$} do
|
46
|
+
get_json_data 200, 'organizations.json'
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def get_json_data(response_code, file_name)
|
52
|
+
content_type :json
|
53
|
+
status response_code
|
54
|
+
unless file_name.nil?
|
55
|
+
File.open(File.dirname(__FILE__) + '/../fixtures/' + file_name).read
|
56
|
+
else
|
57
|
+
{}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
data/spec/test_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'paychex_api'
|
2
|
+
require 'rspec'
|
3
|
+
require 'webmock/rspec'
|
4
|
+
require 'json'
|
5
|
+
require 'pry'
|
6
|
+
require 'byebug'
|
7
|
+
|
8
|
+
RSpec.configure do |config|
|
9
|
+
Dir["./spec/support/**/*.rb"].sort.each {|f| require f}
|
10
|
+
|
11
|
+
config.before(:each) do
|
12
|
+
WebMock.disable_net_connect!
|
13
|
+
WebMock.stub_request(:any, /.*/).to_rack(FakePaychex)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def fixture(*file)
|
19
|
+
File.new(File.join(File.expand_path("../fixtures", __FILE__), *file))
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,240 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: paychex_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jay Shaffer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-01-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.0'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 1.0.0
|
37
|
+
type: :development
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '1.0'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.0.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rspec
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '2.6'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '2.6'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: webmock
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 1.22.6
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 1.22.6
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: pry
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: tilt
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 1.3.4
|
96
|
+
- - "~>"
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '1.3'
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: 1.3.4
|
106
|
+
- - "~>"
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '1.3'
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: sinatra
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - "~>"
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '1.0'
|
116
|
+
type: :development
|
117
|
+
prerelease: false
|
118
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - "~>"
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '1.0'
|
123
|
+
- !ruby/object:Gem::Dependency
|
124
|
+
name: byebug
|
125
|
+
requirement: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: 8.2.2
|
130
|
+
type: :development
|
131
|
+
prerelease: false
|
132
|
+
version_requirements: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - "~>"
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: 8.2.2
|
137
|
+
- !ruby/object:Gem::Dependency
|
138
|
+
name: footrest
|
139
|
+
requirement: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - ">="
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: 0.5.1
|
144
|
+
type: :runtime
|
145
|
+
prerelease: false
|
146
|
+
version_requirements: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - ">="
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: 0.5.1
|
151
|
+
- !ruby/object:Gem::Dependency
|
152
|
+
name: faraday
|
153
|
+
requirement: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - "~>"
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 0.9.0
|
158
|
+
type: :runtime
|
159
|
+
prerelease: false
|
160
|
+
version_requirements: !ruby/object:Gem::Requirement
|
161
|
+
requirements:
|
162
|
+
- - "~>"
|
163
|
+
- !ruby/object:Gem::Version
|
164
|
+
version: 0.9.0
|
165
|
+
- !ruby/object:Gem::Dependency
|
166
|
+
name: faraday_middleware
|
167
|
+
requirement: !ruby/object:Gem::Requirement
|
168
|
+
requirements:
|
169
|
+
- - "~>"
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: 0.9.0
|
172
|
+
type: :runtime
|
173
|
+
prerelease: false
|
174
|
+
version_requirements: !ruby/object:Gem::Requirement
|
175
|
+
requirements:
|
176
|
+
- - "~>"
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
version: 0.9.0
|
179
|
+
description: Interface for interacting with the paychex enterprise API
|
180
|
+
email:
|
181
|
+
- jshaffer@instructure.com
|
182
|
+
executables: []
|
183
|
+
extensions: []
|
184
|
+
extra_rdoc_files: []
|
185
|
+
files:
|
186
|
+
- ".gitignore"
|
187
|
+
- Gemfile
|
188
|
+
- Gemfile.lock
|
189
|
+
- lib/paychex_api.rb
|
190
|
+
- lib/paychex_api/api_array.rb
|
191
|
+
- lib/paychex_api/client.rb
|
192
|
+
- lib/paychex_api/client/companies.rb
|
193
|
+
- lib/paychex_api/client/workers.rb
|
194
|
+
- lib/paychex_api/version.rb
|
195
|
+
- paychex_api.gemspec
|
196
|
+
- spec/fixtures/auth.json
|
197
|
+
- spec/fixtures/communications.json
|
198
|
+
- spec/fixtures/companies.json
|
199
|
+
- spec/fixtures/organizations.json
|
200
|
+
- spec/fixtures/workers.json
|
201
|
+
- spec/paychex_api/client/companies_spec.rb
|
202
|
+
- spec/paychex_api/client/workers_spec.rb
|
203
|
+
- spec/paychex_api/client_spec.rb
|
204
|
+
- spec/support/fake_paychex.rb
|
205
|
+
- spec/test_helper.rb
|
206
|
+
homepage: ''
|
207
|
+
licenses:
|
208
|
+
- MIT
|
209
|
+
metadata: {}
|
210
|
+
post_install_message:
|
211
|
+
rdoc_options: []
|
212
|
+
require_paths:
|
213
|
+
- lib
|
214
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
215
|
+
requirements:
|
216
|
+
- - ">="
|
217
|
+
- !ruby/object:Gem::Version
|
218
|
+
version: '0'
|
219
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
220
|
+
requirements:
|
221
|
+
- - ">="
|
222
|
+
- !ruby/object:Gem::Version
|
223
|
+
version: '0'
|
224
|
+
requirements: []
|
225
|
+
rubyforge_project:
|
226
|
+
rubygems_version: 2.6.14
|
227
|
+
signing_key:
|
228
|
+
specification_version: 4
|
229
|
+
summary: Paychex API
|
230
|
+
test_files:
|
231
|
+
- spec/fixtures/auth.json
|
232
|
+
- spec/fixtures/communications.json
|
233
|
+
- spec/fixtures/companies.json
|
234
|
+
- spec/fixtures/organizations.json
|
235
|
+
- spec/fixtures/workers.json
|
236
|
+
- spec/paychex_api/client/companies_spec.rb
|
237
|
+
- spec/paychex_api/client/workers_spec.rb
|
238
|
+
- spec/paychex_api/client_spec.rb
|
239
|
+
- spec/support/fake_paychex.rb
|
240
|
+
- spec/test_helper.rb
|