meta_events 1.0.3 → 1.1.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
- ---
2
- SHA1:
3
- metadata.gz: b0e91bff1639de3f7c06814202408e65284d049e
4
- data.tar.gz: 44e8e53c21fef0ed5d59264359e695f8f63735a9
5
- SHA512:
6
- metadata.gz: 347f0e4b5bb972dc9eb0ea40f636edc5a73c6f956def29db094beeb3c906d9bc88e58557163a40f114946e755f47e36d901d65ed9ec2ed02a5aa196fe0eb2003
7
- data.tar.gz: 4afaffbe07364ff7f2c8601108c5e440dd0dccd69c5d46233671a076710b1d4998e44055beba7525b1a05ccad05352aec231b29458a4751cb6acd66b521e66ab
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c8e90b6eab418b987148fddd9cef0821956dc09f
4
+ data.tar.gz: eba083b1ffef6f56b1775cc28ac55bd94e5c7dc9
5
+ SHA512:
6
+ metadata.gz: f2e1dbafa769577654782ecdfc7c1a7f8d0fb4b06a983b10677710bec4e85a79164412bcabc7af0ed77f8941588d4b9d40cdbe3c5881b3dba1f91a87bbf4e1e1
7
+ data.tar.gz: 39f251715f387ad67b30c8bee7ba12e9fa8be416e95c9309cfe18b9c57446721ef06dffae1ee3de84a167cd9685d7a0bf61a9bb8cafeca16b667f477f4f47c07
data/CHANGES.md CHANGED
@@ -1,6 +1,10 @@
1
1
  # `meta_events` Changelog
2
2
 
3
- ## 1.0.3,
3
+ ## 1.1.0, 25 May 2014
4
+
5
+ * Support for customizing the event names to Mixpanel using any algorithm you want (`:external_name` in `MetaEvents::Tracker#initialize` or `MetaEvents::Tracker.default_external_name`), or by overriding them on an `Event`-by-`Event` basis (`:external_name` in the DSL on an `Event`). Many thanks to [Aaron Lerch](https://github.com/aaronlerch) for the awesome code and responsiveness!
6
+
7
+ ### 1.0.3, 24 March 2014
4
8
 
5
9
  * Fixed an issue where the `TestReceiver`'s `Rails.logger` reference could happen before `Rails.logger` was actually loaded, causing an exception. (Thanks to [Jesse Rusak](https://github.com/jder)!)
6
10
  * Fixed a minor documentation bug (Thanks to [Jesse Rusak](https://github.com/jder)!)
data/README.md CHANGED
@@ -11,7 +11,9 @@ particularly dependent on exact Ruby versions, and should be compatible with a b
11
11
 
12
12
  Current build status: ![Current Build Status](https://api.travis-ci.org/swiftype/meta_events.png?branch=master)
13
13
 
14
- Brought to you by the folks at [Swiftype](https://www.swiftype.com/). First version written by [Andrew Geweke](https://www.github.com/ageweke).
14
+ Brought to you by the folks at [Swiftype](https://www.swiftype.com/). First version written by [Andrew Geweke](https://www.github.com/ageweke). Major contributions by:
15
+
16
+ * [Aaron Lerch](https://github.com/aaronlerch): support for sending human-readable event names to Mixpanel via `:external_name` in the DSL on an Event, or via `:external_name` in `MetaEvents::Tracker#initialize` or `MetaEvents::Tracker.default_external_name`.
15
17
 
16
18
  ### Background
17
19
 
@@ -589,6 +591,39 @@ it is difficult or impossible to know if true underlying usage, etc., _actually_
589
591
  of changing events.) You can simply create two `MetaEvents::Tracker` instances, one for each version, and use them
590
592
  in parallel.
591
593
 
594
+ ### Customizing the Event Name
595
+
596
+ Developers love names like "xyz1_user_signed_up" but sometimes it's not a developer doing the analysis.
597
+ Depending on what the back-end analytics library supports, event names in external systems are frequently not
598
+ given a lot of real estate.
599
+
600
+ In cases like these, you can override the default external event name behavior. There are three ways to
601
+ override these external names.
602
+
603
+ First, you can override them globally for all `MetaEvents::Tracker` instances:
604
+
605
+ MetaEvents::Tracker.default_external_name = lambda { |event| "#{event.category_name} #{event.name}" }
606
+
607
+ Second, you can override them for a specific `MetaEvents::Tracker` instance:
608
+
609
+ MetaEvents::Tracker.new(current_user.try(:id),
610
+ request.remote_ip,
611
+ :external_name => lambda { |event| "#{event.category_name} #{event.name}" }
612
+ )
613
+
614
+ Finally, you can override each event's external name in the events DSL:
615
+
616
+ global_events_prefix :ab
617
+
618
+ version 1, "2014-02-11" do
619
+ category :example_category do
620
+ event :example_event, "2014-02-11", "Example was exampled!", :external_name => 'ex. was ex.'
621
+ end
622
+ end
623
+
624
+ The order of precedence for determining the external event name is the DSL's `event :external_name => 'foo'`,
625
+ `MetaEvents::Tracker.new`, `MetaEvents::Tracker.default_external_name`, built-in default.
626
+
592
627
  ## Contributing
593
628
 
594
629
  1. Fork it ( http://github.com/swiftype/meta_events/fork )
@@ -1,5 +1,6 @@
1
1
  require "meta_events"
2
2
  require "meta_events/definition/event"
3
+ require "active_support"
3
4
  require "active_support/core_ext"
4
5
 
5
6
  module MetaEvents
@@ -89,12 +89,18 @@ module MetaEvents
89
89
  @introduced
90
90
  end
91
91
 
92
+ # Returns, or sets, an external_name to use for an event.
93
+ def external_name(name = nil)
94
+ @external_name = name if name
95
+ @external_name
96
+ end
97
+
92
98
  # Returns the name of the category for an event.
93
99
  def category_name
94
100
  category.name
95
101
  end
96
102
 
97
- # Returns the full name of an event, including all prefixes.
103
+ # Returns the canonical full name of an event, including all prefixes.
98
104
  def full_name
99
105
  "#{category.prefix}#{name}"
100
106
  end
@@ -139,12 +145,12 @@ module MetaEvents
139
145
  # Called with the set of options (which can be empty) supplied in the constructor; responsible for applying those
140
146
  # to the object properly.
141
147
  def apply_options!(options)
142
- options.assert_valid_keys(:introduced, :desc, :description, :retired_at)
148
+ options.assert_valid_keys(:introduced, :desc, :description, :retired_at, :external_name)
143
149
 
144
150
  introduced options[:introduced] if options[:introduced]
145
151
  desc options[:desc] if options[:desc]
146
152
  desc options[:description] if options[:description]
147
-
153
+ external_name options[:external_name] if options[:external_name]
148
154
 
149
155
  @retired_at = Time.parse(options[:retired_at]) if options[:retired_at]
150
156
  end
@@ -50,7 +50,7 @@ module MetaEvents
50
50
  instance_eval(&block) if block
51
51
  end
52
52
 
53
- # Returns the prefix that all events in this version should have -- something like "st1", for example.
53
+ # Returns the prefix that all events in this version should have -- something like "pz1", for example.
54
54
  def prefix
55
55
  "#{definition_set.global_events_prefix}#{number}_"
56
56
  end
@@ -219,6 +219,22 @@ module MetaEvents
219
219
  #
220
220
  # We recommend that you keep the global events prefix short, simply because tools like Mixpanel often have a
221
221
  # relatively small amount of screen real estate available for event names.
222
+ #
223
+ # ### Overriding Event Names
224
+ #
225
+ # There might be a situation where users performing analysis desire a friendlier name than the default.
226
+ # The external name can be customized with a lambda (or any object that responds to <tt>#call(event)</tt>).
227
+ # To customize the external name for all MetaEvents::Tracker instances,
228
+ # specify <tt>MetaEvents::Tracker.default_external_name = lambda { |event| "custom event name" }</tt>.
229
+ #
230
+ # To customize the external name for a specific MetaEvents::Tracker instance, pass the lambda
231
+ # in the constructor, for example:
232
+ # <tt>MetaEvents::Tracker.new(current_user.id, request.remote_ip, :external_name => lambda {|e| "#{e.full_name}_CUSTOM" })</tt>
233
+ #
234
+ # To reset default behavior back to the built-in default, simply set <tt>MetaEvents::Tracker.default_external_name = nil</tt>
235
+ #
236
+ # The event passed to external_name is an instance of ::MetaEvents::Definition::Event
237
+ #
222
238
  class Tracker
223
239
  class EventError < StandardError; end
224
240
  class PropertyCollisionError < EventError; end
@@ -231,17 +247,34 @@ module MetaEvents
231
247
  cattr_accessor :default_event_receivers
232
248
  self.default_event_receivers = [ ]
233
249
 
234
- # The set of event definitions from the MetaEvents DSL that MetaEvents::Tracker instances will use, by default (_i.e._, if not
235
- # passed a separate definitions file using <tt>:definitions =></tt> in the constructor). You can set this to
236
- # the pathname of a file containing event definitions, an +IO+ object containing the text of event definitions, or
237
- # an ::MetaEvents::Definition::DefinitionSet object that you create any way you want.
238
- #
239
- # Reading +default_definitions+ always will return an instance of ::MetaEvents::Definition::DefinitionSet.
240
250
  class << self
251
+
252
+ # The set of event definitions from the MetaEvents DSL that MetaEvents::Tracker instances will use, by default (_i.e._, if not
253
+ # passed a separate definitions file using <tt>:definitions =></tt> in the constructor). You can set this to
254
+ # the pathname of a file containing event definitions, an +IO+ object containing the text of event definitions, or
255
+ # an ::MetaEvents::Definition::DefinitionSet object that you create any way you want.
256
+ #
257
+ # Reading +default_definitions+ always will return an instance of ::MetaEvents::Definition::DefinitionSet.
241
258
  def default_definitions=(source)
242
259
  @default_definitions = ::MetaEvents::Definition::DefinitionSet.from(source)
243
260
  end
244
261
  attr_reader :default_definitions
262
+
263
+ # The built-in default calculation of an external event name, which is the event's <tt>:full_name</tt>
264
+ DEFAULT_EXTERNAL_NAME = lambda { |event| event.full_name }
265
+
266
+ # The default value that new MetaEvents::Tracker instances will use to provide external names for events.
267
+ def default_external_name=(provider)
268
+ if provider && !provider.respond_to?(:call)
269
+ raise ArgumentError, "default_external_name must respond to #call"
270
+ end
271
+ @default_external_name = provider
272
+ end
273
+
274
+ # If a default external name provider was not specified, use the built-in default.
275
+ def default_external_name
276
+ @default_external_name || DEFAULT_EXTERNAL_NAME
277
+ end
245
278
  end
246
279
 
247
280
  # The default version that new MetaEvents::Tracker instances will use to look up events in the MetaEvents DSL.
@@ -260,6 +293,9 @@ module MetaEvents
260
293
  # The version of events that this Tracker is using.
261
294
  attr_reader :version
262
295
 
296
+ # A method that provides the external name for an event.
297
+ attr_reader :external_name
298
+
263
299
  # Creates a new instance.
264
300
  #
265
301
  # +distinct_id+ is the "distinct ID" of the user on behalf of whom events are going to be fired; this can be +nil+
@@ -297,8 +333,11 @@ module MetaEvents
297
333
  # with every event fired from this Tracker. This can use the hash-merge and object syntax
298
334
  # (#to_event_properties) documented above. Any properties explicitly passed with an event
299
335
  # that have the same name as these properties will override these properties for that event.
336
+ # [:external_name] If present, this should be a lambda that takes a single argument and returns a string, or an
337
+ # object that responds to call(event). If +:external_name+ is not provided, it will use the
338
+ # default configured for the MetaEvents::Tracker class.
300
339
  def initialize(distinct_id, ip, options = { })
301
- options.assert_valid_keys(:definitions, :version, :implicit_properties, :event_receivers)
340
+ options.assert_valid_keys(:definitions, :version, :external_name, :implicit_properties, :event_receivers)
302
341
 
303
342
  definitions = options[:definitions] || self.class.default_definitions
304
343
  unless definitions
@@ -311,6 +350,8 @@ module MetaEvents
311
350
 
312
351
  @definitions = ::MetaEvents::Definition::DefinitionSet.from(definitions)
313
352
  @version = options[:version] || self.class.default_version || raise(ArgumentError, "Must specify a :version")
353
+ @external_name = options[:external_name] || self.class.default_external_name || raise(ArgumentError, "Must specify an :external_name")
354
+ raise ArgumentError, ":external_name option must respond to #call" unless @external_name.respond_to? :call
314
355
 
315
356
  @implicit_properties = { }
316
357
  self.class.merge_properties(@implicit_properties, { :ip => normalize_ip(ip).to_s }) if ip
@@ -346,19 +387,20 @@ module MetaEvents
346
387
  event_data[:properties] = { 'time' => Time.now.to_i }.merge(event_data[:properties])
347
388
 
348
389
  self.event_receivers.each do |receiver|
349
- receiver.track(event_data[:distinct_id], event_data[:event_name], event_data[:properties])
390
+ receiver.track(event_data[:distinct_id], event_data[:external_name], event_data[:properties])
350
391
  end
351
392
  end
352
393
 
353
394
  # Given a category, an event, and (optionally) additional properties, performs all of the expansion and validation
354
395
  # of #event!, but does not actually fire the event -- rather, returns a Hash containing:
355
396
  #
356
- # [:distinct_id] The +distinct_id+ that should be passed with the event; this can be +nil+ if there is no distinct
357
- # ID being passed.
358
- # [:event_name] The fully-qualified event name, including +global_events_prefix+ and version number, exactly as
359
- # it should be passed to an events backend.
360
- # [:properties] The full set of properties, expanded (so values will only be scalars, never Hashes or objects),
361
- # with String keys, exactly as they should be passed to an events system.
397
+ # [:distinct_id] The +distinct_id+ that should be passed with the event; this can be +nil+ if there is no distinct
398
+ # ID being passed.
399
+ # [:event_name] The fully-qualified event name, including +global_events_prefix+ and version number.
400
+ # [:external_name] The event name for use in an events backend.
401
+ # By default this is +:event_name+ but can be overridden.
402
+ # [:properties] The full set of properties, expanded (so values will only be scalars, never Hashes or objects),
403
+ # with String keys, exactly as they should be passed to an events system.
362
404
  #
363
405
  # This method can be used for many things, but its primary purpose is to support front-end (Javascript-fired)
364
406
  # events: you can have it compute exactly the set of properties that should be attached to such events, embed
@@ -376,10 +418,14 @@ module MetaEvents
376
418
  # We need to do this instead of just using || so that you can override a present distinct_id with nil.
377
419
  net_distinct_id = if properties.has_key?('distinct_id') then properties.delete('distinct_id') else self.distinct_id end
378
420
 
421
+ event_external_name = event.external_name || external_name.call(event)
422
+ raise TypeError, "The external name of an event must be a String" unless event_external_name.kind_of?(String)
423
+
379
424
  {
380
- :distinct_id => net_distinct_id,
381
- :event_name => event.full_name,
382
- :properties => properties
425
+ :distinct_id => net_distinct_id,
426
+ :event_name => event.full_name,
427
+ :external_name => event_external_name,
428
+ :properties => properties
383
429
  }
384
430
  end
385
431
 
@@ -1,3 +1,3 @@
1
1
  module MetaEvents
2
- VERSION = "1.0.3"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -7,6 +7,7 @@ describe MetaEvents::ControllerMethods do
7
7
  category :foo do
8
8
  event :bar, '2014-01-31', 'this is bar'
9
9
  event :baz, '2014-01-31', 'this is baz'
10
+ event :custom, '2014-01-31', 'this is quux', :external_name => 'super-amazing-custom'
10
11
  end
11
12
  end
12
13
  end
@@ -50,11 +51,16 @@ describe MetaEvents::ControllerMethods do
50
51
  end
51
52
 
52
53
  describe "frontend-event registration" do
53
- def expect_defined_event(name, event_name, properties, options = { })
54
+ def expect_defined_event(name, external_name, properties, options = { })
55
+ expect_defined_event_with_event_name(name, external_name, external_name, properties, options)
56
+ end
57
+
58
+ def expect_defined_event_with_event_name(name, external_name, event_name, properties, options = { })
54
59
  expected_distinct_id = options[:distinct_id] || 'abc123'
55
60
  expect(@obj.meta_events_defined_frontend_events[name]).to eq({
56
61
  :distinct_id => expected_distinct_id,
57
62
  :event_name => event_name,
63
+ :external_name => external_name,
58
64
  :properties => properties
59
65
  })
60
66
 
@@ -63,7 +69,7 @@ describe MetaEvents::ControllerMethods do
63
69
  js =~ /["']#{name}["']\s*,\s*(.*?)\s*\)\s*\;/i
64
70
  matched = $1
65
71
  hash = JSON.parse($1)
66
- expect(hash).to eq('distinct_id' => expected_distinct_id, 'event_name' => event_name, 'properties' => properties)
72
+ expect(hash).to eq('distinct_id' => expected_distinct_id, 'event_name' => event_name, 'external_name' => external_name, 'properties' => properties)
67
73
  end
68
74
 
69
75
  it "should work fine if there are no registered events" do
@@ -99,6 +105,11 @@ describe MetaEvents::ControllerMethods do
99
105
  expect_defined_event('foo_bar', 'xy1_foo_bar', { 'imp1' => 'imp1val2', 'a_b' => 'c', 'a_d' => 'e' })
100
106
  end
101
107
 
108
+ it "should use an overridden external_name" do
109
+ @obj.meta_events_define_frontend_event(:foo, :custom, { :imp1 => 'imp1val1' })
110
+ expect_defined_event_with_event_name('foo_custom', 'super-amazing-custom', 'xy1_foo_custom', { 'imp1' => 'imp1val1' })
111
+ end
112
+
102
113
  context "with one simple defined event" do
103
114
  before :each do
104
115
  @obj.meta_events_define_frontend_event(:foo, :bar, { :quux => 123 })
@@ -52,6 +52,11 @@ describe ::MetaEvents::Definition::Event do
52
52
  expect(klass.new(category, :foo, "2014-01-01") { desc 'foobar' }.desc).to eq("foobar")
53
53
  end
54
54
 
55
+ it "should let you set external_name via both mechanisms" do
56
+ expect(klass.new(category, :foo, "2014-01-01", "foobar", :external_name => "custom external name").external_name).to eq("custom external name")
57
+ expect(klass.new(category, :foo, "2014-01-01", "foobar") { external_name "custom external name" }.external_name).to eq("custom external name")
58
+ end
59
+
55
60
  context "with an instance" do
56
61
  let(:instance) { klass.new(category, :foo, "2014-01-01", "foobar") }
57
62
 
@@ -142,5 +147,15 @@ describe ::MetaEvents::Definition::Event do
142
147
  expect(note_2[:who]).to eq("someone else")
143
148
  expect(note_2[:text]).to eq("whatever")
144
149
  end
150
+
151
+ context "with a custom external name" do
152
+ let(:instance) { klass.new(category, :foo, "2014-01-01", "foobar", :external_name => "custom external name") }
153
+
154
+ it "should return and allow setting its external name via #external_name" do
155
+ expect(instance.external_name).to eq("custom external name")
156
+ instance.external_name "my name"
157
+ expect(instance.external_name).to eq("my name")
158
+ end
159
+ end
145
160
  end
146
161
  end
@@ -1,3 +1,4 @@
1
+ require "active_support"
1
2
  require 'active_support/core_ext/numeric/time'
2
3
  require 'ipaddr'
3
4
 
@@ -8,7 +9,7 @@ describe MetaEvents::Tracker do
8
9
  version 1, '2014-01-31' do
9
10
  category :foo do
10
11
  event :bar, '2014-01-31', 'this is bar'
11
- event :baz, '2014-01-31', 'this is baz'
12
+ event :baz, '2014-01-31', 'this is baz', :external_name => 'foo bazzeroo'
12
13
  event :nolonger, '2014-01-31', 'should be retired', :retired_at => '2020-01-01'
13
14
  end
14
15
  end
@@ -299,11 +300,92 @@ EOS
299
300
  end
300
301
 
301
302
  it "should pick up the default version from the class" do
302
- klass.default_version = 2
303
+ original_default_version = klass.default_version
303
304
 
304
- i = klass.new(@distinct_id, nil, :event_receivers => receiver_1, :definitions => definition_set)
305
- i.event!(:foo, :quux)
306
- expect_event("xy2_foo_quux", { })
305
+ begin
306
+ klass.default_version = 2
307
+
308
+ i = klass.new(@distinct_id, nil, :event_receivers => receiver_1, :definitions => definition_set)
309
+ i.event!(:foo, :quux)
310
+ expect_event("xy2_foo_quux", { })
311
+ ensure
312
+ klass.default_version = original_default_version
313
+ end
314
+ end
315
+
316
+ it "should use the default external name from the class" do
317
+ begin
318
+ klass.default_external_name = lambda { |event| "#{event.category_name}-super-custom-#{event.name}" }
319
+
320
+ i = klass.new(@distinct_id, nil, :event_receivers => receiver_1, :definitions => definition_set)
321
+ i.event!(:foo, :bar, { })
322
+ expect_event('foo-super-custom-bar', { })
323
+ ensure
324
+ klass.default_external_name = nil
325
+ end
326
+ end
327
+
328
+ it "should allow resetting the default external name from the class back to the built-in default" do
329
+ begin
330
+ klass.default_external_name = lambda { |event| "#{event.category_name}-super-custom-#{event.name}" }
331
+
332
+ i = klass.new(@distinct_id, nil, :event_receivers => receiver_1, :definitions => definition_set)
333
+ i.event!(:foo, :bar, { })
334
+ expect_event('foo-super-custom-bar', { })
335
+
336
+ klass.default_external_name = nil
337
+
338
+ i = klass.new(@distinct_id, nil, :event_receivers => receiver_1, :definitions => definition_set)
339
+ i.event!(:foo, :bar, { })
340
+ expect_event('xy1_foo_bar', { })
341
+ ensure
342
+ klass.default_external_name = nil
343
+ end
344
+ end
345
+
346
+ it "should allow overriding the external name in the constructor" do
347
+ i = new_instance(@distinct_id, nil, :definitions => definition_set, :external_name => lambda { |event| "#{event.category_name}-super-custom-#{event.name}" })
348
+ i.event!(:foo, :bar, { })
349
+ expect_event('foo-super-custom-bar', { })
350
+ end
351
+
352
+ it "should require the result of the external name to be a string" do
353
+ expect {
354
+ i = new_instance(@distinct_id, nil, :definitions => definition_set, :external_name => lambda { |event| 1234 })
355
+ i.event!(:foo, :bar, { })
356
+ }.to raise_error(TypeError, /external name/i)
357
+ end
358
+
359
+ context "with default_external_name set" do
360
+ before :each do
361
+ klass.default_external_name = lambda { |event| "default-#{event.category_name}-#{event.name}-custom" }
362
+ end
363
+
364
+ after :each do
365
+ klass.default_external_name = nil
366
+ end
367
+
368
+ it "should return event external_name if set" do
369
+ i = new_instance(@distinct_id, nil, :definitions => definition_set, :external_name => lambda { |event| "#{event.category_name}-#{event.name}-custom" })
370
+ i.event!(:foo, :baz, { })
371
+ expect_event('foo bazzeroo', { })
372
+ end
373
+
374
+ context "no event external_name is set" do
375
+ it "should return instance external_name" do
376
+ i = new_instance(@distinct_id, nil, :definitions => definition_set, :external_name => lambda { |event| "#{event.category_name}-#{event.name}-custom" })
377
+ i.event!(:foo, :bar, { })
378
+ expect_event('foo-bar-custom', { })
379
+ end
380
+
381
+ context "no instance external_name is set" do
382
+ it "should return default_external_name" do
383
+ i = new_instance(@distinct_id, nil, :definitions => definition_set)
384
+ i.event!(:foo, :bar, { })
385
+ expect_event('default-foo-bar-custom', { })
386
+ end
387
+ end
388
+ end
307
389
  end
308
390
 
309
391
  it "should allow firing a valid event, and include implicit properties" do
@@ -413,7 +495,7 @@ EOS
413
495
  end
414
496
 
415
497
  it "should include no additional keys" do
416
- expect(@instance.effective_properties(:foo, :bar).keys.sort_by(&:to_s)).to eq(%w{distinct_id event_name properties}.map(&:to_sym).sort_by(&:to_s))
498
+ expect(@instance.effective_properties(:foo, :bar).keys.sort_by(&:to_s)).to eq(%w{distinct_id event_name external_name properties}.map(&:to_sym).sort_by(&:to_s))
417
499
  end
418
500
  end
419
501
 
@@ -92,7 +92,7 @@ MetaEvents = (function() {
92
92
  *
93
93
  * @param name - The name that we'll use to access this event, using 'event', below; this is different from the name
94
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
95
+ * @param eventData - The data for the event; this must be an object containing 'external_name', which is the name of
96
96
  * the event to fire, and 'properties', the set of properties to fire with that event.
97
97
  */
98
98
  out.registerFrontendEvent = function(name, eventData) {
@@ -128,14 +128,15 @@ MetaEvents = (function() {
128
128
  $.extend(effectiveProperties, arguments[i]);
129
129
  }
130
130
 
131
- this.eventHandler(eventData.event_name, effectiveProperties);
131
+ var external_name = eventData.external_name || eventData.event_name;
132
+ this.eventHandler(external_name, effectiveProperties);
132
133
  };
133
134
 
134
135
  /**
135
136
  * The default event handler that we use if you haven't called setEventHandler(), below.
136
137
  */
137
- out.mixpanelEventHandler = function(eventName, properties) {
138
- mixpanel.track(eventName, properties);
138
+ out.mixpanelEventHandler = function(externalName, properties) {
139
+ mixpanel.track(externalName, properties);
139
140
  };
140
141
 
141
142
  /**
metadata CHANGED
@@ -1,100 +1,82 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: meta_events
3
- version: !ruby/object:Gem::Version
4
- version: 1.0.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Andrew Geweke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-24 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
11
+
12
+ date: 2014-05-25 00:00:00 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
14
15
  name: json
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.0'
20
- type: :runtime
21
16
  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
17
+ requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: "1.0"
37
22
  type: :runtime
23
+ version_requirements: *id001
24
+ - !ruby/object:Gem::Dependency
25
+ name: activesupport
38
26
  prerelease: false
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
27
+ requirement: &id002 !ruby/object:Gem::Requirement
28
+ requirements:
41
29
  - - ">="
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
30
+ - !ruby/object:Gem::Version
31
+ version: "3.0"
32
+ - - <
33
+ - !ruby/object:Gem::Version
34
+ version: "4.0"
35
+ type: :runtime
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
48
38
  name: bundler
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: '1.5'
54
- type: :development
55
39
  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'
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ version: "1.5"
68
45
  type: :development
46
+ version_requirements: *id003
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
69
49
  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'
50
+ requirement: &id004 !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - &id006
53
+ - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: "0"
82
56
  type: :development
57
+ version_requirements: *id004
58
+ - !ruby/object:Gem::Dependency
59
+ name: rspec
83
60
  prerelease: false
84
- version_requirements: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - "~>"
87
- - !ruby/object:Gem::Version
88
- version: '2.14'
61
+ requirement: &id005 !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: "2.14"
66
+ type: :development
67
+ version_requirements: *id005
89
68
  description:
90
- email:
69
+ email:
91
70
  - ageweke@swiftype.com
92
71
  executables: []
72
+
93
73
  extensions: []
74
+
94
75
  extra_rdoc_files: []
95
- files:
96
- - ".gitignore"
97
- - ".travis.yml"
76
+
77
+ files:
78
+ - .gitignore
79
+ - .travis.yml
98
80
  - CHANGES.md
99
81
  - Gemfile
100
82
  - LICENSE.txt
@@ -121,31 +103,29 @@ files:
121
103
  - spec/meta_events/tracker_spec.rb
122
104
  - vendor/assets/javascripts/meta_events.js.erb
123
105
  homepage: http://www.github.com/swiftype/meta_events
124
- licenses:
106
+ licenses:
125
107
  - MIT
126
108
  metadata: {}
109
+
127
110
  post_install_message:
128
111
  rdoc_options: []
129
- require_paths:
112
+
113
+ require_paths:
130
114
  - lib
131
- required_ruby_version: !ruby/object:Gem::Requirement
132
- requirements:
133
- - - ">="
134
- - !ruby/object:Gem::Version
135
- version: '0'
136
- required_rubygems_version: !ruby/object:Gem::Requirement
137
- requirements:
138
- - - ">="
139
- - !ruby/object:Gem::Version
140
- version: '0'
115
+ required_ruby_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - *id006
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - *id006
141
121
  requirements: []
122
+
142
123
  rubyforge_project:
143
- rubygems_version: 2.2.1
124
+ rubygems_version: 2.0.14
144
125
  signing_key:
145
126
  specification_version: 4
146
- summary: Structured, documented, powerful event emitting library for Mixpanel and
147
- other such systems.
148
- test_files:
127
+ summary: Structured, documented, powerful event emitting library for Mixpanel and other such systems.
128
+ test_files:
149
129
  - spec/meta_events/controller_methods_and_helpers_spec.rb
150
130
  - spec/meta_events/definition/category_spec.rb
151
131
  - spec/meta_events/definition/definition_set_spec.rb