iknow 0.1.0 → 0.1.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.
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