meta_events 1.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 +17 -0
- data/.travis.yml +6 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +591 -0
- data/Rakefile +6 -0
- data/lib/meta_events/controller_methods.rb +43 -0
- data/lib/meta_events/definition/category.rb +78 -0
- data/lib/meta_events/definition/definition_set.rb +122 -0
- data/lib/meta_events/definition/event.rb +163 -0
- data/lib/meta_events/definition/version.rb +89 -0
- data/lib/meta_events/engine.rb +6 -0
- data/lib/meta_events/helpers.rb +114 -0
- data/lib/meta_events/railtie.rb +29 -0
- data/lib/meta_events/test_receiver.rb +37 -0
- data/lib/meta_events/tracker.rb +493 -0
- data/lib/meta_events/version.rb +3 -0
- data/lib/meta_events.rb +29 -0
- data/meta_events.gemspec +31 -0
- data/spec/meta_events/controller_methods_and_helpers_spec.rb +253 -0
- data/spec/meta_events/definition/category_spec.rb +102 -0
- data/spec/meta_events/definition/definition_set_spec.rb +142 -0
- data/spec/meta_events/definition/event_spec.rb +146 -0
- data/spec/meta_events/definition/version_spec.rb +93 -0
- data/spec/meta_events/tracker_spec.rb +466 -0
- data/vendor/assets/javascripts/meta_events.js.erb +154 -0
- metadata +154 -0
@@ -0,0 +1,154 @@
|
|
1
|
+
var MetaEvents = window.MetaEvents || {};
|
2
|
+
/**
|
3
|
+
* Defines the MetaEvents JavaScript module. This provides client-side functions that support MetaEvents'
|
4
|
+
* auto-tracking and frontend events systems; see README.md for more information.
|
5
|
+
*/
|
6
|
+
MetaEvents = (function() {
|
7
|
+
var out = {}; // The public object that we'll return.
|
8
|
+
var createDomIdUniqueId = 0; // Helps us ensure we generate truly unique DOM IDs.
|
9
|
+
// See MetaEvents::Helpers.meta_events_javascript_tracking_prefix for more details; just copies that string.
|
10
|
+
var trackingPrefix = <%= MetaEvents::Helpers.meta_events_javascript_tracking_prefix.to_json %>;
|
11
|
+
|
12
|
+
/**
|
13
|
+
* Given a DOM element, ensures that it has a DOM ID on it. Returns its unique DOM ID -- either the one it already
|
14
|
+
* had, or the newly-generated synthetic ID.
|
15
|
+
*
|
16
|
+
* @param element - The DOM element that you want to make sure has an ID.
|
17
|
+
*/
|
18
|
+
var getOrCreateDomId = function(element) {
|
19
|
+
var theId = element.id;
|
20
|
+
|
21
|
+
if (theId == null || theId == "") {
|
22
|
+
theId = "metaEventsSyntheticDomId" + createDomIdUniqueId++;
|
23
|
+
element.id = theId;
|
24
|
+
}
|
25
|
+
|
26
|
+
return theId;
|
27
|
+
};
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Given a DOM element that should be used with auto-tracking, calls a specified function, passing in the unique
|
31
|
+
* DOM ID of the element (which will be generated if necessary), the element itself, the name of the event that
|
32
|
+
* should be fired, and the set of properties that should be fired with that event.
|
33
|
+
*
|
34
|
+
* After the specified function is called and returns successfully, the element is marked (via a jQuery data
|
35
|
+
* attribute) so that it will never again have that function called.
|
36
|
+
*
|
37
|
+
* @param element - The element that we should use
|
38
|
+
* @param applyFunction - The function that we'll call on that element, unless it has already been called
|
39
|
+
*/
|
40
|
+
var registerTrackableElement = function(element, applyFunction) {
|
41
|
+
var registeredPropertyName = trackingPrefix + "_reg";
|
42
|
+
var registered = $(element).data(registeredPropertyName);
|
43
|
+
|
44
|
+
if (registered != null) {
|
45
|
+
return;
|
46
|
+
}
|
47
|
+
|
48
|
+
var theId = getOrCreateDomId(element);
|
49
|
+
var eventName = $(element).data(trackingPrefix + "_evt");
|
50
|
+
var eventProperties = $(element).data(trackingPrefix + "_prp");
|
51
|
+
|
52
|
+
if (! (eventName == null || eventName == "" || eventProperties == null)) {
|
53
|
+
applyFunction(theId, element, eventName, eventProperties);
|
54
|
+
<% if Rails.env.development? %>
|
55
|
+
} else {
|
56
|
+
$(element).data(registeredPropertyName, true);
|
57
|
+
throw "No Mixpanel event name or event properties on element that has class '." + trackingPrefix + "_trk', which tags it for tracking. Element: " + element;
|
58
|
+
<% end %>
|
59
|
+
}
|
60
|
+
|
61
|
+
$(element).data(registeredPropertyName, true);
|
62
|
+
};
|
63
|
+
|
64
|
+
/**
|
65
|
+
* Given a DOM element to start with and a function, finds all elements underneath that DOM element that have been
|
66
|
+
* enabled for auto-tracking (using #meta_events_tracking_attributes_for or #meta_events_tracked_link_to), and
|
67
|
+
* calls the given function on each one, in turn.
|
68
|
+
*
|
69
|
+
* The function will never be called twice for the same element (since the element is marked as having been passed to
|
70
|
+
* the function once it's done); this means that it's safe to call as often as you want -- for example, when the
|
71
|
+
* DOM changes.
|
72
|
+
*
|
73
|
+
* The function passed should accept the following parameters, in this order:
|
74
|
+
* id - the DOM ID of the element; one will be generated for it and assigned to it if not already present
|
75
|
+
* element - the element itself
|
76
|
+
* eventName - the name of the event that this DOM element should fire
|
77
|
+
* eventProperties - an object containing the properties that should be included with that event
|
78
|
+
*
|
79
|
+
* @param startingElement - The element under which we should search
|
80
|
+
* @param applyFunction - The function we should call on each element
|
81
|
+
*/
|
82
|
+
out.forAllTrackableElements = function(startingElement, applyFunction) {
|
83
|
+
$(startingElement).find("." + trackingPrefix + "_trk").each(function(index, element) {
|
84
|
+
registerTrackableElement(element, applyFunction);
|
85
|
+
});
|
86
|
+
};
|
87
|
+
|
88
|
+
var events = { };
|
89
|
+
|
90
|
+
/**
|
91
|
+
* Called to register a frontend event that was defined server-side.
|
92
|
+
*
|
93
|
+
* @param name - The name that we'll use to access this event, using 'event', below; this is different from the name
|
94
|
+
* of the actual event that will be fired and need not have any correlation;
|
95
|
+
* @param eventData - The data for the event; this must be an object containing 'event_name', which is the name of
|
96
|
+
* the event to fire, and 'properties', the set of properties to fire with that event.
|
97
|
+
*/
|
98
|
+
out.registerFrontendEvent = function(name, eventData) {
|
99
|
+
events[name] = eventData;
|
100
|
+
};
|
101
|
+
|
102
|
+
/**
|
103
|
+
* Fires a frontend event. Accepts the name (alias) that we use to access the event, and zero or more objects; all
|
104
|
+
* properties of those objects are merged together (with later objects overriding earlier ones) and then merged into
|
105
|
+
* the properties the server told us to fire with the event (again, with our properties overriding it), and then the
|
106
|
+
* event is fired by calling the current handler function set by 'setEventHandler', below (which, by default, calls
|
107
|
+
* Mixpanel).
|
108
|
+
*
|
109
|
+
* @param eventAlias - The alias for the event to fire, which must match a call to registerFrontendEvent(), above;
|
110
|
+
* this is typically created by the +meta_events_frontend_events_javascript+ method in
|
111
|
+
* MetaEvents::Helpers that's called Rails-side to generate appropriate JavaScript code in the
|
112
|
+
* page somewhere.
|
113
|
+
*/
|
114
|
+
out.event = function(eventAlias) {
|
115
|
+
var eventData = events[eventAlias];
|
116
|
+
|
117
|
+
if (eventData == null) {
|
118
|
+
<% if Rails.env.development? %>
|
119
|
+
throw "No front-end event has been registered named '" + name + "'. Did you forget to call meta_events_define_frontend_event on the server?";
|
120
|
+
<% end %>
|
121
|
+
return;
|
122
|
+
}
|
123
|
+
|
124
|
+
var effectiveProperties = { };
|
125
|
+
$.extend(effectiveProperties, eventData.properties);
|
126
|
+
|
127
|
+
for (var i = 1; i < arguments.length; ++i) {
|
128
|
+
$.extend(effectiveProperties, arguments[i]);
|
129
|
+
}
|
130
|
+
|
131
|
+
this.eventHandler(eventData.event_name, effectiveProperties);
|
132
|
+
};
|
133
|
+
|
134
|
+
/**
|
135
|
+
* The default event handler that we use if you haven't called setEventHandler(), below.
|
136
|
+
*/
|
137
|
+
out.mixpanelEventHandler = function(eventName, properties) {
|
138
|
+
mixpanel.track(eventName, properties);
|
139
|
+
};
|
140
|
+
|
141
|
+
/**
|
142
|
+
* When a frontend event is fired, there's a function, at the bottom, that actually fires the event; it gets passed
|
143
|
+
* two parameters -- the name of the event, and properties to pass with it. By default, we use mixpanelEventHandler,
|
144
|
+
* above, which, well, calls Mixpanel. This function allows you to change that to any function you want, in case you
|
145
|
+
* want to do something different.
|
146
|
+
*/
|
147
|
+
out.setEventHandler = function(eventHandler) {
|
148
|
+
this.eventHandler = eventHandler;
|
149
|
+
};
|
150
|
+
|
151
|
+
out.setEventHandler(out.mixpanelEventHandler);
|
152
|
+
|
153
|
+
return out;
|
154
|
+
}());
|
metadata
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: meta_events
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andrew Geweke
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-02-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
- - <=
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 4.99.99
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '3.0'
|
44
|
+
- - <=
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 4.99.99
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: bundler
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '1.5'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ~>
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '1.5'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rake
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rspec
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ~>
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '2.14'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ~>
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '2.14'
|
89
|
+
description:
|
90
|
+
email:
|
91
|
+
- ageweke@swiftype.com
|
92
|
+
executables: []
|
93
|
+
extensions: []
|
94
|
+
extra_rdoc_files: []
|
95
|
+
files:
|
96
|
+
- .gitignore
|
97
|
+
- .travis.yml
|
98
|
+
- Gemfile
|
99
|
+
- LICENSE.txt
|
100
|
+
- README.md
|
101
|
+
- Rakefile
|
102
|
+
- lib/meta_events.rb
|
103
|
+
- lib/meta_events/controller_methods.rb
|
104
|
+
- lib/meta_events/definition/category.rb
|
105
|
+
- lib/meta_events/definition/definition_set.rb
|
106
|
+
- lib/meta_events/definition/event.rb
|
107
|
+
- lib/meta_events/definition/version.rb
|
108
|
+
- lib/meta_events/engine.rb
|
109
|
+
- lib/meta_events/helpers.rb
|
110
|
+
- lib/meta_events/railtie.rb
|
111
|
+
- lib/meta_events/test_receiver.rb
|
112
|
+
- lib/meta_events/tracker.rb
|
113
|
+
- lib/meta_events/version.rb
|
114
|
+
- meta_events.gemspec
|
115
|
+
- spec/meta_events/controller_methods_and_helpers_spec.rb
|
116
|
+
- spec/meta_events/definition/category_spec.rb
|
117
|
+
- spec/meta_events/definition/definition_set_spec.rb
|
118
|
+
- spec/meta_events/definition/event_spec.rb
|
119
|
+
- spec/meta_events/definition/version_spec.rb
|
120
|
+
- spec/meta_events/tracker_spec.rb
|
121
|
+
- vendor/assets/javascripts/meta_events.js.erb
|
122
|
+
homepage: http://www.github.com/swiftype/meta_events
|
123
|
+
licenses:
|
124
|
+
- MIT
|
125
|
+
metadata: {}
|
126
|
+
post_install_message:
|
127
|
+
rdoc_options: []
|
128
|
+
require_paths:
|
129
|
+
- lib
|
130
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - '>='
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
135
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - '>='
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
requirements: []
|
141
|
+
rubyforge_project:
|
142
|
+
rubygems_version: 2.2.1
|
143
|
+
signing_key:
|
144
|
+
specification_version: 4
|
145
|
+
summary: Structured, documented, powerful event emitting library for Mixpanel and
|
146
|
+
other such systems.
|
147
|
+
test_files:
|
148
|
+
- spec/meta_events/controller_methods_and_helpers_spec.rb
|
149
|
+
- spec/meta_events/definition/category_spec.rb
|
150
|
+
- spec/meta_events/definition/definition_set_spec.rb
|
151
|
+
- spec/meta_events/definition/event_spec.rb
|
152
|
+
- spec/meta_events/definition/version_spec.rb
|
153
|
+
- spec/meta_events/tracker_spec.rb
|
154
|
+
has_rdoc:
|