delayed_kiss 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in delayed_kiss.gemspec
4
+ gemspec
5
+ gem 'rspec', '2.7.0'
6
+ gem 'mocha', '0.10.0'
data/README.textile ADDED
@@ -0,0 +1,44 @@
1
+ h1. Delayed Kiss
2
+
3
+ A simple interface for the KISSmetrics API that plays nicely with Delayed Job and Heroku.
4
+
5
+ h2. Installation
6
+
7
+ Include the gem in your gemfile:
8
+
9
+ <pre>
10
+ gem 'delayed_kiss'
11
+ </pre>
12
+
13
+ Configure your API key:
14
+ <pre>
15
+ #in config/kiss_metrics.yml
16
+ development:
17
+ key: <yourkey>
18
+ test:
19
+ key: <yourkey>
20
+ production:
21
+ key: <yourkey>
22
+ </pre>
23
+ Initialize the API key
24
+ <pre>
25
+ #in config/initializers
26
+ KM_CONFIG = YAML::load(ERB.new(IO.read(File.join(Rails.root, "config/kissmetrics.yml"))).result)[Rails.env]
27
+ if !KM_CONFIG.blank?
28
+ DelayedKiss.configure do |config|
29
+ config.key = KM_CONFIG['key']
30
+ end
31
+ end
32
+ </pre>
33
+
34
+ h2. Usage
35
+
36
+ Start recording events anywhere in your application:
37
+ <pre>
38
+ DelayedKiss.alias(anonymous_user, user.km_id)
39
+ DelayedKiss.record(user.km_id, 'signed up')
40
+ </pre>
41
+
42
+ h2. Thanks
43
+
44
+ DelayedKiss is derived and gemified from https://github.com/vbrendel/delayed_km
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new('spec')
5
+
6
+ # If you want to make this the default task
7
+ task :default => :spec
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "delayed_kiss/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "delayed_kiss"
7
+ s.version = DelayedKiss::VERSION
8
+ s.authors = ["Dustin DeYoung"]
9
+ s.email = ["ddeyoung@authorsolutions.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{KissMetrics API with Delayed Job}
12
+ s.description = %q{A simple wrapper for the KissMetrics API using Delayed Job}
13
+
14
+ s.rubyforge_project = "delayed_kiss"
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
+
21
+ s.add_dependency("activesupport")
22
+ s.add_dependency("i18n")
23
+ s.add_dependency("httparty", ">= 0.8.1")
24
+ s.add_dependency("delayed_job", ">= 2.1.4")
25
+ end
@@ -0,0 +1,3 @@
1
+ module DelayedKiss
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,52 @@
1
+ require "delayed_kiss/version"
2
+
3
+ module DelayedKiss
4
+ mattr_accessor :key
5
+ @@key = nil
6
+
7
+ def self.configure
8
+ yield self
9
+ end
10
+
11
+ def self.record(id, event, query_params={})
12
+ raise DelayedKiss::ConfigurationError if @@key.blank?
13
+ raise ArgumentError.new("id can't be blank") if id.blank?
14
+ raise ArgumentError.new("event can't be blank") if event.blank?
15
+
16
+ query_params.merge!({
17
+ '_n' => event,
18
+ '_p' => id,
19
+ '_t' => Time.now.to_i.to_s,
20
+ '_k' => @@key
21
+ })
22
+ HTTParty.delay.get('https://trk.kissmetrics.com/e?' + query_params.to_param)
23
+ end
24
+
25
+ def self.alias(alias_from, alias_to)
26
+ raise DelayedKiss::ConfigurationError if @@key.blank?
27
+ raise ArgumentError.new("you must specify both a from a to value") if alias_from.blank? || alias_to.blank?
28
+
29
+ query_params = {
30
+ '_n' => alias_to,
31
+ '_p' => alias_from,
32
+ '_t' => Time.now.to_i.to_s,
33
+ '_k' => @@key
34
+ }
35
+ HTTParty.delay.get('https://trk.kissmetrics.com/a?' + query_params.to_param)
36
+ end
37
+
38
+ def self.set(id, query_params)
39
+ raise DelayedKiss::ConfigurationError if @@key.blank?
40
+ raise ArgumentError.new("id can't be blank") if !id || id.blank?
41
+ return if query_params.blank? # don't do anything if we're not setting any values on the identity
42
+
43
+ query_params.merge!({
44
+ '_p' => id,
45
+ '_t' => Time.now.to_i.to_s,
46
+ '_k' => @@key
47
+ })
48
+ HTTParty.delay.get('https://trk.kissmetrics.com/s?' + query_params.to_param)
49
+ end
50
+
51
+ class ConfigurationError < StandardError; end
52
+ end
@@ -0,0 +1,110 @@
1
+ require 'spec_helper'
2
+
3
+ describe DelayedKiss do
4
+ describe :configure do
5
+ before(:each) do
6
+ DelayedKiss.cache_config
7
+ end
8
+
9
+ after(:each) do
10
+ DelayedKiss.reset_config
11
+ end
12
+
13
+ it "should configure the key" do
14
+ test_key = "youraikeyvalue"
15
+ DelayedKiss.configure do |config|
16
+ config.key = test_key
17
+ end
18
+
19
+ DelayedKiss.key.should == test_key
20
+ end
21
+ end
22
+
23
+ describe :record do
24
+ it "should send a request to the KISSmetrics API when valid parameters are supplied" do
25
+ HTTParty.expects(:get).once.returns(true)
26
+ DelayedKiss.record("identity", "event")
27
+ end
28
+
29
+ it "should raise an error without an identity" do
30
+ HTTParty.expects(:get).never
31
+ expect { DelayedKiss.record(nil, "event") }.to raise_error(ArgumentError)
32
+ end
33
+
34
+ it "should rais an error without an event" do
35
+ expect { DelayedKiss.record("identity", nil) }.to raise_error(ArgumentError)
36
+ end
37
+
38
+ it "should send a request to the KISSmetrics API with custom properties in the URL's query string" do
39
+ HTTParty.expects(:get).with(regexp_matches(/type=crazy/)).returns(true)
40
+ DelayedKiss.record("identity", "event", {:type => "crazy"})
41
+ end
42
+
43
+ it "should raise an error if the key is not configured" do
44
+ DelayedKiss.cache_config
45
+ DelayedKiss.key = nil
46
+ expect { DelayedKiss.record("identity", "event") }.to raise_error(DelayedKiss::ConfigurationError)
47
+ DelayedKiss.reset_config
48
+ end
49
+ end
50
+
51
+ describe :alias do
52
+ it "should send a request to the KISSmetrics API when valid parameters are supplied" do
53
+ HTTParty.expects(:get).once.returns(true)
54
+ DelayedKiss.alias("oldname", "newname")
55
+ end
56
+
57
+ it "should include the from alias in the query string" do
58
+ HTTParty.expects(:get).with(regexp_matches(/_p=oldname/)).returns(true)
59
+ DelayedKiss.alias("oldname", "newname")
60
+ end
61
+
62
+ it "should include the to alias in the query string" do
63
+ HTTParty.expects(:get).with(regexp_matches(/_n=newname/)).returns(true)
64
+ DelayedKiss.alias("oldname", "newname")
65
+ end
66
+
67
+ it "should raise an error without a from alias" do
68
+ expect { DelayedKiss.alias(nil, "newname") }.to raise_error(ArgumentError)
69
+ end
70
+
71
+ it "should raise an error without a to alias" do
72
+ expect { DelayedKiss.alias("oldname", nil) }.to raise_error(ArgumentError)
73
+ end
74
+
75
+ it "should raise an error if the key is not configured" do
76
+ DelayedKiss.cache_config
77
+ DelayedKiss.key = nil
78
+ expect { DelayedKiss.record("identity", "event") }.to raise_error(DelayedKiss::ConfigurationError)
79
+ DelayedKiss.reset_config
80
+ end
81
+ end
82
+
83
+ describe :set do
84
+ it "should send a request to the KISSmetrics API when valid parameters are supplied" do
85
+ HTTParty.expects(:get).once.returns(true)
86
+ DelayedKiss.set("identity", {:gender => :male})
87
+ end
88
+
89
+ it "should include the set properties in the query string" do
90
+ HTTParty.expects(:get).with(regexp_matches(/age=27/)).returns(true)
91
+ DelayedKiss.set("identity", {:age => 27})
92
+ end
93
+
94
+ it "should not send a reuqest to the KISSmetrics API when the set paramters are blank" do
95
+ HTTParty.expects(:get).never
96
+ DelayedKiss.set("identity", {})
97
+ end
98
+
99
+ it "raises an error without an identity" do
100
+ expect { DelayedKiss.set(nil, {:gener => :female}) }.to raise_error(ArgumentError)
101
+ end
102
+
103
+ it "should raise an error if the key is not configured" do
104
+ DelayedKiss.cache_config
105
+ DelayedKiss.key = nil
106
+ expect { DelayedKiss.record("identity", "event") }.to raise_error(DelayedKiss::ConfigurationError)
107
+ DelayedKiss.reset_config
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,37 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+
5
+ require 'active_support'
6
+ require 'active_support/core_ext'
7
+ require 'httparty'
8
+ require 'delayed_job'
9
+ require 'delayed_kiss'
10
+
11
+ RSpec.configure do |config|
12
+ config.mock_with :mocha
13
+ end
14
+
15
+ DelayedKiss.configure do |config|
16
+ config.key = "dlf23jkd9sl32nfj99kl2s8635h3jk33f"
17
+ end
18
+
19
+ # provide methods for clearing and restoring the configurations
20
+ module DelayedKiss
21
+ @@cached_key = nil
22
+
23
+ def self.cache_config
24
+ @@cached_key = @@key
25
+ end
26
+
27
+ def self.reset_config
28
+ @@key = @@cached_key if @@cached_key
29
+ end
30
+ end
31
+
32
+ # ignore delaying jobs
33
+ module Delayed::MessageSending
34
+ def delay
35
+ return self
36
+ end
37
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: delayed_kiss
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Dustin DeYoung
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-07 00:00:00.000000000 -05:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activesupport
17
+ requirement: &2152316100 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *2152316100
26
+ - !ruby/object:Gem::Dependency
27
+ name: i18n
28
+ requirement: &2152315680 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *2152315680
37
+ - !ruby/object:Gem::Dependency
38
+ name: httparty
39
+ requirement: &2152315180 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: 0.8.1
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: *2152315180
48
+ - !ruby/object:Gem::Dependency
49
+ name: delayed_job
50
+ requirement: &2152314680 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: 2.1.4
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: *2152314680
59
+ description: A simple wrapper for the KissMetrics API using Delayed Job
60
+ email:
61
+ - ddeyoung@authorsolutions.com
62
+ executables: []
63
+ extensions: []
64
+ extra_rdoc_files: []
65
+ files:
66
+ - .gitignore
67
+ - .rspec
68
+ - Gemfile
69
+ - README.textile
70
+ - Rakefile
71
+ - delayed_kiss.gemspec
72
+ - lib/delayed_kiss.rb
73
+ - lib/delayed_kiss/version.rb
74
+ - spec/delayed_kiss_spec.rb
75
+ - spec/spec_helper.rb
76
+ has_rdoc: true
77
+ homepage: ''
78
+ licenses: []
79
+ post_install_message:
80
+ rdoc_options: []
81
+ require_paths:
82
+ - lib
83
+ required_ruby_version: !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubyforge_project: delayed_kiss
97
+ rubygems_version: 1.6.2
98
+ signing_key:
99
+ specification_version: 3
100
+ summary: KissMetrics API with Delayed Job
101
+ test_files:
102
+ - spec/delayed_kiss_spec.rb
103
+ - spec/spec_helper.rb