test_track_rails_client 4.0.0.alpha35 → 4.0.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +14 -13
- data/Rakefile +1 -1
- data/app/models/test_track/ab_configuration.rb +1 -1
- data/app/models/test_track/config_updater.rb +3 -3
- data/app/models/test_track/fake/split_registry.rb +2 -2
- data/app/models/test_track/lazy_visitor_by_identity.rb +7 -3
- data/app/models/test_track/remote/assignment_event.rb +1 -1
- data/app/models/test_track/remote/identifier.rb +1 -1
- data/app/models/test_track/remote/identifier_type.rb +1 -1
- data/app/models/test_track/remote/split_config.rb +1 -1
- data/app/models/test_track/remote/split_detail.rb +2 -2
- data/app/models/test_track/remote/split_registry.rb +2 -2
- data/app/models/test_track/remote/visitor.rb +2 -2
- data/app/models/test_track/remote/visitor_detail.rb +1 -1
- data/app/models/test_track/split_registry.rb +2 -2
- data/app/models/test_track/threaded_visitor_notifier.rb +6 -8
- data/app/models/test_track/unsynced_assignments_notifier.rb +4 -6
- data/app/models/test_track/visitor.rb +4 -4
- data/config/initializers/set_build_timestamp.rb +1 -0
- data/lib/tasks/test_track_rails_client_tasks.rake +21 -0
- data/lib/test_track.rb +26 -0
- data/lib/test_track_rails_client/engine.rb +4 -2
- data/lib/test_track_rails_client/version.rb +1 -1
- data/vendor/bin/testtrack-cli/testtrack.darwin +0 -0
- data/vendor/bin/testtrack-cli/testtrack.linux +0 -0
- metadata +124 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f37de9c3a15f87656bada30d35900017f179c5abf99b4e74d832895d91a3a27
|
4
|
+
data.tar.gz: a358c5852dd1e3a9b952988f9a408cdc283f248a0e66046fdf22ea6dfaab1c02
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7a5fc21e79ea77a942f41c720ce32ef57c69ee522d1100e7af742e53cacc4dc056644366001db301fc6d7509fcad6fca9127d184c7484916ee946fd7e3e847f
|
7
|
+
data.tar.gz: d11e1f581f82883933e8d3d0854e98434bd3908249496b8d55115c1420482f52ee82ba908295c0e8b67e3bca0cc57867d4e987f47020952a9a1200bbb84f9182
|
data/README.md
CHANGED
@@ -50,7 +50,7 @@ Set up ENV vars in every environment:
|
|
50
50
|
* `TEST_TRACK_API_URL` - Set this to the URL of your TestTrack instance with your app credentials, e.g. `http://[myapp]:[your new app password]@[your-app-domain]/`
|
51
51
|
|
52
52
|
[your-app-domain] can be
|
53
|
-
* `testtrack.
|
53
|
+
* `testtrack.test`
|
54
54
|
* `localhost:PORT`
|
55
55
|
* `example.org`
|
56
56
|
* etc
|
@@ -72,8 +72,8 @@ If your app doesn't support authentication, set
|
|
72
72
|
|
73
73
|
### Prepare your identity models (optional)
|
74
74
|
|
75
|
-
If your app supports authentication,
|
76
|
-
`User` model as a [TestTrack Identity](#varying-app-behavior-from-within-a-model)
|
75
|
+
If your app supports authentication, you'll need to configure your
|
76
|
+
`User` model as a [TestTrack Identity](#varying-app-behavior-from-within-a-model).
|
77
77
|
|
78
78
|
### Set up the Chrome extension (optional)
|
79
79
|
|
@@ -288,7 +288,7 @@ class BackgroundWorkJob
|
|
288
288
|
end
|
289
289
|
end
|
290
290
|
end
|
291
|
-
```
|
291
|
+
```
|
292
292
|
|
293
293
|
## Tracking visitor logins
|
294
294
|
|
@@ -391,28 +391,29 @@ def notify(message)
|
|
391
391
|
|
392
392
|
### From 3.0 to 4.0
|
393
393
|
|
394
|
-
The contract of custom analytics plugins has changed. Instead of
|
394
|
+
* The contract of custom analytics plugins has changed. Instead of
|
395
395
|
implementing `track_assignment` you now must implement `track`. It's
|
396
396
|
easier and more conventional, though, and takes care of differentiating
|
397
|
-
between
|
397
|
+
between experiment assignments and feature gate experiences, which are
|
398
398
|
no longer recorded server-side.
|
399
399
|
|
400
|
-
You
|
400
|
+
* You must add `self.test_track_identity = :current_user` (or
|
401
401
|
whatever your controller uses as a sign-in identity) to your
|
402
402
|
TestTrack-enabled controllers, or set it to `:none` if your app doesn't
|
403
|
-
support authentication.
|
403
|
+
support authentication. If your app supports authentication, you'll need to configure your
|
404
|
+
user model as a [TestTrack Identity](#varying-app-behavior-from-within-a-model).
|
404
405
|
|
405
|
-
If your
|
406
|
-
user model as a [TestTrack Identity](#varying-app-behavior-from-within-a-model)
|
406
|
+
* TestTrack server [introduced a new endpoint](https://github.com/Betterment/test_track/pull/133) for fetching the split registry that requires a timestamp of when the application was built. This prevents dropped splits from breaking a running application. If you use `rake assets:precompile` in your build pipeline, you're all set. If you don't, you'll need to call `rake test_track:generate_build_timestamp` and ensure that the file `testtrack/build_timestamp` is deployed along with your app.
|
407
407
|
|
408
408
|
### From 2.0 to 3.0
|
409
409
|
|
410
|
-
TestTrack Rails Client no longer manages your Mixpanel cookie. The analytics plugin now provides a callback on `sign_up!` that will allow you to implement this functionality within your application. Please see the [analytics documentation](#analytics) for more details.
|
411
|
-
|
410
|
+
* TestTrack Rails Client no longer manages your Mixpanel cookie. The analytics plugin now provides a callback on `sign_up!` that will allow you to implement this functionality within your application. Please see the [analytics documentation](#analytics) for more details.
|
411
|
+
|
412
|
+
* `TestTrack.analytics#track_assignment` no longer accepts a properties hash as an argument as `mixpanel_distinct_id` is no longer relevant.
|
412
413
|
|
413
414
|
### From 1.x to 1.3
|
414
415
|
|
415
|
-
`TestTrack::Session#log_in!` and `TestTrack:Session#sign_up!` now take a `TestTrack::Identity` instance argument instead of an identity type and identity value.
|
416
|
+
* `TestTrack::Session#log_in!` and `TestTrack:Session#sign_up!` now take a `TestTrack::Identity` instance argument instead of an identity type and identity value.
|
416
417
|
|
417
418
|
## How to Contribute
|
418
419
|
|
data/Rakefile
CHANGED
@@ -29,7 +29,7 @@ RuboCop::RakeTask.new
|
|
29
29
|
desc "Pull the latest versions of all dependencies into the gem for distribution"
|
30
30
|
task :vendor_deps do
|
31
31
|
TEST_TRACK_JS_CLIENT_VERSION = '2.0.0-alpha.4'.freeze
|
32
|
-
TEST_TRACK_CLI_VERSION = 'v1.
|
32
|
+
TEST_TRACK_CLI_VERSION = 'v1.1.2'.freeze
|
33
33
|
|
34
34
|
# Bundle JS client
|
35
35
|
sh 'npm init -y'
|
@@ -20,7 +20,7 @@ class TestTrack::ABConfiguration
|
|
20
20
|
|
21
21
|
def build_variant_hash
|
22
22
|
notify_because_ab("configures split with more than 2 variants") if split_variants && split_variants.size > 2
|
23
|
-
{ true: true_variant, false: false_variant }
|
23
|
+
{ true: true_variant, false: false_variant } # rubocop:disable Lint/BooleanSymbol
|
24
24
|
end
|
25
25
|
|
26
26
|
def true_variant
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class TestTrack::ConfigUpdater
|
2
|
-
def initialize(schema_file_path = Rails.root.join('db
|
2
|
+
def initialize(schema_file_path = Rails.root.join('db/test_track_schema.yml'))
|
3
3
|
@schema_file_path = schema_file_path
|
4
4
|
end
|
5
5
|
|
@@ -75,7 +75,7 @@ class TestTrack::ConfigUpdater
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def unpersisted_split_names
|
78
|
-
@
|
78
|
+
@unpersisted_split_names ||= splits.keys - remote_splits.keys
|
79
79
|
end
|
80
80
|
|
81
81
|
def splits
|
@@ -90,7 +90,7 @@ class TestTrack::ConfigUpdater
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def schema_file_hash
|
93
|
-
@
|
93
|
+
@schema_file_hash ||= YAML.safe_load(schema_file_contents) || {}
|
94
94
|
end
|
95
95
|
|
96
96
|
def schema_file_contents
|
@@ -57,12 +57,12 @@ class TestTrack::Fake::SplitRegistry
|
|
57
57
|
def _legacy_test_track_schema_yml
|
58
58
|
File.exist?(legacy_test_track_schema_yml_path) &&
|
59
59
|
YAML.load_file(legacy_test_track_schema_yml_path).with_indifferent_access
|
60
|
-
rescue
|
60
|
+
rescue StandardError
|
61
61
|
nil
|
62
62
|
end
|
63
63
|
|
64
64
|
def legacy_test_track_schema_yml_path
|
65
|
-
ENV["TEST_TRACK_SCHEMA_FILE_PATH"] || Rails.root.join('db
|
65
|
+
ENV["TEST_TRACK_SCHEMA_FILE_PATH"] || Rails.root.join('db/test_track_schema.yml').to_s
|
66
66
|
end
|
67
67
|
|
68
68
|
def split_registry_with_deterministic_weights
|
@@ -4,7 +4,7 @@ class TestTrack::LazyVisitorByIdentity
|
|
4
4
|
end
|
5
5
|
|
6
6
|
def loaded?
|
7
|
-
@
|
7
|
+
@__visitor__.present?
|
8
8
|
end
|
9
9
|
|
10
10
|
def id_loaded?
|
@@ -14,7 +14,11 @@ class TestTrack::LazyVisitorByIdentity
|
|
14
14
|
private
|
15
15
|
|
16
16
|
def method_missing(method, *args, &block)
|
17
|
-
__visitor__.
|
17
|
+
if __visitor__.respond_to?(method)
|
18
|
+
__visitor__.send(method, *args, &block)
|
19
|
+
else
|
20
|
+
super
|
21
|
+
end
|
18
22
|
end
|
19
23
|
|
20
24
|
def respond_to_missing?(method, include_private = false)
|
@@ -22,7 +26,7 @@ class TestTrack::LazyVisitorByIdentity
|
|
22
26
|
end
|
23
27
|
|
24
28
|
def __visitor__
|
25
|
-
@
|
29
|
+
@__visitor__ ||= __load_visitor__
|
26
30
|
end
|
27
31
|
|
28
32
|
def __load_visitor__
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class TestTrack::Remote::SplitDetail
|
2
2
|
include TestTrack::RemoteModel
|
3
3
|
|
4
|
-
collection_path '
|
4
|
+
collection_path 'api/v1/split_details'
|
5
5
|
|
6
6
|
attributes :name, :hypothesis, :assignment_criteria, :description, :owner, :location, :platform, :variant_details
|
7
7
|
|
@@ -10,7 +10,7 @@ class TestTrack::Remote::SplitDetail
|
|
10
10
|
if faked?
|
11
11
|
new(fake_instance_attributes(name))
|
12
12
|
else
|
13
|
-
get("
|
13
|
+
get("api/v1/split_details/#{name}")
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -3,7 +3,7 @@ class TestTrack::Remote::SplitRegistry
|
|
3
3
|
|
4
4
|
CACHE_KEY = 'test_track_split_registry'.freeze
|
5
5
|
|
6
|
-
collection_path '
|
6
|
+
collection_path 'api/v3/builds/:build_timestamp/split_registry'
|
7
7
|
|
8
8
|
class << self
|
9
9
|
def fake_instance_attributes(_)
|
@@ -15,7 +15,7 @@ class TestTrack::Remote::SplitRegistry
|
|
15
15
|
if faked?
|
16
16
|
new(fake_instance_attributes(nil))
|
17
17
|
else
|
18
|
-
get(
|
18
|
+
get("api/v3/builds/#{TestTrack.build_timestamp}/split_registry")
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class TestTrack::Remote::Visitor
|
2
2
|
include TestTrack::RemoteModel
|
3
3
|
|
4
|
-
collection_path '
|
4
|
+
collection_path 'api/v1/visitors'
|
5
5
|
|
6
6
|
has_many :assignments
|
7
7
|
|
@@ -13,7 +13,7 @@ class TestTrack::Remote::Visitor
|
|
13
13
|
if faked?
|
14
14
|
new(fake_instance_attributes(nil))
|
15
15
|
else
|
16
|
-
get("
|
16
|
+
get("api/v1/identifier_types/#{identifier_type}/identifiers/#{identifier_value}/visitor")
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -8,7 +8,7 @@ class TestTrack::Remote::VisitorDetail
|
|
8
8
|
if faked?
|
9
9
|
new(fake_instance_attributes(nil))
|
10
10
|
else
|
11
|
-
get("
|
11
|
+
get("api/v1/identifier_types/#{identifier_type}/identifiers/#{identifier_value}/visitor_detail")
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -28,8 +28,8 @@ class TestTrack::SplitRegistry
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def to_hash
|
31
|
-
registry_hash && registry_hash['splits'].
|
32
|
-
|
31
|
+
registry_hash && registry_hash['splits'].transform_values do |v|
|
32
|
+
{ weights: v['weights'], feature_gate: v['feature_gate'] }
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -21,14 +21,12 @@ class TestTrack::ThreadedVisitorNotifier
|
|
21
21
|
|
22
22
|
def new_thread_with_request_store
|
23
23
|
Thread.new(RequestStore.store) do |original_store|
|
24
|
-
begin
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
RequestStore.clear!
|
31
|
-
end
|
24
|
+
RequestStore.begin!
|
25
|
+
RequestStore.store.merge!(original_store)
|
26
|
+
yield
|
27
|
+
ensure
|
28
|
+
RequestStore.end!
|
29
|
+
RequestStore.clear!
|
32
30
|
end
|
33
31
|
end
|
34
32
|
end
|
@@ -14,12 +14,10 @@ class TestTrack::UnsyncedAssignmentsNotifier
|
|
14
14
|
def notify
|
15
15
|
assignments.each do |assignment|
|
16
16
|
build_notify_assignment_job(assignment).tap do |job|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
Delayed::Job.enqueue(build_notify_assignment_job(assignment))
|
22
|
-
end
|
17
|
+
job.perform
|
18
|
+
rescue *TestTrack::SERVER_ERRORS => e
|
19
|
+
Rails.logger.error "TestTrack failed to notify unsynced assignments, retrying. #{e}"
|
20
|
+
Delayed::Job.enqueue(build_notify_assignment_job(assignment))
|
23
21
|
end
|
24
22
|
end
|
25
23
|
end
|
@@ -39,18 +39,18 @@ class TestTrack::Visitor
|
|
39
39
|
ab_configuration = TestTrack::ABConfiguration.new split_name: split_name, true_variant: true_variant, split_registry: split_registry
|
40
40
|
|
41
41
|
vary(split_name, context: context) do |v|
|
42
|
-
v.when ab_configuration.variants[:true] do
|
42
|
+
v.when ab_configuration.variants[:true] do # rubocop:disable Lint/BooleanSymbol
|
43
43
|
true
|
44
44
|
end
|
45
|
-
v.default ab_configuration.variants[:false] do
|
45
|
+
v.default ab_configuration.variants[:false] do # rubocop:disable Lint/BooleanSymbol
|
46
46
|
false
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
51
|
def assignment_registry
|
52
|
-
@assignment_registry ||= assignments.
|
53
|
-
|
52
|
+
@assignment_registry ||= assignments.index_by do |assignment|
|
53
|
+
assignment.split_name
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -0,0 +1 @@
|
|
1
|
+
TestTrack.set_build_timestamp! unless ENV['SKIP_TESTTRACK_SET_BUILD_TIMESTAMP'] == '1'
|
@@ -10,6 +10,24 @@ namespace :test_track do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
desc 'Generates build timestamp for fetching point-in-time split registries'
|
14
|
+
task generate_build_timestamp: :environment do
|
15
|
+
cli = TesttrackCli.instance
|
16
|
+
|
17
|
+
result = cli.call('generate_build_timestamp')
|
18
|
+
exit(result.exitstatus) unless result.success?
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'Sets an environment variable to block build timestamp generation on application initialization'
|
22
|
+
task :skip_set_build_timestamp do # rubocop:disable Rails/RakeEnvironment
|
23
|
+
ENV['SKIP_TESTTRACK_SET_BUILD_TIMESTAMP'] = '1'
|
24
|
+
end
|
25
|
+
|
26
|
+
desc 'Removes the testtrack/build_timestamp file'
|
27
|
+
task remove_build_timestamp: :environment do
|
28
|
+
File.delete('testtrack/build_timestamp') if File.exist?('testtrack/build_timestamp')
|
29
|
+
end
|
30
|
+
|
13
31
|
namespace :schema do
|
14
32
|
desc 'Load schema.yml state into TestTrack server'
|
15
33
|
task load: :environment do
|
@@ -28,6 +46,9 @@ namespace :test_track do
|
|
28
46
|
end
|
29
47
|
end
|
30
48
|
|
49
|
+
task 'assets:clobber' => ['test_track:remove_build_timestamp']
|
50
|
+
task 'assets:environment' => ['test_track:skip_set_build_timestamp']
|
51
|
+
task 'assets:precompile' => ['test_track:generate_build_timestamp']
|
31
52
|
task 'db:schema:load' => ['test_track:schema:load']
|
32
53
|
task 'db:structure:load' => ['test_track:schema:load']
|
33
54
|
task 'db:migrate' => ['test_track:migrate']
|
data/lib/test_track.rb
CHANGED
@@ -16,6 +16,8 @@ module TestTrack
|
|
16
16
|
module_function
|
17
17
|
|
18
18
|
SERVER_ERRORS = [Faraday::ConnectionFailed, Faraday::TimeoutError, Her::Errors::RemoteServerError].freeze
|
19
|
+
BUILD_TIMESTAMP_FILE_PATH = 'testtrack/build_timestamp'.freeze
|
20
|
+
BUILD_TIMESTAMP_REGEX = /\A\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d(.\d+)?([+-][0-2]\d:[0-5]\d|Z)\z/.freeze
|
19
21
|
|
20
22
|
mattr_accessor :enabled_override, :app_name
|
21
23
|
|
@@ -52,6 +54,26 @@ module TestTrack
|
|
52
54
|
@misconfiguration_notifier_class_name = notifier_class_name
|
53
55
|
end
|
54
56
|
|
57
|
+
def build_timestamp # rubocop:disable Metrics/MethodLength
|
58
|
+
@build_timestamp ||= begin
|
59
|
+
timestamp = _build_timestamp
|
60
|
+
|
61
|
+
if Rails.env.test? || Rails.env.development?
|
62
|
+
Time.zone.now.iso8601
|
63
|
+
elsif timestamp.present?
|
64
|
+
unless BUILD_TIMESTAMP_REGEX.match?(timestamp)
|
65
|
+
raise "./testtrack/build_timestamp is not a valid ISO 8601 timestamp, got '#{timestamp}'"
|
66
|
+
end
|
67
|
+
|
68
|
+
timestamp
|
69
|
+
else
|
70
|
+
raise 'TestTrack failed to load the required build timestamp. ' \
|
71
|
+
'Ensure `test_track:generate_build_timestamp` task is run in `assets:precompile` and the build timestamp file is present.'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
alias set_build_timestamp! build_timestamp
|
76
|
+
|
55
77
|
private
|
56
78
|
|
57
79
|
def analytics_instance
|
@@ -106,6 +128,10 @@ module TestTrack
|
|
106
128
|
ENV['TEST_TRACK_API_URL']
|
107
129
|
end
|
108
130
|
|
131
|
+
def _build_timestamp
|
132
|
+
File.read(BUILD_TIMESTAMP_FILE_PATH).chomp.presence if File.exist?(BUILD_TIMESTAMP_FILE_PATH)
|
133
|
+
end
|
134
|
+
|
109
135
|
def enabled?
|
110
136
|
enabled_override.nil? ? !Rails.env.test? : enabled_override
|
111
137
|
end
|
@@ -2,13 +2,15 @@ require 'delayed_job'
|
|
2
2
|
|
3
3
|
begin
|
4
4
|
require 'airbrake'
|
5
|
-
rescue LoadError
|
5
|
+
rescue LoadError
|
6
|
+
# no-op
|
6
7
|
end
|
7
8
|
|
8
9
|
unless defined?(Delayed::Plugins::Airbrake) && Delayed::Worker.plugins.include?(Delayed::Plugins::Airbrake)
|
9
10
|
begin
|
10
11
|
require 'delayed-plugins-airbrake'
|
11
|
-
rescue LoadError
|
12
|
+
rescue LoadError
|
13
|
+
# no-op
|
12
14
|
end
|
13
15
|
end
|
14
16
|
|
Binary file
|
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: test_track_rails_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.0.
|
4
|
+
version: 4.0.0.rc2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan O'Neill
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2020-
|
16
|
+
date: 2020-04-17 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: delayed_job
|
@@ -161,20 +161,132 @@ dependencies:
|
|
161
161
|
version: '1.3'
|
162
162
|
- !ruby/object:Gem::Dependency
|
163
163
|
name: appraisal
|
164
|
+
requirement: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - ">="
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '0'
|
169
|
+
type: :development
|
170
|
+
prerelease: false
|
171
|
+
version_requirements: !ruby/object:Gem::Requirement
|
172
|
+
requirements:
|
173
|
+
- - ">="
|
174
|
+
- !ruby/object:Gem::Version
|
175
|
+
version: '0'
|
176
|
+
- !ruby/object:Gem::Dependency
|
177
|
+
name: pry-rails
|
178
|
+
requirement: !ruby/object:Gem::Requirement
|
179
|
+
requirements:
|
180
|
+
- - ">="
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: '0'
|
183
|
+
type: :development
|
184
|
+
prerelease: false
|
185
|
+
version_requirements: !ruby/object:Gem::Requirement
|
186
|
+
requirements:
|
187
|
+
- - ">="
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '0'
|
190
|
+
- !ruby/object:Gem::Dependency
|
191
|
+
name: rails-controller-testing
|
192
|
+
requirement: !ruby/object:Gem::Requirement
|
193
|
+
requirements:
|
194
|
+
- - ">="
|
195
|
+
- !ruby/object:Gem::Version
|
196
|
+
version: '0'
|
197
|
+
type: :development
|
198
|
+
prerelease: false
|
199
|
+
version_requirements: !ruby/object:Gem::Requirement
|
200
|
+
requirements:
|
201
|
+
- - ">="
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: '0'
|
204
|
+
- !ruby/object:Gem::Dependency
|
205
|
+
name: rspec-rails
|
206
|
+
requirement: !ruby/object:Gem::Requirement
|
207
|
+
requirements:
|
208
|
+
- - ">="
|
209
|
+
- !ruby/object:Gem::Version
|
210
|
+
version: '0'
|
211
|
+
type: :development
|
212
|
+
prerelease: false
|
213
|
+
version_requirements: !ruby/object:Gem::Requirement
|
214
|
+
requirements:
|
215
|
+
- - ">="
|
216
|
+
- !ruby/object:Gem::Version
|
217
|
+
version: '0'
|
218
|
+
- !ruby/object:Gem::Dependency
|
219
|
+
name: rubocop
|
164
220
|
requirement: !ruby/object:Gem::Requirement
|
165
221
|
requirements:
|
166
222
|
- - "~>"
|
167
223
|
- !ruby/object:Gem::Version
|
168
|
-
version:
|
224
|
+
version: 0.81.0
|
169
225
|
type: :development
|
170
226
|
prerelease: false
|
171
227
|
version_requirements: !ruby/object:Gem::Requirement
|
172
228
|
requirements:
|
173
229
|
- - "~>"
|
174
230
|
- !ruby/object:Gem::Version
|
175
|
-
version:
|
231
|
+
version: 0.81.0
|
176
232
|
- !ruby/object:Gem::Dependency
|
177
|
-
name:
|
233
|
+
name: rubocop-performance
|
234
|
+
requirement: !ruby/object:Gem::Requirement
|
235
|
+
requirements:
|
236
|
+
- - ">="
|
237
|
+
- !ruby/object:Gem::Version
|
238
|
+
version: '0'
|
239
|
+
type: :development
|
240
|
+
prerelease: false
|
241
|
+
version_requirements: !ruby/object:Gem::Requirement
|
242
|
+
requirements:
|
243
|
+
- - ">="
|
244
|
+
- !ruby/object:Gem::Version
|
245
|
+
version: '0'
|
246
|
+
- !ruby/object:Gem::Dependency
|
247
|
+
name: rubocop-rails
|
248
|
+
requirement: !ruby/object:Gem::Requirement
|
249
|
+
requirements:
|
250
|
+
- - ">="
|
251
|
+
- !ruby/object:Gem::Version
|
252
|
+
version: '0'
|
253
|
+
type: :development
|
254
|
+
prerelease: false
|
255
|
+
version_requirements: !ruby/object:Gem::Requirement
|
256
|
+
requirements:
|
257
|
+
- - ">="
|
258
|
+
- !ruby/object:Gem::Version
|
259
|
+
version: '0'
|
260
|
+
- !ruby/object:Gem::Dependency
|
261
|
+
name: shoulda-matchers
|
262
|
+
requirement: !ruby/object:Gem::Requirement
|
263
|
+
requirements:
|
264
|
+
- - ">="
|
265
|
+
- !ruby/object:Gem::Version
|
266
|
+
version: '2.8'
|
267
|
+
type: :development
|
268
|
+
prerelease: false
|
269
|
+
version_requirements: !ruby/object:Gem::Requirement
|
270
|
+
requirements:
|
271
|
+
- - ">="
|
272
|
+
- !ruby/object:Gem::Version
|
273
|
+
version: '2.8'
|
274
|
+
- !ruby/object:Gem::Dependency
|
275
|
+
name: simplecov
|
276
|
+
requirement: !ruby/object:Gem::Requirement
|
277
|
+
requirements:
|
278
|
+
- - ">="
|
279
|
+
- !ruby/object:Gem::Version
|
280
|
+
version: '0'
|
281
|
+
type: :development
|
282
|
+
prerelease: false
|
283
|
+
version_requirements: !ruby/object:Gem::Requirement
|
284
|
+
requirements:
|
285
|
+
- - ">="
|
286
|
+
- !ruby/object:Gem::Version
|
287
|
+
version: '0'
|
288
|
+
- !ruby/object:Gem::Dependency
|
289
|
+
name: sqlite3
|
178
290
|
requirement: !ruby/object:Gem::Requirement
|
179
291
|
requirements:
|
180
292
|
- - ">="
|
@@ -205,16 +317,16 @@ dependencies:
|
|
205
317
|
name: webmock
|
206
318
|
requirement: !ruby/object:Gem::Requirement
|
207
319
|
requirements:
|
208
|
-
- - "
|
320
|
+
- - ">="
|
209
321
|
- !ruby/object:Gem::Version
|
210
|
-
version:
|
322
|
+
version: '0'
|
211
323
|
type: :development
|
212
324
|
prerelease: false
|
213
325
|
version_requirements: !ruby/object:Gem::Requirement
|
214
326
|
requirements:
|
215
|
-
- - "
|
327
|
+
- - ">="
|
216
328
|
- !ruby/object:Gem::Version
|
217
|
-
version:
|
329
|
+
version: '0'
|
218
330
|
description: Easy split testing and feature flagging for Rails with TestTrack server
|
219
331
|
email:
|
220
332
|
- ryan.oneill@betterment.com
|
@@ -285,6 +397,7 @@ files:
|
|
285
397
|
- app/views/tt/api/v1/split_details/show.json.jbuilder
|
286
398
|
- app/views/tt/api/v1/visitors/_show.json.jbuilder
|
287
399
|
- app/views/tt/api/v1/visitors/show.json.jbuilder
|
400
|
+
- config/initializers/set_build_timestamp.rb
|
288
401
|
- config/initializers/test_track_api.rb
|
289
402
|
- config/routes.rb
|
290
403
|
- lib/generators/test_track/migration_generator.rb
|
@@ -349,14 +462,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
349
462
|
requirements:
|
350
463
|
- - ">="
|
351
464
|
- !ruby/object:Gem::Version
|
352
|
-
version: 2.
|
465
|
+
version: 2.5.0
|
353
466
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
354
467
|
requirements:
|
355
468
|
- - ">"
|
356
469
|
- !ruby/object:Gem::Version
|
357
470
|
version: 1.3.1
|
358
471
|
requirements: []
|
359
|
-
rubygems_version: 3.0.
|
472
|
+
rubygems_version: 3.0.3
|
360
473
|
signing_key:
|
361
474
|
specification_version: 4
|
362
475
|
summary: Rails client for TestTrack
|