milk1000cc-web_service_simple 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -56,6 +56,10 @@ technorati = WebService::Simple.new(
56
56
  response = technorati.get('search', :limit => 50)
57
57
  </pre>
58
58
 
59
+ * post([extra_path,] arg)
60
+
61
+ Send POST request.
62
+
59
63
  * base_url
60
64
 
61
65
  * base_url=
@@ -1,6 +1,7 @@
1
1
  require 'logger'
2
2
  require 'net/http'
3
3
  require 'uri'
4
+ require 'cgi'
4
5
 
5
6
  require 'web_service/simple/response'
6
7
  require 'web_service/simple/response_code_error'
@@ -8,7 +9,7 @@ require 'web_service/simple/parser'
8
9
 
9
10
  module WebService
10
11
  class Simple
11
- VERSION = '0.0.2'
12
+ VERSION = '0.0.4'
12
13
 
13
14
  attr_accessor :base_url
14
15
  attr_accessor :basic_params
@@ -61,7 +62,7 @@ module WebService
61
62
  extra_params = args.shift if args.first.is_a?(Hash)
62
63
  end
63
64
 
64
- params = @basic_params.merge(extra_params).map { |k, v| "#{ URI.escape(k.to_s) }=#{ URI.escape(v.to_s) }" } * '&'
65
+ params = escape_query(@basic_params.merge(extra_params))
65
66
  uri = URI("#{ @base_url }#{ extra_path }?#{ params }")
66
67
 
67
68
  log "Request URL is #{ uri }"
@@ -76,6 +77,28 @@ module WebService
76
77
  Response.new(response.body, response_parser)
77
78
  end
78
79
 
80
+ def post(*args)
81
+ extra_path, extra_params = nil, {}
82
+
83
+ if args.first.is_a?(Hash)
84
+ extra_params = args.shift
85
+ else
86
+ extra_path = args.shift
87
+ extra_params = args.shift if args.first.is_a?(Hash)
88
+ end
89
+
90
+ params = escape_query(@basic_params.merge(extra_params))
91
+ uri = URI("#{ @base_url }#{ extra_path }")
92
+
93
+ log "Request URL is #{ uri } (data: #{ params })"
94
+
95
+ response = nil
96
+ Net::HTTP.start(uri.host, uri.port) { |http| response = http.post(uri.request_uri, params) }
97
+ raise ResponseCodeError.new(response) unless response.code == '200'
98
+
99
+ Response.new(response.body, response_parser)
100
+ end
101
+
79
102
  private
80
103
  def underscore(camel_cased_word)
81
104
  camel_cased_word.to_s.gsub(/::/, '/').
@@ -88,5 +111,9 @@ module WebService
88
111
  def log(message)
89
112
  logger.info "[WebService::Simple] #{message}" if @debug
90
113
  end
114
+
115
+ def escape_query(query)
116
+ query.map { |k, v| "#{ CGI.escape(k.to_s) }=#{ CGI.escape(v.to_s) }" } * '&'
117
+ end
91
118
  end
92
119
  end
@@ -175,4 +175,76 @@ describe WebService::Simple do
175
175
  end
176
176
  end
177
177
  end
178
+
179
+ describe '#post' do
180
+ before do
181
+ FakeWeb.clean_registry
182
+ FakeWeb.allow_net_connect = false
183
+ end
184
+
185
+ before do
186
+ @service = WebService::Simple.new(:base_url => 'http://api.example.com', :param => { :key => 'xxx' })
187
+ end
188
+
189
+ before do
190
+ @io = StringIO.new
191
+ @logger = Logger.new(@io)
192
+ end
193
+
194
+ it 'は、POST リクエストを送信して、Response オブジェクトを返すこと' do
195
+ FakeWeb.register_uri(:post, 'http://api.example.com', :body => 'ok')
196
+
197
+ response = @service.post
198
+ response.class.should == WebService::Simple::Response
199
+ response.content.should == 'ok'
200
+ end
201
+
202
+ it 'は、リクエストの結果、レスポンスコードが 200 以外ならば、例外 ResponseCodeError が発生すること' do
203
+ FakeWeb.register_uri(:post, 'http://api.example.com', :body => 'nf', :status => ['404', 'Not Found'])
204
+ begin
205
+ @service.post
206
+ rescue WebService::Simple::ResponseCodeError => e
207
+ e.response_code.should == '404'
208
+ e.response_body.should == 'nf'
209
+ end
210
+ end
211
+
212
+ it 'は、引数に応じて、よしなにリクエストすること' do
213
+ FakeWeb.register_uri(:post, 'http://api.example.com', :body => 'ok1')
214
+ FakeWeb.register_uri(:post, 'http://api.example.com/hage', :body => 'ok2')
215
+
216
+ @service.post(:word => 'yyy').content.should == 'ok1'
217
+ @service.post('/hage', :word => 'yyy').content.should == 'ok2'
218
+ @service.post('/hage').content.should == 'ok2'
219
+ end
220
+
221
+ it 'は、デバッグモードではないならば、ログを出力しないこと' do
222
+ @service.logger = @logger
223
+ @service.debug = false
224
+ @io.string.should be_empty
225
+ end
226
+
227
+ describe 'で、デバッグモードのとき' do
228
+ before do
229
+ FakeWeb.register_uri(:post, @base_url, :body => 'ok')
230
+ @service = WebService::Simple.new(:base_url => @base_url, :debug => true)
231
+ end
232
+
233
+ it 'は、logger に対して INFO レベルのログを出力すること' do
234
+ @logger.level = Logger::INFO
235
+ @service.logger = @logger
236
+ @service.post
237
+
238
+ @io.string.should =~ %r!#{ Regexp.escape(@base_url) }!
239
+ end
240
+
241
+ it 'は、logger が INFO より上のレベルに設定されていればログを出力しないこと' do
242
+ @logger.level = Logger::WARN
243
+ @service.logger = @logger
244
+ @service.post
245
+
246
+ @io.string.should be_empty
247
+ end
248
+ end
249
+ end
178
250
  end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "web_service_simple"
3
- s.version = "0.0.3"
4
- s.date = "2009-08-12"
3
+ s.version = "0.0.4"
4
+ s.date = "2009-09-10"
5
5
  s.summary = "Simple Interface To Web Services APIs (Ruby)"
6
6
  s.email = "info@milk1000.cc"
7
7
  s.homepage = "http://github.com/milk1000cc/web_service_simple"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: milk1000cc-web_service_simple
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - milk1000cc
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-12 00:00:00 -07:00
12
+ date: 2009-09-10 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -41,7 +41,6 @@ files:
41
41
  - web_service_simple.gemspec
42
42
  has_rdoc: true
43
43
  homepage: http://github.com/milk1000cc/web_service_simple
44
- licenses:
45
44
  post_install_message:
46
45
  rdoc_options: []
47
46
 
@@ -62,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
61
  requirements: []
63
62
 
64
63
  rubyforge_project:
65
- rubygems_version: 1.3.5
64
+ rubygems_version: 1.2.0
66
65
  signing_key:
67
66
  specification_version: 2
68
67
  summary: Simple Interface To Web Services APIs (Ruby)