test_track_rails_client 4.0.0.alpha26 → 4.0.0.alpha27
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +18 -0
- data/Rakefile +1 -1
- data/app/controllers/tt/api/{v1/application_controller.rb → application_controller.rb} +1 -1
- data/app/controllers/tt/api/v1/assignments_controller.rb +1 -1
- data/app/controllers/tt/api/v1/identifier_types_controller.rb +1 -1
- data/app/controllers/tt/api/v1/identifier_visitors_controller.rb +1 -1
- data/app/controllers/tt/api/v1/identifiers_controller.rb +1 -1
- data/app/controllers/tt/api/v1/resets_controller.rb +1 -1
- data/app/controllers/tt/api/v1/split_configs_controller.rb +1 -1
- data/app/controllers/tt/api/v1/split_details_controller.rb +1 -1
- data/app/controllers/tt/api/v1/visitor_details_controller.rb +1 -1
- data/app/controllers/tt/api/v1/visitors_controller.rb +1 -1
- data/app/models/test_track/ab_configuration.rb +2 -2
- data/app/models/test_track/fake/split_registry.rb +11 -6
- data/app/models/test_track/fake/visitor.rb +2 -1
- data/app/models/test_track/fake_server.rb +0 -4
- data/app/models/test_track/misconfiguration_notifier.rb +27 -8
- data/app/models/test_track/notify_assignment_job.rb +23 -2
- data/app/models/test_track/remote/split_registry.rb +34 -24
- data/app/models/test_track/session.rb +1 -1
- data/app/models/test_track/variant_calculator.rb +2 -1
- data/app/models/test_track/vary_dsl.rb +2 -2
- data/app/models/test_track/visitor.rb +7 -1
- data/config/routes.rb +0 -2
- data/lib/test_track.rb +23 -3
- data/lib/test_track_rails_client/assignment_helper.rb +5 -3
- data/lib/test_track_rails_client/engine.rb +11 -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 +3 -33
- data/app/controllers/tt/api/v1/split_registries_controller.rb +0 -5
- data/app/views/tt/api/v1/split_registries/show.json.jbuilder +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25d6337d0be0cd4ab5f7bb3206ac57abcf4751a9
|
4
|
+
data.tar.gz: 607743ae3522be134d2842a65e854e0ea698efd1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3580d4074be4b74748b652abb5559b7147fb26bc1e65e81ee012a3524df94452d68d7283440f56a2b566e597507febff35bed687e34383a6c7653a4a8e33398
|
7
|
+
data.tar.gz: 940014bb4d6506d5f1dabf26924a5d76239b7924f153565170a3444862a8e40651fe5a7962769030c150feef132cc43dfe701cbe14ddc220ae431772b75062b2
|
data/README.md
CHANGED
@@ -369,6 +369,24 @@ mixpanel.init('YOUR MIXPANEL TOKEN', {
|
|
369
369
|
});
|
370
370
|
```
|
371
371
|
|
372
|
+
## Misconfiguration notifications
|
373
|
+
|
374
|
+
TestTrack provides hooks to easily integrate with your preferred error catching tool to receive notifications when we detect a misconfiguration in split usage. TestTrack has built-in support for `Airbrake`. By default, if you've included the `airbrake` gem, TestTrack will use `Airbrake` as a misconfiguration notifier backend. If you wish to use another tool, you can set the `misconfiguration_notifier` attribute on `TestTrack` with your custom client. You should do this in a Rails initializer.
|
375
|
+
|
376
|
+
```ruby
|
377
|
+
# config/initializers/test_track.rb
|
378
|
+
TestTrack.misconfiguration_notifier = MyCustomMisconfigurationNotifier.new
|
379
|
+
```
|
380
|
+
|
381
|
+
Your client must implement the following methods:
|
382
|
+
|
383
|
+
```ruby
|
384
|
+
# Called when a Split misconfiguration is detected
|
385
|
+
#
|
386
|
+
# @param string message describing the misconfiguration
|
387
|
+
def notify(message)
|
388
|
+
```
|
389
|
+
|
372
390
|
## Upgrading
|
373
391
|
|
374
392
|
### From 3.0 to 4.0
|
data/Rakefile
CHANGED
@@ -33,7 +33,7 @@ task :vendor_deps do
|
|
33
33
|
sh 'cp', 'bower_components/test_track_js_client/dist/testTrack.bundle.min.js', 'app/assets/javascripts'
|
34
34
|
|
35
35
|
# Download testtrack-cli
|
36
|
-
TEST_TRACK_CLI_VERSION = '
|
36
|
+
TEST_TRACK_CLI_VERSION = 'v1.0.0'.freeze
|
37
37
|
|
38
38
|
FileUtils.module_eval do
|
39
39
|
mkdir_p 'vendor/bin/testtrack-cli'
|
@@ -42,7 +42,7 @@ class TestTrack::ABConfiguration
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def split
|
45
|
-
split_registry && split_registry[split_name]
|
45
|
+
split_registry && split_registry['splits'][split_name] && split_registry['splits'][split_name]['weights']
|
46
46
|
end
|
47
47
|
|
48
48
|
def split_variants
|
@@ -58,6 +58,6 @@ class TestTrack::ABConfiguration
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def misconfiguration_notifier
|
61
|
-
@misconfiguration_notifier ||= TestTrack
|
61
|
+
@misconfiguration_notifier ||= TestTrack.misconfiguration_notifier
|
62
62
|
end
|
63
63
|
end
|
@@ -5,13 +5,17 @@ class TestTrack::Fake::SplitRegistry
|
|
5
5
|
@instance ||= new
|
6
6
|
end
|
7
7
|
|
8
|
+
def self.reset!
|
9
|
+
@instance = nil
|
10
|
+
end
|
11
|
+
|
8
12
|
def to_h
|
9
|
-
@to_h ||=
|
13
|
+
@to_h ||= split_registry_with_deterministic_weights
|
10
14
|
end
|
11
15
|
|
12
16
|
def splits
|
13
|
-
to_h.map do |
|
14
|
-
Split.new(
|
17
|
+
to_h['splits'].map do |split_name, registry|
|
18
|
+
Split.new(split_name, registry['weights'])
|
15
19
|
end
|
16
20
|
end
|
17
21
|
|
@@ -63,8 +67,8 @@ class TestTrack::Fake::SplitRegistry
|
|
63
67
|
ENV["TEST_TRACK_SCHEMA_FILE_PATH"] || Rails.root.join('db', 'test_track_schema.yml').to_s
|
64
68
|
end
|
65
69
|
|
66
|
-
def
|
67
|
-
split_hash.each_with_object({}) do |(split_name, weighting_registry),
|
70
|
+
def split_registry_with_deterministic_weights
|
71
|
+
splits = split_hash.each_with_object({}) do |(split_name, weighting_registry), result|
|
68
72
|
default_variant = weighting_registry.keys.sort.first
|
69
73
|
|
70
74
|
adjusted_weights = { default_variant => 100 }
|
@@ -72,7 +76,8 @@ class TestTrack::Fake::SplitRegistry
|
|
72
76
|
adjusted_weights[variant] = 0
|
73
77
|
end
|
74
78
|
|
75
|
-
|
79
|
+
result[split_name] = { 'weights' => adjusted_weights, 'feature_gate' => split_name.end_with?('_enabled') }
|
76
80
|
end
|
81
|
+
{ 'splits' => splits, 'experience_sampling_weight' => 1 }
|
77
82
|
end
|
78
83
|
end
|
@@ -9,6 +9,7 @@ class TestTrack::Fake::Visitor
|
|
9
9
|
|
10
10
|
def self.reset!
|
11
11
|
@instance = nil
|
12
|
+
TestTrack::Fake::SplitRegistry.reset!
|
12
13
|
end
|
13
14
|
|
14
15
|
def initialize(id)
|
@@ -26,7 +27,7 @@ class TestTrack::Fake::Visitor
|
|
26
27
|
private
|
27
28
|
|
28
29
|
def _assignments
|
29
|
-
split_registry.keys.map do |split_name|
|
30
|
+
split_registry['splits'].keys.map do |split_name|
|
30
31
|
variant = TestTrack::VariantCalculator.new(visitor: self, split_name: split_name).variant
|
31
32
|
Assignment.new(split_name, variant, false, "the_context")
|
32
33
|
end
|
@@ -1,13 +1,32 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
module TestTrack::MisconfigurationNotifier
|
2
|
+
class Wrapper
|
3
|
+
attr_reader :underlying
|
4
4
|
|
5
|
-
|
5
|
+
def initialize(underlying = Null.new)
|
6
|
+
@underlying = underlying
|
7
|
+
end
|
8
|
+
|
9
|
+
def notify(msg)
|
10
|
+
raise msg if Rails.env.development?
|
11
|
+
|
12
|
+
Rails.logger.error(msg)
|
13
|
+
|
14
|
+
underlying.notify(msg)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Null
|
19
|
+
def notify(_); end
|
20
|
+
end
|
6
21
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
Airbrake.
|
22
|
+
class Airbrake
|
23
|
+
def notify(msg)
|
24
|
+
raise "Aibrake was configured but not found" unless defined?(::Airbrake)
|
25
|
+
if ::Airbrake.respond_to?(:notify_or_ignore)
|
26
|
+
::Airbrake.notify_or_ignore(StandardError.new, error_message: msg)
|
27
|
+
else
|
28
|
+
::Airbrake.notify(StandardError.new, error_message: msg)
|
29
|
+
end
|
11
30
|
end
|
12
31
|
end
|
13
32
|
end
|
@@ -12,7 +12,7 @@ class TestTrack::NotifyAssignmentJob
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def perform
|
15
|
-
tracking_result =
|
15
|
+
tracking_result = maybe_track
|
16
16
|
unless assignment.feature_gate?
|
17
17
|
TestTrack::Remote::AssignmentEvent.create!(
|
18
18
|
visitor_id: visitor_id,
|
@@ -25,9 +25,30 @@ class TestTrack::NotifyAssignmentJob
|
|
25
25
|
|
26
26
|
private
|
27
27
|
|
28
|
-
def
|
28
|
+
def maybe_track
|
29
29
|
return "failure" unless TestTrack.enabled?
|
30
|
+
return "success" if skip_analytics_event?
|
30
31
|
result = TestTrack.analytics.track(TestTrack::AnalyticsEvent.new(visitor_id, assignment))
|
31
32
|
result ? "success" : "failure"
|
32
33
|
end
|
34
|
+
|
35
|
+
def skip_analytics_event?
|
36
|
+
assignment.feature_gate? && skip_experience_event?
|
37
|
+
end
|
38
|
+
|
39
|
+
def skip_experience_event?
|
40
|
+
skip_all_experience_events? || !sample_event?
|
41
|
+
end
|
42
|
+
|
43
|
+
def skip_all_experience_events?
|
44
|
+
experience_sampling_weight.zero?
|
45
|
+
end
|
46
|
+
|
47
|
+
def experience_sampling_weight
|
48
|
+
@experience_sampling_weight ||= TestTrack::Remote::SplitRegistry.experience_sampling_weight
|
49
|
+
end
|
50
|
+
|
51
|
+
def sample_event?
|
52
|
+
Kernel.rand(experience_sampling_weight).zero?
|
53
|
+
end
|
33
54
|
end
|
@@ -3,35 +3,45 @@ class TestTrack::Remote::SplitRegistry
|
|
3
3
|
|
4
4
|
CACHE_KEY = 'test_track_split_registry'.freeze
|
5
5
|
|
6
|
-
collection_path '/api/
|
6
|
+
collection_path '/api/v2/split_registry'
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
class << self
|
9
|
+
def fake_instance_attributes(_)
|
10
|
+
::TestTrack::Fake::SplitRegistry.instance.to_h
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
def instance
|
14
|
+
# TODO: FakeableHer needs to make this faking a feature of `get`
|
15
|
+
if faked?
|
16
|
+
new(fake_instance_attributes(nil))
|
17
|
+
else
|
18
|
+
get('/api/v2/split_registry')
|
19
|
+
end
|
18
20
|
end
|
19
|
-
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
22
|
+
def reset
|
23
|
+
Rails.cache.delete(CACHE_KEY)
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_hash
|
27
|
+
if faked?
|
28
|
+
instance.attributes.freeze
|
29
|
+
else
|
30
|
+
fetch_cache { instance.attributes }.freeze
|
31
|
+
end
|
32
|
+
rescue *TestTrack::SERVER_ERRORS => e
|
33
|
+
Rails.logger.error "TestTrack failed to load split registry. #{e}"
|
34
|
+
fetch_cache { nil } # cache the missing registry for 5 seconds if we can't get one
|
35
|
+
end
|
36
|
+
|
37
|
+
def experience_sampling_weight
|
38
|
+
to_hash.fetch('experience_sampling_weight')
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
24
42
|
|
25
|
-
|
26
|
-
|
27
|
-
instance.attributes.freeze
|
28
|
-
else
|
29
|
-
Rails.cache.fetch(CACHE_KEY, expires_in: 5.seconds) {
|
30
|
-
instance.attributes
|
31
|
-
}.freeze
|
43
|
+
def fetch_cache(&block)
|
44
|
+
Rails.cache.fetch(CACHE_KEY, expires_in: 5.seconds, &block)
|
32
45
|
end
|
33
|
-
rescue *TestTrack::SERVER_ERRORS => e
|
34
|
-
Rails.logger.error "TestTrack failed to load split registry. #{e}"
|
35
|
-
nil # if we can't get a split registry
|
36
46
|
end
|
37
47
|
end
|
@@ -31,7 +31,7 @@ class TestTrack::Session
|
|
31
31
|
url: TestTrack.url,
|
32
32
|
cookieDomain: cookie_domain,
|
33
33
|
cookieName: visitor_cookie_name,
|
34
|
-
registry: current_visitor.
|
34
|
+
registry: current_visitor.v1_split_registry,
|
35
35
|
assignments: current_visitor.assignment_json
|
36
36
|
}
|
37
37
|
end
|
@@ -31,7 +31,8 @@ class TestTrack::VariantCalculator
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def weighting
|
34
|
-
@weighting ||= split_registry[split_name]
|
34
|
+
@weighting ||= (split_registry['splits'][split_name] && split_registry['splits'][split_name]['weights']) ||
|
35
|
+
raise("TestTrack split '#{split_name}' not found. Need to write/run a migration?")
|
35
36
|
end
|
36
37
|
|
37
38
|
def assignment_bucket
|
@@ -34,7 +34,7 @@ class TestTrack::VaryDSL
|
|
34
34
|
delegate :split_name, to: :assignment
|
35
35
|
|
36
36
|
def split
|
37
|
-
split_registry && split_registry[split_name]
|
37
|
+
split_registry && split_registry['splits'][split_name] && split_registry['splits'][split_name]['weights']
|
38
38
|
end
|
39
39
|
|
40
40
|
def split_variants
|
@@ -46,7 +46,7 @@ class TestTrack::VaryDSL
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def misconfiguration_notifier
|
49
|
-
@misconfiguration_notifier ||= TestTrack
|
49
|
+
@misconfiguration_notifier ||= TestTrack.misconfiguration_notifier
|
50
50
|
end
|
51
51
|
|
52
52
|
def variant_behaviors
|
@@ -67,6 +67,12 @@ class TestTrack::Visitor
|
|
67
67
|
@split_registry ||= TestTrack::Remote::SplitRegistry.to_hash
|
68
68
|
end
|
69
69
|
|
70
|
+
def v1_split_registry
|
71
|
+
@v1_split_registry ||= split_registry && split_registry['splits'].each_with_object({}) do |(k, v), result|
|
72
|
+
result[k] = v['weights']
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
70
76
|
def link_identity!(identity)
|
71
77
|
opts = identifier_opts(identity)
|
72
78
|
begin
|
@@ -154,6 +160,6 @@ class TestTrack::Visitor
|
|
154
160
|
app_name = URI.parse(TestTrack.private_url).user
|
155
161
|
split_name = split_name.to_s
|
156
162
|
prefixed = "#{app_name}.#{split_name}"
|
157
|
-
split_registry.key?(prefixed) ? prefixed : split_name
|
163
|
+
split_registry['splits'].key?(prefixed) ? prefixed : split_name
|
158
164
|
end
|
159
165
|
end
|
data/config/routes.rb
CHANGED
data/lib/test_track.rb
CHANGED
@@ -21,16 +21,36 @@ module TestTrack
|
|
21
21
|
|
22
22
|
class << self
|
23
23
|
def analytics
|
24
|
-
@analytics ||=
|
24
|
+
@analytics ||= analytics_wrapper(mixpanel)
|
25
25
|
end
|
26
26
|
|
27
27
|
def analytics=(client)
|
28
|
-
@analytics = client.is_a?(TestTrack::Analytics::SafeWrapper) ? client :
|
28
|
+
@analytics = client.is_a?(TestTrack::Analytics::SafeWrapper) ? client : analytics_wrapper(client)
|
29
|
+
end
|
30
|
+
|
31
|
+
def misconfiguration_notifier
|
32
|
+
@misconfiguration_notifier ||= TestTrack::MisconfigurationNotifier::Wrapper.new(default_notifier)
|
33
|
+
end
|
34
|
+
|
35
|
+
def misconfiguration_notifier=(notifier)
|
36
|
+
@misconfiguration_notifier = if notifier.is_a?(TestTrack::MisconfigurationNotifier::Wrapper)
|
37
|
+
notifier
|
38
|
+
else
|
39
|
+
TestTrack::MisconfigurationNotifier::Wrapper.new(notifier)
|
40
|
+
end
|
29
41
|
end
|
30
42
|
|
31
43
|
private
|
32
44
|
|
33
|
-
def
|
45
|
+
def default_notifier
|
46
|
+
if defined?(::Airbrake)
|
47
|
+
TestTrack::MisconfigurationNotifier::Airbrake.new
|
48
|
+
else
|
49
|
+
TestTrack::MisconfigurationNotifier::Null.new
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def analytics_wrapper(client)
|
34
54
|
TestTrack::Analytics::SafeWrapper.new(client)
|
35
55
|
end
|
36
56
|
|
@@ -2,16 +2,18 @@ module TestTrackRailsClient::AssignmentHelper
|
|
2
2
|
def stub_test_track_assignments(assignment_registry) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
3
3
|
raise "Cannot stub test track assignments when TestTrack is enabled" if TestTrack.enabled?
|
4
4
|
|
5
|
-
split_registry = TestTrack::Fake::SplitRegistry.instance.to_h.
|
5
|
+
split_registry = TestTrack::Fake::SplitRegistry.instance.to_h.deep_dup
|
6
6
|
assignments = []
|
7
7
|
app_name = URI.parse(TestTrack.private_url).user
|
8
8
|
|
9
9
|
assignment_registry.each do |split_name, variant|
|
10
10
|
prefixed_split_name = "#{app_name}.#{split_name}"
|
11
|
-
if split_registry.key?(prefixed_split_name)
|
11
|
+
if split_registry['splits'].key?(prefixed_split_name)
|
12
12
|
assignments << { split_name: prefixed_split_name, variant: variant.to_s, unsynced: false }
|
13
13
|
else
|
14
|
-
|
14
|
+
unless split_registry['splits'][split_name]
|
15
|
+
split_registry['splits'][split_name.to_s] = { weights: { variant.to_s => 100 }, feature_gate: false }
|
16
|
+
end
|
15
17
|
assignments << { split_name: split_name.to_s, variant: variant.to_s, unsynced: false }
|
16
18
|
end
|
17
19
|
end
|
@@ -1,8 +1,17 @@
|
|
1
1
|
require 'delayed_job'
|
2
|
-
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'airbrake'
|
5
|
+
rescue LoadError # rubocop:disable Lint/HandleExceptions
|
6
|
+
end
|
7
|
+
|
3
8
|
unless defined?(Delayed::Plugins::Airbrake) && Delayed::Worker.plugins.include?(Delayed::Plugins::Airbrake)
|
4
|
-
|
9
|
+
begin
|
10
|
+
require 'delayed-plugins-airbrake'
|
11
|
+
rescue LoadError # rubocop:disable Lint/HandleExceptions
|
12
|
+
end
|
5
13
|
end
|
14
|
+
|
6
15
|
require 'test_track'
|
7
16
|
|
8
17
|
module TestTrackRailsClient
|
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.alpha27
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan O'Neill
|
@@ -13,36 +13,8 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2019-
|
16
|
+
date: 2019-06-21 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
|
-
- !ruby/object:Gem::Dependency
|
19
|
-
name: airbrake
|
20
|
-
requirement: !ruby/object:Gem::Requirement
|
21
|
-
requirements:
|
22
|
-
- - ">="
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version: '4.1'
|
25
|
-
type: :runtime
|
26
|
-
prerelease: false
|
27
|
-
version_requirements: !ruby/object:Gem::Requirement
|
28
|
-
requirements:
|
29
|
-
- - ">="
|
30
|
-
- !ruby/object:Gem::Version
|
31
|
-
version: '4.1'
|
32
|
-
- !ruby/object:Gem::Dependency
|
33
|
-
name: delayed-plugins-airbrake
|
34
|
-
requirement: !ruby/object:Gem::Requirement
|
35
|
-
requirements:
|
36
|
-
- - ">="
|
37
|
-
- !ruby/object:Gem::Version
|
38
|
-
version: '0'
|
39
|
-
type: :runtime
|
40
|
-
prerelease: false
|
41
|
-
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
requirements:
|
43
|
-
- - ">="
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: '0'
|
46
18
|
- !ruby/object:Gem::Dependency
|
47
19
|
name: delayed_job
|
48
20
|
requirement: !ruby/object:Gem::Requirement
|
@@ -255,7 +227,7 @@ files:
|
|
255
227
|
- Rakefile
|
256
228
|
- app/assets/javascripts/testTrack.bundle.min.js
|
257
229
|
- app/controllers/concerns/test_track/controller.rb
|
258
|
-
- app/controllers/tt/api/
|
230
|
+
- app/controllers/tt/api/application_controller.rb
|
259
231
|
- app/controllers/tt/api/v1/assignments_controller.rb
|
260
232
|
- app/controllers/tt/api/v1/identifier_types_controller.rb
|
261
233
|
- app/controllers/tt/api/v1/identifier_visitors_controller.rb
|
@@ -263,7 +235,6 @@ files:
|
|
263
235
|
- app/controllers/tt/api/v1/resets_controller.rb
|
264
236
|
- app/controllers/tt/api/v1/split_configs_controller.rb
|
265
237
|
- app/controllers/tt/api/v1/split_details_controller.rb
|
266
|
-
- app/controllers/tt/api/v1/split_registries_controller.rb
|
267
238
|
- app/controllers/tt/api/v1/visitor_details_controller.rb
|
268
239
|
- app/controllers/tt/api/v1/visitors_controller.rb
|
269
240
|
- app/helpers/test_track/application_helper.rb
|
@@ -310,7 +281,6 @@ files:
|
|
310
281
|
- app/views/tt/api/v1/identifier_visitors/show.json.jbuilder
|
311
282
|
- app/views/tt/api/v1/identifiers/create.json.jbuilder
|
312
283
|
- app/views/tt/api/v1/split_details/show.json.jbuilder
|
313
|
-
- app/views/tt/api/v1/split_registries/show.json.jbuilder
|
314
284
|
- app/views/tt/api/v1/visitors/_show.json.jbuilder
|
315
285
|
- app/views/tt/api/v1/visitors/show.json.jbuilder
|
316
286
|
- config/initializers/test_track_api.rb
|