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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 40e4929e52203b0121c9ca2eac2f289f656ff543
4
- data.tar.gz: abb0fe53f2f8e43836473fdc8d7ae517fcd63602
3
+ metadata.gz: cd5c5d3b1ed427ecf3c7db8b0763325661c1c58d
4
+ data.tar.gz: 4c443acc77cdbf2259cee3b257875a709b4ab9bf
5
5
  SHA512:
6
- metadata.gz: 23e4c2b43ee95212d0c8069ed7e2c731dc1878ec4bd4f7b8984bb0dfea55f1cd496ad161c098d2a0551a49d995a6cf4faca8b0041fc891d9f3fc3b42bfce5243
7
- data.tar.gz: b6e3fce288abf2aaa51cf7910b1b99c90e0c673f13bf6541e8a047b496d83fe6d90b5d11379f8d8e6610a9ad94c6d8834d58c9b0c8cfa2fd171d43852791d987
6
+ metadata.gz: 3a0bba0ca3414970de52d94bb2418010d689f0910226acca375c4b7be1bd2dc495fcb29808cc96dc2039a0319b5c66675b86cd6bb941d266dced153157433a91
7
+ data.tar.gz: 8a7cd7e1b7c71fbaaab65b79891479553c8e2b5a7f3b3fc54f88ce50a30b95db8dc8c832d3f9200b87d45a9a229b0c8f49df00cf24ff3e6391d24683283dc10a
@@ -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
@@ -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].cookie_enabled ? 'on' : 'off'}>"
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
- # @ :result : враппер результата исполнения; по умолчанию Page, для Client если определён — Result; при асинхронном вызове будет возвращён незамедлительно
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 : deprecated
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 != :skip
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] && (opts[:save_result] or :proc_result.in opts) ? page.res : page
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
- (opts[:save_result] or :proc_result.in opts) ? page.res : page
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
@@ -1,3 +1,3 @@
1
1
  module RHACK
2
- VERSION = '1.3.3'
2
+ VERSION = '1.3.4'
3
3
  end
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.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-14 00:00:00.000000000 Z
11
+ date: 2014-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rmtools