teamtailor 0.1.0 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c9464bec7bd58b5a5b47dc4cd5fd2aa91710f82602f658d4a1981cff33d42bc1
4
- data.tar.gz: f1e218de0ce3dd7ebb78ebdd29c44ad2bfb49680b226186a18b5f18e23d2c654
3
+ metadata.gz: 65d5517a7804ca23cfab37e186ce9a3a8e6fd834d19142f1639bd43a713f0cad
4
+ data.tar.gz: 1ce95b3c0f5734a5a75d7e735a2938396e66b1c6a66ecb636f11951e99cb16b4
5
5
  SHA512:
6
- metadata.gz: db6d877077e001925903a29694918110f02c85bdb3e3c10bc80df415bf5f9b0e463e2f606380f9c26f391e49ea0f6cb86416989afe00df4883df335fac947794
7
- data.tar.gz: a27532d72dd0cfd872392af29ff3e81665a1fd61ff27f065801f815fc14b2928d72950e5cef3b14e27fd058308faaba2afd5ed1285c4c67ada6826599a841e39
6
+ metadata.gz: befca1d520b6e38edde324a89a5ed7e2e45df37a08037c2ea466703e558d3a88c4401878c33e3021b38408ea5567616c5d67cc5ebeaac60eeaff289b29b6954c
7
+ data.tar.gz: c03ff827ea515229c96f4380a3aea14e5989060ffa1bf9c8146149135475040591179aad9444aee343bb81903a0f119dba9b5302589dde5dded132865c981654
data/CHANGELOG.md ADDED
@@ -0,0 +1,27 @@
1
+ ## Unreleased
2
+
3
+ ## v0.2.4 - 2020-04-07
4
+
5
+ - Add `Teamtailor::Location` and `Client#locations`
6
+ - Add `Teamtailor::Department` and `Client#departments`
7
+ - Add `Teamtailor::RejectReason` and `Client#reject_reasons`
8
+ - Add `Teamtailor::Stage` and `Client#stages` for fetching it (`2179b1`)
9
+
10
+ ## v0.2.3 - 2020-04-06
11
+
12
+ - Add `Teamtailor::Company` and `Client#company` for fetching it (`05dde0`)
13
+
14
+ ## v0.2.2 - 2020-03-31
15
+
16
+ - Move serialization logic in the `Teamtailor::Record` base class (`9ec63a0`)
17
+ - Fix serializing/deserializing loaded relationships for
18
+ `Teamtailor::JobApplication` (`428e2d`)
19
+
20
+ ## v0.2.1 - 2020-03-31
21
+
22
+ - Add `Teamtailor::JobApplication` and `Client#job_applications` (`062fa7`)
23
+
24
+ ## v0.2.0 - 2020-03-31
25
+
26
+ - Add support for accessing relationships on records (`1218aa`)
27
+ - Add support for including relationships when querying the API (`90f25d`)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- teamtailor (0.1.0)
4
+ teamtailor (0.2.4)
5
5
  typhoeus (~> 1.3.1)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -65,6 +65,41 @@ irb(main):041:0> jobs.map &:title
65
65
  => ["EmberJS Developer", "Ruby on Rails developer"]
66
66
  ```
67
67
 
68
+ ### Relationships
69
+
70
+ The API allows you to include associated data when requesting data to help
71
+ you load associations without having to make any additional requests.
72
+ To do this, you can pass what you want to include when making the request.
73
+
74
+ To fetch jobs with all associated `user`s loaded, you can call `Client#jobs`
75
+ like this:
76
+
77
+ ```ruby
78
+ irb(main):006:0> page_result = @client.jobs(page: 1, include: [:user])
79
+ irb(main):007:0> page_result.records.first.user.record.login_email
80
+ => "admin@teamtailor.localhost"
81
+ ```
82
+
83
+ If you try to access a relationship, without having included it when loading it
84
+ from the server, it'll raise a `Teamtailor::UnloadedRelationError`:
85
+
86
+ ```ruby
87
+ irb(main):010:0> page_result = @client.jobs(page: 1, include: [])
88
+ irb(main):011:0> page_result.records.first.user.record
89
+ Traceback (most recent call last):
90
+ ...
91
+ 1: from ~/teamtailor/lib/teamtailor/relationship.rb:16:in `record'
92
+ Teamtailor::UnloadedRelationError (Teamtailor::UnloadedRelationError)
93
+ ```
94
+
95
+ To check if a relation has been loaded or not you can use the
96
+ `Relationship#loaded?` method to check before calling it:
97
+
98
+ ```ruby
99
+ irb(main):012:0> page_result = @client.jobs(page: 1, include: [:user])
100
+ irb(main):013:0> page_result.records.first.user.loaded?
101
+ => true
102
+ ```
68
103
 
69
104
  ## Development
70
105
 
@@ -10,7 +10,19 @@ module Teamtailor
10
10
  @api_version = api_version
11
11
  end
12
12
 
13
- def candidates(page: 1)
13
+ def company(include: [])
14
+ Teamtailor::Request.new(
15
+ base_url: base_url,
16
+ api_token: api_token,
17
+ api_version: api_version,
18
+ path: '/v1/company',
19
+ params: {
20
+ 'include' => include.join(',')
21
+ }
22
+ ).call
23
+ end
24
+
25
+ def candidates(page: 1, include: [])
14
26
  Teamtailor::Request.new(
15
27
  base_url: base_url,
16
28
  api_token: api_token,
@@ -18,12 +30,13 @@ module Teamtailor
18
30
  path: '/v1/candidates',
19
31
  params: {
20
32
  'page[number]' => page,
21
- 'page[size]' => 30
33
+ 'page[size]' => 30,
34
+ 'include' => include.join(',')
22
35
  }
23
36
  ).call
24
37
  end
25
38
 
26
- def jobs(page: 1)
39
+ def jobs(page: 1, include: [])
27
40
  Teamtailor::Request.new(
28
41
  base_url: base_url,
29
42
  api_token: api_token,
@@ -31,12 +44,27 @@ module Teamtailor
31
44
  path: '/v1/jobs',
32
45
  params: {
33
46
  'page[number]' => page,
34
- 'page[size]' => 30
47
+ 'page[size]' => 30,
48
+ 'include' => include.join(',')
49
+ }
50
+ ).call
51
+ end
52
+
53
+ def job_applications(page: 1, include: [])
54
+ Teamtailor::Request.new(
55
+ base_url: base_url,
56
+ api_token: api_token,
57
+ api_version: api_version,
58
+ path: '/v1/job-applications',
59
+ params: {
60
+ 'page[number]' => page,
61
+ 'page[size]' => 30,
62
+ 'include' => include.join(',')
35
63
  }
36
64
  ).call
37
65
  end
38
66
 
39
- def users(page: 1)
67
+ def users(page: 1, include: [])
40
68
  Teamtailor::Request.new(
41
69
  base_url: base_url,
42
70
  api_token: api_token,
@@ -44,7 +72,64 @@ module Teamtailor
44
72
  path: '/v1/users',
45
73
  params: {
46
74
  'page[number]' => page,
47
- 'page[size]' => 30
75
+ 'page[size]' => 30,
76
+ 'include' => include.join(',')
77
+ }
78
+ ).call
79
+ end
80
+
81
+ def stages(page: 1, include: [])
82
+ Teamtailor::Request.new(
83
+ base_url: base_url,
84
+ api_token: api_token,
85
+ api_version: api_version,
86
+ path: '/v1/stages',
87
+ params: {
88
+ 'page[number]' => page,
89
+ 'page[size]' => 30,
90
+ 'include' => include.join(',')
91
+ }
92
+ ).call
93
+ end
94
+
95
+ def reject_reasons(page: 1, include: [])
96
+ Teamtailor::Request.new(
97
+ base_url: base_url,
98
+ api_token: api_token,
99
+ api_version: api_version,
100
+ path: '/v1/reject-reasons',
101
+ params: {
102
+ 'page[number]' => page,
103
+ 'page[size]' => 30,
104
+ 'include' => include.join(',')
105
+ }
106
+ ).call
107
+ end
108
+
109
+ def departments(page: 1, include: [])
110
+ Teamtailor::Request.new(
111
+ base_url: base_url,
112
+ api_token: api_token,
113
+ api_version: api_version,
114
+ path: '/v1/departments',
115
+ params: {
116
+ 'page[number]' => page,
117
+ 'page[size]' => 30,
118
+ 'include' => include.join(',')
119
+ }
120
+ ).call
121
+ end
122
+
123
+ def locations(page: 1, include: [])
124
+ Teamtailor::Request.new(
125
+ base_url: base_url,
126
+ api_token: api_token,
127
+ api_version: api_version,
128
+ path: '/v1/locations',
129
+ params: {
130
+ 'page[number]' => page,
131
+ 'page[size]' => 30,
132
+ 'include' => include.join(',')
48
133
  }
49
134
  ).call
50
135
  end
@@ -24,4 +24,6 @@ module Teamtailor
24
24
  class JSONError < ClientError; end
25
25
 
26
26
  class UnknownResponseTypeError < ClientError; end
27
+
28
+ class UnloadedRelationError < ClientError; end
27
29
  end
@@ -3,6 +3,12 @@
3
3
  require 'teamtailor/parser/candidate'
4
4
  require 'teamtailor/parser/job'
5
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'
6
12
 
7
13
  module Teamtailor
8
14
  class Parser
@@ -13,12 +19,18 @@ module Teamtailor
13
19
  def parse
14
20
  data.map do |record|
15
21
  case record&.dig('type')
16
- when 'candidates' then Teamtailor::Candidate.new(record)
17
- when 'jobs' then Teamtailor::Job.new(record)
18
- when 'users' then Teamtailor::User.new(record)
22
+ when 'candidates' then Teamtailor::Candidate.new(record, included)
23
+ when 'jobs' then Teamtailor::Job.new(record, included)
24
+ when 'users' then Teamtailor::User.new(record, included)
25
+ when 'job-applications' then Teamtailor::JobApplication.new(record, included)
26
+ when 'companies' then Teamtailor::Company.new(record, included)
27
+ when 'stages' then Teamtailor::Stage.new(record, included)
28
+ when 'reject-reasons' then Teamtailor::RejectReason.new(record, included)
29
+ when 'departments' then Teamtailor::Department.new(record, included)
30
+ when 'locations' then Teamtailor::Location.new(record, included)
19
31
 
20
32
  else
21
- raise Teamtailor::UnknownResponseTypeError.new(record&.dig('type'))
33
+ raise Teamtailor::UnknownResponseTypeError, record&.dig('type')
22
34
  end
23
35
  end
24
36
  end
@@ -34,5 +46,9 @@ module Teamtailor
34
46
  def data
35
47
  [payload&.dig('data')].flatten
36
48
  end
49
+
50
+ def included
51
+ payload&.dig('included')
52
+ end
37
53
  end
38
54
  end
@@ -1,31 +1,11 @@
1
- module Teamtailor
2
- class Candidate
3
- def initialize(payload)
4
- @payload = payload
5
- end
6
-
7
- def self.deserialize(value)
8
- new(value)
9
- end
10
-
11
- def serialize
12
- payload
13
- end
1
+ # frozen_string_literal: true
14
2
 
15
- def id
16
- payload.dig('id').to_i
17
- end
3
+ require 'teamtailor/record'
18
4
 
5
+ module Teamtailor
6
+ class Candidate < Record
19
7
  def connected?
20
- payload.dig('attributes', 'connected')
21
- end
22
-
23
- def method_missing(m)
24
- payload.dig('attributes', m.to_s.gsub('_', '-'))
8
+ data.dig('attributes', 'connected')
25
9
  end
26
-
27
- private
28
-
29
- attr_reader :payload
30
10
  end
31
11
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'teamtailor/record'
4
+
5
+ module Teamtailor
6
+ class Company < Record
7
+ def id
8
+ data.dig('id')
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'teamtailor/record'
4
+
5
+ module Teamtailor
6
+ class Department < Record
7
+ end
8
+ end
@@ -1,31 +1,11 @@
1
- module Teamtailor
2
- class Job
3
- def initialize(payload)
4
- @payload = payload
5
- end
6
-
7
- def self.deserialize(value)
8
- new(value)
9
- end
10
-
11
- def serialize
12
- payload
13
- end
1
+ # frozen_string_literal: true
14
2
 
15
- def id
16
- payload.dig('id').to_i
17
- end
3
+ require 'teamtailor/record'
18
4
 
5
+ module Teamtailor
6
+ class Job < Record
19
7
  def careersite_job_url
20
- payload.dig('links', 'careersite-job-url')
21
- end
22
-
23
- def method_missing(m)
24
- payload.dig('attributes', m.to_s.gsub('_', '-'))
8
+ data.dig('links', 'careersite-job-url')
25
9
  end
26
-
27
- private
28
-
29
- attr_reader :payload
30
10
  end
31
11
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'teamtailor/record'
4
+
5
+ module Teamtailor
6
+ class JobApplication < Record
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'teamtailor/record'
4
+
5
+ module Teamtailor
6
+ class Location < Record
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'teamtailor/record'
4
+
5
+ module Teamtailor
6
+ class RejectReason < Record
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'teamtailor/record'
4
+
5
+ module Teamtailor
6
+ class Stage < Record
7
+ end
8
+ end
@@ -1,27 +1,8 @@
1
- module Teamtailor
2
- class User
3
- def initialize(payload)
4
- @payload = payload
5
- end
6
-
7
- def self.deserialize(value)
8
- new(value)
9
- end
10
-
11
- def serialize
12
- payload
13
- end
1
+ # frozen_string_literal: true
14
2
 
15
- def id
16
- payload.dig('id').to_i
17
- end
3
+ require 'teamtailor/record'
18
4
 
19
- def method_missing(m)
20
- payload.dig('attributes', m.to_s.gsub('_', '-'))
21
- end
22
-
23
- private
24
-
25
- attr_reader :payload
5
+ module Teamtailor
6
+ class User < Record
26
7
  end
27
8
  end
@@ -0,0 +1,44 @@
1
+ require 'teamtailor/relationship'
2
+
3
+ module Teamtailor
4
+ class Record
5
+ def initialize(data, included = {})
6
+ @data = data
7
+ @included = included
8
+ end
9
+
10
+ def self.deserialize(value)
11
+ payload = JSON.parse value
12
+ new(payload['data'], payload['included'])
13
+ end
14
+
15
+ def serialize
16
+ {
17
+ data: data,
18
+ included: included
19
+ }.to_json
20
+ end
21
+
22
+ def method_missing(m)
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('_', '-'))
27
+ else
28
+ data.dig('attributes', m.to_s.gsub('_', '-'))
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :data, :included
35
+
36
+ def build_relationship(name)
37
+ Teamtailor::Relationship.new(name, data.dig('relationships'), included)
38
+ end
39
+
40
+ def relationship_keys
41
+ data.dig('relationships')&.keys || {}
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Teamtailor
4
+ class Relationship
5
+ def initialize(relation_name, relationships = {}, included = {})
6
+ @relation_name = relation_name
7
+ @relationships = relationships
8
+ @included = included
9
+ end
10
+
11
+ def loaded?
12
+ !record_id.nil?
13
+ end
14
+
15
+ def record
16
+ raise Teamtailor::UnloadedRelationError unless loaded?
17
+
18
+ record_json = included.find do |k|
19
+ k['id'] == record_id && k['type'] == record_type
20
+ end
21
+
22
+ Teamtailor::Parser.parse({ 'data' => record_json }).first
23
+ end
24
+
25
+ private
26
+
27
+ def record_id
28
+ relationships&.dig(relation_name, 'data', 'id')
29
+ end
30
+
31
+ def record_type
32
+ relationships&.dig(relation_name, 'data', 'type')
33
+ end
34
+
35
+ attr_reader :relation_name, :relationships, :included
36
+ end
37
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Teamtailor
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.4'
5
5
  end
data/teamtailor.gemspec CHANGED
@@ -14,8 +14,8 @@ Gem::Specification.new do |spec|
14
14
  spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
15
15
 
16
16
  spec.metadata['homepage_uri'] = spec.homepage
17
- spec.metadata['source_code_uri'] = 'https://github.com/bzf/teamtailor-gem'
18
- spec.metadata['changelog_uri'] = 'https://github.com/bzf/teamtailor-gem/master/CHANGELOG.md'
17
+ spec.metadata['source_code_uri'] = 'https://github.com/bzf/teamtailor-rb'
18
+ spec.metadata['changelog_uri'] = 'https://github.com/bzf/teamtailor-rb/master/CHANGELOG.md'
19
19
 
20
20
  spec.add_development_dependency 'rspec', '~> 3.2'
21
21
  spec.add_dependency 'typhoeus', '~> 1.3.1'
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.1.0
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - André Ligné
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-27 00:00:00.000000000 Z
11
+ date: 2020-04-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -48,6 +48,7 @@ files:
48
48
  - ".gitignore"
49
49
  - ".rspec"
50
50
  - ".travis.yml"
51
+ - CHANGELOG.md
51
52
  - Gemfile
52
53
  - Gemfile.lock
53
54
  - LICENSE.txt
@@ -61,8 +62,16 @@ files:
61
62
  - lib/teamtailor/page_result.rb
62
63
  - lib/teamtailor/parser.rb
63
64
  - lib/teamtailor/parser/candidate.rb
65
+ - lib/teamtailor/parser/company.rb
66
+ - lib/teamtailor/parser/department.rb
64
67
  - lib/teamtailor/parser/job.rb
68
+ - lib/teamtailor/parser/job_application.rb
69
+ - lib/teamtailor/parser/location.rb
70
+ - lib/teamtailor/parser/reject_reason.rb
71
+ - lib/teamtailor/parser/stage.rb
65
72
  - lib/teamtailor/parser/user.rb
73
+ - lib/teamtailor/record.rb
74
+ - lib/teamtailor/relationship.rb
66
75
  - lib/teamtailor/request.rb
67
76
  - lib/teamtailor/version.rb
68
77
  - teamtailor.gemspec
@@ -71,8 +80,8 @@ licenses:
71
80
  - MIT
72
81
  metadata:
73
82
  homepage_uri: https://github.com/bzf/teamtailor-gem
74
- source_code_uri: https://github.com/bzf/teamtailor-gem
75
- changelog_uri: https://github.com/bzf/teamtailor-gem/master/CHANGELOG.md
83
+ source_code_uri: https://github.com/bzf/teamtailor-rb
84
+ changelog_uri: https://github.com/bzf/teamtailor-rb/master/CHANGELOG.md
76
85
  post_install_message:
77
86
  rdoc_options: []
78
87
  require_paths: