KeyholeIO 0.1.1 → 0.2
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.
- data/lib/keyholeio.rb +274 -242
- metadata +38 -50
- data/.gitignore +0 -3
- data/Gemfile +0 -4
- data/Rakefile +0 -2
- data/keyholeio.gemspec +0 -21
- data/lib/keyholeio/version.rb +0 -3
data/lib/keyholeio.rb
CHANGED
@@ -1,305 +1,337 @@
|
|
1
|
-
#
|
2
|
-
# Keyhole.IO Ruby API
|
3
|
-
# http://keyhole.io/developer/libraries
|
4
|
-
#
|
5
|
-
# By Kishyr Ramdial <kishyr@immedia.co.za>
|
6
|
-
# Revision date: 28 June 2011
|
7
|
-
#
|
8
|
-
|
9
|
-
require 'rubygems'
|
10
|
-
require 'cgi'
|
11
|
-
require 'json'
|
12
1
|
require 'net/http'
|
2
|
+
require 'json'
|
13
3
|
|
14
|
-
|
15
|
-
|
16
|
-
$version = "v1"
|
4
|
+
module KeyholeIO
|
5
|
+
APIURL = "http://api.keyhole.io/v1"
|
17
6
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
7
|
+
|
8
|
+
class Response
|
9
|
+
attr_accessor :meta, :data
|
10
|
+
|
11
|
+
def initialize response
|
12
|
+
resp = JSON.parse response
|
13
|
+
@meta = resp["meta"]
|
14
|
+
if @meta["status"] >= 200 and @meta["status"] <= 299
|
15
|
+
@data = resp["data"]
|
16
|
+
end
|
25
17
|
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# Entities
|
29
|
-
#
|
30
|
-
# POST /entity
|
31
|
-
# Creates an entity if it doesn't exist and returns a token. If an already exists, it'll return a new token.
|
32
|
-
def register_entity(options)
|
33
|
-
raw_response = self.class.post_data_with_apikey("/entity", options)
|
34
|
-
if raw_response["meta"]["status"].to_i == 200
|
35
|
-
@@token = raw_response["data"]["token"]
|
36
|
-
end
|
37
|
-
raw_response
|
38
|
-
end
|
39
18
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
self.class.get_data_with_apikey("/entity", options)
|
19
|
+
def successful?
|
20
|
+
@meta["status"] >= 200 and @meta["status"] <= 299
|
21
|
+
end
|
44
22
|
end
|
45
23
|
|
46
|
-
# DELETE /entity
|
47
|
-
# Deletes an entity and all its datastores.
|
48
|
-
def delete_entity(id)
|
49
|
-
_hash = { :apikey => @@apikey }
|
50
|
-
_identifier = { :id => id }
|
51
|
-
_hash.merge!(_identifier)
|
52
|
-
self.class.delete_data_with_token("/entity", _hash)
|
53
|
-
end
|
54
24
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
25
|
+
class KVPair
|
26
|
+
attr_accessor :meta, :key, :value, :meta, :created_at, :updated_at, :type, :successful
|
27
|
+
|
28
|
+
def initialize raw_response
|
29
|
+
response = Response.new raw_response
|
30
|
+
if response.successful?
|
31
|
+
@meta = response.meta
|
32
|
+
@key = response.data["key"]
|
33
|
+
@value = response.data["value"]
|
34
|
+
@created_at = response.data["created_at"] if response.data["created_at"]
|
35
|
+
@updated_at = response.data["updated_at"] if response.data["updated_at"]
|
36
|
+
@type = response.data["type"] if response.data["type"]
|
37
|
+
@successful = true
|
38
|
+
else
|
39
|
+
@successful = false
|
40
|
+
end
|
41
|
+
end
|
60
42
|
|
61
|
-
|
62
|
-
|
63
|
-
options = { :old => oldpass, :new => newpass }
|
64
|
-
raw_response = self.class.post_data_with_token("/entity/password", options)
|
65
|
-
if raw_response["meta"]["status"].to_i == 200
|
66
|
-
@@token = raw_response["data"]["token"]
|
43
|
+
def successful?
|
44
|
+
@successful
|
67
45
|
end
|
68
|
-
raw_response
|
69
46
|
end
|
70
47
|
|
71
48
|
|
72
|
-
|
73
|
-
|
74
|
-
# POST /datastore
|
75
|
-
# Create or update a datastore (set a value to a key)
|
76
|
-
# FIXME: doesn't support binary uploads
|
77
|
-
def set_datastore(key, value, meta = nil)
|
78
|
-
val = value
|
79
|
-
met = meta
|
49
|
+
class Group
|
50
|
+
attr_accessor :id, :apikey
|
80
51
|
|
81
|
-
|
82
|
-
|
52
|
+
def initialize name, apikey
|
53
|
+
@apikey = apikey
|
54
|
+
@id = name
|
55
|
+
|
56
|
+
response = Net::HTTP.post_form URI.parse("#{APIURL}/group"), paramshash(name)
|
57
|
+
r = Response.new response.body
|
83
58
|
end
|
84
59
|
|
85
|
-
|
86
|
-
|
60
|
+
def entities
|
61
|
+
response = Net::HTTP.get URI.parse("#{APIURL}/group?apikey=#{@apikey}&id=#{@id}")
|
62
|
+
Response.new response
|
87
63
|
end
|
88
64
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
65
|
+
def add entity
|
66
|
+
if entity.class == Entity
|
67
|
+
http = Net::HTTP.new("api.keyhole.io")
|
68
|
+
req = Net::HTTP::Put.new("/v1/group")
|
69
|
+
req.set_form_data apikey: @apikey, id: @id, entity: entity.name
|
93
70
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
71
|
+
Response.new http.request(req).body
|
72
|
+
else
|
73
|
+
puts "'entity' needs to be of type Entity."
|
74
|
+
end
|
75
|
+
end
|
99
76
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
77
|
+
def remove entity
|
78
|
+
if entity.class == Entity
|
79
|
+
http = Net::HTTP.new("api.keyhole.io")
|
80
|
+
req = Net::HTTP::Delete.new("/v1/group?apikey=#{@apikey}&id=#{@id}&entity=#{entity.name}")
|
81
|
+
Response.new http.request(req).body
|
82
|
+
else
|
83
|
+
puts "'entity' needs to be of type Entity."
|
84
|
+
end
|
85
|
+
end
|
105
86
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
87
|
+
def destroy
|
88
|
+
http = Net::HTTP.new("api.keyhole.io")
|
89
|
+
req = Net::HTTP::Delete.new("/v1/group/rm?apikey=#{@apikey}&id=#{@id}")
|
90
|
+
Response.new http.request(req).body
|
91
|
+
end
|
111
92
|
|
93
|
+
private
|
112
94
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
# Creates a new group using the apikey and an identifier (id)
|
117
|
-
def create_group(group_name)
|
118
|
-
self.class.post_data_with_apikey("/group", { :id => group_name })
|
119
|
-
end
|
95
|
+
def paramshash name, options = {}
|
96
|
+
self.class.paramshash name, @apikey, options
|
97
|
+
end
|
120
98
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
99
|
+
def self.paramshash name, apikey, options
|
100
|
+
params = {
|
101
|
+
apikey: apikey,
|
102
|
+
id: name
|
103
|
+
}
|
104
|
+
options.collect { |k,v| params[k] = v }
|
126
105
|
|
127
|
-
|
128
|
-
|
129
|
-
def add_entity_to_group(group, entity)
|
130
|
-
options = { :id => group, :entity => entity }
|
131
|
-
self.class.put_data_with_apikey("/group", options)
|
106
|
+
params
|
107
|
+
end
|
132
108
|
end
|
133
109
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
110
|
+
|
111
|
+
class Entity
|
112
|
+
attr_accessor :token, :id, :apikey, :name, :channel_name
|
113
|
+
|
114
|
+
##
|
115
|
+
## Entity Methods
|
116
|
+
##
|
117
|
+
|
118
|
+
def initialize name, apikey, options = {}
|
119
|
+
# options: desc, password, public
|
120
|
+
@apikey = apikey
|
121
|
+
@name = name
|
122
|
+
|
123
|
+
response = Net::HTTP.post_form URI.parse("#{APIURL}/entity"), paramshash(name, options)
|
124
|
+
r = Response.new response.body
|
125
|
+
if r.successful?
|
126
|
+
@token = r.data["token"]
|
127
|
+
end
|
128
|
+
end
|
140
129
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
self.class.delete_data_with_apikey("/group/rm", { :id => group_name })
|
145
|
-
end
|
130
|
+
def info options = {}
|
131
|
+
self.class.get_info @name, @apikey, options
|
132
|
+
end
|
146
133
|
|
134
|
+
def destroy
|
135
|
+
http = Net::HTTP.new("api.keyhole.io")
|
136
|
+
req = Net::HTTP::Delete.new("/v1/entity?token=#{@token}&apikey=#{@apikey}&id=#{@name}")
|
137
|
+
Response.new http.request(req).body
|
138
|
+
end
|
147
139
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
def add_msg_client(type, client_id)
|
153
|
-
self.class.post_data_with_token("/entity/messaging/#{type}", { :id => client_id })
|
154
|
-
end
|
140
|
+
def nullify_token
|
141
|
+
http = Net::HTTP.new("api.keyhole.io")
|
142
|
+
req = Net::HTTP::Put.new("/v1/entity")
|
143
|
+
req.set_form_data token: @token
|
155
144
|
|
156
|
-
|
157
|
-
|
158
|
-
def check_msg_client(type, client_id)
|
159
|
-
self.class.get_data_with_token("/entity/messaging/#{type}", { :id => client_id })
|
160
|
-
end
|
145
|
+
Response.new http.request(req).body
|
146
|
+
end
|
161
147
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
end
|
148
|
+
def set_password new_pass
|
149
|
+
response = Net::HTTP.post_form URI.parse("#{APIURL}/entity/password"), tokenparams(new: new_pass)
|
150
|
+
Response.new response.body
|
151
|
+
end
|
167
152
|
|
153
|
+
def change_password old_pass, new_pass
|
154
|
+
response = Net::HTTP.post_form URI.parse("#{APIURL}/entity/password"), tokenparams(old: old_pass, new: new_pass)
|
155
|
+
Response.new response.body
|
156
|
+
end
|
168
157
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
self.class.post_data_with_token("/entity/channel")
|
175
|
-
end
|
158
|
+
def delete key
|
159
|
+
http = Net::HTTP.new("api.keyhole.io")
|
160
|
+
req = Net::HTTP::Delete.new("/v1/datastore/#{key}?token=#{@token}")
|
161
|
+
Response.new http.request(req).body
|
162
|
+
end
|
176
163
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
self.class.get_data_with_token("/entity/channel")
|
181
|
-
end
|
164
|
+
##
|
165
|
+
## Channel Methods
|
166
|
+
##
|
182
167
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
168
|
+
def channel
|
169
|
+
response = Net::HTTP.post_form URI.parse("#{APIURL}/entity/channel"), tokenparams(nil)
|
170
|
+
r = Response.new response.body
|
171
|
+
if r.successful?
|
172
|
+
@channel_name = r.data["name"]
|
173
|
+
end
|
174
|
+
end
|
188
175
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
end
|
176
|
+
def channel_connected
|
177
|
+
response = Net::HTTP.get URI.parse("#{APIURL}/entity/channel?token=#{@token}")
|
178
|
+
Response.new response
|
179
|
+
end
|
194
180
|
|
181
|
+
def channel_rename
|
182
|
+
http = Net::HTTP.new("api.keyhole.io")
|
183
|
+
req = Net::HTTP::Put.new("/v1/entity/channel")
|
184
|
+
req.set_form_data token: @token
|
195
185
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
self.post_data(endpoint, _hash)
|
202
|
-
end
|
186
|
+
r = Response.new http.request(req).body
|
187
|
+
if r.successful?
|
188
|
+
@channel_name = r.data["name"]
|
189
|
+
end
|
190
|
+
end
|
203
191
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
192
|
+
def channel_destroy
|
193
|
+
http = Net::HTTP.new("api.keyhole.io")
|
194
|
+
req = Net::HTTP::Delete.new("/v1/entity/channel?token=#{@token}")
|
195
|
+
r = Response.new http.request(req).body
|
196
|
+
if r.successful?
|
197
|
+
@channel_name = nil
|
198
|
+
end
|
199
|
+
r
|
200
|
+
end
|
209
201
|
|
210
|
-
def self.post_data(endpoint, options = nil)
|
211
|
-
req = Net::HTTP::Post.new("/#{$version}#{endpoint}")
|
212
|
-
req.set_form_data(options) unless options.nil?
|
213
|
-
resp = $http.request(req)
|
214
|
-
JSON.parse(resp.body)
|
215
|
-
end
|
216
202
|
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
_hash.merge!(options)
|
221
|
-
self.get_data(endpoint, _hash)
|
222
|
-
end
|
203
|
+
##
|
204
|
+
## Messaging Client Methods
|
205
|
+
##
|
223
206
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
end
|
207
|
+
def add_client id, type
|
208
|
+
response = Net::HTTP.post_form URI.parse("#{APIURL}/entity/messaging/#{type}"), tokenparams(id: id)
|
209
|
+
Response.new response.body
|
210
|
+
end
|
229
211
|
|
230
|
-
|
231
|
-
|
212
|
+
def add_email_client id
|
213
|
+
add_client id, "email"
|
214
|
+
end
|
232
215
|
|
233
|
-
|
234
|
-
|
235
|
-
else
|
236
|
-
req = Net::HTTP::Get.new("/#{$version}#{endpoint}")
|
216
|
+
def add_apns_client id
|
217
|
+
add_client id, "apns"
|
237
218
|
end
|
238
219
|
|
239
|
-
|
240
|
-
|
241
|
-
|
220
|
+
def check_client id, type
|
221
|
+
response = Net::HTTP.get URI.parse("#{APIURL}/entity/messaging/#{type}?token=#{@token}&id=#{id}")
|
222
|
+
r = Response.new response
|
223
|
+
if r.successful?
|
224
|
+
r.meta["status"] == 200
|
225
|
+
else
|
226
|
+
false
|
227
|
+
end
|
228
|
+
end
|
242
229
|
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
_hash.merge!(options) unless options.nil?
|
247
|
-
self.delete_data(endpoint, _hash)
|
248
|
-
end
|
230
|
+
def email_client_exists? id
|
231
|
+
check_client id, "email"
|
232
|
+
end
|
249
233
|
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
self.delete_data(endpoint, _hash)
|
254
|
-
end
|
234
|
+
def apns_client_exists? id
|
235
|
+
check_client id, "apns"
|
236
|
+
end
|
255
237
|
|
256
|
-
|
257
|
-
|
238
|
+
def delete_client id, type
|
239
|
+
http = Net::HTTP.new("api.keyhole.io")
|
240
|
+
req = Net::HTTP::Delete.new("/v1/entity/messaging/#{type}?token=#{@token}&id=#{id}")
|
241
|
+
r = Response.new http.request(req).body
|
242
|
+
end
|
258
243
|
|
259
|
-
|
260
|
-
|
261
|
-
else
|
262
|
-
req = Net::HTTP::Delete.new("/#{$version}#{endpoint}")
|
244
|
+
def remove_email_client id
|
245
|
+
delete_client id, "email"
|
263
246
|
end
|
264
247
|
|
265
|
-
|
266
|
-
|
267
|
-
|
248
|
+
def remove_apns_client id
|
249
|
+
delete_client id, "apns"
|
250
|
+
end
|
268
251
|
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
252
|
+
##
|
253
|
+
## Datastore Methods
|
254
|
+
##
|
255
|
+
|
256
|
+
def set kvpair
|
257
|
+
tparams = {}
|
258
|
+
unless kvpair.empty?
|
259
|
+
tparams[:k] = kvpair.keys.first
|
260
|
+
if (kvpair.values.first.class == Array or kvpair.values.first.class == Hash)
|
261
|
+
tparams[:v] = kvpair.values.first.to_json
|
262
|
+
else
|
263
|
+
tparams[:v] = kvpair.values.first
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
if kvpair.size > 1
|
268
|
+
tparams[:meta] = kvpair.values.last.to_json
|
269
|
+
end
|
270
|
+
|
271
|
+
response = Net::HTTP.post_form URI.parse("#{APIURL}/datastore"), tokenparams(tparams)
|
272
|
+
Response.new response.body
|
273
|
+
end
|
275
274
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
end
|
275
|
+
def datastores options = {}
|
276
|
+
response = Net::HTTP.get URI.parse("#{APIURL}/datastore?#{tokenparams_string(options)}")
|
277
|
+
Response.new response
|
278
|
+
end
|
281
279
|
|
282
|
-
|
283
|
-
|
280
|
+
def get key
|
281
|
+
response = Net::HTTP.get URI.parse("#{APIURL}/datastore/#{key}?#{tokenparams_string(nil)}")
|
282
|
+
KVPair.new response
|
283
|
+
end
|
284
284
|
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
285
|
+
def remove key
|
286
|
+
http = Net::HTTP.new("api.keyhole.io")
|
287
|
+
req = Net::HTTP::Delete.new("/v1/datastore/#{key}?token=#{@token}")
|
288
|
+
r = Response.new http.request(req).body
|
289
|
+
end
|
290
|
+
|
291
|
+
##
|
292
|
+
## Class Methods
|
293
|
+
##
|
294
|
+
|
295
|
+
def self.get_info name, apikey, options = {}
|
296
|
+
# options: password
|
297
|
+
response = Net::HTTP.get(URI.parse("#{APIURL}/entity?#{self.paramshash_string(name, apikey, options)}"))
|
298
|
+
Response.new response
|
299
|
+
end
|
300
|
+
|
301
|
+
#private
|
302
|
+
|
303
|
+
def tokenparams options = {}
|
304
|
+
params = { token: @token }
|
305
|
+
options.collect { |k,v| params[k] = v } unless options.nil?
|
306
|
+
params
|
289
307
|
end
|
290
|
-
req.set_form_data({})
|
291
|
-
resp = $http.request(req)
|
292
|
-
JSON.parse(resp.body)
|
293
|
-
end
|
294
308
|
|
295
|
-
|
309
|
+
def tokenparams_string options
|
310
|
+
tokenparams(options).collect { |k, v| "#{k}=#{v}" }.join("&")
|
311
|
+
end
|
312
|
+
|
313
|
+
def paramshash name, options = {}
|
314
|
+
self.class.paramshash name, @apikey, options
|
315
|
+
end
|
316
|
+
|
317
|
+
def self.paramshash name, apikey, options
|
318
|
+
params = {
|
319
|
+
apikey: apikey,
|
320
|
+
id: name
|
321
|
+
}
|
322
|
+
options.collect { |k,v| params[k] = v }
|
323
|
+
|
324
|
+
params
|
325
|
+
end
|
326
|
+
|
327
|
+
def paramshash_string name, options = {}
|
328
|
+
self.class.paramshash_string name, options, @apikey
|
329
|
+
end
|
296
330
|
|
297
|
-
|
298
|
-
|
299
|
-
elements = []
|
300
|
-
keys.size.times do |i|
|
301
|
-
elements << "#{CGI::escape(keys[i].to_s)}=#{CGI::escape(values[i].to_s)}"
|
331
|
+
def self.paramshash_string name, apikey, options
|
332
|
+
self.paramshash(name, apikey, options).collect { |k, v| "#{k}=#{v}" }.join("&")
|
302
333
|
end
|
303
|
-
|
334
|
+
|
304
335
|
end
|
336
|
+
|
305
337
|
end
|
metadata
CHANGED
@@ -1,71 +1,59 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: KeyholeIO
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.2'
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 1
|
10
|
-
version: 0.1.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Kishyr Ramdial
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
12
|
+
date: 2011-10-15 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: json
|
16
|
+
requirement: &70094479862500 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70094479862500
|
25
|
+
description: Keyhole.IO, the database-as-a-service that's so iosome, is a real-time,
|
26
|
+
streaming, key-value pair, object-friendly datastore. For you and your apps. This
|
27
|
+
is its official Ruby gem.
|
28
|
+
email: kishyr@immedia.co.za
|
24
29
|
executables: []
|
25
|
-
|
26
30
|
extensions: []
|
27
|
-
|
28
31
|
extra_rdoc_files: []
|
29
|
-
|
30
|
-
files:
|
31
|
-
- .gitignore
|
32
|
-
- Gemfile
|
33
|
-
- Rakefile
|
34
|
-
- keyholeio.gemspec
|
32
|
+
files:
|
35
33
|
- lib/keyholeio.rb
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
homepage: http://keyhole.io/developer
|
35
|
+
licenses:
|
36
|
+
- MIT
|
40
37
|
post_install_message:
|
41
38
|
rdoc_options: []
|
42
|
-
|
43
|
-
require_paths:
|
39
|
+
require_paths:
|
44
40
|
- lib
|
45
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
42
|
none: false
|
47
|
-
requirements:
|
48
|
-
- -
|
49
|
-
- !ruby/object:Gem::Version
|
50
|
-
|
51
|
-
|
52
|
-
- 0
|
53
|
-
version: "0"
|
54
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.9.0
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
48
|
none: false
|
56
|
-
requirements:
|
57
|
-
- -
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
|
60
|
-
segments:
|
61
|
-
- 0
|
62
|
-
version: "0"
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
63
53
|
requirements: []
|
64
|
-
|
65
54
|
rubyforge_project:
|
66
|
-
rubygems_version: 1.8.
|
55
|
+
rubygems_version: 1.8.6
|
67
56
|
signing_key:
|
68
57
|
specification_version: 3
|
69
|
-
summary:
|
58
|
+
summary: The Official Keyhole.IO Ruby Gem
|
70
59
|
test_files: []
|
71
|
-
|
data/.gitignore
DELETED
data/Gemfile
DELETED
data/Rakefile
DELETED
data/keyholeio.gemspec
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
$:.push File.expand_path("../lib", __FILE__)
|
3
|
-
require "keyholeio/version"
|
4
|
-
|
5
|
-
Gem::Specification.new do |s|
|
6
|
-
s.name = "KeyholeIO"
|
7
|
-
s.version = Keyholeio::VERSION
|
8
|
-
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = ["Kishyr Ramdial"]
|
10
|
-
s.email = ["kishyr@immedia.co.za"]
|
11
|
-
s.homepage = "http://keyhole.io/"
|
12
|
-
s.summary = %q{Ruby library for Keyhole.IO's key-value pair database-as-a-service}
|
13
|
-
s.description = %q{Connect and utilise Keyhole.IO's key-value pair database using this simple library.}
|
14
|
-
|
15
|
-
#s.rubyforge_project = "keyholeio"
|
16
|
-
|
17
|
-
s.files = `git ls-files`.split("\n")
|
18
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
-
s.require_paths = ["lib"]
|
21
|
-
end
|
data/lib/keyholeio/version.rb
DELETED