arbetsformedlingen 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -0
- data/.ruby-style-guide.yml +270 -0
- data/.travis.yml +0 -1
- data/CHANGELOG.md +12 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/Rakefile +2 -0
- data/arbetsformedlingen.gemspec +10 -9
- data/bin/console +1 -0
- data/lib/arbetsformedlingen/api/client.rb +48 -30
- data/lib/arbetsformedlingen/api/ledigtarbete_client.rb +6 -1
- data/lib/arbetsformedlingen/api/matchning_client.rb +16 -10
- data/lib/arbetsformedlingen/api/request.rb +10 -13
- data/lib/arbetsformedlingen/api/response.rb +71 -0
- data/lib/arbetsformedlingen/api/results/ad_result.rb +36 -18
- data/lib/arbetsformedlingen/api/results/matchning_result.rb +42 -3
- data/lib/arbetsformedlingen/api/results/soklista_result.rb +16 -2
- data/lib/arbetsformedlingen/api/soap_request.rb +11 -10
- data/lib/arbetsformedlingen/api/values/ad_result_values.rb +6 -1
- data/lib/arbetsformedlingen/api/values/create_ad_page.rb +3 -1
- data/lib/arbetsformedlingen/api/values/matchning_result_values.rb +9 -1
- data/lib/arbetsformedlingen/api/values/soklista_values.rb +17 -1
- data/lib/arbetsformedlingen/api/ws_occupation_client.rb +26 -1
- data/lib/arbetsformedlingen/codes/country_code.rb +3 -1
- data/lib/arbetsformedlingen/codes/drivers_license_code.rb +6 -3
- data/lib/arbetsformedlingen/codes/experience_required_code.rb +3 -1
- data/lib/arbetsformedlingen/codes/municipality_code.rb +3 -1
- data/lib/arbetsformedlingen/codes/occupation_code.rb +3 -1
- data/lib/arbetsformedlingen/codes/salary_type_code.rb +3 -1
- data/lib/arbetsformedlingen/key_struct.rb +5 -3
- data/lib/arbetsformedlingen/models/application_method.rb +3 -1
- data/lib/arbetsformedlingen/models/company.rb +2 -2
- data/lib/arbetsformedlingen/models/document.rb +4 -2
- data/lib/arbetsformedlingen/models/dry/predicates.rb +2 -0
- data/lib/arbetsformedlingen/models/dry/types.rb +5 -3
- data/lib/arbetsformedlingen/models/model.rb +2 -0
- data/lib/arbetsformedlingen/models/packet.rb +3 -1
- data/lib/arbetsformedlingen/models/packet_xml_builder.rb +8 -3
- data/lib/arbetsformedlingen/models/position.rb +5 -3
- data/lib/arbetsformedlingen/models/publication.rb +3 -1
- data/lib/arbetsformedlingen/models/qualification.rb +3 -1
- data/lib/arbetsformedlingen/models/salary.rb +3 -1
- data/lib/arbetsformedlingen/models/schedule.rb +4 -2
- data/lib/arbetsformedlingen/soap_builder.rb +3 -1
- data/lib/arbetsformedlingen/version.rb +3 -1
- metadata +43 -25
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arbetsformedlingen
|
2
4
|
module API
|
3
5
|
module Values
|
@@ -17,11 +19,13 @@ module Arbetsformedlingen
|
|
17
19
|
:terms,
|
18
20
|
:application,
|
19
21
|
:workplace,
|
20
|
-
:requirements
|
22
|
+
:requirements,
|
23
|
+
:response
|
21
24
|
)
|
22
25
|
class Ad
|
23
26
|
def to_h
|
24
27
|
hash = super.to_h
|
28
|
+
hash.delete(:response) # don't return the raw response object
|
25
29
|
hash[:terms] = hash[:terms].to_h
|
26
30
|
hash[:application] = hash[:application].to_h
|
27
31
|
hash[:workplace] = hash[:workplace].to_h
|
@@ -63,6 +67,7 @@ module Arbetsformedlingen
|
|
63
67
|
end
|
64
68
|
end
|
65
69
|
|
70
|
+
Contact = KeyStruct.new(:name, :title, :phone)
|
66
71
|
Postal = KeyStruct.new(:code, :address, :city, :country)
|
67
72
|
Requirements = KeyStruct.new(:own_car)
|
68
73
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arbetsformedlingen
|
2
4
|
module API
|
3
5
|
module Values
|
@@ -6,7 +8,7 @@ module Arbetsformedlingen
|
|
6
8
|
|
7
9
|
attr_reader :code, :messages, :body, :request_body
|
8
10
|
|
9
|
-
def initialize(httparty_response,
|
11
|
+
def initialize(httparty_response, _request_boby)
|
10
12
|
@code = httparty_response.code
|
11
13
|
@body = httparty_response.body
|
12
14
|
@request_body = request_body
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arbetsformedlingen
|
2
4
|
module API
|
3
5
|
module Values
|
@@ -10,7 +12,8 @@ module Arbetsformedlingen
|
|
10
12
|
:total_places_total,
|
11
13
|
:total_pages,
|
12
14
|
:data,
|
13
|
-
:raw_data
|
15
|
+
:raw_data,
|
16
|
+
:response
|
14
17
|
)
|
15
18
|
class MatchningPage
|
16
19
|
include Enumerable
|
@@ -21,9 +24,14 @@ module Arbetsformedlingen
|
|
21
24
|
|
22
25
|
def to_h
|
23
26
|
hash = super.to_h
|
27
|
+
hash.delete(:response) # don't return the raw response object
|
24
28
|
hash[:data].map!(&:to_h)
|
25
29
|
hash
|
26
30
|
end
|
31
|
+
|
32
|
+
def success?
|
33
|
+
success
|
34
|
+
end
|
27
35
|
end
|
28
36
|
|
29
37
|
MatchningAd = KeyStruct.new(
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arbetsformedlingen
|
2
4
|
module API
|
3
5
|
module Values
|
@@ -6,7 +8,8 @@ module Arbetsformedlingen
|
|
6
8
|
:total_ads,
|
7
9
|
:total_vacancies,
|
8
10
|
:data,
|
9
|
-
:raw_data
|
11
|
+
:raw_data,
|
12
|
+
:response
|
10
13
|
)
|
11
14
|
class SoklistaPage
|
12
15
|
include Enumerable
|
@@ -17,9 +20,22 @@ module Arbetsformedlingen
|
|
17
20
|
|
18
21
|
def to_h
|
19
22
|
hash = super.to_h
|
23
|
+
hash.delete(:response) # don't return the raw response object
|
20
24
|
hash[:data].map!(&:to_h)
|
21
25
|
hash
|
22
26
|
end
|
27
|
+
|
28
|
+
def method_missing(method_name, *arguments, &block)
|
29
|
+
if response.respond_to?(method_name)
|
30
|
+
response.public_send(method_name, *arguments, &block)
|
31
|
+
else
|
32
|
+
super
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def respond_to_missing?(method_name, include_private = false)
|
37
|
+
response.respond_to?(method_name) || super
|
38
|
+
end
|
23
39
|
end
|
24
40
|
|
25
41
|
SoklistaResult = KeyStruct.new(
|
@@ -1,17 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'arbetsformedlingen/soap_builder'
|
2
4
|
require 'arbetsformedlingen/api/soap_request'
|
3
5
|
|
4
6
|
module Arbetsformedlingen
|
5
7
|
module API
|
8
|
+
# WsOccupation API client
|
6
9
|
class WSOccupationClient
|
7
10
|
attr_reader :request
|
8
11
|
|
12
|
+
# Service URL
|
9
13
|
SERVICE_URL = 'https://api.arbetsformedlingen.se/af/v0/Occupation/wsoccupation.asmx'.freeze
|
10
14
|
|
15
|
+
# Initialize client
|
11
16
|
def initialize
|
12
|
-
@request =
|
17
|
+
@request = SOAPRequest.new(SERVICE_URL)
|
13
18
|
end
|
14
19
|
|
20
|
+
# Returns occupation response with specified id
|
21
|
+
# @return [Response] the response
|
22
|
+
# @see Response
|
23
|
+
# @see Response#xml
|
15
24
|
def occupation(id)
|
16
25
|
soap_body = SOAPBuilder.wrap do |body|
|
17
26
|
body.GetOccupationById(xmlns: 'urn:ams.se:wsoccupation') do |node|
|
@@ -22,6 +31,10 @@ module Arbetsformedlingen
|
|
22
31
|
request.post(soap_body.to_xml)
|
23
32
|
end
|
24
33
|
|
34
|
+
# Returns occupations response with specified name
|
35
|
+
# @return [Response] the response
|
36
|
+
# @see Response
|
37
|
+
# @see Response#xml
|
25
38
|
def find_occupations(name)
|
26
39
|
soap_body = SOAPBuilder.wrap do |body|
|
27
40
|
body.FindOccupation(xmlns: 'urn:ams.se:wsoccupation') do |node|
|
@@ -32,6 +45,10 @@ module Arbetsformedlingen
|
|
32
45
|
request.post(soap_body.to_xml)
|
33
46
|
end
|
34
47
|
|
48
|
+
# Returns occupations response
|
49
|
+
# @return [Response] the response
|
50
|
+
# @see Response
|
51
|
+
# @see Response#xml
|
35
52
|
def occupations
|
36
53
|
soap_body = SOAPBuilder.wrap do |body|
|
37
54
|
body.GetAllOccupations(xmlns: 'urn:ams.se:wsoccupation')
|
@@ -40,6 +57,10 @@ module Arbetsformedlingen
|
|
40
57
|
request.post(soap_body.to_xml)
|
41
58
|
end
|
42
59
|
|
60
|
+
# Returns occupations short response with specified id
|
61
|
+
# @return [Response] the response
|
62
|
+
# @see Response
|
63
|
+
# @see Response#xml
|
43
64
|
def occupations_short
|
44
65
|
soap_body = SOAPBuilder.wrap do |body|
|
45
66
|
body.GetAllOccupationsShort(xmlns: 'urn:ams.se:wsoccupation')
|
@@ -48,6 +69,10 @@ module Arbetsformedlingen
|
|
48
69
|
request.post(soap_body.to_xml)
|
49
70
|
end
|
50
71
|
|
72
|
+
# Returns occupations detailed response with specified id
|
73
|
+
# @return [Response] the response
|
74
|
+
# @see Response
|
75
|
+
# @see Response#xml
|
51
76
|
def occupations_detailed
|
52
77
|
soap_body = SOAPBuilder.wrap do |body|
|
53
78
|
body.GetAllOccupationsDetailed(xmlns: 'urn:ams.se:wsoccupation')
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'csv'
|
2
4
|
require 'set'
|
3
5
|
|
4
6
|
module Arbetsformedlingen
|
5
7
|
class CountryCode
|
6
8
|
CODES = CSV.read(
|
7
|
-
File.expand_path('
|
9
|
+
File.expand_path('../../../data/country-codes.csv', __dir__)
|
8
10
|
).to_h.freeze
|
9
11
|
|
10
12
|
COUNTRY_CODES = Set.new(CODES.values).freeze
|
@@ -1,10 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'set'
|
2
4
|
|
3
5
|
module Arbetsformedlingen
|
4
6
|
module DriversLicenseCode
|
5
7
|
CODES = Set.new([
|
6
|
-
|
7
|
-
|
8
|
+
'AM', 'A1', 'A2', 'A', 'B', 'Utökad B', 'BE',
|
9
|
+
'C1', 'C1E', 'C', 'CE', 'D1', 'D1E', 'D', 'DE'
|
10
|
+
]).freeze
|
8
11
|
|
9
12
|
def self.codes
|
10
13
|
CODES.to_a
|
@@ -30,4 +33,4 @@ module Arbetsformedlingen
|
|
30
33
|
map(&:upcase)
|
31
34
|
end
|
32
35
|
end
|
33
|
-
end
|
36
|
+
end
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'csv'
|
2
4
|
|
3
5
|
module Arbetsformedlingen
|
4
6
|
class MunicipalityCode
|
5
7
|
CODE_MAP = CSV.read(
|
6
|
-
File.expand_path('
|
8
|
+
File.expand_path('../../../data/municipality-codes.csv', __dir__)
|
7
9
|
).to_h.freeze
|
8
10
|
CODES_MAP_INVERTED = CODE_MAP.invert.freeze
|
9
11
|
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'csv'
|
2
4
|
|
3
5
|
module Arbetsformedlingen
|
4
6
|
class OccupationCode
|
5
7
|
CODE_MAP = CSV.read(
|
6
|
-
File.expand_path('
|
8
|
+
File.expand_path('../../../data/occupation-codes.csv', __dir__)
|
7
9
|
).to_h.invert.freeze
|
8
10
|
CODES_MAP_INVERTED = CODE_MAP.invert.freeze
|
9
11
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'set'
|
2
4
|
|
3
5
|
module Arbetsformedlingen
|
@@ -5,7 +7,7 @@ module Arbetsformedlingen
|
|
5
7
|
CODE_MAP = {
|
6
8
|
'fixed' => '1',
|
7
9
|
'fixed_and_commission' => '2',
|
8
|
-
'commission' => '3'
|
10
|
+
'commission' => '3',
|
9
11
|
}.freeze
|
10
12
|
|
11
13
|
CODES = Set.new(CODE_MAP.values).freeze
|
@@ -1,12 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arbetsformedlingen
|
2
4
|
class KeyStruct < Struct
|
3
5
|
def initialize(**keyword_args)
|
4
6
|
keyword_args.each do |key, value|
|
5
|
-
|
6
|
-
self[key] = value
|
7
|
-
else
|
7
|
+
unless members.include?(key)
|
8
8
|
raise ArgumentError, "Unknown key struct member: #{key}"
|
9
9
|
end
|
10
|
+
|
11
|
+
self[key] = value
|
10
12
|
end
|
11
13
|
end
|
12
14
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arbetsformedlingen
|
2
4
|
ApplicationMethodSchema = Dry::Validation.Params do
|
3
5
|
configure do
|
4
6
|
config.type_specs = true
|
5
|
-
config.messages_file = File.expand_path('
|
7
|
+
config.messages_file = File.expand_path('../../../config/locales/errors.yml', __dir__)
|
6
8
|
|
7
9
|
predicates(Predicates)
|
8
10
|
end
|
@@ -4,7 +4,7 @@ module Arbetsformedlingen
|
|
4
4
|
CompanySchema = Dry::Validation.Params do
|
5
5
|
configure do
|
6
6
|
config.type_specs = true
|
7
|
-
config.messages_file = File.expand_path('
|
7
|
+
config.messages_file = File.expand_path('../../../config/locales/errors.yml', __dir__)
|
8
8
|
|
9
9
|
predicates(Predicates)
|
10
10
|
end
|
@@ -34,7 +34,7 @@ module Arbetsformedlingen
|
|
34
34
|
hash[:address][:full_address] = [
|
35
35
|
address.fetch(:street),
|
36
36
|
address.fetch(:zip),
|
37
|
-
address.fetch(:city)
|
37
|
+
address.fetch(:city),
|
38
38
|
].join(', ')
|
39
39
|
hash[:cin_arbetsformedlingen] = cin_arbetsformedlingen(hash.fetch(:cin))
|
40
40
|
hash
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'securerandom'
|
2
4
|
|
3
5
|
module Arbetsformedlingen
|
4
6
|
DocumentSchema = Dry::Validation.Params do
|
5
7
|
configure do
|
6
8
|
config.type_specs = true
|
7
|
-
config.messages_file = File.expand_path('
|
9
|
+
config.messages_file = File.expand_path('../../../config/locales/errors.yml', __dir__)
|
8
10
|
|
9
11
|
predicates(Predicates)
|
10
12
|
end
|
@@ -19,7 +21,7 @@ module Arbetsformedlingen
|
|
19
21
|
def initialize(hash)
|
20
22
|
data = {
|
21
23
|
id: SecureRandom.uuid,
|
22
|
-
timestamp: Time.now.utc.iso8601
|
24
|
+
timestamp: Time.now.utc.iso8601,
|
23
25
|
}.merge!(hash)
|
24
26
|
|
25
27
|
super(DocumentSchema.call(data))
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arbetsformedlingen
|
2
4
|
module Types
|
3
5
|
include Dry::Types.module
|
@@ -5,14 +7,14 @@ module Arbetsformedlingen
|
|
5
7
|
StrippedString = Types::Strict::String.constructor { |value| value.to_s.strip }
|
6
8
|
UUIDString = Types::Strict::String.constrained(size: 36)
|
7
9
|
Currency = Types::Strict::String.constructor do |string|
|
8
|
-
string
|
10
|
+
string&.strip&.upcase
|
9
11
|
end
|
10
12
|
# Company Identification Number
|
11
13
|
CIN = Types::Strict::String.constructor do |string|
|
12
|
-
string
|
14
|
+
string&.delete(' ')&.delete('-')
|
13
15
|
end
|
14
16
|
Zip = Types::Strict::String.constructor do |string|
|
15
|
-
string
|
17
|
+
string&.delete(' ')
|
16
18
|
end
|
17
19
|
Municipality = Types::Strict::String.constructor do |string|
|
18
20
|
MunicipalityCode.to_code(string)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'builder'
|
2
4
|
require 'arbetsformedlingen/models/packet_xml_builder'
|
3
5
|
|
@@ -5,7 +7,7 @@ module Arbetsformedlingen
|
|
5
7
|
PacketSchema = Dry::Validation.Params do
|
6
8
|
configure do
|
7
9
|
config.type_specs = true
|
8
|
-
config.messages_file = File.expand_path('
|
10
|
+
config.messages_file = File.expand_path('../../../config/locales/errors.yml', __dir__)
|
9
11
|
|
10
12
|
predicates(Predicates)
|
11
13
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'builder'
|
2
4
|
|
3
5
|
module Arbetsformedlingen
|
@@ -47,7 +49,7 @@ module Arbetsformedlingen
|
|
47
49
|
end
|
48
50
|
|
49
51
|
def append_job_position(payload, packet_data)
|
50
|
-
payload.JobPositionPosting(status: "#{'in' unless packet_data.fetch(:active)}active") do |pos|
|
52
|
+
payload.JobPositionPosting(status: "#{'in' unless packet_data.fetch(:active)}active") do |pos| # rubocop:disable Metrics/LineLength
|
51
53
|
cin = packet_data[:position][:company].fetch(:cin_arbetsformedlingen)
|
52
54
|
job_pos_id = "#{cin}-#{packet_data.fetch(:job_id)}"
|
53
55
|
pos.JobPositionPostingId(job_pos_id)
|
@@ -65,7 +67,10 @@ module Arbetsformedlingen
|
|
65
67
|
if description = company.fetch(:description, nil)
|
66
68
|
jpp.HiringOrgDescription(description)
|
67
69
|
end
|
68
|
-
jpp.OccupationGroup(
|
70
|
+
jpp.OccupationGroup(
|
71
|
+
code: packet_data.fetch(:occupation),
|
72
|
+
codename: 'OccupationNameID'
|
73
|
+
)
|
69
74
|
end
|
70
75
|
end
|
71
76
|
end
|
@@ -87,7 +92,7 @@ module Arbetsformedlingen
|
|
87
92
|
|
88
93
|
payload.HiringOrg do |org|
|
89
94
|
org.HiringOrgName(company.fetch(:name))
|
90
|
-
org.HiringOrgId(company.fetch(:cin_arbetsformedlingen), idOwner: company.fetch(:cin))
|
95
|
+
org.HiringOrgId(company.fetch(:cin_arbetsformedlingen), idOwner: company.fetch(:cin)) # rubocop:disable Metrics/LineLength
|
91
96
|
append_company_contact(org, company)
|
92
97
|
end
|
93
98
|
end
|