sift 2.0.0.0 → 2.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.
- checksums.yaml +4 -4
- data/README.md +225 -0
- data/lib/sift.rb +2 -2
- data/lib/sift/client.rb +56 -13
- data/lib/sift/client/decision.rb +67 -0
- data/lib/sift/client/decision/apply_to.rb +104 -0
- data/lib/sift/error.rb +13 -0
- data/lib/sift/router.rb +41 -0
- data/lib/sift/utils/hash_getter.rb +15 -0
- data/lib/sift/validate/decision.rb +53 -0
- data/lib/sift/validate/primitive.rb +43 -0
- data/lib/sift/version.rb +1 -1
- data/sift.gemspec +2 -1
- data/spec/fixtures/fake_responses.rb +16 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/unit/client/decision/apply_to_spec.rb +183 -0
- data/spec/unit/client/decision_spec.rb +83 -0
- data/spec/unit/client_203_spec.rb +2 -1
- data/spec/unit/client_label_spec.rb +2 -3
- data/spec/unit/client_spec.rb +3 -3
- data/spec/unit/router_spec.rb +37 -0
- data/spec/unit/validate/decision_spec.rb +85 -0
- data/spec/unit/validate/primitive_spec.rb +73 -0
- metadata +39 -8
- data/README.rdoc +0 -110
- data/spec/unit/sift_spec.rb +0 -6
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
require_relative "../spec_helper"
|
2
|
+
require "sift"
|
2
3
|
|
3
4
|
describe Sift::Client do
|
4
5
|
|
@@ -41,7 +42,6 @@ describe Sift::Client do
|
|
41
42
|
|
42
43
|
|
43
44
|
it "Successfully handles an $unlabel and returns OK" do
|
44
|
-
response_json = { :status => 0, :error_message => "OK" }
|
45
45
|
user_id = "frodo_baggins"
|
46
46
|
|
47
47
|
stub_request(:delete,
|
@@ -77,7 +77,6 @@ describe Sift::Client do
|
|
77
77
|
|
78
78
|
|
79
79
|
it "Successfully handles an $unlabel with the v203 API endpoing and returns OK" do
|
80
|
-
response_json = { :status => 0, :error_message => "OK" }
|
81
80
|
user_id = "frodo_baggins"
|
82
81
|
|
83
82
|
stub_request(:delete,
|
data/spec/unit/client_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
require_relative "../spec_helper"
|
2
|
+
require "sift"
|
2
3
|
|
3
4
|
describe Sift::Client do
|
4
5
|
|
@@ -104,7 +105,6 @@ describe Sift::Client do
|
|
104
105
|
|
105
106
|
|
106
107
|
it "Cannot instantiate client with empty, non-string, or blank path" do
|
107
|
-
api_key = "test_local_api_key"
|
108
108
|
expect(lambda { Sift::Client.new(:path => "") }).to raise_error(StandardError)
|
109
109
|
expect(lambda { Sift::Client.new(:path => 123456) }).to raise_error(StandardError)
|
110
110
|
end
|
@@ -373,7 +373,7 @@ describe Sift::Client do
|
|
373
373
|
response = client.get_user_decisions("example_user")
|
374
374
|
|
375
375
|
expect(response.ok?).to eq(true)
|
376
|
-
expect(response.body["decisions"]["content_abuse"]["decision"]["id"]).to eq("user_decision")
|
376
|
+
expect(response.body["decisions"]["content_abuse"]["decision"]["id"]).to eq("user_decision")
|
377
377
|
end
|
378
378
|
|
379
379
|
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative "../spec_helper"
|
2
|
+
|
3
|
+
require "sift/router"
|
4
|
+
|
5
|
+
module Sift
|
6
|
+
describe Router do
|
7
|
+
let(:path) { "https://example.com" }
|
8
|
+
let(:body) { { question: "Do you wanna go ball?" } }
|
9
|
+
|
10
|
+
describe ".get" do
|
11
|
+
it "with a successful request will return a response object" do
|
12
|
+
stub_request(:get, path)
|
13
|
+
.with(body: MultiJson.dump(body))
|
14
|
+
.to_return(body: MultiJson.dump({ cool: true }))
|
15
|
+
|
16
|
+
response = Router.get(path, { body: body })
|
17
|
+
|
18
|
+
expect(response.ok?).to be(true)
|
19
|
+
expect(response.body["cool"]).to be(true)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "with an unsuccessful request will return a response object" do
|
23
|
+
stub_request(:get, path)
|
24
|
+
.with(body: MultiJson.dump(body))
|
25
|
+
.to_return(body: MultiJson.dump({ cool: false}), status: 403)
|
26
|
+
|
27
|
+
response = Router.get(path, { body: body })
|
28
|
+
|
29
|
+
expect(response.ok?).to be(false)
|
30
|
+
expect(response.body["cool"]).to be(false)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require_relative "../../spec_helper"
|
2
|
+
|
3
|
+
require "sift/validate/decision"
|
4
|
+
|
5
|
+
module Sift
|
6
|
+
module Validate
|
7
|
+
describe Decision do
|
8
|
+
describe "#valid_user?" do
|
9
|
+
it "will return true" do
|
10
|
+
validator = Decision.new(
|
11
|
+
user_id: "hello world",
|
12
|
+
source: :hello_world,
|
13
|
+
analyst: "asdfsadf@heyo.com"
|
14
|
+
)
|
15
|
+
|
16
|
+
expect(validator.valid_user?).to be(true)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "with invalid user_id, will return false" do
|
20
|
+
validator = Decision.new(order_id: "asfasdf")
|
21
|
+
expect(validator.valid_user?).to be(false), "nil user is valid"
|
22
|
+
|
23
|
+
validator = Decision.new(order_id: "asfasdf", user_id: {})
|
24
|
+
expect(validator.valid_user?).to be(false), "user hash is valid"
|
25
|
+
|
26
|
+
validator = Decision.new(order_id: "asfasdf", user_id: /werwer/)
|
27
|
+
expect(validator.valid_user?).to be(false), "regex user is valid"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#valid_order?" do
|
32
|
+
it "will return true with valid configs" do
|
33
|
+
validator = Decision.new(
|
34
|
+
order_id: "order_foo_bar_12354",
|
35
|
+
user_id: "hello world",
|
36
|
+
source: :hello_world,
|
37
|
+
analyst: "asdfsadf@heyo.com"
|
38
|
+
)
|
39
|
+
|
40
|
+
expect(validator.valid_order?).to be(true)
|
41
|
+
end
|
42
|
+
|
43
|
+
context "with invalid params:" do
|
44
|
+
it "user_id, will return false" do
|
45
|
+
validator = Decision.new(order_id: "asfasdf")
|
46
|
+
expect(validator.valid_order?).to be(false), "nil user is valid"
|
47
|
+
|
48
|
+
validator = Decision.new(order_id: "asfasdf", user_id: {})
|
49
|
+
expect(validator.valid_order?).to be(false), "user hash is valid"
|
50
|
+
|
51
|
+
validator = Decision.new(order_id: "asfasdf", user_id: /werwer/)
|
52
|
+
expect(validator.valid_order?).to be(false), "regex user is valid"
|
53
|
+
end
|
54
|
+
|
55
|
+
it "order_id, will return false" do
|
56
|
+
validator = Decision.new(user_id: 1235)
|
57
|
+
expect(validator.valid_order?).to be(false)
|
58
|
+
|
59
|
+
validator = Decision.new(user_id: 1235, order_id: {})
|
60
|
+
expect(validator.valid_order?).to be(false)
|
61
|
+
|
62
|
+
validator = Decision.new(user_id: 1235, order_id: /23424/)
|
63
|
+
expect(validator.valid_order?).to be(false)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "#error_messages" do
|
69
|
+
it "will return an array of error messages" do
|
70
|
+
validator = Decision.new
|
71
|
+
|
72
|
+
error_message =
|
73
|
+
"#{Primitive::ERROR_MESSAGES[:non_empty_string]}, got NilClass"
|
74
|
+
|
75
|
+
validator.valid_order?
|
76
|
+
|
77
|
+
expect(validator.error_messages).to contain_exactly(
|
78
|
+
"order_id #{error_message}",
|
79
|
+
"user_id #{error_message}"
|
80
|
+
)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require_relative "../../spec_helper"
|
2
|
+
|
3
|
+
require "sift/validate/primitive"
|
4
|
+
|
5
|
+
module Sift
|
6
|
+
module Validate
|
7
|
+
describe Primitive do
|
8
|
+
describe ".non_empty_string" do
|
9
|
+
it "will return nil for valid values" do
|
10
|
+
expect(Primitive.non_empty_string("foobar")).to be_nil
|
11
|
+
end
|
12
|
+
|
13
|
+
it "will return an error message" do
|
14
|
+
[nil, 1, /asdfasdf/].each do |value|
|
15
|
+
error_message = "#{Primitive::ERROR_MESSAGES[:non_empty_string]}" \
|
16
|
+
", got #{value.class}"
|
17
|
+
|
18
|
+
expect(Primitive.non_empty_string(value)).to eq(error_message)
|
19
|
+
end
|
20
|
+
|
21
|
+
expect(Primitive.non_empty_string("")).to(
|
22
|
+
eq(Primitive.send(:empty_string_message, :non_empty_string))
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe ".is_numeric" do
|
28
|
+
it "will return nil for numeric values" do
|
29
|
+
[1, 29.01, 29 ** 1992848499198, -2].each do |value|
|
30
|
+
expect(Primitive.numeric(value)).to(
|
31
|
+
be_nil,
|
32
|
+
"#{value} is a non numeric value"
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it "will return an error message for non numeric values" do
|
38
|
+
["foobar", nil, :hello_world, {}].each do |value|
|
39
|
+
expect(Primitive.numeric(value)).to(
|
40
|
+
be(Primitive::ERROR_MESSAGES[:numeric]),
|
41
|
+
"#{value} is a numeric value"
|
42
|
+
)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe ".is_string_or_number?" do
|
48
|
+
it "will return nil for numeric or strings" do
|
49
|
+
[1234, "asdfasdf", "1234_asdfsdf"].each do |value|
|
50
|
+
expect(Primitive.string_or_number(value)).to(
|
51
|
+
be_nil,
|
52
|
+
"#{value} is a non numeric value"
|
53
|
+
)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it "will return an error message for any other type" do
|
58
|
+
[{}, [], :hello_world, nil].each do |value|
|
59
|
+
error_message = "#{Primitive::ERROR_MESSAGES[:string_or_number]}," \
|
60
|
+
" got #{value.class}"
|
61
|
+
|
62
|
+
expect(Primitive.string_or_number(value)).to eq(error_message)
|
63
|
+
end
|
64
|
+
|
65
|
+
error_message = "#{Primitive::ERROR_MESSAGES[:string_or_number]}, " \
|
66
|
+
"got an empty string"
|
67
|
+
expect(Primitive.string_or_number("")).to eq(error_message)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
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: 2.
|
4
|
+
version: 2.1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fred Sadaghiani
|
@@ -10,22 +10,36 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2017-01-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - "~>"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.5'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - "~>"
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '3.5'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: pry
|
17
31
|
requirement: !ruby/object:Gem::Requirement
|
18
32
|
requirements:
|
19
33
|
- - ">="
|
20
34
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
35
|
+
version: '0'
|
22
36
|
type: :development
|
23
37
|
prerelease: false
|
24
38
|
version_requirements: !ruby/object:Gem::Requirement
|
25
39
|
requirements:
|
26
40
|
- - ">="
|
27
41
|
- !ruby/object:Gem::Version
|
28
|
-
version:
|
42
|
+
version: '0'
|
29
43
|
- !ruby/object:Gem::Dependency
|
30
44
|
name: webmock
|
31
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,19 +114,31 @@ files:
|
|
100
114
|
- Gemfile
|
101
115
|
- HISTORY
|
102
116
|
- LICENSE
|
103
|
-
- README.
|
117
|
+
- README.md
|
104
118
|
- Rakefile
|
105
119
|
- examples/simple.rb
|
106
120
|
- lib/sift.rb
|
107
121
|
- lib/sift/client.rb
|
122
|
+
- lib/sift/client/decision.rb
|
123
|
+
- lib/sift/client/decision/apply_to.rb
|
124
|
+
- lib/sift/error.rb
|
125
|
+
- lib/sift/router.rb
|
126
|
+
- lib/sift/utils/hash_getter.rb
|
127
|
+
- lib/sift/validate/decision.rb
|
128
|
+
- lib/sift/validate/primitive.rb
|
108
129
|
- lib/sift/version.rb
|
109
130
|
- sift.gemspec
|
131
|
+
- spec/fixtures/fake_responses.rb
|
110
132
|
- spec/integration/sift_spec.rb
|
111
133
|
- spec/spec_helper.rb
|
134
|
+
- spec/unit/client/decision/apply_to_spec.rb
|
135
|
+
- spec/unit/client/decision_spec.rb
|
112
136
|
- spec/unit/client_203_spec.rb
|
113
137
|
- spec/unit/client_label_spec.rb
|
114
138
|
- spec/unit/client_spec.rb
|
115
|
-
- spec/unit/
|
139
|
+
- spec/unit/router_spec.rb
|
140
|
+
- spec/unit/validate/decision_spec.rb
|
141
|
+
- spec/unit/validate/primitive_spec.rb
|
116
142
|
homepage: http://siftscience.com
|
117
143
|
licenses: []
|
118
144
|
metadata: {}
|
@@ -132,14 +158,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
132
158
|
version: '0'
|
133
159
|
requirements: []
|
134
160
|
rubyforge_project: sift
|
135
|
-
rubygems_version: 2.
|
161
|
+
rubygems_version: 2.5.1
|
136
162
|
signing_key:
|
137
163
|
specification_version: 4
|
138
164
|
summary: Sift Science Ruby API Gem
|
139
165
|
test_files:
|
166
|
+
- spec/fixtures/fake_responses.rb
|
140
167
|
- spec/integration/sift_spec.rb
|
141
168
|
- spec/spec_helper.rb
|
169
|
+
- spec/unit/client/decision/apply_to_spec.rb
|
170
|
+
- spec/unit/client/decision_spec.rb
|
142
171
|
- spec/unit/client_203_spec.rb
|
143
172
|
- spec/unit/client_label_spec.rb
|
144
173
|
- spec/unit/client_spec.rb
|
145
|
-
- spec/unit/
|
174
|
+
- spec/unit/router_spec.rb
|
175
|
+
- spec/unit/validate/decision_spec.rb
|
176
|
+
- spec/unit/validate/primitive_spec.rb
|
data/README.rdoc
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
= Sift Science Ruby bindings {<img src="https://travis-ci.org/SiftScience/sift-ruby.png?branch=master" alt="Build Status" />}[https://travis-ci.org/SiftScience/sift-ruby]
|
2
|
-
|
3
|
-
|
4
|
-
== Requirements
|
5
|
-
|
6
|
-
* Ruby 1.8.7 or above. (Ruby 1.8.6 might work if you load ActiveSupport.)
|
7
|
-
* HTTParty, 0.11.0 or greater
|
8
|
-
* Multi Json, 1.0 or greater
|
9
|
-
|
10
|
-
For development only:
|
11
|
-
* bundler
|
12
|
-
* rspec, 2.14.1 or greater
|
13
|
-
* webmock, 1.16 or greater
|
14
|
-
* rake, any version
|
15
|
-
|
16
|
-
|
17
|
-
== Installation
|
18
|
-
|
19
|
-
If you want to build the gem from source:
|
20
|
-
|
21
|
-
$ gem build sift.gemspec
|
22
|
-
|
23
|
-
Alternatively, you can install the gem from Rubyforge:
|
24
|
-
|
25
|
-
$ gem install sift
|
26
|
-
|
27
|
-
|
28
|
-
== Usage
|
29
|
-
|
30
|
-
require "sift"
|
31
|
-
|
32
|
-
Sift.api_key = '<your_api_key_here>'
|
33
|
-
Sift.account_id = '<your_account_id_here>'
|
34
|
-
client = Sift::Client.new()
|
35
|
-
|
36
|
-
# send a transaction event -- note this is blocking
|
37
|
-
event = "$transaction"
|
38
|
-
|
39
|
-
user_id = "23056" # User ID's may only contain a-z, A-Z, 0-9, =, ., -, _, +, @, :, &, ^, %, !, $
|
40
|
-
|
41
|
-
properties = {
|
42
|
-
"$user_id" => user_id,
|
43
|
-
"$user_email" => "buyer@gmail.com",
|
44
|
-
"$seller_user_id" => "2371",
|
45
|
-
"seller_user_email" => "seller@gmail.com",
|
46
|
-
"$transaction_id" => "573050",
|
47
|
-
"$payment_method" => {
|
48
|
-
"$payment_type" => "$credit_card",
|
49
|
-
"$payment_gateway" => "$braintree",
|
50
|
-
"$card_bin" => "542486",
|
51
|
-
"$card_last4" => "4444"
|
52
|
-
},
|
53
|
-
"$currency_code" => "USD",
|
54
|
-
"$amount" => 15230000,
|
55
|
-
}
|
56
|
-
|
57
|
-
response = client.track(event, properties)
|
58
|
-
|
59
|
-
response.ok? # returns true or false
|
60
|
-
response.body # API response body
|
61
|
-
response.http_status_code # HTTP response code, 200 is ok.
|
62
|
-
response.api_status # status field in the return body, Link to Error Codes
|
63
|
-
response.api_error_message # Error message associated with status Error Code
|
64
|
-
|
65
|
-
|
66
|
-
# Request a score for the user with user_id 23056
|
67
|
-
response = client.score(user_id)
|
68
|
-
|
69
|
-
|
70
|
-
# Label the user with user_id 23056 as Bad with all optional fields
|
71
|
-
response = client.label(user_id, {
|
72
|
-
"$is_bad" => true,
|
73
|
-
"$abuse_type" => "payment_abuse",
|
74
|
-
"$description" => "Chargeback issued",
|
75
|
-
"$source" => "Manual Review",
|
76
|
-
"$analyst" => "analyst.name@your_domain.com"
|
77
|
-
})
|
78
|
-
|
79
|
-
|
80
|
-
# Get the status of a workflow run
|
81
|
-
response = client.get_workflow_status('my_run_id')
|
82
|
-
|
83
|
-
|
84
|
-
# Get the latest decisions for a user
|
85
|
-
response = client.get_user_decisions('example_user_id')
|
86
|
-
|
87
|
-
|
88
|
-
# Get the latest decisions for an order
|
89
|
-
response = client.get_order_decisions('example_order_id')
|
90
|
-
|
91
|
-
|
92
|
-
== Building
|
93
|
-
|
94
|
-
Building and publishing the gem is captured by the following steps:
|
95
|
-
|
96
|
-
$ gem build sift.gemspec
|
97
|
-
$ gem push sift-<current version>.gem
|
98
|
-
|
99
|
-
$ bundle
|
100
|
-
$ rake -T
|
101
|
-
$ rake build
|
102
|
-
$ rake install
|
103
|
-
$ rake release
|
104
|
-
|
105
|
-
|
106
|
-
== Testing
|
107
|
-
|
108
|
-
To run the various tests use the rake command as follows:
|
109
|
-
|
110
|
-
$ rake spec
|