keen 0.9.3 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 23a71be7b45d1b303b5b5872cfed224d6ac80732
4
- data.tar.gz: 31666e8d77d3d7d0a9c434a5d883fcd7cc9418b8
3
+ metadata.gz: 982be161aadc1fa73c08a841f36a4056657904c0
4
+ data.tar.gz: 53ec16352023fac9586003cd097381368e626498
5
5
  SHA512:
6
- metadata.gz: 4452cce3d9ca6a82aa95f9e773d917c5f7e2ef638e21602dfed113e2fdf27bc7cc5b9b0278babe6b281556c4b9f8af208d4bfd6225402847c64a7ee6ba111a47
7
- data.tar.gz: c8b04e2657e971711c99b2983c9cff75f70745de18a1a2d4de5bef3957df0fcd5bf1778e514aef4e49d6e70c0d92830fafae77291adb6311efac1aacc7433eab
6
+ metadata.gz: fae9fcb9b63d095474b685b872df14c25689251feb04e895c4c23af2f0da6f6002f53b5474473116b9df0032520f890b6ab8292c64668d187a521d8fc2103001
7
+ data.tar.gz: 782c04eafab7b4f49cf20fd70892c408767491608f20c3426bf66d316956f82d64e2cea8f858cdd3290c001aedbd1cd94b277d34086520713cbf2332fda0580f
data/.travis.yml CHANGED
@@ -2,7 +2,6 @@ language: ruby
2
2
  bundler_args: --without development
3
3
 
4
4
  rvm:
5
- - 1.8.7
6
5
  - 1.9.3
7
6
  - 2.0.0
8
7
  - 2.2.2
@@ -21,8 +20,6 @@ before_install:
21
20
 
22
21
  matrix:
23
22
  exclude:
24
- - rvm: 1.8.7
25
- env: PATTERN=synchrony
26
23
  - rvm: jruby-19mode
27
24
  env: PATTERN=synchrony
28
25
 
data/Gemfile CHANGED
@@ -2,9 +2,9 @@ source "https://rubygems.org"
2
2
 
3
3
  group :development, :test do
4
4
  gem 'rake'
5
- gem 'rspec', '~>2'
6
5
  gem 'em-http-request'
7
6
  gem 'em-synchrony', :require => false
7
+ gem 'rspec', '~>2'
8
8
  gem 'webmock'
9
9
  end
10
10
 
data/README.md CHANGED
@@ -16,7 +16,7 @@ or install from Rubygems:
16
16
 
17
17
  gem install keen
18
18
 
19
- keen is tested with Ruby 1.8 and 1.9 on:
19
+ keen is tested with Ruby 1.9.3 + and on:
20
20
 
21
21
  * MRI
22
22
  * Rubinius
@@ -177,9 +177,30 @@ Each query method or alias takes an optional hash of options as an additional pa
177
177
  `:response` – Set to `:all_keys` to return the full API response (usually only the value of the `"result"` key is returned).
178
178
  `:method` - Set to `:post` to enable post body based query (https://keen.io/docs/data-analysis/post-queries/).
179
179
 
180
- ##### Query Caching
180
+ ### Saved Queries
181
181
 
182
- You can specify a `max_age` parameter as part of your query request, but make sure you send the request as a `:post` request.
182
+ You can manage your saved queries from the Keen ruby client.
183
+
184
+ ```ruby
185
+ # Create a saved query
186
+ Keen.saved_queries.create("name", saved_query_attributes)
187
+
188
+ # Get all saved queries
189
+ Keen.saved_queries.all
190
+
191
+ # Get one saved query
192
+ Keen.saved_queries.get("saved-query-slug")
193
+
194
+ # Get saved query with results
195
+ Keen.saved_queries.get("saved-query-slug", results: true)
196
+
197
+ # Update a saved query
198
+ saved_query_attributes = { refresh_rate: 14400 }
199
+ Keen.saved_queries.update("saved-query-slug", saved_query_attributes)
200
+
201
+ # Delete a saved query
202
+ Keen.saved_queries.delete("saved-query-slug")
203
+ ```
183
204
 
184
205
  ##### Getting Query URLs
185
206
 
@@ -391,6 +412,10 @@ If you want some bot protection, check out the [Voight-Kampff](https://github.co
391
412
 
392
413
  ### Changelog
393
414
 
415
+ ##### 0.9.4
416
+ + Add SDK support for Saved Queries
417
+ + Removed support for Ruby MRI 1.8.7
418
+
394
419
  ##### 0.9.2
395
420
  + Added support for max_age as an integer.
396
421
 
data/lib/keen.rb CHANGED
@@ -51,7 +51,8 @@ module Keen
51
51
  :event_collections,
52
52
  :project_info,
53
53
  :query_url,
54
- :query
54
+ :query,
55
+ :saved_queries
55
56
 
56
57
  attr_writer :logger
57
58
 
data/lib/keen/client.rb CHANGED
@@ -3,6 +3,7 @@ require 'keen/version'
3
3
  require 'keen/client/publishing_methods'
4
4
  require 'keen/client/querying_methods'
5
5
  require 'keen/client/maintenance_methods'
6
+ require 'keen/client/saved_queries'
6
7
  require 'openssl'
7
8
  require 'multi_json'
8
9
  require 'base64'
@@ -53,6 +54,10 @@ module Keen
53
54
  self.read_timeout = options[:read_timeout].to_f unless options[:read_timeout].nil?
54
55
  end
55
56
 
57
+ def saved_queries
58
+ @saved_queries ||= SavedQueries.new(self)
59
+ end
60
+
56
61
  private
57
62
 
58
63
  def process_response(status_code, response_body)
@@ -0,0 +1,82 @@
1
+ require "json"
2
+
3
+ class SavedQueries
4
+ def initialize(client)
5
+ @client = client
6
+ end
7
+
8
+ def all
9
+ process_response(saved_query_response)
10
+ end
11
+
12
+ def get(saved_query_name, results = false)
13
+ saved_query_path = "/#{saved_query_name}"
14
+ if results
15
+ saved_query_path += "/result"
16
+ end
17
+ response = saved_query_response(saved_query_path)
18
+ response_body = JSON.parse(response.body, symbolize_names: true)
19
+ process_response(response)
20
+ end
21
+
22
+ def create(saved_query_name, saved_query_body)
23
+ response = Keen::HTTP::Sync.new(client.api_url, client.proxy_url, client.read_timeout).put(
24
+ path: "#{saved_query_base_url}/#{saved_query_name}",
25
+ headers: api_headers(client.master_key, "sync"),
26
+ body: saved_query_body
27
+ )
28
+ process_response(response)
29
+ end
30
+ alias_method :update, :create
31
+
32
+ def delete(saved_query_name)
33
+ response = Keen::HTTP::Sync.new(client.api_url, client.proxy_url, client.read_timeout).delete(
34
+ path: "#{saved_query_base_url}/#{saved_query_name}",
35
+ headers: api_headers(client.master_key, "sync")
36
+ )
37
+ process_response(response)
38
+ end
39
+
40
+ private
41
+
42
+ attr_reader :client
43
+
44
+ def saved_query_response(path = "")
45
+ Keen::HTTP::Sync.new(client.api_url, client.proxy_url, client.read_timeout).get(
46
+ path: saved_query_base_url + path,
47
+ headers: api_headers(client.master_key, "sync")
48
+ )
49
+ end
50
+
51
+ def saved_query_base_url
52
+ "/#{client.api_version}/projects/#{client.project_id}/queries/saved"
53
+ end
54
+
55
+ def api_headers(authorization, sync_type)
56
+ user_agent = "keen-gem, v#{Keen::VERSION}, #{sync_type}"
57
+ user_agent += ", #{RUBY_VERSION}, #{RUBY_PLATFORM}, #{RUBY_PATCHLEVEL}"
58
+ if defined?(RUBY_ENGINE)
59
+ user_agent += ", #{RUBY_ENGINE}"
60
+ end
61
+ { "Content-Type" => "application/json",
62
+ "User-Agent" => user_agent,
63
+ "Authorization" => authorization }
64
+ end
65
+
66
+ def process_response(response)
67
+ case response.code.to_i
68
+ when 204
69
+ true
70
+ when 200..299
71
+ JSON.parse(response.body, symbolize_names: true)
72
+ when 400
73
+ raise Keen::BadRequestError.new(response.body)
74
+ when 401
75
+ raise Keen::AuthenticationError.new(response.body)
76
+ when 404
77
+ raise Keen::NotFoundError.new(response.body)
78
+ else
79
+ raise Keen::HttpError.new(response.body)
80
+ end
81
+ end
82
+ end
data/lib/keen/http.rb CHANGED
@@ -32,6 +32,12 @@ module Keen
32
32
  @http.post(path, body, headers)
33
33
  end
34
34
 
35
+ def put(options)
36
+ path, headers, body = options.values_at(
37
+ :path, :headers, :body)
38
+ @http.put(path, body, headers)
39
+ end
40
+
35
41
  def get(options)
36
42
  path, headers = options.values_at(
37
43
  :path, :headers)
data/lib/keen/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Keen
2
- VERSION = "0.9.3"
2
+ VERSION = "0.9.4"
3
3
  end
@@ -0,0 +1,34 @@
1
+ require File.expand_path("../spec_helper", __FILE__)
2
+
3
+ describe "Saved Queries" do
4
+ let(:project_id) { ENV["KEEN_PROJECT_ID"] }
5
+ let(:master_key) { ENV["KEEN_MASTER_KEY"] }
6
+ let(:client) { Keen::Client.new(project_id: project_id, master_key: master_key) }
7
+
8
+ describe "#all" do
9
+ it "gets all saved_queries" do
10
+ expect(client.saved_queries.all).to be_instance_of(Array)
11
+ end
12
+ end
13
+
14
+ describe "#get" do
15
+ it "gets a single saved query" do
16
+ all_queries = client.saved_queries.all
17
+
18
+ single_saved_query = client.saved_queries.get(all_queries.first[:query_name])
19
+
20
+ expect(single_saved_query[:query_name]).to eq(all_queries.first[:query_name])
21
+ expect(single_saved_query[:results]).to be_nil
22
+ end
23
+ end
24
+
25
+ describe "#results" do
26
+ it "gets a single saved query" do
27
+ all_queries = client.saved_queries.all
28
+
29
+ single_saved_query = client.saved_queries.get(all_queries.last[:query_name], results: true)
30
+
31
+ expect(single_saved_query[:result]).not_to be_nil
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,165 @@
1
+ require File.expand_path("../spec_helper", __FILE__)
2
+
3
+ describe Keen do
4
+ let(:client) do
5
+ Keen::Client.new(
6
+ project_id: "12341234",
7
+ master_key: "abcdef",
8
+ api_url: "https://notreal.keen.io"
9
+ )
10
+ end
11
+
12
+ describe "#saved_queries" do
13
+ describe "#all" do
14
+
15
+ it "returns all saved queries" do
16
+ all_saved_queries = [ {
17
+ refresh_rate: 0,
18
+ last_modified_date: "2015-10-19T20:14:29.797000+00:00",
19
+ query_name: "Analysis-API-Calls-this-1-day",
20
+ query: {
21
+ filters: [],
22
+ analysis_type: "count",
23
+ timezone: "UTC",
24
+ timeframe: "this_1_days",
25
+ event_collection: "analysis_api_call"
26
+ },
27
+ metadata: {
28
+ visualization: { chart_type: "metric"}
29
+ }
30
+ } ]
31
+ stub_keen_get(saved_query_endpoint, 200, all_saved_queries)
32
+
33
+ all_saved_queries_response = client.saved_queries.all
34
+
35
+ expect(all_saved_queries_response).to eq(all_saved_queries)
36
+ end
37
+ end
38
+
39
+ describe "#get" do
40
+ it "returns a specific saved query given a query id" do
41
+ saved_query = {
42
+ refresh_rate: 0,
43
+ last_modified_date: "2015-10-19T20:14:29.797000+00:00",
44
+ query_name: "Analysis-API-Calls-this-1-day",
45
+ query: {
46
+ filters: [],
47
+ analysis_type: "count",
48
+ timezone: "UTC",
49
+ timeframe: "this_1_days",
50
+ event_collection: "analysis_api_call"
51
+ },
52
+ metadata: {
53
+ visualization: { chart_type: "metric"}
54
+ }
55
+ }
56
+ stub_keen_get(
57
+ saved_query_endpoint + "/#{saved_query[:query_name]}",
58
+ 200,
59
+ saved_query
60
+ )
61
+
62
+ saved_query_response = client.saved_queries.get("Analysis-API-Calls-this-1-day")
63
+
64
+ expect(saved_query_response).to eq(saved_query)
65
+ end
66
+
67
+ it "throws an exception if service can't find saved query" do
68
+ saved_query = {
69
+ message: "Resource not found",
70
+ error_code: "ResourceNotFoundError"
71
+ }
72
+ stub_keen_get(
73
+ saved_query_endpoint + "/missing-query",
74
+ 404,
75
+ saved_query
76
+ )
77
+
78
+ expect {
79
+ client.saved_queries.get("missing-query")
80
+ }.to raise_error(Keen::NotFoundError)
81
+ end
82
+ end
83
+
84
+ describe "#create" do
85
+ it "returns the created saved query when creation is successful" do
86
+ saved_query = {
87
+ refresh_rate: 0,
88
+ last_modified_date: "2015-10-19T20:14:29.797000+00:00",
89
+ query_name: "new-query",
90
+ query: {
91
+ filters: [],
92
+ analysis_type: "count",
93
+ timezone: "UTC",
94
+ timeframe: "this_1_days",
95
+ event_collection: "analysis_api_call"
96
+ },
97
+ metadata: {
98
+ visualization: { chart_type: "metric"}
99
+ }
100
+ }
101
+ stub_keen_put(
102
+ saved_query_endpoint + "/#{saved_query[:query_name]}", 201, saved_query
103
+ )
104
+
105
+ saved_query_response = client.saved_queries.create(saved_query[:query_name], saved_query)
106
+
107
+ expect(saved_query_response).to eq(saved_query)
108
+ end
109
+
110
+ it "raises an error when creation is unsuccessful" do
111
+ stub_keen_put(
112
+ saved_query_endpoint + "/saved-query-name", 400, {}
113
+ )
114
+
115
+ expect {
116
+ client.saved_queries.create("saved-query-name", {})
117
+ }.to raise_error(Keen::BadRequestError)
118
+ end
119
+ end
120
+
121
+ describe "#update" do
122
+ it "returns the created saved query when update is successful" do
123
+ saved_query = {
124
+ refresh_rate: 0,
125
+ last_modified_date: "2015-10-19T20:14:29.797000+00:00",
126
+ query_name: "new-query",
127
+ query: {
128
+ filters: [],
129
+ analysis_type: "count",
130
+ timezone: "UTC",
131
+ timeframe: "this_1_days",
132
+ event_collection: "analysis_api_call"
133
+ },
134
+ metadata: {
135
+ visualization: { chart_type: "metric"}
136
+ }
137
+ }
138
+ stub_keen_put(
139
+ saved_query_endpoint + "/#{saved_query[:query_name]}", 200, saved_query
140
+ )
141
+
142
+ saved_query_response = client.saved_queries.update(saved_query[:query_name], saved_query)
143
+
144
+ expect(saved_query_response).to eq(saved_query)
145
+ end
146
+ end
147
+
148
+ describe "#delete" do
149
+ it "returns true with deletion is successful" do
150
+ query_name = "query-to-be-deleted"
151
+ stub_keen_delete(
152
+ saved_query_endpoint + "/#{query_name}", 204
153
+ )
154
+
155
+ saved_query_response = client.saved_queries.delete(query_name)
156
+
157
+ expect(saved_query_response).to eq(true)
158
+ end
159
+ end
160
+ end
161
+
162
+ def saved_query_endpoint
163
+ client.api_url + "/#{client.api_version}/projects/#{client.project_id}/queries/saved"
164
+ end
165
+ end
data/spec/spec_helper.rb CHANGED
@@ -19,6 +19,10 @@ module Keen::SpecHelpers
19
19
  stub_keen_request(:post, url, status, MultiJson.encode(response_body))
20
20
  end
21
21
 
22
+ def stub_keen_put(url, status, response_body)
23
+ stub_keen_request(:put, url, status, MultiJson.encode(response_body))
24
+ end
25
+
22
26
  def stub_keen_get(url, status, response_body)
23
27
  stub_keen_request(:get, url, status, MultiJson.encode(response_body))
24
28
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 0.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Kleissner
@@ -9,132 +9,132 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-08-25 00:00:00.000000000 Z
12
+ date: 2015-11-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ~>
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
20
  version: '1.3'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ~>
25
+ - - "~>"
26
26
  - !ruby/object:Gem::Version
27
27
  version: '1.3'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: addressable
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ~>
32
+ - - "~>"
33
33
  - !ruby/object:Gem::Version
34
34
  version: 2.3.5
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ~>
39
+ - - "~>"
40
40
  - !ruby/object:Gem::Version
41
41
  version: 2.3.5
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: guard
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - '>='
46
+ - - ">="
47
47
  - !ruby/object:Gem::Version
48
48
  version: '0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - '>='
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: guard-rspec
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - '>='
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - '>='
67
+ - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rb-inotify
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - '>='
74
+ - - ">="
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - '>='
81
+ - - ">="
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: rb-fsevent
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - '>='
88
+ - - ">="
89
89
  - !ruby/object:Gem::Version
90
90
  version: '0'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '>='
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: rb-fchange
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - '>='
102
+ - - ">="
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0'
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - '>='
109
+ - - ">="
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: ruby_gntp
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - '>='
116
+ - - ">="
117
117
  - !ruby/object:Gem::Version
118
118
  version: '0'
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - '>='
123
+ - - ">="
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: rb-readline
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  requirements:
130
- - - '>='
130
+ - - ">="
131
131
  - !ruby/object:Gem::Version
132
132
  version: '0'
133
133
  type: :development
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
- - - '>='
137
+ - - ">="
138
138
  - !ruby/object:Gem::Version
139
139
  version: '0'
140
140
  description: Send events and build analytics features into your Ruby applications.
@@ -143,9 +143,9 @@ executables: []
143
143
  extensions: []
144
144
  extra_rdoc_files: []
145
145
  files:
146
- - .gitignore
147
- - .rspec
148
- - .travis.yml
146
+ - ".gitignore"
147
+ - ".rspec"
148
+ - ".travis.yml"
149
149
  - Gemfile
150
150
  - Guardfile
151
151
  - LICENSE
@@ -159,16 +159,19 @@ files:
159
159
  - lib/keen/client/maintenance_methods.rb
160
160
  - lib/keen/client/publishing_methods.rb
161
161
  - lib/keen/client/querying_methods.rb
162
+ - lib/keen/client/saved_queries.rb
162
163
  - lib/keen/http.rb
163
164
  - lib/keen/scoped_key.rb
164
165
  - lib/keen/version.rb
165
166
  - spec/integration/api_spec.rb
167
+ - spec/integration/saved_query_spec.rb
166
168
  - spec/integration/spec_helper.rb
167
169
  - spec/keen/client/maintenance_methods_spec.rb
168
170
  - spec/keen/client/publishing_methods_spec.rb
169
171
  - spec/keen/client/querying_methods_spec.rb
170
172
  - spec/keen/client_spec.rb
171
173
  - spec/keen/keen_spec.rb
174
+ - spec/keen/saved_query_spec.rb
172
175
  - spec/keen/scoped_key_spec.rb
173
176
  - spec/keen/spec_helper.rb
174
177
  - spec/spec_helper.rb
@@ -184,28 +187,30 @@ require_paths:
184
187
  - lib
185
188
  required_ruby_version: !ruby/object:Gem::Requirement
186
189
  requirements:
187
- - - '>='
190
+ - - ">="
188
191
  - !ruby/object:Gem::Version
189
192
  version: '0'
190
193
  required_rubygems_version: !ruby/object:Gem::Requirement
191
194
  requirements:
192
- - - '>='
195
+ - - ">="
193
196
  - !ruby/object:Gem::Version
194
197
  version: '0'
195
198
  requirements: []
196
199
  rubyforge_project:
197
- rubygems_version: 2.0.14
200
+ rubygems_version: 2.4.8
198
201
  signing_key:
199
202
  specification_version: 4
200
203
  summary: Keen IO API Client
201
204
  test_files:
202
205
  - spec/integration/api_spec.rb
206
+ - spec/integration/saved_query_spec.rb
203
207
  - spec/integration/spec_helper.rb
204
208
  - spec/keen/client/maintenance_methods_spec.rb
205
209
  - spec/keen/client/publishing_methods_spec.rb
206
210
  - spec/keen/client/querying_methods_spec.rb
207
211
  - spec/keen/client_spec.rb
208
212
  - spec/keen/keen_spec.rb
213
+ - spec/keen/saved_query_spec.rb
209
214
  - spec/keen/scoped_key_spec.rb
210
215
  - spec/keen/spec_helper.rb
211
216
  - spec/spec_helper.rb