teamtailor 0.3.2 → 0.3.3

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: 21d34e982de83e86e65d3fbf16e09a7896132d1c770df881bd1ddbb057014979
4
- data.tar.gz: 52574ee9d3ff95ac04b7871270398a3eab142fe0cfa75f8d815b8b18620feee8
3
+ metadata.gz: 16e2ef81d1b5db75ba273ea7d0b38d689488c57f6da278dc12eda7052136bbd0
4
+ data.tar.gz: f7e0304fcc2951427ba15037bc1d6345f0afa665976537821efba7ccbbb0ded2
5
5
  SHA512:
6
- metadata.gz: 797d6283055aa61d6691d39bd26fcd5d6d0846601eddae1d5b9a3636151a7da27925fd8e305b790e48d3ca54e4b656e8f3e21b4b4065612d77cc3acd080adfae
7
- data.tar.gz: 8afe108bb7fe23e590580038c896abf08535494934c5ca5a96b5cf49a86a694b5574ca8cc1af0a63038378612554977ab90e0e9bfa855b387bc96fc62771f9fa
6
+ metadata.gz: 8edcd6a598a1bf8298b0f47778a571652f3abb113c4952435a2f156f65650a10cf0385ac2bf5448c45dce7a5b1ab3acaddae10c287cad6a130fa2441e1421122
7
+ data.tar.gz: 9b845638fef4753da98486f892ee4e35aa2eb9a37a34cf2ff63b5c571bd59f9299c6c6a322ec6d194ecd7c4223cd7969f26a9fa2f4b262047c0cbd790ea191f0
@@ -1,33 +1,27 @@
1
- # This workflow uses actions that are not certified by GitHub.
2
- # They are provided by a third-party and are governed by
3
- # separate terms of service, privacy policy, and support
4
- # documentation.
5
- # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
- # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
-
8
1
  name: Ruby
9
-
10
- on:
11
- push:
12
- branches: [ main ]
13
- pull_request:
14
- branches: [ main ]
15
-
2
+ on: [push, pull_request]
16
3
  jobs:
17
4
  test:
5
+ strategy:
6
+ fail-fast: true
7
+ matrix:
8
+ os: [ubuntu-latest]
9
+ ruby: [2.6, 2.7]
10
+ runs-on: ${{ matrix.os }}
11
+ steps:
12
+ - uses: actions/checkout@v2
13
+ - uses: ruby/setup-ruby@v1
14
+ with:
15
+ ruby-version: ${{ matrix.ruby }}
16
+ bundler-cache: true
17
+ - run: bundle exec rake
18
18
 
19
+ lint:
19
20
  runs-on: ubuntu-latest
20
-
21
21
  steps:
22
- - uses: actions/checkout@v2
23
- - name: Set up Ruby
24
- # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
25
- # change this to (see https://github.com/ruby/setup-ruby#versioning):
26
- # uses: ruby/setup-ruby@v1
27
- uses: ruby/setup-ruby@ec106b438a1ff6ff109590de34ddc62c540232e0
28
- with:
29
- ruby-version: 2.6
30
- - name: Install dependencies
31
- run: bundle install
32
- - name: Run tests
33
- run: bundle exec rake
22
+ - uses: actions/checkout@v2
23
+ - uses: ruby/setup-ruby@v1
24
+ with:
25
+ ruby-version: 2.7
26
+ bundler-cache: true
27
+ - run: bundle exec rubocop
data/.rubocop.yml ADDED
@@ -0,0 +1,129 @@
1
+ require:
2
+ - rubocop-rake
3
+ - rubocop-rspec
4
+
5
+ AllCops:
6
+ TargetRubyVersion: 2.7
7
+ # RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
8
+ # to ignore them, so only the ones explicitly set in this file are enabled.
9
+ DisabledByDefault: true
10
+
11
+ # Prefer &&/|| over and/or.
12
+ Style/AndOr:
13
+ Enabled: true
14
+
15
+ # Align `when` with `case`.
16
+ Layout/CaseIndentation:
17
+ Enabled: false
18
+
19
+ # Align comments with method definitions.
20
+ Layout/CommentIndentation:
21
+ Enabled: true
22
+
23
+ # No extra empty lines.
24
+ Layout/EmptyLines:
25
+ Enabled: true
26
+
27
+ # In a regular class definition, no empty lines around the body.
28
+ Layout/EmptyLinesAroundClassBody:
29
+ Enabled: true
30
+
31
+ # In a regular method definition, no empty lines around the body.
32
+ Layout/EmptyLinesAroundMethodBody:
33
+ Enabled: true
34
+
35
+ # In a regular module definition, no empty lines around the body.
36
+ Layout/EmptyLinesAroundModuleBody:
37
+ Enabled: true
38
+
39
+ # Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
40
+ Style/HashSyntax:
41
+ Enabled: true
42
+
43
+ # Method definitions after `private` or `protected` isolated calls need one
44
+ # extra level of indentation.
45
+ Layout/IndentationConsistency:
46
+ Enabled: false
47
+
48
+ # Two spaces, no tabs (for indentation).
49
+ Layout/IndentationWidth:
50
+ Enabled: true
51
+
52
+ Layout/SpaceAfterColon:
53
+ Enabled: true
54
+
55
+ Layout/SpaceAfterComma:
56
+ Enabled: true
57
+
58
+ Layout/SpaceAroundEqualsInParameterDefault:
59
+ Enabled: true
60
+
61
+ Layout/SpaceAroundKeyword:
62
+ Enabled: true
63
+
64
+ Layout/EmptyLinesAroundBlockBody:
65
+ Enabled: true
66
+
67
+ Layout/SpaceAroundOperators:
68
+ Enabled: true
69
+
70
+ Layout/SpaceBeforeFirstArg:
71
+ Enabled: true
72
+
73
+ # Defining a method with parameters needs parentheses.
74
+ Style/MethodDefParentheses:
75
+ Enabled: true
76
+
77
+ # Use `foo {}` not `foo{}`.
78
+ Layout/SpaceBeforeBlockBraces:
79
+ Enabled: true
80
+
81
+ # Use `foo { bar }` not `foo {bar}`.
82
+ Layout/SpaceInsideBlockBraces:
83
+ Enabled: true
84
+
85
+ # Use `{ a: 1 }` not `{a:1}`.
86
+ Layout/SpaceInsideHashLiteralBraces:
87
+ Enabled: true
88
+
89
+ Layout/SpaceInsideParens:
90
+ Enabled: true
91
+
92
+ # Check quotes usage according to lint rule below.
93
+ Style/StringLiterals:
94
+ Enabled: true
95
+ EnforcedStyle: double_quotes
96
+
97
+ # Detect hard tabs, no hard tabs.
98
+ Layout/IndentationStyle:
99
+ Enabled: true
100
+
101
+ # Blank lines should not have any spaces.
102
+ Layout/TrailingEmptyLines:
103
+ Enabled: true
104
+
105
+ # No trailing whitespace.
106
+ Layout/TrailingWhitespace:
107
+ Enabled: true
108
+
109
+ # Use quotes for string literals when they are enough.
110
+ Style/RedundantPercentQ:
111
+ Enabled: true
112
+
113
+ # Align `end` with the matching keyword or starting expression except for
114
+ # assignments, where it should be aligned with the LHS.
115
+ Layout/EndAlignment:
116
+ Enabled: true
117
+ EnforcedStyleAlignWith: variable
118
+
119
+ # Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
120
+ Lint/RequireParentheses:
121
+ Enabled: true
122
+
123
+ Style/TrailingCommaInArrayLiteral:
124
+ Enabled: true
125
+ EnforcedStyleForMultiline: consistent_comma
126
+
127
+ Style/TrailingCommaInHashLiteral:
128
+ Enabled: true
129
+ EnforcedStyleForMultiline: consistent_comma
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## Unreleased
2
2
 
3
+ ## v0.3.3 - 2021-03-11
4
+
5
+ - Added `Client#create_candidate`
6
+ - Added `Client#create_job_application`
7
+ - Fix accessing `Client#jobs` without filters
8
+
3
9
  ## v0.3.2 - 2021-02-03
4
10
 
5
11
  - Add support for `CustomField::Select` and `CustomField::MultiSelect`
data/Gemfile CHANGED
@@ -1,15 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source 'https://rubygems.org'
3
+ source "https://rubygems.org"
4
4
 
5
5
  # Specify your gem's dependencies in teamtailor.gemspec
6
6
  gemspec
7
7
 
8
- gem 'rake', '~> 12.0'
8
+ gem "rake", "~> 12.0"
9
9
 
10
10
  group :test do
11
- gem 'rspec', '~> 3.0'
12
- gem 'rubocop'
13
- gem 'webmock', '~> 3.4', '>= 3.4.2'
14
- gem 'simplecov', require: false
11
+ gem "rspec", "~> 3.0"
12
+ gem "rubocop"
13
+ gem "rubocop-rake"
14
+ gem "rubocop-rspec"
15
+ gem "webmock", "~> 3.4", ">= 3.4.2"
16
+ gem "simplecov", require: false
15
17
  end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- teamtailor (0.3.2)
4
+ teamtailor (0.3.3)
5
5
  typhoeus (~> 1.3.1)
6
6
 
7
7
  GEM
@@ -9,7 +9,7 @@ GEM
9
9
  specs:
10
10
  addressable (2.7.0)
11
11
  public_suffix (>= 2.0.2, < 5.0)
12
- ast (2.4.0)
12
+ ast (2.4.2)
13
13
  crack (0.4.3)
14
14
  safe_yaml (~> 1.0.0)
15
15
  diff-lcs (1.3)
@@ -18,13 +18,13 @@ GEM
18
18
  ffi (>= 1.3.0)
19
19
  ffi (1.13.1)
20
20
  hashdiff (1.0.1)
21
- jaro_winkler (1.5.4)
22
- parallel (1.19.1)
23
- parser (2.7.0.5)
24
- ast (~> 2.4.0)
21
+ parallel (1.20.1)
22
+ parser (3.0.0.0)
23
+ ast (~> 2.4.1)
25
24
  public_suffix (4.0.3)
26
25
  rainbow (3.0.0)
27
26
  rake (12.3.3)
27
+ regexp_parser (2.0.3)
28
28
  rexml (3.2.4)
29
29
  rspec (3.9.0)
30
30
  rspec-core (~> 3.9.0)
@@ -39,15 +39,23 @@ GEM
39
39
  diff-lcs (>= 1.2.0, < 2.0)
40
40
  rspec-support (~> 3.9.0)
41
41
  rspec-support (3.9.2)
42
- rubocop (0.80.1)
43
- jaro_winkler (~> 1.5.1)
42
+ rubocop (1.9.1)
44
43
  parallel (~> 1.10)
45
- parser (>= 2.7.0.1)
44
+ parser (>= 3.0.0.0)
46
45
  rainbow (>= 2.2.2, < 4.0)
46
+ regexp_parser (>= 1.8, < 3.0)
47
47
  rexml
48
+ rubocop-ast (>= 1.2.0, < 2.0)
48
49
  ruby-progressbar (~> 1.7)
49
- unicode-display_width (>= 1.4.0, < 1.7)
50
- ruby-progressbar (1.10.1)
50
+ unicode-display_width (>= 1.4.0, < 3.0)
51
+ rubocop-ast (1.4.1)
52
+ parser (>= 2.7.1.5)
53
+ rubocop-rake (0.5.1)
54
+ rubocop
55
+ rubocop-rspec (2.2.0)
56
+ rubocop (~> 1.0)
57
+ rubocop-ast (>= 1.1.0)
58
+ ruby-progressbar (1.11.0)
51
59
  safe_yaml (1.0.5)
52
60
  simplecov (0.18.5)
53
61
  docile (~> 1.1)
@@ -55,7 +63,7 @@ GEM
55
63
  simplecov-html (0.12.2)
56
64
  typhoeus (1.3.1)
57
65
  ethon (>= 0.9.0)
58
- unicode-display_width (1.6.1)
66
+ unicode-display_width (2.0.0)
59
67
  webmock (3.8.3)
60
68
  addressable (>= 2.3.6)
61
69
  crack (>= 0.3.2)
@@ -68,6 +76,8 @@ DEPENDENCIES
68
76
  rake (~> 12.0)
69
77
  rspec (~> 3.0)
70
78
  rubocop
79
+ rubocop-rake
80
+ rubocop-rspec
71
81
  simplecov
72
82
  teamtailor!
73
83
  webmock (~> 3.4, >= 3.4.2)
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler/gem_tasks'
4
- require 'rspec/core/rake_task'
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
5
 
6
6
  RSpec::Core::RakeTask.new(:spec)
7
7
 
data/bin/console CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'bundler/setup'
5
- require 'teamtailor'
4
+ require "bundler/setup"
5
+ require "teamtailor"
6
6
 
7
7
  # You can add fixtures and/or initialization code here to make experimenting
8
8
  # with your gem easier. You can also use a different console, if you like.
@@ -11,5 +11,5 @@ require 'teamtailor'
11
11
  # require "pry"
12
12
  # Pry.start
13
13
 
14
- require 'irb'
14
+ require "irb"
15
15
  IRB.start(__FILE__)
data/lib/teamtailor.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/error'
4
- require 'teamtailor/client'
5
- require 'teamtailor/version'
3
+ require "teamtailor/error"
4
+ require "teamtailor/client"
5
+ require "teamtailor/version"
6
6
 
7
7
  module Teamtailor
8
8
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/request'
3
+ require "teamtailor/request"
4
4
 
5
5
  module Teamtailor
6
6
  class Client
@@ -15,9 +15,9 @@ module Teamtailor
15
15
  base_url: base_url,
16
16
  api_token: api_token,
17
17
  api_version: api_version,
18
- path: '/v1/company',
18
+ path: "/v1/company",
19
19
  params: {
20
- 'include' => include.join(',')
20
+ "include" => include.join(","),
21
21
  }
22
22
  ).call
23
23
  end
@@ -27,30 +27,45 @@ module Teamtailor
27
27
  base_url: base_url,
28
28
  api_token: api_token,
29
29
  api_version: api_version,
30
- path: '/v1/candidates',
30
+ path: "/v1/candidates",
31
31
  params: {
32
- 'page[number]' => page,
33
- 'page[size]' => 30,
34
- 'include' => include.join(',')
32
+ "page[number]" => page,
33
+ "page[size]" => 30,
34
+ "include" => include.join(","),
35
35
  }
36
36
  ).call
37
37
  end
38
38
 
39
+ def create_candidate(attributes:, relationships:)
40
+ Teamtailor::Request.new(
41
+ base_url: base_url,
42
+ api_token: api_token,
43
+ api_version: api_version,
44
+ path: "/v1/candidates",
45
+ method: :post,
46
+ body: {
47
+ data: {
48
+ type: "candidates",
49
+ attributes: attributes.transform_keys { |k| k.to_s.gsub("_", "-") },
50
+ relationships: relationships,
51
+ },
52
+ }
53
+ ).call
54
+ end
55
+
39
56
  def jobs(page: 1, include: [], filters: {})
40
- filter_params = filters.keys.map do |key|
41
- { "filter[#{key}]" => filters[key] }
42
- end
57
+ filter_params = filters.transform_keys { |key| "filter[#{key}]" }
43
58
 
44
59
  Teamtailor::Request.new(
45
60
  base_url: base_url,
46
61
  api_token: api_token,
47
62
  api_version: api_version,
48
- path: '/v1/jobs',
63
+ path: "/v1/jobs",
49
64
  params: {
50
- 'page[number]' => page,
51
- 'page[size]' => 30,
52
- 'include' => include.join(','),
53
- }.merge(*filter_params)
65
+ "page[number]" => page,
66
+ "page[size]" => 30,
67
+ "include" => include.join(","),
68
+ }.merge(filter_params)
54
69
  ).call
55
70
  end
56
71
 
@@ -59,25 +74,42 @@ module Teamtailor
59
74
  base_url: base_url,
60
75
  api_token: api_token,
61
76
  api_version: api_version,
62
- path: '/v1/job-applications',
77
+ path: "/v1/job-applications",
63
78
  params: {
64
- 'page[number]' => page,
65
- 'page[size]' => 30,
66
- 'include' => include.join(',')
79
+ "page[number]" => page,
80
+ "page[size]" => 30,
81
+ "include" => include.join(","),
67
82
  }
68
83
  ).call
69
84
  end
70
85
 
86
+ def create_job_application(attributes:, relationships:)
87
+ Teamtailor::Request.new(
88
+ base_url: base_url,
89
+ api_token: api_token,
90
+ api_version: api_version,
91
+ path: "/v1/job-applications",
92
+ method: :post,
93
+ body: {
94
+ data: {
95
+ type: "job-applications",
96
+ attributes: attributes.transform_keys { |k| k.to_s.gsub("_", "-") },
97
+ relationships: relationships,
98
+ },
99
+ }
100
+ ).call
101
+ end
102
+
71
103
  def users(page: 1, include: [])
72
104
  Teamtailor::Request.new(
73
105
  base_url: base_url,
74
106
  api_token: api_token,
75
107
  api_version: api_version,
76
- path: '/v1/users',
108
+ path: "/v1/users",
77
109
  params: {
78
- 'page[number]' => page,
79
- 'page[size]' => 30,
80
- 'include' => include.join(',')
110
+ "page[number]" => page,
111
+ "page[size]" => 30,
112
+ "include" => include.join(","),
81
113
  }
82
114
  ).call
83
115
  end
@@ -87,11 +119,11 @@ module Teamtailor
87
119
  base_url: base_url,
88
120
  api_token: api_token,
89
121
  api_version: api_version,
90
- path: '/v1/stages',
122
+ path: "/v1/stages",
91
123
  params: {
92
- 'page[number]' => page,
93
- 'page[size]' => 30,
94
- 'include' => include.join(',')
124
+ "page[number]" => page,
125
+ "page[size]" => 30,
126
+ "include" => include.join(","),
95
127
  }
96
128
  ).call
97
129
  end
@@ -101,11 +133,11 @@ module Teamtailor
101
133
  base_url: base_url,
102
134
  api_token: api_token,
103
135
  api_version: api_version,
104
- path: '/v1/reject-reasons',
136
+ path: "/v1/reject-reasons",
105
137
  params: {
106
- 'page[number]' => page,
107
- 'page[size]' => 30,
108
- 'include' => include.join(',')
138
+ "page[number]" => page,
139
+ "page[size]" => 30,
140
+ "include" => include.join(","),
109
141
  }
110
142
  ).call
111
143
  end
@@ -115,11 +147,11 @@ module Teamtailor
115
147
  base_url: base_url,
116
148
  api_token: api_token,
117
149
  api_version: api_version,
118
- path: '/v1/departments',
150
+ path: "/v1/departments",
119
151
  params: {
120
- 'page[number]' => page,
121
- 'page[size]' => 30,
122
- 'include' => include.join(',')
152
+ "page[number]" => page,
153
+ "page[size]" => 30,
154
+ "include" => include.join(","),
123
155
  }
124
156
  ).call
125
157
  end
@@ -129,11 +161,11 @@ module Teamtailor
129
161
  base_url: base_url,
130
162
  api_token: api_token,
131
163
  api_version: api_version,
132
- path: '/v1/locations',
164
+ path: "/v1/locations",
133
165
  params: {
134
- 'page[number]' => page,
135
- 'page[size]' => 30,
136
- 'include' => include.join(',')
166
+ "page[number]" => page,
167
+ "page[size]" => 30,
168
+ "include" => include.join(","),
137
169
  }
138
170
  ).call
139
171
  end
@@ -143,11 +175,11 @@ module Teamtailor
143
175
  base_url: base_url,
144
176
  api_token: api_token,
145
177
  api_version: api_version,
146
- path: '/v1/custom-fields',
178
+ path: "/v1/custom-fields",
147
179
  params: {
148
- 'page[number]' => page,
149
- 'page[size]' => 30,
150
- 'include' => include.join(',')
180
+ "page[number]" => page,
181
+ "page[size]" => 30,
182
+ "include" => include.join(","),
151
183
  }
152
184
  ).call
153
185
  end
@@ -157,11 +189,11 @@ module Teamtailor
157
189
  base_url: base_url,
158
190
  api_token: api_token,
159
191
  api_version: api_version,
160
- path: '/v1/custom-field-values',
192
+ path: "/v1/custom-field-values",
161
193
  params: {
162
- 'page[number]' => page,
163
- 'page[size]' => 30,
164
- 'include' => include.join(',')
194
+ "page[number]" => page,
195
+ "page[size]" => 30,
196
+ "include" => include.join(","),
165
197
  }
166
198
  ).call
167
199
  end
@@ -171,11 +203,11 @@ module Teamtailor
171
203
  base_url: base_url,
172
204
  api_token: api_token,
173
205
  api_version: api_version,
174
- path: '/v1/referrals',
206
+ path: "/v1/referrals",
175
207
  params: {
176
- 'page[number]' => page,
177
- 'page[size]' => 30,
178
- 'include' => include.join(',')
208
+ "page[number]" => page,
209
+ "page[size]" => 30,
210
+ "include" => include.join(","),
179
211
  }
180
212
  ).call
181
213
  end
@@ -185,11 +217,11 @@ module Teamtailor
185
217
  base_url: base_url,
186
218
  api_token: api_token,
187
219
  api_version: api_version,
188
- path: '/v1/partner-results',
220
+ path: "/v1/partner-results",
189
221
  params: {
190
- 'page[number]' => page,
191
- 'page[size]' => 30,
192
- 'include' => include.join(',')
222
+ "page[number]" => page,
223
+ "page[size]" => 30,
224
+ "include" => include.join(","),
193
225
  }
194
226
  ).call
195
227
  end
@@ -199,11 +231,11 @@ module Teamtailor
199
231
  base_url: base_url,
200
232
  api_token: api_token,
201
233
  api_version: api_version,
202
- path: '/v1/requisitions',
234
+ path: "/v1/requisitions",
203
235
  params: {
204
- 'page[number]' => page,
205
- 'page[size]' => 30,
206
- 'include' => include.join(',')
236
+ "page[number]" => page,
237
+ "page[size]" => 30,
238
+ "include" => include.join(","),
207
239
  }
208
240
  ).call
209
241
  end
@@ -9,7 +9,12 @@ module Teamtailor
9
9
  when 406
10
10
  json_response = JSON.parse(body)
11
11
  Teamtailor::InvalidApiVersionError.new(
12
- json_response.dig('errors', 'detail')
12
+ json_response.dig("errors", "detail")
13
+ )
14
+ when 422
15
+ json_response = JSON.parse(body)
16
+ Teamtailor::UnprocessableEntityError.new(
17
+ json_response.dig("errors", 0, "detail")
13
18
  )
14
19
  end
15
20
  end
@@ -26,4 +31,6 @@ module Teamtailor
26
31
  class UnknownResponseTypeError < ClientError; end
27
32
 
28
33
  class UnloadedRelationError < ClientError; end
34
+
35
+ class UnprocessableEntityError < ClientError; end
29
36
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/parser'
3
+ require "teamtailor/parser"
4
4
 
5
5
  module Teamtailor
6
6
  class PageResult
@@ -13,27 +13,27 @@ module Teamtailor
13
13
  end
14
14
 
15
15
  def data
16
- json_response.dig('data')
16
+ json_response.dig("data")
17
17
  end
18
18
 
19
19
  def page_count
20
- json_response.dig('meta', 'page-count')
20
+ json_response.dig("meta", "page-count")
21
21
  end
22
22
 
23
23
  def record_count
24
- json_response.dig('meta', 'record-count')
24
+ json_response.dig("meta", "record-count")
25
25
  end
26
26
 
27
27
  def next_page_url
28
- json_response.dig('links', 'next')
28
+ json_response.dig("links", "next")
29
29
  end
30
30
 
31
31
  def first_page_url
32
- json_response.dig('links', 'first')
32
+ json_response.dig("links", "first")
33
33
  end
34
34
 
35
35
  def last_page_url
36
- json_response.dig('links', 'last')
36
+ json_response.dig("links", "last")
37
37
  end
38
38
 
39
39
  def has_next_page?
@@ -1,20 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/parser/candidate'
4
- require 'teamtailor/parser/job'
5
- require 'teamtailor/parser/user'
6
- require 'teamtailor/parser/job_application'
7
- require 'teamtailor/parser/company'
8
- require 'teamtailor/parser/stage'
9
- require 'teamtailor/parser/reject_reason'
10
- require 'teamtailor/parser/department'
11
- require 'teamtailor/parser/location'
12
- require 'teamtailor/parser/custom_field'
13
- require 'teamtailor/parser/custom_field_value'
14
- require 'teamtailor/parser/referral'
15
- require 'teamtailor/parser/partner_result'
16
- require 'teamtailor/parser/requisition'
17
- require 'teamtailor/parser/requisition_step_verdict'
3
+ require "teamtailor/parser/candidate"
4
+ require "teamtailor/parser/job"
5
+ require "teamtailor/parser/user"
6
+ require "teamtailor/parser/job_application"
7
+ require "teamtailor/parser/company"
8
+ require "teamtailor/parser/stage"
9
+ require "teamtailor/parser/reject_reason"
10
+ require "teamtailor/parser/department"
11
+ require "teamtailor/parser/location"
12
+ require "teamtailor/parser/custom_field"
13
+ require "teamtailor/parser/custom_field_value"
14
+ require "teamtailor/parser/referral"
15
+ require "teamtailor/parser/partner_result"
16
+ require "teamtailor/parser/requisition"
17
+ require "teamtailor/parser/requisition_step_verdict"
18
18
 
19
19
  module Teamtailor
20
20
  class Parser
@@ -24,26 +24,26 @@ module Teamtailor
24
24
 
25
25
  def parse
26
26
  data.map do |record|
27
- case record&.dig('type')
28
- when 'candidates' then Teamtailor::Candidate.new(record, included)
29
- when 'jobs' then Teamtailor::Job.new(record, included)
30
- when 'users' then Teamtailor::User.new(record, included)
31
- when 'job-applications' then Teamtailor::JobApplication.new(record, included)
32
- when 'companies' then Teamtailor::Company.new(record, included)
33
- when 'stages' then Teamtailor::Stage.new(record, included)
34
- when 'reject-reasons' then Teamtailor::RejectReason.new(record, included)
35
- when 'departments' then Teamtailor::Department.new(record, included)
36
- when 'locations' then Teamtailor::Location.new(record, included)
37
- when 'custom-fields' then Teamtailor::CustomField.new(record, included)
38
- when 'custom-field-selects' then Teamtailor::CustomField.new(record, included)
39
- when 'custom-field-values' then Teamtailor::CustomFieldValue.new(record, included)
40
- when 'referrals' then Teamtailor::Referral.new(record, included)
41
- when 'partner-results' then Teamtailor::PartnerResult.new(record, included)
42
- when 'requisitions' then Teamtailor::Requisition.new(record, included)
43
- when 'requisition-step-verdicts' then Teamtailor::RequisitionStepVerdict.new(record, included)
27
+ case record&.dig("type")
28
+ when "candidates" then Teamtailor::Candidate.new(record, included)
29
+ when "jobs" then Teamtailor::Job.new(record, included)
30
+ when "users" then Teamtailor::User.new(record, included)
31
+ when "job-applications" then Teamtailor::JobApplication.new(record, included)
32
+ when "companies" then Teamtailor::Company.new(record, included)
33
+ when "stages" then Teamtailor::Stage.new(record, included)
34
+ when "reject-reasons" then Teamtailor::RejectReason.new(record, included)
35
+ when "departments" then Teamtailor::Department.new(record, included)
36
+ when "locations" then Teamtailor::Location.new(record, included)
37
+ when "custom-fields" then Teamtailor::CustomField.new(record, included)
38
+ when "custom-field-selects" then Teamtailor::CustomField.new(record, included)
39
+ when "custom-field-values" then Teamtailor::CustomFieldValue.new(record, included)
40
+ when "referrals" then Teamtailor::Referral.new(record, included)
41
+ when "partner-results" then Teamtailor::PartnerResult.new(record, included)
42
+ when "requisitions" then Teamtailor::Requisition.new(record, included)
43
+ when "requisition-step-verdicts" then Teamtailor::RequisitionStepVerdict.new(record, included)
44
44
 
45
45
  else
46
- raise Teamtailor::UnknownResponseTypeError, record&.dig('type')
46
+ raise Teamtailor::UnknownResponseTypeError, record&.dig("type")
47
47
  end
48
48
  end
49
49
  end
@@ -57,11 +57,11 @@ module Teamtailor
57
57
  end
58
58
 
59
59
  def data
60
- [payload&.dig('data')].flatten
60
+ [payload&.dig("data")].flatten
61
61
  end
62
62
 
63
63
  def included
64
- payload&.dig('included')
64
+ payload&.dig("included")
65
65
  end
66
66
  end
67
67
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class Candidate < Record
7
7
  def connected?
8
- data.dig('attributes', 'connected')
8
+ data.dig("attributes", "connected")
9
9
  end
10
10
  end
11
11
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class Company < Record
7
7
  def id
8
- data.dig('id')
8
+ data.dig("id")
9
9
  end
10
10
  end
11
11
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class CustomField < Record
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class CustomFieldValue < Record
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class Department < Record
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class Job < Record
7
7
  def careersite_job_url
8
- data.dig('links', 'careersite-job-url')
8
+ data.dig("links", "careersite-job-url")
9
9
  end
10
10
  end
11
11
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class JobApplication < Record
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class Location < Record
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class PartnerResult < Record
7
7
  def id
8
- data.dig('id')
8
+ data.dig("id")
9
9
  end
10
10
  end
11
11
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class Referral < Record
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class RejectReason < Record
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class Requisition < Record
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class RequisitionStepVerdict < Record
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class Stage < Record
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'teamtailor/record'
3
+ require "teamtailor/record"
4
4
 
5
5
  module Teamtailor
6
6
  class User < Record
@@ -1,4 +1,4 @@
1
- require 'teamtailor/relationship'
1
+ require "teamtailor/relationship"
2
2
 
3
3
  module Teamtailor
4
4
  class Record
@@ -9,23 +9,23 @@ module Teamtailor
9
9
 
10
10
  def self.deserialize(value)
11
11
  payload = JSON.parse value
12
- new(payload['data'], payload['included'])
12
+ new(payload["data"], payload["included"])
13
13
  end
14
14
 
15
15
  def serialize
16
16
  {
17
17
  data: data,
18
- included: included
18
+ included: included,
19
19
  }.to_json
20
20
  end
21
21
 
22
22
  def method_missing(m)
23
23
  if m == :id
24
- data.dig('id').to_i
25
- elsif relationship_keys.include?(m.to_s.gsub('_', '-'))
26
- build_relationship(m.to_s.gsub('_', '-'))
24
+ data.dig("id").to_i
25
+ elsif relationship_keys.include?(m.to_s.gsub("_", "-"))
26
+ build_relationship(m.to_s.gsub("_", "-"))
27
27
  else
28
- data.dig('attributes', m.to_s.gsub('_', '-'))
28
+ data.dig("attributes", m.to_s.gsub("_", "-"))
29
29
  end
30
30
  end
31
31
 
@@ -34,11 +34,11 @@ module Teamtailor
34
34
  attr_reader :data, :included
35
35
 
36
36
  def build_relationship(name)
37
- Teamtailor::Relationship.new(name, data.dig('relationships'), included)
37
+ Teamtailor::Relationship.new(name, data.dig("relationships"), included)
38
38
  end
39
39
 
40
40
  def relationship_keys
41
- data.dig('relationships')&.keys || {}
41
+ data.dig("relationships")&.keys || {}
42
42
  end
43
43
  end
44
44
  end
@@ -16,22 +16,22 @@ module Teamtailor
16
16
  raise Teamtailor::UnloadedRelationError unless loaded?
17
17
 
18
18
  record_json = included.select do |k|
19
- record_ids.include?(k['id']) && k['type'] == record_type
19
+ record_ids.include?(k["id"]) && k["type"] == record_type
20
20
  end
21
21
 
22
- Teamtailor::Parser.parse({ 'data' => record_json, 'included' => included })
22
+ Teamtailor::Parser.parse({ "data" => record_json, "included" => included })
23
23
  end
24
24
 
25
25
  private
26
26
 
27
27
  def record_ids
28
- data = [relationships&.dig(relation_name, 'data')].flatten.compact
29
- data.map { |row| row['id'] }
28
+ data = [relationships&.dig(relation_name, "data")].flatten.compact
29
+ data.map { |row| row["id"] }
30
30
  end
31
31
 
32
32
  def record_type
33
- data = [relationships&.dig(relation_name, 'data')].flatten
34
- data.map { |row| row['type'] }.first
33
+ data = [relationships&.dig(relation_name, "data")].flatten
34
+ data.map { |row| row["type"] }.first
35
35
  end
36
36
 
37
37
  attr_reader :relation_name, :relationships, :included
@@ -1,29 +1,34 @@
1
- require 'typhoeus'
2
- require 'json'
1
+ require "typhoeus"
2
+ require "json"
3
3
 
4
- require 'teamtailor/page_result'
4
+ require "teamtailor/page_result"
5
5
 
6
6
  module Teamtailor
7
7
  class Request
8
- def initialize(base_url:, api_token:, api_version:, path:, params: {})
8
+ def initialize(base_url:, api_token:, api_version:, path:, params: {}, body: {}, method: :get)
9
9
  @base_url = base_url
10
10
  @api_token = api_token
11
11
  @api_version = api_version
12
12
  @path = path
13
13
  @params = params
14
+ @method = method
15
+ @body = body
14
16
  end
15
17
 
16
18
  def call
17
19
  request = Typhoeus::Request.new(
18
20
  "#{base_url}#{path}",
19
- method: :get,
21
+ method: method,
20
22
  params: params,
21
- headers: request_headers
23
+ headers: request_headers,
24
+ body: body.to_json
22
25
  )
23
26
  response = request.run
24
27
 
25
28
  if response.code == 200
26
29
  Teamtailor::PageResult.new response.body
30
+ elsif response.code == 201
31
+ Teamtailor::Parser.parse(JSON.parse(response.body)).first
27
32
  else
28
33
  raise Teamtailor::Error.from_response(
29
34
  body: response.body,
@@ -34,14 +39,14 @@ module Teamtailor
34
39
 
35
40
  private
36
41
 
37
- attr_reader :base_url, :path, :api_token, :api_version, :params
42
+ attr_reader :base_url, :path, :api_token, :api_version, :params, :method, :body
38
43
 
39
44
  def request_headers
40
45
  {
41
46
  "Authorization": "Token token=#{api_token}",
42
- 'X-Api-Version' => api_version,
43
- 'User-Agent' => "teamtailor-rb v#{Teamtailor::VERSION}",
44
- 'Content-Type' => 'application/vnd.api+json; charset=utf-8'
47
+ "X-Api-Version" => api_version,
48
+ "User-Agent" => "teamtailor-rb v#{Teamtailor::VERSION}",
49
+ "Content-Type" => "application/vnd.api+json; charset=utf-8",
45
50
  }
46
51
  end
47
52
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Teamtailor
4
- VERSION = '0.3.2'
4
+ VERSION = "0.3.3"
5
5
  end
data/teamtailor.gemspec CHANGED
@@ -1,26 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'lib/teamtailor/version'
3
+ require_relative "lib/teamtailor/version"
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = 'teamtailor'
6
+ spec.name = "teamtailor"
7
7
  spec.version = Teamtailor::VERSION
8
- spec.authors = ['André Ligné']
9
- spec.email = ['hi@andreligne.se']
8
+ spec.authors = ["André Ligné"]
9
+ spec.email = ["hi@andreligne.se"]
10
10
 
11
- spec.summary = 'Library for interacting with the Teamtailor API'
12
- spec.homepage = 'https://github.com/teamtailor/teamtailor-gem'
13
- spec.license = 'MIT'
14
- spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
11
+ spec.summary = "Library for interacting with the Teamtailor API"
12
+ spec.homepage = "https://github.com/teamtailor/teamtailor-gem"
13
+ spec.license = "MIT"
14
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
15
15
 
16
- spec.metadata['homepage_uri'] = spec.homepage
17
- spec.metadata['source_code_uri'] = 'https://github.com/bzf/teamtailor-rb'
18
- spec.metadata['changelog_uri'] = 'https://github.com/bzf/teamtailor-rb/main/CHANGELOG.md'
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = "https://github.com/bzf/teamtailor-rb"
18
+ spec.metadata["changelog_uri"] = "https://github.com/bzf/teamtailor-rb/main/CHANGELOG.md"
19
19
 
20
- spec.extra_rdoc_files = ['README.md']
20
+ spec.extra_rdoc_files = ["README.md"]
21
21
 
22
- spec.add_development_dependency 'rspec', '~> 3.2'
23
- spec.add_dependency 'typhoeus', '~> 1.3.1'
22
+ spec.add_development_dependency "rspec", "~> 3.2"
23
+ spec.add_dependency "typhoeus", "~> 1.3.1"
24
24
 
25
25
  # Specify which files should be added to the gem when it is released.
26
26
  # The `git ls-files -z` loads the files in the RubyGem that have been added
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  f.match(%r{^(test|spec|features)/})
31
31
  end
32
32
  end
33
- spec.bindir = 'exe'
33
+ spec.bindir = "exe"
34
34
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
35
- spec.require_paths = ['lib']
35
+ spec.require_paths = ["lib"]
36
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: teamtailor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - André Ligné
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-03 00:00:00.000000000 Z
11
+ date: 2021-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -49,6 +49,7 @@ files:
49
49
  - ".github/workflows/ruby.yml"
50
50
  - ".gitignore"
51
51
  - ".rspec"
52
+ - ".rubocop.yml"
52
53
  - ".travis.yml"
53
54
  - CHANGELOG.md
54
55
  - Gemfile