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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 532197bb184a50df29fdbf38799d34a67619f9d7027739dd1f8e67f15fca8961
4
- data.tar.gz: 19afe5453a00d70488260cc7a0fd1890e404e88da31caaf86e9a4745837268e6
3
+ metadata.gz: 0f37de9c3a15f87656bada30d35900017f179c5abf99b4e74d832895d91a3a27
4
+ data.tar.gz: a358c5852dd1e3a9b952988f9a408cdc283f248a0e66046fdf22ea6dfaab1c02
5
5
  SHA512:
6
- metadata.gz: 586598dd9e379ec40f6d797b07c2582768bc70213a4c39608fd4fe5a41c0173ddc8a2468f81b49008e39cb6d5a986495ca7f3b6c3a14ec6a6122e5df4769c447
7
- data.tar.gz: 8c50b8c20986a7deeffe378975852de2f3f3f6faf2e86de2482ab89c7a60aae2ac0bd4260274e6418f53bdfdc083bdd03f614c45535e6b06f89af7a4d9410062
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.dev` ([Pow](pow.cx))
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, You'll need to configure your
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 expiriment assignments and feature gate experiences, which are
397
+ between experiment assignments and feature gate experiences, which are
398
398
  no longer recorded server-side.
399
399
 
400
- You also must add `self.test_track_identity = :current_user` (or
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 app supports authentication, You'll need to configure 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
- The TestTrack.analytics client `#track_assignment` method no longer accepts a properties hash as an argument as `mixpanel_distinct_id` is no longer relevant.
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.0.2'.freeze
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', 'test_track_schema.yml'))
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
- @unpersisted_splits ||= splits.keys - remote_splits.keys
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
- @schema_hash ||= YAML.safe_load(schema_file_contents) || {}
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', 'test_track_schema.yml').to_s
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
- @visitor.present?
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__.send(method, *args, &block)
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
- @visitor ||= __load_visitor__
29
+ @__visitor__ ||= __load_visitor__
26
30
  end
27
31
 
28
32
  def __load_visitor__
@@ -1,7 +1,7 @@
1
1
  class TestTrack::Remote::AssignmentEvent
2
2
  include TestTrack::RemoteModel
3
3
 
4
- collection_path '/api/v1/assignment_event'
4
+ collection_path 'api/v1/assignment_event'
5
5
 
6
6
  attributes :visitor_id, :split_name, :unsynced
7
7
 
@@ -1,7 +1,7 @@
1
1
  class TestTrack::Remote::Identifier
2
2
  include TestTrack::RemoteModel
3
3
 
4
- collection_path '/api/v1/identifier'
4
+ collection_path 'api/v1/identifier'
5
5
 
6
6
  has_one :remote_visitor, data_key: :visitor, class_name: "TestTrack::Remote::Visitor"
7
7
 
@@ -1,7 +1,7 @@
1
1
  class TestTrack::Remote::IdentifierType
2
2
  include TestTrack::RemoteModel
3
3
 
4
- collection_path '/api/v1/identifier_type'
4
+ collection_path 'api/v1/identifier_type'
5
5
 
6
6
  attributes :name
7
7
 
@@ -1,7 +1,7 @@
1
1
  class TestTrack::Remote::SplitConfig
2
2
  include TestTrack::RemoteModel
3
3
 
4
- collection_path '/api/v1/split_configs'
4
+ collection_path 'api/v1/split_configs'
5
5
 
6
6
  attributes :name, :weighting_registry
7
7
 
@@ -1,7 +1,7 @@
1
1
  class TestTrack::Remote::SplitDetail
2
2
  include TestTrack::RemoteModel
3
3
 
4
- collection_path '/api/v1/split_details'
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("/api/v1/split_details/#{name}")
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 '/api/v2/split_registry'
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('/api/v2/split_registry')
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 '/api/v1/visitors'
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("/api/v1/identifier_types/#{identifier_type}/identifiers/#{identifier_value}/visitor")
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("/api/v1/identifier_types/#{identifier_type}/identifiers/#{identifier_value}/visitor_detail")
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'].each_with_object({}) do |(k, v), result|
32
- result[k] = { weights: v['weights'], feature_gate: v['feature_gate'] }
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
- RequestStore.begin!
26
- RequestStore.store.merge!(original_store)
27
- yield
28
- ensure
29
- RequestStore.end!
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
- begin
18
- job.perform
19
- rescue *TestTrack::SERVER_ERRORS => e
20
- Rails.logger.error "TestTrack failed to notify unsynced assignments, retrying. #{e}"
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.each_with_object({}) do |assignment, hsh|
53
- hsh[assignment.split_name] = assignment
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 # rubocop:disable Lint/HandleExceptions
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 # rubocop:disable Lint/HandleExceptions
12
+ rescue LoadError
13
+ # no-op
12
14
  end
13
15
  end
14
16
 
@@ -1,3 +1,3 @@
1
1
  module TestTrackRailsClient
2
- VERSION = "4.0.0.alpha35" # rubocop:disable Style/MutableConstant
2
+ VERSION = "4.0.0.rc2" # rubocop:disable Style/MutableConstant
3
3
  end
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.alpha35
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-01-08 00:00:00.000000000 Z
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: 2.2.0
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: 2.2.0
231
+ version: 0.81.0
176
232
  - !ruby/object:Gem::Dependency
177
- name: pry-rails
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: 2.1.0
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: 2.1.0
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.1.0
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.6
472
+ rubygems_version: 3.0.3
360
473
  signing_key:
361
474
  specification_version: 4
362
475
  summary: Rails client for TestTrack