diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5565df2..3b86841 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,14 @@
+## 1.0.0 (2025-11-11)
+
+- New: Fuzzy find search across jobs
+- New: "Run now" — run any job immediately from the index page
+- New: View the Ruby implementation of each job
+- New: Highlight overdue jobs at a glance
+- New: Hourly health check callback via `ClockworkWebPlus.on_health_check`, with detailed overdue context
+- New: Redesigned jobs table with a sleeker, modern UI
+
+Note: Versions prior to 1.0.0 (0.x.y) correspond to the original `clockwork_web` project by ankane. See `https://github.com/ankane/clockwork_web`.
+
## 0.3.1 (2024-09-04)
- Improved CSP support
diff --git a/README.md b/README.md
index dd02b42..b24eb70 100644
--- a/README.md
+++ b/README.md
@@ -1,37 +1,55 @@
-# Clockwork Web
+# Clockwork Web Plus
-A web interface for [Clockwork](https://github.com/Rykian/clockwork)
+A fully compatible drop-in enhancement to [ankane/clockwork_web](https://github.com/ankane/clockwork_web), providing a modern web interface for [Clockwork](https://github.com/Rykian/clockwork) with fuzzy search, manual job run, overdue visibility, and hourly health checks.
-[View the demo](https://clockwork.dokkuapp.com/)
+[](https://github.com/chaadow/clockwork_web_plus/actions/workflows/build.yml)
+
+## Preview
+
+
+
+## Features
+
+### Core (from `clockwork_web`)
- see list of jobs
-- monitor jobs
-- disable jobs
+- monitor jobs ( when they were last run at)
+- Temporarily disable jobs
-:tangerine: Battle-tested at [Instacart](https://www.instacart.com/opensource)
+### New compared to clockwork_web
-[](https://github.com/ankane/clockwork_web/actions)
+- fuzzy find search across jobs
+- run any job immediately through the `Run now` button
+- view the Ruby implementation of each job
+- highlight overdue jobs at a glance
+- optional hourly health check callback with custom alerting
## Installation
Add this line to your application’s Gemfile:
```ruby
-gem "clockwork_web"
+gem "clockwork_web_plus"
```
+> [!TIP]
+> Already using `clockwork_web`? Keep your existing `ClockworkWeb::Engine` mount and initializers—no renaming needed. `ClockworkWebPlus` aliases `ClockworkWeb`, so it works out of the box.
+
And add it to your `config/routes.rb`.
```ruby
-mount ClockworkWeb::Engine, at: "clockwork"
+mount ClockworkWebPlus::Engine, at: "clockwork"
```
-Be sure to secure the dashboard in production.
+> [!IMPORTANT]
+> Secure the dashboard in production. Protect access with Basic Auth, Devise, or your app’s auth layer to avoid exposing job controls and status.
To monitor and disable jobs, hook up Redis in an initializer.
```ruby
-ClockworkWeb.redis = Redis.new
+ClockworkWebPlus.redis = Redis.new
```
#### Basic Authentication
@@ -39,57 +57,113 @@ ClockworkWeb.redis = Redis.new
Set the following variables in your environment or an initializer.
```ruby
-ENV["CLOCKWORK_USERNAME"] = "andrew"
+ENV["CLOCKWORK_USERNAME"] = "chaadow"
ENV["CLOCKWORK_PASSWORD"] = "secret"
```
+> [!NOTE]
+> These are example credentials. Use environment-specific secrets and rotate them regularly.
+
#### Devise
```ruby
authenticate :user, ->(user) { user.admin? } do
- mount ClockworkWeb::Engine, at: "clockwork"
+ mount ClockworkWebPlus::Engine, at: "clockwork"
end
```
+> [!TIP]
+> Any authentication framework works—wrap the mount with whatever guard your app already uses for admin/ops access.
+
## Monitoring
```ruby
-ClockworkWeb.running?
-ClockworkWeb.multiple?
+ClockworkWebPlus.running?
+ClockworkWebPlus.multiple?
```
+> [!NOTE]
+> `running?` reflects recent heartbeats. `multiple?` indicates multiple active Clockwork processes (based on heartbeat contention).
+
## Customize
Change clock path
```ruby
-ClockworkWeb.clock_path = Rails.root.join("clock") # default
+ClockworkWebPlus.clock_path = Rails.root.join("clock") # default
```
+> [!NOTE]
+> The default `clock_path` matches `clockwork_web`. Change it only if your clock file lives elsewhere.
+
Turn off monitoring
```ruby
-ClockworkWeb.monitor = false
+ClockworkWebPlus.monitor = false
+```
+
+> [!CAUTION]
+> Disabling monitoring stops heartbeats and multiple-process detection. The dashboard won’t show “running” status, but other features still work.
+
+### Overdue Jobs & Health Checks
+
+The dashboard highlights overdue jobs based on schedule and last run. You can also configure an hourly health check to alert when jobs are overdue:
+
+```ruby
+ClockworkWebPlus.on_health_check = ->(overdue_jobs:) do
+ # backlog contains array of hashes with details like:
+ # { job:, should_have_run_at:, last_run:, period:, at: { hour:, min: } }
+ if overdue_jobs.any?
+ # send notification to Slack, email, etc.
+ end
+end
```
+> [!NOTE]
+> Overdue detection uses `ClockworkWebPlus.warning_threshold` (default: 300 seconds).
+> - For `@at` schedules: a job is overdue when the most recent scheduled time has passed by more than `warning_threshold` and the job hasn’t run since that time.
+> - For periodic jobs (no `@at`): a job is overdue when `now > last_run + period + warning_threshold`.
+>
+> Example:
+> ```ruby
+> # consider jobs overdue 10 minutes after their expected time
+> ClockworkWebPlus.warning_threshold = 600
+> ```
+
+> [!IMPORTANT]
+> With Redis configured, the health check runs at most once per hour across processes. Without Redis, throttling is per-process and approximate.
+
## History
View the [changelog](CHANGELOG.md)
+## Compatibility
+
+This gem is a drop-in replacement for `clockwork_web`. For backward compatibility, the original namespace is aliased:
+
+```ruby
+# Both of these work:
+mount ClockworkWebPlus::Engine, at: "clockwork"
+mount ClockworkWeb::Engine, at: "clockwork"
+```
+
+> [!TIP]
+> Adopting this gem can be as simple as swapping the gem name in your Gemfile. Your existing `ClockworkWeb` mounts and initializers continue to work unchanged.
+
## Contributing
Everyone is encouraged to help improve this project. Here are a few ways you can help:
-- [Report bugs](https://github.com/ankane/clockwork_web/issues)
-- Fix bugs and [submit pull requests](https://github.com/ankane/clockwork_web/pulls)
+- [Report bugs](https://github.com/chaadow/clockwork_web_plus/issues)
+- Fix bugs and [submit pull requests](https://github.com/chaadow/clockwork_web_plus/pulls)
- Write, clarify, or fix documentation
- Suggest or add new features
To get started with development:
```sh
-git clone https://github.com/ankane/clockwork_web.git
-cd clockwork_web
+git clone https://github.com/chaadow/clockwork_web_plus.git
+cd clockwork_web_plus
bundle install
bundle exec rake test
```
diff --git a/app/views/clockwork_web/home/index.html.erb b/app/views/clockwork_web/home/index.html.erb
index 29479f8..dc26d5f 100644
--- a/app/views/clockwork_web/home/index.html.erb
+++ b/app/views/clockwork_web/home/index.html.erb
@@ -108,6 +108,12 @@
background: #fffbeb;
}
+ .badge.danger {
+ color: var(--danger-600);
+ border-color: rgba(220,38,38,0.18);
+ background: var(--danger-50);
+ }
+
.badge.info {
color: var(--muted);
background: #f8fafc;
@@ -337,11 +343,11 @@
|
<%= event.job %>
- <% if is_overdue %>
- ⚠️
- <% end %>
<% unless enabled %>
- Disabled
+ Disabled
+ <% end %>
+ <% if is_overdue %>
+ Overdue
<% end %>
|
diff --git a/clockwork_web.gemspec b/clockwork_web.gemspec
index 4f4ba4e..42c0341 100644
--- a/clockwork_web.gemspec
+++ b/clockwork_web.gemspec
@@ -1,14 +1,14 @@
-require_relative "lib/clockwork_web/version"
+require_relative "lib/clockwork_web_plus/version"
Gem::Specification.new do |spec|
- spec.name = "clockwork_web"
- spec.version = ClockworkWeb::VERSION
- spec.summary = "A web interface for Clockwork"
- spec.homepage = "https://github.com/ankane/clockwork_web"
+ spec.name = "clockwork_web_plus"
+ spec.version = ClockworkWebPlus::VERSION
+ spec.summary = "A modern web interface for Clockwork with search, run-now & health checks"
+ spec.homepage = "https://github.com/chedli/clockwork_web_plus"
spec.license = "MIT"
- spec.author = "Andrew Kane"
- spec.email = "andrew@ankane.org"
+ spec.authors = ["Andrew Kane", "Chedli Bourguiba"]
+ spec.email = ["bourguiba.chedli@gmail.com"]
spec.files = Dir["*.{md,txt}", "{app,config,lib}/**/*"]
spec.require_path = "lib"
diff --git a/lib/clockwork_web.rb b/lib/clockwork_web.rb
index 3512899..2a6748d 100644
--- a/lib/clockwork_web.rb
+++ b/lib/clockwork_web.rb
@@ -131,8 +131,8 @@ def self.health_check
events = Clockwork.manager.events
last_runs = ClockworkWeb.last_runs
- overdue = ClockworkWeb.overdue_details(events, last_runs)
- ClockworkWeb.on_health_check.call(overdue: overdue) if overdue.any?
+ overdue_jobs = ClockworkWeb.overdue_details(events, last_runs)
+ ClockworkWeb.on_health_check.call(overdue_jobs: overdue_jobs) if overdue_jobs.any?
end
# Returns the last time this event should have run before now.
diff --git a/lib/clockwork_web/version.rb b/lib/clockwork_web/version.rb
index fd9f386..33f4987 100644
--- a/lib/clockwork_web/version.rb
+++ b/lib/clockwork_web/version.rb
@@ -1,3 +1,3 @@
module ClockworkWeb
- VERSION = "0.3.1"
+ VERSION = "1.0.0"
end
diff --git a/lib/clockwork_web_plus.rb b/lib/clockwork_web_plus.rb
new file mode 100644
index 0000000..f804dac
--- /dev/null
+++ b/lib/clockwork_web_plus.rb
@@ -0,0 +1,6 @@
+require "clockwork_web"
+
+# New namespace that aliases the original, for easy drop-in replacement.
+ClockworkWebPlus = ClockworkWeb unless defined?(ClockworkWebPlus)
+
+
diff --git a/lib/clockwork_web_plus/version.rb b/lib/clockwork_web_plus/version.rb
new file mode 100644
index 0000000..58d82d7
--- /dev/null
+++ b/lib/clockwork_web_plus/version.rb
@@ -0,0 +1,5 @@
+module ClockworkWebPlus
+ VERSION = "1.0.0"
+end
+
+
diff --git a/tags b/tags
new file mode 100644
index 0000000..54c3049
--- /dev/null
+++ b/tags
@@ -0,0 +1,145 @@
+!_TAG_EXTRA_DESCRIPTION anonymous /Include tags for non-named objects like lambda/
+!_TAG_EXTRA_DESCRIPTION fileScope /Include tags of file scope/
+!_TAG_EXTRA_DESCRIPTION pseudo /Include pseudo tags/
+!_TAG_EXTRA_DESCRIPTION subparser /Include tags generated by subparsers/
+!_TAG_FIELD_DESCRIPTION epoch /the last modified time of the input file (only for F\/file kind tag)/
+!_TAG_FIELD_DESCRIPTION file /File-restricted scoping/
+!_TAG_FIELD_DESCRIPTION input /input file/
+!_TAG_FIELD_DESCRIPTION name /tag name/
+!_TAG_FIELD_DESCRIPTION pattern /pattern/
+!_TAG_FIELD_DESCRIPTION typeref /Type and name of a variable or typedef/
+!_TAG_FIELD_DESCRIPTION!Ruby mixin /how the class or module is mixed in (mixin:HOW:MODULE)/
+!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
+!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
+!_TAG_KIND_DESCRIPTION!GemSpec g,gem /gems/
+!_TAG_KIND_DESCRIPTION!Markdown S,subsection /level 2 sections/
+!_TAG_KIND_DESCRIPTION!Markdown T,l4subsection /level 4 sections/
+!_TAG_KIND_DESCRIPTION!Markdown c,chapter /chapters/
+!_TAG_KIND_DESCRIPTION!Markdown h,hashtag /hashtags/
+!_TAG_KIND_DESCRIPTION!Markdown n,footnote /footnotes/
+!_TAG_KIND_DESCRIPTION!Markdown s,section /sections/
+!_TAG_KIND_DESCRIPTION!Markdown t,subsubsection /level 3 sections/
+!_TAG_KIND_DESCRIPTION!Markdown u,l5subsection /level 5 sections/
+!_TAG_KIND_DESCRIPTION!Rake d,directory /directory tasks/
+!_TAG_KIND_DESCRIPTION!Rake f,File /file tasks/
+!_TAG_KIND_DESCRIPTION!Rake m,multitask /multi tasks/
+!_TAG_KIND_DESCRIPTION!Rake n,namespace /namespaces/
+!_TAG_KIND_DESCRIPTION!Rake t,task /tasks/
+!_TAG_KIND_DESCRIPTION!Rake x,xtask /tasks defined with special constructor/
+!_TAG_KIND_DESCRIPTION!Ruby A,accessor /accessors/
+!_TAG_KIND_DESCRIPTION!Ruby C,constant /constants/
+!_TAG_KIND_DESCRIPTION!Ruby L,library /libraries/
+!_TAG_KIND_DESCRIPTION!Ruby S,singletonMethod /singleton methods/
+!_TAG_KIND_DESCRIPTION!Ruby a,alias /aliases/
+!_TAG_KIND_DESCRIPTION!Ruby c,class /classes/
+!_TAG_KIND_DESCRIPTION!Ruby f,method /methods/
+!_TAG_KIND_DESCRIPTION!Ruby m,module /modules/
+!_TAG_KIND_DESCRIPTION!Yaml a,anchor /anchors/
+!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/
+!_TAG_OUTPUT_FILESEP slash /slash or backslash/
+!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/
+!_TAG_OUTPUT_VERSION 0.0 /current.age/
+!_TAG_PARSER_VERSION!GemSpec 0.0 /current.age/
+!_TAG_PARSER_VERSION!Markdown 1.1 /current.age/
+!_TAG_PARSER_VERSION!Rake 0.0 /current.age/
+!_TAG_PARSER_VERSION!Ruby 0.0 /current.age/
+!_TAG_PARSER_VERSION!Yaml 0.0 /current.age/
+!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/
+!_TAG_PROC_CWD /Users/chedli/code/personal/clockwork_web/ //
+!_TAG_PROGRAM_AUTHOR Universal Ctags Team //
+!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/
+!_TAG_PROGRAM_URL https://ctags.io/ /official site/
+!_TAG_PROGRAM_VERSION 6.1.0 /35c5c9776/
+!_TAG_ROLE_DESCRIPTION!GemSpec!gem develDep /specifying development dependency/
+!_TAG_ROLE_DESCRIPTION!GemSpec!gem runtimeDep /specifying runtime dependency/
+!_TAG_ROLE_DESCRIPTION!Ruby!library loaded /loaded by "load" method/
+!_TAG_ROLE_DESCRIPTION!Ruby!library required /loaded by "require" method/
+!_TAG_ROLE_DESCRIPTION!Ruby!library requiredRel /loaded by "require_relative" method/
+!_TAG_ROLE_DESCRIPTION!Yaml!anchor alias /alias/
+0.0.4 (2015-03-15) CHANGELOG.md /^## 0.0.4 (2015-03-15)$/;" s
+0.0.5 (2015-05-13) CHANGELOG.md /^## 0.0.5 (2015-05-13)$/;" s
+0.1.0 (2019-10-28) CHANGELOG.md /^## 0.1.0 (2019-10-28)$/;" s
+0.1.1 (2020-03-19) CHANGELOG.md /^## 0.1.1 (2020-03-19)$/;" s
+0.1.2 (2023-02-01) CHANGELOG.md /^## 0.1.2 (2023-02-01)$/;" s
+0.2.0 (2023-02-01) CHANGELOG.md /^## 0.2.0 (2023-02-01)$/;" s
+0.3.0 (2024-06-24) CHANGELOG.md /^## 0.3.0 (2024-06-24)$/;" s
+0.3.1 (2024-09-04) CHANGELOG.md /^## 0.3.1 (2024-09-04)$/;" s
+1.0.0 (2025-11-11) CHANGELOG.md /^## 1.0.0 (2025-11-11)$/;" s
+Basic Authentication README.md /^#### Basic Authentication$/;" t section:Clockwork Web Plus""Installation
+Clockwork lib/clockwork_web.rb /^module Clockwork$/;" m
+Clockwork test/internal/clock.rb /^module Clockwork$/;" m
+Clockwork Web Plus README.md /^# Clockwork Web Plus$/;" c
+ClockworkWeb app/controllers/clockwork_web/home_controller.rb /^module ClockworkWeb$/;" m
+ClockworkWeb app/helpers/clockwork_web/home_helper.rb /^module ClockworkWeb$/;" m
+ClockworkWeb lib/clockwork_web.rb /^module ClockworkWeb$/;" m
+ClockworkWeb lib/clockwork_web/engine.rb /^module ClockworkWeb$/;" m
+ClockworkWeb lib/clockwork_web/version.rb /^module ClockworkWeb$/;" m
+ClockworkWebPlus lib/clockwork_web_plus.rb /^ClockworkWebPlus = ClockworkWeb unless defined?(ClockworkWebPlus)$/;" C
+ClockworkWebPlus lib/clockwork_web_plus/version.rb /^module ClockworkWebPlus$/;" m
+Compatibility README.md /^## Compatibility$/;" s chapter:Clockwork Web Plus
+Contributing README.md /^## Contributing$/;" s chapter:Clockwork Web Plus
+ControllerTest test/controller_test.rb /^class ControllerTest < ActionDispatch::IntegrationTest$/;" c
+Core (from `clockwork_web`) README.md /^### Core (from `clockwork_web`)$/;" S section:Clockwork Web Plus""Features
+Customize README.md /^## Customize$/;" s chapter:Clockwork Web Plus
+DISABLED_KEY lib/clockwork_web.rb /^ DISABLED_KEY = "clockwork:disabled"$/;" C module:ClockworkWeb
+Devise README.md /^#### Devise$/;" t section:Clockwork Web Plus""Installation
+Engine lib/clockwork_web/engine.rb /^ class Engine < ::Rails::Engine$/;" c module:ClockworkWeb
+Features README.md /^## Features$/;" s chapter:Clockwork Web Plus
+HEALTH_CHECK_KEY lib/clockwork_web.rb /^ HEALTH_CHECK_KEY = "clockwork:health_check"$/;" C module:ClockworkWeb
+HEARTBEAT_KEY lib/clockwork_web.rb /^ HEARTBEAT_KEY = "clockwork:heartbeat"$/;" C module:ClockworkWeb
+History README.md /^## History$/;" s chapter:Clockwork Web Plus
+HomeController app/controllers/clockwork_web/home_controller.rb /^ class HomeController < ActionController::Base$/;" c module:ClockworkWeb
+HomeHelper app/helpers/clockwork_web/home_helper.rb /^ module HomeHelper$/;" m module:ClockworkWeb
+Installation README.md /^## Installation$/;" s chapter:Clockwork Web Plus
+LAST_RUNS_KEY lib/clockwork_web.rb /^ LAST_RUNS_KEY = "clockwork:last_runs"$/;" C module:ClockworkWeb
+Monitoring README.md /^## Monitoring$/;" s chapter:Clockwork Web Plus
+New compared to clockwork_web README.md /^### New compared to clockwork_web$/;" S section:Clockwork Web Plus""Features
+Overdue Jobs & Health Checks README.md /^### Overdue Jobs & Health Checks$/;" S section:Clockwork Web Plus""Customize
+Preview README.md /^## Preview$/;" s chapter:Clockwork Web Plus
+STATUS_KEY lib/clockwork_web.rb /^ STATUS_KEY = "clockwork:status"$/;" C module:ClockworkWeb
+VERSION lib/clockwork_web/version.rb /^ VERSION = "0.3.1"$/;" C module:ClockworkWeb
+VERSION lib/clockwork_web_plus/version.rb /^ VERSION = "1.0.0"$/;" C module:ClockworkWebPlus
+clock_path lib/clockwork_web.rb /^ attr_accessor :clock_path$/;" A module:ClockworkWeb
+clock_path= lib/clockwork_web.rb /^ attr_accessor :clock_path$/;" A module:ClockworkWeb
+clockwork_web_plus clockwork_web.gemspec /^ spec.name = "clockwork_web_plus"$/;" g
+default Rakefile /^task default: :test$/;" t
+disable lib/clockwork_web.rb /^ def self.disable(job)$/;" S module:ClockworkWeb
+disabled_jobs lib/clockwork_web.rb /^ def self.disabled_jobs$/;" S module:ClockworkWeb
+enable lib/clockwork_web.rb /^ def self.enable(job)$/;" S module:ClockworkWeb
+enabled? lib/clockwork_web.rb /^ def self.enabled?(job)$/;" S module:ClockworkWeb
+execute app/controllers/clockwork_web/home_controller.rb /^ def execute$/;" f class:ClockworkWeb.HomeController
+friendly_extract_source_from_callable app/helpers/clockwork_web/home_helper.rb /^ def friendly_extract_source_from_callable(callable, with_affixes: true)$/;" f module:ClockworkWeb.HomeHelper
+friendly_period app/helpers/clockwork_web/home_helper.rb /^ def friendly_period(period)$/;" f module:ClockworkWeb.HomeHelper
+friendly_should_have_run app/helpers/clockwork_web/home_helper.rb /^ def friendly_should_have_run(event, last_run)$/;" f module:ClockworkWeb.HomeHelper
+friendly_time_part app/helpers/clockwork_web/home_helper.rb /^ def friendly_time_part(time_part)$/;" f module:ClockworkWeb.HomeHelper
+health_check lib/clockwork_web.rb /^ def self.health_check$/;" S module:ClockworkWeb
+heartbeat lib/clockwork_web.rb /^ def self.heartbeat$/;" S module:ClockworkWeb
+index app/controllers/clockwork_web/home_controller.rb /^ def index$/;" f class:ClockworkWeb.HomeController
+job app/controllers/clockwork_web/home_controller.rb /^ def job$/;" f class:ClockworkWeb.HomeController
+last_heartbeat lib/clockwork_web.rb /^ def self.last_heartbeat$/;" S module:ClockworkWeb
+last_run app/helpers/clockwork_web/home_helper.rb /^ def last_run(time)$/;" f module:ClockworkWeb.HomeHelper
+last_runs lib/clockwork_web.rb /^ def self.last_runs$/;" S module:ClockworkWeb
+monitor lib/clockwork_web.rb /^ attr_accessor :monitor$/;" A module:ClockworkWeb
+monitor= lib/clockwork_web.rb /^ attr_accessor :monitor$/;" A module:ClockworkWeb
+multiple? lib/clockwork_web.rb /^ def self.multiple?$/;" S module:ClockworkWeb
+now_in_event_timezone lib/clockwork_web.rb /^ def self.now_in_event_timezone(event, base_now = Time.now.utc)$/;" S module:ClockworkWeb
+on_health_check lib/clockwork_web.rb /^ attr_accessor :on_health_check$/;" A module:ClockworkWeb
+on_health_check= lib/clockwork_web.rb /^ attr_accessor :on_health_check$/;" A module:ClockworkWeb
+on_job_update lib/clockwork_web.rb /^ attr_accessor :on_job_update$/;" A module:ClockworkWeb
+on_job_update= lib/clockwork_web.rb /^ attr_accessor :on_job_update$/;" A module:ClockworkWeb
+overdue? app/helpers/clockwork_web/home_helper.rb /^ def overdue?(event, last_run)$/;" f module:ClockworkWeb.HomeHelper
+overdue? lib/clockwork_web.rb /^ def self.overdue?(event, last_run_time, now = Time.now.utc)$/;" S module:ClockworkWeb
+overdue_details lib/clockwork_web.rb /^ def self.overdue_details(events, last_runs, now = Time.now)$/;" S module:ClockworkWeb
+redis lib/clockwork_web.rb /^ attr_accessor :redis$/;" A module:ClockworkWeb
+redis= lib/clockwork_web.rb /^ attr_accessor :redis$/;" A module:ClockworkWeb
+running? lib/clockwork_web.rb /^ def self.running?$/;" S module:ClockworkWeb
+running_threshold lib/clockwork_web.rb /^ attr_accessor :running_threshold$/;" A module:ClockworkWeb
+running_threshold= lib/clockwork_web.rb /^ attr_accessor :running_threshold$/;" A module:ClockworkWeb
+set_last_run lib/clockwork_web.rb /^ def self.set_last_run(job)$/;" S module:ClockworkWeb
+should_have_run_at app/helpers/clockwork_web/home_helper.rb /^ def should_have_run_at(event, last_run)$/;" f module:ClockworkWeb.HomeHelper
+should_have_run_at lib/clockwork_web.rb /^ def self.should_have_run_at(event, last_run_time, now = Time.now.utc)$/;" S module:ClockworkWeb
+test_root test/controller_test.rb /^ def test_root$/;" f class:ControllerTest
+user_method lib/clockwork_web.rb /^ attr_accessor :user_method$/;" A module:ClockworkWeb
+user_method= lib/clockwork_web.rb /^ attr_accessor :user_method$/;" A module:ClockworkWeb
+warning_threshold lib/clockwork_web.rb /^ attr_accessor :warning_threshold$/;" A module:ClockworkWeb
+warning_threshold= lib/clockwork_web.rb /^ attr_accessor :warning_threshold$/;" A module:ClockworkWeb
|