tab_keeper 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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