traitify 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +34 -0
- data/CHANGELOG.md +12 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +54 -0
- data/LICENSE.txt +22 -0
- data/README.md +166 -0
- data/lib/traitify.rb +13 -0
- data/lib/traitify/assessments.rb +36 -0
- data/lib/traitify/badges.rb +43 -0
- data/lib/traitify/client.rb +35 -0
- data/lib/traitify/client/assessments.rb +20 -0
- data/lib/traitify/client/results.rb +17 -0
- data/lib/traitify/client/slides.rb +36 -0
- data/lib/traitify/client/users.rb +17 -0
- data/lib/traitify/configuration.rb +21 -0
- data/lib/traitify/connection.rb +46 -0
- data/lib/traitify/error.rb +44 -0
- data/lib/traitify/personality_blends.rb +55 -0
- data/lib/traitify/personality_types.rb +39 -0
- data/lib/traitify/request.rb +46 -0
- data/lib/traitify/results.rb +31 -0
- data/lib/traitify/slides.rb +95 -0
- data/lib/traitify/users.rb +39 -0
- data/lib/traitify/version.rb +3 -0
- data/spec/spec_helper.rb +19 -0
- data/spec/support/mocks/assessment.json +7 -0
- data/spec/support/mocks/result.json +157 -0
- data/spec/support/mocks/slide.json +13 -0
- data/spec/support/mocks/slides.json +54 -0
- data/spec/support/mocks/slides_complete.json +54 -0
- data/spec/support/mocks/user.json +8 -0
- data/spec/traitify-ruby/client/assessment_spec.rb +64 -0
- data/spec/traitify-ruby/client/result_spec.rb +54 -0
- data/spec/traitify-ruby/client/slide_spec.rb +87 -0
- data/spec/traitify-ruby/client/user_spec.rb +41 -0
- data/traitify.gemspec +29 -0
- metadata +202 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
module Traitify
|
2
|
+
class Client
|
3
|
+
module Result
|
4
|
+
def find_results(assessment_id, image_pack = nil)
|
5
|
+
image_pack ||= self.image_pack
|
6
|
+
|
7
|
+
if image_pack
|
8
|
+
response = get("/assessments/#{assessment_id}/personality_types?image_pack=#{image_pack}")
|
9
|
+
else
|
10
|
+
response = get("/assessments/#{assessment_id}/personality_types")
|
11
|
+
end
|
12
|
+
|
13
|
+
Traitify::Result.parse_json(response)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Traitify
|
2
|
+
class Client
|
3
|
+
module Slide
|
4
|
+
def find_slides(assessment_id)
|
5
|
+
response = get("/assessments/#{assessment_id}/slides")
|
6
|
+
|
7
|
+
Traitify::Slides.parse_json(assessment_id, response)
|
8
|
+
end
|
9
|
+
|
10
|
+
def update_slides(slides)
|
11
|
+
response = put("/assessments/#{slides.assessment_id}/slides", slides.to_update_params)
|
12
|
+
|
13
|
+
Traitify::Slides.parse_json(slides.assessment_id, response)
|
14
|
+
end
|
15
|
+
|
16
|
+
def update_slide(hash_or_assessment_id, slide = nil)
|
17
|
+
if slide
|
18
|
+
assessment_id = hash_or_assessment_id
|
19
|
+
slide_id = slide.id
|
20
|
+
hash = slide.to_update_params.tap { |s| s.delete(:id) }
|
21
|
+
else
|
22
|
+
assessment_id = hash_or_assessment_id[:assessment_id]
|
23
|
+
slide_id = hash_or_assessment_id[:slide_id]
|
24
|
+
hash = {
|
25
|
+
response: hash_or_assessment_id[:response],
|
26
|
+
time_taken: hash_or_assessment_id[:time_taken]
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
response = put("/assessments/#{assessment_id}/slides/#{slide_id}", hash)
|
31
|
+
|
32
|
+
Traitify::Slide.parse_json(response)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Traitify
|
2
|
+
class Client
|
3
|
+
module User
|
4
|
+
def create_user(user_params)
|
5
|
+
response = post("/users", user: user_params)
|
6
|
+
|
7
|
+
Traitify::User.parse_json(response)
|
8
|
+
end
|
9
|
+
|
10
|
+
def find_user(user_id)
|
11
|
+
response = get("/users/#{user_id}")
|
12
|
+
|
13
|
+
Traitify::User.parse_json(response)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Traitify
|
2
|
+
module Configuration
|
3
|
+
VALID_OPTIONS_KEYS = [
|
4
|
+
:secret,
|
5
|
+
:api_host,
|
6
|
+
:api_version,
|
7
|
+
:deck_id,
|
8
|
+
:image_pack
|
9
|
+
]
|
10
|
+
|
11
|
+
attr_accessor(*VALID_OPTIONS_KEYS)
|
12
|
+
|
13
|
+
def configure
|
14
|
+
yield self
|
15
|
+
end
|
16
|
+
|
17
|
+
def options
|
18
|
+
VALID_OPTIONS_KEYS.inject({}){|o,k| o.merge!(k => send(k)) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require "faraday_middleware"
|
2
|
+
require "traitify/error"
|
3
|
+
|
4
|
+
module Traitify
|
5
|
+
module Connection
|
6
|
+
def connection(options = {})
|
7
|
+
connection ||= Faraday.new(options) do |faraday|
|
8
|
+
faraday.request :url_encoded
|
9
|
+
faraday.request :basic_auth, self.secret, "x"
|
10
|
+
faraday.use ContentTypeMiddleware
|
11
|
+
faraday.use ErrorMiddleware
|
12
|
+
faraday.response :json, :content_type => /\bjson$/
|
13
|
+
faraday.adapter Faraday.default_adapter
|
14
|
+
end
|
15
|
+
|
16
|
+
connection
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
class ContentTypeMiddleware < Faraday::Middleware
|
21
|
+
def initialize(app)
|
22
|
+
@app = app
|
23
|
+
end
|
24
|
+
|
25
|
+
def call(env)
|
26
|
+
env[:request_headers]["Accept"] = "application/json"
|
27
|
+
env[:request_headers]["Content-Type"] = "application/json"
|
28
|
+
@app.call(env)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class ErrorMiddleware < Faraday::Middleware
|
33
|
+
def initialize(app)
|
34
|
+
@app = app
|
35
|
+
end
|
36
|
+
|
37
|
+
def call(env)
|
38
|
+
@app.call(env).on_complete do |e|
|
39
|
+
if error = Traitify::Error.from(e[:response])
|
40
|
+
raise error
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Traitify
|
2
|
+
class Error < StandardError
|
3
|
+
attr_accessor :response
|
4
|
+
|
5
|
+
def self.from(response)
|
6
|
+
status = response.status
|
7
|
+
|
8
|
+
if klass = case status
|
9
|
+
when 400 then Traitify::BadRequest
|
10
|
+
when 401 then Traitify::Unauthorized
|
11
|
+
when 404 then Traitify::NotFound
|
12
|
+
when 422 then Traitify::UnprocessableEntity
|
13
|
+
end
|
14
|
+
|
15
|
+
klass.new(response)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(response)
|
20
|
+
@response = response
|
21
|
+
super(error_message)
|
22
|
+
end
|
23
|
+
|
24
|
+
def errors
|
25
|
+
response.body
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def error_message
|
30
|
+
message = "#{response.env[:method].upcase} "
|
31
|
+
message << "#{response.env[:url].to_s} | "
|
32
|
+
message << "#{response.status}: "
|
33
|
+
if response.body && response.body.respond_to?(map)
|
34
|
+
message << "#{response.body.map{|k,v| "#{k}: #{v.first}"}.join(", ")}"
|
35
|
+
end
|
36
|
+
message
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class BadRequest < Error; end
|
41
|
+
class Unauthorized < Error; end
|
42
|
+
class NotFound < Error; end
|
43
|
+
class UnprocessableEntity < Error; end
|
44
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Traitify
|
2
|
+
class PersonalityBlend
|
3
|
+
attr_accessor :personality_type_1, :personality_type_2, :name, :description, :compliments, :conflicts, :compatible_work_environment_1, :compatible_work_environment_2, :compatible_work_environment_3, :compatible_work_environment_4
|
4
|
+
|
5
|
+
def initialize(options = {})
|
6
|
+
self.personality_type_1 = options[:personality_type_1]
|
7
|
+
self.personality_type_2 = options[:personality_type_2]
|
8
|
+
self.name = options[:name]
|
9
|
+
self.description = options[:description]
|
10
|
+
self.compliments = options[:compliments]
|
11
|
+
self.conflicts = options[:conflicts]
|
12
|
+
self.compatible_work_environment_1 = options[:compatible_work_environment_1]
|
13
|
+
self.compatible_work_environment_2 = options[:compatible_work_environment_2]
|
14
|
+
self.compatible_work_environment_3 = options[:compatible_work_environment_3]
|
15
|
+
self.compatible_work_environment_4 = options[:compatible_work_environment_4]
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.parse_json(personality_blend)
|
19
|
+
if personality_blend
|
20
|
+
personality_type_1 = PersonalityType.parse_json(personality_blend["personality_type_1"])
|
21
|
+
personality_type_2 = PersonalityType.parse_json(personality_blend["personality_type_2"])
|
22
|
+
|
23
|
+
PersonalityBlend.new(
|
24
|
+
personality_type_1: personality_type_1,
|
25
|
+
personality_type_2: personality_type_2,
|
26
|
+
name: personality_blend["name"],
|
27
|
+
description: personality_blend["description"],
|
28
|
+
compliments: personality_blend["compliments"],
|
29
|
+
conflicts: personality_blend["conflicts"],
|
30
|
+
compatible_work_environment_1: personality_blend["compatible_work_environment_1"],
|
31
|
+
compatible_work_environment_2: personality_blend["compatible_work_environment_2"],
|
32
|
+
compatible_work_environment_3: personality_blend["compatible_work_environment_3"],
|
33
|
+
compatible_work_environment_4: personality_blend["compatible_work_environment_4"]
|
34
|
+
)
|
35
|
+
else
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_hash
|
41
|
+
{
|
42
|
+
personality_type_1: personality_type_1.to_hash,
|
43
|
+
personality_type_2: personality_type_2.to_hash,
|
44
|
+
name: name,
|
45
|
+
description: description,
|
46
|
+
compliments: compliments,
|
47
|
+
conflicts: conflicts,
|
48
|
+
compatible_work_environment_1: compatible_work_environment_1,
|
49
|
+
compatible_work_environment_2: compatible_work_environment_2,
|
50
|
+
compatible_work_environment_3: compatible_work_environment_3,
|
51
|
+
compatible_work_environment_4: compatible_work_environment_4
|
52
|
+
}
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Traitify
|
2
|
+
class PersonalityType
|
3
|
+
attr_accessor :id, :name, :description, :badge, :score
|
4
|
+
|
5
|
+
def initialize(options = {})
|
6
|
+
self.id = options[:id]
|
7
|
+
self.name = options[:name]
|
8
|
+
self.description = options[:description]
|
9
|
+
self.badge = options[:badge]
|
10
|
+
self.score = options[:score]
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.parse_json(personality_type)
|
14
|
+
if personality_type
|
15
|
+
badge = Badge.parse_json(personality_type["badge"])
|
16
|
+
|
17
|
+
PersonalityType.new(
|
18
|
+
id: personality_type["id"],
|
19
|
+
name: personality_type["name"],
|
20
|
+
description: personality_type["description"],
|
21
|
+
badge: badge,
|
22
|
+
score: personality_type["score"]
|
23
|
+
)
|
24
|
+
else
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_hash
|
30
|
+
{
|
31
|
+
id: id,
|
32
|
+
name: name,
|
33
|
+
description: description,
|
34
|
+
badge: badge.to_hash,
|
35
|
+
score: score
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Traitify
|
2
|
+
module Request
|
3
|
+
def get(path, options = {})
|
4
|
+
request(:get, path, options)
|
5
|
+
end
|
6
|
+
|
7
|
+
def post(path, options = {})
|
8
|
+
request(:post, path, options)
|
9
|
+
end
|
10
|
+
|
11
|
+
def put(path, options = {})
|
12
|
+
request(:put, path, options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def delete(path, options = {})
|
16
|
+
request(:delete, path, options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def last_response
|
20
|
+
@last_response
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def request(method, path, options = {})
|
25
|
+
path = "#{self.api_version}#{path}"
|
26
|
+
connection_options = {}.merge!(url: self.api_host)
|
27
|
+
|
28
|
+
response = connection(connection_options).send(method) do |request|
|
29
|
+
request.body = options.to_json if options
|
30
|
+
case method
|
31
|
+
when :get
|
32
|
+
request.url(path)
|
33
|
+
when :post
|
34
|
+
request.url(path)
|
35
|
+
when :put
|
36
|
+
request.url(path)
|
37
|
+
when :delete
|
38
|
+
request.url(path)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
@last_response = response
|
43
|
+
response.body
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Traitify
|
2
|
+
class Result
|
3
|
+
attr_accessor :personality_blend, :personality_types
|
4
|
+
|
5
|
+
def initialize(options = {})
|
6
|
+
self.personality_blend = options[:personality_blend]
|
7
|
+
self.personality_types = options[:personality_types]
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.parse_json(result)
|
11
|
+
if result
|
12
|
+
personality_blend = PersonalityBlend.parse_json(result["personality_blend"])
|
13
|
+
personality_types = result["personality_types"].collect { |p| p && p["personality_type"] ? PersonalityType.parse_json(p["personality_type"].merge!("score" => p["score"])) : nil }
|
14
|
+
|
15
|
+
Result.new(
|
16
|
+
personality_blend: personality_blend,
|
17
|
+
personality_types: personality_types
|
18
|
+
)
|
19
|
+
else
|
20
|
+
nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_hash
|
25
|
+
{
|
26
|
+
personality_blend: personality_blend.to_hash,
|
27
|
+
personality_types: personality_types.collect { |p| p.to_hash }
|
28
|
+
}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Traitify
|
2
|
+
class Slide
|
3
|
+
attr_accessor :id, :position, :caption, :image_desktop, :image_desktop_retina, :image_phone_landscape, :image_phone_portrait, :response, :time_taken, :completed_at, :created_at
|
4
|
+
|
5
|
+
def initialize(options = {})
|
6
|
+
self.id = options[:id]
|
7
|
+
self.position = options[:position]
|
8
|
+
self.caption = options[:caption]
|
9
|
+
self.image_desktop = options[:image_desktop]
|
10
|
+
self.image_desktop_retina = options[:image_desktop_retina]
|
11
|
+
self.image_phone_landscape = options[:image_phone_landscape]
|
12
|
+
self.image_phone_portrait = options[:image_phone_portrait]
|
13
|
+
self.response = options[:response]
|
14
|
+
self.time_taken = options[:time_taken]
|
15
|
+
self.completed_at = options[:completed_at]
|
16
|
+
self.created_at = options[:created_at]
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.parse_json(slide)
|
20
|
+
created_at = slide["created_at"] ? Time.at(slide["created_at"]) : nil
|
21
|
+
completed_at = slide["completed_at"] ? Time.at(slide["completed_at"]) : nil
|
22
|
+
|
23
|
+
Slide.new(
|
24
|
+
id: slide["id"],
|
25
|
+
position: slide["position"],
|
26
|
+
caption: slide["caption"],
|
27
|
+
image_desktop: slide["image_desktop"],
|
28
|
+
image_desktop_retina: slide["image_desktop_retina"],
|
29
|
+
image_phone_landscape: slide["image_phone_landscape"],
|
30
|
+
image_phone_portrait: slide["image_phone_portrait"],
|
31
|
+
response: slide["response"],
|
32
|
+
time_taken: slide["time_taken"],
|
33
|
+
completed_at: completed_at,
|
34
|
+
created_at: created_at
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_hash
|
39
|
+
{
|
40
|
+
id: id,
|
41
|
+
position: position,
|
42
|
+
caption: caption,
|
43
|
+
image_desktop: image_desktop,
|
44
|
+
image_desktop_retina: image_desktop_retina,
|
45
|
+
image_phone_landscape: image_phone_landscape,
|
46
|
+
image_phone_portrait: image_phone_portrait,
|
47
|
+
response: response,
|
48
|
+
time_taken: time_taken,
|
49
|
+
completed_at: completed_at,
|
50
|
+
created_at: created_at
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_update_params
|
55
|
+
{
|
56
|
+
id: id,
|
57
|
+
response: response,
|
58
|
+
time_taken: time_taken
|
59
|
+
}
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class Slides
|
64
|
+
attr_accessor :assessment_id, :all
|
65
|
+
|
66
|
+
def initialize(options = {})
|
67
|
+
self.assessment_id = options[:assessment_id]
|
68
|
+
self.all = options[:all]
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.parse_json(assessment_id, slides)
|
72
|
+
Slides.new(
|
73
|
+
assessment_id: assessment_id,
|
74
|
+
all: slides.collect { |slide| Traitify::Slide.parse_json(slide) }
|
75
|
+
)
|
76
|
+
end
|
77
|
+
|
78
|
+
def to_hash
|
79
|
+
{
|
80
|
+
assessment_id: assessment_id,
|
81
|
+
all: all.collect { |slide| slide.to_hash }
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
85
|
+
def to_update_params
|
86
|
+
all.collect { |slide| slide.to_update_params }
|
87
|
+
end
|
88
|
+
|
89
|
+
# Allows slides to forward Array methods to all
|
90
|
+
def method_missing(method, *args)
|
91
|
+
return all.send(method, *args) if all.respond_to?(method)
|
92
|
+
super
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|