checkdin 0.2.7 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- checkdin (0.2.6)
4
+ checkdin (0.2.7)
5
5
  activesupport (>= 2.0.3)
6
6
  faraday (~> 0.8)
7
7
  faraday_middleware
@@ -14,6 +14,7 @@ module Checkdin
14
14
  #
15
15
  # @param [Hash] options
16
16
  # @option options Integer :campaign_id - Only return won rewards for this campaign.
17
+ # @option options String :classification - Only return activities for users in this classification.
17
18
  # @option options Integer :user_id - Only return won rewards for this user.
18
19
  # @option options Integer :since - Only fetch updates since this time (UNIX timestamp)
19
20
  # @option options Integer :limit - The maximum number of records to return.
@@ -14,5 +14,16 @@ module Checkdin
14
14
  return_error_or_body(response)
15
15
  end
16
16
 
17
+ # Get the classification leaderboard for a given campaign
18
+ #
19
+ # param [Integer] campaign_id The ID of the campaign to fetch the leaderboard for.
20
+
21
+ def classification_leaderboard(campaign_id)
22
+ response = connection.get do |req|
23
+ req.url "campaigns/#{campaign_id}/classification_leaderboard"
24
+ end
25
+ return_error_or_body(response)
26
+ end
27
+
17
28
  end
18
29
  end
@@ -30,7 +30,6 @@ module Checkdin
30
30
 
31
31
  @checkdin_landing_url = options.delete(:checkdin_landing_url) || CHECKDIN_DEFAULT_LANDING
32
32
 
33
- raise ArgumentError.new("Unknown arguments given: #{options.keys.inspect}") unless options.empty?
34
33
  end
35
34
 
36
35
  # Public: Build a full signed url for logging a specific user into checkd.in. Notice:
@@ -42,15 +41,25 @@ module Checkdin
42
41
  # user_identifier - REQUIRED, your unique identifier for the user, MUST NOT change over time.
43
42
  # authentication_action - OPTIONAL, the given action will be performed immediately,
44
43
  # and the user redirected back to your site afterwards.
44
+ # referral_token - OPTIONAL, the referral token of the user that referred the user being created.
45
+ # first_name - OPTIONAL
46
+ # last_name - OPTIONAL
47
+ # gender - OPTIONAL, format of male or female
48
+ # birth_date - OPTIONAL, YYYY-MM-DD format
49
+ # username - OPTIONAL
50
+ # mobile_number - OPTIONAL, XXXYYYZZZZ format
51
+ # postal_code_text - OPTIONAL, XXXXX format
52
+ # classification - OPTIONAL, the internal group or classification a user belongs to
53
+ # delivery_email - OPTIONAL, whether a user should receive email notifications
54
+ # delivery_sms - OPTIONAL, whether a user should receive sms notifications
45
55
  #
46
56
  # Returns a URL you can use for redirecting a user. Notice this will expire, so it should
47
57
  # be generated and used only when a user actually wants to log into checkd.in.
48
58
  def login_url options
49
59
  email = options.delete(:email) or raise ArgumentError.new("No :email passed for user")
50
60
  user_identifier = options.delete(:user_identifier) or raise ArgumentError.new("No :user_identifier passed for user")
51
- authentication_action = options.delete(:authentication_action)
52
61
 
53
- authenticated_parameters = build_authenticated_parameters(email, user_identifier, authentication_action)
62
+ authenticated_parameters = build_authenticated_parameters(email, user_identifier, options)
54
63
 
55
64
  [checkdin_landing_url, authenticated_parameters.to_query].join
56
65
  end
@@ -58,22 +67,22 @@ module Checkdin
58
67
  # Private: Build a signed hash of parameters for redirecting the user to checkd.in.
59
68
  #
60
69
  # Returns a hash including a secure message digest and the current timestamp
61
- def build_authenticated_parameters email, user_identifier, authentication_action = nil
62
- build_request(email, user_identifier, authentication_action).tap do |request|
70
+ def build_authenticated_parameters email, user_identifier, options
71
+ build_request(email, user_identifier, options).tap do |request|
63
72
  request['digest'] = digest_request(request)
64
73
  end
65
74
  end
66
75
 
67
76
  private
68
- def build_request email, user_identifier, authentication_action
77
+ def build_request email, user_identifier, options
78
+ stringified_options = stringify_keys(options)
79
+
69
80
  {
70
81
  'auth_timestamp' => Time.now.to_i,
71
82
  'client_id' => client_identifier,
72
83
  'client_uid' => user_identifier,
73
84
  'email' => email,
74
- }.tap do |request|
75
- request['authentication_action'] = authentication_action if authentication_action
76
- end
85
+ }.merge(stringified_options)
77
86
  end
78
87
 
79
88
  def digest_request request
@@ -81,5 +90,11 @@ module Checkdin
81
90
  OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA256.new, bridge_secret, encoded_request)
82
91
  end
83
92
 
93
+ def stringify_keys hash
94
+ hash.inject({}) do |options, (key, value)|
95
+ options[key.to_s] = value
96
+ options
97
+ end
98
+ end
84
99
  end
85
100
  end
@@ -34,8 +34,19 @@ module Checkdin
34
34
  # Create a user in the checkd.in system tied to the authenticating client.
35
35
  #
36
36
  # @param [Hash] options
37
- # @option options String :identifier - The authenticating client's internal identifier for this user.
38
- # @option options String :email - A valid email for the user
37
+ # @option options String :identifier - REQUIRED, The authenticating client's internal identifier for this user.
38
+ # @option options String :email - REQUIRED, A valid email for the user
39
+ # @option options String :referral_token - OPTIONAL, the referral token of the user that referred the user being created.
40
+ # @option options String :first_name - OPTIONAL
41
+ # @option options String :last_name - OPTIONAL
42
+ # @option options String :gender - OPTIONAL, format of male or female
43
+ # @option options String :birth_date - OPTIONAL, YYYY-MM-DD format
44
+ # @option options String :username - OPTIONAL
45
+ # @option options String :mobile_number - OPTIONAL, XXXYYYZZZZ format
46
+ # @option options String :postal_code_text - OPTIONAL, XXXXX format
47
+ # @option options String :classification - OPTIONAL, the internal group or classification a user belongs to
48
+ # @option options String :delivery_email - OPTIONAL, whether a user should receive email notifications
49
+ # @option options String :delivery_sms - OPTIONAL, whether a user should receive sms notifications
39
50
 
40
51
  def create_user(options={})
41
52
  response = connection.post do |req|
@@ -1,3 +1,3 @@
1
1
  module Checkdin
2
- VERSION = '0.2.7'
2
+ VERSION = '0.2.8'
3
3
  end
@@ -15,4 +15,14 @@ describe Checkdin::Leaderboard do
15
15
  result.leaders.count.should == 5
16
16
  end
17
17
  end
18
+
19
+ context "viewing a leaderboard for a campaign's classifications" do
20
+ use_vcr_cassette
21
+ let(:result) { @client.classification_leaderboard(35) }
22
+
23
+ it "should provide a list of classifications" do
24
+ result.classifications.first.classification.should == "grouped"
25
+ result.classifications.first.total_points.should == 10
26
+ end
27
+ end
18
28
  end
@@ -24,10 +24,10 @@ describe Checkdin::UserBridge, 'constructor' do
24
24
  instance.checkdin_landing_url.should == landing_url
25
25
  end
26
26
 
27
- it "raises an error on unknown arguments" do
27
+ it "does not raise an error on unknown arguments" do
28
28
  expect do
29
29
  Checkdin::UserBridge.new(default_options.merge(:misspelled_option => 'error me'))
30
- end.to raise_error(ArgumentError, /misspelled_option/)
30
+ end.to_not raise_error(ArgumentError, /misspelled_option/)
31
31
  end
32
32
  end
33
33
 
@@ -35,14 +35,16 @@ describe Checkdin::UserBridge, '#login_url' do
35
35
  let(:instance) { Checkdin::UserBridge.new(:client_identifier => client_identifier,
36
36
  :bridge_secret => bridge_secret,
37
37
  :checkdin_landing_url => checkdin_landing_url) }
38
- subject { instance.login_url(:email => user_email,
39
- :user_identifier => user_identifier,
40
- :authentication_action => authentication_action) }
38
+ subject { instance.login_url(options) }
39
+ let(:options) { default_options }
40
+ let(:default_options) {{
41
+ :email => user_email,
42
+ :user_identifier => user_identifier
43
+ }}
41
44
  let(:client_identifier) { 'client-1704' }
42
45
  let(:bridge_secret) { '123-shared-secret' }
43
46
  let(:user_email) { 'bob@example.com' }
44
47
  let(:user_identifier) { '17-batch1-bob' }
45
- let(:authentication_action) { nil }
46
48
  let(:checkdin_landing_url) { nil }
47
49
  let(:timestamp) { 1325605589 }
48
50
 
@@ -64,7 +66,7 @@ describe Checkdin::UserBridge, '#login_url' do
64
66
  end
65
67
 
66
68
  context "with an optional action set" do
67
- let(:authentication_action) { 'authenticate_facebook' }
69
+ let(:options) { default_options.merge(:authentication_action => 'authenticate_facebook') }
68
70
 
69
71
  it "includes the authentication_action" do
70
72
  Timecop.freeze(Time.at(timestamp)) do
@@ -72,6 +74,16 @@ describe Checkdin::UserBridge, '#login_url' do
72
74
  end
73
75
  end
74
76
  end
77
+
78
+ context "with additional attributes set" do
79
+ let(:options) { default_options.merge(:delivery_email => false) }
80
+
81
+ it "includes the additional attriubtes" do
82
+ Timecop.freeze(Time.at(timestamp)) do
83
+ subject.should == "https://app.checkd.in/user_landing?auth_timestamp=1325605589&client_id=client-1704&client_uid=17-batch1-bob&delivery_email=false&digest=f3950bee05fb1ca97727d9c190f2b30cfbdcf74a7150b3c337afbfc557d988dc&email=bob%40example.com"
84
+ end
85
+ end
86
+ end
75
87
  end
76
88
 
77
89
  context "custom subdomain" do
@@ -95,7 +107,8 @@ end
95
107
 
96
108
  describe Checkdin::UserBridge, '#build_authenticated_parameters' do
97
109
  let(:instance) { Checkdin::UserBridge.new(:client_identifier => client_identifier, :bridge_secret => bridge_secret) }
98
- subject { instance.build_authenticated_parameters(user_email, user_identifier) }
110
+ subject { instance.build_authenticated_parameters(user_email, user_identifier, options) }
111
+ let(:options) { {} }
99
112
  let(:client_identifier) { 'client-1704' }
100
113
  let(:bridge_secret) { '123-shared-secret' }
101
114
  let(:user_email) { 'bob@example.com' }
@@ -114,15 +127,15 @@ describe Checkdin::UserBridge, '#build_authenticated_parameters' do
114
127
  end
115
128
  end
116
129
 
117
- context "with an authenticated action" do
118
- subject { instance.build_authenticated_parameters(user_email, user_identifier, authentication_action) }
119
- let(:authentication_action) { 'authenticate_facebook' }
130
+ context "with an authenticated action in the options" do
131
+ subject { instance.build_authenticated_parameters(user_email, user_identifier, options) }
132
+ let(:options) { {:authentication_action => 'authenticate_facebook'} }
120
133
 
121
134
  it "should output a hash with a different digest and the authenticated_action included" do
122
135
  Timecop.freeze(Time.at(timestamp)) do
123
136
  subject.should == {
124
137
  'auth_timestamp' => timestamp,
125
- 'authentication_action' => authentication_action,
138
+ 'authentication_action' => 'authenticate_facebook',
126
139
  'client_id' => client_identifier,
127
140
  'client_uid' => user_identifier,
128
141
  'email' => user_email,
@@ -0,0 +1,46 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :get
5
+ uri: https://staging:cKGdyvb4gQD9YJg3cACV@staging.checkd.in:443/api/v1/campaigns/35/classification_leaderboard?client_id={client_id}&client_secret={client_secret}
6
+ body:
7
+ headers:
8
+ accept:
9
+ - application/json
10
+ user-agent:
11
+ - checkdin ruby gem 0.2.7
12
+ accept-encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ response: !ruby/struct:VCR::Response
15
+ status: !ruby/struct:VCR::ResponseStatus
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ server:
20
+ - nginx/1.0.11
21
+ date:
22
+ - Thu, 16 Aug 2012 14:06:50 GMT
23
+ content-type:
24
+ - application/json; charset=utf-8
25
+ transfer-encoding:
26
+ - chunked
27
+ connection:
28
+ - keep-alive
29
+ status:
30
+ - 200 OK
31
+ strict-transport-security:
32
+ - max-age=31536000
33
+ x-ua-compatible:
34
+ - IE=Edge,chrome=1
35
+ etag:
36
+ - "\"0016a5775b88d5dbd81551ebc2148c1b\""
37
+ cache-control:
38
+ - must-revalidate, private, max-age=0
39
+ x-request-id:
40
+ - 707edb8903bd34be9db20d17dc393e6d
41
+ x-runtime:
42
+ - "0.159060"
43
+ x-rack-cache:
44
+ - miss
45
+ body: "{\"classifications\":[{\"classification\":\"grouped\",\"total_points\":10,\"members\":1}]}"
46
+ http_version: "1.1"
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: checkdin
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.7
5
+ version: 0.2.8
6
6
  platform: ruby
7
7
  authors:
8
8
  - Matt Mueller
@@ -183,6 +183,7 @@ files:
183
183
  - spec/fixtures/vcr_cassettes/Checkdin_Campaigns/viewing_a_single_campaign.yml
184
184
  - spec/fixtures/vcr_cassettes/Checkdin_CustomActivities.yml
185
185
  - spec/fixtures/vcr_cassettes/Checkdin_Leaderboard/viewing_a_leaderboard_for_a_campaign.yml
186
+ - spec/fixtures/vcr_cassettes/Checkdin_Leaderboard/viewing_a_leaderboard_for_a_campaign_s_classifications.yml
186
187
  - spec/fixtures/vcr_cassettes/Checkdin_Promotions/viewing_a_list_of_promotions.yml
187
188
  - spec/fixtures/vcr_cassettes/Checkdin_Promotions/viewing_a_single_promotion.yml
188
189
  - spec/fixtures/vcr_cassettes/Checkdin_Promotions/viewing_the_votes_leaderboard_for_a_promotion.yml