sift 1.0.12 → 1.0.13
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.
- data/examples/simple.rb +26 -12
- data/lib/sift.rb +5 -0
- data/lib/sift/client.rb +38 -7
- data/lib/sift/version.rb +1 -1
- data/sift.gemspec +3 -3
- data/spec/unit/client_label_spec.rb +36 -0
- metadata +12 -10
data/examples/simple.rb
CHANGED
@@ -6,7 +6,16 @@ require 'rubygems'
|
|
6
6
|
require 'sift'
|
7
7
|
require 'multi_json'
|
8
8
|
|
9
|
-
|
9
|
+
TIMEOUT = 5
|
10
|
+
|
11
|
+
if ARGV.length.zero?
|
12
|
+
puts "Please specify an API key"
|
13
|
+
puts "usage:"
|
14
|
+
puts " ruby simple <API KEY>"
|
15
|
+
puts
|
16
|
+
exit
|
17
|
+
end
|
18
|
+
api_key = ARGV[0];
|
10
19
|
|
11
20
|
class MyLogger
|
12
21
|
def warn(e)
|
@@ -26,25 +35,30 @@ class MyLogger
|
|
26
35
|
end
|
27
36
|
end
|
28
37
|
|
38
|
+
def handle_response(response)
|
39
|
+
if response.nil?
|
40
|
+
puts 'Error: there was an HTTP error calling through the API'
|
41
|
+
else
|
42
|
+
puts 'Successfully sent request; was ok? : ' + response.ok?.to_s
|
43
|
+
puts 'API error message : ' + response.api_error_message.to_s
|
44
|
+
puts 'API status code : ' + response.api_status.to_s
|
45
|
+
puts 'HTTP status code : ' + response.http_status_code.to_s
|
46
|
+
puts 'original request : ' + response.original_request.to_s
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
29
50
|
Sift.logger = MyLogger.new
|
30
51
|
|
31
52
|
client = Sift::Client.new(api_key)
|
53
|
+
user_id = "3"
|
32
54
|
event = "my_custom_event"
|
33
55
|
properties = {
|
34
56
|
"my_custom_field1" => "my custom value 1",
|
35
57
|
"my_custom_field2" => "my custom value 2",
|
36
|
-
"$user_id" =>
|
58
|
+
"$user_id" => user_id,
|
37
59
|
"$time" => Time.now.to_i,
|
38
60
|
}
|
39
61
|
|
40
|
-
|
41
|
-
|
42
|
-
puts 'Error: there was an HTTP error calling through the API'
|
43
|
-
else
|
44
|
-
puts 'Successfully sent request; was ok? : ' + response.ok?.to_s
|
45
|
-
puts 'API error message : ' + response.api_error_message.to_s
|
46
|
-
puts 'API status code : ' + response.api_status.to_s
|
47
|
-
puts 'HTTP status code : ' + response.http_status_code.to_s
|
48
|
-
puts 'original request : ' + response.original_request.to_s
|
49
|
-
end
|
62
|
+
handle_response client.track(event, properties, TIMEOUT)
|
63
|
+
handle_response client.label(user_id, {"$is_bad" => true, "$reasons" => ["$chargeback", "$spam"], "$description" => "free form text here" }, TIMEOUT)
|
50
64
|
|
data/lib/sift.rb
CHANGED
@@ -8,6 +8,11 @@ module Sift
|
|
8
8
|
"/v202/events"
|
9
9
|
end
|
10
10
|
|
11
|
+
def self.current_users_label_api_path(user_id)
|
12
|
+
# This API version is a minor version ahead of the /events API
|
13
|
+
"/v203/users/#{URI.encode(user_id)}/labels"
|
14
|
+
end
|
15
|
+
|
11
16
|
# Sets the Output logger to use within the client. This can be left uninitializaed
|
12
17
|
# but is useful for debugging.
|
13
18
|
def self.logger=(logger)
|
data/lib/sift/client.rb
CHANGED
@@ -76,28 +76,33 @@ module Sift
|
|
76
76
|
# A hash of name-value pairs that specify the event-specific attributes to track.
|
77
77
|
# This parameter must be specified.
|
78
78
|
#
|
79
|
-
# timeout
|
79
|
+
# timeout (optional)
|
80
80
|
# The number of seconds to wait before failing the request. By default this is
|
81
81
|
# configured to 2 seconds (see above). This parameter is optional.
|
82
82
|
#
|
83
|
+
# path (optional)
|
84
|
+
# Overrides the default API path with a different URL.
|
85
|
+
#
|
86
|
+
#
|
83
87
|
# == Returns:
|
84
88
|
# In the case of an HTTP error (timeout, broken connection, etc.), this
|
85
89
|
# method returns nil; otherwise, a Response object is returned and captures
|
86
90
|
# the status message and status code. In general, you can ignore the returned
|
87
91
|
# result, though.
|
88
92
|
#
|
89
|
-
def track(event, properties = {}, timeout = nil)
|
93
|
+
def track(event, properties = {}, timeout = nil, path = nil)
|
90
94
|
|
91
95
|
raise(RuntimeError, "event must be a string") if event.nil? || event.to_s.empty?
|
92
96
|
raise(RuntimeError, "properties cannot be empty") if properties.empty?
|
93
97
|
|
98
|
+
path ||= @path
|
94
99
|
options = {
|
95
100
|
:body => MultiJson.dump(properties.merge({"$type" => event,
|
96
101
|
"$api_key" => @api_key})),
|
97
102
|
}
|
98
103
|
options.merge!(:timeout => timeout) unless timeout.nil?
|
99
104
|
begin
|
100
|
-
response = self.class.post(
|
105
|
+
response = self.class.post(path, options)
|
101
106
|
Response.new(response.body, response.code)
|
102
107
|
rescue StandardError => e
|
103
108
|
Sift.warn("Failed to track event: " + e.to_s)
|
@@ -114,17 +119,43 @@ module Sift
|
|
114
119
|
# event calls.
|
115
120
|
#
|
116
121
|
# == Returns:
|
117
|
-
# A Response object is returned and captures
|
118
|
-
#
|
119
|
-
# result, though.
|
122
|
+
# A Response object is returned and captures the status message and
|
123
|
+
# status code. In general, you can ignore the returned result, though.
|
120
124
|
#
|
121
125
|
def score(user_id)
|
122
126
|
|
123
127
|
raise(RuntimeError, "user_id must be a string") if user_id.nil? || user_id.to_s.empty?
|
124
128
|
|
125
|
-
response = self.class.get('/v203/score/'+user_id)
|
129
|
+
response = self.class.get('/v203/score/' + user_id)
|
126
130
|
Response.new(response.body, response.code)
|
127
131
|
|
128
132
|
end
|
133
|
+
|
134
|
+
# Labels a user as either good or bad. This call is blocking.
|
135
|
+
#
|
136
|
+
# == Parameters:
|
137
|
+
# user_id
|
138
|
+
# A user's id. This id should be the same as the user_id used in
|
139
|
+
# event calls.
|
140
|
+
#
|
141
|
+
# properties
|
142
|
+
# A hash of name-value pairs that specify the label attributes.
|
143
|
+
# This parameter must be specified.
|
144
|
+
#
|
145
|
+
# timeout (optional)
|
146
|
+
# The number of seconds to wait before failing the request. By default this is
|
147
|
+
# configured to 2 seconds (see above). This parameter is optional.
|
148
|
+
#
|
149
|
+
# == Returns:
|
150
|
+
# A Response object is returned and captures the status message and
|
151
|
+
# status code. In general, you can ignore the returned result, though.
|
152
|
+
#
|
153
|
+
def label(user_id, properties = {}, timeout = nil)
|
154
|
+
|
155
|
+
raise(RuntimeError, "user_id must be a string") if user_id.nil? || user_id.to_s.empty?
|
156
|
+
|
157
|
+
path = Sift.current_users_label_api_path(user_id)
|
158
|
+
track("$label", properties, timeout, path)
|
159
|
+
end
|
129
160
|
end
|
130
161
|
end
|
data/lib/sift/version.rb
CHANGED
data/sift.gemspec
CHANGED
@@ -20,12 +20,12 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.require_paths = ["lib"]
|
21
21
|
|
22
22
|
# Gems that must be intalled for sift to compile and build
|
23
|
-
s.add_development_dependency "rspec", "~> 2.
|
23
|
+
s.add_development_dependency "rspec", "~> 2.14.1"
|
24
24
|
s.add_development_dependency "fakeweb", "~> 1.3.0"
|
25
25
|
|
26
26
|
# Gems that must be intalled for sift to work
|
27
|
-
s.add_dependency "httparty", ">= 0.
|
28
|
-
s.add_dependency "multi_json", ">= 1.
|
27
|
+
s.add_dependency "httparty", ">= 0.12.0"
|
28
|
+
s.add_dependency "multi_json", ">= 1.8.2"
|
29
29
|
|
30
30
|
s.add_development_dependency("rspec", ">= 2.0")
|
31
31
|
s.add_development_dependency("rake")
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
|
2
|
+
|
3
|
+
describe Sift::Client do
|
4
|
+
|
5
|
+
def valid_label_properties
|
6
|
+
{
|
7
|
+
:$reasons => [ "$fake" ],
|
8
|
+
:$is_bad => true,
|
9
|
+
:$description => "Listed a fake item"
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def fully_qualified_users_labels_endpoint(user_id)
|
14
|
+
Sift::Client::API_ENDPOINT + Sift.current_users_label_api_path(user_id)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "Successfuly handles a $label with the v203 API and returns OK" do
|
18
|
+
|
19
|
+
response_json = { :status => 0, :error_message => "OK" }
|
20
|
+
user_id = "frodo_baggins"
|
21
|
+
|
22
|
+
FakeWeb.register_uri(:post, fully_qualified_users_labels_endpoint(user_id),
|
23
|
+
:body => MultiJson.dump(response_json),
|
24
|
+
:status => [Net::HTTPOK, "OK"],
|
25
|
+
:content_type => "text/json")
|
26
|
+
|
27
|
+
api_key = "foobar"
|
28
|
+
properties = valid_label_properties
|
29
|
+
|
30
|
+
response = Sift::Client.new(api_key).label(user_id, properties)
|
31
|
+
response.ok?.should eq(true)
|
32
|
+
response.api_status.should eq(0)
|
33
|
+
response.api_error_message.should eq("OK")
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
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.0.
|
4
|
+
version: 1.0.13
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-10-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 2.
|
21
|
+
version: 2.14.1
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 2.
|
29
|
+
version: 2.14.1
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: fakeweb
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - ! '>='
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.
|
53
|
+
version: 0.12.0
|
54
54
|
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,7 +58,7 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
61
|
+
version: 0.12.0
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: multi_json
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
requirements:
|
67
67
|
- - ! '>='
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 1.
|
69
|
+
version: 1.8.2
|
70
70
|
type: :runtime
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -74,7 +74,7 @@ dependencies:
|
|
74
74
|
requirements:
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version: 1.
|
77
|
+
version: 1.8.2
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
79
|
name: rspec
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
@@ -126,6 +126,7 @@ files:
|
|
126
126
|
- sift.gemspec
|
127
127
|
- spec/integration/sift_spec.rb
|
128
128
|
- spec/spec_helper.rb
|
129
|
+
- spec/unit/client_label_spec.rb
|
129
130
|
- spec/unit/client_spec.rb
|
130
131
|
- spec/unit/sift_spec.rb
|
131
132
|
homepage: http://siftscience.com
|
@@ -142,7 +143,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
142
143
|
version: '0'
|
143
144
|
segments:
|
144
145
|
- 0
|
145
|
-
hash:
|
146
|
+
hash: 4230512473263984627
|
146
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
148
|
none: false
|
148
149
|
requirements:
|
@@ -151,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
151
152
|
version: '0'
|
152
153
|
segments:
|
153
154
|
- 0
|
154
|
-
hash:
|
155
|
+
hash: 4230512473263984627
|
155
156
|
requirements: []
|
156
157
|
rubyforge_project: sift
|
157
158
|
rubygems_version: 1.8.25
|
@@ -161,5 +162,6 @@ summary: Sift Science Ruby API Gem
|
|
161
162
|
test_files:
|
162
163
|
- spec/integration/sift_spec.rb
|
163
164
|
- spec/spec_helper.rb
|
165
|
+
- spec/unit/client_label_spec.rb
|
164
166
|
- spec/unit/client_spec.rb
|
165
167
|
- spec/unit/sift_spec.rb
|