whenever-web 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 64df975657844372895e97d3b585340e492a100e
4
- data.tar.gz: 5f91b654b17c80c8d39e9111cc0dc6c9224aafd1
3
+ metadata.gz: 9bff8d51d0cc7b17cefe45c45cf5e4f4002ff6eb
4
+ data.tar.gz: 095e0103aa282daebf98852658fa82865f6dd35f
5
5
  SHA512:
6
- metadata.gz: cf8ed3d7e33117f3cf59ae4b8de244b17822ba79fb1d98801435d005077475f5aa650e41f63c0e342cf06e0da934361a78e74c5fb752e1be504f5cf5479fe909
7
- data.tar.gz: ad144adcf4cac3031b654122c7a94be67880ff71f72dbf8a606054de37d09da3b8c4d2876fd5f61521c9f0cd2991d5a4316b8a9cbb03feecae2ede2747361b8d
6
+ metadata.gz: 9a23e505e1512327fbdf029a6a3055f9a4f1d74c537f12062bc80f50f9b272da79c30568f79f944a984b72bad2df254211e6ed655d6af376bbb1b7d2815bf4c2
7
+ data.tar.gz: b89f2f869524a4b8211a5ffd28b4ef6f4d6b6ff7f6bd6c609af81f21a3e25bd81e491f0a0690c41b06acd38c4506de9927816dd2fad379e5b376552f320c262b
data/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Whenever Web
2
2
 
3
+ Whenever Web is a Rails engine, that can be easily integrated with your admin panel layout.
4
+
5
+ ![Whenever Web](http://i.imgur.com/d6whPlQ.png)
6
+
3
7
  ## Installation
4
8
 
5
9
  Add this line to your application's Gemfile:
@@ -12,27 +16,29 @@ And then execute:
12
16
 
13
17
  ## Usage
14
18
 
15
- Mount the engine in your `routes.rb`:
19
+ 1. Mount the engine in your `routes.rb`:
16
20
 
17
- ```ruby
18
- MyApp::Application.routes.draw do
19
- # ...
20
- mount Whenever::Web, at: '/whenever'
21
- # ...
22
- end
23
- ```
21
+ ```ruby
22
+ MyApp::Application.routes.draw do
23
+ # ...
24
+ mount Whenever::Web, at: '/whenever'
25
+ # ...
26
+ end
27
+ ```
24
28
 
25
- And go to `/whenever`.
29
+ 2. Go to [localhost:3000/whenever](http://localhost:3000/whenever).
26
30
 
27
- You can add a link to the panel in your views:
31
+ 3. Add a link to the panel in your views:
28
32
 
29
- ```ruby
30
- = link_to 'Cron Jobs', whenever_path
31
- ```
33
+ ```ruby
34
+ = link_to 'Cron Jobs', whenever_path
35
+ ```
32
36
 
33
- You can also optionally describe the Cron jobs in `schedule.rb`:
37
+ ## Optional usage
34
38
 
35
- ```
39
+ Describe your Cron jobs in `schedule.rb` by using `desc` method:
40
+
41
+ ```ruby
36
42
  require 'whenever/web'
37
43
 
38
44
  every 1.day, at: '3:00 am' do
@@ -41,6 +47,18 @@ every 1.day, at: '3:00 am' do
41
47
  end
42
48
  ```
43
49
 
50
+ ## Custom configuration
51
+
52
+ Put this into `config/initializers/whenever_web.rb`:
53
+
54
+ ```ruby
55
+ # Specify your own controller base eg. 'Admin::AdminController'
56
+ # Whenever::Web.config.parent_controller = 'Whenever::WebController'
57
+
58
+ # Change default schedule file path
59
+ # Whenever::Web.config.schedule_file = 'config/schedule.rb'
60
+ ```
61
+
44
62
  ## Contributing
45
63
 
46
64
  1. Fork it (http://github.com/bartoszkopinski/whenever-web/fork)
@@ -1,22 +1,13 @@
1
1
  module Whenever
2
- class JobsController < ActionController::Base
3
- before_filter :list_jobs
4
- layout 'admin'
5
-
2
+ class JobsController < Web.config.parent_controller
6
3
  def index
4
+ @crontab = CommandLine.new.send(:read_crontab)
7
5
  end
8
6
 
9
7
  def run
10
- job = @job_list.web_jobs.fetch(params[:id].to_i)
11
- `#{job.command}`
12
- flash[:notice] = job.command
13
- redirect_to jobs_path
14
- end
15
-
16
- private
17
-
18
- def list_jobs
19
- @job_list = WebJobList.new(file: 'config/schedule.rb')
8
+ runner = JobRunner.new(params[:id])
9
+ runner.run
10
+ redirect_to jobs_path, notice: t('.success', command: runner.command)
20
11
  end
21
12
  end
22
13
  end
@@ -0,0 +1,14 @@
1
+ module Whenever
2
+ class LogsController < Web.config.parent_controller
3
+ def clear
4
+ log.clear
5
+ redirect_to jobs_path, notice: t('.success', kind: log.kind)
6
+ end
7
+
8
+ protected
9
+
10
+ def log
11
+ @log ||= Web.job_list.logs.fetch(params[:kind])
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ module Whenever
2
+ class WebController < ActionController::Base
3
+ layout Web.config.layout
4
+ end
5
+ end
@@ -1,5 +1,9 @@
1
1
  module Whenever
2
2
  module JobsHelper
3
+ def job_list
4
+ @job_list ||= Web.job_list
5
+ end
6
+
3
7
  def method_missing(method, *args, &block)
4
8
  main_app.send(method, *args, &block)
5
9
  rescue NoMethodError
File without changes
@@ -0,0 +1,22 @@
1
+ module Whenever
2
+ class Log
3
+ attr_reader :kind
4
+
5
+ def initialize kind, path
6
+ @kind = kind
7
+ @path = path
8
+ end
9
+
10
+ def name
11
+ "#{@kind}_log"
12
+ end
13
+
14
+ def tail
15
+ File.read(@path)
16
+ end
17
+
18
+ def clear
19
+ File.write(@path, nil)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ module Whenever
2
+ class WebConfig
3
+ attr_accessor :schedule_file, :parent_controller, :layout
4
+
5
+ def initialize
6
+ @schedule_file = 'config/schedule.rb'
7
+ @parent_controller = 'Whenever::WebController'
8
+ @layout = 'admin'
9
+ end
10
+
11
+ def parent_controller
12
+ @parent_controller.to_s.constantize
13
+ end
14
+ end
15
+ end
@@ -3,26 +3,31 @@ require 'whenever/patches/job'
3
3
  module Whenever
4
4
  class WebJob
5
5
  include ActionView::Helpers::DateHelper
6
- attr_reader :interval, :job
6
+ attr_reader :interval
7
7
 
8
8
  def initialize job, interval
9
9
  @job = job
10
10
  @interval = interval
11
11
  end
12
12
 
13
- def description
14
- @job.options.fetch(:description) {
15
- @job.options[:task]
16
- }
13
+ delegate :output, :at, to: :@job
14
+
15
+ def task
16
+ @job.options[:task]
17
17
  end
18
18
 
19
- def command
20
- replacements = @job.options.map{ |k, v| [":#{k}", v] }.to_h
21
- @job.template.gsub(/:\w+/, replacements)
19
+ def description
20
+ @job.options.fetch(:description) { task }
22
21
  end
23
22
 
24
23
  def interval
25
- distance_of_time_in_words(@interval)
24
+ distance_of_time_in_words(@interval).gsub('about', '')
25
+ rescue ArgumentError
26
+ @interval
27
+ end
28
+
29
+ def roles
30
+ @job.roles.join(', ')
26
31
  end
27
32
  end
28
33
  end
@@ -2,22 +2,43 @@ require 'whenever/patches/job_list'
2
2
 
3
3
  module Whenever
4
4
  class WebJobList < JobList
5
- attr_reader :set_variables
5
+ include Enumerable
6
+ attr_reader :set_variables, :job_types
7
+
8
+ delegate :fetch, :each, to: :web_jobs
6
9
 
7
10
  def web_jobs
8
- @jobs.flat_map do |interval, jobs|
9
- jobs.map do |job|
10
- WebJob.new(job, interval)
11
+ @web_jobs ||= begin
12
+ @jobs.flat_map do |interval, jobs|
13
+ jobs.map do |job|
14
+ WebJob.new(job, interval)
15
+ end
11
16
  end
12
17
  end
13
18
  end
14
19
 
15
- def error_log
16
- File.read(set_variables[:output][:error])
20
+ def logs
21
+ @logs ||= fetch_logs(@set_variables[:output])
22
+ end
23
+
24
+ alias_method :old_job_type, :job_type
25
+
26
+ def job_type name, template
27
+ (@job_types ||= {})[name] = template
28
+ old_job_type name, template
17
29
  end
18
30
 
19
- def standard_log
20
- File.read(set_variables[:output][:standard])
31
+ protected
32
+
33
+ def fetch_logs path, kind = 'standard'
34
+ case path
35
+ when Hash
36
+ path.map{ |k, v| fetch_logs(v, k) }.inject(:merge)
37
+ when String
38
+ { kind.to_s => Log.new(kind, path) }
39
+ else
40
+ {}
41
+ end
21
42
  end
22
43
  end
23
44
  end
@@ -0,0 +1,25 @@
1
+ module Whenever
2
+ class JobRunner
3
+ def initialize job_id
4
+ @job_id = job_id.to_i
5
+ end
6
+
7
+ def run
8
+ `#{environment_variables} #{command}`
9
+ end
10
+
11
+ def command
12
+ web_job.output
13
+ end
14
+
15
+ protected
16
+
17
+ def web_job
18
+ @web_job ||= Web.job_list.fetch(@job_id)
19
+ end
20
+
21
+ def environment_variables
22
+ @environment_variables ||= Web.job_list.environment_variables
23
+ end
24
+ end
25
+ end
@@ -1,70 +1,93 @@
1
1
  <div class="panel panel-default">
2
- <div class="panel-heading">
3
- <div class="panel-title">
4
- Settings
2
+ <div class="panel-heading clearfix">
3
+ <div class="panel-title pull-left">
4
+ <%= t('whenever.cron_jobs') %>
5
5
  </div>
6
6
  </div>
7
7
  <table class="table">
8
8
  <thead>
9
9
  <tr>
10
- <% @job_list.set_variables.keys.each do |k| %>
11
- <th><%= k.to_s.humanize %></th>
12
- <% end %>
10
+ <th><%= t('whenever.task') %></th>
11
+ <th><%= t('whenever.interval') %></th>
12
+ <th><%= t('whenever.hour') %></th>
13
+ <th><%= t('whenever.roles') %></th>
14
+ <th><%= t('whenever.action') %></th>
13
15
  </tr>
14
16
  </thead>
15
17
  <tbody>
18
+ <% job_list.each_with_index do |job, i| %>
16
19
  <tr>
17
- <% @job_list.set_variables.values.each do |v| %>
18
- <td><%= v %></td>
19
- <% end %>
20
+ <td><%= job.description %></td>
21
+ <td><%= job.interval %></td>
22
+ <td><%= job.at %></td>
23
+ <td><%= job.roles %></td>
24
+ <td><%= link_to t('whenever.run_now'), run_job_path(i), class: 'btn btn-danger', title: job.output %></td>
20
25
  </tr>
26
+ <% end %>
21
27
  </tbody>
22
28
  </table>
23
29
  </div>
30
+ <% job_list.logs.each do |_, log| %>
31
+ <div class="panel panel-default">
32
+ <div class="panel-heading clearfix">
33
+ <div class="panel-title pull-left">
34
+ <%= t("whenever.#{log.name}") %>
35
+ </div>
36
+ <div class="pull-right">
37
+ <%= link_to t('whenever.clear'), clear_log_path(log.kind), class: 'btn btn-xs btn-warning' %>
38
+ </div>
39
+ </div>
40
+ <%= text_area_tag(log.name, log.tail, rows: 15, class: 'form-control', disabled: 'disabled') %>
41
+ </div>
42
+ <script type="text/javascript">
43
+ var <%= log.name %> = document.getElementById('<%= log.name %>');
44
+ <%= log.name %>.scrollTop = <%= log.name %>.scrollHeight;
45
+ </script>
46
+ <% end %>
24
47
  <div class="panel panel-default">
25
- <div class="panel-heading">
26
- <div class="panel-title">
27
- Cron jobs
48
+ <div class="panel-heading clearfix">
49
+ <div class="panel-title pull-left">
50
+ <%= t('whenever.options') %>
28
51
  </div>
29
52
  </div>
30
53
  <table class="table">
31
54
  <thead>
32
55
  <tr>
33
- <th>Task</th>
34
- <th>Interval</th>
35
- <th>Action</th>
56
+ <th><%= t('whenever.settings') %></th>
57
+ <th></th>
36
58
  </tr>
37
59
  </thead>
38
60
  <tbody>
39
- <% @job_list.web_jobs.each_with_index do |job, i| %>
40
- <tr>
41
- <td><%= job.description %></td>
42
- <td><%= job.interval %></td>
43
- <td><%= link_to 'Run now', run_job_path(i), class: 'btn btn-danger', title: job.command %></td>
44
- </tr>
61
+ <% job_list.set_variables.each do |k, v| %>
62
+ <tr>
63
+ <td><%= k %></td>
64
+ <td><%= v %></td>
65
+ </tr>
66
+ <% end %>
67
+ <thead>
68
+ <tr>
69
+ <th><%= t('whenever.job_types') %></th>
70
+ <th></th>
71
+ </tr>
72
+ </thead>
73
+ <% job_list.job_types.each do |k, v| %>
74
+ <tr>
75
+ <td><%= k %></td>
76
+ <td><%= v %></td>
77
+ </tr>
45
78
  <% end %>
46
79
  </tbody>
47
80
  </table>
48
81
  </div>
82
+ <% if @crontab.present? %>
49
83
  <div class="panel panel-default">
50
- <div class="panel-heading">
51
- <div class="panel-title">
52
- Error log
84
+ <div class="panel-heading clearfix">
85
+ <div class="panel-title pull-left">
86
+ <%= t('whenever.cron_tab') %>
53
87
  </div>
54
88
  </div>
55
- <%= text_area(:job_list, :error_log, rows: 15, class: 'form-control', disabled: 'disabled') %>
89
+ <pre>
90
+ <%= @crontab %>
91
+ </pre>
56
92
  </div>
57
- <div class="panel panel-default">
58
- <div class="panel-heading">
59
- <div class="panel-title">
60
- Standard log
61
- </div>
62
- </div>
63
- <%= text_area(:job_list, :standard_log, rows: 15, class: 'form-control', disabled: 'disabled') %>
64
- </div>
65
- <script type="text/javascript">
66
- var error_log = document.getElementById('job_list_error_log');
67
- var standard_log = document.getElementById('job_list_standard_log');
68
- error_log.scrollTop = error_log.scrollHeight;
69
- standard_log.scrollTop = standard_log.scrollHeight;
70
- </script>
93
+ <% end %>
@@ -0,0 +1,8 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ %body
5
+ .container
6
+ .row
7
+ = yield
8
+ %footer
@@ -0,0 +1,18 @@
1
+ en:
2
+ whenever:
3
+ logs:
4
+ clear:
5
+ success: "%{kind} log cleaned!"
6
+ jobs:
7
+ run:
8
+ success: "Task run: %{command}"
9
+ action: Action
10
+ cron_jobs: Cron jobs
11
+ error_log: Error log
12
+ hour: Hour
13
+ interval: Interval
14
+ roles: Roles
15
+ run_now: Run now
16
+ settings: Settings
17
+ standard_log: Standard log
18
+ task: Task
@@ -1,4 +1,5 @@
1
1
  Whenever::Web.routes.draw do
2
2
  get '/', to: 'jobs#index', as: :jobs
3
3
  get 'job/:id/run', to: 'jobs#run', as: :run_job
4
+ get 'log/:kind/clear', to: 'logs#clear', as: :clear_log
4
5
  end
@@ -2,6 +2,6 @@ require 'whenever/job'
2
2
 
3
3
  module Whenever
4
4
  class Job
5
- attr_reader :options, :template
5
+ attr_reader :options, :template, :at, :roles
6
6
  end
7
7
  end
@@ -2,6 +2,8 @@ require 'whenever/job_list'
2
2
 
3
3
  module Whenever
4
4
  class JobList
5
+ public :environment_variables
6
+
5
7
  def desc description
6
8
  @options[:description] = description
7
9
  end
@@ -5,7 +5,17 @@ require 'whenever/patches/job_list'
5
5
 
6
6
  module Whenever
7
7
  class Web < ::Rails::Engine
8
- engine_name 'whenever'
8
+ engine_name self.name.deconstantize
9
9
  isolate_namespace Whenever
10
+
11
+ class << self
12
+ def config
13
+ @config ||= Whenever::WebConfig.new
14
+ end
15
+
16
+ def job_list
17
+ Whenever::WebJobList.new(file: config.schedule_file)
18
+ end
19
+ end
10
20
  end
11
21
  end
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "whenever-web"
7
- spec.version = "0.0.4"
7
+ spec.version = "0.0.5"
8
8
  spec.authors = ["Bartosz Kopinski"]
9
9
  spec.email = ["bartosz.kopinski@gmail.pl"]
10
10
  spec.summary = %q{Web GUI for Whenever gem}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whenever-web
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bartosz Kopinski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-06 00:00:00.000000000 Z
11
+ date: 2014-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -78,12 +78,19 @@ files:
78
78
  - LICENSE
79
79
  - README.md
80
80
  - Rakefile
81
- - app/controllers/whenever/application_controller.rb
82
81
  - app/controllers/whenever/jobs_controller.rb
82
+ - app/controllers/whenever/logs_controller.rb
83
+ - app/controllers/whenever/web_controller.rb
83
84
  - app/helpers/whenever/jobs_helper.rb
85
+ - app/models/whenever/cron_tab.rb
86
+ - app/models/whenever/log.rb
87
+ - app/models/whenever/web_config.rb
84
88
  - app/models/whenever/web_job.rb
85
89
  - app/models/whenever/web_job_list.rb
90
+ - app/services/whenever/job_runner.rb
86
91
  - app/views/whenever/jobs/index.html.erb
92
+ - app/views/whenever/layouts/admin.html.haml
93
+ - config/locales/en.yml
87
94
  - config/routes.rb
88
95
  - lib/whenever/patches/job.rb
89
96
  - lib/whenever/patches/job_list.rb
@@ -109,8 +116,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
116
  version: '0'
110
117
  requirements: []
111
118
  rubyforge_project:
112
- rubygems_version: 2.2.0.rc.1
119
+ rubygems_version: 2.2.2
113
120
  signing_key:
114
121
  specification_version: 4
115
122
  summary: Web GUI for Whenever gem
116
123
  test_files: []
124
+ has_rdoc:
@@ -1,4 +0,0 @@
1
- module Whenever
2
- class ApplicationController < ActionController::Base
3
- end
4
- end