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 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