keen 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,7 +10,7 @@ rvm:
10
10
 
11
11
  env:
12
12
  - PATTERN=keen
13
- - PATTERN=integration KEEN_API_KEY=f806128f31c349fda124b62d1f4cf4b2 KEEN_PROJECT_ID=50e5ffa6897a2c319b000000
13
+ - PATTERN=integration KEEN_WRITE_KEY=f806128f31c349fda124b62d1f4cf4b2 KEEN_READ_KEY=f806128f31c349fda124b62d1f4cf4b2 KEEN_PROJECT_ID=50e5ffa6897a2c319b000000
14
14
  - PATTERN=synchrony
15
15
 
16
16
  matrix:
data/README.md CHANGED
@@ -23,13 +23,14 @@ keen is tested with Ruby 1.8 and 1.9 on:
23
23
 
24
24
  ### Usage
25
25
 
26
- Before making any API calls, you must supply keen-gem with a Project ID.
27
- (If you need a Keen IO account, [sign up here](https://keen.io/) - it's free.)
26
+ Before making any API calls, you must supply keen-gem with a Project ID and one or both of your Write and Read Keys.
27
+ (If you need a Keen IO account, [sign up here](https://keen.io/) - it's free.) The Write key is required for publishing
28
+ events, and the Read key is required for running queries.
28
29
 
29
- The recommended way to do this is to set `KEEN_PROJECT_ID` in your
30
+ The recommended way to do this is to set `KEEN_PROJECT_ID`, `KEEN_WRITE_KEY`, and `KEEN_READ_KEY` in your
30
31
  environment. If you're using [foreman](http://ddollar.github.com/foreman/), add this to your `.env` file:
31
32
 
32
- KEEN_PROJECT_ID=xxxxxxxxxxxxxxxx
33
+ KEEN_PROJECT_ID=xxxxxxxxxxxxxxxx KEEN_WRITE_KEY=yyyyyyyyyyyyy KEEN_READ_KEY=zzzzzzzzzzzzz
33
34
 
34
35
  If not, make to to export the variable into your shell or put it before the command you use to start your server.
35
36
 
@@ -95,9 +96,9 @@ to resume processing immediately.
95
96
 
96
97
  The Keen IO API provides rich querying capabilities against your event data set. For more information, see the [Data Analysis API Guide](https://keen.io/docs/data-analysis/).
97
98
 
98
- Unlike event publishing, queries require that an API Key is provided. Just like project ID, we encourage that you set this as an environment variable:
99
+ Queries require that a Read Key is provided. Just like project ID, we encourage that you set this as an environment variable:
99
100
 
100
- KEEN_API_KEY=your-api-key
101
+ KEEN_READ_KEY=yyyyyyyyyyyyyyyy
101
102
 
102
103
  Here's are some examples of querying with keen-gem. Let's assume you've added some events to the "purchases" collection.
103
104
 
@@ -137,13 +138,17 @@ Detailed information on available parameters for each API resource can be found
137
138
  To configure keen-gem in code, do as follows:
138
139
 
139
140
  ```ruby
140
- Keen.project_id = 'your-project-id'
141
+ Keen.project_id = 'xxxxxxxxxxxxxxx'
142
+ Keen.write_key = 'yyyyyyyyyyyyyyy'
143
+ Keen.read_key = 'zzzzzzzzzzzzzzz'
141
144
  ```
142
145
 
143
146
  You can also configure individual client instances as follows:
144
147
 
145
148
  ```ruby
146
- keen = Keen::Client.new(:project_id => 'your-project-id')
149
+ keen = Keen::Client.new(:project_id => 'xxxxxxxxxxxxxxx',
150
+ :write_key => 'yyyyyyyyyyyyyyy',
151
+ :read_key => 'zzzzzzzzzzzzzzz')
147
152
  ```
148
153
 
149
154
  #### em-synchrony
@@ -162,14 +167,22 @@ In this situation, the JSON event data is passed by encoding it base-64 and addi
162
167
  The `beacon_url` method found on the `Keen::Client` does this for you. Here's an example:
163
168
 
164
169
  ```ruby
170
+ Keen.project_id = 'xxxxxx';
171
+ Keen.write_key = 'yyyyyy';
165
172
  Keen.beacon_url("sign_ups", :recipient => "foo@foo.com")
166
- # => "https://api.keen.io/3.0/projects/12345/events/email_opens?data=eyJyZWNpcGllbnQiOiJmb29AZm9vLmNvbSJ9"
173
+ # => "https://api.keen.io/3.0/projects/xxxxxx/events/email_opens?api_key=yyyyyy&data=eyJyZWNpcGllbnQiOiJmb29AZm9vLmNvbSJ9"
167
174
  ```
168
175
 
169
176
  To track email opens, simply add an image to your email template that points to this URL.
170
177
 
171
178
  ### Changelog
172
179
 
180
+ ##### 0.7.0
181
+ + BREAKING CHANGE! Added support for read and write scoped keys to reflect the new Keen IO security architecture.
182
+ The advantage of scoped keys is finer grained permission control. Public clients that
183
+ publish events (like a web browser) require a key that can write but not read. On the other hand, private dashboards and
184
+ server-side querying processes require a Read key that should not be made public.
185
+
173
186
  ##### 0.6.1
174
187
  + Improved logging and exception handling.
175
188
 
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
6
6
  s.name = "keen"
7
7
  s.version = Keen::VERSION
8
8
  s.platform = Gem::Platform::RUBY
9
- s.authors = ["Kyle Wild", "Josh Dzielak"]
9
+ s.authors = ["Kyle Wild", "Josh Dzielak", "Daniel Kador"]
10
10
  s.email = "josh@keen.io"
11
11
  s.homepage = "https://github.com/keenlabs/keen-gem"
12
12
  s.summary = "Keen IO API Client"
@@ -25,8 +25,8 @@ module Keen
25
25
  class << self
26
26
  extend Forwardable
27
27
 
28
- def_delegators :default_client, :project_id, :api_key,
29
- :project_id=, :api_key=, :publish, :publish_async,
28
+ def_delegators :default_client, :project_id, :write_key, :read_key,
29
+ :project_id=, :write_key=, :read_key=, :publish, :publish_async,
30
30
  :beacon_url, :count, :count_unique, :minimum, :maximum,
31
31
  :sum, :average, :select_unique, :funnel, :extraction
32
32
 
@@ -45,7 +45,8 @@ module Keen
45
45
  def default_client
46
46
  @default_client ||= Keen::Client.new(
47
47
  :project_id => ENV['KEEN_PROJECT_ID'],
48
- :api_key => ENV['KEEN_API_KEY']
48
+ :write_key => ENV['KEEN_WRITE_KEY'],
49
+ :read_key => ENV['KEEN_READ_KEY']
49
50
  )
50
51
  end
51
52
  end
@@ -13,7 +13,7 @@ module Keen
13
13
  include Keen::Client::PublishingMethods
14
14
  include Keen::Client::QueryingMethods
15
15
 
16
- attr_accessor :project_id, :api_key
16
+ attr_accessor :project_id, :write_key, :read_key
17
17
 
18
18
  CONFIG = {
19
19
  :api_host => "api.keen.io",
@@ -25,14 +25,15 @@ module Keen
25
25
  :verify_depth => 5,
26
26
  :ca_file => File.expand_path("../../../config/cacert.pem", __FILE__) },
27
27
  :api_async_http_options => {},
28
- :api_headers => lambda { |sync_or_async|
28
+ :api_headers => lambda { |authorization, sync_or_async|
29
29
  user_agent = "keen-gem, v#{Keen::VERSION}, #{sync_or_async}"
30
30
  user_agent += ", #{RUBY_VERSION}, #{RUBY_PLATFORM}, #{RUBY_PATCHLEVEL}"
31
31
  if defined?(RUBY_ENGINE)
32
32
  user_agent += ", #{RUBY_ENGINE}"
33
33
  end
34
34
  { "Content-Type" => "application/json",
35
- "User-Agent" => user_agent }
35
+ "User-Agent" => user_agent,
36
+ "Authorization" => authorization }
36
37
  }
37
38
  }
38
39
 
@@ -42,12 +43,13 @@ module Keen
42
43
  # deprecated, pass a hash of options instead
43
44
  options = {
44
45
  :project_id => args[0],
45
- :api_key => args[1],
46
- }.merge(args[2] || {})
46
+ :write_key => args[1],
47
+ :read_key => args[2],
48
+ }.merge(args[3] || {})
47
49
  end
48
50
 
49
- @project_id, @api_key = options.values_at(
50
- :project_id, :api_key)
51
+ @project_id, @write_key, @read_key = options.values_at(
52
+ :project_id, :write_key, :read_key)
51
53
  end
52
54
 
53
55
  private
@@ -76,8 +78,12 @@ module Keen
76
78
  raise ConfigurationError, "Project ID must be set" unless self.project_id
77
79
  end
78
80
 
79
- def ensure_api_key!
80
- raise ConfigurationError, "API Key must be set for queries" unless self.api_key
81
+ def ensure_write_key!
82
+ raise ConfigurationError, "Write Key must be set for sending events" unless self.write_key
83
+ end
84
+
85
+ def ensure_read_key!
86
+ raise ConfigurationError, "Read Key must be set for queries" unless self.read_key
81
87
  end
82
88
 
83
89
  def method_missing(_method, *args, &block)
@@ -23,13 +23,14 @@ module Keen
23
23
  # @return the JSON response from the API
24
24
  def publish(event_collection, properties)
25
25
  ensure_project_id!
26
+ ensure_write_key!
26
27
  check_event_data!(event_collection, properties)
27
28
 
28
29
  begin
29
30
  response = Keen::HTTP::Sync.new(
30
31
  api_host, api_port, api_sync_http_options).post(
31
32
  :path => api_event_resource_path(event_collection),
32
- :headers => api_headers("sync"),
33
+ :headers => api_headers(self.write_key, "sync"),
33
34
  :body => MultiJson.encode(properties))
34
35
  rescue Exception => http_error
35
36
  raise HttpError.new("HTTP publish failure: #{http_error.message}", http_error)
@@ -47,16 +48,17 @@ module Keen
47
48
  # @return a deferrable to apply callbacks to
48
49
  def publish_async(event_collection, properties)
49
50
  ensure_project_id!
51
+ ensure_write_key!
50
52
  check_event_data!(event_collection, properties)
51
53
 
52
54
  deferrable = EventMachine::DefaultDeferrable.new
53
55
 
54
56
  http_client = Keen::HTTP::Async.new(api_host, api_port, api_async_http_options)
55
- http = http_client.post({
57
+ http = http_client.post(
56
58
  :path => api_event_resource_path(event_collection),
57
- :headers => api_headers("async"),
59
+ :headers => api_headers(self.write_key, "async"),
58
60
  :body => MultiJson.encode(properties)
59
- })
61
+ )
60
62
 
61
63
  if defined?(EM::Synchrony)
62
64
  if http.error
@@ -96,7 +98,7 @@ module Keen
96
98
  def beacon_url(event_collection, properties)
97
99
  json = MultiJson.encode(properties)
98
100
  data = [json].pack("m0").tr("+/", "-_").gsub("\n", "")
99
- "https://#{api_host}#{api_event_resource_path(event_collection)}?data=#{data}"
101
+ "https://#{api_host}#{api_event_resource_path(event_collection)}?api_key=#{self.write_key}&data=#{data}"
100
102
  end
101
103
 
102
104
  private
@@ -1,4 +1,3 @@
1
-
2
1
  module Keen
3
2
  class Client
4
3
  module QueryingMethods
@@ -163,9 +162,7 @@ module Keen
163
162
 
164
163
  def query(query_name, event_collection, params)
165
164
  ensure_project_id!
166
- ensure_api_key!
167
-
168
- params[:api_key] = self.api_key
165
+ ensure_read_key!
169
166
 
170
167
  if event_collection
171
168
  params[:event_collection] = event_collection
@@ -177,7 +174,7 @@ module Keen
177
174
  response = Keen::HTTP::Sync.new(
178
175
  api_host, api_port, api_sync_http_options).get(
179
176
  :path => "#{api_query_resource_path(query_name)}?#{query_params}",
180
- :headers => api_headers("sync"))
177
+ :headers => api_headers(self.read_key, "sync"))
181
178
  rescue Exception => http_error
182
179
  raise HttpError.new("Couldn't perform #{query_name} on Keen IO: #{http_error.message}", http_error)
183
180
  end
@@ -1,3 +1,3 @@
1
1
  module Keen
2
- VERSION = "0.6.1"
2
+ VERSION = "0.7.0"
3
3
  end
@@ -2,6 +2,7 @@ require File.expand_path("../spec_helper", __FILE__)
2
2
 
3
3
  describe "Keen IO API" do
4
4
  let(:project_id) { ENV['KEEN_PROJECT_ID'] }
5
+ let(:write_key) { ENV['KEEN_WRITE_KEY'] }
5
6
 
6
7
  describe "publishing" do
7
8
  let(:collection) { "users" }
@@ -16,7 +17,7 @@ describe "Keen IO API" do
16
17
 
17
18
  describe "failure" do
18
19
  it "should raise a not found error if an invalid project id" do
19
- client = Keen::Client.new(:project_id => "riker")
20
+ client = Keen::Client.new(:project_id => "riker", :write_key => "whatever")
20
21
  expect {
21
22
  client.publish(collection, event_properties)
22
23
  }.to raise_error(Keen::NotFoundError)
@@ -53,7 +54,7 @@ describe "Keen IO API" do
53
54
  end
54
55
 
55
56
  describe "queries" do
56
- let(:api_key) { ENV['KEEN_API_KEY'] }
57
+ let(:read_key) { ENV['KEEN_READ_KEY'] }
57
58
  let(:event_collection) { "purchases_" + rand(100000).to_s }
58
59
  let(:returns_event_collection) { "returns_" + rand(100000).to_s }
59
60
 
@@ -2,17 +2,18 @@ require File.expand_path("../../spec_helper", __FILE__)
2
2
 
3
3
  describe Keen::Client::PublishingMethods do
4
4
  let(:project_id) { "12345" }
5
+ let(:write_key) { "abcde" }
5
6
  let(:api_host) { "api.keen.io" }
6
7
  let(:collection) { "users" }
7
8
  let(:event_properties) { { "name" => "Bob" } }
8
9
  let(:api_success) { { "created" => true } }
9
- let(:client) { Keen::Client.new(:project_id => project_id) }
10
+ let(:client) { Keen::Client.new(:project_id => project_id, :write_key => write_key) }
10
11
 
11
12
  describe "publish" do
12
13
  it "should post using the collection and properties" do
13
14
  stub_keen_post(api_event_resource_url(collection), 201, "")
14
15
  client.publish(collection, event_properties)
15
- expect_keen_post(api_event_resource_url(collection), event_properties, "sync")
16
+ expect_keen_post(api_event_resource_url(collection), event_properties, "sync", write_key)
16
17
  end
17
18
 
18
19
  it "should return the proper response" do
@@ -36,7 +37,7 @@ describe Keen::Client::PublishingMethods do
36
37
  it "should url encode the event collection" do
37
38
  stub_keen_post(api_event_resource_url("foo%20bar"), 201, "")
38
39
  client.publish("foo bar", event_properties)
39
- expect_keen_post(api_event_resource_url("foo%20bar"), event_properties, "sync")
40
+ expect_keen_post(api_event_resource_url("foo%20bar"), event_properties, "sync", write_key)
40
41
  end
41
42
 
42
43
  it "should wrap exceptions" do
@@ -55,8 +56,18 @@ describe Keen::Client::PublishingMethods do
55
56
 
56
57
  it "should raise an exception if client has no project_id" do
57
58
  expect {
58
- Keen::Client.new.publish(collection, event_properties)
59
- }.to raise_error(Keen::ConfigurationError)
59
+ Keen::Client.new(
60
+ :write_key => "abcde"
61
+ ).publish(collection, event_properties)
62
+ }.to raise_error(Keen::ConfigurationError, "Keen IO Exception: Project ID must be set")
63
+ end
64
+
65
+ it "should raise an exception if client has no write_key" do
66
+ expect {
67
+ Keen::Client.new(
68
+ :project_id => "12345"
69
+ ).publish(collection, event_properties)
70
+ }.to raise_error(Keen::ConfigurationError, "Keen IO Exception: Write Key must be set for sending events")
60
71
  end
61
72
  end
62
73
 
@@ -74,7 +85,7 @@ describe Keen::Client::PublishingMethods do
74
85
  EM.run {
75
86
  client.publish_async(collection, event_properties).callback {
76
87
  begin
77
- expect_keen_post(api_event_resource_url(collection), event_properties, "async")
88
+ expect_keen_post(api_event_resource_url(collection), event_properties, "async", write_key)
78
89
  ensure
79
90
  EM.stop
80
91
  end
@@ -87,7 +98,7 @@ describe Keen::Client::PublishingMethods do
87
98
  EM.run {
88
99
  client.publish_async("foo bar", event_properties).callback {
89
100
  begin
90
- expect_keen_post(api_event_resource_url("foo%20bar"), event_properties, "async")
101
+ expect_keen_post(api_event_resource_url("foo%20bar"), event_properties, "async", write_key)
91
102
  ensure
92
103
  EM.stop
93
104
  end
@@ -168,9 +179,9 @@ describe Keen::Client::PublishingMethods do
168
179
 
169
180
  describe "beacon_url" do
170
181
  it "should return a url with a base-64 encoded json param" do
171
- client = Keen::Client.new(project_id)
182
+ client = Keen::Client.new(:project_id => project_id, :write_key => write_key)
172
183
  client.beacon_url("sign_ups", { :name => "Bob" }).should ==
173
- "https://api.keen.io/3.0/projects/12345/events/sign_ups?data=eyJuYW1lIjoiQm9iIn0="
184
+ "https://api.keen.io/3.0/projects/12345/events/sign_ups?api_key=#{write_key}&data=eyJuYW1lIjoiQm9iIn0="
174
185
  end
175
186
  end
176
187
  end
@@ -2,11 +2,11 @@ require File.expand_path("../../spec_helper", __FILE__)
2
2
 
3
3
  describe Keen::Client do
4
4
  let(:project_id) { "12345" }
5
- let(:api_key) { "abcde" }
5
+ let(:read_key) { "abcde" }
6
6
  let(:api_host) { "api.keen.io" }
7
7
  let(:api_version) { "3.0" }
8
8
  let(:event_collection) { "users" }
9
- let(:client) { Keen::Client.new(:project_id => project_id, :api_key => api_key) }
9
+ let(:client) { Keen::Client.new(:project_id => project_id, :read_key => read_key) }
10
10
 
11
11
  def query_url(query_name, query_params)
12
12
  "https://#{api_host}/#{api_version}/projects/#{project_id}/queries/#{query_name}#{query_params}"
@@ -34,14 +34,14 @@ describe Keen::Client do
34
34
  describe "with an improperly configured client" do
35
35
  it "should require a project id" do
36
36
  expect {
37
- Keen::Client.new(:api_key => api_key).count("users", {})
38
- }.to raise_error(Keen::ConfigurationError)
37
+ Keen::Client.new(:read_key => read_key).count("users", {})
38
+ }.to raise_error(Keen::ConfigurationError, "Keen IO Exception: Project ID must be set")
39
39
  end
40
40
 
41
- it "should require an api key" do
41
+ it "should require a read key" do
42
42
  expect {
43
43
  Keen::Client.new(:project_id => project_id).count("users", {})
44
- }.to raise_error(Keen::ConfigurationError)
44
+ }.to raise_error(Keen::ConfigurationError, "Keen IO Exception: Read Key must be set for queries")
45
45
  end
46
46
  end
47
47
 
@@ -51,13 +51,13 @@ describe Keen::Client do
51
51
  let(:api_response) { { "result" => 1 } }
52
52
 
53
53
  def test_query(extra_query_params="", extra_query_hash={})
54
- expected_query_params = "?api_key=#{api_key}&event_collection=#{event_collection}"
54
+ expected_query_params = "?event_collection=#{event_collection}"
55
55
  expected_query_params += extra_query_params
56
56
  expected_url = query_url(query_name, expected_query_params)
57
57
  stub_keen_get(expected_url, 200, :result => 1)
58
58
  response = query.call(query_name, event_collection, extra_query_hash)
59
59
  response.should == api_response["result"]
60
- expect_keen_get(expected_url, "sync")
60
+ expect_keen_get(expected_url, "sync", read_key)
61
61
  end
62
62
 
63
63
  it "should call the API w/ proper headers and return the processed json response" do
@@ -98,35 +98,35 @@ describe Keen::Client do
98
98
  end
99
99
 
100
100
  it "should raise a failed responses" do
101
- query_params = "?api_key=#{api_key}&event_collection=#{event_collection}"
101
+ query_params = "?event_collection=#{event_collection}"
102
102
  url = query_url(query_name, query_params)
103
103
 
104
104
  stub_keen_get(url, 401, :error => {})
105
105
  expect {
106
106
  query.call(query_name, event_collection, {})
107
107
  }.to raise_error(Keen::AuthenticationError)
108
- expect_keen_get(url, "sync")
108
+ expect_keen_get(url, "sync", read_key)
109
109
  end
110
110
  end
111
111
  end
112
112
 
113
113
  describe "#count" do
114
114
  it "should not require params" do
115
- query_params = "?api_key=#{api_key}&event_collection=#{event_collection}"
115
+ query_params = "?event_collection=#{event_collection}"
116
116
  url = query_url("count", query_params)
117
117
  stub_keen_get(url, 200, :result => 10)
118
118
  client.count(event_collection).should == 10
119
- expect_keen_get(url, "sync")
119
+ expect_keen_get(url, "sync", read_key)
120
120
  end
121
121
  end
122
122
 
123
123
  describe "#extraction" do
124
124
  it "should not require params" do
125
- query_params = "?api_key=#{api_key}&event_collection=#{event_collection}"
125
+ query_params = "?event_collection=#{event_collection}"
126
126
  url = query_url("extraction", query_params)
127
127
  stub_keen_get(url, 200, :result => { "a" => 1 } )
128
128
  client.extraction(event_collection).should == { "a" => 1 }
129
- expect_keen_get(url, "sync")
129
+ expect_keen_get(url, "sync", read_key)
130
130
  end
131
131
  end
132
132
  end
@@ -2,14 +2,16 @@ require File.expand_path("../spec_helper", __FILE__)
2
2
 
3
3
  describe Keen::Client do
4
4
  let(:project_id) { "12345" }
5
- let(:api_key) { "abcde" }
5
+ let(:write_key) { "abcdewrite" }
6
+ let(:read_key) { "abcderead" }
6
7
  let(:client) { Keen::Client.new(:project_id => project_id) }
7
8
 
8
9
  describe "#initialize" do
9
10
  context "deprecated" do
10
- it "should allow created via project_id and api_key args" do
11
- client = Keen::Client.new(project_id, api_key)
12
- client.api_key.should == api_key
11
+ it "should allow created via project_id and key args" do
12
+ client = Keen::Client.new(project_id, write_key, read_key)
13
+ client.write_key.should == write_key
14
+ client.read_key.should == read_key
13
15
  client.project_id.should == project_id
14
16
  end
15
17
  end
@@ -17,8 +19,10 @@ describe Keen::Client do
17
19
  it "should initialize with options" do
18
20
  client = Keen::Client.new(
19
21
  :project_id => project_id,
20
- :api_key => api_key)
21
- client.api_key.should == api_key
22
+ :write_key => write_key,
23
+ :read_key => read_key)
24
+ client.write_key.should == write_key
25
+ client.read_key.should == read_key
22
26
  client.project_id.should == project_id
23
27
  end
24
28
  end
@@ -6,7 +6,8 @@ describe Keen do
6
6
  before do
7
7
  Keen.instance_variable_set(:@default_client, nil)
8
8
  ENV["KEEN_PROJECT_ID"] = "12345"
9
- ENV["KEEN_API_KEY"] = "abcde"
9
+ ENV["KEEN_WRITE_KEY"] = "abcdewrite"
10
+ ENV["KEEN_READ_KEY"] = "abcderead"
10
11
  end
11
12
 
12
13
  let(:client) { Keen.send(:default_client) }
@@ -15,8 +16,12 @@ describe Keen do
15
16
  client.project_id.should == "12345"
16
17
  end
17
18
 
18
- it "should set an api key from the environment" do
19
- client.api_key.should == "abcde"
19
+ it "should set a write key from the environment" do
20
+ client.write_key.should == "abcdewrite"
21
+ end
22
+
23
+ it "should set a read key from the environment" do
24
+ client.read_key.should == "abcderead"
20
25
  end
21
26
  end
22
27
  end
@@ -38,14 +43,14 @@ describe Keen do
38
43
  Keen.stub(:default_client).and_return(@default_client)
39
44
  end
40
45
 
41
- [:project_id, :api_key].each do |_method|
46
+ [:project_id, :write_key, :read_key].each do |_method|
42
47
  it "should forward the #{_method} method" do
43
48
  @default_client.should_receive(_method)
44
49
  Keen.send(_method)
45
50
  end
46
51
  end
47
52
 
48
- [:project_id=, :api_key=].each do |_method|
53
+ [:project_id=, :write_key=, :read_key=].each do |_method|
49
54
  it "should forward the #{_method} method" do
50
55
  @default_client.should_receive(_method).with("12345")
51
56
  Keen.send(_method, "12345")
@@ -23,26 +23,29 @@ module Keen::SpecHelpers
23
23
  stub_keen_request(:get, url, status, MultiJson.encode(response_body))
24
24
  end
25
25
 
26
- def expect_keen_request(method, url, body, sync_or_async_ua)
26
+ def expect_keen_request(method, url, body, sync_or_async_ua, read_or_write_key)
27
27
  user_agent = "keen-gem, v#{Keen::VERSION}, #{sync_or_async_ua}"
28
28
  user_agent += ", #{RUBY_VERSION}, #{RUBY_PLATFORM}, #{RUBY_PATCHLEVEL}"
29
29
  if defined?(RUBY_ENGINE)
30
30
  user_agent += ", #{RUBY_ENGINE}"
31
31
  end
32
32
 
33
+ headers = { "Content-Type" => "application/json",
34
+ "User-Agent" => user_agent,
35
+ "Authorization" => read_or_write_key }
36
+
33
37
  WebMock.should have_requested(method, url).with(
34
38
  :body => body,
35
- :headers => { "Content-Type" => "application/json",
36
- "User-Agent" => user_agent })
39
+ :headers => headers)
37
40
 
38
41
  end
39
42
 
40
- def expect_keen_get(url, sync_or_async_ua)
41
- expect_keen_request(:get, url, "", sync_or_async_ua)
43
+ def expect_keen_get(url, sync_or_async_ua, read_key)
44
+ expect_keen_request(:get, url, "", sync_or_async_ua, read_key)
42
45
  end
43
46
 
44
- def expect_keen_post(url, event_properties, sync_or_async_ua)
45
- expect_keen_request(:post, url, MultiJson.encode(event_properties), sync_or_async_ua)
47
+ def expect_keen_post(url, event_properties, sync_or_async_ua, write_key)
48
+ expect_keen_request(:post, url, MultiJson.encode(event_properties), sync_or_async_ua, write_key)
46
49
  end
47
50
 
48
51
  def api_event_resource_url(collection)
@@ -2,13 +2,14 @@ require File.expand_path("../spec_helper", __FILE__)
2
2
 
3
3
  describe Keen::HTTP::Async do
4
4
  let(:project_id) { "12345" }
5
+ let(:write_key) { "abcdewrite" }
5
6
  let(:collection) { "users" }
6
7
  let(:event_properties) { { "name" => "Bob" } }
7
8
  let(:api_success) { { "created" => true } }
8
9
 
9
10
  describe "synchrony" do
10
11
  before do
11
- @client = Keen::Client.new(:project_id => project_id)
12
+ @client = Keen::Client.new(:project_id => project_id, :write_key => write_key)
12
13
  end
13
14
 
14
15
  describe "success" do
@@ -16,7 +17,7 @@ describe Keen::HTTP::Async do
16
17
  stub_keen_post(api_event_resource_url(collection), 201, api_success)
17
18
  EM.synchrony {
18
19
  @client.publish_async(collection, event_properties)
19
- expect_keen_post(api_event_resource_url(collection), event_properties, "async")
20
+ expect_keen_post(api_event_resource_url(collection), event_properties, "async", write_key)
20
21
  EM.stop
21
22
  }
22
23
  end
metadata CHANGED
@@ -1,16 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Kyle Wild
9
9
  - Josh Dzielak
10
+ - Daniel Kador
10
11
  autorequire:
11
12
  bindir: bin
12
13
  cert_chain: []
13
- date: 2013-04-24 00:00:00.000000000 Z
14
+ date: 2013-05-01 00:00:00.000000000 Z
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
17
  name: multi_json