README.md in active_job_channel-0.3.0 vs README.md in active_job_channel-0.4.0

- old
+ new

@@ -1,23 +1,34 @@ [![Gem Version](https://badge.fury.io/rb/active_job_channel.svg)](https://badge.fury.io/rb/active_job_channel) +[![Build Status](https://travis-ci.org/shanecav84/active_job_channel.svg?branch=master)](https://travis-ci.org/shanecav84/active_job_channel) # ActiveJobChannel Use ActionCable to alert front-end users of finished ActiveJobs +* [Installation](#installation) +* [Setup](#setup) + 1. [Create ActionCable Connection](#create-connection) (optional) + 2. [Enable ActiveJobChannel for a job](#enable-active_job_channel) + * [Configuration](#configuration) + * [`global_brodcast`](#global_broadcast) + 3. [Handle ActiveJobChannel broadcasts](#handle-broadcasts) +* [Caveats](#caveats) +* [Todo](#todo) +* [Contributing](#contributing) + * [Dev setup](#dev-setup) +* [License](#license) + ## Installation 1. Install in your Gemfile ```ruby gem 'active_job_channel' ``` ## Setup -1. [Create ActionCable Connection](#create-actioncable-connection-optional) (optional) -2. [Enable ActiveJobChannel for a job](#enable-activejobchannel-for-a-job) -3. [Handle ActiveJobChannel broadcasts](#handle-activejobchannel-broadcasts) -### Create ActionCable Connection (optional) +### <a name="create-connection"></a> 1. Create ActionCable Connection (optional) You can skip this step if you're not concerned with authorizing or brodcasting privately to ActionCable connections 1. Setup an [ActionCable subscription adapter](http://edgeguides.rubyonrails.org/action_cable_overview.html#subscription-adapter) @@ -28,42 +39,57 @@ 3. If you would like notifications broadcast privately to ActionCable connections, set up a connection identifier for your connection using `identified_by`. The identifier you use will also need to be passed to your job. -### Enable ActiveJobChannel for a job -1. For each job you'd like to be notified about, call `active_job_channel` in - its class -2. To broadcast notifications privately, set the identifier you configured in - your ActionCable Connection setup to either the instance variable - `@ajc_identifier` or the method `ajc_identifier` +### <a name="enable-active_job_channel"></a> 2. Enable ActiveJobChannel for a job +1. For each job you'd like to be notified about, include `ActiveJobChannel` and + call `active_job_channel` in its class +2. Private vs. Public broadcasts + 1. To broadcast notifications privately to a specific connection, set the + identifier you configured in your ActionCable Connection setup to either + the instance variable `@ajc_identifier` or the method `ajc_identifier`. + + ```ruby + class MyJob < ActiveJob::Base + include ActiveJobChannel + active_job_channel + + def perform(current_user) + @ajc_identifier = current_user + end + + private + + # def ajc_identifier + # User.find_by(key: value) + # end + end + ``` + + 2. To broadcast publicly to all ActionCable connections, pass + `{ global_broadcast: true }` to `active_job_channel` and do not set `ajc_identifier` + + ```ruby + class MyJob < ActiveJob::Base + include ActiveJobChannel + active_job_channel global_broadcast: true + + def perform; end + end + ``` -```ruby -class MyJob < ActiveJob::Base - active_job_channel - def perform(current_user) - @ajc_identifier = current_user - end - - private - - # def ajc_identifier - # User.find_by(key: value) - # end -end -``` - #### Configuration ##### global_broadcast Notifications will be broadcast to `ajc_identifier` by default. To broadcast all notifications for a job to all ActionCable connections, pass `{ global_broadcast: true }` to `active_job_channel`. -### Handle ActiveJobChannel broadcasts +### <a name="handle-broadcasts"></a> 3. Handle ActiveJobChannel broadcasts 1. Include `active_job_channel.js` in your layouts ```ruby javascript_include_tag 'active_job_channel' @@ -78,18 +104,31 @@ 2. Customize the callbacks for broadcasted notifications: ```javascript //= require notifyjs - ActiveJobChannel.onJobSuccess = function(job) { $.notify(job.name + ' succeeded!') }; - ActiveJobChannel.onJobFailure = function(job) { $.notify(job.name + ' failed!') }; + ActiveJobChannel.onJobSuccess = function(job) { $.notify(job.data.job_class + ' succeeded!') }; + ActiveJobChannel.onJobFailure = function(job) { $.notify(job.data.job_class + ' failed!') }; ``` - `job` has the attributes `name` and `status`. A failed `job` includes an - `error` attribute. `status` is one of `success` or `failure`. + `job` is a JSON object that has the attributes `status` and `data`. The value + of `status` can be one of `success` or `failure`. The value of `data` is a + JSON object of [job data serialized by ActiveJob](https://github.com/rails/rails/blob/649f19cab1d4dd805c915912ede29c86655084cd/activejob/lib/active_job/core.rb#L79). + It has the following keys: + - "job_class" + - "job_id" - Internal ActiveJob job identifier + - "provider_job_id" - ID optionally provided by ActiveJob queue adapter + - "queue_name" + - "priority" + - "arguments" - arguments passed to the job + - "executions" - how many times the job was attempted + - "locale" + A failed `job` includes an `error` attribute with the result of calling + `inspect` on the exception that precpitated the failure. + ## Caveats ActiveJobChannel depends on ActiveJob and ActionCable, and, as such, is subject to their limitations: * A persisted [subscription adapter](http://guides.rubyonrails.org/action_cable_overview.html#subscription-adapter) @@ -98,8 +137,27 @@ * Because ActiveJob does not know when a job has permanently failed, ActiveJobChannel sends notfications for each failure, retried or final ## Todo - Better default front-end notification behavior + +## Contributing + +Issues and pull requests are welcome. + +### Dev setup + +1. Clone the project + ```bash + git clone https://github.com/shanecav84/active_job_channel + ``` +2. Install dependencies + ```bash + bundle install + ``` +3. Run the tests + ```bash + bundle exec rake + ``` ## License The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).