spear-cb-api 0.0.1 → 0.0.2
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 +4 -4
- data/lib/spear.rb +58 -5
- data/lib/spear/configuration.rb +62 -0
- data/lib/spear/exceptions.rb +19 -1
- data/lib/spear/plugins/model/application.rb +8 -0
- data/lib/spear/plugins/model/job.rb +8 -0
- data/lib/spear/plugins/model/resume.rb +38 -0
- data/lib/spear/plugins/model/talent_network.rb +8 -0
- data/lib/spear/plugins/model/user.rb +23 -0
- data/lib/spear/plugins/models.rb +11 -0
- data/lib/spear/plugins/save_apis.rb +64 -0
- data/lib/spear/request.rb +69 -57
- data/lib/spear/resource/application.rb +22 -0
- data/lib/spear/resource/job.rb +20 -0
- data/lib/spear/resource/resume.rb +44 -34
- data/lib/spear/resource/talent_network.rb +30 -0
- data/lib/spear/resource/user.rb +23 -4
- data/lib/spear/resources.rb +10 -0
- data/lib/spear/structure/base.rb +43 -0
- data/lib/spear/structure/resume/create.rb +17 -0
- data/lib/spear/structure/resume/edit.rb +17 -0
- data/lib/spear/structure/resume/embeded_class.rb +62 -0
- data/lib/spear/structure/resume/ownall.rb +28 -0
- data/lib/spear/structure/resume/parse.rb +80 -0
- data/lib/spear/structure/resume/retrieve.rb +21 -0
- data/lib/spear/structure/resume/upload.rb +8 -0
- data/lib/spear/structure/user/check_existing.rb +17 -0
- data/lib/spear/structure/user/create.rb +15 -0
- data/lib/spear/structure/user/retrieve.rb +21 -0
- data/lib/spear/version.rb +1 -1
- data/spear-cb-api.gemspec +5 -0
- data/spec/spear_spec.rb +30 -0
- metadata +83 -6
- data/lib/spear/async_job.rb +0 -23
- data/lib/spear/client.rb +0 -58
- data/spec/client_spec.rb +0 -5
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Spear
|
4
|
+
module Resource
|
5
|
+
module Application
|
6
|
+
def history(user_external_id)
|
7
|
+
raise Spear::ParametersRequired.new('UserExternalId') if user_external_id.blank?
|
8
|
+
|
9
|
+
Spear::Request.new.execute(:get, "/application/history",
|
10
|
+
{query: {:ExternalID => user_external_id}, api_options: {path: 'v1'}})
|
11
|
+
end
|
12
|
+
|
13
|
+
# Application Creation
|
14
|
+
def create_application(host_site, data={})
|
15
|
+
raise Spear::ParametersRequired.new('HostSite') if host_site.blank?
|
16
|
+
|
17
|
+
Spear::Request.new.execute(:apply, "/cbapi/application",
|
18
|
+
{query: {:HostSite => host_site}, body: data, api_options: {path: ""}})
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Spear
|
4
|
+
module Resource
|
5
|
+
module Job
|
6
|
+
def search_job(params={})
|
7
|
+
Spear::Request.new.execute(:get, "/jobsearch", {:query => params})
|
8
|
+
end
|
9
|
+
|
10
|
+
# job_id:
|
11
|
+
# 20 character long unique job ID.
|
12
|
+
# It's one of the elements received in every v1/jobsearch result item.
|
13
|
+
def retrieve_job(job_id, host_site)
|
14
|
+
raise Spear::ParametersRequired.new(%w{JobID HostSite}) if job_id.blank? or host_site.blank?
|
15
|
+
|
16
|
+
Spear::Request.new.execute(:get, "/job", {:query => {:DID => job_id, :HostSite => host_site}})
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -5,45 +5,59 @@ module Spear
|
|
5
5
|
module Resume
|
6
6
|
# file: kind of ActionDispatch::Http::UploadedFile
|
7
7
|
def parse_file(file)
|
8
|
-
|
9
|
-
|
8
|
+
if !file.kind_of?(ActionDispatch::Http::UploadedFile) and !file.kind_of?(Rack::Test::UploadedFile)
|
9
|
+
raise Spear::ObjectTypeError.new("Expecting type of ActionDispatch::Http::UploadedFile or Rack::Test::UploadedFile, but got #{file.class}.}")
|
10
10
|
end
|
11
11
|
|
12
12
|
file.rewind
|
13
|
-
|
14
|
-
:
|
13
|
+
Spear::Request.new.execute(:post, "/resume/parse", {
|
14
|
+
:body => {
|
15
|
+
:FileName => file.original_filename,
|
16
|
+
:FileBytes => Base64.encode64(file.read)
|
17
|
+
}
|
18
|
+
})
|
15
19
|
end
|
16
20
|
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
21
|
+
# {
|
22
|
+
# ShowContactInfo: true,
|
23
|
+
# Title: 'asasdasdasd',
|
24
|
+
# ResumeText: 'albee009@gmail.com JobsCentral999',
|
25
|
+
# Visibility: true,
|
26
|
+
# CanRelocateNationally: false,
|
27
|
+
# CanRelocateInternationally: false,
|
28
|
+
# TotalYearsExperience: 1,
|
29
|
+
# HostSite: 'T3',
|
30
|
+
# DesiredJobTypes: 'ETFE',
|
31
|
+
# CompanyExperiences: [],
|
32
|
+
# Educations: [],
|
33
|
+
# Languages: [],
|
34
|
+
# CustomValues: []
|
35
|
+
# }
|
31
36
|
def create_resume(data={})
|
32
|
-
|
37
|
+
Spear::Request.new.execute(:post, "/resume/create", {body: data})
|
38
|
+
end
|
39
|
+
|
40
|
+
# {
|
41
|
+
# ...
|
42
|
+
# # if editting, we should add this column
|
43
|
+
# ExternalID: 'asdasdsdaas'
|
44
|
+
# }
|
45
|
+
def edit_resume(data={})
|
46
|
+
Spear::Request.new.execute(:post, "/resume/edit", {body: data})
|
33
47
|
end
|
34
48
|
|
35
49
|
def upload_file(file, resume_external_id, user_external_id)
|
36
|
-
|
37
|
-
|
50
|
+
if !file.kind_of?(ActionDispatch::Http::UploadedFile) and !file.kind_of?(Rack::Test::UploadedFile)
|
51
|
+
raise Spear::ObjectTypeError.new("Expecting type of ActionDispatch::Http::UploadedFile or Rack::Test::UploadedFile, but got #{file.class}.}")
|
38
52
|
end
|
39
53
|
|
40
|
-
if user_external_id.blank? or resume_external_id.blank?
|
41
|
-
return {"Errors" => {"Error" => "%q{User external ID and resume external ID is required.}"}}
|
42
|
-
end
|
54
|
+
raise Spear::ParametersRequired.new(%w{UserExternalId ResumeExternalId}) if user_external_id.blank? or resume_external_id.blank?
|
43
55
|
|
44
56
|
file.rewind
|
45
|
-
|
46
|
-
:body =>
|
57
|
+
Spear::Request.new.execute(:upload_file, "/resume/upload", {
|
58
|
+
:body => {
|
59
|
+
:FileBytes => Base64.encode64(file.read)
|
60
|
+
},
|
47
61
|
:query => {
|
48
62
|
:FileName => file.original_filename,
|
49
63
|
:ExternalID => resume_external_id,
|
@@ -54,20 +68,16 @@ module Spear
|
|
54
68
|
|
55
69
|
# list all of my resumes
|
56
70
|
def own_all(user_external_id, host_site)
|
57
|
-
if user_external_id.blank? or host_site.blank?
|
58
|
-
return {"Errors" => {"Error" => "%q{User external ID and host site is required.}"}}
|
59
|
-
end
|
71
|
+
raise Spear::ParametersRequired.new(%w{UserExternalId HostSite}) if user_external_id.blank? or host_site.blank?
|
60
72
|
|
61
|
-
|
73
|
+
Spear::Request.new.execute(:get, "/resume/ownall", {
|
62
74
|
:query => {:ExternalUserID => user_external_id, :HostSite => host_site}})
|
63
75
|
end
|
64
76
|
|
65
77
|
def retrieve_resume(resume_external_id, user_external_id)
|
66
|
-
if user_external_id.blank? or resume_external_id.blank?
|
67
|
-
return {"Errors" => {"Error" => "%q{User external ID and host site is required.}"}}
|
68
|
-
end
|
78
|
+
raise Spear::ParametersRequired.new(%w{UserExternalId ResumeExternalId}) if user_external_id.blank? or resume_external_id.blank?
|
69
79
|
|
70
|
-
|
80
|
+
Spear::Request.new.execute(:get, "/resume/retrieve", {
|
71
81
|
:query => {:ExternalUserID => user_external_id, :ExternalID => resume_external_id}})
|
72
82
|
end
|
73
83
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Spear
|
4
|
+
module Resource
|
5
|
+
module TalentNetwork
|
6
|
+
def join_form_questions(talent_network_did)
|
7
|
+
raise Spear::ParametersRequired.new('TalentNetworkDID') if talent_network_did.blank?
|
8
|
+
|
9
|
+
Spear::Request.new.execute(:get, "/talentnetwork/config/join/questions/#{talent_network_did}/json",
|
10
|
+
{api_options: {path: ""}})
|
11
|
+
end
|
12
|
+
|
13
|
+
# {
|
14
|
+
# TalentNetworkDID: 'YourTalentNetworkDID',
|
15
|
+
# PreferredLanguage: 'USEnglish',
|
16
|
+
# AcceptPrivacy: '',
|
17
|
+
# AcceptTerms: '',
|
18
|
+
# ResumeWordDoc: '',
|
19
|
+
# JoinValues: [
|
20
|
+
# {Key: 'MxDOTalentNetworkMemberInfo_EmailAddress', Value: 'some.email@example.com'},
|
21
|
+
# {Key: 'JQ7I3CM6P9B09VCVD9YF', Value: 'AVAILABLENOW'}
|
22
|
+
# ]
|
23
|
+
# }
|
24
|
+
def create_member(data={})
|
25
|
+
Spear::Request.new.execute(:post, "/talentnetwork/member/create/json",
|
26
|
+
{api_options: {path: ""}, body: data})
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/spear/resource/user.rb
CHANGED
@@ -5,18 +5,37 @@ module Spear
|
|
5
5
|
module User
|
6
6
|
def check_existing(email, password='')
|
7
7
|
if password.blank?
|
8
|
-
|
8
|
+
Spear::Request.new.execute(:post, "/user/checkexisting", {body: {:Email => email}})
|
9
9
|
else
|
10
|
-
|
10
|
+
Spear::Request.new.execute(:post, "/user/checkexisting", {body: {:Email => email, :Password => password}})
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
# {
|
15
|
+
# FirstName: 'asdasdad',
|
16
|
+
# LastName: 'asdasdad',
|
17
|
+
# Email: 'ascacasc@sina.com.cn',
|
18
|
+
# Password: 'Qwer1234!',
|
19
|
+
# Phone: '+657777888999',
|
20
|
+
# City: 'Singapore',
|
21
|
+
# State: 'SG',
|
22
|
+
# CountryCode: 'SG',
|
23
|
+
# AllowNewsletterEmails: false,
|
24
|
+
# HostSite: 'T3',
|
25
|
+
# AllowPartnerEmails: false,
|
26
|
+
# AllowEventEmails: false,
|
27
|
+
# SendEmail: false,
|
28
|
+
# Gender: 'U',
|
29
|
+
# UserType: 'jobseeker',
|
30
|
+
# Status: 'active',
|
31
|
+
# Test: false
|
32
|
+
# }
|
14
33
|
def create_user(data={})
|
15
|
-
|
34
|
+
Spear::Request.new.execute(:post, "/user/create", {body: data})
|
16
35
|
end
|
17
36
|
|
18
37
|
def retrieve_user(user_external_id, password)
|
19
|
-
|
38
|
+
Spear::Request.new.execute(:post, "/user/retrieve", {body: {:ExternalID => user_external_id, :Password => password}})
|
20
39
|
end
|
21
40
|
end
|
22
41
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Spear
|
2
|
+
module Structure
|
3
|
+
class Base
|
4
|
+
# response is an instance of Httparty::Response
|
5
|
+
attr_reader :response, :root, :status, :error_message
|
6
|
+
|
7
|
+
def initialize(response)
|
8
|
+
raise Spear::ParametersRequired.new('Response') if response.nil?
|
9
|
+
|
10
|
+
@response = response
|
11
|
+
# get the root keyvalue of the hash
|
12
|
+
@root = response.to_h.first.last
|
13
|
+
@status = @root["Status"]
|
14
|
+
@error_message = get_error_message(@root)
|
15
|
+
end
|
16
|
+
|
17
|
+
def success?
|
18
|
+
@status.nil? ? @error_message.nil? : @status.include?('Success')
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def get_error_message(hash)
|
23
|
+
if hash["Errors"].kind_of?(Hash)
|
24
|
+
if !hash["Errors"]["Error"].kind_of?(Hash)
|
25
|
+
# 1. Api error response is an array
|
26
|
+
if hash["Errors"]["Error"].kind_of?(Array)
|
27
|
+
return hash["Errors"]["Error"].join(", ")
|
28
|
+
end
|
29
|
+
# 2. Api error response is a string
|
30
|
+
return hash["Errors"]["Error"]
|
31
|
+
else
|
32
|
+
# 3. Api error response is a hash
|
33
|
+
if !hash["Errors"]["Error"]["Message"].nil?
|
34
|
+
return hash["Errors"]["Error"]["Message"]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
elsif hash["Errors"].kind_of?(Array)
|
38
|
+
return hash["Errors"].first
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Spear
|
2
|
+
module Structure
|
3
|
+
module Resume
|
4
|
+
class Create < Structure::Base
|
5
|
+
attr_reader :external_id, :user_external_id
|
6
|
+
attr_accessor :title, :total_years_experience, :educations, :company_experiences
|
7
|
+
|
8
|
+
def initialize(response)
|
9
|
+
super(response)
|
10
|
+
@external_id = @root['ResponseExternalID']
|
11
|
+
@user_external_id = @root['Request']['ExternalUserID']
|
12
|
+
@title = @root['Request']['Title']
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Spear
|
2
|
+
module Structure
|
3
|
+
module Resume
|
4
|
+
class Edit < Structure::Base
|
5
|
+
attr_reader :external_id, :user_external_id
|
6
|
+
attr_accessor :title, :total_years_experience, :educations, :company_experiences
|
7
|
+
|
8
|
+
def initialize(response)
|
9
|
+
super(response)
|
10
|
+
@external_id = @root['Request']['ExternalID']
|
11
|
+
@user_external_id = @root['Request']['ExternalUserID']
|
12
|
+
@title = @root['Request']['Title']
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# TODO: Extract Languages and EmployerOrgs ...
|
2
|
+
module Spear
|
3
|
+
module Structure
|
4
|
+
module Resume
|
5
|
+
module EmbededClass
|
6
|
+
##################################################################
|
7
|
+
# Resume embeded class
|
8
|
+
##################################################################
|
9
|
+
class Education
|
10
|
+
attr_accessor :school_name, :major, :degree_name, :degree_code, :degree_type, :graduation_date
|
11
|
+
|
12
|
+
def initialize(education={})
|
13
|
+
@school_name = education['SchoolName']
|
14
|
+
@major = education['Major']
|
15
|
+
@degree_name = education['DegreeName']
|
16
|
+
@degree_code = education['DegreeCode']
|
17
|
+
@degree_type = education['DegreeType']
|
18
|
+
@graduation_date = education['GraduationDate']
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def generate_educations(educations)
|
23
|
+
if !educations.nil?
|
24
|
+
if educations['Education'].kind_of?(Array)
|
25
|
+
educations['Education'].map {|e| Education.new(e)}
|
26
|
+
else # Hash
|
27
|
+
[Education.new(educations['Education'])]
|
28
|
+
end
|
29
|
+
else
|
30
|
+
[]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class CompanyExperience
|
35
|
+
# Date must more than 1970-01-01
|
36
|
+
attr_accessor :company_name, :job_title, :start_date, :end_date, :details, :is_current
|
37
|
+
|
38
|
+
def initialize(experience={})
|
39
|
+
@company_name = experience['CompanyName']
|
40
|
+
@job_title = experience['JobTitle']
|
41
|
+
@start_date = experience['StartDate']
|
42
|
+
@end_date = experience['EndDate']
|
43
|
+
@details = experience['Details']
|
44
|
+
@is_current = %w(True ture).include?(experience['IsCurrent'])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def generate_experiences(company_experiences)
|
49
|
+
if !company_experiences.nil?
|
50
|
+
if company_experiences['CompanyExperience'].kind_of?(Array)
|
51
|
+
company_experiences['CompanyExperience'].map {|e| CompanyExperience.new(e)}
|
52
|
+
else # Hash
|
53
|
+
[CompanyExperience.new(company_experiences['CompanyExperience'])]
|
54
|
+
end
|
55
|
+
else
|
56
|
+
[]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Spear
|
2
|
+
module Structure
|
3
|
+
module Resume
|
4
|
+
class Ownall < Structure::Base
|
5
|
+
attr_reader :resumes
|
6
|
+
|
7
|
+
def initialize(response)
|
8
|
+
super(response)
|
9
|
+
@resumes = extract_resume(@root['Resumes'])
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
def extract_resume(resumes, list=[])
|
14
|
+
unless resumes.nil?
|
15
|
+
if resumes['Resume'].kind_of?(Array)
|
16
|
+
resumes['Resume'].each do |resume|
|
17
|
+
list << resume
|
18
|
+
end
|
19
|
+
elsif resumes['Resume'].kind_of?(Hash)
|
20
|
+
list << resumes['Resume']
|
21
|
+
end
|
22
|
+
end
|
23
|
+
list
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Spear
|
2
|
+
module Structure
|
3
|
+
module Resume
|
4
|
+
# after parse resume, we will call create resume api. So in this class, we will build
|
5
|
+
# the data class structure 'Create resume' needs.
|
6
|
+
class Parse < Structure::Base
|
7
|
+
include EmbededClass
|
8
|
+
|
9
|
+
attr_reader :resume, :hrxml_resume
|
10
|
+
attr_accessor :educations, :company_experiences, :employer_orgs, :languages, :custom_values
|
11
|
+
attr_accessor :resume_text, :total_years_experience
|
12
|
+
|
13
|
+
def initialize(response)
|
14
|
+
super(response)
|
15
|
+
@resume = @root['Resume'] || {}
|
16
|
+
@hrxml_resume = @resume['HRXMLResume']
|
17
|
+
|
18
|
+
@resume_text = @resume['ResumeText'] || ''
|
19
|
+
@total_years_experience = (@resume['TotalYearsExperience'].to_i rescue 0)
|
20
|
+
@educations = generate_educations(@resume['Educations'])
|
21
|
+
@company_experiences = generate_experiences(@resume['CompanyExperiences'])
|
22
|
+
end
|
23
|
+
|
24
|
+
def hash_for_create(external_user_id, host_site)
|
25
|
+
raise Spear::ParametersRequired.new(%w{UserExternalId HostSite}) if external_user_id.blank? or host_site.blank?
|
26
|
+
|
27
|
+
# Max Educations are 3
|
28
|
+
educations = []
|
29
|
+
@educations.each_with_index do |e, index|
|
30
|
+
break if index > 2
|
31
|
+
edu = {}
|
32
|
+
edu[:SchoolName] = e.school_name || ""
|
33
|
+
edu[:Major] = e.major || ""
|
34
|
+
edu[:DegreeCode] = e.degree_code || ""
|
35
|
+
edu[:GraduationDate] = e.graduation_date unless e.graduation_date.blank?
|
36
|
+
educations << edu
|
37
|
+
end
|
38
|
+
|
39
|
+
# Max CompanyExperiences are 5
|
40
|
+
company_experiences = []
|
41
|
+
@company_experiences.each_with_index do |ce, index|
|
42
|
+
break if index > 4
|
43
|
+
cen = {}
|
44
|
+
cen[:CompanyName] = ce.company_name || ""
|
45
|
+
cen[:JobTitle] = ce.job_title || ""
|
46
|
+
if ce.start_date.blank?
|
47
|
+
cen[:StartDate] = '1970-01-01'
|
48
|
+
else
|
49
|
+
cen[:StartDate] = ce.start_date
|
50
|
+
end
|
51
|
+
if ce.end_date.blank?
|
52
|
+
cen[:EndDate] = Time.now.strftime("%Y-%m-%d").to_s
|
53
|
+
else
|
54
|
+
cen[:EndDate] = ce.end_date
|
55
|
+
end
|
56
|
+
cen[:Details] = ce.details || ""
|
57
|
+
company_experiences << cen
|
58
|
+
end
|
59
|
+
|
60
|
+
{
|
61
|
+
:ExternalUserID => external_user_id,
|
62
|
+
:ShowContactInfo => true,
|
63
|
+
:Title => 'title',
|
64
|
+
:ResumeText => @resume_text,
|
65
|
+
:Visibility => 'Public',
|
66
|
+
:CanRelocateNationally => false,
|
67
|
+
:CanRelocateInternationally => false,
|
68
|
+
:TotalYearsExperience => @total_years_experience.to_s,
|
69
|
+
:HostSite => host_site,
|
70
|
+
:DesiredJobTypes => 'ETFE',
|
71
|
+
:CompanyExperiences => company_experiences,
|
72
|
+
:Educations => educations,
|
73
|
+
:Languages => [],
|
74
|
+
:CustomValues => []
|
75
|
+
}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|