rhack 1.3.3 → 1.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rhack/curl/response.rb +1 -1
- data/lib/rhack/frame.rb +62 -17
- data/lib/rhack/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd5c5d3b1ed427ecf3c7db8b0763325661c1c58d
|
4
|
+
data.tar.gz: 4c443acc77cdbf2259cee3b257875a709b4ab9bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a0bba0ca3414970de52d94bb2418010d689f0910226acca375c4b7be1bd2dc495fcb29808cc96dc2039a0319b5c66675b86cd6bb941d266dced153157433a91
|
7
|
+
data.tar.gz: 8a7cd7e1b7c71fbaaab65b79891479553c8e2b5a7f3b3fc54f88ce50a30b95db8dc8c832d3f9200b87d45a9a229b0c8f49df00cf24ff3e6391d24683283dc10a
|
data/lib/rhack/curl/response.rb
CHANGED
@@ -8,7 +8,7 @@ module Curl
|
|
8
8
|
def to_s
|
9
9
|
str = '<#'
|
10
10
|
if @error
|
11
|
-
str << "#{@error.name}: #{@error.message}"
|
11
|
+
str << "#{@error.class.name}: #{@error.message}"
|
12
12
|
else
|
13
13
|
str << (@header[/\d{3}/] == @code.to_s ? @header : "#{@header[/\S+/]} #{@code}") if @header
|
14
14
|
if @hash.location
|
data/lib/rhack/frame.rb
CHANGED
@@ -90,7 +90,7 @@ module RHACK
|
|
90
90
|
|
91
91
|
def inspect
|
92
92
|
sssize = @ss.size
|
93
|
-
"<#Frame @ #{@ss.untargeted ? 'no target' : @loc.root}: #{sssize} #{sssize == 1 ? 'scout' : 'scouts'}#{', static'+(' => '+@static.protocol if @static.is(Hash)) if @static}, cookies #{@ss[0].
|
93
|
+
"<#Frame @ #{@ss.untargeted ? 'no target' : @loc.root}: #{sssize} #{sssize == 1 ? 'scout' : 'scouts'}#{', static'+(' => '+@static.protocol if @static.is(Hash)) if @static}, cookies #{@ss[0].cookies_enabled ? 'on' : 'off'}>"
|
94
94
|
end
|
95
95
|
|
96
96
|
# All opts going in one hash.
|
@@ -103,23 +103,45 @@ module RHACK
|
|
103
103
|
# Opts passed to Scout:
|
104
104
|
# :headers, :redir, :relvl
|
105
105
|
#
|
106
|
-
#
|
107
|
-
# @ &callback : в него будет передан инстанс result, а его результат будет записан в result#res (по умолчанию это ссылка на себя)
|
108
|
-
# @ :thread_safe : не использовать луп исполнения Curl::Multi#perform, а вызывать #perform прямо в этом треде; если установлен, то невозможно прерывание исполнения клавиатурой (продолжит работать, выполняя колбеки, в фоне), и невозможно задавать больше параллельных реквестов, чем разрешено параллельных соединений (просто застрянет)
|
109
|
-
# @ :sync : остановить (Thread#kill) perform-loop после исполнения всех запросов; подразумевает wait=true; при вызове одиночного реквеста подразумевает thread_safe=true
|
110
|
-
# @ :wait : ждать исполнения всех реквестов
|
111
|
-
# @ :save_result: возвращает #res для каждого инстанса result вместо самого инстанса; если не задан :proc_result, то подразумевает wait=true
|
112
|
-
# @ :proc_result: Proc, в который будет передан result#res, если задан также &callback; служит для создания вложенных блоков для клиентов; если =nil, то подразумевает wait=true
|
113
|
-
# @ :raw : сохраняем *только* тело ответа, без хедеров, без отладочной инфы в #res
|
114
|
-
# @ :raw + :sync : подразумевает save_result=true
|
115
|
-
# @ :xhr, :content_type, :auth : формируют хедеры X-Requested-With, Content-Type, Authorization для передачи в Scout
|
106
|
+
# Формирование хедеров запроса X-Requested-With, Content-Type, Authorization для передачи в Scout:
|
116
107
|
# @ :xhr : boolean
|
117
108
|
# @ :content_type : symbol<extension> | raw string
|
118
109
|
# @ :auth : "<username>:<password>"
|
110
|
+
#
|
111
|
+
### Обработка результата:
|
112
|
+
# преобразование к понятному для клиента формату производится в result#process
|
113
|
+
# использование данных из result производится
|
114
|
+
# либо в &callback (functional),
|
115
|
+
# либо использованием результата #run (imperative)
|
116
|
+
# в первом случае в целях сборки мусора будет возвращён
|
117
|
+
# @ :result : враппер результата исполнения; по умолчанию Page, для Client — если определён — <Class>::Result; при асинхронном вызове будет возвращён незамедлительно
|
118
|
+
# @ &callback : в него будет передан инстанс result, а его результат будет записан в <result>.res (по умолчанию это ссылка на <result>); в целях сборки мусора, если &callback задан, #run возвращает #res для каждого инстанса result вместо самого инстанса
|
119
|
+
# @ :complete : при вызове нескольких реквестов, в него будет передан [ <result>.res, ... ] от каждого из них, при вызове единичного — <result>.res от него
|
120
|
+
# @ :complete : в него будет передан [ <result>.res, ... ] относительно всех реквестов, когда все
|
121
|
+
# @ :raw : сохраняем в #res *только* тело ответа — без хедеров, без отладочной инфы
|
122
|
+
#
|
123
|
+
# @ [deprecated] :save_result : подразумевает callback=Proc::SELF; если не задан :proc_result, то подразумевает wait=true
|
124
|
+
# @ [deprecated] :proc_result : Proc, в который будет передан result#res, если задан также &callback; если =nil, то подразумевает wait=true
|
125
|
+
#
|
126
|
+
### Управление потоками:
|
127
|
+
# @ :thread_safe : не использовать луп исполнения Curl::Multi#perform, а вызывать #perform прямо в этом треде;
|
128
|
+
# если установлен, то невозможно прерывание исполнения клавиатурой (продолжит работать, выполняя колбеки, в фоне), и невозможно задавать больше параллельных реквестов, чем разрешено параллельных соединений (просто застрянет)
|
129
|
+
# @ :sync : остановить (Thread#kill) perform-loop после исполнения всех запросов; подразумевает wait=true; при вызове одиночного реквеста подразумевает thread_safe=true
|
130
|
+
# @ :wait : ждать исполнения всех реквестов
|
131
|
+
# @ :raw + :sync : подразумевает save_result=true
|
119
132
|
#
|
120
|
-
# @ :zip, :stream и все опции для result
|
133
|
+
# @ [deprecated] :zip, :stream и все опции для result
|
121
134
|
#
|
122
135
|
# TODO: Семантически разделить синхронное и асинхронное выполнение запросов (не важно, серии или отдельных), с учётом, что асинхронность по сути своей перегружена и требуется, например, в очередях сообщений, но не в синхронных контроллерах Rails
|
136
|
+
#
|
137
|
+
# Пример использования коллбеков в общих/common методах клиента:
|
138
|
+
# def api(requests, **params, &callback)
|
139
|
+
# @f.run(requests, **params.slice(:complete, :sync)) {|data|
|
140
|
+
# params[:before].(data)
|
141
|
+
# process_result = common_process(data)
|
142
|
+
# custom_result = (callback || params[:after]).(data, process_result)
|
143
|
+
# } # => [ custom_result, ... ]
|
144
|
+
# Весь процессинг
|
123
145
|
def exec *args, &callback
|
124
146
|
many, order, orders, with_opts = interpret_request *args
|
125
147
|
L.log({:many => many, :order => order, :orders => orders, :with_opts => with_opts})
|
@@ -132,6 +154,9 @@ module RHACK
|
|
132
154
|
# if we aren't said explicitly about the opposite
|
133
155
|
Johnson::Runtime.set_browser_for_curl with_opts
|
134
156
|
|
157
|
+
if with_opts[:save_result]
|
158
|
+
callback ||= Proc::SELF
|
159
|
+
end
|
135
160
|
if many
|
136
161
|
result = exec_many orders, with_opts, &callback
|
137
162
|
else
|
@@ -340,11 +365,15 @@ module RHACK
|
|
340
365
|
yres = callback.call page
|
341
366
|
# if we don't want callback to affect page.res
|
342
367
|
# then we should not set :save_result
|
343
|
-
if yres
|
368
|
+
if yres == :skip
|
369
|
+
return # DEPRECATED
|
370
|
+
else
|
371
|
+
page.res = yres
|
344
372
|
if opts[:proc_result].is Proc
|
345
373
|
# yres is intermediate result that we should proc
|
346
374
|
page.res = opts[:proc_result].call yres
|
347
|
-
elsif opts[:save_result] or :proc_result.in opts
|
375
|
+
#elsif opts[:save_result] or :proc_result.in opts
|
376
|
+
else
|
348
377
|
# yres is total result that we should save
|
349
378
|
page.res = yres
|
350
379
|
end
|
@@ -352,13 +381,16 @@ module RHACK
|
|
352
381
|
# so we can return result from any depth as @res attribute of what we have on top
|
353
382
|
end
|
354
383
|
end
|
384
|
+
if opts[:complete]
|
385
|
+
page.res = opts[:complete].call page.res
|
386
|
+
end
|
355
387
|
end
|
356
388
|
|
357
389
|
# TODO: found why/how IO on callbacks breaks +curl.res.body+ content and how to fix or how to avoid it
|
358
390
|
def exec_one(order, opts, &callback)
|
359
391
|
if @use_cache and order[0] == :loadGet and page = @@cache[order[1]]
|
360
392
|
run_callbacks! page, opts, &callback
|
361
|
-
res = opts[:wait] && (
|
393
|
+
res = opts[:wait] && (callback or :proc_result.in opts) ? page.res : page
|
362
394
|
return res
|
363
395
|
end
|
364
396
|
# must result in Page (default) or it's subclass
|
@@ -399,7 +431,7 @@ module RHACK
|
|
399
431
|
end
|
400
432
|
if opts[:wait]
|
401
433
|
opts[:thread_safe] ? Curl.carier.perform : Curl.wait
|
402
|
-
(
|
434
|
+
(callback or :proc_result.in opts) ? page.res : page
|
403
435
|
else page
|
404
436
|
end
|
405
437
|
end
|
@@ -416,9 +448,22 @@ module RHACK
|
|
416
448
|
exec_one order, with_opts.merge(:exec => false), &callback
|
417
449
|
}
|
418
450
|
else
|
451
|
+
if oncomplete = with_opts.delete(:complete)
|
452
|
+
pages = nil
|
453
|
+
completed_count = 0
|
454
|
+
original_callback = callback
|
455
|
+
callback = lambda {|page|
|
456
|
+
page.res = original_callback ? original_callback.call(page) : page
|
457
|
+
completed_count += 1
|
458
|
+
if orders.size == completed_count
|
459
|
+
oncomplete.call pages.ress
|
460
|
+
end
|
461
|
+
page.res
|
462
|
+
}
|
463
|
+
end
|
419
464
|
# если ss.next будет не хватать скаутов, то он сам запустит курл
|
420
465
|
# правда, это с :thread_safe никак не вяжется
|
421
|
-
pages = orders.send(iterator) {|order| exec_one order, with_opts, &callback
|
466
|
+
pages = orders.send(iterator) {|order| exec_one order, with_opts, &callback}
|
422
467
|
end
|
423
468
|
unless w and with_opts[:thread_safe] or opts[:exec] == false
|
424
469
|
Curl.execute :unless_already
|
data/lib/rhack/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rhack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergey Baev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rmtools
|