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
         |