kooaba 0.0.1

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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in kooaba.gemspec
4
+ gemspec
@@ -0,0 +1,75 @@
1
+ # kooaba
2
+
3
+ This gem is currently in Beta phase. We advise you not to use this in a production system!
4
+
5
+ This is a lightweight gem (no other dependencies) for accessing the [kooaba APIs](http://kooaba.github.com).
6
+
7
+ ## Installation
8
+
9
+ 1. Make sure you have an account on the kooaba platform at [https://platform.kooaba.com/](https://platform.kooaba.com). In the API Access section you will find your API keys for uploading items and making queries.
10
+
11
+
12
+ 2. Install the kooaba gem:
13
+
14
+
15
+ gem install kooaba
16
+
17
+
18
+ ## Uploading an item
19
+
20
+ In order to upload items into your account, you need an UPLOAD\_KEY and a BUCKET\_ID. Both of these you can find in your account at https://platform.kooaba.com .
21
+
22
+ require 'rubygems'
23
+ require 'kooaba'
24
+
25
+ # set the upload key
26
+ Kooaba.upload_key = <UPLOAD_KEY>
27
+
28
+ # initialize the item
29
+ item = Kooaba::Item.new(
30
+ :title => "A lake",
31
+ :metadata => nil,
32
+ :image_files => <PATH_TO_IMAGE_ON_LOCAL_SYSTEM>,
33
+ :referenceId => "lake"
34
+ )
35
+
36
+ # select the bucket you want to put the item into
37
+ bucket_id = <BUCKET_ID>
38
+
39
+ # upload the item
40
+ response = Kooaba.upload(item, bucket_id)
41
+
42
+ puts "Response code: #{response.code}"
43
+ puts "Response body: #{response.body}"
44
+
45
+
46
+ The reponse will look like:
47
+
48
+ Response code: 201
49
+ Response body: {"uuid":"d956a280-d678-4260-9115-d0382175ae90","enabled":true,"images":[{"sha1":"3d3d8d00cdaf3de4f346f84e83e207780a7e2afe"}]}
50
+
51
+
52
+
53
+ ## Making a query
54
+
55
+ To make a query you need a QUERY_KEY which you can find under the API Access section in your account at https://platform.kooaba.com .
56
+
57
+ require 'rubygems'
58
+ require 'kooaba'
59
+
60
+ # set the query key
61
+ Kooaba.query_key = <QUERY_KEY>
62
+
63
+ # send the query to the kooaba servers
64
+ query = Kooaba::Query.new(:image_path => <PATH_TO_QUERY_IMAGE_ON_LOCAL_SYSTEM>)
65
+ response = Kooaba.query(query)
66
+
67
+ # inspect the result
68
+ puts "Response code: #{response.code}"
69
+ puts "Response body: #{response.body}"
70
+
71
+
72
+ The response will look like this:
73
+
74
+ Response code: 200
75
+ Response body: {"query_id":"698c666aa23348a0b5ef54d9bc2d7ca3","results":[{"item_uuid":"4b641fc5-2c50-44b5-b529-c9e4092ec47f","bucket_uuid":"108695a2-7825-4a98-8bda-b980782c5e33","service_id":"object_retrieval","score":3.301587,"recognitions":[{"score":3.301587,"id":"image.sha1:dd96b28d55db1492c8dd9709ba480efd287fa122","reference_projection":[{"x":6.596069,"y":2.501495},{"x":-4.0,"y":1153.0},{"x":1851.0,"y":1160.0},{"x":1834.0,"y":3.0}],"bounding_box":[{"x":427.0,"y":28.0},{"x":427.0,"y":1090.0},{"x":1644.0,"y":1090.0},{"x":1644.0,"y":28.0}]}],"title":"A lake"},{"item_uuid":"b9914fad-5064-437d-b84b-71c9d69fd248","bucket_uuid":"108695a2-7825-4a98-8bda-b980782c5e33","service_id":"object_retrieval","score":3.301587,"recognitions":[{"score":3.301587,"id":"image.sha1:dd96b28d55db1492c8dd9709ba480efd287fa122","reference_projection":[{"x":6.596069,"y":2.501495},{"x":-4.0,"y":1153.0},{"x":1851.0,"y":1160.0},{"x":1834.0,"y":3.0}],"bounding_box":[{"x":427.0,"y":28.0},{"x":427.0,"y":1090.0},{"x":1644.0,"y":1090.0},{"x":1644.0,"y":28.0}]}],"title":"A lake"}]}
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,12 @@
1
+ require File.join(File.dirname(__FILE__), "..", "lib", "kooaba.rb")
2
+
3
+ # set the query key
4
+ Kooaba.query_key = <QUERY_KEY>
5
+
6
+ # send the query to the kooaba servers
7
+ query = Kooaba::Query.new(:image_path => <PATH_TO_IMAGE>)
8
+ response = Kooaba.query(query)
9
+
10
+ # inspect the result
11
+ puts "Response code: #{response.code}"
12
+ puts "Response body: #{response.body}"
@@ -0,0 +1,21 @@
1
+ require File.join(File.dirname(__FILE__), "..", "lib", "kooaba.rb")
2
+
3
+ # set the upload key
4
+ Kooaba.upload_key = <UPLOAD_KEY>
5
+
6
+ # initialize the item
7
+ item = Kooaba::Item.new(
8
+ :title => "A lake",
9
+ :metadata => nil,
10
+ :image_files => <PATH_TO_IMAGE>,
11
+ :referenceId => "lake"
12
+ )
13
+
14
+ # select the bucket you want to put the item into
15
+ bucket_id = <BUCKET_ID>
16
+
17
+ # upload the item
18
+ response = Kooaba.upload(item, bucket_id)
19
+
20
+ puts "Response code: #{response.code}"
21
+ puts "Response body: #{response.body}"
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "kooaba/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "kooaba"
7
+ s.version = Kooaba::VERSION
8
+ s.authors = ["Cristi Prodan"]
9
+ s.email = ["prodan@kooaba.com"]
10
+ s.homepage = "https://github.com/kooaba/kooaba-ruby"
11
+ s.summary = %q{A gem for accessing the kooaba APIs}
12
+ s.description = %q{A lightweight gem for accessing the kooaba APIs. For more information on the APIs check out http://kooaba.github.com}
13
+
14
+ s.rubyforge_project = "kooaba"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ # s.add_runtime_dependency "rest-client"
24
+ end
@@ -0,0 +1 @@
1
+ Dir[File.join(File.dirname(__FILE__), '/kooaba/*.rb')].each {|file| require file }
@@ -0,0 +1,28 @@
1
+ module Kooaba
2
+ QUERY_URL = "https://query-api.kooaba.com/v4/"
3
+ UPLOAD_URL = "https://upload-api.kooaba.com/api/v4/"
4
+
5
+ def self.upload_key=(upload_key)
6
+ @@upload_key = upload_key
7
+ end
8
+
9
+ def self.query_key=(query_key)
10
+ @@query_key = query_key
11
+ end
12
+
13
+ def self.upload_key
14
+ @@upload_key
15
+ end
16
+
17
+ def self.query_key
18
+ @@query_key
19
+ end
20
+
21
+ def self.upload(item, bucket_id)
22
+ UploadRequest.new(item, bucket_id).start
23
+ end
24
+
25
+ def self.query(image_path)
26
+ QueryRequest.new(image_path).start
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ module Kooaba
2
+
3
+ class Item
4
+ attr_accessor :title
5
+ attr_accessor :metadata
6
+ attr_accessor :enabled
7
+ attr_accessor :reference_id
8
+ attr_accessor :image_files
9
+
10
+ def initialize(options = {})
11
+ @title = options[:title]
12
+ @metadata = options[:metadata]
13
+ @enabled = options[:enabled] || true
14
+ @reference_id = options[:reference_id]
15
+ @image_files = options[:image_files] || []
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,75 @@
1
+ #
2
+ # Class implementing the MIME multipart message format (currently only containing the "Form Data" subtype)
3
+ #
4
+ # Created 2008-10-30 by Joachim Fornallaz <fornallaz@kooaba.com>
5
+ #
6
+
7
+ module Kooaba
8
+ module TypedFile
9
+ attr_accessor :content_type
10
+ end
11
+
12
+ class MultipartMessage
13
+
14
+ def initialize
15
+ @file_parts = []
16
+ @text_parts = []
17
+ end
18
+
19
+ def add_file_part(name, file, type)
20
+ case file
21
+ when String
22
+ io = open(file)
23
+ else
24
+ io = file
25
+ end
26
+
27
+ unless io.respond_to?(:content_type)
28
+ io.extend(TypedFile)
29
+ content_type = (type == "image/jpeg") ? "image/jpg" : type
30
+ io.content_type = content_type
31
+ end
32
+
33
+ @file_parts << [name, io]
34
+ end
35
+
36
+ def add_text_part(name, text)
37
+ @text_parts << [name, text]
38
+ end
39
+
40
+ def content_type
41
+ "multipart/form-data; boundary=#{boundary_token}"
42
+ end
43
+
44
+ def body
45
+ boundary_marker = "--#{boundary_token}\r\n"
46
+ body = @text_parts.map { |param|
47
+ (name, value) = param
48
+ boundary_marker + text_to_multipart(name, value)
49
+ }.join('') + @file_parts.map { |param|
50
+ (name, value) = param
51
+ boundary_marker + data_to_multipart(name, value)
52
+ }.join('') + "--#{boundary_token}--\r\n"
53
+ end
54
+
55
+ protected
56
+
57
+ def boundary_token
58
+ @boundary_token ||= [Array.new(8) {rand(256)}].join
59
+ end
60
+
61
+ def data_to_multipart(key, data)
62
+ filename = data.respond_to?(:original_filename) ? data.original_filename : File.basename(data.path)
63
+ mime_type = data.content_type
64
+ part = "Content-Disposition: form-data; name=\"#{key}\"; filename=\"#{filename}\"\r\n"
65
+ part += "Content-Transfer-Encoding: binary\r\n"
66
+ part += "Content-Type: #{mime_type}\r\n\r\n#{data.read}\r\n"
67
+ data.rewind
68
+ part
69
+ end
70
+
71
+ def text_to_multipart(key,value)
72
+ "Content-Disposition: form-data; name=\"#{key}\"\r\n\r\n#{value}\r\n"
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,15 @@
1
+ module Kooaba
2
+
3
+ class Query
4
+ attr_accessor :image_path
5
+ attr_accessor :max_results
6
+ attr_accessor :user_data
7
+
8
+ def initialize(options = {})
9
+ @image_path = options[:image_path]
10
+ @max_results = options[:max_results]
11
+ @user_data = options[:user_data]
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,41 @@
1
+ require 'rubygems'
2
+ require 'uri'
3
+ require 'net/http'
4
+ require 'net/https'
5
+ require 'time'
6
+
7
+ module Kooaba
8
+
9
+ class QueryRequest
10
+
11
+ def initialize(query)
12
+ @message = MultipartMessage.new
13
+ content_type = `file --mime-type -b #{query.image_path}`.chop
14
+ @message.add_file_part('image', query.image_path, content_type)
15
+ @message.add_text_part('max_results', query.max_results) if query.max_results
16
+ @message.add_text_part('user_data', query.user_data) if query.user_data
17
+ end
18
+
19
+ #
20
+ # Returns the http response from the Kooaba servers.
21
+ #
22
+ def start
23
+ url = URI.parse(Kooaba::QUERY_URL + "query")
24
+
25
+ http = Net::HTTP.new(url.host, url.port)
26
+ http.use_ssl = true
27
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
28
+
29
+ req = Net::HTTP::Post.new(url.path)
30
+
31
+ req.body = @message.body
32
+ req['date'] = Time.new.httpdate
33
+ req['content-type'] = @message.content_type
34
+ req['authorization'] = "Token #{Kooaba.query_key}"
35
+
36
+ http.start { |h| h.request(req) }
37
+ end
38
+
39
+ end
40
+
41
+ end
@@ -0,0 +1,49 @@
1
+ require 'rubygems'
2
+ require 'uri'
3
+ require 'net/http'
4
+ require 'net/https'
5
+ require 'time'
6
+
7
+ module Kooaba
8
+
9
+ class UploadRequest
10
+
11
+ attr_accessor :message
12
+ attr_accessor :bucket_id
13
+
14
+ def initialize(item, bucket_id)
15
+ @bucket_id = bucket_id
16
+ @message = MultipartMessage.new
17
+ item.image_files.each do |image_path|
18
+ content_type = `file --mime-type -b #{image_path}`
19
+ @message.add_file_part('images', image_path, content_type)
20
+ end
21
+ @message.add_text_part('referenceId', item.reference_id) if item.reference_id
22
+ @message.add_text_part('title', item.title) if item.title
23
+ @message.add_text_part('enabled', item.enabled)
24
+ @message.add_text_part('metadata', item.metadata) if item.metadata
25
+ end
26
+
27
+ #
28
+ # Returns the http response from the Kooaba servers.
29
+ #
30
+ def start
31
+ url = URI.parse(Kooaba::UPLOAD_URL + "buckets/" + bucket_id + "/items")
32
+
33
+ http = Net::HTTP.new(url.host, url.port)
34
+ http.use_ssl = true
35
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
36
+
37
+ req = Net::HTTP::Post.new(url.path)
38
+
39
+ req.body = @message.body
40
+ req['date'] = Time.new.httpdate
41
+ req['content-type'] = @message.content_type
42
+ req['authorization'] = "Token #{Kooaba.upload_key}"
43
+
44
+ http.start { |h| h.request(req) }
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,3 @@
1
+ module Kooaba
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kooaba
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Cristi Prodan
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-12-18 00:00:00 Z
19
+ dependencies: []
20
+
21
+ description: A lightweight gem for accessing the kooaba APIs. For more information on the APIs check out http://kooaba.github.com
22
+ email:
23
+ - prodan@kooaba.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - .gitignore
32
+ - Gemfile
33
+ - README.md
34
+ - Rakefile
35
+ - examples/query.rb
36
+ - examples/upload.rb
37
+ - kooaba.gemspec
38
+ - lib/kooaba.rb
39
+ - lib/kooaba/base.rb
40
+ - lib/kooaba/item.rb
41
+ - lib/kooaba/multipart_message.rb
42
+ - lib/kooaba/query.rb
43
+ - lib/kooaba/query_request.rb
44
+ - lib/kooaba/upload_request.rb
45
+ - lib/kooaba/version.rb
46
+ homepage: https://github.com/kooaba/kooaba-ruby
47
+ licenses: []
48
+
49
+ post_install_message:
50
+ rdoc_options: []
51
+
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ hash: 3
69
+ segments:
70
+ - 0
71
+ version: "0"
72
+ requirements: []
73
+
74
+ rubyforge_project: kooaba
75
+ rubygems_version: 1.8.15
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: A gem for accessing the kooaba APIs
79
+ test_files: []
80
+