mushikago-sdk 0.1.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.
@@ -0,0 +1,18 @@
1
+ module Mushikago
2
+ module Auth
3
+ module Signature
4
+ def string_to_sign
5
+ [
6
+ http_method,
7
+ host,
8
+ path,
9
+ url_encoded_params,
10
+ ].join("\n")
11
+ end
12
+
13
+ def add_signature! signer
14
+ set_param('signature', signer.sign(string_to_sign))
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ require 'base64'
2
+ require 'openssl'
3
+
4
+ module Mushikago
5
+ module Auth
6
+ class Signer
7
+ attr_reader :secret_key
8
+ def initialize secret_key
9
+ @secret_key = secret_key
10
+ end
11
+
12
+ def sign(string_to_sign, digest_method='sha256')
13
+ Base64.encode64(
14
+ OpenSSL::HMAC.digest(
15
+ OpenSSL::Digest::Digest.new(digest_method),
16
+ secret_key,
17
+ string_to_sign
18
+ )
19
+ ).strip
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,7 @@
1
+ module Mushikago
2
+ module Auth
3
+ autoload :Signature, 'mushikago/auth/signature'
4
+ autoload :Signer, 'mushikago/auth/signer'
5
+ end
6
+ end
7
+
@@ -0,0 +1,35 @@
1
+ require 'net/http'
2
+ require 'json'
3
+ module Mushikago
4
+ class Client
5
+ # @return [String] api_key
6
+ attr_reader :api_key
7
+
8
+ # @return [Signer] signer
9
+ attr_reader :signer
10
+
11
+ # @param [Hash] options
12
+ # @option options [String] :api_key(Configured value) APIキー
13
+ # @option options [String] :secret_key(Configured value) 秘密鍵
14
+ def initialize options={}
15
+ @api_key = (options[:api_key] || Mushikago.config.api_key).to_s
16
+ @signer = Mushikago::Auth::Signer.new((options[:secret_key] || Mushikago.config.secret_key).to_s)
17
+ end
18
+
19
+ # @param [Mushikago::Http::Request] request
20
+ # @return [Mushikago::Http::Response] response
21
+ def send_request request
22
+ # add authorization
23
+ request.set_param('api_key', api_key)
24
+ request.set_param('timestamp', Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ'))
25
+ request.add_signature!(signer)
26
+
27
+ # send request
28
+ Net::HTTP.start(request.host) do |http|
29
+ http_request = request.to_http_request
30
+ http_response = http.request(http_request)
31
+ return Mushikago::Http::Response.new(JSON.parse(http_response.body))
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,49 @@
1
+ require 'singleton'
2
+ module Mushikago
3
+ class Config
4
+ include Singleton
5
+
6
+ # @param [Hash] options optionsをロードします
7
+ # @option options [string] :api_key('環境変数:MUSHIKAGO_API_KEY') 発行されたAPIKeyを設定する
8
+ # @option options [string] :secret_key('環境変数:MUSHIKAGO_SECRET_KEY') 発行されたSecretKeyを設定する
9
+ # @option options [string] :tombo_endpoint('tombo.mushikago.org') tomboサービスのエンドポイントを設定する
10
+ # @example
11
+ # Mushikago::Config.load(:api_key => 'ABCDEFG', :secret_key => 'HIJKLMN')
12
+ def load options={}
13
+ options.each do |key, value|
14
+ supplied[key.to_sym] = value
15
+ end
16
+ end
17
+
18
+ class << self
19
+ # @param [Symbol] name オプション名
20
+ # @param [Object] default_value デフォルト値
21
+ # @param [Hash] options 型情報を補足的に追加することができる
22
+ # @param [Block] transform 渡された値を変換するブロック
23
+ def add_option name, default_value = nil, options = {}, &transform
24
+ name = name.to_sym
25
+ raise "The option #{name} is already defined!" if self.respond_to?(name)
26
+
27
+ define_method(name) do
28
+ value = supplied.has_key?(name) ? supplied[name] : default_value
29
+ transform ? transform.call(value) : value
30
+ end
31
+
32
+ alias_class_method("#{name}?", name) if options[:boolean]
33
+ end
34
+
35
+ def load options={}
36
+ instance.load options
37
+ end
38
+ end
39
+
40
+ add_option :api_key, ENV['MUSHIKAGO_API_KEY'] || ENV['MUSHIKAGO_API_KEY_ID']
41
+ add_option :secret_key, ENV['MUSHIKAGO_SECRET_KEY'] || ENV['MUSHIKAGO_SECRET_ACCESS_KEY']
42
+ add_option :tombo_endpoint, 'tombo.mushikago.org'
43
+
44
+ private
45
+ def supplied
46
+ @supplied ||= {}
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,70 @@
1
+ require 'net/http'
2
+ require 'cgi'
3
+ module Mushikago
4
+ module Http
5
+ class Request
6
+ # @return [Hash] headers
7
+ attr_reader :headers
8
+ # @return [String] http_method
9
+ attr_accessor :http_method
10
+ # @return [String] host
11
+ attr_accessor :host
12
+ # @return [String] path
13
+ attr_accessor :path
14
+ # @return [String] params
15
+ attr_reader :params
16
+
17
+ def initialize
18
+ @headers = {}
19
+ @host = ''
20
+ @path = '/'
21
+ @params = {}
22
+ @http_method = new_http_request.method
23
+ end
24
+
25
+ def set_param key, value
26
+ params[key] = value
27
+ end
28
+
29
+ def get_param key
30
+ param = params.detect{|p| p[0] == key}
31
+ param ? param[1] : nil
32
+ end
33
+
34
+ def url_encoded_params
35
+ params.sort.collect{|pp| pp.map{|p| encode p}.join('=')}.join('&')
36
+ end
37
+
38
+ def to_http_request
39
+ http_request = new_http_request
40
+ headers.each do |key, value|
41
+ http_request[key] = value
42
+ end
43
+ http_request.body = url_encoded_params if http_request.request_body_permitted?
44
+ return http_request
45
+ end
46
+
47
+ protected
48
+ def new_http_request
49
+ Net::HTTP::Get.new("#{path}?#{url_encoded_params}")
50
+ end
51
+
52
+ private
53
+ def encode s
54
+ CGI.escape(s).gsub('+', '%20')
55
+ end
56
+
57
+ class << self
58
+ def add_param name, &transform
59
+ attr_accessor name
60
+ define_method("#{name}=") do |value|
61
+ value = transform ? transform.call(value) : value
62
+ set_param(name.to_s, value)
63
+ instance_variable_set("@#{name}".to_sym, value)
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+
@@ -0,0 +1,18 @@
1
+ module Mushikago
2
+ module Http
3
+ class Response
4
+ attr_reader :meta
5
+ attr_reader :response
6
+
7
+ def initialize options={}
8
+ @meta = options[:meta] || options['meta']
9
+ @response = options[:response] || options['response']
10
+ end
11
+
12
+ def [] key
13
+ response[key]
14
+ end
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,7 @@
1
+ module Mushikago
2
+ module Http
3
+ autoload :Request, 'mushikago/http/request'
4
+ autoload :Response, 'mushikago/http/response'
5
+ end
6
+ end
7
+
@@ -0,0 +1,27 @@
1
+ module Mushikago
2
+ module Tombo
3
+ class CaptureRequest < Request
4
+ add_param :url
5
+ add_param :image_format
6
+ add_param :image_quality
7
+ add_param :thumbnail do |v| (v.to_i != 0 ? 1 : 0).to_s end
8
+ add_param :tags do |v| [v].flatten.compact.join(',') end
9
+
10
+ def initialize url, options={}
11
+ super(options)
12
+ self.url = url
13
+ self.image_format = options[:image_format] if options.has_key?(:image_format)
14
+ self.image_quality = options[:image_quality] if options.has_key?(:image_quality)
15
+ self.thumbnail = options[:thumbnail] if options.has_key?(:thumbnail)
16
+ self.tags = options[:tags] if options.has_key?(:tags)
17
+ @path = "/#{api_version}/capture.json"
18
+ @headers['Content-type'] = 'application/x-www-form-urlencoded; charset=utf-8'
19
+ end
20
+
21
+ def new_http_request
22
+ Net::HTTP::Post.new(path)
23
+ end
24
+ end
25
+ end
26
+ end
27
+
@@ -0,0 +1,23 @@
1
+ module Mushikago
2
+ module Tombo
3
+ class CapturesRequest < Request
4
+ add_param :id
5
+ add_param :limit
6
+ add_param :offset
7
+ add_param :domain
8
+ add_param :tag
9
+
10
+ def initialize options={}
11
+ super(options)
12
+ self.id = options[:id] if options.has_key?(:id)
13
+ self.limit = options[:limit] if options.has_key?(:limit)
14
+ self.offset = options[:offset] if options.has_key?(:offset)
15
+ self.domain = options[:domain] if options.has_key?(:domain)
16
+ self.tag = options[:tag] if options.has_key?(:tag)
17
+ @host = options[:endpoint] ||= Mushikago.config.tombo_endpoint
18
+ @path = "/#{api_version}/captures.json"
19
+ end
20
+ end
21
+ end
22
+ end
23
+
@@ -0,0 +1,25 @@
1
+ module Mushikago
2
+ module Tombo
3
+ class Client < Mushikago::Client
4
+ def capture url, options={}
5
+ request = CaptureRequest.new(url, options)
6
+ send_request(request)
7
+ end
8
+
9
+ def captures options={}
10
+ request = CapturesRequest.new(options)
11
+ send_request(request)
12
+ end
13
+
14
+ def delete id, options={}
15
+ request = DeleteRequest.new(id, options)
16
+ send_request(request)
17
+ end
18
+
19
+ def info options={}
20
+ request = InfoRequest.new(options)
21
+ send_request(request)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ module Mushikago
2
+ module Tombo
3
+ class DeleteRequest < Request
4
+ add_param :id
5
+
6
+ def initialize id, options={}
7
+ super(options)
8
+ self.id = id
9
+ @path = "/#{api_version}/delete.json"
10
+ end
11
+
12
+ def new_http_request
13
+ Net::HTTP::Delete.new("#{path}?#{url_encoded_params}")
14
+ end
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,10 @@
1
+ module Mushikago
2
+ module Tombo
3
+ class InfoRequest < Request
4
+ def initialize options={}
5
+ super(options)
6
+ @path = "/#{api_version}/info.json"
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ module Mushikago
2
+ module Tombo
3
+ class Request < Mushikago::Http::Request
4
+ include Mushikago::Auth::Signature
5
+
6
+ def initialize options={}
7
+ super()
8
+ @host = options[:endpoint] ||= Mushikago.config.tombo_endpoint
9
+ end
10
+
11
+ def api_version
12
+ 1
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ module Mushikago
2
+ module Tombo
3
+ autoload :Client, 'mushikago/tombo/client'
4
+ autoload :Request, 'mushikago/tombo/request'
5
+ autoload :CaptureRequest, 'mushikago/tombo/capture_request'
6
+ autoload :CapturesRequest, 'mushikago/tombo/captures_request'
7
+ autoload :DeleteRequest, 'mushikago/tombo/delete_request'
8
+ autoload :InfoRequest, 'mushikago/tombo/info_request'
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ module Mushikago
2
+ VERSION = '0.1.2'
3
+ end
@@ -0,0 +1 @@
1
+ require 'mushikago'
data/lib/mushikago.rb ADDED
@@ -0,0 +1,15 @@
1
+ module Mushikago
2
+ # class
3
+ autoload :Config, 'mushikago/configuration'
4
+ autoload :Client, 'mushikago/client'
5
+
6
+ # module
7
+ autoload :Http, 'mushikago/http'
8
+ autoload :Auth, 'mushikago/auth'
9
+ autoload :Tombo, 'mushikago/tombo'
10
+
11
+ def self.config
12
+ Config.instance
13
+ end
14
+ end
15
+
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ class TestRequest < Mushikago::Http::Request
4
+ include Mushikago::Auth::Signature
5
+ end
6
+
7
+ describe Mushikago::Auth::Signature do
8
+ before do
9
+ @request = TestRequest.new
10
+ @request.http_method = 'GET'
11
+ @request.host = 'mushikago.org'
12
+ @request.path = '/1/someapi.json'
13
+ @request.set_param('api_key', 'api_key')
14
+ @request.set_param('timestamp', '2011-09-01T00:00:00Z')
15
+ end
16
+
17
+ context 'generates string to sign' do
18
+ subject{ @request.string_to_sign }
19
+ it{ should == "GET\nmushikago.org\n/1/someapi.json\napi_key=api_key&timestamp=2011-09-01T00%3A00%3A00Z" }
20
+ end
21
+
22
+ context 'add signature' do
23
+ before do
24
+ @request.add_signature!(Mushikago::Auth::Signer.new('secret_key'))
25
+ end
26
+ subject{ @request }
27
+ it{ subject.get_param('signature').should == 'sJSFFQREYbNPd2kJK3kuAR3uSgvcbuWtxGFjan+R3w8=' }
28
+ end
29
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mushikago::Auth::Signer do
4
+ subject{ Mushikago::Auth::Signer.new('secret_key') }
5
+ it{ subject.sign('a').should == 'xkEgZ9jFgFpvfp6KFGd8tGXDZkuS0FGMAsyvyP6YglQ=' }
6
+ it{ subject.sign('b').should == 'RIPOrMecy+TXyaLH2cLiETj4B713c5UD9YVZuOMHVR8=' }
7
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ class TestRequest < Mushikago::Http::Request
4
+ include Mushikago::Auth::Signature
5
+ end
6
+
7
+
8
+ describe Mushikago::Client do
9
+ context 'construct without options' do
10
+ before :all do
11
+ @client = Mushikago::Client.new
12
+ end
13
+
14
+ subject{ @client }
15
+
16
+ it{ subject.api_key.should == Mushikago.config.api_key.to_s }
17
+ end
18
+
19
+ context 'construct with options' do
20
+ before :all do
21
+ @client = Mushikago::Client.new(
22
+ :api_key => 'mushikago api key'
23
+ )
24
+ end
25
+
26
+ subject{ @client }
27
+
28
+ it{ subject.api_key.should == 'mushikago api key' }
29
+ end
30
+
31
+ context 'send test request' do
32
+ before :all do
33
+ request = TestRequest.new
34
+ request.host = 'tombo.mushikago.org'
35
+ request.path = '/1/info.json'
36
+ client = Mushikago::Client.new
37
+ @response = client.send_request(request)
38
+ end
39
+ subject{ @response }
40
+ it{ should respond_to(:meta, :response) }
41
+ end
42
+ end
43
+
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mushikago::Config do
4
+ # Mushikago::Configはシングルトンである
5
+ context 'is singleton class' do
6
+ subject{ Mushikago::Config.instance }
7
+ it{ should == Mushikago::Config.instance }
8
+
9
+ # 直接newすることはできない
10
+ context 'and cannot call new' do
11
+ subject{ proc{ Mushikago::Config.new } }
12
+ it{ should raise_error }
13
+ end
14
+ end
15
+
16
+ # Mushikago::Configは以下のキーを持っている
17
+ context 'has keys' do
18
+ subject{ Mushikago::Config.instance }
19
+ it{ should respond_to(:api_key) }
20
+ it{ should respond_to(:secret_key) }
21
+ it{ should respond_to(:tombo_endpoint) }
22
+ end
23
+
24
+ # Mushikago::Configはデフォルトの値を持っている
25
+ context 'has default value' do
26
+ subject{ Mushikago::Config.instance }
27
+ it{ subject.api_key.should == (ENV['MUSHIKAGO_API_KEY'] || ENV['MUSHIKAGO_API_KEY_ID']) }
28
+ it{ subject.secret_key.should == (ENV['MUSHIKAGO_SECRET_KEY'] || ENV['MUSHIKAGO_SECRET_ACCESS_KEY']) }
29
+ it{ subject.tombo_endpoint.should == 'tombo.mushikago.org' }
30
+ end
31
+
32
+ # Mushikago::Configは値をロードすることができる
33
+ context 'loads option value' do
34
+ before :all do
35
+ Mushikago::Config.load(
36
+ :api_key => 'api_key',
37
+ :secret_key => 'secret_key',
38
+ :tombo_endpoint => 'tombo.mushikago.org'
39
+ )
40
+ end
41
+
42
+ subject{ Mushikago::Config.instance }
43
+ it{ subject.api_key.should == 'api_key' }
44
+ it{ subject.secret_key.should == 'secret_key' }
45
+ it{ subject.tombo_endpoint.should == 'tombo.mushikago.org' }
46
+
47
+ # ロードする際のキーは文字列でもOK
48
+ context 'loading options key can be string' do
49
+ before :all do
50
+ Mushikago::Config.load(
51
+ 'api_key' => 'api_key',
52
+ 'secret_key' => 'secret_key',
53
+ 'tombo_endpoint' => 'tombo.mushikago.org'
54
+ )
55
+ end
56
+
57
+ subject{ Mushikago::Config.instance }
58
+ it{ subject.api_key.should == 'api_key' }
59
+ it{ subject.secret_key.should == 'secret_key' }
60
+ it{ subject.tombo_endpoint.should == 'tombo.mushikago.org' }
61
+ end
62
+ end
63
+
64
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mushikago::Http::Request do
4
+ before :all do
5
+ @request = Mushikago::Http::Request.new
6
+ @request.host = 'tombo.ap-northeast-1.mushikago.org'
7
+ @request.path = '/1/list.json'
8
+ @request.headers['hoge'] = 'fuga'
9
+ @request.set_param('param1', 'p1')
10
+ @request.set_param('param2', 'p2')
11
+ @request.set_param('timestamp', '2011-09-01T00:00:00Z')
12
+ end
13
+
14
+ subject{ @request }
15
+
16
+ it{ should respond_to(:http_method) }
17
+ it{ should respond_to(:host, :host=) }
18
+ it{ should respond_to(:path, :path=) }
19
+ it{ should respond_to(:headers) }
20
+ it{ should respond_to(:params) }
21
+ it{ should respond_to(:set_param) }
22
+ it{ should respond_to(:get_param) }
23
+
24
+ it{ subject.http_method.should == 'GET' }
25
+ it{ subject.host.should == 'tombo.ap-northeast-1.mushikago.org' }
26
+ it{ subject.path.should == '/1/list.json' }
27
+ it{ subject.headers.should be_a_kind_of(Hash) }
28
+ it{ subject.headers['hoge'].should == 'fuga' }
29
+ it{ subject.get_param('param1').should == 'p1' }
30
+ it{ subject.get_param('param2').should == 'p2' }
31
+ it{ subject.get_param('timestamp').should == '2011-09-01T00:00:00Z' }
32
+
33
+ it{ subject.url_encoded_params.should == 'param1=p1&param2=p2&timestamp=2011-09-01T00%3A00%3A00Z' }
34
+
35
+ context 'to http request' do
36
+ subject{ @request.to_http_request }
37
+ it{ should be_a_kind_of(Net::HTTPRequest) }
38
+ end
39
+ end
40
+
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mushikago::Http::Response do
4
+ before do
5
+ response = {
6
+ :meta => {
7
+ :status => 200,
8
+ :message => 'OK'
9
+ },
10
+ :response => {
11
+ :hello => 'world'
12
+ }
13
+ }
14
+ @response = Mushikago::Http::Response.new(response)
15
+ end
16
+
17
+ subject{ @response }
18
+
19
+ it{ should respond_to(:meta, :response) }
20
+ it{ should respond_to(:[]) }
21
+
22
+ it{ subject.meta[:status].should == 200 }
23
+ it{ subject.meta[:message].should == 'OK' }
24
+ it{ subject.response[:hello].should == 'world' }
25
+ it{ subject[:hello].should == 'world' }
26
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mushikago::Tombo::CaptureRequest do
4
+ before :all do
5
+ @request = Mushikago::Tombo::CaptureRequest.new('http://www.mushikago.org/')
6
+ end
7
+
8
+ subject{ @request }
9
+
10
+ it{ should respond_to(:url) }
11
+ it{ should respond_to(:image_format) }
12
+ it{ should respond_to(:image_quality) }
13
+ it{ should respond_to(:thumbnail) }
14
+ it{ should respond_to(:tags) }
15
+ it{ should respond_to(:add_signature!) }
16
+
17
+ context 'with options' do
18
+ before :all do
19
+ options = {
20
+ :image_format => 'png',
21
+ :image_quality => '20',
22
+ :thumbnail => '1',
23
+ :tags => 'hoge,fuga',
24
+ }
25
+ @request = Mushikago::Tombo::CaptureRequest.new('http://www.mushikago.org/', options)
26
+ end
27
+
28
+ subject{ @request }
29
+
30
+ it{ subject.host.should == Mushikago.config.tombo_endpoint }
31
+ it{ subject.http_method.should == 'POST' }
32
+ it{ subject.path.should == '/1/capture.json' }
33
+ it{ subject.url.should == 'http://www.mushikago.org/' }
34
+ it{ subject.image_format.should == 'png' }
35
+ it{ subject.image_quality.should == '20' }
36
+ it{ subject.thumbnail.should == '1' }
37
+ it{ subject.tags.should == 'hoge,fuga' }
38
+ it{ subject.url_encoded_params.should == 'image_format=png&image_quality=20&tags=hoge%2Cfuga&thumbnail=1&url=http%3A%2F%2Fwww.mushikago.org%2F' }
39
+ end
40
+
41
+ context 'tags can be array and thumbnail is 0' do
42
+ before :all do
43
+ options = {
44
+ :thumbnail => 0,
45
+ :tags => ['hoge','fuga'],
46
+ }
47
+ @request = Mushikago::Tombo::CaptureRequest.new('http://www.mushikago.org/', options)
48
+ end
49
+
50
+ subject{ @request }
51
+ it{ subject.thumbnail.should == '0' }
52
+ it{ subject.tags.should == 'hoge,fuga' }
53
+ end
54
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mushikago::Tombo::CapturesRequest do
4
+ before :all do
5
+ @request = Mushikago::Tombo::CapturesRequest.new
6
+ end
7
+
8
+ subject{ @request }
9
+
10
+ it{ should respond_to(:id) }
11
+ it{ should respond_to(:limit) }
12
+ it{ should respond_to(:offset) }
13
+ it{ should respond_to(:domain) }
14
+ it{ should respond_to(:tag) }
15
+
16
+ context 'with options' do
17
+ before :all do
18
+ options = {
19
+ :id => 'id',
20
+ :limit => '2',
21
+ :offset => '5',
22
+ :domain => 'hogehoge.com',
23
+ :tag => 'tag',
24
+ }
25
+ @request = Mushikago::Tombo::CapturesRequest.new(options)
26
+ end
27
+
28
+ subject{ @request }
29
+
30
+ it{ subject.host.should == Mushikago.config.tombo_endpoint }
31
+ it{ subject.http_method.should == 'GET' }
32
+ it{ subject.path.should == '/1/captures.json' }
33
+ it{ subject.id.should == 'id' }
34
+ it{ subject.limit.should == '2' }
35
+ it{ subject.offset.should == '5' }
36
+ it{ subject.domain.should == 'hogehoge.com' }
37
+ it{ subject.tag.should == 'tag' }
38
+ it{ subject.url_encoded_params.should == 'domain=hogehoge.com&id=id&limit=2&offset=5&tag=tag' }
39
+ end
40
+ end
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mushikago::Tombo::Client do
4
+ before :all do
5
+ @client = Mushikago::Tombo::Client.new(
6
+ :api_key => ENV['MUSHIKAGO_API_KEY'],
7
+ :secret_key => ENV['MUSHIKAGO_SECRET_KEY']
8
+ )
9
+ end
10
+
11
+ subject{ @client }
12
+
13
+ it{ should respond_to(:capture) }
14
+ it{ should respond_to(:captures) }
15
+ it{ should respond_to(:delete) }
16
+ it{ should respond_to(:info) }
17
+ =begin
18
+ context 'send capture request' do
19
+ before :all do
20
+ @response = @client.capture('http://www.tombo.ne.jp/', :thumbnail=>1)
21
+ end
22
+
23
+ subject{ @response }
24
+
25
+ it{ subject.meta['status'].should == 200 }
26
+ it{ subject.meta['message'].should == 'OK' }
27
+ it{ subject.response.should_not be_nil }
28
+ it{ subject['id'].should_not be_nil }
29
+ it{ subject['image_url'].should_not be_nil }
30
+ it{ subject['thumbnail_url'].should_not be_nil }
31
+ end
32
+ =end
33
+
34
+ context 'send captures request' do
35
+ before :all do
36
+ @response = @client.captures
37
+ end
38
+
39
+ subject{ @response }
40
+ it{ subject.meta['status'].should == 200 }
41
+ it{ subject.meta['message'].should == 'OK' }
42
+ it{ subject.response.should_not be_nil }
43
+ it{ subject['total'].should_not be_nil }
44
+ it{ subject['images'].should_not be_nil }
45
+ it{ subject['images'].should be_a_kind_of(Enumerable) }
46
+ it{ subject['images'].should have_at_most(subject['total'].to_i).items }
47
+
48
+ context 'returned images should have keys' do
49
+ subject{ @response['images'].first }
50
+ it{ subject['image_id'].should_not be_nil }
51
+ it{ subject['image_url'].should_not be_nil }
52
+ it{ subject['image_size'].should_not be_nil }
53
+ it{ subject['source_url'].should_not be_nil }
54
+ it{ subject['image_format'].should_not be_nil }
55
+ it{ subject['image_quality'].should_not be_nil }
56
+ it{ subject['state'].should_not be_nil }
57
+ it{ subject['tags'].should_not be_nil }
58
+ it{ subject['tags'].should be_a_kind_of(Enumerable) }
59
+ end
60
+ end
61
+
62
+ context 'send delete request' do
63
+ before :all do
64
+ @response = @client.delete('391d7fe4-e9d4-4975-85a3-e5d38a4cd97f')
65
+ end
66
+
67
+ subject{ @response }
68
+
69
+ it{ subject.meta['status'].should == 200 }
70
+ it{ subject['id'].should_not be_nil }
71
+ it{ subject['id'].should == '391d7fe4-e9d4-4975-85a3-e5d38a4cd97f' }
72
+ end
73
+
74
+ context 'send info request' do
75
+ before :all do
76
+ @response = @client.info
77
+ end
78
+
79
+ subject{ @response }
80
+
81
+ it{ subject.meta['status'].should == 200 }
82
+ it{ subject['api_count'].should_not be_nil }
83
+ it{ subject['disk_usage'].should_not be_nil }
84
+ it{ subject['image_num'].should_not be_nil }
85
+ end
86
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mushikago::Tombo::DeleteRequest do
4
+ before :all do
5
+ @request = Mushikago::Tombo::DeleteRequest.new('391d7fe4-e9d4-4975-85a3-e5d38a4cd97f')
6
+ end
7
+
8
+ subject{ @request }
9
+
10
+ it{ should respond_to(:id) }
11
+ it{ subject.host.should == Mushikago.config.tombo_endpoint }
12
+ it{ subject.http_method.should == 'DELETE' }
13
+ it{ subject.path.should == '/1/delete.json' }
14
+ it{ subject.id.should == '391d7fe4-e9d4-4975-85a3-e5d38a4cd97f' }
15
+ end
16
+
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mushikago::Tombo::InfoRequest do
4
+ before :all do
5
+ @request = Mushikago::Tombo::InfoRequest.new
6
+ end
7
+
8
+ subject{ @request }
9
+
10
+ it{ subject.host.should == Mushikago.config.tombo_endpoint }
11
+ it{ subject.http_method.should == 'GET' }
12
+ it{ subject.path.should == '/1/info.json' }
13
+ end
14
+
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler.setup :default, :test
4
+ require 'mushikago'
metadata ADDED
@@ -0,0 +1,205 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mushikago-sdk
3
+ version: !ruby/object:Gem::Version
4
+ hash: 31
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 2
10
+ version: 0.1.2
11
+ platform: ruby
12
+ authors:
13
+ - Toru Matsuoka
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-09-05 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: json
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: rake
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :development
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: maruku
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ type: :development
61
+ version_requirements: *id003
62
+ - !ruby/object:Gem::Dependency
63
+ name: yard
64
+ prerelease: false
65
+ requirement: &id004 !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ type: :development
75
+ version_requirements: *id004
76
+ - !ruby/object:Gem::Dependency
77
+ name: rspec
78
+ prerelease: false
79
+ requirement: &id005 !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ~>
83
+ - !ruby/object:Gem::Version
84
+ hash: 23
85
+ segments:
86
+ - 2
87
+ - 6
88
+ - 0
89
+ version: 2.6.0
90
+ type: :development
91
+ version_requirements: *id005
92
+ - !ruby/object:Gem::Dependency
93
+ name: ZenTest
94
+ prerelease: false
95
+ requirement: &id006 !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ hash: 3
101
+ segments:
102
+ - 0
103
+ version: "0"
104
+ type: :development
105
+ version_requirements: *id006
106
+ - !ruby/object:Gem::Dependency
107
+ name: bundler
108
+ prerelease: false
109
+ requirement: &id007 !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ hash: 3
115
+ segments:
116
+ - 0
117
+ version: "0"
118
+ type: :development
119
+ version_requirements: *id007
120
+ description: A SDK for Mushikago.
121
+ email:
122
+ - t.matsuoka@miningbrownie.co.jp
123
+ executables: []
124
+
125
+ extensions: []
126
+
127
+ extra_rdoc_files: []
128
+
129
+ files:
130
+ - lib/mushikago.rb
131
+ - lib/mushikago/tombo.rb
132
+ - lib/mushikago/auth/signer.rb
133
+ - lib/mushikago/auth/signature.rb
134
+ - lib/mushikago/tombo/request.rb
135
+ - lib/mushikago/tombo/info_request.rb
136
+ - lib/mushikago/tombo/capture_request.rb
137
+ - lib/mushikago/tombo/captures_request.rb
138
+ - lib/mushikago/tombo/delete_request.rb
139
+ - lib/mushikago/tombo/client.rb
140
+ - lib/mushikago/version.rb
141
+ - lib/mushikago/auth.rb
142
+ - lib/mushikago/configuration.rb
143
+ - lib/mushikago/http/request.rb
144
+ - lib/mushikago/http/response.rb
145
+ - lib/mushikago/client.rb
146
+ - lib/mushikago/http.rb
147
+ - lib/mushikago-sdk.rb
148
+ - spec/spec_helper.rb
149
+ - spec/mushikago/client_spec.rb
150
+ - spec/mushikago/auth/signer_spec.rb
151
+ - spec/mushikago/auth/signature_spec.rb
152
+ - spec/mushikago/tombo/client_spec.rb
153
+ - spec/mushikago/tombo/delete_request_spec.rb
154
+ - spec/mushikago/tombo/captures_request_spec.rb
155
+ - spec/mushikago/tombo/info_request_spec.rb
156
+ - spec/mushikago/tombo/capture_request_spec.rb
157
+ - spec/mushikago/configuration_spec.rb
158
+ - spec/mushikago/http/response_spec.rb
159
+ - spec/mushikago/http/request_spec.rb
160
+ homepage: http://www.mushikago.org/
161
+ licenses: []
162
+
163
+ post_install_message:
164
+ rdoc_options: []
165
+
166
+ require_paths:
167
+ - lib
168
+ required_ruby_version: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ hash: 3
174
+ segments:
175
+ - 0
176
+ version: "0"
177
+ required_rubygems_version: !ruby/object:Gem::Requirement
178
+ none: false
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ hash: 3
183
+ segments:
184
+ - 0
185
+ version: "0"
186
+ requirements: []
187
+
188
+ rubyforge_project:
189
+ rubygems_version: 1.8.10
190
+ signing_key:
191
+ specification_version: 3
192
+ summary: A SDK for Mushikago.
193
+ test_files:
194
+ - spec/spec_helper.rb
195
+ - spec/mushikago/client_spec.rb
196
+ - spec/mushikago/auth/signer_spec.rb
197
+ - spec/mushikago/auth/signature_spec.rb
198
+ - spec/mushikago/tombo/client_spec.rb
199
+ - spec/mushikago/tombo/delete_request_spec.rb
200
+ - spec/mushikago/tombo/captures_request_spec.rb
201
+ - spec/mushikago/tombo/info_request_spec.rb
202
+ - spec/mushikago/tombo/capture_request_spec.rb
203
+ - spec/mushikago/configuration_spec.rb
204
+ - spec/mushikago/http/response_spec.rb
205
+ - spec/mushikago/http/request_spec.rb