abtest 1.0.1 → 2.0.0

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
  SHA1:
3
- metadata.gz: 7003e71f137f358d4486677ee30d33f1b52ec8b7
4
- data.tar.gz: e65200ded12e11fcc0b9edd18fd56c702e376dd4
3
+ metadata.gz: 4158fd4b6a530de6b5e353dd69aa61ef04c2f19c
4
+ data.tar.gz: 6bce19ab1385172c96192d408c3f85cd498a11ca
5
5
  SHA512:
6
- metadata.gz: c9791117e91b7a670b98586c2c11dd86c573fac5566a514ae36422119ab71542fedd39b1cf1e2a067a02eb899c67315aea63bc0befe0ecb6656bf80e6e9d2b75
7
- data.tar.gz: 6eff296817cf5694fd8d06518311b7198c2ecfb4c7b6f657d503cc6156e064250cd1de060f26980cdea5747a1ad0cf9762d27b42fc234c04a707ad74d135b87a
6
+ metadata.gz: 1299386c8972fc29df0e07c42041354eecc14399eb211683de867051cb11ae65ad0604b8f1a522ae6c1c3c274f2ac0c414e2088116e3fa7cc33e91feb10f8e58
7
+ data.tar.gz: 75847dd2c20be03b18ba16e8f8f051b0b32b58325c2d430d0d49422669d61225047274ea223cde38f0a63702982bbae6b8481dc446215215139c6564623b03c1
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  A-B testing framework and manager for Rails. This gem allows the addition of experiments that change view code and assets
4
4
  based on the results of a simple test proc.
5
5
 
6
- This gem modifies ActionView::Base as well as the global assets environment to enable overrides in the experiments directory to
6
+ This gem modifies ActionView::Base as well as the global assets environment to enable overrides in the experiments directory to
7
7
  take effect.
8
8
 
9
9
  ## Installation
@@ -22,10 +22,14 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- Once the gem is installed in your Rails application, rou can run the following command to set up an experiment:
25
+ Once the gem is installed in your Rails application, you can run the following command to set up an experiment:
26
26
 
27
27
  $ bundle exec rake abtest:add_experiment[experiment_name]
28
28
 
29
+ To delete an experiment, run the following command:
30
+
31
+ $ bundle exec rake abtest:delete_experiment[experiment_name]
32
+
29
33
  To remove all experiments, run the following command:
30
34
 
31
35
  $ bundle exec rake abtest:delete_experiments
@@ -1,6 +1,5 @@
1
1
  require "abtest/version"
2
2
  require "abtest/railtie"
3
- require "abtest/processor"
4
3
  require "abtest/registry"
5
4
  require "abtest/filters"
6
5
  require "abtest/asset"
@@ -7,7 +7,49 @@ module Abtest
7
7
  end
8
8
 
9
9
  def process_abtests
10
- Abtest::Processor.process_tests(self)
10
+ experiment_activated = false
11
+
12
+ Abtest.abtest_config.registered_tests.each do |test_hash|
13
+ app_config = Rails.application.config
14
+ environment = Rails.application.assets
15
+ experiment_name = test_hash[:name]
16
+ experiment_path = Rails.root.join('abtest', 'experiments', experiment_name)
17
+
18
+ if (test_hash[:check].call(request) && !experiment_activated)
19
+ # ensure experimental translations are loaded
20
+ unless (I18n.load_path || []).last.include?(experiment_name)
21
+ I18n.load_path = app_config.i18n.load_path + Dir[Rails.root.join('abtest', 'experiments', experiment_name, 'config', 'locales', '*.{rb,yml}').to_s]
22
+ I18n.reload!
23
+ end
24
+
25
+ manifest = Abtest::ManifestManager.instance.retrieve_manifest(experiment_name)
26
+
27
+ # Set view context for asset path
28
+ view_context_class.assets_prefix = File.join(app_config.assets.prefix, 'experiments', experiment_name)
29
+ view_context_class.assets_environment = manifest.environment
30
+ view_context_class.assets_manifest = manifest
31
+
32
+ # Prepend the lookup paths for our views
33
+ prepend_view_path(File.join(experiment_path, 'views'))
34
+
35
+ test_hash[:process].call(binding) unless test_hash[:process].nil?
36
+
37
+ experiment_activated = true
38
+ elsif (!experiment_activated)
39
+ # ensure experimental translations are removed
40
+ I18n.reload! if I18n.load_path.reject! { |path| path.include?(experiment_name) }
41
+ end
42
+ end
43
+
44
+ unless experiment_activated
45
+ # Use default manifest
46
+ manifest = Abtest::ManifestManager.instance.retrieve_manifest('default')
47
+
48
+ # Set view context for asset path
49
+ view_context_class.assets_prefix = File.join(Rails.application.config.assets.prefix)
50
+ view_context_class.assets_environment = manifest.environment
51
+ view_context_class.assets_manifest = manifest
52
+ end
11
53
  end
12
54
  end
13
55
  end
@@ -23,15 +23,15 @@ module Abtest
23
23
  end
24
24
 
25
25
  module ActionView
26
- module Rendering
27
- module ClassMethods
28
- def view_context
29
- view_context_class.new(view_renderer, view_assigns, self)
26
+ module Rendering
27
+ module ClassMethods
28
+ def view_context
29
+ view_context_class.new(view_renderer, view_assigns, self)
30
+ end
31
+ end
32
+ end
30
33
  end
31
34
  end
32
35
  end
33
36
  end
34
- end
35
- end
36
- end
37
37
 
@@ -16,11 +16,13 @@ namespace :abtest do
16
16
  images_path = File.join(experiment_path, app_config.assets.prefix, 'images')
17
17
  javascript_path = File.join(experiment_path, app_config.assets.prefix, 'javascripts')
18
18
  view_path = File.join(experiment_path, 'views')
19
+ experiment_init_path = File.join(Rails.root, 'config', 'initializers', 'abtest')
19
20
 
20
21
  FileUtils.mkdir_p(view_path)
21
22
  FileUtils.mkdir_p(application_css_path)
22
23
  FileUtils.mkdir_p(images_path)
23
24
  FileUtils.mkdir_p(javascript_path)
25
+ FileUtils.mkdir_p(experiment_init_path)
24
26
 
25
27
  # Create a new initializer file if it doesn't exist already
26
28
  initializer_path = File.join(Rails.root, 'config', 'initializers', 'abtest.rb')
@@ -36,20 +38,46 @@ namespace :abtest do
36
38
  renderer = ERB.new(template)
37
39
  result = renderer.result(binding)
38
40
 
39
- # Append initializer code to end of file
40
- File.open(initializer_path, 'a') { |f| f.write(result) }
41
+ # Create new initializer file
42
+ init_file_path = File.join(experiment_init_path, "#{name}.rb")
43
+ File.open(init_file_path, 'a') { |f| f.write(result) }
41
44
 
42
- puts "Please edit #{initializer_path} to configure experiment."
45
+ puts "Please edit #{init_file_path} to configure experiment."
43
46
  end
44
47
 
45
48
  desc "Delete all experiments"
46
49
  task :delete_experiments => :environment do
47
50
  # Remove experiments directory
48
51
  FileUtils.rm_rf(File.join(Rails.root, 'abtest'))
52
+ FileUtils.rm_rf(File.join(Rails.root, 'config', 'initializers', 'abtest'))
49
53
 
50
54
  # Remove initializer
51
55
  FileUtils.rm_f(File.join(Rails.root, 'config', 'initializers', 'abtest.rb'))
52
56
 
53
57
  puts "All tests removed"
54
58
  end
59
+
60
+ desc "Delete experiment. Experiment name is a required arg. (rake abtest:delete_experiment[name])"
61
+ task :delete_experiment, [:name] => :environment do |t, args|
62
+ name = args[:name]
63
+
64
+ if (name.nil? || name.blank?)
65
+ puts "Experiment name is required. Usage: rake abtest:add_experiment[name]"
66
+ next
67
+ end
68
+
69
+ test_root = File.join(Rails.root, 'abtest')
70
+ experiment_path = File.join(test_root, 'experiments', name)
71
+ experiment_init_path = File.join(Rails.root, 'config', 'initializers', 'abtest')
72
+ init_file_path = File.join(experiment_init_path, "#{name}.rb")
73
+
74
+ # Remove experiments directory
75
+ FileUtils.rm_rf(experiment_path)
76
+
77
+ # Remove initializer
78
+ FileUtils.rm_f(init_file_path)
79
+
80
+ puts "Experiment #{name} removed."
81
+ end
82
+
55
83
  end
@@ -1,25 +1,31 @@
1
1
 
2
- ################################################
2
+ ##########################################################
3
3
  #
4
- # Begin configuration for <%= name %> experiment
4
+ # Configuration for <%= name %> experiment.
5
5
  #
6
- ################################################
6
+ # The <%= name %>_test lambda is used to determine
7
+ # whether or not to activate this experiment. It
8
+ # is passed the current request.
9
+ #
10
+ # You can optionally add any controller processing
11
+ # that would be acceptable in a before filter by
12
+ # using the <%= name %>_process lambda. The processor
13
+ # is passed a binding of the context within a controller
14
+ # before_filter.
15
+ #
16
+ ###########################################################
7
17
 
8
- <%= name %>_test = lambda { |request|
9
- false
18
+ <%= name %>_test = lambda { |request|
19
+ false
10
20
  }
11
21
 
12
- <%= name %>_process = lambda { |controller|
13
-
22
+ # The processor is passed a binding of the context within a controller
23
+ # before_filter.
24
+ <%= name %>_process = lambda { |controller_context_binding|
25
+
14
26
  }
15
27
 
16
28
  Abtest.register_test("<%= name %>", <%= name %>_test, <%= name %>_process)
17
29
 
18
30
  # Add additional files to precompile here
19
- Rails.application.config.abtest.precompile_assets = []
20
-
21
- ################################################
22
- #
23
- # End configuration for <%= name %> experiment
24
- #
25
- ################################################
31
+ Rails.application.config.abtest.precompile_assets += []
@@ -1,3 +1,3 @@
1
1
  module Abtest
2
- VERSION = "1.0.1"
2
+ VERSION = "2.0.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abtest
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Saarinen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-06-17 00:00:00.000000000 Z
12
+ date: 2014-12-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -86,7 +86,6 @@ files:
86
86
  - lib/abtest/asset.rb
87
87
  - lib/abtest/asset_task.rb
88
88
  - lib/abtest/filters.rb
89
- - lib/abtest/processor.rb
90
89
  - lib/abtest/railtie.rb
91
90
  - lib/abtest/registry.rb
92
91
  - lib/abtest/tasks/asset_precompile.rake
@@ -114,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
113
  version: '0'
115
114
  requirements: []
116
115
  rubyforge_project:
117
- rubygems_version: 2.1.11
116
+ rubygems_version: 2.4.3
118
117
  signing_key:
119
118
  specification_version: 4
120
119
  summary: Manages AB experiments and allows for view and asset context switching for
@@ -1,52 +0,0 @@
1
- require 'rails'
2
-
3
- module Abtest
4
- class Processor
5
- def self.process_tests controller
6
-
7
- experiment_activated = false
8
-
9
- Abtest.abtest_config.registered_tests.each do |test_hash|
10
- app_config = Rails.application.config
11
- environment = Rails.application.assets
12
- experiment_name = test_hash[:name]
13
- experiment_path = Rails.root.join('abtest', 'experiments', experiment_name)
14
-
15
- if (test_hash[:check].call(controller.request) && !experiment_activated)
16
- # ensure experimental translations are loaded
17
- unless (I18n.load_path || []).last.include?(experiment_name)
18
- I18n.load_path = app_config.i18n.load_path + Dir[Rails.root.join('abtest', 'experiments', experiment_name, 'config', 'locales', '*.{rb,yml}').to_s]
19
- I18n.reload!
20
- end
21
-
22
- manifest = Abtest::ManifestManager.instance.retrieve_manifest(experiment_name)
23
-
24
- # Set view context for asset path
25
- controller.view_context_class.assets_prefix = File.join(app_config.assets.prefix, 'experiments', experiment_name)
26
- controller.view_context_class.assets_environment = manifest.environment
27
- controller.view_context_class.assets_manifest = manifest
28
-
29
- # Prepend the lookup paths for our views
30
- controller.prepend_view_path(File.join(experiment_path, 'views'))
31
-
32
- test_hash[:process].call(controller) unless test_hash[:process].nil?
33
-
34
- experiment_activated = true
35
- elsif (!experiment_activated)
36
- # ensure experimental translations are removed
37
- I18n.reload! if I18n.load_path.reject! { |path| path.include?(experiment_name) }
38
- end
39
- end
40
-
41
- unless experiment_activated
42
- # Use default manifest
43
- manifest = Abtest::ManifestManager.instance.retrieve_manifest('default')
44
-
45
- # Set view context for asset path
46
- controller.view_context_class.assets_prefix = File.join(Rails.application.config.assets.prefix)
47
- controller.view_context_class.assets_environment = manifest.environment
48
- controller.view_context_class.assets_manifest = manifest
49
- end
50
- end
51
- end
52
- end