mushikago-sdk 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,13 @@
1
1
  module Mushikago
2
2
  module Auth
3
+ # MushikagoのリクエストにMix-inして利用する
3
4
  module Signature
5
+ # リクエストの情報から以下のような署名用文字列を作成する
6
+ # GET
7
+ # localhost
8
+ # /1/info.json
9
+ # api_key=api_key&timestamp=2011-09-01T00%3A00%3A00Z
10
+ # @return [String] 署名用の文字列
4
11
  def string_to_sign
5
12
  [
6
13
  http_method,
@@ -10,6 +17,8 @@ module Mushikago
10
17
  ].join("\n")
11
18
  end
12
19
 
20
+ # リクエストに署名を追加する
21
+ # @param signer [Mushikago::Auth::Signer] 署名を作成するオブジェクト
13
22
  def add_signature! signer
14
23
  set_param('signature', signer.sign(string_to_sign))
15
24
  end
@@ -3,12 +3,19 @@ require 'openssl'
3
3
 
4
4
  module Mushikago
5
5
  module Auth
6
+ # 署名を作成するクラス
6
7
  class Signer
8
+ # @return [String] シークレットキー
7
9
  attr_reader :secret_key
10
+
11
+ # @param [String] secret_key シークレットキー
8
12
  def initialize secret_key
9
13
  @secret_key = secret_key
10
14
  end
11
15
 
16
+ # @param [String] string_to_sign 署名の元になる文字列
17
+ # @param [String] digest_method 署名作成のアルゴリズム
18
+ # @return [String] 署名
12
19
  def sign(string_to_sign, digest_method='sha256')
13
20
  Base64.encode64(
14
21
  OpenSSL::HMAC.digest(
@@ -1,4 +1,5 @@
1
1
  module Mushikago
2
+ # Mushikagoサービスの認証を扱うモジュール
2
3
  module Auth
3
4
  autoload :Signature, 'mushikago/auth/signature'
4
5
  autoload :Signer, 'mushikago/auth/signer'
@@ -4,11 +4,11 @@ module Mushikago
4
4
  include Singleton
5
5
 
6
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サービスのエンドポイントを設定する
7
+ # @option options [String] :api_key(ENV['MUSHIKAGO_API_KEY']) 発行されたAPIKeyを設定する
8
+ # @option options [String] :secret_key(ENV['MUSHIKAGO_SECRET_KEY']) 発行されたSecretKeyを設定する
9
+ # @option options [String] :tombo_endpoint('tombo.mushikago.org') tomboサービスのエンドポイントを設定する
10
10
  # @example
11
- # Mushikago::Config.load(:api_key => 'ABCDEFG', :secret_key => 'HIJKLMN')
11
+ # Mushikago.config.load(:api_key => 'ABCDEFG', :secret_key => 'HIJKLMN')
12
12
  def load options={}
13
13
  options.each do |key, value|
14
14
  supplied[key.to_sym] = value
@@ -20,6 +20,8 @@ module Mushikago
20
20
  # @param [Object] default_value デフォルト値
21
21
  # @param [Hash] options 型情報を補足的に追加することができる
22
22
  # @param [Block] transform 渡された値を変換するブロック
23
+ # @option options [Symbol] :boolean 自動的にname?のエイリアスメソッドが生成されます
24
+ private
23
25
  def add_option name, default_value = nil, options = {}, &transform
24
26
  name = name.to_sym
25
27
  raise "The option #{name} is already defined!" if self.respond_to?(name)
@@ -31,10 +33,6 @@ module Mushikago
31
33
 
32
34
  alias_class_method("#{name}?", name) if options[:boolean]
33
35
  end
34
-
35
- def load options={}
36
- instance.load options
37
- end
38
36
  end
39
37
 
40
38
  add_option :api_key, ENV['MUSHIKAGO_API_KEY'] || ENV['MUSHIKAGO_API_KEY_ID']
@@ -0,0 +1,37 @@
1
+ require 'net/http'
2
+ require 'json'
3
+ module Mushikago
4
+ module Http
5
+ class Client
6
+ # @return [String] api_key
7
+ attr_reader :api_key
8
+
9
+ # @return [Signer] signer
10
+ attr_reader :signer
11
+
12
+ # @param [Hash] options
13
+ # @option options [String] :api_key(Configured value) APIキー
14
+ # @option options [String] :secret_key(Configured value) 秘密鍵
15
+ def initialize options={}
16
+ @api_key = (options[:api_key] || Mushikago.config.api_key).to_s
17
+ @signer = Mushikago::Auth::Signer.new((options[:secret_key] || Mushikago.config.secret_key).to_s)
18
+ end
19
+
20
+ # @param [Mushikago::Http::Request] request
21
+ # @return [Mushikago::Http::Response] response
22
+ def send_request request
23
+ # add authorization
24
+ request.set_param('api_key', api_key)
25
+ request.set_param('timestamp', Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ'))
26
+ request.add_signature!(signer)
27
+
28
+ # send request
29
+ Net::HTTP.start(request.host, request.port) do |http|
30
+ http_request = request.to_http_request
31
+ http_response = http.request(http_request)
32
+ return Mushikago::Http::Response.new(JSON.parse(http_response.body))
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,14 +1,46 @@
1
1
  module Mushikago
2
2
  module Http
3
+ # Mushikagoサービスのレスポンスを扱うクラス
4
+ # Mushikagoサービスのレスポンスは以下のような構造になっている
5
+ # {
6
+ # meta : {
7
+ # status : 200,
8
+ # message : 'OK'
9
+ # },
10
+ # response : {
11
+ # // サービス毎に異なる情報
12
+ # }
13
+ # }
14
+ #
3
15
  class Response
16
+ # @return [Object] レスポンスのメタ情報
4
17
  attr_reader :meta
18
+ # @return [Object] レスポンスの本体
5
19
  attr_reader :response
6
20
 
21
+ # @param [Hash] options オプション
22
+ # @option options [Object] :meta レスポンスのメタ情報
23
+ # @option options [Object] :response レスポンスの本体
7
24
  def initialize options={}
8
25
  @meta = options[:meta] || options['meta']
9
26
  @response = options[:response] || options['response']
10
27
  end
11
28
 
29
+ # メタ情報中のstatusを返す
30
+ # @return [Integer] ステータス
31
+ def status
32
+ meta[:status].to_i
33
+ end
34
+
35
+ # メタ情報中のmessageを返す
36
+ # @return [String] メッセージ
37
+ def message
38
+ meta[:message]
39
+ end
40
+
41
+ # レスポンスの各要素にアクセスする
42
+ # @param [Symbol] key レスポンスの各要素へのキー
43
+ # @return [Object] レスポンスの要素
12
44
  def [] key
13
45
  response[key]
14
46
  end
@@ -1,5 +1,7 @@
1
1
  module Mushikago
2
+ # MushikagoサービスへのHTTPリクエストを扱うモジュール
2
3
  module Http
4
+ autoload :Client, 'mushikago/http/client'
3
5
  autoload :Request, 'mushikago/http/request'
4
6
  autoload :Response, 'mushikago/http/response'
5
7
  end
@@ -3,10 +3,16 @@ module Mushikago
3
3
  class CaptureRequest < Request
4
4
  add_param :url
5
5
  add_param :image_format
6
- add_param :image_quality
6
+ add_param :image_quality do |v| v.to_i.to_s end
7
7
  add_param :thumbnail do |v| (v.to_i != 0 ? 1 : 0).to_s end
8
8
  add_param :tags do |v| [v].flatten.compact.join(',') end
9
9
 
10
+ # @param [String] url キャプチャ対象のURL
11
+ # @param [Hash] options リクエストのオプション
12
+ # @option options [String] :image_format('jpg') 画像のフォーマット(jpg,png)
13
+ # @option options [Integer] :image_quality(80) 画像の品質(0-100)
14
+ # @option options [Boolean] :thumbnail(0) サムネイル取得フラグ(false:取得しない,true:取得する)
15
+ # @option options [String,Array] :tags タグ
10
16
  def initialize url, options={}
11
17
  super(options)
12
18
  self.url = url
@@ -7,6 +7,12 @@ module Mushikago
7
7
  add_param :domain
8
8
  add_param :tag
9
9
 
10
+ # @param [Hash] options リクエストのオプション
11
+ # @option options [String] :id 画像のID
12
+ # @option options [String] :domain 指定したドメインの画像一覧を取得する
13
+ # @option options [String] :tag 指定したタグの画像一覧を取得する
14
+ # @option options [Integer] :limit(10) 最大取得件数(1-100)
15
+ # @option options [Integer] :offset(0) 取得オフセット
10
16
  def initialize options={}
11
17
  super(options)
12
18
  self.id = options[:id] if options.has_key?(:id)
@@ -1,21 +1,71 @@
1
1
  module Mushikago
2
2
  module Tombo
3
- class Client < Mushikago::Client
3
+ # Tomboサービスを利用する
4
+ #
5
+ # @example
6
+ # client = Mushikago::Tombo::Client.new(:api_key => '<api_key>', :secret_key => '<secret_key>')
7
+ #
8
+ # client.capture('http://www.tombo.ne.jp/', :thumbnail => true, :tags => ['tombo', 'webservice'])
9
+ #
10
+ # captures = client.captures
11
+ # captures['images'].each do |image|
12
+ # puts image['image_url']
13
+ # end
14
+ #
15
+ # @example APIキーをファイルから読み込む場合
16
+ # Mushikago.config.load(YAML.load(File.read(mushikago.yml)))
17
+ # client = Mushikago::Tombo::Client.new
18
+ class Client < Mushikago::Http::Client
19
+ # 指定したURLのキャプチャを取得する
20
+ #
21
+ # @param [String] url キャプチャ対象のURL
22
+ # @param [Hash] options リクエストのオプション
23
+ # @option options [String] :image_format('jpg') 画像のフォーマット(jpg,png)
24
+ # @option options [Integer] :image_quality(80) 画像の品質(0-100)
25
+ # @option options [Boolean] :thumbnail(0) サムネイル取得フラグ(false:取得しない,true:取得する)
26
+ # @option options [String,Array] :tags タグ
27
+ # @example
28
+ # client.capture('http://www.tombo.ne.jp/', :thumbnail => true, :tags => ['tombo', 'webservice'])
29
+ # @return [Mushikago::Http::Response] リクエストの結果
4
30
  def capture url, options={}
5
31
  request = CaptureRequest.new(url, options)
6
32
  send_request(request)
7
33
  end
8
34
 
35
+ # いままでキャプチャした画像の情報を取得する
36
+ #
37
+ # @param [Hash] options リクエストのオプション
38
+ # @option options [String] :id 画像のID
39
+ # @option options [String] :domain 指定したドメインの画像一覧を取得する
40
+ # @option options [String] :tag 指定したタグの画像一覧を取得する
41
+ # @option options [Integer] :limit(10) 最大取得件数(1-100)
42
+ # @option options [Integer] :offset(0) 取得オフセット
43
+ # @example
44
+ # client.captures(:tag => 'webservice')
45
+ # @return [Mushikago::Http::Response] リクエストの結果
9
46
  def captures options={}
10
47
  request = CapturesRequest.new(options)
11
48
  send_request(request)
12
49
  end
13
50
 
51
+ # 指定した画像を削除する
52
+ #
53
+ # @param [String] id 画像のID
54
+ # @param [Hash] options リクエストのオプション
55
+ # @example
56
+ # client.delete('5a6cdfa3-xxx3-47d6-8xxx-5f83af6b66cc')
57
+ # @return [Mushikago::Http::Response] リクエストの結果
14
58
  def delete id, options={}
15
59
  request = DeleteRequest.new(id, options)
16
60
  send_request(request)
17
61
  end
18
62
 
63
+ # APIの使用状況を取得する
64
+ #
65
+ # @param [Hash] options リクエストのオプション
66
+ # @example
67
+ # client.info
68
+ # @return [Mushikago::Http::Response] リクエストの結果
19
69
  def info options={}
20
70
  request = InfoRequest.new(options)
21
71
  send_request(request)
@@ -3,6 +3,8 @@ module Mushikago
3
3
  class DeleteRequest < Request
4
4
  add_param :id
5
5
 
6
+ # @param [String] id 画像のID
7
+ # @param [Hash] options リクエストのオプション
6
8
  def initialize id, options={}
7
9
  super(options)
8
10
  self.id = id
@@ -1,6 +1,7 @@
1
1
  module Mushikago
2
2
  module Tombo
3
3
  class InfoRequest < Request
4
+ # @param [Hash] options リクエストのオプション
4
5
  def initialize options={}
5
6
  super(options)
6
7
  @path = "/#{api_version}/info.json"
@@ -1,4 +1,5 @@
1
1
  module Mushikago
2
+ # Tomboへのアクセスを行うモジュール
2
3
  module Tombo
3
4
  autoload :Client, 'mushikago/tombo/client'
4
5
  autoload :Request, 'mushikago/tombo/request'
@@ -1,3 +1,3 @@
1
1
  module Mushikago
2
- VERSION = '0.1.3'
2
+ VERSION = '0.1.4'
3
3
  end
data/lib/mushikago.rb CHANGED
@@ -1,13 +1,14 @@
1
+ # Mushikagoサービスを提供するモジュール
1
2
  module Mushikago
2
3
  # class
3
4
  autoload :Config, 'mushikago/configuration'
4
- autoload :Client, 'mushikago/client'
5
5
 
6
6
  # module
7
7
  autoload :Http, 'mushikago/http'
8
8
  autoload :Auth, 'mushikago/auth'
9
9
  autoload :Tombo, 'mushikago/tombo'
10
10
 
11
+ # @return [Mushikago::Config] config コンフィグのインスタンスへのアクセスを提供する
11
12
  def self.config
12
13
  Config.instance
13
14
  end
@@ -32,7 +32,7 @@ describe Mushikago::Config do
32
32
  # Mushikago::Configは値をロードすることができる
33
33
  context 'loads option value' do
34
34
  before :all do
35
- Mushikago::Config.load(
35
+ Mushikago::Config.instance.load(
36
36
  :api_key => 'api_key',
37
37
  :secret_key => 'secret_key',
38
38
  :tombo_endpoint => 'tombo.mushikago.org'
@@ -47,7 +47,7 @@ describe Mushikago::Config do
47
47
  # ロードする際のキーは文字列でもOK
48
48
  context 'loading options key can be string' do
49
49
  before :all do
50
- Mushikago::Config.load(
50
+ Mushikago::Config.instance.load(
51
51
  'api_key' => 'api_key',
52
52
  'secret_key' => 'secret_key',
53
53
  'tombo_endpoint' => 'tombo.mushikago.org'
@@ -5,10 +5,10 @@ class TestRequest < Mushikago::Http::Request
5
5
  end
6
6
 
7
7
 
8
- describe Mushikago::Client do
8
+ describe Mushikago::Http::Client do
9
9
  context 'construct without options' do
10
10
  before :all do
11
- @client = Mushikago::Client.new
11
+ @client = Mushikago::Http::Client.new
12
12
  end
13
13
 
14
14
  subject{ @client }
@@ -18,7 +18,7 @@ describe Mushikago::Client do
18
18
 
19
19
  context 'construct with options' do
20
20
  before :all do
21
- @client = Mushikago::Client.new(
21
+ @client = Mushikago::Http::Client.new(
22
22
  :api_key => 'mushikago api key'
23
23
  )
24
24
  end
@@ -33,7 +33,7 @@ describe Mushikago::Client do
33
33
  request = TestRequest.new
34
34
  request.host = 'tombo.mushikago.org'
35
35
  request.path = '/1/info.json'
36
- client = Mushikago::Client.new
36
+ client = Mushikago::Http::Client.new
37
37
  @response = client.send_request(request)
38
38
  end
39
39
  subject{ @response }
@@ -17,10 +17,13 @@ describe Mushikago::Http::Response do
17
17
  subject{ @response }
18
18
 
19
19
  it{ should respond_to(:meta, :response) }
20
+ it{ should respond_to(:status, :message) }
20
21
  it{ should respond_to(:[]) }
21
22
 
22
23
  it{ subject.meta[:status].should == 200 }
24
+ it{ subject.status.should == 200 }
23
25
  it{ subject.meta[:message].should == 'OK' }
26
+ it{ subject.message.should == 'OK' }
24
27
  it{ subject.response[:hello].should == 'world' }
25
28
  it{ subject[:hello].should == 'world' }
26
29
  end
@@ -35,6 +35,7 @@ describe Mushikago::Tombo::CaptureRequest do
35
35
  it{ subject.image_quality.should == '20' }
36
36
  it{ subject.thumbnail.should == '1' }
37
37
  it{ subject.tags.should == 'hoge,fuga' }
38
+ it{ subject.headers['Content-type'].should == 'application/x-www-form-urlencoded; charset=utf-8' }
38
39
  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
40
  end
40
41
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mushikago-sdk
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 3
10
- version: 0.1.3
9
+ - 4
10
+ version: 0.1.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Toru Matsuoka
@@ -142,11 +142,10 @@ files:
142
142
  - lib/mushikago/configuration.rb
143
143
  - lib/mushikago/http/request.rb
144
144
  - lib/mushikago/http/response.rb
145
- - lib/mushikago/client.rb
145
+ - lib/mushikago/http/client.rb
146
146
  - lib/mushikago/http.rb
147
147
  - lib/mushikago-sdk.rb
148
148
  - spec/spec_helper.rb
149
- - spec/mushikago/client_spec.rb
150
149
  - spec/mushikago/auth/signer_spec.rb
151
150
  - spec/mushikago/auth/signature_spec.rb
152
151
  - spec/mushikago/tombo/client_spec.rb
@@ -156,6 +155,7 @@ files:
156
155
  - spec/mushikago/tombo/info_request_spec.rb
157
156
  - spec/mushikago/tombo/capture_request_spec.rb
158
157
  - spec/mushikago/configuration_spec.rb
158
+ - spec/mushikago/http/client_spec.rb
159
159
  - spec/mushikago/http/response_spec.rb
160
160
  - spec/mushikago/http/request_spec.rb
161
161
  homepage: http://www.mushikago.org/
@@ -193,7 +193,6 @@ specification_version: 3
193
193
  summary: A SDK for Mushikago.
194
194
  test_files:
195
195
  - spec/spec_helper.rb
196
- - spec/mushikago/client_spec.rb
197
196
  - spec/mushikago/auth/signer_spec.rb
198
197
  - spec/mushikago/auth/signature_spec.rb
199
198
  - spec/mushikago/tombo/client_spec.rb
@@ -203,5 +202,6 @@ test_files:
203
202
  - spec/mushikago/tombo/info_request_spec.rb
204
203
  - spec/mushikago/tombo/capture_request_spec.rb
205
204
  - spec/mushikago/configuration_spec.rb
205
+ - spec/mushikago/http/client_spec.rb
206
206
  - spec/mushikago/http/response_spec.rb
207
207
  - spec/mushikago/http/request_spec.rb
@@ -1,35 +0,0 @@
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, request.port) 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