castle-rb 3.0.1 → 3.1.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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: '071206458817ceae46b074a971138d80734439d0'
4
- data.tar.gz: 7ae3185a784deb1ea4995cdc0ac732c6cca371e0
3
+ metadata.gz: 40fd82599b83e0b0393c41de08d2be555909b5f3
4
+ data.tar.gz: b9bcfae0cf9eed03bb33ab81c0f1f3ca4a149c0c
5
5
  SHA512:
6
- metadata.gz: 965277364777fe9830a5e5ec65bc6e34ac8f4ff77ba5221622ef3186f3dd85c8766777ed1fa2443ec811d6b7d77df9f4975bb8b0ed6e7f17105fa84d0fd113e7
7
- data.tar.gz: d71bc4bb0dc0dd779536ae2fb8078051a002b7c3aef68c8a648beab98907f187feb9934d4c9b11ebddcb6adfdc0899a31c1b56094c0192812be32aabd776a78b
6
+ metadata.gz: '07275877fa6fdf40f2451955444869f1f3c98f6ca7332edd1ee51b09d4f14da1f3c10cd53f06da70c4e0b65f646df33afcbe352f64720a52e26f677fe17318f1'
7
+ data.tar.gz: d3847b889ede27f92b4a06651e4c085f0f1ba7bab38012966ede3c5304b8b036beb41b7c8626e2bc4a68340f774140c55e7ac118d00c639796dbe291b39f871d
data/README.md CHANGED
@@ -29,7 +29,7 @@ A Castle client instance will be made available as `castle` in your
29
29
 
30
30
  * Sinatra app when you add `require 'castle/support/sinatra'` (and additionally explicitly add `register Sinatra::Castle` to your `Sinatra::Base` class if you have a modular application)
31
31
 
32
- ```
32
+ ```ruby
33
33
  require 'castle/support/sinatra'
34
34
 
35
35
  class ApplicationController < Sinatra::Base
@@ -39,7 +39,7 @@ end
39
39
 
40
40
  * Hanami when you add `require 'castle/support/hanami'` and include `Castle::Hanami` to your Hanami application
41
41
 
42
- ```
42
+ ```ruby
43
43
  require 'castle/support/hanami'
44
44
 
45
45
  module Web
@@ -100,3 +100,37 @@ end
100
100
  ## Signature
101
101
 
102
102
  `Castle::SecureMode.signature(user_id)` will create a signed user_id.
103
+
104
+ ## Async tracking
105
+
106
+ By default Castle sends requests synchronously. To eg. use Sidekiq to send requests in a background worker you can pass data to the worker:
107
+
108
+ #### castle_tracking_worker.rb
109
+
110
+ ```ruby
111
+ class CastleTrackingWorker
112
+ include Sidekiq::Worker
113
+
114
+ def perform(context, track_options = {})
115
+ client = ::Castle::Client.new(context)
116
+ client.track(track_options)
117
+ end
118
+ end
119
+ ```
120
+
121
+ #### tracking_controller.rb
122
+
123
+ ```ruby
124
+ request_context = ::Castle::Client.to_context(request)
125
+ track_options = {
126
+ event: '$login.succeeded',
127
+ user_id: user.id,
128
+ properties: {
129
+ key: 'value'
130
+ },
131
+ traits: {
132
+ key: 'value'
133
+ }
134
+ }
135
+ CastleTrackingWorker.perform_async(request_context, track_options)
136
+ ```
@@ -2,11 +2,22 @@
2
2
 
3
3
  module Castle
4
4
  class Client
5
+ class << self
6
+ def from_request(request, options = {})
7
+ new(to_context(request, options), options[:do_not_track])
8
+ end
9
+
10
+ def to_context(request, options = {})
11
+ default_context = Castle::DefaultContext.new(request, options[:cookies]).call
12
+ Castle::ContextMerger.new(default_context).call(options[:context] || {})
13
+ end
14
+ end
15
+
5
16
  attr_accessor :api
6
17
 
7
- def initialize(request, options = {})
8
- @do_not_track = default_tracking(options)
9
- @context = setup_context(request, options[:cookies], options[:context])
18
+ def initialize(context, do_not_track = false)
19
+ @do_not_track = do_not_track
20
+ @context = context
10
21
  @api = API.new
11
22
  end
12
23
 
@@ -66,9 +77,5 @@ module Castle
66
77
  return failover_response.generate unless Castle.config.failover_strategy == :throw
67
78
  raise error
68
79
  end
69
-
70
- def default_tracking(options)
71
- options.key?(:do_not_track) ? options[:do_not_track] : false
72
- end
73
80
  end
74
81
  end
@@ -4,7 +4,7 @@ module Castle
4
4
  module Hanami
5
5
  module Action
6
6
  def castle
7
- @castle ||= ::Castle::Client.new(request, cookies: (cookies if defined? cookies))
7
+ @castle ||= ::Castle::Client.from_request(request, cookies: (cookies if defined? cookies))
8
8
  end
9
9
  end
10
10
 
@@ -5,7 +5,7 @@ module Padrino
5
5
  module Castle
6
6
  module Helpers
7
7
  def castle
8
- @castle ||= ::Castle::Client.new(request)
8
+ @castle ||= ::Castle::Client.from_request(request)
9
9
  end
10
10
  end
11
11
 
@@ -3,7 +3,7 @@
3
3
  module Castle
4
4
  module CastleClient
5
5
  def castle
6
- @castle ||= request.env['castle'] || Castle::Client.new(request)
6
+ @castle ||= request.env['castle'] || Castle::Client.from_request(request)
7
7
  end
8
8
  end
9
9
 
@@ -6,7 +6,7 @@ module Sinatra
6
6
  module Castle
7
7
  module Helpers
8
8
  def castle
9
- @castle ||= ::Castle::Client.new(request)
9
+ @castle ||= ::Castle::Client.from_request(request)
10
10
  end
11
11
  end
12
12
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Castle
4
- VERSION = '3.0.1'
4
+ VERSION = '3.1.0'
5
5
  end
@@ -11,7 +11,7 @@ describe Castle::Client do
11
11
  )
12
12
  end
13
13
  let(:request) { Rack::Request.new(env) }
14
- let(:client) { described_class.new(request) }
14
+ let(:client) { described_class.from_request(request) }
15
15
  let(:headers) { { 'X-Forwarded-For' => ip.to_s } }
16
16
  let(:context) do
17
17
  {
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: castle-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johan Brissmyr
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-20 00:00:00.000000000 Z
11
+ date: 2017-12-12 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Castle protects your users from account compromise
14
14
  email: johan@castle.io
@@ -92,32 +92,32 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
92
  version: '0'
93
93
  requirements: []
94
94
  rubyforge_project:
95
- rubygems_version: 2.6.13
95
+ rubygems_version: 2.6.14
96
96
  signing_key:
97
97
  specification_version: 4
98
98
  summary: Castle
99
99
  test_files:
100
- - spec/lib/castle/api_spec.rb
100
+ - spec/spec_helper.rb
101
+ - spec/lib/castle_spec.rb
102
+ - spec/lib/castle/review_spec.rb
101
103
  - spec/lib/castle/client_spec.rb
102
- - spec/lib/castle/command_spec.rb
103
- - spec/lib/castle/commands/authenticate_spec.rb
104
- - spec/lib/castle/commands/identify_spec.rb
105
- - spec/lib/castle/commands/review_spec.rb
106
- - spec/lib/castle/commands/track_spec.rb
104
+ - spec/lib/castle/api_spec.rb
107
105
  - spec/lib/castle/configuration_spec.rb
108
- - spec/lib/castle/context_merger_spec.rb
106
+ - spec/lib/castle/version_spec.rb
109
107
  - spec/lib/castle/default_context_spec.rb
110
- - spec/lib/castle/extractors/client_id_spec.rb
111
- - spec/lib/castle/extractors/headers_spec.rb
112
- - spec/lib/castle/extractors/ip_spec.rb
113
108
  - spec/lib/castle/header_formatter_spec.rb
114
- - spec/lib/castle/request_spec.rb
115
- - spec/lib/castle/response_spec.rb
116
- - spec/lib/castle/review_spec.rb
117
- - spec/lib/castle/secure_mode_spec.rb
118
109
  - spec/lib/castle/utils/cloner_spec.rb
119
110
  - spec/lib/castle/utils/merger_spec.rb
111
+ - spec/lib/castle/command_spec.rb
112
+ - spec/lib/castle/request_spec.rb
113
+ - spec/lib/castle/response_spec.rb
114
+ - spec/lib/castle/commands/review_spec.rb
115
+ - spec/lib/castle/commands/authenticate_spec.rb
116
+ - spec/lib/castle/commands/track_spec.rb
117
+ - spec/lib/castle/commands/identify_spec.rb
118
+ - spec/lib/castle/context_merger_spec.rb
119
+ - spec/lib/castle/extractors/ip_spec.rb
120
+ - spec/lib/castle/extractors/headers_spec.rb
121
+ - spec/lib/castle/extractors/client_id_spec.rb
120
122
  - spec/lib/castle/utils_spec.rb
121
- - spec/lib/castle/version_spec.rb
122
- - spec/lib/castle_spec.rb
123
- - spec/spec_helper.rb
123
+ - spec/lib/castle/secure_mode_spec.rb