yotpo 0.1.0 → 1.0.0

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.
Files changed (55) hide show
  1. checksums.yaml +5 -13
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +0 -2
  4. data/lib/yotpo.rb +1 -1
  5. data/lib/yotpo/api/account_social.rb +39 -0
  6. data/lib/yotpo/api/answer.rb +16 -0
  7. data/lib/yotpo/api/comment.rb +38 -0
  8. data/lib/yotpo/api/feature.rb +12 -0
  9. data/lib/yotpo/api/oauth.rb +13 -0
  10. data/lib/yotpo/api/owner_feature.rb +48 -0
  11. data/lib/yotpo/api/owner_feature_setting.rb +37 -0
  12. data/lib/yotpo/api/product.rb +13 -0
  13. data/lib/yotpo/api/question.rb +44 -0
  14. data/lib/yotpo/api/review.rb +4 -1
  15. data/lib/yotpo/api/user.rb +5 -0
  16. data/lib/yotpo/client.rb +21 -5
  17. data/lib/yotpo/core/response_parser.rb +5 -3
  18. data/lib/yotpo/version.rb +1 -1
  19. data/spec/api/account_social_spec.rb +59 -0
  20. data/spec/api/answer_spec.rb +32 -0
  21. data/spec/api/comment_spec.rb +74 -0
  22. data/spec/api/feature_spec.rb +21 -0
  23. data/spec/api/oauth_spec.rb +22 -0
  24. data/spec/api/owner_feature_setting_spec.rb +79 -0
  25. data/spec/api/owner_feature_spec.rb +77 -0
  26. data/spec/api/product_spec.rb +18 -0
  27. data/spec/api/purchase_spec.rb +2 -2
  28. data/spec/api/question_spec.rb +53 -0
  29. data/spec/api/review_spec.rb +17 -0
  30. data/spec/api/user_spec.rb +14 -0
  31. data/spec/cassettes/add_features.yml +51 -0
  32. data/spec/cassettes/add_shop_owner_answer.yml +49 -0
  33. data/spec/cassettes/add_vote_to_review.yml +46 -0
  34. data/spec/cassettes/anonymous_user_confirmation.yml +49 -0
  35. data/spec/cassettes/create_account_social.yml +51 -0
  36. data/spec/cassettes/create_comment.yml +53 -0
  37. data/spec/cassettes/create_new_purchase.yml +23 -28
  38. data/spec/cassettes/get_account_social.yml +51 -0
  39. data/spec/cassettes/get_feature_settings.yml +50 -0
  40. data/spec/cassettes/get_features.yml +191 -0
  41. data/spec/cassettes/get_owner_features.yml +106 -0
  42. data/spec/cassettes/get_product_url.yml +93 -0
  43. data/spec/cassettes/mass_update_feature_settings.yml +48 -0
  44. data/spec/cassettes/owner_feature_settings.yml +49 -0
  45. data/spec/cassettes/question_create_by_token.yml +49 -0
  46. data/spec/cassettes/question_send_confirmation.yml +74 -0
  47. data/spec/cassettes/remove_feature.yml +49 -0
  48. data/spec/cassettes/update_account_social.yml +50 -0
  49. data/spec/cassettes/update_comment.yml +50 -0
  50. data/spec/cassettes/update_comment_avatar.yml +48 -0
  51. data/spec/cassettes/update_feature_settings.yml +48 -0
  52. data/spec/cassettes/user_enable_feature.yml +49 -0
  53. data/spec/cassettes/validate_token.yml +48 -0
  54. data/yotpo.gemspec +2 -2
  55. metadata +99 -26
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ZTc5NGE1MDA2ZTNlOGY3MzViNDQwZWNmY2ZlOGEzNDViNGFmNWNjZA==
5
- data.tar.gz: !binary |-
6
- OTdhNmJhZTk5NzJhZGRmOWRhNzgwMTE1NWRjZDMzMzcxMjAxNGIzOQ==
2
+ SHA1:
3
+ metadata.gz: 1ba58ed0c74829ed39bfb92a5fa9ce230fd1bc3d
4
+ data.tar.gz: 76180c212971fa35fb523cf6ad1b7e1b13720cdb
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- ZWY0MGFjOTJkODRkZWI4N2MyZDczNjZlODk4MTcyMGE5OTI3NGYxNzE0YmYz
10
- MzJkYjE2ZTllMGQyM2U3ZGY1Y2UzZTBjNTNiYjU0MTQ4MjRiODgxNDVjNjcz
11
- YTliYmJmOGIzY2EyZTdjNTc1MDI0Yzg0ODAyMzQ3MzU1ZDJhNzA=
12
- data.tar.gz: !binary |-
13
- MTgzNDQ2NDk2NjU3MjYyN2JlMzg0YzU2NzJmYmIxYmRmMzc4OGU1YzkyYTc5
14
- ZDI0YjBlMGU4NThmZWQ4ODI5MTY0NWU4NjY0NWVmYmZjMjA2OWFmZjFjY2Ew
15
- NmUzMWY5MzM0NDJhOWNjZjRhNmExODdhNjE2ODM0Y2UzNWRlNjQ=
6
+ metadata.gz: d931d0b999b6da7e7eb54fd9d38889a1b0c2ca0ae4b407e00fc0aa9f80d4174ac8a4b9c4688b15bb94e6314fca2242f7b9ab3500f5ef0bcf42b004a9f966e6f0
7
+ data.tar.gz: c137689b3bea97ab1c5bbedddfac0c87b73bd6d81a4defc98c42acbf7337a7f0dcb39ac27dee2f39bd93bf4f4feb0bdfe899d37f4afeadaf26948af07890906d
@@ -1 +1 @@
1
- ruby-2.2.1
1
+ ruby-2.2.2
@@ -1,7 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.3
4
- - 2.1.1
5
3
  - ruby-head
6
4
  deploy:
7
5
  provider: rubygems
@@ -40,7 +40,7 @@ module Yotpo
40
40
  # @return an instance of Yotpo::Client
41
41
  #
42
42
  def client
43
- @client ||= Yotpo::Client.new()
43
+ @client ||= Yotpo::Client.new(@url || 'https://api.yotpo.com')
44
44
  end
45
45
 
46
46
  private
@@ -0,0 +1,39 @@
1
+ module Yotpo
2
+ module AccountSocial
3
+ def create_account_social(params)
4
+ request = {
5
+ account_social: {
6
+ social_network_name: params[:social_network_name],
7
+ access_token: params[:access_token],
8
+ social_id: params[:social_id],
9
+ secret: params[:secret],
10
+ page_token: params[:page_token],
11
+ page_id: params[:page_id],
12
+ message: params[:message],
13
+ social_push_type_id: params[:social_push_type_id],
14
+ invalidated_at: params[:invalidated_at],
15
+ },
16
+ utoken: params[:utoken]
17
+ }
18
+ post("/apps/#{params[:app_key]}/account_socials", request)
19
+ end
20
+
21
+ def update_account_social(params)
22
+ request = {
23
+ utoken: params.delete(:utoken)
24
+ }
25
+ request[:account_social] = params
26
+ put("/apps/#{params.delete(:app_key)}/account_socials/#{params.delete(:id)}", request)
27
+ end
28
+
29
+ def get_account_social(params)
30
+ request = {
31
+ utoken: params[:utoken]
32
+ }
33
+ get("/apps/#{params[:app_key]}/account_socials", request)
34
+ end
35
+ end
36
+ end
37
+
38
+
39
+
@@ -0,0 +1,16 @@
1
+ module Yotpo
2
+ module Answer
3
+
4
+ def add_shop_owner_answer(params)
5
+ request = {
6
+ comment: {
7
+ content: params[:content],
8
+ public: params[:public]
9
+ },
10
+ utoken: params[:utoken]
11
+ }
12
+ post("questions/#{params[:question_id]}/answers", request)
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,38 @@
1
+ module Yotpo
2
+ module Comment
3
+ def create_comment(params)
4
+ request = {
5
+ utoken: params[:utoken],
6
+ comment: {
7
+ content: params[:content],
8
+ public: params[:public]
9
+ }
10
+ }
11
+ post("/reviews/#{params[:review_id]}/comments", request)
12
+ end
13
+
14
+ def update_comment(params)
15
+ request = {
16
+ utoken: params[:utoken],
17
+ comment: {
18
+ content: params[:content],
19
+ public: params[:public]
20
+ }
21
+ }
22
+ put("/reviews/#{params[:review_id]}/comments/#{params[:comment_id]}", request)
23
+ end
24
+
25
+
26
+ def update_comment_avatar(params)
27
+ request = {
28
+ utoken: params[:utoken],
29
+ comments_avatar_data: params[:comments_avatar_data],
30
+ comments_display_name: params[:comments_display_name]
31
+ }
32
+ put("/apps/#{params[:app_key]}/app_comment_avatar", request)
33
+ end
34
+
35
+ end
36
+ end
37
+
38
+
@@ -0,0 +1,12 @@
1
+ module Yotpo
2
+ module Feature
3
+ def get_features(params)
4
+ request = {
5
+ utoken: params[:utoken]
6
+ }
7
+ get('/features', request)
8
+ end
9
+ end
10
+ end
11
+
12
+
@@ -0,0 +1,13 @@
1
+ module Yotpo
2
+ module Oauth
3
+ def validate_token(params)
4
+ request = {
5
+ token: params[:utoken],
6
+ app_key: params[:app_key]
7
+ }
8
+ get('/oauth/validate_token', request)
9
+ end
10
+ end
11
+ end
12
+
13
+
@@ -0,0 +1,48 @@
1
+ module Yotpo
2
+ module OwnerFeature
3
+ def add_feature(params)
4
+ request = {
5
+ utoken: params[:utoken],
6
+ id: params[:feature_id]
7
+ }
8
+ post("#{get_owner_basic_path(params[:owner_type])}/#{params[:owner_id]}/features", request)
9
+ end
10
+
11
+ def remove_feature(params)
12
+ request = {
13
+ utoken: params[:utoken]
14
+ }
15
+ delete("#{get_owner_basic_path(params[:owner_type])}/#{params[:owner_id]}/features/#{params[:feature_id]}", request)
16
+ end
17
+
18
+ def user_enable_feature(params)
19
+ request = {
20
+ utoken: params[:utoken],
21
+ feature: {
22
+ user_enabled: params[:user_enabled]
23
+ }
24
+ }
25
+ put("apps/#{params[:app_key]}/features/#{params[:feature_id]}", request)
26
+ end
27
+
28
+ def get_owner_features(params)
29
+ request = {
30
+ utoken: params[:utoken]
31
+ }
32
+ get("apps/#{params[:app_key]}/features", request)
33
+ end
34
+
35
+ private
36
+ def get_owner_basic_path(owner_type)
37
+ if owner_type == :user
38
+ '/users'
39
+ elsif owner_type == :account
40
+ '/apps'
41
+ else
42
+ raise 'Wrong owner type!'
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+
@@ -0,0 +1,37 @@
1
+ module Yotpo
2
+ module OwnerFeatureSetting
3
+ def get_feature_settings(params)
4
+ request = {
5
+ utoken: params[:utoken],
6
+ owner_ids: params[:owner_ids]
7
+ }
8
+ get("features/#{params[:feature_id]}/get_multiple_owners_settings", request)
9
+ end
10
+
11
+ def mass_update_feature_settings(params)
12
+ request = {
13
+ utoken: params[:utoken],
14
+ settings: params[:settings]
15
+ }
16
+ put("features/#{params[:feature_id]}/#{params[:owner_id]}/admin_mass_update", request)
17
+ end
18
+
19
+ def owner_feature_settings(params)
20
+ request = {
21
+ utoken: params[:utoken],
22
+ }
23
+ get("apps/#{params[:app_key]}/features/#{params[:feature_id]}/feature_settings", request)
24
+ end
25
+
26
+ def update_feature_settings(params)
27
+ request = {
28
+ utoken: params[:utoken],
29
+ value: params[:value],
30
+ key: params[:key]
31
+ }
32
+ put("apps/#{params[:app_key]}/features/#{params[:feature_id]}/feature_settings/#{params[:feature_settings_id]}", request)
33
+ end
34
+ end
35
+ end
36
+
37
+
@@ -21,5 +21,18 @@ module Yotpo
21
21
  sku = params[:product_id]
22
22
  get("/products/#{app_key}/#{sku}/bottomline")
23
23
  end
24
+
25
+ def get_product_url(params)
26
+ app_key = params[:app_key]
27
+ product_id = params[:product_id]
28
+ request = {
29
+ utoken: params[:utoken],
30
+ reference: params[:reference],
31
+ source: params[:source],
32
+ sub_reference: params[:sub_reference]
33
+ }
34
+ request[:product_id] = product_id if product_id
35
+ get("/products/#{app_key}/product_url", request)
36
+ end
24
37
  end
25
38
  end
@@ -0,0 +1,44 @@
1
+ module Yotpo
2
+ module Question
3
+
4
+ def question_send_confirmation(params)
5
+ request = {
6
+ appkey: params[:app_key],
7
+ sku: params[:product_id],
8
+ product_title: params[:product_title],
9
+ product_url: params[:product_url],
10
+ display_name: params[:user_display_name],
11
+ email: params[:user_email],
12
+ review_content: params[:review_body],
13
+ review_source: params[:review_source],
14
+ product_description: params[:product_description],
15
+ product_image_url: params[:product_image_url],
16
+ demo: params[:demo],
17
+ signature: params[:signature],
18
+ reviewer_type: params[:reviewer_type],
19
+ }
20
+ request.delete_if {|element, value| value.nil? }
21
+ post('questions/send_confirmation_mail', request)
22
+ end
23
+
24
+ def question_create_by_token(params)
25
+ request = {
26
+ content: params[:content],
27
+ domain: params[:domain],
28
+ product_tags: params[:product_tags],
29
+ product_description: params[:product_description],
30
+ product_image_url: params[:product_image_url],
31
+ product_title: params[:product_name],
32
+ product_url: params[:product_url],
33
+ sku: params[:product_id],
34
+ token: params[:token],
35
+ utm_campaign: params[:utm_campaign],
36
+ utm_medium: params[:utm_medium],
37
+ utm_source: params[:utm_source]
38
+ }
39
+ request.delete_if {|element, value| value.nil? }
40
+ get('questions/create_by_token', request)
41
+ end
42
+
43
+ end
44
+ end
@@ -38,7 +38,6 @@ module Yotpo
38
38
  get('/reviews/dynamic_create', request)
39
39
  end
40
40
 
41
-
42
41
  #
43
42
  # Gets reviews of a specific product
44
43
  #
@@ -63,5 +62,9 @@ module Yotpo
63
62
  request.delete_if{|key,val| val.nil? }
64
63
  get("/products/#{app_key}/#{sku}/reviews", request)
65
64
  end
65
+
66
+ def add_vote_to_review(params)
67
+ get("reviews/#{params[:review_id]}/vote/#{params[:vote_value]}")
68
+ end
66
69
  end
67
70
  end
@@ -60,5 +60,10 @@ module Yotpo
60
60
  }
61
61
  get('/users/b2blogin.json', request)
62
62
  end
63
+
64
+ def anonymous_user_confirmation(params)
65
+ get("/users/anonymous/#{params[:token]}")
66
+ end
67
+
63
68
  end
64
69
  end
@@ -7,6 +7,14 @@ require 'yotpo/core/response_parser'
7
7
  require 'yotpo/version'
8
8
  require 'yotpo/api/account'
9
9
  require 'yotpo/api/account_platform'
10
+ require 'yotpo/api/account_social'
11
+ require 'yotpo/api/comment'
12
+ require 'yotpo/api/question'
13
+ require 'yotpo/api/answer'
14
+ require 'yotpo/api/feature'
15
+ require 'yotpo/api/oauth'
16
+ require 'yotpo/api/owner_feature'
17
+ require 'yotpo/api/owner_feature_setting'
10
18
  require 'yotpo/api/product'
11
19
  require 'yotpo/api/purchase'
12
20
  require 'yotpo/api/reminder'
@@ -17,11 +25,18 @@ module Yotpo
17
25
  class Client
18
26
  include Yotpo::Account
19
27
  include Yotpo::AccountPlatform
28
+ include Yotpo::AccountSocial
29
+ include Yotpo::Comment
30
+ include Yotpo::Feature
31
+ include Yotpo::Oauth
32
+ include Yotpo::OwnerFeature
33
+ include Yotpo::OwnerFeatureSetting
20
34
  include Yotpo::Product
21
35
  include Yotpo::Reminder
22
36
  include Yotpo::Review
23
37
  include Yotpo::User
24
-
38
+ include Yotpo::Question
39
+ include Yotpo::Answer
25
40
  include Yotpo::Purchase
26
41
 
27
42
 
@@ -75,9 +90,10 @@ module Yotpo
75
90
  # Does a DELETE request to the url with the params
76
91
  #
77
92
  # @param url [String] the relative path in the Yotpo API
78
- def delete(url)
79
- preform(url, :delete) do
80
- return connection.delete(url)
93
+ def delete(url, params)
94
+ params = convert_hash_keys(params)
95
+ preform(url, :delete, params: params) do
96
+ return connection.delete(url, params)
81
97
  end
82
98
  end
83
99
 
@@ -125,7 +141,7 @@ module Yotpo
125
141
 
126
142
  # Setting request and response to use JSON/XML
127
143
  conn.request :oj
128
- conn.response :oj
144
+ conn.response :oj, :content_type => /\bjson$/
129
145
 
130
146
  # Set to use instrumentals to get time logs
131
147
  conn.use :instrumentation
@@ -4,8 +4,10 @@ require 'faraday_middleware/response_middleware'
4
4
  module Yotpo
5
5
  class ResponseParser < Faraday::Response::Middleware
6
6
  def parse(body)
7
- unless body.empty?
8
- body.response || body.status || body
7
+ if body.respond_to?(:response) || body.respond_to?(:status)
8
+ body.response || body.status
9
+ else
10
+ body
9
11
  end
10
12
  end
11
13
  end
@@ -19,7 +21,7 @@ module Yotpo
19
21
  end
20
22
 
21
23
  define_parser do |body|
22
- ::Oj.load(body, mode: :compat) unless body.strip.empty?
24
+ ::Oj.load(body, mode: :compat) unless body.to_s.strip.empty?
23
25
  end
24
26
  end
25
27
 
@@ -1,3 +1,3 @@
1
1
  module Yotpo
2
- VERSION = '0.1.0'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -0,0 +1,59 @@
1
+ require 'helper'
2
+
3
+ describe Yotpo::AccountSocial do
4
+ describe '#create social account' do
5
+ before(:all) do
6
+ account_social_params = {
7
+ utoken: @utoken,
8
+ app_key: @app_key,
9
+ social_network_name: 'INSTAGRAM',
10
+ access_token: 78910,
11
+ social_id: 111213141516,
12
+ }
13
+ VCR.use_cassette('create_account_social') do
14
+ @response = Yotpo.create_account_social(account_social_params)
15
+ end
16
+ end
17
+
18
+ subject { @response.body.account_social }
19
+ it { should be_a ::Hashie::Mash }
20
+ it { should respond_to :access_token }
21
+ it { should respond_to :social_id }
22
+ end
23
+
24
+ describe '#update social account' do
25
+ before(:all) do
26
+ account_social_params = {
27
+ utoken: @utoken,
28
+ app_key: @app_key,
29
+ access_token: 123,
30
+ secret: 123,
31
+ id: 17
32
+ }
33
+ VCR.use_cassette('update_account_social') do
34
+ @response = Yotpo.update_account_social(account_social_params)
35
+ end
36
+ end
37
+
38
+ subject { @response.body }
39
+ it { should be_a ::Hashie::Mash }
40
+ it { should respond_to :account_social }
41
+ end
42
+
43
+ describe '#get social account' do
44
+ before(:all) do
45
+ account_social_params = {
46
+ utoken: @utoken,
47
+ app_key: @app_key
48
+ }
49
+ VCR.use_cassette('get_account_social') do
50
+ @response = Yotpo.get_account_social(account_social_params)
51
+ end
52
+ end
53
+
54
+ subject { @response.body.account_socials[0] }
55
+ it { should be_a ::Hashie::Mash }
56
+ it { should respond_to :access_token }
57
+ it { should respond_to :social_id }
58
+ end
59
+ end