Introducing a :retrying status / Catching all Ruby Exceptions

Fixes #98.
Introducing a :retrying status for failed jobs that will be retried later on
WARNING: On Sidekiq 3.x and 4.x, it modifies how the sidekiq-status middleware
gets inserted into the Sidekiq server middleware chain. This is b/c the Sidekiq::Status middleware must be inserted before the RetryJob middleware if we want the Sidekiq::Status middleware to know the job will be retried.
In Sidekiq 5.x, the retry mechanism is directly included in the Sidekiq job processor.
To ease developer's life, a Sidekiq::Status.configure_server_middleware helper
method is introduced.
Catching all Ruby exceptions, not only StandardError instances to mark a job as failed.
Note: RSpec tests specific to the :retrying status only works for Sidekiq 4.x. Not found out why it fails (freezes) for Sidekiq 3.x and 5.x. Help would be appreciated.

@lfarcy according to the CI results, it looks like Sidekiq 3.x returns :queued rather than :retrying. Aside from that issue, the rest of the PR looks good to me.
Do you think you'd be able to dig into the 3.x issue?
This will allow you to run the test suite locally:
bundle && appraisal update && DEBUG=1 appraisal rspec

@kenaniah I will dig into this issue this week, no problem.

@kenaniah I tried to reproduce the issue but was not able to.
When I run the command you mentioned, it tries to test against Sidekiq v2.x. Here's the trace I get.
macpro:sidekiq-status lfarcy$ bundle exec appraisal rspec
>> BUNDLE_GEMFILE=/Volumes/Data/Users/lfarcy/workspace/github/ecairn/sidekiq-status/gemfiles/sidekiq_2.x.gemfile bundle exec rspec

Sidekiq::Status::ClientMiddleware
  #call
2017-12-15T17:18:33Z 4200 TID-oxvi2p5hk INFO: Sidekiq client with redis options {}
    sets queued status (FAILED - 1)
    sets status hash ttl (FAILED - 2)
    when redis_pool passed
      uses redis_pool (FAILED - 3)
    when redis_pool is not passed
      uses Sidekiq.redis (FAILED - 4)
  :expiration parameter
    overwrites default expiry value (FAILED - 5)

Sidekiq::Status::ServerMiddleware
  #call
    sets working/complete status (FAILED - 6)
    sets failed status (FAILED - 7)
    sets failed status when Exception raised (FAILED - 8)
    sets status hash ttl (FAILED - 9)
    sets interrupted status
      on system exit signal (FAILED - 10)
      on interrupt signal (FAILED - 11)
  :expiration parameter
    overwrites default expiry value (FAILED - 12)
    can be overwritten by worker expiration method (FAILED - 13)

Sidekiq::Status
  .status
    bypasses redis with inlining enabled (FAILED - 14)

sidekiq status web
  shows the list of jobs in progress (FAILED - 15)
  shows a single job in progress (FAILED - 16)
  show an error when the requested job ID is not found (FAILED - 17)

Sidekiq::Status::Worker
  .perform_async
    generates and returns job id (FAILED - 18)
  .expiration
    allows to set/get expiration (FAILED - 19)

Sidekiq::Status
  .status, .working?, .complete?
    gets job status by id as symbol (FAILED - 20)
  .get
    gets a single value from data hash as string (FAILED - 21)
  .at, .total, .pct_complete, .message
    should return job progress with correct type to it (FAILED - 22)
  .get_all
    gets the job hash by id (FAILED - 23)
  .delete
    deletes the status hash for given job id (FAILED - 24)
    should not raise error while deleting status hash if invalid job id (FAILED - 25)
  .cancel
    cancels a job by id (FAILED - 26)
    does not cancel a job with correct id but wrong time (FAILED - 27)
  keeps normal Sidekiq functionality
    does jobs with and without included worker module (FAILED - 28)
    retries failed jobs (FAILED - 29)
    :expiration param
      allow to overwrite :expiration parameter (FAILED - 30)
      allow to overwrite :expiration parameter by .expiration method from worker (FAILED - 31)

Failures:

  1) Sidekiq::Status::ClientMiddleware#call sets queued status
     Failure/Error: worker: Sidekiq::Job.new(msg, queue).display_class,

     TypeError:
       no implicit conversion of Hash into String
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `initialize'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `new'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `parse'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:101:in `load_json'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/api.rb:168:in `initialize'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `new'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `call'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:124:in `block in invoke'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `call'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `invoke'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:171:in `process_single'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:47:in `push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:98:in `push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:83:in `client_push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:40:in `perform_async'
     # ./spec/lib/sidekiq-status/client_middleware_spec.rb:12:in `block (3 levels) in <top (required)>'

  2) Sidekiq::Status::ClientMiddleware#call sets status hash ttl
     Failure/Error: worker: Sidekiq::Job.new(msg, queue).display_class,

     TypeError:
       no implicit conversion of Hash into String
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `initialize'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `new'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `parse'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:101:in `load_json'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/api.rb:168:in `initialize'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `new'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `call'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:124:in `block in invoke'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `call'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `invoke'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:171:in `process_single'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:47:in `push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:98:in `push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:83:in `client_push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:40:in `perform_async'
     # ./spec/lib/sidekiq-status/client_middleware_spec.rb:19:in `block (3 levels) in <top (required)>'

  3) Sidekiq::Status::ClientMiddleware#call when redis_pool passed uses redis_pool
     Failure/Error: worker: Sidekiq::Job.new(msg, queue).display_class,

     TypeError:
       no implicit conversion of Hash into String
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `initialize'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `new'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `parse'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:101:in `load_json'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/api.rb:168:in `initialize'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `new'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `call'
     # ./spec/lib/sidekiq-status/client_middleware_spec.rb:28:in `block (4 levels) in <top (required)>'

  4) Sidekiq::Status::ClientMiddleware#call when redis_pool is not passed uses Sidekiq.redis
     Failure/Error: worker: Sidekiq::Job.new(msg, queue).display_class,

     TypeError:
       no implicit conversion of Hash into String
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `initialize'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `new'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `parse'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:101:in `load_json'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/api.rb:168:in `initialize'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `new'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `call'
     # ./spec/lib/sidekiq-status/client_middleware_spec.rb:35:in `block (4 levels) in <top (required)>'

  5) Sidekiq::Status::ClientMiddleware :expiration parameter overwrites default expiry value
     Failure/Error: worker: Sidekiq::Job.new(msg, queue).display_class,

     TypeError:
       no implicit conversion of Hash into String
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `initialize'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `new'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `parse'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:101:in `load_json'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/api.rb:168:in `initialize'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `new'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `call'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:124:in `block in invoke'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `call'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `invoke'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:171:in `process_single'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:47:in `push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:98:in `push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:83:in `client_push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:40:in `perform_async'
     # ./spec/lib/sidekiq-status/client_middleware_spec.rb:48:in `block (3 levels) in <top (required)>'

  6) Sidekiq::Status::ServerMiddleware#call sets working/complete status
     Failure/Error: worker: Sidekiq::Job.new(msg, queue).display_class,

     TypeError:
       no implicit conversion of Hash into String
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `initialize'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `new'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `parse'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:101:in `load_json'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/api.rb:168:in `initialize'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `new'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `call'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:124:in `block in invoke'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `call'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `invoke'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:171:in `process_single'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:47:in `push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:98:in `push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:83:in `client_push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:40:in `perform_async'
     # ./spec/lib/sidekiq-status/server_middleware_spec.rb:13:in `block (4 levels) in <top (required)>'
     # ./spec/spec_helper.rb:74:in `start_server'
     # ./spec/lib/sidekiq-status/server_middleware_spec.rb:12:in `block (3 levels) in <top (required)>'

  7) Sidekiq::Status::ServerMiddleware#call sets failed status
     Failure/Error: worker: Sidekiq::Job.new(msg, queue).display_class,

     TypeError:
       no implicit conversion of Hash into String
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `initialize'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `new'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `parse'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:101:in `load_json'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/api.rb:168:in `initialize'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `new'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `call'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:124:in `block in invoke'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `call'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `invoke'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:171:in `process_single'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:47:in `push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:98:in `push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:83:in `client_push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:40:in `perform_async'
     # ./spec/lib/sidekiq-status/server_middleware_spec.rb:26:in `block (5 levels) in <top (required)>'
     # ./spec/spec_helper.rb:50:in `confirmations_thread'
     # ./spec/spec_helper.rb:55:in `capture_status_updates'
     # ./spec/lib/sidekiq-status/server_middleware_spec.rb:25:in `block (4 levels) in <top (required)>'
     # ./spec/spec_helper.rb:74:in `start_server'
     # ./spec/lib/sidekiq-status/server_middleware_spec.rb:24:in `block (3 levels) in <top (required)>'

  8) Sidekiq::Status::ServerMiddleware#call sets failed status when Exception raised
     Failure/Error: worker: Sidekiq::Job.new(msg, queue).display_class,

     TypeError:
       no implicit conversion of Hash into String
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `initialize'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `new'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `parse'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:101:in `load_json'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/api.rb:168:in `initialize'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `new'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `call'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:124:in `block in invoke'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `call'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `invoke'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:171:in `process_single'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:47:in `push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:98:in `push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:83:in `client_push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:40:in `perform_async'
     # ./spec/lib/sidekiq-status/server_middleware_spec.rb:37:in `block (5 levels) in <top (required)>'
     # ./spec/spec_helper.rb:50:in `confirmations_thread'
     # ./spec/spec_helper.rb:55:in `capture_status_updates'
     # ./spec/lib/sidekiq-status/server_middleware_spec.rb:36:in `block (4 levels) in <top (required)>'
     # ./spec/spec_helper.rb:74:in `start_server'
     # ./spec/lib/sidekiq-status/server_middleware_spec.rb:35:in `block (3 levels) in <top (required)>'

  9) Sidekiq::Status::ServerMiddleware#call sets status hash ttl
     Failure/Error: worker: Sidekiq::Job.new(msg, queue).display_class,

     TypeError:
       no implicit conversion of Hash into String
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `initialize'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `new'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `parse'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:101:in `load_json'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/api.rb:168:in `initialize'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `new'
     # ./lib/sidekiq-status/client_middleware.rb:24:in `call'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:124:in `block in invoke'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `call'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `invoke'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:171:in `process_single'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:47:in `push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:98:in `push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:83:in `client_push'
     # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:40:in `perform_async'
     # ./spec/lib/sidekiq-status/server_middleware_spec.rb:72:in `block (4 levels) in <top (required)>'
     # ./spec/spec_helper.rb:74:in `start_server'
     # ./spec/lib/sidekiq-status/server_middleware_spec.rb:71:in `block (3 levels) in <top (required)>'

  10) Sidekiq::Status::ServerMiddleware#call sets interrupted status on system exit signal
      Failure/Error: worker: Sidekiq::Job.new(msg, queue).display_class,

      TypeError:
        no implicit conversion of Hash into String
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `initialize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `new'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `parse'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:101:in `load_json'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/api.rb:168:in `initialize'
      # ./lib/sidekiq-status/client_middleware.rb:24:in `new'
      # ./lib/sidekiq-status/client_middleware.rb:24:in `call'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:124:in `block in invoke'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `call'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `invoke'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:171:in `process_single'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:47:in `push'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:98:in `push'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:83:in `client_push'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:40:in `perform_async'
      # ./spec/lib/sidekiq-status/server_middleware_spec.rb:49:in `block (6 levels) in <top (required)>'
      # ./spec/spec_helper.rb:50:in `confirmations_thread'
      # ./spec/spec_helper.rb:55:in `capture_status_updates'
      # ./spec/lib/sidekiq-status/server_middleware_spec.rb:48:in `block (5 levels) in <top (required)>'
      # ./spec/spec_helper.rb:74:in `start_server'
      # ./spec/lib/sidekiq-status/server_middleware_spec.rb:47:in `block (4 levels) in <top (required)>'

  11) Sidekiq::Status::ServerMiddleware#call sets interrupted status on interrupt signal
      Failure/Error: worker: Sidekiq::Job.new(msg, queue).display_class,

      TypeError:
        no implicit conversion of Hash into String
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `initialize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `new'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/json-2.1.0/lib/json/common.rb:156:in `parse'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:101:in `load_json'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/api.rb:168:in `initialize'
      # ./lib/sidekiq-status/client_middleware.rb:24:in `new'
      # ./lib/sidekiq-status/client_middleware.rb:24:in `call'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:124:in `block in invoke'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `call'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/middleware/chain.rb:127:in `invoke'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:171:in `process_single'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:47:in `push'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/client.rb:98:in `push'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:83:in `client_push'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq/worker.rb:40:in `perform_async'
      # ./spec/lib/sidekiq-status/server_middleware_spec.rb:60:in `block (6 levels) in <top (required)>'
      # ./spec/spec_helper.rb:50:in `confirmations_thread'
      # ./spec/spec_helper.rb:55:in `capture_status_updates'
      # ./spec/lib/sidekiq-status/server_middleware_spec.rb:59:in `block (5 levels) in <top (required)>'
      # ./spec/spec_helper.rb:74:in `start_server'
      # ./spec/lib/sidekiq-status/server_middleware_spec.rb:58:in `block (4 levels) in <top (required)>'

  12) Sidekiq::Status::ServerMiddleware :expiration parameter overwrites default expiry value
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  13) Sidekiq::Status::ServerMiddleware :expiration parameter can be overwritten by worker expiration method
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  14) Sidekiq::Status.status bypasses redis with inlining enabled
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  15) sidekiq status web shows the list of jobs in progress
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'
      # ./spec/spec_helper.rb:74:in `start_server'
      # ./spec/lib/sidekiq-status/web_spec.rb:20:in `block (2 levels) in <top (required)>'

  16) sidekiq status web shows a single job in progress
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'
      # ./spec/spec_helper.rb:74:in `start_server'
      # ./spec/lib/sidekiq-status/web_spec.rb:20:in `block (2 levels) in <top (required)>'

  17) sidekiq status web show an error when the requested job ID is not found
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'
      # ./spec/spec_helper.rb:74:in `start_server'
      # ./spec/lib/sidekiq-status/web_spec.rb:20:in `block (2 levels) in <top (required)>'

  18) Sidekiq::Status::Worker.perform_async generates and returns job id
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  19) Sidekiq::Status::Worker.expiration allows to set/get expiration
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  20) Sidekiq::Status.status, .working?, .complete? gets job status by id as symbol
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  21) Sidekiq::Status.get gets a single value from data hash as string
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  22) Sidekiq::Status.at, .total, .pct_complete, .message should return job progress with correct type to it
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  23) Sidekiq::Status.get_all gets the job hash by id
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  24) Sidekiq::Status.delete deletes the status hash for given job id
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  25) Sidekiq::Status.delete should not raise error while deleting status hash if invalid job id
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  26) Sidekiq::Status.cancel cancels a job by id
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  27) Sidekiq::Status.cancel does not cancel a job with correct id but wrong time
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  28) Sidekiq::Status keeps normal Sidekiq functionality does jobs with and without included worker module
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  29) Sidekiq::Status keeps normal Sidekiq functionality retries failed jobs
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  30) Sidekiq::Status keeps normal Sidekiq functionality :expiration param allow to overwrite :expiration parameter
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

  31) Sidekiq::Status keeps normal Sidekiq functionality :expiration param allow to overwrite :expiration parameter by .expiration method from worker
      Failure/Error: Sidekiq.redis { |conn| conn.flushall }

      Timeout::Error:
        Waited 1 sec
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:86:in `block (2 levels) in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `loop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:78:in `block in pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `synchronize'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool/timed_stack.rb:77:in `pop'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:89:in `checkout'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:61:in `block in with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `handle_interrupt'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/connection_pool-2.2.1/lib/connection_pool.rb:60:in `with'
      # /Volumes/Data/Users/lfarcy/software/ecairn/rvm/gems/ruby-2.2.2@sidekiq-status/gems/sidekiq-2.17.8/lib/sidekiq.rb:67:in `redis'
      # ./spec/spec_helper.rb:16:in `block (2 levels) in <top (required)>'

Finished in 23 seconds (files took 0.55645 seconds to load)
31 examples, 31 failures

Failed examples:

rspec ./spec/lib/sidekiq-status/client_middleware_spec.rb:10 # Sidekiq::Status::ClientMiddleware#call sets queued status
rspec ./spec/lib/sidekiq-status/client_middleware_spec.rb:17 # Sidekiq::Status::ClientMiddleware#call sets status hash ttl
rspec ./spec/lib/sidekiq-status/client_middleware_spec.rb:24 # Sidekiq::Status::ClientMiddleware#call when redis_pool passed uses redis_pool
rspec ./spec/lib/sidekiq-status/client_middleware_spec.rb:33 # Sidekiq::Status::ClientMiddleware#call when redis_pool is not passed uses Sidekiq.redis
rspec ./spec/lib/sidekiq-status/client_middleware_spec.rb:46 # Sidekiq::Status::ClientMiddleware :expiration parameter overwrites default expiry value
rspec ./spec/lib/sidekiq-status/server_middleware_spec.rb:9 # Sidekiq::Status::ServerMiddleware#call sets working/complete status
rspec ./spec/lib/sidekiq-status/server_middleware_spec.rb:22 # Sidekiq::Status::ServerMiddleware#call sets failed status
rspec ./spec/lib/sidekiq-status/server_middleware_spec.rb:33 # Sidekiq::Status::ServerMiddleware#call sets failed status when Exception raised
rspec ./spec/lib/sidekiq-status/server_middleware_spec.rb:69 # Sidekiq::Status::ServerMiddleware#call sets status hash ttl
rspec ./spec/lib/sidekiq-status/server_middleware_spec.rb:45 # Sidekiq::Status::ServerMiddleware#call sets interrupted status on system exit signal
rspec ./spec/lib/sidekiq-status/server_middleware_spec.rb:56 # Sidekiq::Status::ServerMiddleware#call sets interrupted status on interrupt signal
rspec ./spec/lib/sidekiq-status/server_middleware_spec.rb:84 # Sidekiq::Status::ServerMiddleware :expiration parameter overwrites default expiry value
rspec ./spec/lib/sidekiq-status/server_middleware_spec.rb:91 # Sidekiq::Status::ServerMiddleware :expiration parameter can be overwritten by worker expiration method
rspec ./spec/lib/sidekiq-status/testing_spec.rb:6 # Sidekiq::Status.status bypasses redis with inlining enabled
rspec ./spec/lib/sidekiq-status/web_spec.rb:22 # sidekiq status web shows the list of jobs in progress
rspec ./spec/lib/sidekiq-status/web_spec.rb:34 # sidekiq status web shows a single job in progress
rspec ./spec/lib/sidekiq-status/web_spec.rb:46 # sidekiq status web show an error when the requested job ID is not found
rspec ./spec/lib/sidekiq-status/worker_spec.rb:8 # Sidekiq::Status::Worker.perform_async generates and returns job id
rspec ./spec/lib/sidekiq-status/worker_spec.rb:17 # Sidekiq::Status::Worker.expiration allows to set/get expiration
rspec ./spec/lib/sidekiq-status_spec.rb:13 # Sidekiq::Status.status, .working?, .complete? gets job status by id as symbol
rspec ./spec/lib/sidekiq-status_spec.rb:35 # Sidekiq::Status.get gets a single value from data hash as string
rspec ./spec/lib/sidekiq-status_spec.rb:49 # Sidekiq::Status.at, .total, .pct_complete, .message should return job progress with correct type to it
rspec ./spec/lib/sidekiq-status_spec.rb:66 # Sidekiq::Status.get_all gets the job hash by id
rspec ./spec/lib/sidekiq-status_spec.rb:82 # Sidekiq::Status.delete deletes the status hash for given job id
rspec ./spec/lib/sidekiq-status_spec.rb:92 # Sidekiq::Status.delete should not raise error while deleting status hash if invalid job id
rspec ./spec/lib/sidekiq-status_spec.rb:99 # Sidekiq::Status.cancel cancels a job by id
rspec ./spec/lib/sidekiq-status_spec.rb:121 # Sidekiq::Status.cancel does not cancel a job with correct id but wrong time
rspec ./spec/lib/sidekiq-status_spec.rb:143 # Sidekiq::Status keeps normal Sidekiq functionality does jobs with and without included worker module
rspec ./spec/lib/sidekiq-status_spec.rb:150 # Sidekiq::Status keeps normal Sidekiq functionality retries failed jobs
rspec ./spec/lib/sidekiq-status_spec.rb:188 # Sidekiq::Status keeps normal Sidekiq functionality :expiration param allow to overwrite :expiration parameter
rspec ./spec/lib/sidekiq-status_spec.rb:194 # Sidekiq::Status keeps normal Sidekiq functionality :expiration param allow to overwrite :expiration parameter by .expiration method from worker

And it does not run tests against other Sidekiq versions.
When I try to run test differently (bundle exec appraisal sidekiq-3.x rake spec) it works for Sidekiq v4.x but freezes for v3.x or v5.x. It looks like the tests I added or updated are waiting for notifications on the "status_update" channel that do not come. I will investigate those missing notifications on next Monday. It's just weird v5.x does not fail on Travis...
I'm wondering if the version of Redis I use is consistent with yours and Travis. Which one is it please?

From my Mac:
$ redis-server --version
Redis server v=4.0.6 sha=00000000:0 malloc=libc bits=64 build=4a12ccd68263c36b

I think the reason 3.x was returning the job as :queued had to do with the fact that the retry job delay was 1 second (which coincidentally was the shutdown timeout of sidekiq-cli in the test suite). By using a retry delay greater than the shutdown timeout, the job should now consistently return :retrying as the server would not be able to pick it up and queue it before shutdown.

@pramodshinde since this changes how the server middleware is loaded and thus would require config changes to work properly, do you think merging this would warrant a 1.0.0 release?

@kenaniah Thanks for taking care of fixing what was wrong with the test suite. I will go on investigating what's wrong with my environment and why I cannot get that test suite green. It may be due to the old version of Redis I'm relying upon (v2.8.19).

Guys gone through the changes, seems good to me though I need to review it in depth before that I would like to point out that as we are calling this new status as retrying even though its not really retrying the job. It just pushed in sidekiq's retry queue (correct me if I am wrong). Would it be better to call it something different rather than calling it retrying. User might be under impression by looking at the status of job is retrying, but in reality its pushed for 'retry'. thoughts?

@kenaniah Do you mean we need a major version bump? by saying

do you think merging this would warrant a 1.0.0 release?

@pramodshinde I can see your point regarding why :retrying may be misleading. The job is not currently retrying but is going to be retried (soon). I'm not finding anything clever right now, just thinking about something like :waiting_for_retry.
Regarding version bump, we may not need a major bump but, at least, a minor bump (0.8.0). Because of the new and incompatible way the middleware is now configured on the server side for Sidekiq versions < 5.0.

@lfarcy Agreed on version minor bump.
I would suggest something like in_retry_queue or pushed_for_retry or in_retry

@pramodshinde Thx for your review. :in_retry sounds good to me.
@kenaniah whatever is the new status name we agree upon, will you make the changes?

@pramodshinde I recently added a “Retry Now” button for jobs that are queued for retry on the main status page, so I think we should be ok with calling it :retrying after all. To further clarify, I’ll add a status definition chart to the main readme to eliminate further confusion.
Would that work for everyone?

I also forgot to mention that a longer status name would take up more space in the web UI table, which is why I’m inclined to keep the name short and simple.

Correct me the flow of ‘Retry Now’ is it for those jobs which are ‘failed’
or those jobs which are pushed in retry queue (or which all status). In
either case ‘Retry Now’ button should change the status to ‘working’ on
click if job is successfully pushed to busy or to ‘queued’. With respect to
this PR we need to show a status for those jobs which are pushed in ‘retry’
queue. So such jobs status should be ‘in_retry’ until they gets pushed in
‘busy’ which will change to ‘working’ or ‘queued’, thoughts?
On Tue, 19 Dec 2017 at 10:04 PM, Kenaniah Cerny<EMAIL_ADDRESS>wrote:

I also forgot to mention that a longer status name would take up more
space in the web UI table, which is why I’m inclined to keep the name short
and simple.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/utgarda/sidekiq-status/pull/110#issuecomment-352812997,
or mute the thread
https://github.com/notifications/unsubscribe-auth/ADDpB5AKr2ZSH5etNotVo4Yx5a8PMiE5ks5tB-WJgaJpZM4Q06ly
.

What we're really looking to communicate is the simple future passive tense, aka "will be retried". This clearly notes that the action is expected to take place at some point in the future, but it has too many modifier words to make it practical. "Retry" is an irregular verb that doesn't conjugate well, and "in retry", while indicative, still uses modifiers. I'd much rather stick to the simple, present continuous from of "retrying" as I think it most clearly communicates a non-perfected state.
Anything ending with -ing would properly be considered as an unfinished action, and everything else should be in -ed form to indicate completed action. (Which, now that I'm looking at it, means that "complete" should also be changed to "completed"). I'd much rather not confuse people by using an indicative form, and I see how a present continuous form may be misleading, but I do believe it to be the lesser of the two evils.

@kenaniah You do know the subtleties of English much better than I do. While :in_retry sounds better aligned with what happens inside Sidekiq, I think :retrying may be more user-friendly, in the sense that, from a Sidekiq user's POV, the job is retrying.
Let me know if you want my final opinion to make the decision. For the moment, I'm ok with both names.

I'll be sure to specifically call that out in the documentation as part of the release then. Thanks.


Add first iteration of Caliptra Runtime Firmware spec

The Caliptra Runtime Firmware spec defines the responsibilities and behavior of the Caliptra Runtime Firmware.
This is the same as https://github.com/chipsalliance/caliptra-sw/pull/1, which was closed due to recent updates to main and cannot be re-opened.

Supportive of launch and iterate on this spec, at this point.


Cleaning up edge cases & public release

So I've been trying to find more edge cases lately. Some features still break when stream loads after you the page load, or when a second player gets added from hosting. For the latter, injected styles would still apply, but DOM manipulations would need to be redone. Not sure how important that is though. Have you guys found more cases where things break down?
Once this gets slightly more polished, I think we should make a post on /r/Twitch and other places to get the word out. It's starting to become a nice little script that many will find useful. In the process we'll hopefully get more people aboard for testing, feature suggestion and contributions.

I encountered something where when I have the quality set to something other than Source (so it applies to any new streams I open), then I load a stream without quality options, which then gets quality options while I have it open, the quality was displayed as Source even though it was e.g. Medium.
I'm not sure if that is a problem with the modifications or of the player itself, but it's a bit difficult to test. I tried opening the cog menu to test if it would set it once you open it, but our modified quality selection didn't change to the correct value. I haven't yet had a chance to test it with and without modifications. What makes it even harder to test is that sometimes the player won't switch to quality options mid-stream on it's own, so I have to reload which is not what I want to test. That's just like opening a stream with quality options which displays correctly.

That does sound like a really hard to test edge case. Would definitely be interested to know the default player handles it, I wouldn't be surprised if the issue exists there too.
I just added video seeking and made the stats loading slightly more robust. Also, moving the Volume CSS to the style sheet means that it'll work on all players no matter when and how they are loaded.
I think we're pretty close to a decent 1.0 release.

The current implementation saves every 10s, and saves each VOD to a new key. I'm not sure about the long term impact of this, since they never get cleaned up. I was considering using some sort LRU array where I only keep the X most recent vod positions, and store the whole thing under one key.

 Nice!
Yes, we're looking at several hours long VODs in most cases, and even on YouTube I hardly ever have the time to finish episodes of just one hour. So the number of seek to remember is small. On the other hand one problem is when you just check out a bunch of VODs.. then with a simple rotation the ones that you actually meant to return to are going to be lost.
Perhaps if you just put a limit like 50 it is unlikely a typical user will check so many VODs that the ones they meant to come back to will have been rotated out of the "50 slot" store. In that case I'd say 10 is definitely too low. I'd go for something like 30 to 50 if you want to put a limit.
Another option would be to not store a key if the stream has been playing for less than 5 minutes. This would help not losing the play time from VODs you actually meant to come back to, when checking out VODs from new channels.

Honestly, any finite amount is fine. I'm just thinking of the really long term effects, when there'd be thousands of values. I'd probably go with 100. I do agree that having a time limit would also help prune a lot of values.

The usage of flashBackend breaks the script on Firefox. It says it is undefined.

This is quite annoying. flashBackend itself is fine, but for some reason, you can't call functions on flash objects? Works fine in Chrome though. I'll try searching around for solutions, submitted a temporary patch for now that let's the script run through to the end.

Finally got around fixing the Firefox issue, and fixed another small bug.
I made the version 1.0, I think it's as clean as it gets for now.
I think if I ever was to make a big refactor, it'd be to scan and apply fixes to any player on the page, rather than focusing only on the first player we detect. This way, we could detect new players being added such as Hosted channels. But for now, that's a small subcase.

The usage of flashBackend doesn't work with the standalone player URL: http://player.twitch.tv/?channel=<channel>

That standalone player is where they test their latest code though, so it's fair to assume it'll change very often. I believe there's a way to make that player go 100% HTML5, although I'm not sure how the support is, last I tried it, it was very broken on Chrome.
I put a fix for this one, just chose a more robust selector, hopefully.


Probabilistic Coherent Predictions PERMBU, Bootstrap or MinTrace-normality compatibility

Let's reevaluate the bootstrap boolean parameter from the core.HierarchicalForecast main class to prob_method that accepts strings to be able to use PERMBU, Bootstrap or MinTrace-normality.
We need to think of a way to make the methods compatible between one-another or to declare a new ProbabilisticReconciler class.

Fixed in #83


No metadata found.... Error

I'm using class-validator and having to bring it in as a dependency as well to add the constraints, but get the annoying console warning:
No metadata found. There is more than once class-validator version installed probably. You need to flatten your dependencies.
I don't want to pass validate: false and I don't want to get into a situation where my validation constraints aren't running due to how it works internally.

Once again, what is your problem? You don't use validation but you don't want to pass validate: false?

No metadata found. There is more than once class-validator version installed probably. You need to flatten your dependencies.

See this for more info:
https://github.com/typestack/class-validator/issues/279

No, I use validation, so I don't pass validate: false, but I need to add class-validator as a dependency, so seeing that error message worries me because I'm not sure if my own custom validation logic is going to be executed due to multiple class-validator since type-graphql doesn't have it as a peerDependency.
To remove the error, I'd think either type-graphql exports all of the validation decorators or uses strict peerDependency.

Them having an error makes me believe that they're using a global within class-validator to store metadata, so if type-graphql brings their own class-validator and I bring my own class-validator, leads me to feel that my validation constraints won't be executed due to validate being called within the type-graphql library.  It's concerning and makes me worry, that's all.

Yes, the problem is that TypeGraphQL and TypeORM uses global to store the metadata across multiple instances of packages while class-validator have own local storage per package.
So multiple instances of class-validator will result in that error unless you provide your own container for metadata storage. I had a project with separated repo for responses (entities) and inputs (requests) models and separate backend and frontend repos. I did this trick to make it work across multiple modules with npm link:
import * as TypeORM from "typeorm";
import * as ClassValidator from "class-validator";
import { Container } from "typedi";

TypeORM.useContainer(Container);
ClassValidator.useContainer(Container);

export * from "./entities";
export * from "./requests";

I'd think either type-graphql exports all of the validation decorators or uses strict peerDependency.

This doesn't fix the error. Without lerna and hoisting dependencies or using a private npm registry, you will have two node_modules for both project and both will have own instances of class-validator package.

Okay, hmm.  I'm using inversify for my container and yarn workspaces (no lerna).
The error comes from within type-graphql package:
node_modules/type-graphql/node_modules/class-validator/validation/ValidationExecutor.js
Based off the error message, I'd think that if I brought my own class-validator and it was at the root of node_modules (which it is), then the error would go away, but I guess not?
I suppose I'll just play it safe and do manual validation.

I'd think that if I brought my own class-validator and it was at the root of node_modules

Try also npm dedupe but I'm not sure if it works with node_modules in parent directory.
If not, even peer dependency won't work as it checks only local node_modules.
There would be a problem with duplicated graphql-js too even without peer dependency as the instaceof check doesn't work between different instances of module.

I suppose I'll just play it safe and do manual validation.

You can use method or param decorators to create own validation rules, you don't have to do this manually inside each resolver's body.
So you have a few options:

use dependencies hoisting (maybe yarn workspaces can do that too)
make a peer dependency on class-validator in your models package and use private npm registry or git to install bundled package without node_modules
create a PR for class-validator that uses global scoped metadata storage
use own decorators that imports package from root node_modules

I oddly get the error even when I dedupe, use resolutions, and have one instance of class-validator.
My mono-repo packages don't have any node_modules, they are all just in the root node_modules directory.  node_modules under type-graphql package also doesn't contain class-validator.  There's just one.....
I'll look into using my own decorators.  I'm also not using TypeORM.  So it's interesting to not know what's going on.

I'm sure it has to do with how I use inversify.  I'm creating a container and bootstrapping code there, so my class imports happen before, but I get the error even after I remove useContainer from class-validator.

@19majkel94 Is it possible now to create a middleware that has the converted inputs/args?  If not, it might be cool if there was an option to get the decorated params on a middleware function call?

I oddly get the error even when I dedupe, use resolutions, and have one instance of class-validator.

If you register your container after evaluating the class decorators, it will have empty metadata storage in the container, so you will see this warning.

Is it possible now to create a middleware that has the converted inputs/args?

Not yet - see #123.

to get the decorated params on a middleware function call then people can bring their own

Custom validation will be supported by vNext and plugins system 😉

@19majkel94 can't wait for it! :)

I will close this issue for now as it looks like the problem is with how class-validator store the metadata internally and how to cope with splitted packages/monorepo, not about TypeGraphQL and how it uses class-validator.


we couldn't complete this action.try a different payment method or contact us.[or_ccreu_02]

**Describe the bug**
I use the google pay integration of stripe in react native but in android press the google pay button that time open the bottomsheet but after that I add the card and press the continue but one error show **we couldn't complete this action.try a different payment method or contact us.[or_ccreu_02]**I also try with live card and all bank card like kotak,axis,hdfc,bob etc .. still same issue rized plz help me solve this issue.

To Reproduce
Steps to reproduce the behavior:

Click on 'Google Pay  button'
Bottomsheet open after the press continue button
add the card
perss the continue after show error

Expected behavior
add the card after that this card show and If we select the card after that payment success.
Desktop (please complete the following information):

OS:[ANDROID]
Browser [chrome]

Smartphone (please complete the following information):

Device: [Android:oppo f9 pro]
OS: [10]
Browser [estock browseri]
Version [10]

https://github.com/stripe/stripe-react-native/assets/104578057/61573ec0-3669-4d7c-a328-8775394d6fd6
Code:-
import React from 'react';
import { Text, View, Alert } from 'react-native';
import { PlatformPay, PlatformPayButton, StripeProvider, usePlatformPay } from '@stripe/stripe-react-native';
const App = () => {
const {
isPlatformPaySupported,
confirmPlatformPayPayment,
} = usePlatformPay();
React.useEffect(() => {
if (!(isPlatformPaySupported({ googlePay: { testEnv: true } }))) {
Alert.alert('Google Pay is not supported.');
return;
}
}, []);
const fetchPaymentIntentClientSecret = async () => {
// Fetch payment intent created on the server, see above
const response = await fetch(${API_URL}/create-payment-intent, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
currency: 'usd',
}),
});
const { clientSecret } = await response.json();
return clientSecret;

};
const pay = async () => {
const clientSecret = "pi_3MgoPbISMWZqiPUr1kQxxH5D_secret_c04IfLgLg7dPc3NZkrw02HAZr";
const { error } = await confirmPlatformPayPayment(
  clientSecret,
  {
    googlePay: {
      testEnv: true,
      merchantName: 'My merchant name',
      merchantCountryCode: 'US',
      currencyCode: 'USD',
      billingAddressConfig: {
        format: PlatformPay.BillingAddressFormat.Full,
        isPhoneNumberRequired: true,
        isRequired: true,
      },
    },
  }
);

if (error) {
  Alert.alert(error.code, error.message);
  // Update UI to prompt user to retry payment (and possibly another payment method)
  return;
}
Alert.alert('Success', 'The payment was confirmed successfully.');

};
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<StripeProvider
publishableKey="pk_test_51IWI9WISMWZqiPUrnBU8fqbyacRiUAbG6HQ8z0htmUft5LOL2eTnYE1R3dYf5Lm7MPgJcLI5QBUATItitFu6VEcn002FyMswel"
urlScheme="your-url-scheme" // required for 3D Secure and bank redirects
>
<PlatformPayButton
type={PlatformPay.ButtonType.Pay}
onPress={pay}
style={{
width: '100%',
height: 50,
}}
/>

);
};
export default App;

Hi! Have you followed the relevant steps here: https://stripe.com/docs/google-pay?platform=react-native#going-live-react-native?

@charliecruzan-stripe  Yes I followed all this steps in stripe documentation still not working all integration same as the stripe documantation still same plz help me.

Hi @Psutariya This error is from Google Pay, and I don't see this error code ([or_ccreu_02) in Google's document. Can you try testing your app with a different Google account (i.e., an US account since the merchantCountryCode is set to US). Alternatively you might want to reach out to Google directly

Closing for inactivity

I have search and get this from https://stackoverflow.com/questions/75862955/we-couldnt-complete-this-action-try-a-different-payment-method-or-contact-us
now it is working.

just proceed to join the group and you will be able to perform test payment
https://groups.google.com/g/googlepay-test-mode-stub-data


fix(css): missing separators for frontmatter value arrays

Hi 👋
A minor bug fix: when you have frontmatter values, there is no visual separation between values. that way, it's not possible to tell whether something is one value, or a list of values.
For example, here the means key has actually two values, particularly… and allow access…. However, due to the lack of a separator, it looks like one long string value.

The PR fixes that by adding a , in between values via CSS:

@chrisgrieser
Thanks! COOL selectors 👍

Thank you for your patience, @chrisgrieser .
I have released in v11.6.0 🚀


feat: updates dockerfile

RHINENG-1755
Now we use multistage build,
python39 stream module,
and we unified dockerfiles content accross drift services (expect deps).
This way the resulting image is cca 50% smaller.

/retest

Codecov Report
All modified and coverable lines are covered by tests :white_check_mark:

Project coverage is 74.79%. Comparing base (0d66408) to head (26c2cf1).
Report is 36 commits behind head on master.

Additional details and impacted files
@@           Coverage Diff           @@
##           master     #496   +/-   ##
=======================================
  Coverage   74.79%   74.79%
=======================================
  Files          25       25
  Lines         849      849
=======================================
  Hits          635      635
  Misses        214      214

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.


automate muun mvp - create new wallet

In the MVP, it should generate a new muun wallet in the app:
Send a request for current wallet balance.
If wallet balance == 0.00
goto Settings > Delete Wallet > Yes I'm sure > Continue > Create A New Wallet > Enter PIN 2x > DONE!

use adb from bash script like adb shell input touchscreen tap x y
Replace x and y with the coordinates of the point on the screen where you want to simulate the touch event. The coordinates are specified in pixels, with the top-left corner of the screen being (0,0).
You can also use the pyadb library to execute the input command from Python. Here is an example:
import pyadb

# Connect to the device
adb = pyadb.ADB()
device = adb.device()

# Simulate a touch event at (100, 200)
device.shell("input touchscreen tap 100 200")

You can also use the pyadb library to run the dump command from Python. Here is an example:
import pyadb

# Connect to the device
adb = pyadb.ADB()
device = adb.device()

# Dump the current screen layout
layout = device.shell("uiautomator dump")

# Print the layout
print(layout)

you will get something like this
<hierarchy rotation="0">
  <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.example.app" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][1080,1794]">
    <node index="0" text="Hello, World!" resource-id="" class="android.widget.TextView" package="com.example.app" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][1080,1794]"/>
  </node>
</hierarchy>

See if we can read invoices and account balances while you're at it


AttributeError: module 'qiskit.pulse' has no attribute 'build'

Informations

Qiskit version: 0.14.2
Python version: 3.7.8
Operating system: posix

What is the current behavior?
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-5-7c1e5c48f6d8> in <module>
      4 backend = FakeArmonk()
     5
----> 6 with pulse.build(backend) as drive_sched:
      7     d0 = pulse.drive_channel(0)
      8     print(d0)
``
AttributeError: module 'qiskit.pulse' has no attribute 'build'
Steps to reproduce the problem
Execute the code mentioned in this section (https://qiskit.org/documentation/apidoc/pulse.html?highlight=pulse#pulse-builder-builder)
from qiskit import pulse
from qiskit.test.mock import FakeArmonk
backend = FakeArmonk()
with pulse.build(backend) as drive_sched:
    d0 = pulse.drive_channel(0)
    print(d0)
P.S - indentation is not showing up in the above code
What is the expected behavior?
No exception
Suggested solutions

This feature is only available in Qiskit v0.15+. Please try upgrading your Qiskit?

This feature is only available in Qiskit v0.15+. Please try upgrading your Qiskit installation.

@taalexander tried with version 0.19.6, same error.

I see you closed and then reopened? Has this been resolved?

@taalexander  I upgraded qiskit. These are the versions
qiskit-0.20.0 qiskit-aer-0.6.1 qiskit-aqua-0.7.5 qiskit-ibmq-provider-0.8.0 qiskit-ignis-0.4.0 qiskit-terra-0.15.1
Still getting the error.

@praveentn I ran it on the latest version of qiskit(0.20.0 same as yours) and didn't get any attribute error. So please try reinstalling qiskit if you still face that error.

{'qiskit-terra': '0.15.2',
'qiskit-aer': '0.6.1',
'qiskit-ignis': '0.4.0',
'qiskit-ibmq-provider': '0.8.0',
'qiskit-aqua': '0.7.5',
'qiskit': '0.20.1'}
Worked for the above config. Closing the issue. Thanks!

Glad to know that it got worked out for you :)


User

Try to squash out these WIP commits and any commits with failing builds before merging feature branches into master.

Taking the extra time and discipline to make sure every commit on master is working takes effort, but pays off in production.


Types of parameters '𝚪' and '𝚪' are incompatible.

app/components/dw-form/input.hbs:1:1 - error TS2345: Argument of type '(𝚪: TemplateContext<DwFormInputComponent, DwFormInputArgs, never, HTMLInputElement>) => void' is not assignable to parameter of type '(𝚪: AnyContext) => void'.
  Types of parameters '𝚪' and '𝚪' are incompatible.
    Type 'AnyContext' is not assignable to type 'TemplateContext<DwFormInputComponent, DwFormInputArgs, never, HTMLInputElement>'.
      Types of property 'yields' are incompatible.
        Type 'any' is not assignable to type 'never'.

  1 <div class="form-group">
    ~~~~~~~~~~~~~~~~~~~~~~~~
  2   <label for={{this.id}}>
    ~~~~~~~~~~~~~~~~~~~~~~~~~
...
 47 </div>
    ~~~~~~

I need more info to diagnose this. What does your component signature look like? Somehow you're winding up with Yields: never

I had a component that subclassed a base component and it looks like I did it kind of wrong.