milk1000cc-web_service_simple 0.0.3 → 0.0.4

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.
@@ -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)