predictionio 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/predictionio/async_response.rb +1 -3
- data/lib/predictionio/client.rb +97 -96
- data/lib/predictionio/connection.rb +1 -1
- metadata +9 -15
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4ff41097d6e2912ea649a62771deb609c9a3f025
|
4
|
+
data.tar.gz: 51a35d920b0918024faa2b51fbd4ed191582afba
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 60eb1cabaf2fea7df32447b602af24545731130e664b7584e7a5b2cdb90ba4278b55ab1051adf66d5ae872b992107a6a35f414c82c09f0fa99c40f8e6777a12c
|
7
|
+
data.tar.gz: 6753cb134986efe6f0d0dd05235efe5639f948f47896fdd6e555d65c490408da67bb2f184a832dd3b81054edbf80a5e8c7b327d0f0b33ef446b67ba20e52f217
|
@@ -11,9 +11,7 @@ module PredictionIO
|
|
11
11
|
def initialize(request, response = nil)
|
12
12
|
@request = request
|
13
13
|
@response = Queue.new
|
14
|
-
if response
|
15
|
-
set(response)
|
16
|
-
end
|
14
|
+
set(response) if response
|
17
15
|
end
|
18
16
|
|
19
17
|
# Save a Net::HTTPResponse instance to the current instance.
|
data/lib/predictionio/client.rb
CHANGED
@@ -45,7 +45,7 @@ module PredictionIO
|
|
45
45
|
#
|
46
46
|
# == Installation
|
47
47
|
# The easiest way is to use RubyGems:
|
48
|
-
# gem install predictionio
|
48
|
+
# gem install predictionio
|
49
49
|
#
|
50
50
|
# == Synopsis
|
51
51
|
# The recommended usage of the SDK is to fire asynchronous requests as early as you can in your code,
|
@@ -53,7 +53,7 @@ module PredictionIO
|
|
53
53
|
#
|
54
54
|
# === Instantiate PredictionIO Client
|
55
55
|
# # Include the PredictionIO SDK
|
56
|
-
# require "
|
56
|
+
# require "predictionio"
|
57
57
|
#
|
58
58
|
# client = PredictionIO::Client.new(<appkey>)
|
59
59
|
#
|
@@ -124,9 +124,6 @@ module PredictionIO
|
|
124
124
|
# Appkey can be changed on-the-fly after creation of the client.
|
125
125
|
attr_accessor :appkey
|
126
126
|
|
127
|
-
# API version can be changed on-the-fly after creation of the client.
|
128
|
-
attr_accessor :apiversion
|
129
|
-
|
130
127
|
# Only JSON is currently supported as API response format.
|
131
128
|
attr_accessor :apiformat
|
132
129
|
|
@@ -164,11 +161,10 @@ module PredictionIO
|
|
164
161
|
# - API entry point at http://localhost:8000
|
165
162
|
# - API return data format of json
|
166
163
|
# - 10 concurrent HTTP(S) connections
|
167
|
-
def initialize(appkey, threads = 10, apiurl = "http://localhost:8000",
|
164
|
+
def initialize(appkey, threads = 10, apiurl = "http://localhost:8000", thread_timeout = 60)
|
168
165
|
@appkey = appkey
|
169
|
-
@apiversion = apiversion
|
170
166
|
@apiformat = "json"
|
171
|
-
@http = PredictionIO::Connection.new(URI(apiurl), threads)
|
167
|
+
@http = PredictionIO::Connection.new(URI(apiurl), threads, thread_timeout)
|
172
168
|
end
|
173
169
|
|
174
170
|
# Returns the number of pending requests within the current client.
|
@@ -196,11 +192,11 @@ module PredictionIO
|
|
196
192
|
rparams = params
|
197
193
|
rparams["pio_appkey"] = @appkey
|
198
194
|
rparams["pio_uid"] = uid
|
199
|
-
if params["pio_latitude"]
|
195
|
+
if params["pio_latitude"] && params["pio_longitude"]
|
200
196
|
rparams["pio_latlng"] = "#{params["pio_latitude"]},#{params["pio_longitude"]}"
|
201
197
|
end
|
202
198
|
|
203
|
-
@http.apost(PredictionIO::AsyncRequest.new(
|
199
|
+
@http.apost(PredictionIO::AsyncRequest.new("/users.#{@apiformat}", rparams))
|
204
200
|
end
|
205
201
|
|
206
202
|
# :category: Synchronous Methods
|
@@ -213,13 +209,13 @@ module PredictionIO
|
|
213
209
|
# create_user(async_response)
|
214
210
|
def create_user(*args)
|
215
211
|
uid_or_res = args[0]
|
216
|
-
if uid_or_res.is_a?(PredictionIO::AsyncResponse)
|
212
|
+
if uid_or_res.is_a?(PredictionIO::AsyncResponse)
|
217
213
|
response = uid_or_res.get
|
218
214
|
else
|
219
215
|
uid = uid_or_res
|
220
216
|
response = acreate_user(*args).get
|
221
217
|
end
|
222
|
-
unless response.is_a?(Net::HTTPCreated)
|
218
|
+
unless response.is_a?(Net::HTTPCreated)
|
223
219
|
begin
|
224
220
|
msg = response.body
|
225
221
|
rescue Exception
|
@@ -240,7 +236,7 @@ module PredictionIO
|
|
240
236
|
#
|
241
237
|
# See also #get_user.
|
242
238
|
def aget_user(uid)
|
243
|
-
@http.aget(PredictionIO::AsyncRequest.new(
|
239
|
+
@http.aget(PredictionIO::AsyncRequest.new("/users/#{uid}.#{@apiformat}",
|
244
240
|
"pio_appkey" => @appkey,
|
245
241
|
"pio_uid" => uid))
|
246
242
|
end
|
@@ -258,14 +254,14 @@ module PredictionIO
|
|
258
254
|
# get_user(uid)
|
259
255
|
# get_user(async_response)
|
260
256
|
def get_user(uid_or_res)
|
261
|
-
if uid_or_res.is_a?(PredictionIO::AsyncResponse)
|
257
|
+
if uid_or_res.is_a?(PredictionIO::AsyncResponse)
|
262
258
|
response = uid_or_res.get
|
263
259
|
else
|
264
260
|
response = aget_user(uid_or_res).get
|
265
261
|
end
|
266
|
-
if response.is_a?(Net::HTTPOK)
|
262
|
+
if response.is_a?(Net::HTTPOK)
|
267
263
|
res = JSON.parse(response.body)
|
268
|
-
if res["pio_latlng"]
|
264
|
+
if res["pio_latlng"]
|
269
265
|
latlng = res["pio_latlng"]
|
270
266
|
res["pio_latitude"] = latlng[0]
|
271
267
|
res["pio_longitude"] = latlng[1]
|
@@ -288,7 +284,7 @@ module PredictionIO
|
|
288
284
|
#
|
289
285
|
# See also #delete_user.
|
290
286
|
def adelete_user(uid)
|
291
|
-
@http.adelete(PredictionIO::AsyncRequest.new(
|
287
|
+
@http.adelete(PredictionIO::AsyncRequest.new("/users/#{uid}.#{@apiformat}",
|
292
288
|
"pio_appkey" => @appkey,
|
293
289
|
"pio_uid" => uid))
|
294
290
|
end
|
@@ -302,12 +298,12 @@ module PredictionIO
|
|
302
298
|
# delete_user(uid)
|
303
299
|
# delete_user(async_response)
|
304
300
|
def delete_user(uid_or_res)
|
305
|
-
if uid_or_res.is_a?(PredictionIO::AsyncResponse)
|
301
|
+
if uid_or_res.is_a?(PredictionIO::AsyncResponse)
|
306
302
|
response = uid_or_res.get
|
307
303
|
else
|
308
304
|
response = adelete_user(uid_or_res).get
|
309
305
|
end
|
310
|
-
unless response.is_a?(Net::HTTPOK)
|
306
|
+
unless response.is_a?(Net::HTTPOK)
|
311
307
|
begin
|
312
308
|
msg = response.body
|
313
309
|
rescue Exception
|
@@ -332,17 +328,13 @@ module PredictionIO
|
|
332
328
|
rescue Exception
|
333
329
|
rparams["pio_itypes"] = itypes
|
334
330
|
end
|
335
|
-
if params["pio_latitude"]
|
331
|
+
if params["pio_latitude"] && params["pio_longitude"]
|
336
332
|
rparams["pio_latlng"] = "#{params["pio_latitude"]},#{params["pio_longitude"]}"
|
337
333
|
end
|
338
|
-
|
339
|
-
|
340
|
-
end
|
341
|
-
if params["pio_endT"] != nil then
|
342
|
-
rparams["pio_endT"] = ((params["pio_endT"].to_r) * 1000).round(0).to_s
|
343
|
-
end
|
334
|
+
rparams["pio_startT"] = ((params["pio_startT"].to_r) * 1000).round(0).to_s if params["pio_startT"]
|
335
|
+
rparams["pio_endT"] = ((params["pio_endT"].to_r) * 1000).round(0).to_s if params["pio_endT"]
|
344
336
|
|
345
|
-
@http.apost(PredictionIO::AsyncRequest.new(
|
337
|
+
@http.apost(PredictionIO::AsyncRequest.new("/items.#{@apiformat}", rparams))
|
346
338
|
end
|
347
339
|
|
348
340
|
# :category: Synchronous Methods
|
@@ -355,12 +347,12 @@ module PredictionIO
|
|
355
347
|
# create_item(async_response)
|
356
348
|
def create_item(*args)
|
357
349
|
iid_or_res = args[0]
|
358
|
-
if iid_or_res.is_a?(PredictionIO::AsyncResponse)
|
350
|
+
if iid_or_res.is_a?(PredictionIO::AsyncResponse)
|
359
351
|
response = iid_or_res.get
|
360
352
|
else
|
361
353
|
response = acreate_item(*args).get
|
362
354
|
end
|
363
|
-
unless response.is_a?(Net::HTTPCreated)
|
355
|
+
unless response.is_a?(Net::HTTPCreated)
|
364
356
|
begin
|
365
357
|
msg = response.body
|
366
358
|
rescue Exception
|
@@ -381,7 +373,7 @@ module PredictionIO
|
|
381
373
|
#
|
382
374
|
# See also #get_item.
|
383
375
|
def aget_item(iid)
|
384
|
-
@http.aget(PredictionIO::AsyncRequest.new(
|
376
|
+
@http.aget(PredictionIO::AsyncRequest.new("/items/#{iid}.#{@apiformat}",
|
385
377
|
"pio_appkey" => @appkey,
|
386
378
|
"pio_iid" => iid))
|
387
379
|
end
|
@@ -399,23 +391,23 @@ module PredictionIO
|
|
399
391
|
# get_item(iid)
|
400
392
|
# get_item(async_response)
|
401
393
|
def get_item(iid_or_res)
|
402
|
-
if iid_or_res.is_a?(PredictionIO::AsyncResponse)
|
394
|
+
if iid_or_res.is_a?(PredictionIO::AsyncResponse)
|
403
395
|
response = iid_or_res.get
|
404
396
|
else
|
405
397
|
response = aget_item(iid_or_res).get
|
406
398
|
end
|
407
|
-
if response.is_a?(Net::HTTPOK)
|
399
|
+
if response.is_a?(Net::HTTPOK)
|
408
400
|
res = JSON.parse(response.body)
|
409
|
-
if res["pio_latlng"]
|
401
|
+
if res["pio_latlng"]
|
410
402
|
latlng = res["pio_latlng"]
|
411
403
|
res["pio_latitude"] = latlng[0]
|
412
404
|
res["pio_longitude"] = latlng[1]
|
413
405
|
end
|
414
|
-
if res["pio_startT"]
|
406
|
+
if res["pio_startT"]
|
415
407
|
startT = Rational(res["pio_startT"], 1000)
|
416
408
|
res["pio_startT"] = Time.at(startT)
|
417
409
|
end
|
418
|
-
if res["pio_endT"]
|
410
|
+
if res["pio_endT"]
|
419
411
|
endT = Rational(res["pio_endT"], 1000)
|
420
412
|
res["pio_endT"] = Time.at(endT)
|
421
413
|
end
|
@@ -437,7 +429,7 @@ module PredictionIO
|
|
437
429
|
#
|
438
430
|
# See also #delete_item.
|
439
431
|
def adelete_item(iid)
|
440
|
-
@http.adelete(PredictionIO::AsyncRequest.new(
|
432
|
+
@http.adelete(PredictionIO::AsyncRequest.new("/items/#{iid}.#{@apiformat}",
|
441
433
|
"pio_appkey" => @appkey,
|
442
434
|
"pio_iid" => iid))
|
443
435
|
end
|
@@ -451,12 +443,12 @@ module PredictionIO
|
|
451
443
|
# delete_item(iid)
|
452
444
|
# delete_item(async_response)
|
453
445
|
def delete_item(iid_or_res)
|
454
|
-
if iid_or_res.is_a?(PredictionIO::AsyncResponse)
|
446
|
+
if iid_or_res.is_a?(PredictionIO::AsyncResponse)
|
455
447
|
response = iid_or_res.get
|
456
448
|
else
|
457
449
|
response = adelete_item(iid_or_res).get
|
458
450
|
end
|
459
|
-
unless response.is_a?(Net::HTTPOK)
|
451
|
+
unless response.is_a?(Net::HTTPOK)
|
460
452
|
begin
|
461
453
|
msg = response.body
|
462
454
|
rescue Exception
|
@@ -482,23 +474,26 @@ module PredictionIO
|
|
482
474
|
rparams["pio_appkey"] = @appkey
|
483
475
|
rparams["pio_uid"] = @apiuid
|
484
476
|
rparams["pio_n"] = n
|
485
|
-
if params["pio_itypes"]
|
486
|
-
|
487
|
-
params["pio_itypes"].
|
488
|
-
|
489
|
-
|
490
|
-
|
477
|
+
if params["pio_itypes"]
|
478
|
+
if params["pio_itypes"].kind_of?(Array) && params["pio_itypes"].any?
|
479
|
+
rparams["pio_itypes"] = params["pio_itypes"].join(",")
|
480
|
+
else
|
481
|
+
rparams["pio_itypes"] = params["pio_itypes"]
|
482
|
+
end
|
491
483
|
end
|
492
|
-
if params["pio_latitude"]
|
484
|
+
if params["pio_latitude"] && params["pio_longitude"]
|
493
485
|
rparams["pio_latlng"] = "#{params["pio_latitude"]},#{params["pio_longitude"]}"
|
494
486
|
end
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
487
|
+
rparams["pio_within"] = params["pio_within"] if params["pio_within"]
|
488
|
+
rparams["pio_unit"] = params["pio_unit"] if params["pio_unit"]
|
489
|
+
if params["pio_attributes"]
|
490
|
+
if params["pio_attributes"].kind_of?(Array) && params["pio_attributes"].any?
|
491
|
+
rparams["pio_attributes"] = params["pio_attributes"].join(",")
|
492
|
+
else
|
493
|
+
rparams["pio_attributes"] = params["pio_attributes"]
|
494
|
+
end
|
500
495
|
end
|
501
|
-
@http.aget(PredictionIO::AsyncRequest.new(
|
496
|
+
@http.aget(PredictionIO::AsyncRequest.new("/engines/itemrec/#{engine}/topn.#{@apiformat}", rparams))
|
502
497
|
end
|
503
498
|
|
504
499
|
# :category: Synchronous Methods
|
@@ -511,14 +506,21 @@ module PredictionIO
|
|
511
506
|
# aget_itemrec_top_n(async_response)
|
512
507
|
def get_itemrec_top_n(*args)
|
513
508
|
uid_or_res = args[0]
|
514
|
-
if uid_or_res.is_a?(PredictionIO::AsyncResponse)
|
515
|
-
response = uid_or_res
|
509
|
+
if uid_or_res.is_a?(PredictionIO::AsyncResponse)
|
510
|
+
response = uid_or_res
|
516
511
|
else
|
517
|
-
response = aget_itemrec_top_n(*args)
|
518
|
-
end
|
519
|
-
|
520
|
-
|
521
|
-
res
|
512
|
+
response = aget_itemrec_top_n(*args)
|
513
|
+
end
|
514
|
+
http_response = response.get
|
515
|
+
if http_response.is_a?(Net::HTTPOK)
|
516
|
+
res = JSON.parse(http_response.body)
|
517
|
+
if response.request.params.has_key?('pio_attributes')
|
518
|
+
attributes = response.request.params['pio_attributes'].split(',')
|
519
|
+
list_of_attribute_values = attributes.map { |attrib| res[attrib] }
|
520
|
+
res["pio_iids"].zip(*list_of_attribute_values).map { |v| Hash[(['pio_iid'] + attributes).zip(v)] }
|
521
|
+
else
|
522
|
+
res["pio_iids"]
|
523
|
+
end
|
522
524
|
else
|
523
525
|
begin
|
524
526
|
msg = response.body
|
@@ -540,23 +542,26 @@ module PredictionIO
|
|
540
542
|
rparams["pio_appkey"] = @appkey
|
541
543
|
rparams["pio_iid"] = iid
|
542
544
|
rparams["pio_n"] = n
|
543
|
-
if params["pio_itypes"]
|
544
|
-
|
545
|
-
params["pio_itypes"].
|
546
|
-
|
547
|
-
|
548
|
-
|
545
|
+
if params["pio_itypes"]
|
546
|
+
if params["pio_itypes"].kind_of?(Array) && params["pio_itypes"].any?
|
547
|
+
rparams["pio_itypes"] = params["pio_itypes"].join(",")
|
548
|
+
else
|
549
|
+
rparams["pio_itypes"] = params["pio_itypes"]
|
550
|
+
end
|
549
551
|
end
|
550
|
-
if params["pio_latitude"]
|
552
|
+
if params["pio_latitude"] && params["pio_longitude"]
|
551
553
|
rparams["pio_latlng"] = "#{params["pio_latitude"]},#{params["pio_longitude"]}"
|
552
554
|
end
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
555
|
+
rparams["pio_within"] = params["pio_within"] if params["pio_within"]
|
556
|
+
rparams["pio_unit"] = params["pio_unit"] if params["pio_unit"]
|
557
|
+
if params["pio_attributes"]
|
558
|
+
if params["pio_attributes"].kind_of?(Array) && params["pio_attributes"].any?
|
559
|
+
rparams["pio_attributes"] = params["pio_attributes"].join(",")
|
560
|
+
else
|
561
|
+
rparams["pio_attributes"] = params["pio_attributes"]
|
562
|
+
end
|
558
563
|
end
|
559
|
-
@http.aget(PredictionIO::AsyncRequest.new(
|
564
|
+
@http.aget(PredictionIO::AsyncRequest.new("/engines/itemsim/#{engine}/topn.#{@apiformat}", rparams))
|
560
565
|
end
|
561
566
|
|
562
567
|
# :category: Synchronous Methods
|
@@ -568,15 +573,22 @@ module PredictionIO
|
|
568
573
|
# aget_itemsim_top_n(engine, iid, n, params = {})
|
569
574
|
# aget_itemsim_top_n(async_response)
|
570
575
|
def get_itemsim_top_n(*args)
|
571
|
-
|
572
|
-
if
|
573
|
-
response =
|
576
|
+
uid_or_res = args[0]
|
577
|
+
if uid_or_res.is_a?(PredictionIO::AsyncResponse)
|
578
|
+
response = uid_or_res
|
574
579
|
else
|
575
|
-
response = aget_itemsim_top_n(*args)
|
576
|
-
end
|
577
|
-
|
578
|
-
|
579
|
-
res
|
580
|
+
response = aget_itemsim_top_n(*args)
|
581
|
+
end
|
582
|
+
http_response = response.get
|
583
|
+
if http_response.is_a?(Net::HTTPOK)
|
584
|
+
res = JSON.parse(http_response.body)
|
585
|
+
if response.request.params.has_key?('pio_attributes')
|
586
|
+
attributes = response.request.params['pio_attributes'].split(',')
|
587
|
+
list_of_attribute_values = attributes.map { |attrib| res[attrib] }
|
588
|
+
res["pio_iids"].zip(*list_of_attribute_values).map { |v| Hash[(['pio_iid'] + attributes).zip(v)] }
|
589
|
+
else
|
590
|
+
res["pio_iids"]
|
591
|
+
end
|
580
592
|
else
|
581
593
|
begin
|
582
594
|
msg = response.body
|
@@ -599,13 +611,11 @@ module PredictionIO
|
|
599
611
|
rparams["pio_action"] = action
|
600
612
|
rparams["pio_uid"] = @apiuid
|
601
613
|
rparams["pio_iid"] = iid
|
602
|
-
|
603
|
-
|
604
|
-
end
|
605
|
-
if params["pio_latitude"] != nil && params["pio_longitude"] != nil then
|
614
|
+
rparams["pio_t"] = ((params["pio_t"].to_r) * 1000).round(0).to_s if params["pio_t"]
|
615
|
+
if params["pio_latitude"] && params["pio_longitude"]
|
606
616
|
rparams["pio_latlng"] = "#{params["pio_latitude"]},#{params["pio_longitude"]}"
|
607
617
|
end
|
608
|
-
@http.apost(PredictionIO::AsyncRequest.new(
|
618
|
+
@http.apost(PredictionIO::AsyncRequest.new("/actions/u2i.#{@apiformat}", rparams))
|
609
619
|
end
|
610
620
|
|
611
621
|
# :category: Synchronous Methods
|
@@ -614,16 +624,16 @@ module PredictionIO
|
|
614
624
|
# See also #arecord_action_on_item.
|
615
625
|
#
|
616
626
|
# call-seq:
|
617
|
-
# record_action_on_item(action,
|
627
|
+
# record_action_on_item(action, iid, params = {})
|
618
628
|
# record_action_on_item(async_response)
|
619
629
|
def record_action_on_item(*args)
|
620
630
|
action_or_res = args[0]
|
621
|
-
if action_or_res.is_a?(PredictionIO::AsyncResponse)
|
631
|
+
if action_or_res.is_a?(PredictionIO::AsyncResponse)
|
622
632
|
response = action_or_res.get
|
623
633
|
else
|
624
634
|
response = arecord_action_on_item(*args).get
|
625
635
|
end
|
626
|
-
unless response.is_a?(Net::HTTPCreated)
|
636
|
+
unless response.is_a?(Net::HTTPCreated)
|
627
637
|
begin
|
628
638
|
msg = response.body
|
629
639
|
rescue Exception
|
@@ -632,14 +642,5 @@ module PredictionIO
|
|
632
642
|
raise U2IActionNotCreatedError, msg
|
633
643
|
end
|
634
644
|
end
|
635
|
-
|
636
|
-
# :nodoc: all
|
637
|
-
private
|
638
|
-
|
639
|
-
def versioned_path(path)
|
640
|
-
# disabled for now
|
641
|
-
# "/#{@apiversion}#{path}"
|
642
|
-
path
|
643
|
-
end
|
644
645
|
end
|
645
646
|
end
|
@@ -14,7 +14,7 @@ module PredictionIO
|
|
14
14
|
|
15
15
|
# Spawns a number of threads with persistent HTTP connection to the specified URI.
|
16
16
|
# Sets a default timeout of 5 seconds.
|
17
|
-
def initialize(uri, threads = 1, timeout =
|
17
|
+
def initialize(uri, threads = 1, timeout = 60)
|
18
18
|
@packages = Queue.new
|
19
19
|
@counter_lock = Mutex.new
|
20
20
|
@connections = 0
|
metadata
CHANGED
@@ -1,24 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: predictionio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.7.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- The PredictionIO Team
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-04-01 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
|
-
description:
|
15
|
-
This gem
|
16
|
-
|
13
|
+
description: |
|
14
|
+
PredictionIO is a prediction server for building smart applications. This gem
|
17
15
|
provides convenient access of the PredictionIO API to Ruby programmers so that
|
18
|
-
|
19
16
|
they can focus on their application logic.
|
20
|
-
|
21
|
-
'
|
22
17
|
email: support@prediction.io
|
23
18
|
executables: []
|
24
19
|
extensions: []
|
@@ -31,26 +26,25 @@ files:
|
|
31
26
|
- lib/predictionio.rb
|
32
27
|
homepage: http://prediction.io
|
33
28
|
licenses: []
|
29
|
+
metadata: {}
|
34
30
|
post_install_message:
|
35
31
|
rdoc_options: []
|
36
32
|
require_paths:
|
37
33
|
- lib
|
38
34
|
required_ruby_version: !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
35
|
requirements:
|
41
|
-
- -
|
36
|
+
- - '>='
|
42
37
|
- !ruby/object:Gem::Version
|
43
38
|
version: '1.9'
|
44
39
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
|
-
none: false
|
46
40
|
requirements:
|
47
|
-
- -
|
41
|
+
- - '>='
|
48
42
|
- !ruby/object:Gem::Version
|
49
43
|
version: '0'
|
50
44
|
requirements: []
|
51
45
|
rubyforge_project:
|
52
|
-
rubygems_version:
|
46
|
+
rubygems_version: 2.0.3
|
53
47
|
signing_key:
|
54
|
-
specification_version:
|
48
|
+
specification_version: 4
|
55
49
|
summary: PredictionIO Ruby SDK
|
56
50
|
test_files: []
|