Nexaas::Async::Collector

Build Status Test Coverage Code Climate

Agnostic collector and generator of async content for Rails apps. Used in production in a few Nexaas systems.

This gems is compatible with Ruby 2.3+ (we do not ensure it works in previous versions) and Rails 3.2+.

Prerequisites

The prerequisites of this project are:

  • Sidekiq 4+
  • Redis
  • JQuery 1.0+

Installation

Add this line to your application's Gemfile:

gem 'nexaas-async-collector'

And then run:

$ bundle install

Or install it yourself as:

$ gem install nexaas-async-collector

Usage

1) Create the file config/initializers/nexaas-async-collector.rb with the following content (edit as you need):

  Nexaas::Async::Collector.configure do |config|
    # Your redis URL. The default value will be the value of yout REDIS_URL env var
    config.redis_url = "redis://test.local"

    # The namespace where you want to store you data within Redis
    config.redis_namespace = 'nexaas_async'

    # The name of the sidekiq queue to be used
    config.queue_name = :high_fast

    # The method that returns the user object (or any other object you want. It must respond to id method)
    config.scope = :current_user

    # The parent class of all nexaas-async-collector controller
    config.parent_controller = "::ActionController::Base"

    # The expiration of the data in seconds
    config.expiration = 600
  end

2) Add this to your config/routes.rb file:

Rails.application.routes.draw do
  # ...
  mount Nexaas::Async::Collector::Engine => '/nexaas_async_collect'
  # ...
end

3) Use the view helper to do all the process:

<%= nexaas_async_collect({
  scope_id: scope.id, # (required) the ID of the scope. It ensures only the scope who requested the data will be able to fetch it
  class_name: ModelService, # (required) name of the class
  class_method: :model_method, # (required) name of the class method responsible to generate data
  args: [arg1, arg2], # (optional) arguments to be passed to class method
  instrumentation_context: 'my.custom.instrumentation', # (optional) context of the instrumentation name. It will generate two instrumentation: 'my.custom.instrumentation.start' and 'my.custom.instrumentation.finish'
  expiration: 180 # (optional) this local expiration will overwrite global expiration for this particular data generation
}) %>

Download file

Instead of rendering text or HTML, you can use nexaas-async-collect to generate files, so the user can download it.

If you want to export something to xls file, for example:

<%= nexaas_async_collect({
  scope_id: scope.id, # (required)
  class_name: ModelService, # (required)
  class_method: :model_method, # (required)
  args: [arg1, arg2], # (optional)
  file: {
    content_type: 'application/vnd.ms-excel', # (required) content type of the file
    name: 'reports', # (required) name of the file
    extension: 'xls' # (require) extension of the file
  }
}) %>

This will generate the spinner and it will redirect the user to download the file when it is ready.

Redis configuration

If you are sharing your Redis server between important information (e.g., Sidekiq data) and temporary information (e.g., nexaas-async-collector data), we suggest you to set the maxmemory-policy eviction policy in Redis to volatile-lru or volatile-ttl.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/myfreecomm/nexaas-async-collector. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

After downloading the project and install all gems (through bundler) don't forget to install appraisal gems dependencies:

$ appraisal install

This is necessary to test the code in different versions of Ruby and Rails. To run the full suite of tests:

$ appraisal rake spec

License

The gem is available as open source under the terms of the MIT License.