rwsc 0.0.2 → 0.0.3
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/README.ja.rdoc +77 -0
- data/README.rdoc +78 -2
- data/Rakefile +41 -71
- data/VERSION +1 -0
- data/lib/rwsc.rb +2 -0
- data/lib/rwsc/books_total_search.rb +50 -0
- data/lib/rwsc/item_search.rb +3 -26
- data/lib/rwsc/operation.rb +1 -1
- data/lib/rwsc/searcher.rb +33 -0
- data/lib/rwsc/version.rb +7 -4
- data/lib/rwsc/web/web_client.rb +47 -34
- data/spec/rwsc/version_spec.rb +25 -1
- data/spec/rwsc/web/web_client_spec.rb +32 -0
- data/spec/spec_helper.rb +5 -0
- metadata +33 -18
data/README.ja.rdoc
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
= RWSC
|
2
|
+
RWCはRakuten Web Service Clientの略で、楽天ウエブサービスのRubyラッパライブラリです。
|
3
|
+
|
4
|
+
READMEでは基本的な使い方を説明します。
|
5
|
+
|
6
|
+
== Step 1. gemのインストール
|
7
|
+
sudo gem install rwsc
|
8
|
+
|
9
|
+
== Step 2. Require the gem
|
10
|
+
require 'rubygems'
|
11
|
+
require 'rwsc'
|
12
|
+
|
13
|
+
インストール環境によっては、require 'rubygems'が不要です。
|
14
|
+
|
15
|
+
== Step 3. gemを使って、APIを呼び出す
|
16
|
+
|
17
|
+
result_object = Rwsc::ItemSearch.find(:keyword => "cool stuff that they only have in Japan",
|
18
|
+
:developerId => [Your_Rakuten_Developer_ID]*)
|
19
|
+
|
20
|
+
Other params to try:
|
21
|
+
:developerId
|
22
|
+
:affiliateId
|
23
|
+
:keyword
|
24
|
+
:shopCode
|
25
|
+
:genreId
|
26
|
+
:catalogCode,
|
27
|
+
:hits
|
28
|
+
:page
|
29
|
+
:sort
|
30
|
+
:minPrice
|
31
|
+
:maxPrice
|
32
|
+
:availability
|
33
|
+
:field
|
34
|
+
:carrier
|
35
|
+
:imageFlag
|
36
|
+
:orFlag
|
37
|
+
:NGKeyword
|
38
|
+
:genreInformationFlag
|
39
|
+
:purchaseType
|
40
|
+
|
41
|
+
== Step 4. 検索結果を取得する
|
42
|
+
検索結果データは、ResultItemクラスのインスタンスになります。
|
43
|
+
アンダースコア区切りのメソッドを呼び出すことで、検索結果を取得できます。
|
44
|
+
|
45
|
+
Anyways, these are the keys of the big data_hash:
|
46
|
+
"items"
|
47
|
+
"hits"
|
48
|
+
"args"
|
49
|
+
"status"
|
50
|
+
"carrier"
|
51
|
+
"page_count"
|
52
|
+
"last"
|
53
|
+
"first"
|
54
|
+
"count"
|
55
|
+
"page"
|
56
|
+
|
57
|
+
詳細の情報については、以下の楽天ウェブサービスのページAPIページを参照してください。
|
58
|
+
|
59
|
+
http://webservice.rakuten.co.jp/api/itemsearch/
|
60
|
+
|
61
|
+
== Proxy越しの通信
|
62
|
+
|
63
|
+
proxyサーバを通してしか通信できない環境の場合は、
|
64
|
+
|
65
|
+
Rwsc::Config.proxy_host = "YOUR_PROXY_HOST"
|
66
|
+
Rwsc::Config.proxy_port = YOUR_PROXY_PORT
|
67
|
+
|
68
|
+
を事前に設定しておくことで、プロキシサーバを通しての通信が行えます。
|
69
|
+
|
70
|
+
------------------------------------------------------------------------------------------
|
71
|
+
\*Rakuten_Developer_IDとは?
|
72
|
+
|
73
|
+
以下のリンクから、ユーザ登録を行うことで、ディベロッパーIDを取得できます。
|
74
|
+
http://webservice.rakuten.co.jp/
|
75
|
+
|
76
|
+
** 他にも24のAPIがあります。実装中ですのでお待ちください。
|
77
|
+
|
data/README.rdoc
CHANGED
@@ -1,3 +1,79 @@
|
|
1
1
|
= RWSC
|
2
|
-
|
3
|
-
|
2
|
+
RWSC stands for Rakuten Web Service Client. This is the Rakuten Web Service API Wrapper for Ruby.
|
3
|
+
|
4
|
+
This README covers the basic usage.
|
5
|
+
|
6
|
+
== Step 1. Install the gem:
|
7
|
+
sudo gem install rwsc
|
8
|
+
|
9
|
+
== Step 2. Require the gem (You may need to also require rubygems, depending on your setup):
|
10
|
+
require 'rubygems'
|
11
|
+
require 'rwsc'
|
12
|
+
|
13
|
+
== Step 3. Use the gem to make a call to the API:
|
14
|
+
|
15
|
+
result_object = Rwsc::ItemSearch.find(:keyword => "cool stuff that they only have in Japan", :developerId => [Your_Rakuten_Developer_ID]*)
|
16
|
+
|
17
|
+
Other params to try:
|
18
|
+
:developerId
|
19
|
+
:affiliateId
|
20
|
+
:keyword
|
21
|
+
:shopCode
|
22
|
+
:genreId
|
23
|
+
:catalogCode,
|
24
|
+
:hits
|
25
|
+
:page
|
26
|
+
:sort
|
27
|
+
:minPrice
|
28
|
+
:maxPrice
|
29
|
+
:availability
|
30
|
+
:field
|
31
|
+
:carrier
|
32
|
+
:imageFlag
|
33
|
+
:orFlag
|
34
|
+
:NGKeyword
|
35
|
+
:genreInformationFlag
|
36
|
+
:purchaseType
|
37
|
+
|
38
|
+
|
39
|
+
== Step 4. Get a response:
|
40
|
+
|
41
|
+
The information you get is in a data_hash, wrapped in the result_object. To access any underlying data, just
|
42
|
+
call the keys of the hash as methods on your result_object. (ie. result_object.items)
|
43
|
+
|
44
|
+
This is a hash of hashes and arrays, so you might have to drill down to get the info you're looking for.
|
45
|
+
|
46
|
+
Anyways, these are the keys of the big data_hash:
|
47
|
+
"items"
|
48
|
+
"hits"
|
49
|
+
"args"
|
50
|
+
"status"
|
51
|
+
"carrier"
|
52
|
+
"page_count"
|
53
|
+
"last"
|
54
|
+
"first"
|
55
|
+
"count"
|
56
|
+
"page"
|
57
|
+
|
58
|
+
For more info on what is supported by this particular API (Item search), check out http://webservice.rakuten.co.jp/api/itemsearch/ **
|
59
|
+
|
60
|
+
With google translate as your friend, you should be able to glean the request params and response body.
|
61
|
+
|
62
|
+
== Use of RWSC through a Proxy
|
63
|
+
|
64
|
+
When you have to connect through a proxy server, you should also set these variables before your call to Rwsc::ItemSearch.find:
|
65
|
+
|
66
|
+
Rwsc::Config.proxy_host = "YOUR_PROXY_HOST"
|
67
|
+
Rwsc::Config.proxy_port = YOUR_PROXY_PORT
|
68
|
+
|
69
|
+
|
70
|
+
------------------------------------------------------------------------------------------
|
71
|
+
*What's that? You don't have a Rakuten developer ID?
|
72
|
+
You can click the top link on the blue box in the upper left corner on this page:
|
73
|
+
http://webservice.rakuten.co.jp/
|
74
|
+
|
75
|
+
With good luck and google translate, you might be able to get by.
|
76
|
+
But feel free to get in touch with github.com/evanburchard if you have any questions.
|
77
|
+
|
78
|
+
|
79
|
+
**And yes, those are 24 other APIs to the left, just waiting to be implemented. Fork away!
|
data/Rakefile
CHANGED
@@ -2,14 +2,11 @@
|
|
2
2
|
require 'rubygems'
|
3
3
|
require 'rake'
|
4
4
|
require 'spec/rake/spectask'
|
5
|
-
require '
|
6
|
-
require "rtask"
|
7
|
-
|
5
|
+
require 'jeweler'
|
8
6
|
|
9
7
|
# return rspec options
|
10
8
|
def set_speck_opt(t)
|
11
9
|
t.spec_files = FileList['spec/**/*_spec.rb']
|
12
|
-
t.spec_opts = ['--color']
|
13
10
|
t.warning = true
|
14
11
|
end
|
15
12
|
|
@@ -26,6 +23,22 @@ Spec::Rake::SpecTask.new('spec:rcov') do |t|
|
|
26
23
|
t.rcov = true
|
27
24
|
end
|
28
25
|
|
26
|
+
|
27
|
+
require 'rake/rdoctask'
|
28
|
+
Rake::RDocTask.new do |rdoc|
|
29
|
+
begin
|
30
|
+
version = File.read('VERSION').chomp
|
31
|
+
rescue
|
32
|
+
version = "0.0.0"
|
33
|
+
puts "No version is set in file VERSION. Set by default to #{version}"
|
34
|
+
end
|
35
|
+
|
36
|
+
rdoc.rdoc_dir = 'rdoc'
|
37
|
+
rdoc.title = "rwsc #{version}"
|
38
|
+
rdoc.rdoc_files.include('README*')
|
39
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
40
|
+
end
|
41
|
+
|
29
42
|
# gem tasks
|
30
43
|
PKG_FILES = FileList[
|
31
44
|
'[A-Z]*',
|
@@ -36,81 +49,38 @@ PKG_FILES = FileList[
|
|
36
49
|
'spec/**/*.rb',
|
37
50
|
]
|
38
51
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
class RTask
|
48
|
-
# overwrite init_spec
|
49
|
-
# get version automaticaly .
|
50
|
-
# get package files automaticaly .
|
51
|
-
def init_spec
|
52
|
-
::Gem::Specification.new do |s|
|
53
|
-
s.name = "rwsc"
|
54
|
-
s.rubyforge_project = s.name
|
55
|
-
s.version = CURRENT_VERSION
|
56
|
-
s.summary = "Rakuten Webservice client library"
|
57
|
-
s.description = <<-EOS
|
52
|
+
begin
|
53
|
+
require 'jeweler'
|
54
|
+
Jeweler::Tasks.new do |gemspec|
|
55
|
+
gemspec.name = "rwsc"
|
56
|
+
gemspec.rubyforge_project = gemspec.name
|
57
|
+
gemspec.summary = "Rakuten Webservice client library"
|
58
|
+
gemspec.description = "<<-EOS
|
58
59
|
Rakuten Webservice client library
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
s.files = PKG_FILES.to_a
|
60
|
+
EOS"
|
61
|
+
gemspec.email = ["byplayer100@gmail.com",
|
62
|
+
"takayoshi.kohayakawa@mail.rakuten.co.jp"]
|
63
|
+
gemspec.homepage = "http://wiki.github.com/byplayer/rwsc"
|
64
|
+
gemspec.authors = ["byplayer", "takayoshi kohayakawa"]
|
66
65
|
|
67
|
-
|
66
|
+
gemspec.files = PKG_FILES.to_a
|
68
67
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
s.extra_rdoc_files = ["README.rdoc"]
|
73
|
-
|
74
|
-
s.add_dependency('nokogiri')
|
75
|
-
s.add_dependency('rspec')
|
76
|
-
end
|
77
|
-
end
|
68
|
+
gemspec.require_path = 'lib'
|
69
|
+
gemspec.rdoc_options << '--line-numbers' << '--inline-source' <<
|
70
|
+
"--main" << "README.rdoc" << "-c UTF-8"
|
78
71
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
PKG_FILES.to_a
|
72
|
+
gemspec.extra_rdoc_files = ["README.rdoc"]
|
73
|
+
gemspec.add_dependency('nokogiri')
|
74
|
+
gemspec.add_dependency('rspec')
|
83
75
|
end
|
84
76
|
|
85
|
-
|
86
|
-
base_name = "#{@package}-#{@version}"
|
87
|
-
tgz_name = "#{base_name}.tgz"
|
77
|
+
Jeweler::GemcutterTasks.new
|
88
78
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
manifest.each do |fname|
|
93
|
-
to_fname = File.join(to_base, fname)
|
94
|
-
FileUtils.mkdir_p(File.dirname(to_fname))
|
95
|
-
FileUtils.copy_entry(fname, to_fname)
|
96
|
-
end
|
97
|
-
|
98
|
-
sh "tar -c -z -f #{tgz_name} #{base_name}"
|
99
|
-
|
100
|
-
FileUtils.remove_entry(to_base)
|
79
|
+
Jeweler::RubyforgeTasks.new do |rubyforge|
|
80
|
+
rubyforge.doc_task = "rdoc"
|
101
81
|
end
|
102
82
|
|
103
|
-
|
104
|
-
|
105
|
-
Rake::RDocTask.new do |doc|
|
106
|
-
doc.title = "#{@package}-#{@version} documentation"
|
107
|
-
doc.main = "README.rdoc"
|
108
|
-
doc.rdoc_files.include(manifest)
|
109
|
-
doc.options << "--line-numbers" << "--inline-source" << "-c UTF-8"
|
110
|
-
yield doc if block_given?
|
111
|
-
end
|
112
|
-
end
|
83
|
+
rescue LoadError
|
84
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
113
85
|
end
|
114
86
|
|
115
|
-
# create rtask tasks
|
116
|
-
RTask.new
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.3
|
data/lib/rwsc.rb
CHANGED
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'rwsc/searcher'
|
3
|
+
require 'rwsc/result_item'
|
4
|
+
|
5
|
+
module Rwsc
|
6
|
+
# = BooksTotalSearch class
|
7
|
+
# this class is BooksTotalSearch API wrapper .
|
8
|
+
class BooksTotalSearch < ResultItem
|
9
|
+
extend Searcher
|
10
|
+
|
11
|
+
private
|
12
|
+
MUST_ITEMS = [:developerId]
|
13
|
+
|
14
|
+
def self.must_items
|
15
|
+
MUST_ITEMS
|
16
|
+
end
|
17
|
+
|
18
|
+
ACCEPT_ITEMS = [
|
19
|
+
:developerId,
|
20
|
+
:affiliateId,
|
21
|
+
:keyword,
|
22
|
+
:booksGenreId,
|
23
|
+
:hits,
|
24
|
+
:page,
|
25
|
+
:availability,
|
26
|
+
:outOfStockFlag,
|
27
|
+
:sort,
|
28
|
+
:field,
|
29
|
+
:carrier,
|
30
|
+
:orFlag,
|
31
|
+
:NGKeyword,
|
32
|
+
:genreInformationFlag
|
33
|
+
]
|
34
|
+
|
35
|
+
def self.accept_items
|
36
|
+
ACCEPT_ITEMS
|
37
|
+
end
|
38
|
+
|
39
|
+
# == Additional Rakuten web service call option
|
40
|
+
ADD_RWSC_OPTS = {
|
41
|
+
:version => CONST::API_VERSION,
|
42
|
+
:operation => OPERATION::BOOKS_TOTAL_SEARCH,
|
43
|
+
}
|
44
|
+
|
45
|
+
# == get additional Rakuten web service call option
|
46
|
+
def self.add_rwsc_opts
|
47
|
+
ADD_RWSC_OPTS
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/rwsc/item_search.rb
CHANGED
@@ -1,30 +1,12 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
require 'rwsc/
|
2
|
+
require 'rwsc/searcher'
|
3
|
+
require 'rwsc/result_item'
|
3
4
|
|
4
5
|
module Rwsc
|
5
6
|
# = ItemSearch class
|
6
7
|
# this class is ItemSearch API wrapper .
|
7
8
|
class ItemSearch < ResultItem
|
8
|
-
|
9
|
-
def self.find(opts)
|
10
|
-
if opts.nil?
|
11
|
-
raise ArgError.new('no options')
|
12
|
-
end
|
13
|
-
|
14
|
-
self.must_items.each do |item|
|
15
|
-
unless opts.include? item
|
16
|
-
raise ArgError.new("#{item.to_s} needed")
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
opts.each do |key, val|
|
21
|
-
unless accept_items.include? key
|
22
|
-
raise ArgError.new("#{key.to_s} is invalid option")
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
self.rws_call(opts.merge(self.add_rwsc_opts))
|
27
|
-
end
|
9
|
+
extend Searcher
|
28
10
|
|
29
11
|
private
|
30
12
|
MUST_ITEMS = [:developerId]
|
@@ -69,10 +51,5 @@ module Rwsc
|
|
69
51
|
def self.add_rwsc_opts
|
70
52
|
ADD_RWSC_OPTS
|
71
53
|
end
|
72
|
-
|
73
|
-
# == Rakuten web service call function
|
74
|
-
def self.rws_call(opts)
|
75
|
-
Rwsc::Web::WebClient.get_result(opts)
|
76
|
-
end
|
77
54
|
end
|
78
55
|
end
|
data/lib/rwsc/operation.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'rwsc/web/web_client'
|
3
|
+
require 'rwsc/result_item'
|
4
|
+
|
5
|
+
module Rwsc
|
6
|
+
module Searcher
|
7
|
+
# == find item .
|
8
|
+
def find(opts)
|
9
|
+
if opts.nil?
|
10
|
+
raise ArgError.new('no options')
|
11
|
+
end
|
12
|
+
|
13
|
+
self.must_items.each do |item|
|
14
|
+
unless opts.include? item
|
15
|
+
raise ArgError.new("#{item.to_s} needed")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
opts.each do |key, val|
|
20
|
+
unless accept_items.include? key
|
21
|
+
raise ArgError.new("#{key.to_s} is invalid option")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
self.rws_call(opts.merge(self.add_rwsc_opts))
|
26
|
+
end
|
27
|
+
|
28
|
+
# == Rakuten web service call function
|
29
|
+
def rws_call(opts)
|
30
|
+
Rwsc::Web::WebClient.get_result(opts)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/rwsc/version.rb
CHANGED
@@ -2,10 +2,13 @@
|
|
2
2
|
|
3
3
|
module Rwsc
|
4
4
|
module VERSION
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
STRING =
|
6
|
+
File.open(
|
7
|
+
File.join(
|
8
|
+
File.dirname(__FILE__), '..', '..', 'VERSION'), 'r'){ |f| f.gets.chomp }
|
8
9
|
|
9
|
-
|
10
|
+
MAJOR = $1.to_i if STRING =~ /^([0-9]+)\.([0-9]+)\.([0-9]+)/
|
11
|
+
MINOR = $2.to_i if STRING =~ /^([0-9]+)\.([0-9]+)\.([0-9]+)/
|
12
|
+
TINY = $3.to_i if STRING =~ /^([0-9]+)\.([0-9]+)\.([0-9]+)/
|
10
13
|
end
|
11
14
|
end
|
data/lib/rwsc/web/web_client.rb
CHANGED
@@ -9,25 +9,33 @@ module Rwsc
|
|
9
9
|
|
10
10
|
# = this class is Rakuten WebSearch web client .
|
11
11
|
class WebClient
|
12
|
+
def initialize operation
|
13
|
+
@operation = operation
|
14
|
+
end
|
15
|
+
|
12
16
|
# == this method call webservice api .
|
13
17
|
def self.get_result(opts)
|
14
|
-
WebClient.new.
|
18
|
+
return WebClient.new(opts[:operation]).get_result(opts)
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_result(opts)
|
22
|
+
parse_result(get_api_result(opts).body)
|
15
23
|
end
|
16
24
|
|
25
|
+
private
|
17
26
|
# == try proxy connect
|
18
27
|
# use proxy connect if set proxy configuration .
|
19
|
-
def
|
28
|
+
def get_api_result(opts)
|
20
29
|
uri = generate_uri(opts)
|
21
30
|
|
22
31
|
Net::HTTP.Proxy(Config.proxy_host,
|
23
32
|
Config.proxy_port).start(uri.host, uri.port) do |http|
|
24
33
|
res = http.get("#{uri.path}?#{uri.query}",
|
25
34
|
{'User-Agent' => Rwsc::CONST::USER_AGENT})
|
26
|
-
|
35
|
+
return res
|
27
36
|
end
|
28
37
|
end
|
29
38
|
|
30
|
-
private
|
31
39
|
# == generate uri object from opts .
|
32
40
|
def generate_uri(opts)
|
33
41
|
url = Rwsc::CONST::WS_URL + "?"
|
@@ -41,46 +49,51 @@ module Rwsc
|
|
41
49
|
end
|
42
50
|
|
43
51
|
# == parse xml items
|
44
|
-
def parse_result(
|
45
|
-
@
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
+
def parse_result(xml_string)
|
53
|
+
@doc = Nokogiri::XML(xml_string)
|
54
|
+
@namespaces = {}
|
55
|
+
@doc.traverse { |d| @namespaces.merge! d.namespaces }
|
56
|
+
|
57
|
+
#@item_search = ItemSearch.new
|
58
|
+
@result_item = eval("#{@operation}.new")
|
59
|
+
parse_status()
|
60
|
+
parse_args()
|
61
|
+
parse_common_info()
|
62
|
+
parse_items()
|
63
|
+
|
64
|
+
@result_item
|
52
65
|
end
|
53
66
|
|
54
67
|
# == parse status
|
55
68
|
# if status is not success, this function raise
|
56
69
|
#
|
57
|
-
def parse_status(
|
70
|
+
def parse_status()
|
58
71
|
status = Status.new
|
59
|
-
status.status = first_item_content(
|
72
|
+
status.status = first_item_content('/Response/header:Header/Status')
|
60
73
|
status.status_msg =
|
61
|
-
first_item_content(
|
62
|
-
@
|
74
|
+
first_item_content('/Response/header:Header/StatusMsg')
|
75
|
+
@result_item.status = status
|
63
76
|
|
64
|
-
unless @
|
65
|
-
raise StatusError.new("API Error(#{@
|
66
|
-
"#{@
|
77
|
+
unless @result_item.status.status == Status::SUCCESS
|
78
|
+
raise StatusError.new("API Error(#{@result_item.status.status}):" +
|
79
|
+
"#{@result_item.status.status_msg}")
|
67
80
|
end
|
68
81
|
end
|
69
82
|
|
70
83
|
# == parse ARG items
|
71
|
-
def parse_args(
|
84
|
+
def parse_args()
|
72
85
|
args = []
|
73
|
-
doc.xpath('/Response/header:Header/Args/Arg',
|
86
|
+
@doc.xpath('/Response/header:Header/Args/Arg', @namespaces).each do |a|
|
74
87
|
args << Arg.new(a.attribute('key'),
|
75
88
|
a.attribute('value'),
|
76
89
|
a.content)
|
77
90
|
end
|
78
91
|
|
79
|
-
@
|
92
|
+
@result_item.args = args
|
80
93
|
end
|
81
94
|
|
82
95
|
# == parse common info
|
83
|
-
def parse_common_info(
|
96
|
+
def parse_common_info()
|
84
97
|
{
|
85
98
|
'count' => 'count',
|
86
99
|
'page' => 'page',
|
@@ -90,18 +103,18 @@ module Rwsc
|
|
90
103
|
'carrier' => 'carrier',
|
91
104
|
'pageCount' => 'page_count',
|
92
105
|
}.each do |xml_tag, func|
|
93
|
-
@
|
94
|
-
first_item_content(
|
95
|
-
"/Response/Body
|
106
|
+
@result_item.send("#{func}=",
|
107
|
+
first_item_content(
|
108
|
+
"/Response/Body/#{@operation[0,1].downcase + @operation[1,@operation.length]}:#{@operation}/#{xml_tag}"))
|
96
109
|
end
|
97
110
|
end
|
98
111
|
|
99
112
|
# == parse items
|
100
|
-
def parse_items(
|
113
|
+
def parse_items()
|
101
114
|
items = []
|
102
115
|
|
103
|
-
doc.xpath(
|
104
|
-
|
116
|
+
@doc.xpath("/Response/Body/#{@operation[0,1].downcase + @operation[1,@operation.length]}:#{@operation}/Items/Item",
|
117
|
+
@namespaces).each do |i|
|
105
118
|
item = ResultItem.new
|
106
119
|
|
107
120
|
i.children.each do |element|
|
@@ -113,13 +126,13 @@ module Rwsc
|
|
113
126
|
items << item
|
114
127
|
end
|
115
128
|
|
116
|
-
@
|
129
|
+
@result_item.items = items
|
117
130
|
end
|
118
131
|
|
119
132
|
# == get first item
|
120
133
|
# if item not exists, return nil
|
121
|
-
def first_item(
|
122
|
-
items = doc.xpath(xpath,
|
134
|
+
def first_item(xpath)
|
135
|
+
items = @doc.xpath(xpath, @namespaces)
|
123
136
|
if items && !items.empty?
|
124
137
|
return items.first
|
125
138
|
end
|
@@ -129,8 +142,8 @@ module Rwsc
|
|
129
142
|
|
130
143
|
# == get first item content
|
131
144
|
# if item not exist, return nil
|
132
|
-
def first_item_content(
|
133
|
-
item = first_item(
|
145
|
+
def first_item_content(xpath)
|
146
|
+
item = first_item(xpath)
|
134
147
|
if item
|
135
148
|
return item.content
|
136
149
|
end
|
data/spec/rwsc/version_spec.rb
CHANGED
@@ -4,10 +4,34 @@ require File.expand_path(File.join(File.dirname(__FILE__),
|
|
4
4
|
'..', 'spec_helper'))
|
5
5
|
require 'rwsc/version'
|
6
6
|
|
7
|
-
describe Rwsc::VERSION do
|
7
|
+
describe "Rwsc::VERSION::STRING" do
|
8
8
|
subject { Rwsc::VERSION::STRING }
|
9
9
|
|
10
10
|
it { should == "#{Rwsc::VERSION::MAJOR}." +
|
11
11
|
"#{Rwsc::VERSION::MINOR}." +
|
12
12
|
"#{Rwsc::VERSION::TINY}" }
|
13
|
+
|
14
|
+
it { should == File.open(
|
15
|
+
File.join(
|
16
|
+
File.dirname(__FILE__), '..', '..',
|
17
|
+
'VERSION'), 'r'){ |f| f.gets.chomp } }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "Rwsc::VERSION numbers" do
|
21
|
+
before(:each) do
|
22
|
+
@file_version =
|
23
|
+
File.open(
|
24
|
+
File.join(
|
25
|
+
File.dirname(__FILE__), '..', '..',
|
26
|
+
'VERSION'), 'r'){ |f| f.gets.chomp }
|
27
|
+
if @file_version =~ /^([0-9]+)\.([0-9]+)\.([0-9]+)/
|
28
|
+
@file_major = $1.to_i
|
29
|
+
@file_minor = $2.to_i
|
30
|
+
@file_tiny = $3.to_i
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
it { Rwsc::VERSION::MAJOR.should == @file_major }
|
35
|
+
it { Rwsc::VERSION::MINOR.should == @file_minor }
|
36
|
+
it { Rwsc::VERSION::TINY.should == @file_tiny }
|
13
37
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
3
|
+
'..','..', 'spec_helper'))
|
4
|
+
require 'rwsc'
|
5
|
+
|
6
|
+
|
7
|
+
describe Rwsc::Web::WebClient do
|
8
|
+
SEARCH_OPTS = {
|
9
|
+
:affiliateId=>"testAflId",
|
10
|
+
:operation=>"ItemSearch",
|
11
|
+
:keyword=>"sample",
|
12
|
+
:version=>"2009-04-15",
|
13
|
+
:developerId=>"testdeveloperId"
|
14
|
+
}
|
15
|
+
|
16
|
+
subject {
|
17
|
+
wc = Rwsc::Web::WebClient.new(SEARCH_OPTS[:operation])
|
18
|
+
|
19
|
+
http_res = Object.new
|
20
|
+
mock(http_res).body{
|
21
|
+
body = ''
|
22
|
+
File.open(File.join(File.dirname(__FILE__), 'sample.xml')){ |f|
|
23
|
+
body = f.read
|
24
|
+
}
|
25
|
+
body
|
26
|
+
}
|
27
|
+
mock(wc).get_api_result(SEARCH_OPTS){ http_res }
|
28
|
+
wc.get_result(SEARCH_OPTS)
|
29
|
+
}
|
30
|
+
|
31
|
+
it { subject.items.size.should == 30 }
|
32
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -3,4 +3,9 @@ require 'rubygems'
|
|
3
3
|
require 'spec'
|
4
4
|
|
5
5
|
$:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
6
|
+
Dir[File.dirname(__FILE__) + "/mock/**/*.rb"].each {|f| require f}
|
6
7
|
Dir[File.dirname(__FILE__) + "/matchers/**/*.rb"].each {|f| require f}
|
8
|
+
|
9
|
+
Spec::Runner.configure do |config|
|
10
|
+
config.mock_with :rr
|
11
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rwsc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- byplayer
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-
|
13
|
+
date: 2009-12-28 00:00:00 +09:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -33,9 +33,10 @@ dependencies:
|
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: "0"
|
35
35
|
version:
|
36
|
-
description:
|
36
|
+
description: |-
|
37
|
+
<<-EOS
|
37
38
|
Rakuten Webservice client library
|
38
|
-
|
39
|
+
EOS
|
39
40
|
email:
|
40
41
|
- byplayer100@gmail.com
|
41
42
|
- takayoshi.kohayakawa@mail.rakuten.co.jp
|
@@ -47,35 +48,41 @@ extra_rdoc_files:
|
|
47
48
|
- README.rdoc
|
48
49
|
files:
|
49
50
|
- MIT-LICENSE
|
50
|
-
-
|
51
|
+
- README.ja.rdoc
|
51
52
|
- README.rdoc
|
52
|
-
-
|
53
|
+
- Rakefile
|
54
|
+
- VERSION
|
55
|
+
- lib/rwsc.rb
|
53
56
|
- lib/rwsc/arg.rb
|
54
|
-
- lib/rwsc/
|
57
|
+
- lib/rwsc/arg_error.rb
|
58
|
+
- lib/rwsc/books_total_search.rb
|
55
59
|
- lib/rwsc/config.rb
|
60
|
+
- lib/rwsc/const.rb
|
61
|
+
- lib/rwsc/item_search.rb
|
56
62
|
- lib/rwsc/operation.rb
|
57
|
-
- lib/rwsc/arg_error.rb
|
58
63
|
- lib/rwsc/result_item.rb
|
59
|
-
- lib/rwsc/
|
60
|
-
- lib/rwsc/version.rb
|
64
|
+
- lib/rwsc/searcher.rb
|
61
65
|
- lib/rwsc/status.rb
|
62
|
-
- lib/rwsc/const.rb
|
63
66
|
- lib/rwsc/status_error.rb
|
64
|
-
- lib/rwsc.rb
|
65
|
-
-
|
66
|
-
-
|
67
|
-
- spec/
|
67
|
+
- lib/rwsc/utils/string_utils.rb
|
68
|
+
- lib/rwsc/version.rb
|
69
|
+
- lib/rwsc/web/web_client.rb
|
70
|
+
- spec/matchers/utils/be_underscore_of.rb
|
68
71
|
- spec/rwsc/arg_error_spec.rb
|
72
|
+
- spec/rwsc/config_spec.rb
|
73
|
+
- spec/rwsc/const_spec.rb
|
69
74
|
- spec/rwsc/item_search_spec.rb
|
75
|
+
- spec/rwsc/utils/string_utils_spec.rb
|
70
76
|
- spec/rwsc/version_spec.rb
|
77
|
+
- spec/rwsc/web/web_client_spec.rb
|
71
78
|
- spec/spec_helper.rb
|
72
|
-
- spec/matchers/utils/be_underscore_of.rb
|
73
79
|
has_rdoc: true
|
74
80
|
homepage: http://wiki.github.com/byplayer/rwsc
|
75
81
|
licenses: []
|
76
82
|
|
77
83
|
post_install_message:
|
78
84
|
rdoc_options:
|
85
|
+
- --charset=UTF-8
|
79
86
|
- --line-numbers
|
80
87
|
- --inline-source
|
81
88
|
- --main
|
@@ -102,5 +109,13 @@ rubygems_version: 1.3.5
|
|
102
109
|
signing_key:
|
103
110
|
specification_version: 3
|
104
111
|
summary: Rakuten Webservice client library
|
105
|
-
test_files:
|
106
|
-
|
112
|
+
test_files:
|
113
|
+
- spec/rwsc/const_spec.rb
|
114
|
+
- spec/rwsc/web/web_client_spec.rb
|
115
|
+
- spec/rwsc/utils/string_utils_spec.rb
|
116
|
+
- spec/rwsc/config_spec.rb
|
117
|
+
- spec/rwsc/arg_error_spec.rb
|
118
|
+
- spec/rwsc/item_search_spec.rb
|
119
|
+
- spec/rwsc/version_spec.rb
|
120
|
+
- spec/spec_helper.rb
|
121
|
+
- spec/matchers/utils/be_underscore_of.rb
|