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 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