iknow 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -9,4 +9,13 @@
9
9
  == 0.0.4
10
10
 
11
11
  * add new API calls
12
- * add new attributes
12
+ * add new attributes
13
+
14
+ == 0.1.0
15
+
16
+ * add Iknow::Auth (supports basic_auth and oauth)
17
+ * add List#create, List#delete, List#add_item, List#delete_item
18
+
19
+ == 0.1.1
20
+
21
+ * remove Mechanize
data/Rakefile CHANGED
@@ -62,7 +62,6 @@ spec = Gem::Specification.new do |s|
62
62
 
63
63
  s.add_dependency('rails', '>=2.1.0')
64
64
  s.add_dependency('json')
65
- s.add_dependency('mechanize')
66
65
  s.add_dependency('oauth', '>=0.2.7')
67
66
  s.required_ruby_version = '>= 1.8.6'
68
67
 
@@ -114,6 +113,7 @@ task :rubyforge => [:rdoc, :package] do
114
113
  Rake::RubyForgePublisher.new(RUBYFORGE_PROJECT, 'nov').upload
115
114
  end
116
115
 
116
+ # rake release VERSION=x.y.z
117
117
  desc 'Package and upload the release to rubyforge.'
118
118
  task :release => [:clean, :package] do |t|
119
119
  v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
@@ -70,8 +70,8 @@ end
70
70
  ########################
71
71
 
72
72
  iknow_auth = case
73
- when OAUTH_ACCESS_TOKEN != ''
74
- if Iknow::Config.oauth_consumer_key == '' or Iknow::Config.oauth_consumer_secret == ''
73
+ when !OAUTH_ACCESS_TOKEN.empty?
74
+ if Iknow::Config.oauth_consumer_key.empty? or Iknow::Config.oauth_consumer_secret.empty?
75
75
  raise ArgumentError.new("oauth_consumer_key and oauth_consumer_secret are required")
76
76
  end
77
77
  Iknow::Auth.new(:token => OAUTH_ACCESS_TOKEN, :secret => OAUTH_ACCESS_TOKEN_SECRET)
@@ -83,6 +83,8 @@ iknow_auth = case
83
83
  unless iknow_auth
84
84
  puts "Skip calls which require authentication"
85
85
  exit
86
+ else
87
+ puts "Authenticate Mode :: #{iknow_auth.mode}"
86
88
  end
87
89
 
88
90
  ## List API
@@ -1,14 +1,21 @@
1
1
  require 'oauth/consumer'
2
- require 'mechanize'
3
2
 
4
3
  class Iknow::Auth
5
4
  attr_accessor :mode, :auth_token
6
5
 
6
+ class Basic
7
+ attr_reader :username, :password
8
+
9
+ def initialize(username, password)
10
+ @username = username
11
+ @password = password
12
+ end
13
+ end
14
+
7
15
  def initialize(options = {})
8
16
  if options[:username] && options[:password]
9
17
  @mode = :basic_auth
10
- @auth_token = WWW::Mechanize.new
11
- @auth_token.auth(options[:username], options[:password])
18
+ @auth_token = Basic.new(options[:username], options[:password])
12
19
  elsif options[:token] && options[:secret]
13
20
  @mode = :oauth
14
21
  @auth_token = OAuth::AccessToken.new(Iknow::Auth.consumer, options[:token], options[:secret])
@@ -21,9 +28,12 @@ class Iknow::Auth
21
28
  @@consumer ||= OAuth::Consumer.new(
22
29
  Iknow::Config.oauth_consumer_key,
23
30
  Iknow::Config.oauth_consumer_secret,
31
+ :http_method => :get,
32
+ :schema => :query_string,
24
33
  :site => Iknow::Config.iknow_api_base_url,
25
34
  :authorize_url => "#{Iknow::Config.iknow_base_url}/oauth/authorize"
26
35
  )
27
36
  end
28
37
 
38
+ alias_method :account, :auth_token
29
39
  end
@@ -2,7 +2,7 @@ require 'singleton'
2
2
 
3
3
  class Iknow::Config
4
4
  include Singleton
5
- attr_accessor :protocol, :host, :port, :api_protocol, :api_host, :api_port,
5
+ attr_accessor :protocol, :host, :port, :api_protocol, :api_host, :api_port, :timeout,
6
6
  :api_key, :oauth_consumer_key, :oauth_consumer_secret,
7
7
  :user_agent, :application_name, :application_version, :application_url, :source
8
8
 
@@ -14,14 +14,14 @@ class Iknow::Config
14
14
  :api_protocol => 'http',
15
15
  :api_host => 'api.iknow.co.jp',
16
16
  :api_port => 80,
17
+ :timeout => 5,
17
18
  :api_key => '',
18
19
  :oauth_consumer_key => '',
19
20
  :oauth_consumer_secret => '',
20
21
  :user_agent => 'default',
21
- :application_name => 'A rubygem for iKnow! API',
22
+ :application_name => 'iKnow! Gem',
22
23
  :application_version => Iknow::Version.to_version,
23
- :application_url => 'http://github.com/nov/iknow',
24
- :source => 'iknow'
24
+ :application_url => 'http://github.com/nov/iknow'
25
25
  }.each do |key, value| conf.send("#{key}=", value) end
26
26
  yield conf if block_given?
27
27
  conf
@@ -1,7 +1,7 @@
1
1
  module Iknow::Version
2
2
  MAJOR = 0
3
3
  MINOR = 1
4
- REVISION = 0
4
+ REVISION = 1
5
5
  class << self
6
6
  def to_version
7
7
  "#{MAJOR}.#{MINOR}.#{REVISION}"
@@ -4,26 +4,23 @@ class Iknow::Base
4
4
 
5
5
  def attributes; self.class.attributes end
6
6
 
7
- def self.deserialize(response, params = {})
8
- return nil if response.nil? or
9
- (response.is_a?(Hash) and
10
- !response['error'].nil? and
11
- response['error']['code'].to_i == 404)
7
+ def self.deserialize(hash, params = {})
8
+ return nil if hash.nil?
12
9
 
13
10
  klass = params[:as] ? params[:as] : self
14
- if response.is_a?(Array)
15
- response.inject([]) { |results, hash|
11
+ if hash.is_a?(Array)
12
+ hash.inject([]) { |results, hash|
16
13
  hash.symbolize_keys!
17
14
  results << klass.new(hash)
18
15
  }
19
16
  else
20
- response.symbolize_keys!
21
- klass.new(response)
17
+ hash.symbolize_keys!
18
+ klass.new(hash)
22
19
  end
23
20
  end
24
21
 
25
- def deserialize(response, params = {})
26
- self.class.deserialize(response, params)
22
+ def deserialize(hash, params = {})
23
+ self.class.deserialize(hash, params)
27
24
  end
28
25
 
29
26
  end
@@ -1,5 +1,5 @@
1
1
  class Iknow::Item < Iknow::Base
2
- ATTRIBUTES = [:sentences, :response, :cue, :id]
2
+ ATTRIBUTES = [:sentences, :hash, :cue, :id]
3
3
  attr_reader *ATTRIBUTES
4
4
 
5
5
  class Response
@@ -28,32 +28,32 @@ class Iknow::Item < Iknow::Base
28
28
  end
29
29
 
30
30
  def self.recent(params = {})
31
- response = Iknow::RestClient::Item.recent(params)
32
- self.deserialize(response) || []
31
+ hash = Iknow::RestClient::Item.recent(params)
32
+ self.deserialize(hash) || []
33
33
  end
34
34
 
35
35
  def self.find(item_id, params = {})
36
36
  params[:id] = item_id
37
- response = Iknow::RestClient::Item.find(params)
38
- self.deserialize(response)
37
+ hash = Iknow::RestClient::Item.find(params)
38
+ self.deserialize(hash)
39
39
  end
40
40
 
41
41
  def self.matching(keyword, params = {})
42
42
  params[:keyword] = keyword
43
- response = Iknow::RestClient::Item.matching(params)
44
- self.deserialize(response) || []
43
+ hash = Iknow::RestClient::Item.matching(params)
44
+ self.deserialize(hash) || []
45
45
  end
46
46
 
47
47
  def self.extract(text, params = {})
48
48
  params[:text] = text
49
- response = Iknow::RestClient::Item.extract(params)
50
- self.deserialize(response) || []
49
+ hash = Iknow::RestClient::Item.extract(params)
50
+ self.deserialize(hash) || []
51
51
  end
52
52
 
53
53
  def initialize(params = {})
54
54
  @id = params[:id].to_i
55
55
  @cue = self.deserialize(params[:cue], :as => Iknow::Item::Cue)
56
- @responses = self.deserialize(params[:responses], :as => Iknow::Item::Response)
56
+ @hashs = self.deserialize(params[:hashs], :as => Iknow::Item::Response)
57
57
  @sentences = self.deserialize(params[:sentences], :as => Iknow::Sentence)
58
58
  end
59
59
 
@@ -35,20 +35,20 @@ class Iknow::List < Iknow::Base
35
35
  end
36
36
 
37
37
  def self.recent(params = {})
38
- response = Iknow::RestClient::List.recent(params)
39
- self.deserialize(response) || []
38
+ hash = Iknow::RestClient::List.recent(params)
39
+ self.deserialize(hash) || []
40
40
  end
41
41
 
42
42
  def self.find(list_id, params = {})
43
43
  params[:id] = list_id
44
- response = Iknow::RestClient::List.find(params)
45
- self.deserialize(response)
44
+ hash = Iknow::RestClient::List.find(params)
45
+ self.deserialize(hash)
46
46
  end
47
47
 
48
48
  def self.matching(keyword, params = {})
49
49
  params[:keyword] = keyword
50
- response = Iknow::RestClient::List.matching(params)
51
- self.deserialize(response) || []
50
+ hash = Iknow::RestClient::List.matching(params)
51
+ self.deserialize(hash) || []
52
52
  end
53
53
 
54
54
  def self.create(iknow_auth, params = {})
@@ -88,26 +88,26 @@ class Iknow::List < Iknow::Base
88
88
  end
89
89
 
90
90
  def items(params = {})
91
- response = Iknow::RestClient::List.items(params.merge(:id => self.id))
92
- self.deserialize(response, :as => Iknow::Item) || []
91
+ hash = Iknow::RestClient::List.items(params.merge(:id => self.id))
92
+ self.deserialize(hash, :as => Iknow::Item) || []
93
93
  end
94
94
 
95
95
  def sentences(params = {})
96
- response = Iknow::RestClient::List.sentences(params.merge(:id => self.id))
97
- self.deserialize(response, :as => Iknow::Sentence) || []
96
+ hash = Iknow::RestClient::List.sentences(params.merge(:id => self.id))
97
+ self.deserialize(hash, :as => Iknow::Sentence) || []
98
98
  end
99
99
 
100
100
  def save(iknow_auth)
101
101
  begin
102
102
  list_id = Iknow::RestClient::List.create(iknow_auth, self.to_post_data)
103
- rescue
104
- return false
103
+ # rescue
104
+ # return false
105
105
  end
106
106
  Iknow::List.find(list_id)
107
107
  end
108
108
 
109
109
  def delete(iknow_auth)
110
- Iknow::RestClient::List.delete(iknow_auth, :id => self.id)
110
+ Iknow::RestClient::List.delete(iknow_auth, {:id => self.id})
111
111
  end
112
112
  alias_method :destroy, :delete
113
113
 
@@ -5,20 +5,20 @@ class Iknow::Sentence < Iknow::Base
5
5
  attr_reader *(ATTRIBUTES - WRITABLE_ATTRIBUTES)
6
6
 
7
7
  def self.recent(params = {})
8
- response = Iknow::RestClient::Sentence.recent(params)
9
- self.deserialize(response) || []
8
+ hash = Iknow::RestClient::Sentence.recent(params)
9
+ self.deserialize(hash) || []
10
10
  end
11
11
 
12
12
  def self.find(sentence_id, params = {})
13
13
  params[:id] = sentence_id
14
- response = Iknow::RestClient::Sentence.find(params)
15
- self.deserialize(response)
14
+ hash = Iknow::RestClient::Sentence.find(params)
15
+ self.deserialize(hash)
16
16
  end
17
17
 
18
18
  def self.matching(keyword, params = {})
19
19
  params[:keyword] = keyword
20
- response = Iknow::RestClient::Sentence.matching(params)
21
- self.deserialize(response) || []
20
+ hash = Iknow::RestClient::Sentence.matching(params)
21
+ self.deserialize(hash) || []
22
22
  end
23
23
 
24
24
  def initialize(params = {})
@@ -63,14 +63,14 @@ class Iknow::User < Iknow::Base
63
63
 
64
64
  def self.find(username, params = {})
65
65
  params[:username] = username
66
- response = Iknow::RestClient::User.find(params)
67
- self.deserialize(response)
66
+ hash = Iknow::RestClient::User.find(params)
67
+ self.deserialize(hash)
68
68
  end
69
69
 
70
70
  def self.matching(keyword, params = {})
71
71
  params[:keyword] = keyword
72
- response = Iknow::RestClient::User.matching(params)
73
- self.deserialize(response) || []
72
+ hash = Iknow::RestClient::User.matching(params)
73
+ self.deserialize(hash) || []
74
74
  end
75
75
 
76
76
  def initialize(params)
@@ -79,24 +79,24 @@ class Iknow::User < Iknow::Base
79
79
  end
80
80
 
81
81
  def items(params = {})
82
- response = Iknow::RestClient::User.items(params.merge(:username => self.username))
83
- self.deserialize(response, :as => Iknow::Item) || []
82
+ hash = Iknow::RestClient::User.items(params.merge(:username => self.username))
83
+ self.deserialize(hash, :as => Iknow::Item) || []
84
84
  end
85
85
 
86
86
  def lists(params = {})
87
- response = Iknow::RestClient::User.lists(params.merge(:username => self.username))
88
- self.deserialize(response, :as => Iknow::List) || []
87
+ hash = Iknow::RestClient::User.lists(params.merge(:username => self.username))
88
+ self.deserialize(hash, :as => Iknow::List) || []
89
89
  end
90
90
 
91
91
  def friends(params = {})
92
- response = Iknow::RestClient::User.friends(params.merge(:username => self.username))
93
- self.deserialize(response) || []
92
+ hash = Iknow::RestClient::User.friends(params.merge(:username => self.username))
93
+ self.deserialize(hash) || []
94
94
  end
95
95
 
96
96
  def study(params = {})
97
97
  params[:application] ||= 'iknow'
98
- response = Iknow::RestClient::User.study_results(params.merge(:username => self.username))
99
- self.deserialize(response, :as => Iknow::User::Study)
98
+ hash = Iknow::RestClient::User.study_results(params.merge(:username => self.username))
99
+ self.deserialize(hash, :as => Iknow::User::Study)
100
100
  end
101
101
 
102
102
  end
@@ -1,3 +1,5 @@
1
+ require 'timeout'
2
+
1
3
  class Iknow::RestClient::Base
2
4
 
3
5
  class RESTError < Exception
@@ -24,13 +26,13 @@ class Iknow::RestClient::Base
24
26
  case self.http_method(action)
25
27
  when :get
26
28
  path, params = path_with_params(self.path(action), args[0])
27
- http_get_request(path, params)
29
+ http_get(path, params)
28
30
  when :post
29
31
  path, params = path_with_params(self.path(action), args[1])
30
- http_post_request(iknow_auth(args[0]), path, params)
32
+ http_post(iknow_auth(args[0]), path, params)
31
33
  when :delete
32
34
  path, params = path_with_params(self.path(action), args[1])
33
- http_delete_request(iknow_auth(args[0]), path, params)
35
+ http_delete(iknow_auth(args[0]), path, params)
34
36
  end
35
37
  end
36
38
 
@@ -54,19 +56,54 @@ class Iknow::RestClient::Base
54
56
  raise RESTError.new(:code => response.code, :message => response.message)
55
57
  end
56
58
 
57
- def self.handle_rest_response(response)
59
+ def self.handle_rest_response(response, format)
58
60
  raise_rest_error(response) unless response.is_a?(Net::HTTPSuccess)
61
+ case format
62
+ when :json
63
+ handle_json_response(response.body)
64
+ when :nothing
65
+ # success => nothing / failure => json error
66
+ handle_json_response(response.body) rescue :success
67
+ else
68
+ response.body
69
+ end
70
+ end
71
+
72
+ def self.handle_json_response(json_response)
73
+ hash = JSON.parse(json_response)
74
+ unless (hash['error'].nil? rescue :success) # success response may be Array, not Hash.
75
+ if hash['error']['code'].to_i == 404
76
+ return nil
77
+ else
78
+ raise RESTError.new(:code => hash['error']['code'], :message => hash['error']['message'])
79
+ end
80
+ end
81
+ hash
59
82
  end
60
83
 
61
84
  def self.http_header
62
85
  @@http_header ||= {
63
- 'User-Agent' => "iKnow! API v#{Iknow::Version.to_version} [#{self.config.user_agent}]",
64
- 'Accept' => 'text/x-json',
65
- 'X-iKnow-Client' => self.config.application_name,
66
- 'X-iKnow-Client-Version' => self.config.application_version,
67
- 'X-iKnow-Client-URL' => self.config.application_url,
86
+ 'User-Agent' => "#{self.config.application_name} v#{Iknow::Version.to_version} [#{self.config.user_agent}]",
87
+ 'Accept' => 'text/x-json',
88
+ 'X-iKnow-Gem-Client' => self.config.application_name,
89
+ 'X-iKnow-Gem-Client-Version' => self.config.application_version,
90
+ 'X-iKnow-Gem-Client-URL' => self.config.application_url,
68
91
  }
69
- @@http_header
92
+ end
93
+
94
+ def self.http_connect
95
+ http = Net::HTTP.new(self.config.api_host, self.config.api_port)
96
+ http.start do |conn|
97
+ request, format = yield
98
+ begin
99
+ timeout(self.config.timeout) do
100
+ response = conn.request(request)
101
+ handle_rest_response(response, format)
102
+ end
103
+ rescue
104
+ raise RESTError.new(:code => 408, :message => "iKnow! Gem Timeout (#{self.config.timeout} [sec])")
105
+ end
106
+ end
70
107
  end
71
108
 
72
109
  def self.path_with_params(path, params = {})
@@ -82,50 +119,47 @@ class Iknow::RestClient::Base
82
119
  return path_with_params, params
83
120
  end
84
121
 
85
- def self.http_get_request(path, params = {})
86
- params.merge!(:api_key => self.config.api_key) unless self.config.api_key == ''
87
- path = (params.size > 0) ? "#{path}?#{params.to_http_str}" : path
88
- http = Net::HTTP.new(self.config.api_host, self.config.api_port)
89
- response = http.get(path, http_header)
90
- handle_rest_response(response)
91
- JSON.parse(response.body)
122
+ def self.http_get(path, params = {})
123
+ http_connect do
124
+ params.merge!(:api_key => self.config.api_key) unless self.config.api_key == ''
125
+ path = (params.size > 0) ? "#{path}?#{params.to_http_str}" : path
126
+ get_req = Net::HTTP::Get.new(path, http_header)
127
+ [get_req, :json]
128
+ end
92
129
  end
93
130
 
94
- def self.http_post_request(iknow_auth, path, params = {})
131
+ def self.http_post(iknow_auth, path, params = {})
95
132
  self.api_key_required
96
133
  params.merge!(:api_key => self.config.api_key)
97
134
  case iknow_auth.mode
98
- when :oauth
135
+ when :oauth
99
136
  response = iknow_auth.auth_token.post(path, params, http_header)
100
- handle_rest_response(response)
101
- response.body
137
+ handle_rest_response(response, :text)
102
138
  when :basic_auth
103
- begin
104
- response = iknow_auth.auth_token.post(self.config.iknow_api_base_url + path, params)
105
- response.body
106
- rescue WWW::Mechanize::ResponseCodeError => e
107
- raise RESTError.new(:code => e.response_code, :message => e.to_s)
139
+ http_connect do
140
+ post_req = Net::HTTP::Post.new(path, http_header)
141
+ post_req.body = params.to_http_str
142
+ post_req.basic_auth(iknow_auth.account.username, iknow_auth.account.password)
143
+ [post_req, :text]
108
144
  end
109
145
  end
110
146
  end
111
147
 
112
- def self.http_delete_request(iknow_auth, path, params = {})
148
+ def self.http_delete(iknow_auth, path, params = {})
113
149
  self.api_key_required
114
150
  params.merge!(:api_key => self.config.api_key)
115
151
  case iknow_auth.mode
116
152
  when :oauth
117
153
  response = iknow_auth.auth_token.delete(path, params.stringfy_keys!.stringfy_values!)
118
- handle_rest_response(response)
154
+ handle_rest_response(response, :nothing)
119
155
  when :basic_auth
120
- begin
121
- iknow_auth.auth_token.delete(self.config.iknow_api_base_url + path, params.stringfy_keys!)
122
- rescue WWW::Mechanize::ResponseCodeError => e
123
- raise RESTError.new(:code => e.response_code, :message => e.to_s)
156
+ http_connect do
157
+ delete_req = Net::HTTP::Post.new(path, http_header)
158
+ delete_req.body = params.merge(:_method => 'DELETE').to_http_str
159
+ delete_req.basic_auth(iknow_auth.account.username, iknow_auth.account.password)
160
+ [delete_req, :nothing]
124
161
  end
125
162
  end
126
163
  end
127
164
 
128
- private_class_method :raise_rest_error, :handle_rest_response, :http_header,
129
- :path_with_params, :http_get_request, :http_post_request, :http_delete_request
130
-
131
165
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iknow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - nov
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-19 00:00:00 +09:00
12
+ date: 2008-12-20 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -32,16 +32,6 @@ dependencies:
32
32
  - !ruby/object:Gem::Version
33
33
  version: "0"
34
34
  version:
35
- - !ruby/object:Gem::Dependency
36
- name: mechanize
37
- type: :runtime
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- version: "0"
44
- version:
45
35
  - !ruby/object:Gem::Dependency
46
36
  name: oauth
47
37
  type: :runtime