surrender 0.8.2 → 0.8.3

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.
data/README.md CHANGED
@@ -22,7 +22,7 @@ Or install it yourself as:
22
22
 
23
23
  Acts as a filter, returning files which should be removed from a backup scheme:
24
24
 
25
- $ find /var/backup/database -type f | sort | surrender --most-recent=7 --weekly=5 --monthly=12 --yearly=2 | xargs rm
25
+ $ find /var/backup/database -type f | sort | surrender --most-recent=7 --weekly=5 --monthly=12 --yearly=2 | xargs rm --verbose
26
26
 
27
27
  Would keep the most recent 7 files, irrespective of their dates, the 5 most recent
28
28
  weekly backups, the 12 most recent monthly backups, and the 2 most recent yearly
@@ -45,6 +45,32 @@ STDOUT, implying the file must be kept.
45
45
  Incidentally, all parameters to surrender are optional. The default values are the ones expressed above.
46
46
  surrender uses a constant amount of memory, related to the total number of files in the input stream.
47
47
 
48
+ ## Viewing the inner workings
49
+
50
+ If you pass the `--verbose` option, Surrender will tell you how it arrived at it's decision:
51
+
52
+ $ for DATE in 2013-12-{10..20} ; do echo "backup.${DATE}.tar.gz" ; done | RUBYOPT=-Ilib bin/surrender --verbose
53
+ "backup.2013-12-10.tar.gz": most recent=delete, weekly=delete, monthly=delete, yearly=delete
54
+ "backup.2013-12-11.tar.gz": most recent=delete, weekly=delete, monthly=delete, yearly=delete
55
+ "backup.2013-12-12.tar.gz": most recent=delete, weekly=delete, monthly=delete, yearly=delete
56
+ "backup.2013-12-13.tar.gz": most recent=delete, weekly=delete, monthly=delete, yearly=delete
57
+ "backup.2013-12-14.tar.gz": most recent=keep, weekly=keep, monthly=delete, yearly=delete
58
+ "backup.2013-12-15.tar.gz": most recent=keep, weekly=delete, monthly=delete, yearly=delete
59
+ "backup.2013-12-16.tar.gz": most recent=keep, weekly=delete, monthly=delete, yearly=delete
60
+ "backup.2013-12-17.tar.gz": most recent=keep, weekly=delete, monthly=delete, yearly=delete
61
+ "backup.2013-12-18.tar.gz": most recent=keep, weekly=delete, monthly=delete, yearly=delete
62
+ "backup.2013-12-19.tar.gz": most recent=keep, weekly=delete, monthly=delete, yearly=delete
63
+ "backup.2013-12-20.tar.gz": most recent=keep, weekly=keep, monthly=keep, yearly=keep
64
+ backup.2013-12-10.tar.gz
65
+ backup.2013-12-11.tar.gz
66
+ backup.2013-12-12.tar.gz
67
+ backup.2013-12-13.tar.gz
68
+
69
+ In this example, you can see that the `backup.2013-12-10.tar.gz` file was voted to be deleted by all
70
+ policies, while `backup.2013-12-14.tar.gz` was voted to be kept by the most recent and weekly policies.
71
+
72
+ The `--verbose` flag outputs to STDERR, keeping STDOUT clean.
73
+
48
74
  ## Contributing
49
75
 
50
76
  1. Fork it
data/bin/surrender CHANGED
@@ -11,6 +11,8 @@ options = ARGV.each_with_object(Surrender::DEFAULT_ARGUMENTS.dup) do |arg, memo|
11
11
  memo[:monthly] = Integer($1)
12
12
  when /^--yearly=(\d+)$/
13
13
  memo[:yearly] = Integer($1)
14
+ when /^--verbose$/
15
+ memo[:verbose] = true
14
16
  else
15
17
  raise ArgumentError, "Unknown option #{arg.inspect}"
16
18
  end
@@ -7,6 +7,10 @@ module Surrender
7
7
 
8
8
  attr_reader :count, :memo
9
9
 
10
+ def name
11
+ self.class.name.sub("Policy", "").sub("Surrender::", "").downcase
12
+ end
13
+
10
14
  def add(filename, date)
11
15
  memo[bucket(date)] = filename
12
16
  memo.delete(memo.keys.first) if memo.size > count
@@ -7,6 +7,10 @@ module Surrender
7
7
 
8
8
  attr_reader :count, :memo
9
9
 
10
+ def name
11
+ "most recent"
12
+ end
13
+
10
14
  def add(filename, _)
11
15
  memo << filename
12
16
  memo.shift if memo.size > count
@@ -1,3 +1,3 @@
1
1
  module Surrender
2
- VERSION = "0.8.2"
2
+ VERSION = "0.8.3"
3
3
  end
data/lib/surrender.rb CHANGED
@@ -7,6 +7,7 @@ require "date"
7
7
 
8
8
  module Surrender
9
9
  DEFAULT_ARGUMENTS = {
10
+ verbose: false,
10
11
  most_recent: 7,
11
12
  weekly: 5,
12
13
  monthly: 12,
@@ -21,6 +22,8 @@ module Surrender
21
22
  extra_keys = options.keys - DEFAULT_ARGUMENTS.keys
22
23
  raise ArgumentError, "Unknown keys: #{extra_keys.inspect} -- won't proceed" unless extra_keys.empty?
23
24
 
25
+ verbose = options[:verbose]
26
+
24
27
  policies = [
25
28
  Surrender::MostRecentPolicy.new(options.fetch(:most_recent)),
26
29
  Surrender::WeeklyPolicy.new(options.fetch(:weekly)),
@@ -41,6 +44,13 @@ module Surrender
41
44
  end
42
45
 
43
46
  deleteable = valid_filenames.select do |filename|
47
+ if verbose then
48
+ message = policies.map do |policy|
49
+ "#{policy.name}=#{policy.deleteable?(filename) ? "delete" : "keep"}"
50
+ end.join(", ")
51
+ STDERR.puts "#{filename.inspect}: #{message}"
52
+ end
53
+
44
54
  policies.all?{|policy| policy.deleteable?(filename)}
45
55
  end
46
56
 
@@ -5,6 +5,8 @@ describe Surrender::MonthlyPolicy do
5
5
  context "when count = 3" do
6
6
  subject { Surrender::MonthlyPolicy.new(3) }
7
7
 
8
+ it { subject.name.should == "monthly" }
9
+
8
10
  it "keeps the latest backup of the last three months" do
9
11
  subject.add "a", Date.new(2013, 3, 1)
10
12
  subject.add "b", Date.new(2013, 3, 15)
@@ -5,6 +5,8 @@ describe Surrender::MostRecentPolicy do
5
5
  context "when count = 1" do
6
6
  subject { Surrender::MostRecentPolicy.new(1) }
7
7
 
8
+ it { subject.name.should == "most recent" }
9
+
8
10
  it "keeps the last entry only" do
9
11
  filename1 = "/var/backups/20130801.sql.gz"
10
12
  subject.add filename1, Date.new(2013, 8, 1)
@@ -5,6 +5,8 @@ describe Surrender::WeeklyPolicy do
5
5
  context "when count = 1" do
6
6
  subject { Surrender::WeeklyPolicy.new(1) }
7
7
 
8
+ it { subject.name.should == "weekly" }
9
+
8
10
  it "keeps the last filename per week" do
9
11
  subject.add "a", Date.new(2013, 8, 4)
10
12
  subject.deleteable?("a").should == false
@@ -5,6 +5,8 @@ describe Surrender::YearlyPolicy do
5
5
  context "when count = 2" do
6
6
  subject { Surrender::YearlyPolicy.new(2) }
7
7
 
8
+ it { subject.name.should == "yearly" }
9
+
8
10
  it "keeps the most recent filename of the last two years" do
9
11
  subject.add "a", Date.new(2011, 8, 9)
10
12
  subject.add "b", Date.new(2011, 9, 9)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: surrender
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.8.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-15 00:00:00.000000000 Z
12
+ date: 2014-02-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -90,7 +90,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
90
90
  version: '0'
91
91
  segments:
92
92
  - 0
93
- hash: 1928710586624369307
93
+ hash: 715898748471192036
94
94
  required_rubygems_version: !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
@@ -99,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
99
  version: '0'
100
100
  segments:
101
101
  - 0
102
- hash: 1928710586624369307
102
+ hash: 715898748471192036
103
103
  requirements: []
104
104
  rubyforge_project:
105
105
  rubygems_version: 1.8.25