omniturize 0.0.3

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.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in omniturize.gemspec
4
+ gemspec
data/MIT-LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2009 Alexandru Catighera
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,139 @@
1
+ # Omniturize
2
+ This gem integrates Omniture SiteCatalyst into your web app.
3
+
4
+ ## Installation
5
+ gem install omniturize
6
+
7
+ ## Based on and unaware collaborators
8
+ This is gem is based on [activenetwork's OmnitureClient gem](https://github.com/activenetwork/omniture_client, "activenetwork's OmnitureClient"), which was forked from [acatighera's](https://github.com/acatighera/omniture_client, "acatighera's OmnitureClient").
9
+
10
+ There is some borrowed code from unawared coders. So thank you to
11
+
12
+ * [acatighera](https://github.com/acatighera, "acatighera github homepage")
13
+ * [activenetwork](https://github.com/activenetwork, "activenetwork github homepage")
14
+ * [John Nunemaker](http://railstips.org/about, "railstips") for his [ClassLevelInheritableAttributes solution](http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/, "Class and instance variables in ruby")
15
+
16
+ ## Configuration
17
+ You must configure the Omniture namespace, suite(s), version that you wish to use.
18
+ Optionally, you can set up aliases to make things easier for yourself when coding reporters. Omniture uses c1, e1, r, etc to represent custom variables, e_vars, the referrer, etc. These param names are obscure and can be hard to remember so you can set up aliases for them.
19
+
20
+ # config/omniture.yml
21
+ development:
22
+ base_url: http://102.112.2O7.net
23
+ ssl_url: https://102.112.2O7.net
24
+ suite: suite1
25
+ version: G.4--NS
26
+ aliases:
27
+ search_term: c1
28
+ movie_titles: e1
29
+ referrer: r
30
+
31
+ Then, you should add this line to an initializer:
32
+
33
+ Omniturize::config(YAML::load(File.open("#{Rails.root}/config/omniture.yml"))[Rails.env])
34
+
35
+ ## Usage
36
+ ###Attaching to the controllers
37
+ You can select which controllers you want to track by adding the next line
38
+
39
+ class FooController < ApplicationController
40
+ omniturize
41
+ end
42
+
43
+ For each controller you want to track, you should create a reporter. The root name of this reporter should be the same name as the controller -or the `BasicController` explained below.
44
+
45
+
46
+ #FooReporter for FooController
47
+ class FooReporter < Omniturize::Base
48
+ ...
49
+ end
50
+
51
+ If there is a basic behaviour for some of your controllers, you should create a BasicReporter. This reporter will be used in case a reporter with the same name as the controller is not found.
52
+
53
+ #BasicReporter
54
+ class BasicReporter < Omniturize::Base
55
+ ...
56
+ end
57
+
58
+
59
+ ###vars
60
+ You can define a var by giving it a name and defining a block
61
+
62
+
63
+ var :my_var do
64
+ params[:id]
65
+ end
66
+
67
+
68
+ You can define a var to be present in or excluded from some actions.
69
+
70
+ #This var will be present only in index and new actions
71
+ var :my_var, :only => [:index, :new] do
72
+ 'value_for_my_var'
73
+ end
74
+
75
+ #this var will be excluded from index, new, create, update and destroy actions
76
+
77
+ var :my_var, :except => [:index, :new, :create, :update, :destroy] do
78
+ params[:id]
79
+ end
80
+
81
+
82
+ If no :only or :excluded options are passed, the defined var will be available in every action.
83
+
84
+ ###Events
85
+ You can define an event the same way you define a var, except that you don't have to give a name for the event
86
+
87
+ event, :only => [:search] do
88
+ 'my_event'
89
+ end
90
+
91
+ ###Custom javascript
92
+ You can define custom javascript code the same way you define an event
93
+
94
+ js_snippet, :only => [:search] do
95
+ 's.server = window.location.host;'
96
+ end
97
+
98
+ ###Using controller methods in the blocks
99
+ Since the block you are defining is executed within the controller context, you can use every method defined in your controller.
100
+
101
+ ##File structure
102
+ My advice is to create these reporters in the 'app/reporters' directory, by creating this directory and adding it to the autoload_path
103
+
104
+ config.autoload_paths += "#{RAILS_ROOT}/app/reporters"
105
+
106
+ You can create a hierarchy of reporters. This way you can share some configurations between classes and override them if necessary, e.g: you would want to create an ApplicationReporter which will contain the most common behaviour, and subclass this reporter for adding or modifying new vars, events, or js
107
+
108
+
109
+ class ApplicationReporter < Omniturize::Base
110
+ var :my_var do
111
+ 'common value'
112
+ end
113
+ end
114
+
115
+ class FooReporter < ApplicationReporter
116
+ var :my_var do
117
+ 'foo'
118
+ end
119
+
120
+ var :foo_var do
121
+ 'foo2'
122
+ end
123
+ end
124
+
125
+
126
+ ## Views
127
+ Somewhere in your view -probably in one of your layouts- you should add the next line:
128
+
129
+
130
+ @controller.reporter.js(:action => params[:action])
131
+
132
+
133
+ ##More info
134
+ Since this gem has been created for a very specific use, it may be that this documentation is not enough for you. I have tried to keep the most code from the original sources, so you would want to take a look to the code itself or to the original sources where I took the code
135
+
136
+ * [OmnitureClient gem](https://github.com/acatighera/omniture_client, "acathigera's OmnitureClient")
137
+ * [activenetwork's fork](https://github.com/activenetwork/omniture_client, "activenetwork's OmnitureClient")
138
+
139
+ ##### Copyright (c) 2011 Javier Lafora, released under MIT license
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,31 @@
1
+ # This code was proudly and shamelessly copied from
2
+ # http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/
3
+ # so let's all thank John Nunemaker with a loud and strong applause: PLAS!!!!'
4
+
5
+ module Omniturize
6
+ module ClassLevelInheritableAttributes
7
+ def self.included(base)
8
+ base.extend(ClassMethods)
9
+ end
10
+
11
+ module ClassMethods
12
+ def inheritable_attributes(*args)
13
+ @omniture_inheritable_attributes ||= [:omniture_inheritable_attributes]
14
+ @omniture_inheritable_attributes += args
15
+ args.each do |arg|
16
+ class_eval %(
17
+ class << self; attr_accessor :#{arg} end
18
+ )
19
+ end
20
+ @omniture_inheritable_attributes
21
+ end
22
+
23
+ def inherited(subclass)
24
+ @omniture_inheritable_attributes.each do |inheritable_attribute|
25
+ instance_var = "@#{inheritable_attribute}"
26
+ subclass.instance_variable_set(instance_var, instance_variable_get(instance_var))
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,104 @@
1
+ module Omniturize
2
+ class Base
3
+
4
+ include Omniturize::ClassLevelInheritableAttributes
5
+ include Omniturize::Printer
6
+ inheritable_attributes :meta_vars, :meta_js_events, :meta_js_snippets
7
+
8
+ attr_reader :controller
9
+
10
+ @meta_vars = []
11
+ @meta_js_events = []
12
+ @meta_js_snippets = []
13
+
14
+
15
+ class << self
16
+ attr_accessor :meta_vars, :meta_js_events, :meta_js_snippets
17
+ @@controller = nil
18
+
19
+ def var(name, options={}, &block)
20
+ meta_var = Omniturize::MetaVar.new(name.to_s, options)
21
+ meta_var.add_var(block)
22
+ meta_vars.insert(0, meta_var) unless meta_vars.include?(meta_var)
23
+ meta_var
24
+ end
25
+
26
+ def event(options = {}, &block)
27
+ meta_js(meta_js_events, block, options)
28
+ end
29
+
30
+ def js_snippet(options = {}, &block)
31
+ meta_js(meta_js_snippets, block, options)
32
+ end
33
+
34
+ def find_meta_vars(name, action = nil)
35
+ filter_collection_for_action(meta_vars.select{|x|x.matches_name?(name)}, action).uniq_by(:name)
36
+ end
37
+
38
+ def filter_collection_for_action(collection, action)
39
+ return collection if action.blank?
40
+ collection.select do |element|
41
+ (element.only.present? && element.only.include?(action.try(:to_sym))) ||
42
+ (element.except.present? && !element.except.include?(action.try(:to_sym))) ||
43
+ (element.only.blank? && element.except.blank?)
44
+ end
45
+ end
46
+
47
+ protected
48
+
49
+ def meta_js(collection, block, options = {})
50
+ meta_js = Omniture::MetaJs.new(options)
51
+ meta_js.add_js(block)
52
+ collection.insert(0, meta_js)
53
+ meta_js
54
+ end
55
+
56
+ end
57
+
58
+ def initialize(controller)
59
+ @controller = controller
60
+ end
61
+
62
+ def vars(options = {})
63
+ meta_collection_to_values(self.class.meta_vars, options[:action]).uniq_by(:name)
64
+ end
65
+
66
+ def js_events(options = {})
67
+ meta_collection_to_values(self.class.meta_js_events, options[:action]).uniq
68
+ end
69
+
70
+ def js_snippets(options = {})
71
+ meta_collection_to_values(self.class.meta_js_snippets, options[:action]).uniq
72
+ end
73
+
74
+ def add_var(name, value)
75
+ self.class.var(name) do
76
+ value
77
+ end
78
+ end
79
+
80
+ def find_var(name, options = {})
81
+ vars(options[:action]).detect{|x|x.matches_name?(name)}
82
+ end
83
+
84
+ def meta_vars_to_vars(meta_vars)
85
+ meta_vars.inject([]) do |vars, meta_var|
86
+ vars << meta_var.value(controller) if meta_var
87
+ vars
88
+ end
89
+ end
90
+
91
+ protected
92
+
93
+ def build_js_collection(procs_collection)
94
+ procs_collection.inject([]) do |code, js|
95
+ code << controller.instance_eval(&js)
96
+ code
97
+ end
98
+ end
99
+
100
+ def meta_collection_to_values(collection, action = nil)
101
+ action.present? ? meta_vars_to_vars(self.class.filter_collection_for_action(collection, action)): meta_vars_to_vars(collection)
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,42 @@
1
+ module Omniture
2
+ class MetaJs
3
+ attr_reader :cache_key, :expires_in, :only, :except, :delimiter
4
+ attr_accessor :value_procs
5
+
6
+ DEFAULT_OPTIONS = { :unique => nil,
7
+ :expires_in => 0,
8
+ :only => [],
9
+ :except => [],
10
+ :delimiter => ','
11
+ }
12
+
13
+ def initialize(options = {})
14
+ options = DEFAULT_OPTIONS.merge(options)
15
+
16
+ @value_procs = []
17
+ @cache_key = "omniture/#{Time.now.to_i}/#{options[:unique]}"
18
+ @expires_in = options[:expires_in]
19
+ @only = options[:only]
20
+ @except = options[:except]
21
+ end
22
+
23
+ def add_js(value_proc)
24
+ value_procs << value_proc
25
+ end
26
+
27
+ def value(scope)
28
+ if @expires_in > 0
29
+ Rails.cache.fetch(@cache_key, :expires_in => @expires_in) do
30
+ return_var(scope)
31
+ end
32
+ else
33
+ return_var(scope)
34
+ end
35
+ end
36
+
37
+ def return_var(scope)
38
+ value_procs.map{ |p| scope.instance_eval(&p) }.flatten.uniq.join(delimiter)
39
+ #scope.instance_eval(&p)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,53 @@
1
+ module Omniturize
2
+ class MetaVar
3
+
4
+ DEFAULT_OPTIONS = { :delimiter => ',',
5
+ :unique => nil,
6
+ :expires_in => 0,
7
+ :only => [],
8
+ :except => []
9
+ }
10
+
11
+ attr_reader :name, :delimiter, :cache_key, :expires_in, :only, :except
12
+ attr_accessor :value_procs
13
+
14
+ def initialize(name, options = {})
15
+ options = DEFAULT_OPTIONS.merge(options)
16
+ @name = name
17
+ @value_procs = []
18
+ @delimiter = options[:delimiter]
19
+ @cache_key = "omniture/#{name}/#{options[:unique]}"
20
+ @expires_in = options[:expires_in]
21
+ @only = Array(options[:only])
22
+ @except = Array(options[:except])
23
+ end
24
+
25
+ def add_var(value_proc)
26
+ value_procs << value_proc
27
+ end
28
+
29
+ # wrap up the value in a Var object and cache if needed
30
+ def value(scope)
31
+ if @expires_in > 0
32
+ Rails.cache.fetch(@cache_key, :expires_in => @expires_in) do
33
+ return_var(scope)
34
+ end
35
+ else
36
+ return_var(scope)
37
+ end
38
+ end
39
+
40
+ def return_var(scope)
41
+ Var.new(name, value_procs.map{ |p| scope.instance_eval(&p) }.flatten.uniq.join(delimiter))
42
+ end
43
+
44
+ def matches_name?(name)
45
+ select_condition = case name
46
+ when Regexp then self.name.match(name)
47
+ when String then self.name == name
48
+ else raise ArgumentError.new('name must be a String or a Regexp')
49
+ end
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,62 @@
1
+ module Omniturize
2
+ module Printer
3
+
4
+ def url(ssl = false)
5
+ suite = Omniturize::suite.is_a?(Array) ? Omniturize::suite.join(',') : Omniturize::suite
6
+ base_url = ssl == :ssl ? Omniturize::ssl_url : Omniturize::base_url
7
+ "#{base_url}/b/ss/#{suite}/#{Omniturize::version}/#{rand(9999999)}?#{query}"
8
+ end
9
+
10
+ def js(options = {})
11
+ output = <<-JS
12
+ <script type="text/javascript" language="JavaScript" src="#{Omniturize::js_src}"></script>
13
+ <script type="text/javascript" language="JavaScript">
14
+ #{js_vars(options)}
15
+ #{print_js_events(options)}
16
+ #{print_js_snippets(options)}
17
+ var s_code=s.t();if(s_code)document.write(s_code)
18
+ </script>
19
+ JS
20
+ end
21
+
22
+ def query(options = {})
23
+ vars(options).inject([]) do |query, var|
24
+ query << var_to_query(var) if var.value && var.value != ""
25
+ query
26
+ end.join('&')
27
+ end
28
+
29
+ def js_vars(options = {})
30
+ vars(options).inject([]) do |query, var|
31
+ query << var_to_js(var) if var.value && var.value != ""
32
+ query
33
+ end.join(";\n") + ';'
34
+ end
35
+
36
+ def raw_vars(options = {})
37
+ vars(options).inject([]) do |query, var|
38
+ query << { var.name.to_sym => var.value } if var.value && var.value != ""
39
+ query
40
+ end
41
+ end
42
+
43
+ def print_js_events(options = {})
44
+ values = js_events(options).join(',')
45
+ values.blank? ? nil : "s.events = \"#{values}\""
46
+ end
47
+
48
+ def print_js_snippets(options = {})
49
+ js_snippets(options).join("\n")
50
+ end
51
+
52
+ private
53
+
54
+ def var_to_query(var)
55
+ "#{ CGI::escape(var.name) }=#{ CGI::escape(var.value) }" if var
56
+ end
57
+
58
+ def var_to_js(var)
59
+ %Q{\t#{Omniturize::var_prefix + '.' if Omniturize::var_prefix}#{var.name}="#{var.value}"} if var
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,22 @@
1
+ module Omniturize
2
+ class Var
3
+ attr_reader :name, :value
4
+ def initialize(name, value)
5
+ if Omniturize::aliases && Omniturize::aliases[name.to_s]
6
+ @name = Omniturize::aliases[name.to_s]
7
+ else
8
+ @name = name.to_s
9
+ end
10
+ @value = value
11
+ end
12
+
13
+ def matches_name?(name)
14
+ select_condition = case name
15
+ when Regexp then self.name.match(name)
16
+ when String then self.name == name
17
+ else raise ArgumentError.new('name must be a String or a Regexp')
18
+ end
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,3 @@
1
+ module Omniturize
2
+ VERSION = "0.0.3"
3
+ end
data/lib/omniturize.rb ADDED
@@ -0,0 +1,26 @@
1
+ require "omniturize/version"
2
+ require File.dirname(__FILE__) + '/class_level_inheritable_attributes'
3
+ require File.dirname(__FILE__) + '/omniturize/printer'
4
+ require File.dirname(__FILE__) + '/omniturize/base'
5
+ require File.dirname(__FILE__) + '/omniturize/var'
6
+ require File.dirname(__FILE__) + '/omniturize/meta_js'
7
+ require File.dirname(__FILE__) + '/omniturize/meta_var'
8
+ require 'cgi'
9
+
10
+ module Omniturize
11
+
12
+ class << self
13
+ def config(config_hash)
14
+ config_hash.each do |key, val|
15
+ module_eval do
16
+ mattr_accessor key.to_sym
17
+ end
18
+ send("#{key}=", val)
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ if defined?(Rails)
25
+ require File.dirname(__FILE__) + '/omniturize_rails'
26
+ end
@@ -0,0 +1,34 @@
1
+ module Omniturize
2
+ module ActionControllerMethods
3
+
4
+ def self.included(base)
5
+ base.extend(ClassMethods)
6
+ end
7
+
8
+ module ClassMethods
9
+ def omniturize(options = {})
10
+ include InstanceMethods
11
+ before_filter :set_reporter, options
12
+ attr_accessor :reporter
13
+ end
14
+ end
15
+
16
+ module InstanceMethods
17
+
18
+ private
19
+
20
+ def set_reporter(options = {})
21
+
22
+ @reporter ||= begin
23
+ options[:controller].present? ? "#{options[:controller].classify}Reporter".constantize.new(self) :
24
+ "#{self.controller_name.capitalize}Reporter".constantize.new(self)
25
+ rescue NameError
26
+ BasicReporter.new(self)
27
+ end
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+
34
+ ActionController::Base.send(:include, Omniturize::ActionControllerMethods) if defined?(ActionController::Base)
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "omniturize/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "omniturize"
7
+ s.version = Omniturize::VERSION
8
+ s.authors = ["eLafo"]
9
+ s.email = ["javierlafora@gmail.com"]
10
+ s.homepage = "https://github.com/eLafo/omniturize"
11
+ s.summary = %q{This gem integrates Omniture SiteCatalyst into your web app}
12
+ s.description = %q{This gem integrates Omniture SiteCatalyst into your web app. You can specify vars, events and custom javascript for every action of a controller. This gem is proudly based on the omniture_client gem, from which it takes much code and ideas}
13
+
14
+ s.rubyforge_project = "omniturize"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: omniturize
3
+ version: !ruby/object:Gem::Version
4
+ hash: 25
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 3
10
+ version: 0.0.3
11
+ platform: ruby
12
+ authors:
13
+ - eLafo
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-09-13 00:00:00 Z
19
+ dependencies: []
20
+
21
+ description: This gem integrates Omniture SiteCatalyst into your web app. You can specify vars, events and custom javascript for every action of a controller. This gem is proudly based on the omniture_client gem, from which it takes much code and ideas
22
+ email:
23
+ - javierlafora@gmail.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - .gitignore
32
+ - Gemfile
33
+ - MIT-LICENSE
34
+ - README.markdown
35
+ - Rakefile
36
+ - lib/class_level_inheritable_attributes.rb
37
+ - lib/omniturize.rb
38
+ - lib/omniturize/base.rb
39
+ - lib/omniturize/meta_js.rb
40
+ - lib/omniturize/meta_var.rb
41
+ - lib/omniturize/printer.rb
42
+ - lib/omniturize/var.rb
43
+ - lib/omniturize/version.rb
44
+ - lib/omniturize_rails.rb
45
+ - omniturize.gemspec
46
+ homepage: https://github.com/eLafo/omniturize
47
+ licenses: []
48
+
49
+ post_install_message:
50
+ rdoc_options: []
51
+
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ hash: 3
69
+ segments:
70
+ - 0
71
+ version: "0"
72
+ requirements: []
73
+
74
+ rubyforge_project: omniturize
75
+ rubygems_version: 1.8.10
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: This gem integrates Omniture SiteCatalyst into your web app
79
+ test_files: []
80
+