sift 1.1.6.2 → 1.1.7.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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MzdkOThmNmZiYWRmMDI3ODgyYjI4MjYyMjc2ZDg1YjhkOTdlNGU0MQ==
4
+ MWU0ZjhlZTFmYWZiOGQwMDY3NDIwNjFiZDgyYmQ5NDUxMDgzZTI3Ng==
5
5
  data.tar.gz: !binary |-
6
- N2RiZGI4ZTFlZWI1YjBkNDQ1MDQyM2MxYTNmMDNlMzUxZjMyZDM1OA==
6
+ YTZlNjYwZmVjMzZiZGZiNTMwYTYzY2E4OTBlMDVhM2M1MzI0OTViZQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- M2YzZTYyZmJhMzBjMDVmZmJiNWM5N2ZmNmJmNjkzOTMzN2ExODIxMTIwOGRh
10
- OTBmYThlZDA1ZDVmMDYzZTI4MjIxZDcxYTFjYjZhMzc0MzlkYjk1ZThhZTMy
11
- YjhlNGUwMzEwOTI2MjhlNGI5ODYwZTJmYmRkNGI4YzlkM2IzYTE=
9
+ M2NlMzk3MzQ2ZTgwMGQ4MzU5NGM1NDgyOTBjZWFlZTJkNDljYTk4OTE4Y2Iz
10
+ NzBlODBjMmIyZWMzNjY0MzQ0Mzk4MzA3YmU2Y2ZmMTQwNzE5ZjFmZTVkYTNi
11
+ YTVjZjI2NjM5Y2Y2NWFiYzYyZjgxNTUxY2Y2NTM4ZThkYTQ4NmQ=
12
12
  data.tar.gz: !binary |-
13
- NGVjMmZjYTJiOWI0NDA4N2Y5NjU3NGNkNDk1NTNjMDdhZGQ3NGZmNDEwNTYw
14
- MTVmZGQ5ZDQ4NTY4ZmEyMTkwNjYwZDFhMTBmZDgwNDNiYWVjMWUyZWE0OTk1
15
- NThlNTY5N2M2ZDAyZTBkMWI5Mjg4YzVhMmM2M2MyZDU5YjU1MDE=
13
+ MzQ0MmRhODAyZmJkNGU2ODdhZjdkNmYyMzIwZjZiYWZlYmE0OWJmODFlYWFk
14
+ MDFhODRlZjc1NzVlNDQzNzhlMzQ4MWM2NDI5MDE3NGQ0OGJlNTQ3MGVkZTc2
15
+ ZGY1ZDlkZTk4MjE2YTZjMWI0ZGJjNjEzNDY1Njc1OGJiMGMxODM=
data/HISTORY CHANGED
@@ -1,3 +1,47 @@
1
+ === 1.1.6.2 2014-09-19
2
+ * added API key parameter to track and label functions
3
+
4
+ === 1.1.6.0 2014-09-03
5
+ * added module scoped API key variable
6
+
7
+ === 1.1.4 2014-01-02
8
+ * removed support for ruby 1.9.2
9
+ * track/label return nil on failure
10
+
11
+ === 1.1.3 2013-12-10
12
+ * nil values are removed from JSON body sent to track/label now.
13
+ * relaxed multi_json requirement to 1.0 or newer
14
+ * relaxed httparty requirement to 0.11.0 or newer
15
+ * migrated from fakeweb to webmock 1.16.0 or newer
16
+
17
+ === 1.1.1 2013-11-14
18
+ * score request now requires API key
19
+
20
+ === 1.1.0 2013-11-08
21
+ * now uses v203 API endpoint by default
22
+
23
+ === 1.0.13 2014-10-22
24
+ * added path parameter to track function
25
+ * added label function for applying labels
26
+ * now requires httparty 0.12.0 or newer
27
+ * now requires multi_json 1.8.2 or newer
28
+ * now requires rspec 2.14.1 or newer for compilation only
29
+
30
+ === 1.0.12 2013-06-13
31
+ * added score function for getting user scores.
32
+ * now requires httparty 0.10.0 or newer
33
+ * added rspec 2.0 or newer and rake dependency
34
+
35
+ === 1.0.10 2013-01-09
36
+ * Add configurable path variable to Client
37
+
38
+ === 1.0.5 2012-07-20
39
+
40
+ === 1.0.3 2012-05-05
41
+
42
+ === 1.0.2 2012-05-03
43
+
44
+ === 1.0.1 2012-05-02
1
45
 
2
46
  === 1.0 2012-05-02
3
47
  * Initial release
data/lib/sift/client.rb CHANGED
@@ -7,6 +7,7 @@ module Sift
7
7
  #
8
8
  class Response
9
9
  attr_reader :body
10
+ attr_reader :http_class
10
11
  attr_reader :http_status_code
11
12
  attr_reader :api_status
12
13
  attr_reader :api_error_message
@@ -20,12 +21,17 @@ module Sift
20
21
  # a JSON object that can be decoded into status, message and request
21
22
  # sections.
22
23
  #
23
- def initialize(http_response, http_response_code)
24
- @body = MultiJson.load(http_response)
25
- @request = MultiJson.load(@body["request"].to_s) if @body["request"]
24
+ def initialize(http_response, http_headers, http_response_code, http_raw_response)
26
25
  @http_status_code = http_response_code
27
- @api_status = @body["status"].to_i
28
- @api_error_message = @body["error_message"].to_s
26
+ @http_raw_response = http_raw_response
27
+
28
+ # only set these variables if a message-body is expected.
29
+ if not @http_raw_response.kind_of? Net::HTTPNoContent
30
+ @body = MultiJson.load(http_response) unless http_response.nil?
31
+ @request = MultiJson.load(@body["request"].to_s) if @body["request"]
32
+ @api_status = @body["status"].to_i if @body["status"]
33
+ @api_error_message = @body["error_message"].to_s if @body["error_message"]
34
+ end
29
35
  end
30
36
 
31
37
  # Helper method returns true if and only if the response from the API call was
@@ -34,7 +40,14 @@ module Sift
34
40
  # == Returns:
35
41
  # true on success; false otherwise
36
42
  def ok?
37
- 0 == @api_status.to_i
43
+
44
+ if @http_raw_response.kind_of? Net::HTTPNoContent
45
+ #if there is no content expected, use HTTP code
46
+ 204 == @http_status_code
47
+ else
48
+ # otherwise use API status
49
+ @http_raw_response.kind_of? Net::HTTPOK and 0 == @api_status.to_i
50
+ end
38
51
  end
39
52
 
40
53
 
@@ -70,8 +83,8 @@ module Sift
70
83
  # The path to the event API, e.g., "/v201/events"
71
84
  #
72
85
  def initialize(api_key = Sift.api_key, path = Sift.current_rest_api_path, timeout = API_TIMEOUT)
73
- raise(RuntimeError, "api_key must be a non-empty string") if (!api_key.is_a? String) || api_key.empty?
74
- raise(RuntimeError, "path must be a non-empty string") if (!path.is_a? String) || path.empty?
86
+ raise("api_key must be a non-empty string") if !api_key.is_a?(String) || api_key.empty?
87
+ raise("path must be a non-empty string") if !path.is_a?(String) || path.empty?
75
88
  @api_key = api_key
76
89
  @path = path
77
90
  @timeout = timeout
@@ -118,9 +131,9 @@ module Sift
118
131
  # result, though.
119
132
  #
120
133
  def track(event, properties = {}, timeout = nil, path = nil, return_score = false, api_key = @api_key)
121
- raise(RuntimeError, "event must be a non-empty string") if (!event.is_a? String) || event.empty?
122
- raise(RuntimeError, "properties cannot be empty") if properties.empty?
123
- raise(RuntimeError, "Bad api_key parameter") if api_key.empty?
134
+ raise("event must be a non-empty string") if (!event.is_a? String) || event.empty?
135
+ raise("properties cannot be empty") if properties.empty?
136
+ raise("Bad api_key parameter") if api_key.empty?
124
137
  path ||= @path
125
138
  timeout ||= @timeout
126
139
  if return_score
@@ -134,7 +147,7 @@ module Sift
134
147
  options.merge!(:timeout => timeout) unless timeout.nil?
135
148
  begin
136
149
  response = self.class.post(path, options)
137
- Response.new(response.body, response.code)
150
+ Response.new(response.body, response.headers, response.code, response.response)
138
151
  rescue StandardError => e
139
152
  Sift.warn("Failed to track event: " + e.to_s)
140
153
  Sift.warn(e.backtrace)
@@ -156,15 +169,15 @@ module Sift
156
169
  #
157
170
  def score(user_id, timeout = nil, api_key = @api_key)
158
171
 
159
- raise(RuntimeError, "user_id must be a non-empty string") if (!user_id.is_a? String) || user_id.to_s.empty?
160
- raise(RuntimeError, "Bad api_key parameter") if api_key.empty?
172
+ raise("user_id must be a non-empty string") if (!user_id.is_a? String) || user_id.to_s.empty?
173
+ raise("Bad api_key parameter") if api_key.empty?
161
174
  timetout ||= @timeout
162
175
 
163
176
  options = { :headers => {"User-Agent" => user_agent} }
164
177
  options.merge!(:timeout => timeout) unless timeout.nil?
165
178
 
166
179
  response = self.class.get("/v#{API_VERSION}/score/#{user_id}/?api_key=#{api_key}", options)
167
- Response.new(response.body, response.code)
180
+ Response.new(response.body, response.headers, response.code, response.response)
168
181
 
169
182
  end
170
183
 
@@ -189,12 +202,38 @@ module Sift
189
202
  #
190
203
  def label(user_id, properties = {}, timeout = nil, api_key = @api_key)
191
204
 
192
- raise(RuntimeError, "user_id must be a non-empty string") if (!user_id.is_a? String) || user_id.to_s.empty?
205
+ raise("user_id must be a non-empty string") if (!user_id.is_a? String) || user_id.to_s.empty?
193
206
 
194
207
  path = Sift.current_users_label_api_path(user_id)
195
208
  track("$label", delete_nils(properties), timeout, path, false, api_key)
196
209
  end
197
210
 
211
+ # Unlabels a user. This call is blocking.
212
+ #
213
+ # == Parameters:
214
+ # user_id
215
+ # A user's id. This id should be the same as the user_id used in
216
+ # event calls.
217
+ #
218
+ # timeout (optional)
219
+ # The number of seconds to wait before failing the request. By default this is
220
+ # configured to 2 seconds (see above). This parameter is optional.
221
+ #
222
+ # == Returns:
223
+ # A Response object is returned with only an http code of 204.
224
+ #
225
+ def unlabel(user_id, timeout = nil)
226
+
227
+ raise("user_id must be a non-empty string") if (!user_id.is_a? String) || user_id.to_s.empty?
228
+ timetout ||= @timeout
229
+
230
+ options = { :headers => {"User-Agent" => user_agent} }
231
+ options.merge!(:timeout => timeout) unless timeout.nil?
232
+ path = Sift.current_users_label_api_path(user_id)
233
+ response = self.class.delete(path + "?api_key=#{@api_key}", options)
234
+ Response.new(response.body, response.headers, response.code, response.response)
235
+ end
236
+
198
237
  private
199
238
  def delete_nils(properties)
200
239
  properties.delete_if do |k, v|
data/lib/sift/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Sift
2
- VERSION = "1.1.6.2"
2
+ VERSION = "1.1.7.0"
3
3
  API_VERSION = "203"
4
4
  end
@@ -21,15 +21,29 @@ describe Sift::Client do
21
21
 
22
22
  stub_request(:post, "https://api.siftscience.com/v203/users/frodo_baggins/labels").
23
23
  with(:body => '{"$reasons":["$fake"],"$is_bad":true,"$description":"Listed a fake item","$type":"$label","$api_key":"foobar"}').
24
- to_return(:body => MultiJson.dump(response_json), :status => 200, :content_type => "text/json")
24
+ to_return(:body => MultiJson.dump(response_json), :status => 200, :headers =>
25
+ {"content-type"=>"application/json; charset=UTF-8","content-length"=> "74"})
25
26
 
26
27
  api_key = "foobar"
27
28
  properties = valid_label_properties
28
29
 
29
30
  response = Sift::Client.new(api_key).label(user_id, properties)
30
- response.ok?.should eq(true)
31
- response.api_status.should eq(0)
32
- response.api_error_message.should eq("OK")
31
+ expect(response.ok?).to eq(true)
32
+ expect(response.api_status).to eq(0)
33
+ expect(response.api_error_message).to eq("OK")
34
+ end
35
+
36
+ it "Successfully handles an $unlabel with the v203 API endpoing and returns OK" do
37
+ response_json = { :status => 0, :error_message => "OK" }
38
+ user_id = "frodo_baggins"
39
+
40
+ stub_request(:delete, "https://api.siftscience.com/v203/users/frodo_baggins/labels?api_key=foobar").
41
+ to_return(:status => 204)
42
+
43
+ api_key = "foobar"
44
+
45
+ response = Sift::Client.new(api_key).unlabel(user_id)
46
+ expect(response.ok?).to eq(true)
33
47
  end
34
48
 
35
49
  end
@@ -48,51 +48,51 @@ describe Sift::Client do
48
48
 
49
49
  it "Can instantiate client with blank api key if Sift.api_key set" do
50
50
  Sift.api_key = "test_global_api_key"
51
- Sift::Client.new().api_key.should eq(Sift.api_key)
51
+ expect(Sift::Client.new().api_key).to eq(Sift.api_key)
52
52
  end
53
53
 
54
54
  it "Parameter passed api key takes precedence over Sift.api_key" do
55
55
  Sift.api_key = "test_global_api_key"
56
56
  api_key = "test_local_api_key"
57
- Sift::Client.new(api_key).api_key.should eq(api_key)
57
+ expect(Sift::Client.new(api_key).api_key).to eq(api_key)
58
58
  end
59
59
 
60
60
  it "Cannot instantiate client with nil, empty, non-string, or blank api key" do
61
- lambda { Sift::Client.new(nil) }.should raise_error
62
- lambda { Sift::Client.new("") }.should raise_error
63
- lambda { Sift::Client.new(123456) }.should raise_error
64
- lambda { Sift::Client.new() }.should raise_error
61
+ expect(lambda { Sift::Client.new(nil) }).to raise_error
62
+ expect(lambda { Sift::Client.new("") }).to raise_error
63
+ expect(lambda { Sift::Client.new(123456) }).to raise_error
64
+ expect(lambda { Sift::Client.new() }).to raise_error
65
65
  end
66
66
 
67
67
  it "Cannot instantiate client with nil, empty, non-string, or blank path" do
68
68
  api_key = "test_local_api_key"
69
- lambda { Sift::Client.new(api_key, nil) }.should raise_error
70
- lambda { Sift::Client.new(api_key, "") }.should raise_error
71
- lambda { Sift::Client.new(api_key, 123456) }.should raise_error
69
+ expect(lambda { Sift::Client.new(api_key, nil) }).to raise_error
70
+ expect(lambda { Sift::Client.new(api_key, "") }).to raise_error
71
+ expect(lambda { Sift::Client.new(api_key, 123456) }).to raise_error
72
72
  end
73
73
 
74
74
  it "Can instantiate client with non-default timeout" do
75
- lambda { Sift::Client.new("test_local_api_key", Sift.current_rest_api_path, 4) }.should_not raise_error
75
+ expect(lambda { Sift::Client.new("test_local_api_key", Sift.current_rest_api_path, 4) }).not_to raise_error
76
76
  end
77
77
 
78
78
  it "Track call must specify an event name" do
79
- lambda { Sift::Client.new("foo").track(nil) }.should raise_error
80
- lambda { Sift::Client.new("foo").track("") }.should raise_error
79
+ expect(lambda { Sift::Client.new("foo").track(nil) }).to raise_error
80
+ expect(lambda { Sift::Client.new("foo").track("") }).to raise_error
81
81
  end
82
82
 
83
83
  it "Must specify an event name" do
84
- lambda { Sift::Client.new("foo").track(nil) }.should raise_error
85
- lambda { Sift::Client.new("foo").track("") }.should raise_error
84
+ expect(lambda { Sift::Client.new("foo").track(nil) }).to raise_error
85
+ expect(lambda { Sift::Client.new("foo").track("") }).to raise_error
86
86
  end
87
87
 
88
88
  it "Must specify properties" do
89
89
  event = "custom_event_name"
90
- lambda { Sift::Client.new("foo").track(event) }.should raise_error
90
+ expect(lambda { Sift::Client.new("foo").track(event) }).to raise_error
91
91
  end
92
92
 
93
93
  it "Score call must specify a user_id" do
94
- lambda { Sift::Client.new("foo").score(nil) }.should raise_error
95
- lambda { Sift::Client.new("foo").score("") }.should raise_error
94
+ expect(lambda { Sift::Client.new("foo").score(nil) }).to raise_error
95
+ expect(lambda { Sift::Client.new("foo").score("") }).to raise_error
96
96
  end
97
97
 
98
98
  it "Doesn't raise an exception on Net/HTTP errors" do
@@ -105,7 +105,7 @@ describe Sift::Client do
105
105
 
106
106
  # This method should just return nil -- the track call failed because
107
107
  # of an HTTP error
108
- Sift::Client.new(api_key).track(event, properties).should eq(nil)
108
+ expect(Sift::Client.new(api_key).track(event, properties)).to eq(nil)
109
109
  end
110
110
 
111
111
  it "Returns nil when a StandardError occurs within the request" do
@@ -118,7 +118,7 @@ describe Sift::Client do
118
118
 
119
119
  # This method should just return nil -- the track call failed because
120
120
  # a StandardError exception was thrown
121
- Sift::Client.new(api_key).track(event, properties).should eq(nil)
121
+ expect(Sift::Client.new(api_key).track(event, properties)).to eq(nil)
122
122
  end
123
123
 
124
124
  it "Successfuly handles an event and returns OK" do
@@ -128,17 +128,17 @@ describe Sift::Client do
128
128
  stub_request(:post, "https://api.siftscience.com/v203/events").
129
129
  with { |request|
130
130
  parsed_body = JSON.parse(request.body)
131
- parsed_body.should include("$buyer_user_id" => "123456")
132
- }.to_return(:status => 200, :body => MultiJson.dump(response_json), :headers => {})
131
+ expect(parsed_body).to include("$buyer_user_id" => "123456")
132
+ }.to_return(:status => 200, :body => MultiJson.dump(response_json), :headers => {"content-type"=>"application/json; charset=UTF-8","content-length"=> "74"})
133
133
 
134
134
  api_key = "foobar"
135
135
  event = "$transaction"
136
136
  properties = valid_transaction_properties
137
137
 
138
138
  response = Sift::Client.new(api_key).track(event, properties)
139
- response.ok?.should eq(true)
140
- response.api_status.should eq(0)
141
- response.api_error_message.should eq("OK")
139
+ expect(response.ok?).to eq(true)
140
+ expect(response.api_status).to eq(0)
141
+ expect(response.api_error_message).to eq("OK")
142
142
  end
143
143
 
144
144
  it "Successfully submits event with overriden key" do
@@ -146,8 +146,8 @@ describe Sift::Client do
146
146
  stub_request(:post, "https://api.siftscience.com/v203/events").
147
147
  with { | request|
148
148
  parsed_body = JSON.parse(request.body)
149
- parsed_body.should include("$buyer_user_id" => "123456")
150
- parsed_body.should include("$api_key" => "overridden")
149
+ expect(parsed_body).to include("$buyer_user_id" => "123456")
150
+ expect(parsed_body).to include("$api_key" => "overridden")
151
151
  }.to_return(:status => 200, :body => MultiJson.dump(response_json), :headers => {})
152
152
 
153
153
  api_key = "foobar"
@@ -155,9 +155,9 @@ describe Sift::Client do
155
155
  properties = valid_transaction_properties
156
156
 
157
157
  response = Sift::Client.new(api_key).track(event, properties, nil, nil, false, "overridden")
158
- response.ok?.should eq(true)
159
- response.api_status.should eq(0)
160
- response.api_error_message.should eq("OK")
158
+ expect(response.ok?).to eq(true)
159
+ expect(response.api_status).to eq(0)
160
+ expect(response.api_error_message).to eq("OK")
161
161
  end
162
162
 
163
163
  it "Successfuly scrubs nils" do
@@ -167,9 +167,9 @@ describe Sift::Client do
167
167
  stub_request(:post, "https://api.siftscience.com/v203/events").
168
168
  with { |request|
169
169
  parsed_body = JSON.parse(request.body)
170
- parsed_body.should_not include("fake_property")
171
- parsed_body.should include("sub_object" => {"one" => "two"})
172
- }.to_return(:status => 200, :body => MultiJson.dump(response_json), :headers => {})
170
+ expect(parsed_body).not_to include("fake_property")
171
+ expect(parsed_body).to include("sub_object" => {"one" => "two"})
172
+ }.to_return(:status => 200, :body => MultiJson.dump(response_json), :headers => {"content-type"=>"application/json; charset=UTF-8","content-length"=> "74"})
173
173
 
174
174
  api_key = "foobar"
175
175
  event = "$transaction"
@@ -181,9 +181,9 @@ describe Sift::Client do
181
181
  }
182
182
  )
183
183
  response = Sift::Client.new(api_key).track(event, properties)
184
- response.ok?.should eq(true)
185
- response.api_status.should eq(0)
186
- response.api_error_message.should eq("OK")
184
+ expect(response.ok?).to eq(true)
185
+ expect(response.api_status).to eq(0)
186
+ expect(response.api_error_message).to eq("OK")
187
187
  end
188
188
 
189
189
  it "Successfully fetches a score" do
@@ -192,14 +192,14 @@ describe Sift::Client do
192
192
  response_json = score_response_json
193
193
 
194
194
  stub_request(:get, "https://api.siftscience.com/v203/score/247019/?api_key=foobar").
195
- to_return(:status => 200, :body => MultiJson.dump(response_json), :headers => {})
195
+ to_return(:status => 200, :body => MultiJson.dump(response_json), :headers => {"content-type"=>"application/json; charset=UTF-8","content-length"=> "74"})
196
196
 
197
197
  response = Sift::Client.new(api_key).score(score_response_json[:user_id])
198
- response.ok?.should eq(true)
199
- response.api_status.should eq(0)
200
- response.api_error_message.should eq("OK")
198
+ expect(response.ok?).to eq(true)
199
+ expect(response.api_status).to eq(0)
200
+ expect(response.api_error_message).to eq("OK")
201
201
 
202
- response.body["score"].should eq(0.93)
202
+ expect(response.body["score"]).to eq(0.93)
203
203
  end
204
204
 
205
205
  it "Successfully fetches a score with an overridden key" do
@@ -211,11 +211,11 @@ describe Sift::Client do
211
211
  to_return(:status => 200, :body => MultiJson.dump(response_json), :headers => {})
212
212
 
213
213
  response = Sift::Client.new(api_key).score(score_response_json[:user_id], nil, "overridden")
214
- response.ok?.should eq(true)
215
- response.api_status.should eq(0)
216
- response.api_error_message.should eq("OK")
214
+ expect(response.ok?).to eq(true)
215
+ expect(response.api_status).to eq(0)
216
+ expect(response.api_error_message).to eq("OK")
217
217
 
218
- response.body["score"].should eq(0.93)
218
+ expect(response.body["score"]).to eq(0.93)
219
219
  end
220
220
 
221
221
 
@@ -229,15 +229,15 @@ describe Sift::Client do
229
229
  }
230
230
 
231
231
  stub_request(:post, "https://api.siftscience.com/v203/events?return_score=true").
232
- to_return(:status => 200, :body => MultiJson.dump(response_json), :headers => {})
232
+ to_return(:status => 200, :body => MultiJson.dump(response_json), :headers => {"content-type"=>"application/json; charset=UTF-8","content-length"=> "74"})
233
233
 
234
234
  event = "$transaction"
235
235
  properties = valid_transaction_properties
236
236
  response = Sift::Client.new(api_key).track(event, properties, nil, nil, true)
237
- response.ok?.should eq(true)
238
- response.api_status.should eq(0)
239
- response.api_error_message.should eq("OK")
240
- response.body["score_response"]["score"].should eq(0.93)
237
+ expect(response.ok?).to eq(true)
238
+ expect(response.api_status).to eq(0)
239
+ expect(response.api_error_message).to eq("OK")
240
+ expect(response.body["score_response"]["score"]).to eq(0.93)
241
241
  end
242
242
 
243
243
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sift
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.6.2
4
+ version: 1.1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fred Sadaghiani
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-09-19 00:00:00.000000000 Z
12
+ date: 2015-02-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -124,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
124
  version: '0'
125
125
  requirements: []
126
126
  rubyforge_project: sift
127
- rubygems_version: 2.1.11
127
+ rubygems_version: 2.2.2
128
128
  signing_key:
129
129
  specification_version: 4
130
130
  summary: Sift Science Ruby API Gem