tab_keeper 0.1.0 → 0.2.0

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: 29235a8d42173d34b28beb02ec01bb82285aa12c
4
- data.tar.gz: c3978f99e2fcc255ff2d7f68590e46e162a6c498
3
+ metadata.gz: a8ba88f83d4c927a0292c8b47f8f2d2141de23b0
4
+ data.tar.gz: 837513550403d5cd3be0f680bad666396394323b
5
5
  SHA512:
6
- metadata.gz: 59272e872de28887507c2ec2a7712695d2a442e0d788c96a05327eadb5d8f1aff727e41c4c4ed9179780cea7fcf2507aa41fdf303a7276e3327a0c0c3d7ad415
7
- data.tar.gz: f92e98d7503c162a0679a145c38e1d39e566137d4b7beb43bf7b164d6522f97053002c6ee6dbffc98a12f267690626b11930bf8ba656f476c4dbadf04ef46338
6
+ metadata.gz: 2cb9a5365b000ab3a1f74fe75365f441ac494b0fa15478c297007370c59a2d4eac0a0981d5a19578a498e6cf047199e80523f34f4b7b550e08d229e1c2328001
7
+ data.tar.gz: bb7ce75b083aab8e8ee56e09ff1a48cca4a1156ab3a9a943a8493dc2c928c087fe1c06f14ec7a2d48cbd471200d6686d97355a940547aef75e9a18fbb25d2174
@@ -5,11 +5,34 @@ module TabKeeper
5
5
  end
6
6
 
7
7
  def generate(job_list, **options)
8
+ rows = rows(job_list, **options)
9
+ validate_rows!(rows)
10
+ rows.join("\n\n") + "\n"
11
+ end
12
+
13
+ private
14
+
15
+ def validate_rows!(rows)
16
+ too_long_rows = rows.reject { |row| row.length < 900 }
17
+ return unless too_long_rows.any?
18
+ raise "The following rows are too long for a cron file, and may be truncated:\n" \
19
+ "#{too_long_rows.join("\n\n")}"
20
+ end
21
+
22
+ def rows(job_list, **options)
8
23
  job_list.map do |job, timing|
9
- timing + " " + @pipeline.reduce(nil) do |previous, pipe|
10
- pipe.new(previous, job: job, timing: timing, **options).to_s
11
- end
12
- end.join("\n\n") + "\n"
24
+ timing + " " + cron_escape(apply_pipeline(job, timing, **options))
25
+ end
26
+ end
27
+
28
+ def apply_pipeline(job, timing, **options)
29
+ @pipeline.reduce(nil) do |previous, pipe|
30
+ pipe.new(previous, job: job, timing: timing, **options).to_s
31
+ end
32
+ end
33
+
34
+ def cron_escape(input)
35
+ input.chars.map { |char| char == '%' ? "\\%" : char }.join
13
36
  end
14
37
  end
15
38
  end
@@ -20,7 +20,7 @@ module TabKeeper
20
20
  # Normalise the job name: if it's an array take the first thing, then get the last
21
21
  # thing after a "::" (if it's a class name), or a "/" (if it's a script, and removes
22
22
  # the need to escape yay)
23
- job_name = Array(@job).first.to_s.split(/((::)|\/)/).last
23
+ job_name = Array(@job).first.to_s.split(/((::)|\/)/).last.split(/[^\w\d]/).first
24
24
  @job_name = job_name_proc.call(job_name)
25
25
  @timing = timing
26
26
  @log_directory = log_directory
@@ -60,7 +60,7 @@ module TabKeeper
60
60
  hour_component,
61
61
  min_component,
62
62
  second_component
63
- ].compact.join('-').chars.map { |char| char == '%' ? '\%' : char }.join
63
+ ].compact.join('-')
64
64
  end
65
65
 
66
66
  def day_component
@@ -72,7 +72,7 @@ module TabKeeper
72
72
  end
73
73
 
74
74
  def min_component
75
- '%m' if more_than_once_a_day?
75
+ '%M' if more_than_once_a_day?
76
76
  end
77
77
 
78
78
  def second_component
@@ -1,3 +1,3 @@
1
1
  module TabKeeper
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -10,25 +10,39 @@ RSpec.describe TabKeeper::Generator do
10
10
  end.to_a
11
11
  end
12
12
 
13
- let(:pipeline) { [TabKeeper::RailsRunner, TabKeeper::LoginShell] }
13
+ let(:pipeline) do
14
+ [TabKeeper::RailsRunner, TabKeeper::LogRedirection, TabKeeper::LoginShell]
15
+ end
14
16
  let(:options) do
15
17
  {
16
18
  code_directory: '/path/to/code',
17
- rails_env: :production
19
+ rails_env: :production,
20
+ log_directory: '/path/to/logs',
21
+ include_date_in_log_name: true
18
22
  }
19
23
  end
20
24
 
21
25
  it do
22
26
  is_expected.to eq <<-CRONTAB
23
- */5 * * * * /bin/bash -l -c 'cd /path/to/code && bin/rails runner -e production '\\''FrequentJob.run'\\'''
27
+ */5 * * * * /bin/bash -l -c 'cd /path/to/code && bin/rails runner -e production '\\''FrequentJob.run'\\'' >> /path/to/logs/FrequentJob_`date +\\%Y-\\%m-\\%d-\\%H-\\%M-\\%s`.log 2>&1'
24
28
 
25
- 0 0 * * * /bin/bash -l -c 'cd /path/to/code && bin/rails runner -e production '\\''MidnightJob.run'\\'''
29
+ 0 0 * * * /bin/bash -l -c 'cd /path/to/code && bin/rails runner -e production '\\''MidnightJob.run'\\'' >> /path/to/logs/MidnightJob_`date +\\%Y-\\%m-\\%d`.log 2>&1'
26
30
 
27
- 30 12 * * * /bin/bash -l -c 'cd /path/to/code && bin/rails runner -e production '\\''LunchtimeJob.run'\\'''
31
+ 30 12 * * * /bin/bash -l -c 'cd /path/to/code && bin/rails runner -e production '\\''LunchtimeJob.run'\\'' >> /path/to/logs/LunchtimeJob_`date +\\%Y-\\%m-\\%d`.log 2>&1'
28
32
 
29
- 30 7 * * 1 /bin/bash -l -c 'cd /path/to/code && bin/rails runner -e production '\\''HappyMondayJob.run'\\'''
33
+ 30 7 * * 1 /bin/bash -l -c 'cd /path/to/code && bin/rails runner -e production '\\''HappyMondayJob.run'\\'' >> /path/to/logs/HappyMondayJob_`date +\\%Y-\\%m-\\%d`.log 2>&1'
30
34
 
31
- 15 16 25 * * /bin/bash -l -c 'cd /path/to/code && bin/rails runner -e production '\\''PaydayJob.run'\\'''
35
+ 15 16 25 * * /bin/bash -l -c 'cd /path/to/code && bin/rails runner -e production '\\''PaydayJob.run'\\'' >> /path/to/logs/PaydayJob_`date +\\%Y-\\%m`.log 2>&1'
32
36
  CRONTAB
33
37
  end
38
+
39
+ context "when the line gets over 900 characters long" do
40
+ let(:job_list) do
41
+ TabKeeper::JobList.new { |tab| tab.daily("A" * 901, hour: 12) }.to_a
42
+ end
43
+
44
+ it "raises" do
45
+ expect { subject }.to raise_error(/too long/)
46
+ end
47
+ end
34
48
  end
@@ -1,7 +1,7 @@
1
1
  RSpec.describe TabKeeper::LogRedirection do
2
2
  let(:instance) do
3
3
  described_class.new("scripts/thing",
4
- job: "scripts/thing",
4
+ job: "scripts/thing.sh",
5
5
  job_name_proc: job_name_proc,
6
6
  timing: timing,
7
7
  log_directory: "/path/to/logs",
@@ -34,7 +34,7 @@ RSpec.describe TabKeeper::LogRedirection do
34
34
  it do
35
35
  is_expected.to eq(
36
36
  "scripts/thing >> /path/to/logs/thing_" \
37
- "`date +\\%Y-\\%m-\\%d-\\%H-\\%m-\\%s`.log 2>&1")
37
+ "`date +%Y-%m-%d-%H-%M-%s`.log 2>&1")
38
38
  end
39
39
  end
40
40
 
@@ -43,7 +43,7 @@ RSpec.describe TabKeeper::LogRedirection do
43
43
  it do
44
44
  is_expected.to eq(
45
45
  "scripts/thing >> /path/to/logs/thing_" \
46
- "`date +\\%Y-\\%m-\\%d-\\%H-\\%m`.log 2>&1")
46
+ "`date +%Y-%m-%d-%H-%M`.log 2>&1")
47
47
  end
48
48
  end
49
49
 
@@ -52,7 +52,7 @@ RSpec.describe TabKeeper::LogRedirection do
52
52
  it do
53
53
  is_expected.to eq(
54
54
  "scripts/thing >> /path/to/logs/thing_" \
55
- "`date +\\%Y-\\%m-\\%d`.log 2>&1")
55
+ "`date +%Y-%m-%d`.log 2>&1")
56
56
  end
57
57
 
58
58
  context "with a separate error file" do
@@ -60,8 +60,8 @@ RSpec.describe TabKeeper::LogRedirection do
60
60
  it do
61
61
  is_expected.to eq(
62
62
  "scripts/thing " \
63
- ">> /path/to/logs/thing_`date +\\%Y-\\%m-\\%d`.log " \
64
- "2>> /path/to/logs/thing_`date +\\%Y-\\%m-\\%d`.error.log")
63
+ ">> /path/to/logs/thing_`date +%Y-%m-%d`.log " \
64
+ "2>> /path/to/logs/thing_`date +%Y-%m-%d`.error.log")
65
65
  end
66
66
  end
67
67
 
@@ -70,7 +70,7 @@ RSpec.describe TabKeeper::LogRedirection do
70
70
  it do
71
71
  is_expected.to eq(
72
72
  "scripts/thing >> /path/to/logs/thing_sadness_" \
73
- "`date +\\%Y-\\%m-\\%d`.log 2>&1")
73
+ "`date +%Y-%m-%d`.log 2>&1")
74
74
  end
75
75
  end
76
76
  end
@@ -80,7 +80,7 @@ RSpec.describe TabKeeper::LogRedirection do
80
80
  it do
81
81
  is_expected.to eq(
82
82
  "scripts/thing >> /path/to/logs/thing_" \
83
- "`date +\\%Y-\\%m-\\%d`.log 2>&1")
83
+ "`date +%Y-%m-%d`.log 2>&1")
84
84
  end
85
85
  end
86
86
 
@@ -89,7 +89,7 @@ RSpec.describe TabKeeper::LogRedirection do
89
89
  it do
90
90
  is_expected.to eq(
91
91
  "scripts/thing >> /path/to/logs/thing_" \
92
- "`date +\\%Y-\\%m`.log 2>&1")
92
+ "`date +%Y-%m`.log 2>&1")
93
93
  end
94
94
  end
95
95
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tab_keeper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Isaac Seymour
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-20 00:00:00.000000000 Z
11
+ date: 2015-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler