test_track_rails_client 4.0.0.alpha35 → 4.0.0.rc2
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 +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
|