determinator 0.12.0 → 0.12.1
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/CHANGELOG.md +5 -0
- data/README.md +81 -17
- data/lib/determinator/version.rb +1 -1
- data/lib/rspec/determinator.rb +4 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 17f714ab0a57974a7934bdcf86631e65e4e5111d
|
4
|
+
data.tar.gz: 82caf2b07f4a891cc2621fc1ef72aa8c569347b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 37b01ffc666efd680e085365b61b4516cf3c5300e7b215e98e0dde2e1472ea494f7fc5748f811420f137452ee163ed86488f47360205631cc825e2c896780948
|
7
|
+
data.tar.gz: d974d0c38bf2f3963dfa4661252e9bd41b5ef5d5d11ee3e91a2a85658254ca96d90ec5ae8c1d7b5e332065e7254bd0ff79db4cdb7a091a04a76b2e8094f7fd4a
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -16,24 +16,38 @@ A gem that works with _Florence_ to deterministically calculate whether an **act
|
|
16
16
|
|
17
17
|
For Deliveroo Employees:
|
18
18
|
|
19
|
-
- Many people contribute to Determinator and Florence. We hang out in [this Slack channel](slack
|
19
|
+
- Many people contribute to Determinator and Florence. We hang out in [this Slack channel](https://deliveroo.slack.com/app_redirect?channel=florence_wg)
|
20
20
|
- [This JIRA board](https://deliveroo.atlassian.net/secure/RapidBoard.jspa?rapidView=156) covers pieces of work that are planned or in-flight
|
21
21
|
- [This Workplace group](https://deliveroo.facebook.com/groups/1893254264328414/) holds more general discussions about the Florence ecosystem
|
22
22
|
|
23
23
|
At the moment we can only promise support for Determinator within Deliveroo, but if you add [issues to this github repo](https://github.com/deliveroo/determinator/issues) we'll try and help if we can!
|
24
24
|
|
25
|
-
##
|
25
|
+
## Basic Use
|
26
26
|
|
27
|
-
Once [set up](#installation), determinator can be used to determine whether a **feature flag** or **experiment** is on or off for the current user and, for experiments, which **variant** they should see.
|
27
|
+
Once [set up](#installation), determinator can be used to determine whether a **feature flag** or **experiment** is on or off for the current actor (or user) and, for experiments, which **variant** they should see.
|
28
28
|
|
29
29
|
```ruby
|
30
|
-
# Feature flags
|
30
|
+
# Feature flags: the basics
|
31
|
+
Determinator.instance.feature_flag_on?(:my_feature_name, id: 'some user')
|
32
|
+
# => true
|
33
|
+
Determinator.instance.feature_flag_on?(:my_feature_name, id: 'another user')
|
34
|
+
# => false
|
35
|
+
|
36
|
+
# A handy short cut…
|
37
|
+
def determinator
|
38
|
+
# See the urther Usage section below for a handy shorthand which means ID
|
39
|
+
# and GUID don't need to be specified every time you need a determination.
|
40
|
+
end
|
41
|
+
|
42
|
+
# Which means you can also do:
|
31
43
|
if determinator.feature_flag_on?(:my_feature_name)
|
32
44
|
# Show the feature
|
33
45
|
end
|
34
46
|
|
35
47
|
# Experiments
|
36
48
|
case determinator.which_variant(:my_experiment_name)
|
49
|
+
when false
|
50
|
+
# This actor isn't in a target group for this experiment
|
37
51
|
when 'control'
|
38
52
|
# Do nothing different
|
39
53
|
when 'sloths'
|
@@ -43,7 +57,9 @@ when 'velociraptors'
|
|
43
57
|
end
|
44
58
|
```
|
45
59
|
|
46
|
-
|
60
|
+
Please note that Determinator requires an identifier for your actor — either an ID (when they are logged in, eg. a user id), or a globally unique id (GUID) that identifies them across sessions (which would normally be storied in a cookie or in a long-lived session store).
|
61
|
+
|
62
|
+
Feature flags and experiments can be limited to actors with specific properties by specifying them when (which must match the constraints defined in the feature).
|
47
63
|
|
48
64
|
```ruby
|
49
65
|
# Targeting specific actors
|
@@ -59,13 +75,9 @@ Writing tests? Check out the [Local development](docs/local_development.md) docs
|
|
59
75
|
|
60
76
|
## Installation
|
61
77
|
|
62
|
-
Determinator requires your application
|
63
|
-
|
64
|
-
The drain must expire the routemaster cache on receipt of events, `Routemaster::Drain::CacheBusting.new` or better.
|
65
|
-
|
66
|
-
Check the example Rails app in `examples` for more information on how to make use of this gem.
|
78
|
+
Determinator requires a initialiser block somewhere in your application's boot process, it might look something like this:
|
67
79
|
|
68
|
-
```
|
80
|
+
```ruby
|
69
81
|
# config/initializers/determinator.rb
|
70
82
|
|
71
83
|
require 'determinator/retrieve/routemaster'
|
@@ -79,38 +91,90 @@ Determinator.configure(
|
|
79
91
|
)
|
80
92
|
```
|
81
93
|
|
82
|
-
|
94
|
+
This configures the `Determinator.instance` with:
|
95
|
+
|
96
|
+
- What **retrieval** mechanism should be used to get feature details
|
97
|
+
- (optional) How **errors** should be reported
|
98
|
+
- (optional) How **missing features** should be monitored (as they indicate something's up with your code or your set up!)
|
83
99
|
|
84
|
-
|
100
|
+
You may also want to configure a `determinator` helper method inside your web request scope, see below for more information.
|
85
101
|
|
102
|
+
## Further Usage
|
86
103
|
|
104
|
+
Once this is done you can ask for a determination like this:
|
105
|
+
|
106
|
+
```ruby
|
107
|
+
# Anywhere in your application:
|
108
|
+
variant = Determinator.instance.which_variant?(
|
109
|
+
:my_experiment_name,
|
110
|
+
id: 123,
|
111
|
+
guid: 'anonymous id',
|
112
|
+
properties: {
|
113
|
+
employee: true,
|
114
|
+
using_top_level_domain: 'uk'
|
115
|
+
}
|
116
|
+
)
|
87
117
|
```
|
88
|
-
require 'rspec/determinator'
|
89
118
|
|
90
|
-
|
119
|
+
Or, if you're within a web request, you might want to use a shorthand, and let determinator remember the ID, GUID and any properties which will be true. The following will have the same effect:
|
91
120
|
|
121
|
+
```ruby
|
122
|
+
# Somewhere inside your request's scope:
|
123
|
+
def determinator
|
124
|
+
@determinator ||= Determinator.instance.for_actor(
|
125
|
+
id: 123,
|
126
|
+
guid: 'anonymous id',
|
127
|
+
default_properties: {
|
128
|
+
employee: true,
|
129
|
+
using_top_level_domain: 'uk'
|
130
|
+
}
|
131
|
+
)
|
132
|
+
end
|
133
|
+
|
134
|
+
# Anywhere in your requests' scope:
|
135
|
+
determinator.which_variant(:my_experiment_name)
|
92
136
|
```
|
93
137
|
|
94
|
-
|
138
|
+
Check the example Rails app in the `examples` directory for more information on how to make use of this gem.
|
139
|
+
|
140
|
+
### Routemaster
|
141
|
+
|
142
|
+
Determinator's [Routemaster](https://github.com/deliveroo/routemaster) integration requires your application to be subscribed to the a `features` topic.
|
143
|
+
|
144
|
+
The drain must expire the routemaster cache on receipt of events, making use of `Routemaster::Drain::CacheBusting.new` or similar is recommended.
|
145
|
+
|
146
|
+
### Using Determinator in RSpec
|
147
|
+
|
148
|
+
* Include the `spec_helper.rb`.
|
95
149
|
|
150
|
+
```ruby
|
151
|
+
require 'rspec/determinator'
|
96
152
|
|
153
|
+
Determinator.configure(retrieval: nil)
|
97
154
|
```
|
98
155
|
|
156
|
+
* Tag your rspec test with `:determinator_support`, so the `forced_determination` helper method will be available.
|
157
|
+
|
158
|
+
```ruby
|
99
159
|
RSpec.describe "something", :determinator_support do
|
100
160
|
|
101
161
|
context "something" do
|
102
162
|
forced_determination(:my_feature_flag, true)
|
103
163
|
forced_determination(:my_experiment, "variant_a")
|
164
|
+
forced_determination(:my_lazyexperiment, :some_lazy_variable)
|
165
|
+
let(:some_lazy_variable) { 'variant_b' }
|
104
166
|
|
105
167
|
it "uses forced_determination" do
|
106
168
|
expect(Determinator.instance.feature_flag_on?(:my_feature_flag)).to eq(true)
|
107
169
|
expect(Determinator.instance.which_variant(:my_experiment)).to eq("variant_a")
|
170
|
+
expect(Determinator.instance.which_variant(:my_lazy_experiment)).to eq("variant_b")
|
108
171
|
end
|
109
172
|
end
|
110
173
|
end
|
111
|
-
|
112
174
|
```
|
113
175
|
|
176
|
+
* Check out [the specs for `RSpec::Determinator`](spec/rspec/determinator_spec.rb) to find out what you can do!
|
177
|
+
|
114
178
|
### Retrieval Cache
|
115
179
|
|
116
180
|
Determinator will function fully without a retrieval_cache set, although Determinator will produce 1 Redis query for every determination. By setting a `retrieval_cache` as an instance of `ActiveSupport::Cache::MemoryStore` (or equivalent) this can be reduced per application instance. This cache is not expired so *must* have a `expires_in` set, ideally to a short amount of time.
|
data/lib/determinator/version.rb
CHANGED
data/lib/rspec/determinator.rb
CHANGED
@@ -40,6 +40,10 @@ module RSpec
|
|
40
40
|
@mocked_results = Hash.new { |h, k| h[k] = {} }
|
41
41
|
end
|
42
42
|
|
43
|
+
def for_actor(**args)
|
44
|
+
::Determinator::ActorControl.new(self, **args)
|
45
|
+
end
|
46
|
+
|
43
47
|
def mock_result(name, result, only_for: {})
|
44
48
|
@mocked_results[name.to_s][only_for] = result
|
45
49
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: determinator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.12.
|
4
|
+
version: 0.12.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- JP Hastings-Spital
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01
|
11
|
+
date: 2018-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: routemaster-drain
|