unageanu-clickclient_scrap 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.
Files changed (3) hide show
  1. data/README +1 -0
  2. data/lib/clickclient_scrap.rb +229 -124
  3. metadata +2 -2
data/README CHANGED
@@ -8,6 +8,7 @@
8
8
  - ログイン
9
9
  - ログアウト
10
10
  - レート一覧の取得
11
+ - 指値注文
11
12
 
12
13
  ===注意事項
13
14
  - スクレイピングによるアクセスのため、Webサイトの仕様変更等により
@@ -2,8 +2,7 @@ begin
2
2
  require 'rubygems'
3
3
  rescue LoadError
4
4
  end
5
- require 'httpclient'
6
- require 'rexml/document'
5
+ require 'mechanize'
7
6
  require 'date'
8
7
  require 'kconv'
9
8
 
@@ -16,11 +15,6 @@ require 'kconv'
16
15
  #クリック証券を利用するためのクライアントライブラリです。携帯向けサイトのスクレイピングにより以下の機能を提供します。
17
16
  #- 外為証拠金取引(FX)取引
18
17
  #
19
- #====依存モジュール
20
- #「{httpclient}[http://dev.ctor.org/http-access2]」を利用しています。以下のコマンドを実行してインストールしてください。
21
- #
22
- # gem install httpclient --source http://dev.ctor.org/download/
23
- #
24
18
  #====基本的な使い方
25
19
  #
26
20
  # require 'clickclient'
@@ -29,7 +23,7 @@ require 'kconv'
29
23
  # # c = ClickClient::Client.new https://<プロキシホスト>:<プロキシポート> # プロキシを利用する場合
30
24
  # c.fx_session( "<ユーザー名>", "<パスワード>" ) { | fx_session |
31
25
  # # 通貨ペア一覧取得
32
- # list = fx_session.list_currency_pairs
26
+ # list = fx_session.list_rates
33
27
  # puts list
34
28
  # }
35
29
  #
@@ -42,8 +36,66 @@ module ClickClient
42
36
  # クライアント
43
37
  class Client
44
38
  # ホスト名
45
- DEFAULT_HOST_NAME = "https://sec-sso.click-sec.com/mf"
39
+ DEFAULT_HOST_NAME = "https://sec-sso.click-sec.com/mf/"
46
40
 
41
+ #
42
+ #===コンストラクタ
43
+ #
44
+ #*proxy*:: プロキシホストを利用する場合、そのホスト名とパスを指定します。
45
+ # 例) https://proxyhost.com:80
46
+ #
47
+ def initialize( proxy=nil )
48
+ @client = WWW::Mechanize.new {|c|
49
+ # プロキシ
50
+ if proxy
51
+ uri = URI.parse( proxy )
52
+ c.set_proxy( uri.host, uri.port )
53
+ end
54
+ }
55
+ @client.user_agent_alias = 'Windows IE 7'
56
+ @host_name = DEFAULT_HOST_NAME
57
+ end
58
+
59
+ #ログインし、セッションを開始します。
60
+ #-ブロックを指定した場合、引数としてセッションを指定してブロックを実行します。ブロック実行後、ログアウトします。
61
+ #-そうでない場合、セッションを返却します。この場合、ClickClient::FX::FxSession#logoutを実行しログアウトしてください。
62
+ #
63
+ #戻り値:: ClickClient::FX::FxSession
64
+ def fx_session( userid, password, &block )
65
+ page = @client.get(@host_name)
66
+ ClickClient::Client.error(page) if page.forms.length <= 0
67
+ form = page.forms.first
68
+ form.j_username = userid
69
+ form.j_password = password
70
+ result = @client.submit(form, form.buttons.first)
71
+ if result.body.toutf8 =~ /<META HTTP-EQUIV="REFRESH" CONTENT="0;URL=([^"]*)">/
72
+ result = @client.get($1)
73
+ session = FX::FxSession.new( @client, result.links )
74
+ if block_given?
75
+ begin
76
+ yield session
77
+ ensure
78
+ session.logout
79
+ end
80
+ else
81
+ return session
82
+ end
83
+ else
84
+ ClickClient::Client.error( result )
85
+ end
86
+ end
87
+ def self.error( page )
88
+ msgs = page.body.scan( /<font color="red">([^<]*)</ ).flatten
89
+ error = !msgs.empty? ? msgs.map{|m| m.strip}.join(",") : page.body
90
+ raise "operation failed.detail=#{error}".toutf8
91
+ end
92
+
93
+ #ホスト名
94
+ attr :host_name, true
95
+ end
96
+
97
+ module FX
98
+
47
99
  # 通貨ペア: 米ドル-円
48
100
  USDJPY = :USDJPY
49
101
  # 通貨ペア: ユーロ-円
@@ -79,88 +131,52 @@ module ClickClient
79
131
  SELL = 1
80
132
 
81
133
  # 注文タイプ: 通常
82
- ORDER_TYPE_NORMAL = 0
134
+ ORDER_TYPE_MARKET_ORDER = "00"
135
+ # 注文タイプ: 通常
136
+ ORDER_TYPE_NORMAL = "01"
83
137
  # 注文タイプ: IFD
84
- ORDER_TYPE_IFD = 1
138
+ ORDER_TYPE_IFD = "11"
85
139
  # 注文タイプ: OCO
86
- ORDER_TYPE_OCO = 2
140
+ ORDER_TYPE_OCO = "21"
87
141
  # 注文タイプ: IFD-OCO
88
- ORDER_TYPE_IFD_OCO = 3
89
-
90
-
91
- #
92
- #===コンストラクタ
93
- #
94
- #*proxy*:: プロキシホストを利用する場合、そのホスト名とパスを指定します。
95
- # 例) https://proxyhost.com:80
96
- #
97
- def initialize( proxy=nil )
98
- @client = HTTPClient.new( proxy, "Mozilla/5.0")
99
- #@client.debug_dev=STDOUT
100
- @client.set_cookie_store("cookie.dat")
101
- @host_name = DEFAULT_HOST_NAME
102
- end
142
+ ORDER_TYPE_IFD_OCO = "31"
143
+
144
+ # 執行条件: 成行
145
+ EXECUTION_EXPRESSION_MARKET_ORDER = 0
146
+ # 執行条件: 指値
147
+ EXECUTION_EXPRESSION_LIMIT_ORDER = 1
148
+ # 執行条件: 逆指値
149
+ EXECUTION_EXPRESSION_REVERSE_LIMIT_ORDER = 2
103
150
 
104
- #ログインし、セッションを開始します。
105
- #-ブロックを指定した場合、引数としてセッションを指定してブロックを実行します。ブロック実行後、ログアウトします。
106
- #-そうでない場合、セッションを返却します。この場合、ClickClient::FX::FxSession#logoutを実行しログアウトしてください。
107
- #
108
- #戻り値:: ClickClient::FX::CurrencyPairの配列。
109
- #戻り値:: ClickClient::FX::CurrencyPairの配列。
110
- def fx_session( userid, password, &block )
111
- @client.get("#{@host_name}/" )
112
- result = @client.post_content("#{@host_name}/sso-redirect", {
113
- "j_username"=>userid,
114
- "j_password"=>password,
115
- "LoginForm"=>"ログイン".tosjis,
116
- "s"=>"02",
117
- "p"=>"80"
118
- })
119
- if result.toutf8 =~ /<META HTTP-EQUIV="REFRESH" CONTENT="0;URL=([^"]*)">/
120
- uri = URI.parse( $1 )
121
- base = "#{uri.scheme}://#{uri.host}:#{uri.port}"
122
- result = @client.get_content($1)
123
- commands = result.toutf8.scan( /<a[^>]*?href="([^"]*)"[^>]*>([^<]*)<\/a>/).inject({}) {|r,l|
124
- r[l[1]] = "#{base}#{l[0]}"; r
125
- }
126
- session = FX::FxSession.new( @client, commands )
127
- if block_given?
128
- begin
129
- yield session
130
- ensure
131
- session.logout
132
- end
133
- else
134
- return session
135
- end
136
- else
137
- error = result.toutf8 =~ /<font color="red">([^<]*)</ ? $1.strip : result
138
- raise "login failed.detail=#{error}".toutf8
139
- end
140
- end
151
+ # 有効期限: 当日限り
152
+ EXPIRATION_TYPE_TODAY = 0
153
+ # 有効期限: 週末まで
154
+ EXPIRATION_TYPE_WEEK_END = 1
155
+ # 有効期限: 無期限
156
+ EXPIRATION_TYPE_INFINITY = 2
157
+ # 有効期限: 日付指定
158
+ EXPIRATION_TYPE_SPECIFIED = 3
141
159
 
142
- #ホスト名
143
- attr :host_name, true
144
- end
145
-
146
- module FX
147
160
  #=== FX取引のためのセッションクラス
148
161
  #Client#fx_sessionのブロックの引数として渡されます。詳細はClient#fx_sessionを参照ください。
149
162
  class FxSession
150
163
 
151
- def initialize( client, commands )
164
+ def initialize( client, links )
152
165
  @client = client
153
- @commands = commands
166
+ @links = links
154
167
  end
168
+
155
169
  #レート一覧を取得します。
156
170
  #
157
171
  #戻り値:: 通貨ペアをキーとするClickClient::FX::Rateのハッシュ。
158
172
  def list_rates
159
- result = @client.get_content( @commands["レート一覧(新規注文)"] )
173
+ result = @client.click( @links.find {|i|
174
+ i.attributes["accesskey"] == "1"
175
+ })
160
176
  @swaps = list_swaps unless @swaps
161
177
  reg = />([A-Z]+\/[A-Z]+)<\/a>[^\-\.\d]*?([\d]+\.[\d]+\-[\d]+)/
162
- return result.toutf8.scan( reg ).inject({}) {|r,l|
163
- pair = l[0].gsub( /\//, "" ).to_sym
178
+ return result.body.toutf8.scan( reg ).inject({}) {|r,l|
179
+ pair = to_pair( l[0] )
164
180
  swap = @swaps[pair]
165
181
  rate = FxSession.convert_rate l[1]
166
182
  if ( rate && swap )
@@ -189,10 +205,12 @@ module ClickClient
189
205
  #
190
206
  #戻り値:: 通貨ペアをキーとするClickClient::FX::Swapのハッシュ。
191
207
  def list_swaps
192
- result = @client.get_content( @commands["スワップ/証拠金一覧"] )
208
+ result = @client.click( @links.find {|i|
209
+ i.attributes["accesskey"] == "8"
210
+ })
193
211
  reg = /<dd>([A-Z]+\/[A-Z]+) <font[^>]*>売<\/font>[^\-\d]*?([\-\d]+)[^\-\d]*<font[^>]*>買<\/font>[^\-\d]*([\-\d]+)[^\-\d]*<\/dd>/
194
- return result.toutf8.scan( reg ).inject({}) {|r,l|
195
- pair = l[0].gsub( /\//, "" ).to_sym
212
+ return result.body.toutf8.scan( reg ).inject({}) {|r,l|
213
+ pair = to_pair( l[0] )
196
214
  r[pair] = Swap.new( pair, l[1].to_i, l[2].to_i ); r
197
215
  }
198
216
  end
@@ -200,66 +218,153 @@ module ClickClient
200
218
  #
201
219
  #注文を行います。
202
220
  #
203
- #*currency_pair_code*:: 通貨ペアコード(必須)
204
- #*sell_or_buy*:: 売買区分。ClickClient::FX::BUY,ClickClient::FX::SELLのいずれかを指定します。(必須)
205
- #*unit*:: 取引数量(必須)
206
- #*options*:: 注文のオプション。注文方法に応じて以下の情報を設定できます。
221
+ #currency_pair_code:: 通貨ペアコード(必須)
222
+ #sell_or_buy:: 売買区分。ClickClient::FX::BUY,ClickClient::FX::SELLのいずれかを指定します。(必須)
223
+ #unit:: 取引数量(必須)
224
+ #options:: 注文のオプション。注文方法に応じて以下の情報を設定できます。
225
+ # - <b>成り行き注文</b>
226
+ # - <tt>:slippage</tt> .. スリッページ (オプション)
227
+ # - <tt>:slippage_base_rate</tt> .. スリッページの基準となる取引レート(スリッページが指定された場合、必須。)
207
228
  # - <b>通常注文</b> ※注文レートが設定されていれば通常取引となります。
208
229
  # - <tt>:rate</tt> .. 注文レート(必須)
209
230
  # - <tt>:execution_expression</tt> .. 執行条件。ClickClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER等を指定します(必須)
210
231
  # - <tt>:expiration_type</tt> .. 有効期限。ClickClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須)
211
232
  # - <tt>:expiration_date</tt> .. 有効期限が「日付指定(ClickClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須)
212
- #<b>戻り値</b>:: ClickClient::FX::OrderResult
233
+ # - <b>OCO注文</b> ※逆指値レートが設定されていればOCO取引となります。
234
+ # - <tt>:rate</tt> .. 注文レート(必須)
235
+ # - <tt>:stop_order_rate</tt> .. 逆指値レート(必須)
236
+ # - <tt>:expiration_type</tt> .. 有効期限。ClickClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須)
237
+ # - <tt>:expiration_date</tt> .. 有効期限が「日付指定(ClickClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須)
238
+ # - <b>IFD注文</b> ※決済取引の指定があればIFD取引となります。
239
+ # - <tt>:rate</tt> .. 注文レート(必須)
240
+ # - <tt>:execution_expression</tt> .. 執行条件。ClickClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER等を指定します(必須)
241
+ # - <tt>:expiration_type</tt> .. 有効期限。ClickClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須)
242
+ # - <tt>:expiration_date</tt> .. 有効期限が「日付指定(ClickClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須)
243
+ # - <tt>:settle</tt> .. 決済取引の指定。マップで指定します。
244
+ # - <tt>:unit</tt> .. 決済取引の取引数量(必須)
245
+ # - <tt>:sell_or_buy</tt> .. 決済取引の売買区分。ClickClient::FX::BUY,ClickClient::FX::SELLのいずれかを指定します。(必須)
246
+ # - <tt>:rate</tt> .. 決済取引の注文レート(必須)
247
+ # - <tt>:execution_expression</tt> .. 決済取引の執行条件。ClickClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER等を指定します(必須)
248
+ # - <tt>:expiration_type</tt> .. 決済取引の有効期限。ClickClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須)
249
+ # - <tt>:expiration_date</tt> .. 決済取引の有効期限が「日付指定(ClickClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須)
250
+ # - <b>IFD-OCO注文</b> ※決済取引の指定と逆指値レートの指定があればIFD-OCO取引となります。
251
+ # - <tt>:rate</tt> .. 注文レート(必須)
252
+ # - <tt>:execution_expression</tt> .. 執行条件。ClickClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER等を指定します(必須)
253
+ # - <tt>:expiration_type</tt> .. 有効期限。ClickClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須)
254
+ # - <tt>:expiration_date</tt> .. 有効期限が「日付指定(ClickClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須)
255
+ # - <tt>:settle</tt> .. 決済取引の指定。マップで指定します。
256
+ # - <tt>:unit</tt> .. 決済取引の取引数量(必須)
257
+ # - <tt>:sell_or_buy</tt> .. 決済取引の売買区分。ClickClient::FX::BUY,ClickClient::FX::SELLのいずれかを指定します。(必須)
258
+ # - <tt>:rate</tt> .. 決済取引の注文レート(必須)
259
+ # - <tt>:stop_order_rate</tt> .. 決済取引の逆指値レート(必須)
260
+ # - <tt>:expiration_type</tt> .. 決済取引の有効期限。ClickClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須)
261
+ # - <tt>:expiration_date</tt> .. 決済取引の有効期限が「日付指定(ClickClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須)
262
+ #戻り値:: ClickClient::FX::OrderResult TODO
213
263
  #
214
264
  def order ( currency_pair_code, sell_or_buy, unit, options={} )
215
- result = @client.get_content( @commands["レート一覧(新規注文)"] )
216
- if result.toutf8 =~ /<form[~>]?*action="([^"]*)"[~>]*>(.*?<select name="P001"[^>]*>(.*)<\/select>.*?<select name="P100"[^>]*>(.*)<\/select>.*)<\/form>)/m
217
- action = $1
218
- p001 = $3
219
- p100 = $4
220
- hidden = $2
221
- # 通貨ペア
222
- pairs = p001.scan( /<option value="([^"]+)">([A-Z]+\/[A-Z]+)/m ).inject({}) {|r,l|
223
- pair = l[1].gsub( /\//, "" ).to_sym
224
- r[pair] = l[0]; r
225
- }
226
- # 取り引き種別
227
- type = p100.scan( /<option value="([^"]+)">([^\s]+)/m ).inject({}) {|r,l|
228
- r[l[1]] = l[0]; r
229
- }
230
- # hidden
231
- params = hidden.scan( /<input type="hidden" name="([^"]+)" value="([^"]+)">/m ).inject({}) {|r,l|
232
- r[l[1]] = l[0]; r
233
- }
265
+
266
+ # 取り引き種別の判別とパラメータチェック
267
+ type = ORDER_TYPE_MARKET_ORDER
268
+ if ( options[:settle] != nil )
269
+ if ( options[:settle][:stop_order_rate] != nil)
270
+ # 逆指値レートと決済取引の指定があればIFD-OCO取引
271
+ raise "options[:settle][:rate] is required." if options[:settle][:rate] == nil
272
+ type = ORDER_TYPE_IFD_OCO
273
+ else
274
+ # 決済取引の指定のみがあればIFD取引
275
+ raise "options[:settle][:rate] is required." if options[:settle][:rate] == nil
276
+ raise "options[:settle][:execution_expression] is required." if options[:settle][:execution_expression] == nil
277
+ type = ORDER_TYPE_IFD
278
+ end
279
+ raise "options[:rate] is required." if options[:rate] == nil
280
+ raise "options[:execution_expression] is required." if options[:execution_expression] == nil
281
+ raise "options[:expiration_type] is required." if options[:expiration_type] == nil
282
+ raise "options[:settle][:rate] is required." if options[:settle][:rate] == nil
283
+ raise "options[:settle][:sell_or_buy] is required." if options[:settle][:sell_or_buy] == nil
284
+ raise "options[:settle][:unit] is required." if options[:settle][:unit] == nil
285
+ raise "options[:settle][:expiration_type] is required." if options[:expiration_type] == nil
286
+ elsif ( options[:rate] != nil )
287
+ if ( options[:stop_order_rate] != nil )
288
+ # 逆指値レートが指定されていればOCO取引
289
+ type = ORDER_TYPE_OCO
290
+ else
291
+ # そうでなければ通常取引
292
+ raise "options[:execution_expression] is required." if options[:execution_expression] == nil
293
+ type = ORDER_TYPE_NORMAL
294
+ end
295
+ raise "options[:expiration_type] is required." if options[:expiration_type] == nil
296
+ else
297
+ # 成り行き
298
+ type = ORDER_TYPE_MARKET_ORDER
299
+ if ( options[:slippage] != nil )
300
+ raise "if you use a slippage, options[:slippage_base_rate] is required." if options[:slippage_base_rate] == nil
301
+ end
302
+ end
303
+ raise "not supported yet." if type != ORDER_TYPE_NORMAL
304
+
305
+ # レート一覧
306
+ result = @client.click( @links.find {|i|
307
+ i.attributes["accesskey"] == "1"
308
+ })
309
+ form = result.forms.first
310
+
311
+ # 通貨ペア
312
+ option = form.fields.find{|f| f.name == "P001" }.options.find {|o|
313
+ to_pair( o.text.strip ) == currency_pair_code
314
+ }
315
+ raise "illegal currency_pair_code. currency_pair_code=#{currency_pair_code.to_s}" unless option
316
+ option.select
317
+
318
+ #注文方式
319
+ form["P100"] = type
320
+
321
+ # 詳細設定画面へ
322
+ result = @client.submit(form)
323
+ form = result.forms.first
324
+ form["P003"] = options[:rate].to_s # レート
325
+ form["P005"] = unit.to_s # 取り引き数量
326
+ form["P002.0"] = sell_or_buy == ClickClient::FX::SELL ? "1" : "0" #売り/買い
327
+
328
+ exp = options[:execution_expression]
329
+ form["P004.0"] = exp == ClickClient::FX::EXECUTION_EXPRESSION_REVERSE_LIMIT_ORDER ? "2" : "1" #指値/逆指値
330
+
331
+ # 有効期限
332
+ case options[:expiration_type]
333
+ when ClickClient::FX::EXPIRATION_TYPE_TODAY
334
+ form["P008"] = "0"
335
+ when ClickClient::FX::EXPIRATION_TYPE_WEEK_END
336
+ form["P008"] = "1"
337
+ when ClickClient::FX::EXPIRATION_TYPE_SPECIFIED
338
+ form["P008"] = "3"
339
+ raise "options[:expiration_date] is required." unless options[:expiration_date]
340
+ form["P009.Y"] = options[:expiration_date].year
341
+ form["P009.M"] = options[:expiration_date].month
342
+ form["P009.D"] = options[:expiration_date].day
343
+ form["P009.h"] = options[:expiration_date].respond_to?(:hour) ? options[:expiration_date].hour : "0"
344
+ else
345
+ form["P008"] = "2"
234
346
  end
235
- # if ( options[:rate] != nil )
236
- # if ( options[:stop_order_rate] != nil )
237
- # # 逆指値レートが指定されていればOCO取引
238
- # path = "/ws/fx/ocoChumon.do"
239
- # body << "&srp=#{options[:rate].to_s}"
240
- # body << "&grp=#{options[:stop_order_rate].to_s}"
241
- # else
242
- # # そうでなければ通常取引
243
- # raise "options[:execution_expression] is required." if options[:execution_expression] == nil
244
- # path = "/ws/fx/tsujoChumon.do"
245
- # body << "&crp=#{options[:rate].to_s}"
246
- # body << "&sjt=#{options[:execution_expression].to_s}"
247
- # end
248
- # raise "options[:expiration_type] is required." if options[:expiration_type] == nil
249
- # body << "&bbt=#{sell_or_buy.to_s}"
250
- # body << "&thn=#{unit.to_s}"
251
- # body << "&dat=#{options[:expiration_type].to_s}"
252
- # body << "&ykd=" << options[:expiration_date].strftime( "%Y%m%d%H" ) if options[:expiration_date] != nil
253
- # end
254
- # result = @client.post( @base_uri + path, body)
255
- # doc = ClickClient.parse( result.content )
256
- # return OrderResult.new( doc.root )
347
+
348
+ # 確認画面へ
349
+ result = @client.submit(form)
350
+ result = @client.submit(result.forms.first)
351
+ #puts result.body.toutf8
352
+ ClickClient::Client.error( result ) unless result.body.toutf8 =~ /注文受付完了/
353
+ # TODO 結果を返す・・・どうするかな。
257
354
  end
258
355
 
259
356
  # ログアウトします。
260
357
  def logout
261
- @client.get_content( @commands["ログアウト"] )
358
+ @client.click( @links.find {|i|
359
+ i.text == "\303\233\302\270\303\236\302\261\302\263\303\204"
360
+ })
262
361
  end
362
+
363
+ private
364
+ # "USD/JPY"を:USDJPYのようなシンボルに変換します。
365
+ def to_pair( str )
366
+ str.gsub( /\//, "" ).to_sym
367
+ end
263
368
  end
264
369
 
265
370
  #=== スワップ
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unageanu-clickclient_scrap
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
  - Masaya Yamauchi
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-02-13 00:00:00 -08:00
12
+ date: 2009-02-25 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15