gace 0.0.1
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 +7 -0
- data/.gitignore +32 -0
- data/.rspec +2 -0
- data/.travis.yml +1 -0
- data/CONTRIBUTING.md +67 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +67 -0
- data/Rakefile +13 -0
- data/gace.gemspec +29 -0
- data/lib/gace.rb +5 -0
- data/lib/gace/controller_helpers.rb +26 -0
- data/lib/gace/railtie.rb +11 -0
- data/lib/gace/version.rb +3 -0
- data/lib/gace/view_helpers.rb +22 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/controllers/examples_controller.rb +5 -0
- data/spec/dummy/app/experiments/test_pricing/expensive/examples/show.html.erb +1 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/examples/show.html.erb +1 -0
- data/spec/dummy/app/views/layouts/application.html.erb +15 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +29 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +78 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/assets.rb +8 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +57 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/spec/controllers/examples_controller_spec.rb +27 -0
- data/spec/rails_helper.rb +52 -0
- data/spec/spec_helper.rb +85 -0
- data/spec/support/render_views.rb +3 -0
- metadata +251 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: daa51fe76dd40742233606f9f42522d7d25cbc0d
|
4
|
+
data.tar.gz: 8637b97fad5ebe838843c8e33b90eafb3cc1eef2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 39ec8cc47378d74b7d7254db905a281110e13705f1e60eebc41b406af1ba4b86fe57b0ac29c83be06ea82c35fec5b0ca060aff9bc5bf9a87599a9616ec29a9bb
|
7
|
+
data.tar.gz: 959ad4d43b34fbed2bc009d400636e6ff0819643419a767f9110d22e2ffcc20da8c0c8f796f16d1b6af7f2919d051266746b2a0d0884a526ea77192d38ad6484
|
data/.gitignore
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# documentation
|
2
|
+
/.yardoc
|
3
|
+
/_yardoc/
|
4
|
+
/doc/
|
5
|
+
|
6
|
+
# temp files
|
7
|
+
/tmp/
|
8
|
+
*.so
|
9
|
+
*.o
|
10
|
+
*.a
|
11
|
+
mkmf.log
|
12
|
+
|
13
|
+
# test files
|
14
|
+
/coverage/
|
15
|
+
/spec/reports/
|
16
|
+
|
17
|
+
# OSX files
|
18
|
+
.DS_Store
|
19
|
+
|
20
|
+
# bundler files
|
21
|
+
/pkg/
|
22
|
+
/.bundle/
|
23
|
+
/Gemfile.lock
|
24
|
+
*.bundle
|
25
|
+
|
26
|
+
# dummy app files
|
27
|
+
log/*.log
|
28
|
+
spec/dummy/db/*.sqlite3
|
29
|
+
spec/dummy/db/*.sqlite3-journal
|
30
|
+
spec/dummy/log/*.log
|
31
|
+
spec/dummy/tmp/
|
32
|
+
spec/dummy/.sass-cache
|
data/.rspec
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
language: ruby
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# Development Workflow
|
2
|
+
|
3
|
+
## Resources
|
4
|
+
* [Git Workflow Presentation](https://docs.google.com/presentation/d/1euOiki_e4OQ4jymGhS-o3xcET8-KZhDONUolDlOVT30/edit?usp=sharing)
|
5
|
+
* [The Garage git extensions gem](https://github.com/thegarage/thegarage-gitx)
|
6
|
+
|
7
|
+
## Step 1: Create feature branch...
|
8
|
+
|
9
|
+
```bash
|
10
|
+
$ git start my-feature-branch
|
11
|
+
```
|
12
|
+
|
13
|
+
* The `start` command ensures your branch name is valid and your codebase is uptodate.
|
14
|
+
* Use a descriptive branch name to help other developers (ex: fix-login-screen, api-refactor, payment-reconcile, etc)
|
15
|
+
|
16
|
+
## Step 2: Implement the requested change...
|
17
|
+
Use [Test Driven Development](http://en.wikipedia.org/wiki/Test-driven_development) to ensure that the feature has proper code coverage.
|
18
|
+
|
19
|
+
* **RED** - Write tests for the desired behavior...
|
20
|
+
* **GREEN** - Write just enough code to get the tests to pass...
|
21
|
+
* **REFACTOR** - Cleanup for clarity and DRY-ness...
|
22
|
+
|
23
|
+
|
24
|
+
### Development Protips™
|
25
|
+
* Follow [best practices](http://robots.thoughtbot.com/post/48933156625/5-useful-tips-for-a-better-commit-message) for git commit messages to communicate your changes.
|
26
|
+
* Add [ticket references to commits to automatically trigger product management workflows](http://help.sprint.ly/knowledgebase/articles/108139-available-scm-vcs-commands)
|
27
|
+
* Only write the **minimal** amount of code necessary to accomplish the given task.
|
28
|
+
* Ensure branch stays up-to-date with latest changes that are merged into master by using: `$ git update`
|
29
|
+
* Changes that are not directly related to the current feature should be cherry-picked into their own branch and merged separately.
|
30
|
+
|
31
|
+
### Testing Protips™
|
32
|
+
* Every line of code should have associated unit tests. If it's not tested, it's probably broken and you just don't know it yet...
|
33
|
+
* Use [BetterSpecs.org](http://betterspecs.org/) as reference for writing readable and maintainable unit tests.
|
34
|
+
|
35
|
+
|
36
|
+
## Step 3: Peer Review (aka Pull Request)...
|
37
|
+
|
38
|
+
```
|
39
|
+
$ git review
|
40
|
+
```
|
41
|
+
|
42
|
+
* Describe high level overview of the branch in pull request description. Include links to relevant resources.
|
43
|
+
* Record **artifacts** created by this feature (ex: screenshots of UI changes, screencasts of UX changes, logs from database migrations, etc)
|
44
|
+
* Document **follow-up** items/tasks that need to be addressed post-release
|
45
|
+
|
46
|
+
### Questions to ask...
|
47
|
+
* Is there a simpler way to accomplish the task at hand?
|
48
|
+
* Are we solving the problems of today and not over engineering for the problems of tomorrow?
|
49
|
+
|
50
|
+
## Step 4: QA
|
51
|
+
|
52
|
+
> With great power comes great responsibility…
|
53
|
+
|
54
|
+
* You are responsible to test your changes locally and in production environments as necessary
|
55
|
+
* Test changes in local development environment using the same process used by Continuous Integration with: `$ rake ci`
|
56
|
+
* Smoketest all changes locally and in staging environment when appropriate with: `$ git integrate staging`
|
57
|
+
|
58
|
+
## Step 5: Sign-off and release
|
59
|
+
|
60
|
+
```
|
61
|
+
$ git release
|
62
|
+
```
|
63
|
+
|
64
|
+
* Ensure that build is green before releasing branch
|
65
|
+
* Pull requests must be signed off by team leads before release (preferrably via :shipit: emoji)
|
66
|
+
|
67
|
+
## Step 5: Profit?
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 The Garage
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
[](https://travis-ci.org/thegarage/gace)
|
2
|
+
|
3
|
+
# GACE
|
4
|
+
> Google Analytics Content Experiments + Rails = AWESOME
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'gace'
|
12
|
+
```
|
13
|
+
|
14
|
+
Update your view layout to include the necessary javascript.
|
15
|
+
**Make sure to include the javascript at the very top of your head element** (per Google Analytics installation instructions).
|
16
|
+
|
17
|
+
```html
|
18
|
+
<<!DOCTYPE html>
|
19
|
+
<html>
|
20
|
+
<head>
|
21
|
+
<%= gace_javascript_include %>
|
22
|
+
</head>
|
23
|
+
<body>
|
24
|
+
</body>
|
25
|
+
</html>
|
26
|
+
```
|
27
|
+
|
28
|
+
## Usage
|
29
|
+
|
30
|
+
#### Setup experiment in Google Analytics
|
31
|
+
Configure each variation with a different `gace_var` parameter value.
|
32
|
+
|
33
|
+
example:
|
34
|
+
* control: `http://mysite.com/signup`
|
35
|
+
* variation one: `http://mysite.com/signup?gace_var=expensive`
|
36
|
+
* variation two: `http://mysite.com/signup?gace_var=cheap`
|
37
|
+
|
38
|
+
Make sure to record the newly created experiment ID.
|
39
|
+
|
40
|
+
|
41
|
+
#### Configure the experiment within Rails
|
42
|
+
```ruby
|
43
|
+
class UsersController < ApplicationController
|
44
|
+
def show
|
45
|
+
define_experiment :test_pricing, '28391929-0'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
```
|
49
|
+
|
50
|
+
#### Create views for experiment variations
|
51
|
+
|
52
|
+
1. Create a directory for the experiment: `app/experiments/EXPERIMENT_NAME` (ex: app/experiments/test_pricing)
|
53
|
+
2. Create a directory for each experiment variation. The directory name **must match** the `gace_var` parameter
|
54
|
+
used when setting up the experiment in Google Analytics. (ex: `app/experiments/test_pricing/expensive` and `app/experiments/test_pricing/cheap`)
|
55
|
+
3. Create any views/partials to be used for that variation. Each directory should mirror structure used by app/views and will override
|
56
|
+
the default views if one exists. (ex: `app/experiments/test_pricing/expensive/users/show.html.erb`)
|
57
|
+
|
58
|
+
## Contributing
|
59
|
+
|
60
|
+
1. Fork it ( https://github.com/thegarage/gace/fork )
|
61
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
62
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
63
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
64
|
+
5. Create a new Pull Request
|
65
|
+
|
66
|
+
## Related Projects
|
67
|
+
* [weebo](https://github.com/clemens/weebo)
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
|
4
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
5
|
+
load 'rails/tasks/engine.rake'
|
6
|
+
|
7
|
+
begin
|
8
|
+
require 'rspec/core/rake_task'
|
9
|
+
RSpec::Core::RakeTask.new(:spec)
|
10
|
+
rescue LoadError
|
11
|
+
end
|
12
|
+
|
13
|
+
task default: :spec
|
data/gace.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'gace/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'gace'
|
8
|
+
spec.version = Gace::VERSION
|
9
|
+
spec.authors = ['Ryan Sonnek']
|
10
|
+
spec.email = ['ryan@codecrate.com']
|
11
|
+
spec.summary = %q(Rails integration for Google Analytics Content Experiments)
|
12
|
+
spec.description = %q(GACE is a simple way to integrate content experiments into your Rails application)
|
13
|
+
spec.homepage = 'https://github.com/thegarage/gace'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_development_dependency 'rails', '>= 4.1'
|
22
|
+
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
24
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
25
|
+
spec.add_development_dependency 'rspec-rails'
|
26
|
+
spec.add_development_dependency 'sqlite3'
|
27
|
+
spec.add_development_dependency 'shoulda-matchers'
|
28
|
+
spec.add_development_dependency 'pry'
|
29
|
+
end
|
data/lib/gace.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
module Gace
|
2
|
+
module ControllerHelpers
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do |base|
|
6
|
+
base.send(:attr_reader, :experiment_key)
|
7
|
+
base.helper_method :experiment_key
|
8
|
+
base.helper_method :experiment_control?
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def experiment_control?
|
14
|
+
experiment_key && !params[:gace_var]
|
15
|
+
end
|
16
|
+
|
17
|
+
def define_experiment(name, experiment_key)
|
18
|
+
@experiment_key = experiment_key
|
19
|
+
|
20
|
+
if params[:gace_var]
|
21
|
+
variation_path = Rails.root.join('app/experiments', name.to_s, params[:gace_var])
|
22
|
+
prepend_view_path(variation_path)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/gace/railtie.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'gace/view_helpers'
|
2
|
+
require 'gace/controller_helpers'
|
3
|
+
|
4
|
+
module Gace
|
5
|
+
class Railtie < Rails::Railtie
|
6
|
+
initializer 'gace.view_helpers' do |app|
|
7
|
+
ActionView::Base.send :include, Gace::ViewHelpers
|
8
|
+
ActionController::Base.send :include, Gace::ControllerHelpers
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/gace/version.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Gace
|
2
|
+
module ViewHelpers
|
3
|
+
def gace_javascript_include
|
4
|
+
return unless experiment_control?
|
5
|
+
script = <<-EOS.strip_heredoc
|
6
|
+
<script>function utmx_section(){}function utmx(){}(function(){var
|
7
|
+
k='#{experiment_key}',d=document,l=d.location,c=d.cookie;
|
8
|
+
if(l.search.indexOf('utm_expid='+k)>0)return;
|
9
|
+
function f(n){if(c){var i=c.indexOf(n+'=');if(i>-1){var j=c.
|
10
|
+
indexOf(';',i);return escape(c.substring(i+n.length+1,j<0?c.
|
11
|
+
length:j))}}}var x=f('__utmx'),xx=f('__utmxx'),h=l.hash;d.write(
|
12
|
+
'<sc'+'ript src="'+'http'+(l.protocol=='https:'?'s://ssl':
|
13
|
+
'://www')+'.google-analytics.com/ga_exp.js?'+'utmxkey='+k+
|
14
|
+
'&utmx='+(x?x:'')+'&utmxx='+(xx?xx:'')+'&utmxtime='+new Date().
|
15
|
+
valueOf()+(h?'&utmxhash='+escape(h.substr(1)):'')+
|
16
|
+
'" type="text/javascript" charset="utf-8"><\/sc'+'ript>')})();
|
17
|
+
</script><script>utmx('url','A/B');</script>
|
18
|
+
EOS
|
19
|
+
script.html_safe
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
== README
|
2
|
+
|
3
|
+
This README would normally document whatever steps are necessary to get the
|
4
|
+
application up and running.
|
5
|
+
|
6
|
+
Things you may want to cover:
|
7
|
+
|
8
|
+
* Ruby version
|
9
|
+
|
10
|
+
* System dependencies
|
11
|
+
|
12
|
+
* Configuration
|
13
|
+
|
14
|
+
* Database creation
|
15
|
+
|
16
|
+
* Database initialization
|
17
|
+
|
18
|
+
* How to run the test suite
|
19
|
+
|
20
|
+
* Services (job queues, cache servers, search engines, etc.)
|
21
|
+
|
22
|
+
* Deployment instructions
|
23
|
+
|
24
|
+
* ...
|
25
|
+
|
26
|
+
|
27
|
+
Please feel free to use a different markup language if you do not plan to run
|
28
|
+
<tt>rake doc:app</tt>.
|
data/spec/dummy/Rakefile
ADDED
File without changes
|
@@ -0,0 +1,13 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require_tree .
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any styles
|
10
|
+
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
11
|
+
* file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
This is the expensive variation template
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
This is the control template
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<%= gace_javascript_include %>
|
5
|
+
<title>Dummy</title>
|
6
|
+
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
|
7
|
+
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
|
8
|
+
<%= csrf_meta_tags %>
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
|
12
|
+
<%= yield %>
|
13
|
+
|
14
|
+
</body>
|
15
|
+
</html>
|