kontagent 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest ADDED
@@ -0,0 +1,5 @@
1
+ Manifest
2
+ Rakefile
3
+ kontagent.gemspec
4
+ lib/kontagent.rb
5
+ spec/kontagent_spec.rb
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+
5
+ Echoe.new('kontagent', '0.0.1') do |p|
6
+ p.description = "A gem that provides basic integration with Kontagent's REST API"
7
+ p.url = "http://github.com/gamesthatgive/kontagent"
8
+ p.author = "Kristofer Goss"
9
+ p.email = "goss@gamesthatgive.net"
10
+ p.ignore_pattern = ["tmp/*", "script/*"]
11
+ p.runtime_dependencies = [["uuidtools", ">= 1.0.7"], ["rest-client", ">=1.1.0"]]
12
+ # p.development_dependencies = []
13
+ end
data/kontagent.gemspec ADDED
@@ -0,0 +1,36 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{kontagent}
5
+ s.version = "0.0.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Kristofer Goss"]
9
+ s.date = %q{2010-07-30}
10
+ s.description = %q{A gem that provides basic integration with Kontagent's REST API}
11
+ s.email = %q{goss@gamesthatgive.net}
12
+ s.extra_rdoc_files = ["lib/kontagent.rb"]
13
+ s.files = ["Manifest", "Rakefile", "kontagent.gemspec", "lib/kontagent.rb", "spec/kontagent_spec.rb"]
14
+ s.homepage = %q{http://github.com/gamesthatgive/kontagent}
15
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Kontagent"]
16
+ s.require_paths = ["lib"]
17
+ s.rubyforge_project = %q{kontagent}
18
+ s.rubygems_version = %q{1.3.7}
19
+ s.summary = %q{A gem that provides basic integration with Kontagent's REST API}
20
+
21
+ if s.respond_to? :specification_version then
22
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
+ s.specification_version = 3
24
+
25
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
26
+ s.add_runtime_dependency(%q<uuidtools>, [">= 1.0.7"])
27
+ s.add_runtime_dependency(%q<rest-client>, [">= 1.1.0"])
28
+ else
29
+ s.add_dependency(%q<uuidtools>, [">= 1.0.7"])
30
+ s.add_dependency(%q<rest-client>, [">= 1.1.0"])
31
+ end
32
+ else
33
+ s.add_dependency(%q<uuidtools>, [">= 1.0.7"])
34
+ s.add_dependency(%q<rest-client>, [">= 1.1.0"])
35
+ end
36
+ end
data/lib/kontagent.rb ADDED
@@ -0,0 +1,143 @@
1
+ require 'rubygems'
2
+ require 'rest_client'
3
+ require 'uuidtools'
4
+ require 'ostruct'
5
+
6
+ module Kontagent
7
+ def self.config
8
+ @@config
9
+ end
10
+
11
+ def self.base_url
12
+ @@base_url
13
+ end
14
+
15
+ PARAMS_MAP = {
16
+ :uid => :s,
17
+ :birth_year => :b,
18
+ :sex => [:g, :escape],
19
+ :city => [:ly, :escape],
20
+ :country => [:lc, :escape],
21
+ :zip => [:lp, :escape],
22
+ :state => [:ls, :escape],
23
+ :friend_count => :f,
24
+ :short_tag => :su,
25
+ :tag => :u,
26
+ :channel => :tu,
27
+ :link_type => :tu,
28
+ :st1 => [:st1, :escape],
29
+ :st2 => [:st2, :escape],
30
+ :st3 => [:st3, :escape],
31
+ :responder_uid => :r,
32
+ :recipient_uids => [:r, :escape],
33
+ :existing_install? => :i,
34
+ :timestamp => :ts,
35
+ }
36
+
37
+ def self.create_tracking_tag
38
+ tag = UUID.random_create.to_s.gsub("-", "")
39
+ yield tag if block_given?
40
+ tag
41
+ end
42
+
43
+ def self.create_short_tag
44
+ create_tracking_tag
45
+ end
46
+
47
+ def self.initialize!(options = {})
48
+ raise "Missing required api_url setting" unless options["api_url"]
49
+ raise "Missing required ab_url setting" unless options["ab_url"]
50
+ @@config = OpenStruct.new(options)
51
+ @@base_url = File.join(self.config.api_url, self.config.api_key)
52
+ end
53
+
54
+ def self.application_added(options = {})
55
+ assert_options(options, :uid)
56
+ call_method("apa", options)
57
+ end
58
+
59
+ def self.application_removed(options = {})
60
+ assert_options(options, :uid)
61
+ call_method("apr", options)
62
+ end
63
+
64
+ def self.get_page_request_url(options = {})
65
+ assert_options(options, :uid)
66
+ options[:timestamp] ||= Time.now.strftime("%Y-%m-%dT%H:%M:%S")
67
+ build_url("pgr", options)
68
+ end
69
+
70
+ def self.track_user(options = {})
71
+ assert_options(options, :uid)
72
+ options[:sex] = options[:sex].to_s[0,1]
73
+ call_method("cpu", options)
74
+ end
75
+
76
+ def self.track_post(options = {})
77
+ assert_options(options, :uid, :tag, :channel)
78
+ assert_channel(options[:channel])
79
+ call_method("pst", options)
80
+ end
81
+
82
+ def self.track_post_response(options = {})
83
+ assert_options(options, :responder_uid, :tag, :channel, :existing_install?)
84
+ assert_channel(options[:channel])
85
+ options[:existing_install?] = options[:existing_install?] && 1 || 0
86
+ call_method("psr", options)
87
+ end
88
+
89
+ def self.track_invite(options = {})
90
+ assert_options(options, :uid, :tag, :recipient_uids)
91
+ options[:recipient_uids] = options[:recipient_uids].join(",")
92
+ call_method("ins", options)
93
+ end
94
+
95
+ def self.track_invite_response(options = {})
96
+ assert_options(options, :responder_uid, :tag, :existing_install?)
97
+ options[:existing_install?] = options[:existing_install?] && 1 || 0
98
+ call_method("inr", options)
99
+ end
100
+
101
+ def self.build_url(method, options = {})
102
+ File.join(self.base_url, method, "?#{kontagent_params(options)}")
103
+ end
104
+
105
+ def self.track_link(options)
106
+ assert_options(options, :link_type, :existing_install?, :short_tag)
107
+ options[:existing_install?] = options[:existing_install?] ? 1 : 0
108
+ call_method("ucc", options)
109
+ end
110
+
111
+ private
112
+
113
+ def self.assert_options(options, *required_keys)
114
+ required_keys.each { |k| assert(options.key?(k), "#{k} is required") }
115
+ end
116
+
117
+ def self.assert_channel(value)
118
+ assert([:stream, :feedpub, :feedstory, :multifeedstory].member?(value.to_sym), "channel type #{value} not supported")
119
+ end
120
+
121
+ def self.assert(value, message = "Assertion failed")
122
+ raise Exception, message, caller unless value
123
+ end
124
+
125
+ def self.call_method(method, options = {})
126
+ url = build_url(method, options)
127
+ RestClient.get(url)
128
+ end
129
+
130
+ def self.kontagent_params(options)
131
+ opts = options.inject({}) do |rewritten_hash, (original_key, value)|
132
+ unless value.nil? || value.to_s.strip.empty?
133
+ if PARAMS_MAP[original_key].is_a? Array
134
+ rewritten_hash[PARAMS_MAP[original_key].first] = CGI.escape(value)
135
+ elsif PARAMS_MAP[original_key]
136
+ rewritten_hash[PARAMS_MAP[original_key]] = value
137
+ end
138
+ end
139
+ rewritten_hash
140
+ end
141
+ opts.map { |k,v| "#{k}=#{v}" }.sort.join("&")
142
+ end
143
+ end
@@ -0,0 +1,323 @@
1
+ require "kontagent"
2
+
3
+ describe Kontagent do
4
+ before(:each) do
5
+ Kontagent.initialize!("api_url" => "http://kontagent.com/api/v1", "api_key" => "12345", "ab_url" => "http://kontagent.com")
6
+ end
7
+
8
+ it "should initialize" do
9
+ Kontagent.config.should_not be_nil
10
+ Kontagent.base_url.should == "http://kontagent.com/api/v1/12345"
11
+ end
12
+
13
+ it "should not initialize without an API key" do
14
+ lambda { Kontagent.initialize!("api_url" => "http://kontagent.com/api/v1", "ab_url" => "http://kontagent.com") }.should raise_error
15
+ end
16
+
17
+ it "should not initialize without an A/B url" do
18
+ lambda { Kontagent.initialize!("api_url" => "http://kontagent.com/api/v1", "api_key" => "12345") }.should raise_error
19
+ end
20
+
21
+ context "when adding an application" do
22
+ before(:each) do
23
+ @tracking_tag = UUID.random_create.to_s.gsub("-", "")
24
+ end
25
+
26
+ it "should record the user id" do
27
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/apa/?s=1")
28
+ Kontagent.application_added :uid => 1
29
+ end
30
+
31
+ it "should raise without user id" do
32
+ lambda { Kontagent.application_added }.should raise_error
33
+ end
34
+
35
+ it "should record the tracking tag" do
36
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/apa/?s=1&u=#{@tracking_tag}")
37
+ Kontagent.application_added :uid => 1, :tag => @tracking_tag
38
+ end
39
+
40
+ it "should record the short tracking tag" do
41
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/apa/?s=1&su=#{@tracking_tag}")
42
+ Kontagent.application_added :uid => 1, :short_tag => @tracking_tag
43
+ end
44
+ end
45
+
46
+ context "when removing an application" do
47
+ it "should record the user id" do
48
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/apr/?s=1")
49
+ Kontagent.application_removed :uid => 1
50
+ end
51
+
52
+ it "should raise without user id" do
53
+ lambda { Kontagent.application_removed }.should raise_error
54
+ end
55
+ end
56
+
57
+ context "when tracking a page request" do
58
+ before(:each) do
59
+ @now = Time.now
60
+ Time.stub!(:now).and_return(@now)
61
+ end
62
+
63
+ it "should build the proper tracking url" do
64
+ expected_timestamp = @now.strftime("%Y-%m-%dT%H:%M:%S")
65
+ Kontagent.get_page_request_url(:uid => 1).should == "#{Kontagent.base_url}/pgr/?s=1&ts=#{expected_timestamp}"
66
+ end
67
+
68
+ it "should raise without user id" do
69
+ lambda { Kontagent.get_page_request_url }.should raise_error
70
+ end
71
+ end
72
+
73
+ context "when tracking user demograpics" do
74
+ it "should record" do
75
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/cpu/?b=1955&f=3&g=f&lc=USA&lp=04103&ls=ME&ly=San+Francisco&s=1")
76
+ Kontagent.track_user(:uid => 1,
77
+ :birth_year => 1955,
78
+ :sex => "female",
79
+ :city => "San Francisco",
80
+ :country => "USA",
81
+ :state => "ME",
82
+ :zip => "04103",
83
+ :friend_count => 3)
84
+ end
85
+
86
+ it "should handle empty values" do
87
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/cpu/?b=1955&f=3&lc=USA&lp=04103&s=1")
88
+ Kontagent.track_user(:uid => 1,
89
+ :birth_year => 1955,
90
+ :sex => "",
91
+ :city => " ",
92
+ :country => "USA",
93
+ :state => "",
94
+ :zip => "04103",
95
+ :friend_count => 3)
96
+ end
97
+
98
+ it "should handle nil values" do
99
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/cpu/?b=1955&f=3&g=f&lc=USA&lp=04103&s=1")
100
+ Kontagent.track_user(:uid => 1,
101
+ :birth_year => 1955,
102
+ :sex => "female",
103
+ :city => nil,
104
+ :country => "USA",
105
+ :state => nil,
106
+ :zip => "04103",
107
+ :friend_count => 3)
108
+ end
109
+ end
110
+
111
+ context "when tracking a post" do
112
+ it "should record a stream post" do
113
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/pst/?s=1&tu=stream&u=12345")
114
+ Kontagent.track_post(:channel => :stream, :uid => 1, :tag => "12345")
115
+ end
116
+
117
+ it "should record a feed publication" do
118
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/pst/?s=1&tu=feedpub&u=12345")
119
+ Kontagent.track_post(:channel => :feedpub, :uid => 1, :tag => "12345")
120
+ end
121
+
122
+ it "should record a feed story" do
123
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/pst/?s=1&tu=feedstory&u=12345")
124
+ Kontagent.track_post(:channel => :feedstory, :uid => 1, :tag => "12345")
125
+ end
126
+
127
+ it "should record a multifeed story" do
128
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/pst/?s=1&tu=multifeedstory&u=12345")
129
+ Kontagent.track_post(:channel => :multifeedstory, :uid => 1, :tag => "12345")
130
+ end
131
+
132
+ it "should record with subtypes" do
133
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/pst/?s=1&st1=subtype1&st2=subtype2&st3=subtype3&tu=multifeedstory&u=12345")
134
+ Kontagent.track_post(:channel => :multifeedstory,
135
+ :uid => 1,
136
+ :st1 => "subtype1",
137
+ :st2 => "subtype2",
138
+ :st3 => "subtype3",
139
+ :tag => "12345")
140
+ end
141
+
142
+ it "should raise given unknown channel type" do
143
+ lambda { Kontagent.track_post(:channel => :bogus, :uid => 1, :tag => "12345") }.should raise_error
144
+ end
145
+
146
+ it "should raise given missing uid" do
147
+ lambda { Kontagent.track_post(:channel => :stream, :tag => "12345") }.should raise_error
148
+ end
149
+
150
+ it "should raise given missing tag" do
151
+ lambda { Kontagent.track_post(:channel => :stream, :uid => 1) }.should raise_error
152
+ end
153
+ end
154
+
155
+ context "when tracking a post response" do
156
+ it "should record a stream response" do
157
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/psr/?i=0&r=2&tu=stream&u=12345")
158
+ Kontagent.track_post_response(:channel => :stream,
159
+ :responder_uid => 2,
160
+ :tag => 12345,
161
+ :existing_install? => false)
162
+ end
163
+
164
+ it "should record with subtypes" do
165
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/psr/?i=0&r=2&st1=subtype1&st2=subtype2&st3=subtype3&tu=stream&u=12345")
166
+ Kontagent.track_post_response(:channel => :stream,
167
+ :responder_uid => 2,
168
+ :st1 => "subtype1",
169
+ :st2 => "subtype2",
170
+ :st3 => "subtype3",
171
+ :tag => 12345,
172
+ :existing_install? => false)
173
+ end
174
+
175
+ it "should record a feedpub post response" do
176
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/psr/?i=0&r=2&tu=feedpub&u=12345")
177
+ Kontagent.track_post_response(:channel => :feedpub,
178
+ :responder_uid => 2,
179
+ :tag => 12345,
180
+ :existing_install? => false)
181
+ end
182
+
183
+ it "should record a feedstory post response" do
184
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/psr/?i=1&r=2&tu=feedstory&u=12345")
185
+ Kontagent.track_post_response(:channel => :feedstory,
186
+ :responder_uid => 2,
187
+ :tag => 12345,
188
+ :existing_install? => true)
189
+ end
190
+
191
+ it "should record a multifeedstory post response" do
192
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/psr/?i=1&r=2&tu=multifeedstory&u=12345")
193
+ Kontagent.track_post_response(:channel => :multifeedstory,
194
+ :responder_uid => 2,
195
+ :tag => 12345,
196
+ :existing_install? => true)
197
+ end
198
+
199
+ it "should raise given missing recipient" do
200
+ lambda { Kontagent.track_post_response(:channel => :multifeedstory,
201
+ :tag => 12345,
202
+ :existing_install? => true) }.should raise_error
203
+ end
204
+
205
+ it "should raise given missing channel" do
206
+ lambda { Kontagent.track_post_response(:responder_uid => 2,
207
+ :tag => 12345,
208
+ :existing_install? => true) }.should raise_error
209
+ end
210
+
211
+ it "should raise given missing tag" do
212
+ lambda { Kontagent.track_post_response(:channel => :stream,
213
+ :responder_uid => 2,
214
+ :existing_install? => true) }.should raise_error
215
+ end
216
+
217
+ it "should raise given missing install status" do
218
+ lambda { Kontagent.track_post_response(:channel => :stream,
219
+ :responder_uid => 2,
220
+ :tag => 12345) }.should raise_error
221
+ end
222
+
223
+ it "should raise given invalid channel" do
224
+ lambda { Kontagent.track_post_response(:channel => :bogus,
225
+ :responder_uid => 2,
226
+ :tag => 12345,
227
+ :existing_install? => true) }.should raise_error
228
+ end
229
+ end
230
+
231
+ context "creating tags" do
232
+ it "should be able to create a tracking tag" do
233
+ Kontagent.create_tracking_tag.should_not be_empty
234
+ end
235
+
236
+ it "should be able to create a short tag" do
237
+ Kontagent.create_short_tag.should_not be_empty
238
+ end
239
+
240
+ it "should yield when creating a tracking tag" do
241
+ yielded = false
242
+
243
+ Kontagent.create_tracking_tag do |tag|
244
+ tag.should_not be_nil
245
+ tag.should_not be_empty
246
+ yielded = true
247
+ end
248
+
249
+ yielded.should be_true
250
+ end
251
+ end
252
+
253
+ context "when tracking link traffic" do
254
+ it "should record an undirected communication click" do
255
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/ucc/?i=0&st1=Facebook&st2=GamePhun&st3=2&su=short_tag&tu=ad")
256
+ Kontagent.track_link(:link_type => 'ad', :st1 => 'Facebook', :st2 => 'GamePhun',
257
+ :st3 => '2', :existing_install? => false, :short_tag => 'short_tag')
258
+ end
259
+
260
+ it "should encode its parameters" do
261
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/ucc/?i=0&st1=%2F&st2=%24&st3=%26&su=short_tag&tu=ad")
262
+ Kontagent.track_link(:link_type => 'ad', :st1 => '/', :st2 => '$', :st3 => '&',
263
+ :existing_install? => false, :short_tag => 'short_tag')
264
+ end
265
+ end
266
+
267
+ context "when tracking an invitation" do
268
+ before(:each) do
269
+ @tag = Kontagent.create_tracking_tag
270
+ end
271
+
272
+ it "should record the invite" do
273
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/ins/?r=1%2C2%2C3%2C4%2C5&s=12345&u=#{@tag}")
274
+ Kontagent.track_invite :uid => 12345, :tag => @tag, :recipient_uids => [1,2,3,4,5]
275
+ end
276
+
277
+ it "should require a uid" do
278
+ RestClient.should_not_receive(:get)
279
+ lambda { Kontagent.track_invite :tag => @tag, :recipient_uids => [1,2,3,4,5] }.should raise_error("uid is required")
280
+ end
281
+
282
+ it "should require recipient identifiers" do
283
+ RestClient.should_not_receive(:get)
284
+ lambda { Kontagent.track_invite :uid => 12345, :tag => @tag }.should raise_error("recipient_uids is required")
285
+ end
286
+
287
+ it "should require a tracking tag" do
288
+ RestClient.should_not_receive(:get)
289
+ lambda { Kontagent.track_invite :uid => 12345, :recipient_uids => [1,2,3,4,5] }.should raise_error("tag is required")
290
+ end
291
+
292
+ it "should record with st1 param" do
293
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/ins/?r=1%2C2%2C3%2C4%2C5&s=12345&st1=st1&u=#{@tag}")
294
+ Kontagent.track_invite :uid => 12345, :tag => @tag, :recipient_uids => [1,2,3,4,5], :st1 => "st1"
295
+ end
296
+
297
+ it "should record with st2 param" do
298
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/ins/?r=1%2C2%2C3%2C4%2C5&s=12345&st2=st2&u=#{@tag}")
299
+ Kontagent.track_invite :uid => 12345, :tag => @tag, :recipient_uids => [1,2,3,4,5], :st2 => "st2"
300
+ end
301
+ end
302
+
303
+ context "when tracking an invitation response" do
304
+ before(:each) do
305
+ @tag = Kontagent.create_tracking_tag
306
+ end
307
+
308
+ it "should record the response" do
309
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/inr/?i=1&r=12345&u=#{@tag}")
310
+ Kontagent.track_invite_response(:responder_uid => 12345, :existing_install? => true, :tag => @tag)
311
+ end
312
+
313
+ it "should record with st1 param" do
314
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/inr/?i=1&r=12345&st1=st1&u=#{@tag}")
315
+ Kontagent.track_invite_response(:responder_uid => 12345, :existing_install? => true, :tag => @tag, :st1 => "st1")
316
+ end
317
+
318
+ it "should record with st2 param" do
319
+ RestClient.should_receive(:get).with("#{Kontagent.base_url}/inr/?i=1&r=12345&st2=st2&u=#{@tag}")
320
+ Kontagent.track_invite_response(:responder_uid => 12345, :existing_install? => true, :tag => @tag, :st2 => "st2")
321
+ end
322
+ end
323
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kontagent
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Kristofer Goss
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-07-30 00:00:00 -04:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: uuidtools
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 25
30
+ segments:
31
+ - 1
32
+ - 0
33
+ - 7
34
+ version: 1.0.7
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rest-client
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 19
46
+ segments:
47
+ - 1
48
+ - 1
49
+ - 0
50
+ version: 1.1.0
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ description: A gem that provides basic integration with Kontagent's REST API
54
+ email: goss@gamesthatgive.net
55
+ executables: []
56
+
57
+ extensions: []
58
+
59
+ extra_rdoc_files:
60
+ - lib/kontagent.rb
61
+ files:
62
+ - Manifest
63
+ - Rakefile
64
+ - kontagent.gemspec
65
+ - lib/kontagent.rb
66
+ - spec/kontagent_spec.rb
67
+ has_rdoc: true
68
+ homepage: http://github.com/gamesthatgive/kontagent
69
+ licenses: []
70
+
71
+ post_install_message:
72
+ rdoc_options:
73
+ - --line-numbers
74
+ - --inline-source
75
+ - --title
76
+ - Kontagent
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ hash: 11
94
+ segments:
95
+ - 1
96
+ - 2
97
+ version: "1.2"
98
+ requirements: []
99
+
100
+ rubyforge_project: kontagent
101
+ rubygems_version: 1.3.7
102
+ signing_key:
103
+ specification_version: 3
104
+ summary: A gem that provides basic integration with Kontagent's REST API
105
+ test_files: []
106
+