rhack 1.3.3 → 1.3.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.
- 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
|