peoplegroup-connectors 0.1.8 → 0.1.9

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: 970e02a20813047a8a3673fc205db913c74a05f796c638527d646a47a45b6b3c
4
- data.tar.gz: bface6e5766fd959d452b59a50b329e0382a551657652048a170219193903106
3
+ metadata.gz: 800a61edd755dd71ab5990d2f53df313a78c42cfac1cc6be206dd9e0f1555cb7
4
+ data.tar.gz: f8213430bfa0fe919aa8e1fcb229d0655ca9514d8827b3c304ff4dbc6047c59a
5
5
  SHA512:
6
- metadata.gz: 953986438996dd78ee42d3a8b38530d17552225f7f32bc13155aa9fec254243fe7202fa3f5ad40559988f8b1812e5a85f9fa99585dbdb147c9713043db9d6d3f
7
- data.tar.gz: 40e562e07ac901a4557680933f6ac0bce5eebe9f8ab9f0d40289a46e96a875fd0b27355bc5a386a3988ae838bbf9c06dcd767a78cbb704f0dc9e2697f520a509
6
+ metadata.gz: d9eebb60b4bc441afdfa164a7c911bb58f48e47358ada3fe75595f5cb9102f2d50f0f5f9b8ce164d89aaf8aff8527720950de02075e16b3b62a0ccf2039dc8be
7
+ data.tar.gz: a4a709ad17b6e14fd09117fc15810c9354279780264a7721e785ea11c355dea655ee4054790a3dfa6db20443743d5947832c41e1c5721f4a5fca2b3626f82835
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # PeopleGroup::Connectors
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/peoplegroup/connectors`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ The gem contains wrapper code for all the services we sync with. The reason we bundled this in a separate gem is to not have duplicate code in our different projects.
6
4
 
7
5
  ## Installation
8
6
 
@@ -22,7 +20,10 @@ Or install it yourself as:
22
20
 
23
21
  ## Usage
24
22
 
25
- TODO: Write usage instructions here
23
+ ```ruby
24
+ gitlab_client = PeopleGroup::Connectors::GitLab.new
25
+ gitlab_client.find_gitlabber(:email, 'some-email@domain.com')
26
+ ```
26
27
 
27
28
  ## Development
28
29
 
@@ -4,6 +4,8 @@ require_relative 'connectors/version'
4
4
  require_relative 'connectors/gitlab'
5
5
  require_relative 'connectors/slack'
6
6
  require_relative 'connectors/pto_roots'
7
+ require_relative 'connectors/bamboo'
8
+ require_relative 'connectors/greenhouse'
7
9
 
8
10
  module PeopleGroup
9
11
  module Connectors
@@ -0,0 +1,146 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bamboozled'
4
+
5
+ module PeopleGroup
6
+ module Connectors
7
+ class Bamboo
8
+ MAX_RETRIES = 3
9
+
10
+ def initialize
11
+ @client = Bamboozled.client(subdomain: 'gitlab', api_key: ENV['BAMBOO_API_KEY'])
12
+ end
13
+
14
+ def get_employee_details(id)
15
+ employees.find { |emp| emp['id'] == id.to_s }
16
+ end
17
+
18
+ def get_employee(id)
19
+ @client.employee.find(id, %w[firstName lastName jobTitle supervisor hireDate country location department division workEmail customCostCenter])
20
+ end
21
+
22
+ def search_employee(name)
23
+ return if name.empty?
24
+
25
+ employees.find { |emp| [emp['displayName'], "#{emp['firstName']} #{emp['lastName']}", "#{emp['preferredName']} #{emp['lastName']}", emp['fullName5']].include?(name) }
26
+ end
27
+
28
+ def search_employee_by_field(field:, value:)
29
+ employees.find { |employee| employee[field] == value.to_s }
30
+ end
31
+
32
+ def create_employee(employee_details_hash)
33
+ @client.employee.add(employee_details_hash)
34
+ end
35
+
36
+ def update_employee(employee_id, employee_details_hash)
37
+ @client.employee.update(employee_id, employee_details_hash)
38
+ end
39
+
40
+ def departments
41
+ meta_fields.detect { |res| res['name'] == 'Department' }.dig('options').each_with_object([]) { |option, array| array << option['name'] if option['archived'] == 'no' } || []
42
+ end
43
+
44
+ def divisions
45
+ meta_fields.detect { |res| res['name'] == 'Division' }.dig('options').each_with_object([]) { |option, array| array << option['name'] if option['archived'] == 'no' } || []
46
+ end
47
+
48
+ def fields
49
+ @fields ||= (Bamboozled::API::FieldCollection.all_names + @client.meta.fields.map { |f| f['alias'] }).compact.uniq
50
+ end
51
+
52
+ def employees
53
+ retries = 0
54
+
55
+ begin
56
+ @employees ||= @client.report.custom(fields, 'JSON').reject { |employee| employee['lastName'] == 'Test-Gitlab' }
57
+ rescue Net::ReadTimeout
58
+ retry if (retries += 1) < MAX_RETRIES
59
+ end
60
+ end
61
+
62
+ def active_employees
63
+ employees.select { |employee| employee['status'] == 'Active' }
64
+ end
65
+ alias_method :active_team_members, :active_employees
66
+
67
+ def add_stock_options(employee_id, data)
68
+ @client.employee.add_table_row(employee_id, 'customEquity', data)
69
+ end
70
+
71
+ def stock_options_data(employee_id)
72
+ @client.employee.table_data(employee_id, 'customEquity')
73
+ end
74
+
75
+ def update_job_details(employee_id, data)
76
+ current_data = job_details(employee_id) # it should only be one row as we just created this user
77
+ row_id = current_data.first.dig('id')
78
+ @client.employee.update_table_row(employee_id, 'jobInfo', row_id, data)
79
+ end
80
+
81
+ def add_compensation_details(employee_id, data)
82
+ @client.employee.add_table_row(employee_id, 'compensation', data)
83
+ end
84
+
85
+ def employment_statuses(employee_id)
86
+ @client.employee.table_data(employee_id, 'employmentStatus')
87
+ end
88
+
89
+ def job_details(employee_id)
90
+ @client.employee.table_data(employee_id, 'jobInfo')
91
+ end
92
+
93
+ def resumes_folder_id(employee_id)
94
+ @resumes_folder_id ||= files(employee_id).dig('categories').find { |folder| folder['name'] == 'Resumes and Applications' }.dig('id')
95
+ end
96
+
97
+ def contract_folder_id(employee_id)
98
+ @contract_folder_id ||= files(employee_id).dig('categories').find { |folder| folder['name'] == 'Contracts & Changes' }.dig('id')
99
+ end
100
+
101
+ def add_file(employee_id, file_name, file, folder_id)
102
+ options = {
103
+ category: folder_id,
104
+ fileName: file_name,
105
+ share: 'yes',
106
+ file: file
107
+ }
108
+ @client.employee.add_file(employee_id, options)
109
+ end
110
+
111
+ def add_employment_status(employee_id, data)
112
+ @client.employee.add_table_row(employee_id, 'employmentStatus', data)
113
+ end
114
+
115
+ def add_currency_conversion(employee_id, data)
116
+ @client.employee.add_table_row(employee_id, 'customCurrencyConversion', data)
117
+ end
118
+
119
+ def add_on_target_earnings(employee_id, data)
120
+ @client.employee.add_table_row(employee_id, 'customOnTargetEarnings', data)
121
+ end
122
+
123
+ def add_signing_bonus(employee_id, data)
124
+ @client.employee.add_table_row(employee_id, 'customBonus', data)
125
+ end
126
+
127
+ def add_family_member(employee_id, data)
128
+ @client.employee.add_table_row(employee_id, 'customFamilyMember', data)
129
+ end
130
+
131
+ def add_additional_data(employee_id, data)
132
+ @client.employee.add_table_row(employee_id, 'customAdditionalInformation1', data)
133
+ end
134
+
135
+ private
136
+
137
+ def meta_fields
138
+ @meta_fields ||= @client.meta.lists
139
+ end
140
+
141
+ def files(employee_id)
142
+ @files ||= @client.employee.files(employee_id)
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'greenhouse_io'
4
+
5
+ module PeopleGroup
6
+ module Connectors
7
+ class Greenhouse
8
+ MAX_RETRIES = 3
9
+
10
+ def initialize(use_users_api_key: false)
11
+ api_key = use_users_api_key ? ENV['GREENHOUSE_API_KEY_USERS'] : ENV['GREENHOUSE_API_KEY']
12
+ @client = GreenhouseIo::Client.new(api_key)
13
+ end
14
+
15
+ def offer_for_application(application_id)
16
+ @client.offers_for_application(application_id)
17
+ end
18
+
19
+ def hired_candidates(updated_since)
20
+ page = 1
21
+ candidates = []
22
+ retries = 0
23
+
24
+ loop do
25
+ begin
26
+ results = @client.candidates(nil, updated_after: updated_since, page: page)
27
+ break if results.empty?
28
+
29
+ results.each do |candidate|
30
+ candidates << candidate if hired_non_active?(candidate)
31
+ end
32
+ rescue GreenhouseIo::Error
33
+ p [updated_since, page]
34
+ retry if (retries += 1) < MAX_RETRIES
35
+ end
36
+ page += 1
37
+ end
38
+
39
+ candidates
40
+ end
41
+
42
+ def candidate(candidate_id)
43
+ @client.candidates(candidate_id)
44
+ end
45
+
46
+ def add_sync_note_to_candidate(candidate_id)
47
+ note = {
48
+ user_id: ENV['GREENHOUSE_AUTHOR_ID'],
49
+ body: "This person was synced at #{Time.now} by the Employee Bot",
50
+ visibility: 'public'
51
+ }
52
+ @client.create_candidate_note(candidate_id, note, ENV['GREENHOUSE_AUTHOR_ID'])
53
+ end
54
+
55
+ def users
56
+ page = 1
57
+ users = []
58
+
59
+ loop do
60
+ results = @client.users(nil, page: page)
61
+ break if results.empty?
62
+
63
+ users += results
64
+ page += 1
65
+ end
66
+
67
+ users
68
+ end
69
+
70
+ private
71
+
72
+ def hired_non_active?(candidate)
73
+ # If the candidate has any application that is active, we don't sync.
74
+ return false if candidate['applications'].any? { |application| application['status'] == 'active' }
75
+
76
+ # Check if candidate is hired for just one of their applications
77
+ candidate['applications'].one? { |application| application['status'] == 'hired' }
78
+ end
79
+ end
80
+ end
81
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module PeopleGroup
4
4
  module Connectors
5
- VERSION = '0.1.8'
5
+ VERSION = '0.1.9'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: peoplegroup-connectors
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - lien van den steen
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bamboozled-gitlab
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.2.9
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.2.9
69
+ - !ruby/object:Gem::Dependency
70
+ name: greenhouse_io-gitlab
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.5'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.5'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: rspec
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +100,28 @@ dependencies:
72
100
  requirements:
73
101
  - - "~>"
74
102
  - !ruby/object:Gem::Version
75
- version: '0.85'
103
+ version: 0.91.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.91.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: gitlab-styles
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '6.0'
76
118
  type: :development
77
119
  prerelease: false
78
120
  version_requirements: !ruby/object:Gem::Requirement
79
121
  requirements:
80
122
  - - "~>"
81
123
  - !ruby/object:Gem::Version
82
- version: '0.85'
124
+ version: '6.0'
83
125
  - !ruby/object:Gem::Dependency
84
126
  name: rubocop-packaging
85
127
  requirement: !ruby/object:Gem::Requirement
@@ -118,7 +160,9 @@ files:
118
160
  - LICENSE.txt
119
161
  - README.md
120
162
  - lib/peoplegroup/connectors.rb
163
+ - lib/peoplegroup/connectors/bamboo.rb
121
164
  - lib/peoplegroup/connectors/gitlab.rb
165
+ - lib/peoplegroup/connectors/greenhouse.rb
122
166
  - lib/peoplegroup/connectors/pto_roots.rb
123
167
  - lib/peoplegroup/connectors/slack.rb
124
168
  - lib/peoplegroup/connectors/version.rb