README.md in activejob-scheduler-0.0.1 vs README.md in activejob-scheduler-1.0.0.pre

- old
+ new

@@ -1,90 +1,179 @@ # ActiveJob::Scheduler +[![Current Gem Version](https://badge.fury.io/rb/activejob-scheduler.svg)](http://badge.fury.io/rb/activejob-scheduler) +[![Build Status](https://travis-ci.org/tubbo/activejob-scheduler.svg?branch=master)](https://travis-ci.org/tubbo/activejob-scheduler) +[![Maintainability](https://api.codeclimate.com/v1/badges/94b5d52c0059cc8a380b/maintainability)](https://codeclimate.com/github/tubbo/activejob-scheduler/maintainability) +[![Test Coverage](https://api.codeclimate.com/v1/badges/94b5d52c0059cc8a380b/test_coverage)](https://codeclimate.com/github/tubbo/activejob-scheduler/test_coverage) + An extension to [ActiveJob][aj] for running background jobs periodically, according to a schedule. Inspired by its predecessors, [resque-scheduler][resque] and [sidekiq-scheduler][sidekiq], `ActiveJob::Scheduler` hopes to bring the power of scheduled jobs into everyone's hands, by way of the pre-defined ActiveJob API which most popular queueing backend choices already support. -Like its predecessors, `ActiveJob::Scheduler` is built with -[Rufus::Scheduler][rufus], an immensely powerful task scheduling library -to make sure your jobs get kicked off at *exactly* the right time. +Like its predecessors, `ActiveJob::Scheduler` uses the same powerful +syntax for describing when periodic jobs should run as +[Rufus::Scheduler][rufus]. However, unlike its predecessors, +`ActiveJob::Scheduler` does not require a separate process to be run. +Instead, it uses an `after_perform` callback to re-enqueue the job after +it has been performed. ## Installation Add this line to your application's Gemfile: - gem 'activejob-scheduler' +```ruby +gem 'activejob-scheduler' +``` And then execute: $ bundle +Or install it yourself as: + + $ gem install activejob-scheduler + ## Usage -Run the following command to generate a YAML-based schedule: +To schedule your jobs, add the `repeat` macro to the job definition: -```bash -$ rails generate activejob:schedule +```ruby +class GenerateSitemapsJob < ApplicationJob + repeat 'every day at 2am' + + def perform + SitemapGenerator.generate + end +end ``` -Edit this YAML file the same way you would with resque-scheduler or -sidekiq-scheduler (they define the same parameters). Then, it's your -choice as to how you wish to run it, either by the binary: +This macro can also be used to configure the job event, like its name or +arguments: +```ruby +class GenerateSitemapsJob < ApplicationJob + repeat every: '1d', name: 'Sitemap Generator', arguments: %w(foo bar) + + def perform(foo, bar) + SitemapGenerator.generate(foo, bar) # => foo == "foo", bar == "bar" + end +end +``` + +The DSL also allows you to iterate over a collection and pass in a +different argument for each item: + +```ruby +class SyncOrdersJob < ApplicationJob + repeat 'every day at 11:30am', each: -> { Order.not_synced } + + def perform(order) + ExternalSystem.create(order) + end +end +``` + +This will trigger the event every day at 11:30am, but enqueue a job for +each model in the collection, and pass it into the job arguments. You +can specify static arguments here as well, they will be passed in prior +to the item argument at the end. + +```ruby +class SyncOrdersJob < ApplicationJob + repeat 'every day at 11:30am', + arguments: ['synced'], + each: -> { Order.not_synced } + + def perform(type, order) + ExternalSystem.create(type: type, order: order) # type is "synced" + end +end +``` + +Start the schedule by running this command: + ```bash -$ bundle exec ajs +./bin/rails activejob:schedule ``` -Or, with a Rake task: +### YAML Schedule +Much like **resque-scheduler**, you can use a YAML schedule file with +**activejob-scheduler** with a very similar syntax. To generate a new +one, run: + ```bash -$ bundle exec rake activejob:schedule +$ rails generate activejob:schedule ``` -The schedule must run as a separate process, but it's very light...it -delegates all the real processing to your queue workers, and simply -enqueues jobs as the specified time rolls around. +Then, add your jobs into the YAML like so: -## Development +```yaml +generate_sitemaps: + interval: + every: '1d' +``` -Please use GitHub pull requests to contribute bug fixes or features, and -make sure to include tests with all your work. +This is entirely optional, however, and both DSL-based jobs and +YAML-based jobs will be included in the schedule at runtime. -### License +### Mailers -[University of Illinois/NCSA Open Source License][license] +```ruby +class AdminMailer < ApplicationMailer + repeat :daily_status, 'every day at 8am' + def daily_status + mail to: User.admins.pluck(:email) + end +end +``` - Copyright (c) 2014 Tom Scott - All rights reserved. +This will send the email every day at **8:00am**. You can also pass all +the regular fields from `repeat` in the job DSL like arguments and the +various fugit-parsed intervals. - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the "Software"), - to deal with the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: +You can also send a different email for each recipient: - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimers. +```ruby +class UserMailer < ApplicationMailer + repeat :status, 'every day at 8am', each: -> { User.receive_email } + def status(user) + end +end +``` - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimers in the documentation - and/or other materials provided with the distribution. +This lambda will be called when the event is enqueued, and individual +mails will be sent out for each user in the collection. - None of the names of its contributors may be used to endorse or promote - products derived from this Software without specific prior written permission. +## Development - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT - OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS WITH THE SOFTWARE. +After checking out the repo, run `bin/setup` to install dependencies. +Then, run `rake rspec` to run the tests. You can also run `bin/console` +for an interactive prompt that will allow you to experiment. -[aj]: https://github.com/rails/activejob +To install this gem onto your local machine, run `bin/rake install`. To +release a new version, update the version number in `version.rb`, and +then run `bin/rake release`, which will create a git tag for the version, +push git commits and tags, and push the `.gem` file to +[rubygems.org](https://rubygems.org). + +## Contributing + +Bug reports and pull requests are welcome on GitHub at +https://github.com/tubbo/activejob-scheduler. This project is intended +to be a safe, welcoming space for collaboration, and contributors +are expected to adhere to the +[Contributor Covenant](contributor-covenant.org) code of conduct. + +## License + +The gem is available as open source under the terms of the [MIT +License][mit]. + +[aj]: https://github.com/rails/rails/tree/master/activejob [resque]: https://github.com/resque/resque-scheduler [sidekiq]: https://github.com/Moove-it/sidekiq-scheduler [rufus]: https://github.com/jmettraux/rufus-scheduler -[license]: http://opensource.org/licenses/NCSA +[mit]: http://opensource.org/licenses/MIT