geoffreywiseman-prune 1.3.1 → 1.3.2

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: 1cabe7b54d6be975a001aabb086928275d572c4f
4
- data.tar.gz: 7e597d2bf76ccf5b0699783d8c8e3ff9cb9bc737
3
+ metadata.gz: daed96c1d85b82b3b7ebada4575e27659c27049d
4
+ data.tar.gz: 78ef1ce3951e62e29f1cc8dd8de98373d0d16765
5
5
  SHA512:
6
- metadata.gz: 359b5317271207d42ad2b1353b46b158ad7bf75f946fb7e59e4b96bc48db0ee5ec49e278f3f2c869a23ccbbaf53f387cf6f4fc99618e84a65fd83ebd25ffe106
7
- data.tar.gz: ee680bd731faff3f791b7d45826edd1699a04ec981ce27e03a2e73c909528729e371b18810d7344456b1a5250b6fded1426e35165f86d55b87e9b5406fa461d7
6
+ metadata.gz: 7acfa1fda4d6b9984f4d66c8e62066f8658cc0fa43521645918b5fe98cd6fb076ff55b1d8af0cc82c56057d79289cc3fe0bd1ff06917bcbd4ad43a24551dc950
7
+ data.tar.gz: e7178a263ab4dac01b8aa8b71035e4c1cc259a5328ff3fc49617735d86f5ce80b33e0f1e97f24ce52251a205b42a0f6adce39696198b80f478912ae9790ca0a0
data/Rakefile CHANGED
@@ -4,6 +4,9 @@ require 'rspec/core/rake_task'
4
4
  require 'rspec'
5
5
  require 'rubygems'
6
6
  require 'rubygems/package_task'
7
+
8
+ $: << './lib'
9
+
7
10
  require 'prune'
8
11
 
9
12
  CLEAN.include( 'pkg' )
@@ -4,7 +4,7 @@ require 'date'
4
4
  require 'zlib'
5
5
  require 'archive/tar/minitar'
6
6
  require 'tmpdir'
7
- include Archive::Tar
7
+ require 'minitar'
8
8
 
9
9
  module Prune
10
10
 
@@ -5,8 +5,8 @@
5
5
  # @author Geoffrey Wiseman
6
6
  module Prune
7
7
  # The version of the prune gem and all the associated code.
8
- VERSION = Gem::Version.new '1.3.1'
8
+ VERSION = Gem::Version.new '1.3.2'
9
9
 
10
10
  # The release date associated with the version
11
- RELEASE_DATE = '2016-06-24'
11
+ RELEASE_DATE = '2018-01-31'
12
12
  end
@@ -15,18 +15,18 @@ describe Prune::Archiver do
15
15
  subject { Prune::Archiver.new( nil, '/mysql', true ) }
16
16
 
17
17
  it "should have #{DESTINATION} destination" do
18
- subject.destination.should eq( DESTINATION )
18
+ expect(subject.destination).to eq( DESTINATION )
19
19
  end
20
20
 
21
21
  it "should create #{DESTINATION} if does not exist" do
22
- File.stub( :exists? ).with( DESTINATION ) { false }
23
- Dir.should_receive( :mkdir ).with( DESTINATION )
22
+ allow(File).to receive( :exists? ).with( DESTINATION ) { false }
23
+ expect(Dir).to receive( :mkdir ).with( DESTINATION )
24
24
  subject.make_destination_dir
25
25
  end
26
26
 
27
27
  it "should not attempt to create #{DESTINATION} if it exists" do
28
- File.stub( :exists? ).with( DESTINATION ) { true }
29
- Dir.should_not_receive( :mkdir )
28
+ allow(File).to receive( :exists? ).with( DESTINATION ) { true }
29
+ expect(Dir).not_to receive( :mkdir )
30
30
  subject.make_destination_dir
31
31
  end
32
32
 
@@ -36,19 +36,19 @@ describe Prune::Archiver do
36
36
  it "should write new archive file in #{DESTINATION} if none exists" do
37
37
 
38
38
  # Destination Exists
39
- File.stub( :exists? ).with( DESTINATION ) { true }
39
+ allow(File).to receive( :exists? ).with( DESTINATION ) { true }
40
40
 
41
41
  # Archive File Exists
42
- File.stub( :exists? ).with( ARCHIVE_FILE ) { false }
42
+ allow(File).to receive( :exists? ).with( ARCHIVE_FILE ) { false }
43
43
 
44
44
  # Create Zip File
45
45
  archive_file = double "file"
46
46
  gz = double "GzipWriter"
47
47
  paths = [ "/mysql/a", "/mysql/b", "/mysql/c" ]
48
- File.stub( :open ).with( ARCHIVE_FILE, 'wb' ) { archive_file }
49
- Zlib::GzipWriter.stub( :new ) { gz }
50
- Minitar.should_receive( :pack ).with( paths, gz )
51
- File.should_receive( :delete ).with( *paths )
48
+ allow(File).to receive( :open ).with( ARCHIVE_FILE, 'wb' ) { archive_file }
49
+ allow(Zlib::GzipWriter).to receive( :new ) { gz }
50
+ expect(Minitar).to receive( :pack ).with( paths, gz )
51
+ expect(File).to receive( :delete ).with( *paths )
52
52
 
53
53
  subject.archive "May-2011", ["a", "b", "c"]
54
54
  end
@@ -56,35 +56,35 @@ describe Prune::Archiver do
56
56
  it "should add to existing archive file if it exists" do
57
57
 
58
58
  # Destination Exists
59
- File.stub( :exists? ).with( DESTINATION ) { true }
59
+ allow(File).to receive( :exists? ).with( DESTINATION ) { true }
60
60
 
61
61
  # Archive File Exists
62
- File.stub( :exists? ).with( ARCHIVE_FILE ) { true }
62
+ allow(File).to receive( :exists? ).with( ARCHIVE_FILE ) { true }
63
63
 
64
64
  # Should Create Temp Dir
65
65
  tmpdir = "/tmp"
66
- Dir.stub( :mktmpdir ).and_yield( tmpdir )
66
+ allow(Dir).to receive( :mktmpdir ).and_yield( tmpdir )
67
67
 
68
68
  # Should Extract Contents
69
69
  archive_file = double "archive file"
70
- File.stub( :open ).with( ARCHIVE_FILE, 'rb' ) { archive_file }
70
+ allow(File).to receive( :open ).with( ARCHIVE_FILE, 'rb' ) { archive_file }
71
71
  gzr = double "GzipReader"
72
- Zlib::GzipReader.stub( :new ) { gzr }
73
- Minitar.should_receive( :unpack ).with( gzr, tmpdir )
74
- Dir.should_receive( :entries ).with( tmpdir ) { ["c", "d"] }
72
+ allow(Zlib::GzipReader).to receive( :new ) { gzr }
73
+ expect(Minitar).to receive( :unpack ).with( gzr, tmpdir )
74
+ expect(Dir).to receive( :entries ).with( tmpdir ) { ["c", "d"] }
75
75
  extracted_paths = [ "/tmp/c", "/tmp/d" ]
76
- extracted_paths.each { |path| File.stub( :directory? ).with( path ).and_return( false ) }
76
+ extracted_paths.each { |path| allow(File).to receive( :directory? ).with( path ).and_return( false ) }
77
77
 
78
78
  # Should Create Final Archive
79
- File.stub( :open ).with( ARCHIVE_FILE, 'wb' ) { archive_file }
79
+ allow(File).to receive( :open ).with( ARCHIVE_FILE, 'wb' ) { archive_file }
80
80
  gzw = double "GzipWriter"
81
- Zlib::GzipWriter.stub( :new ) { gzw }
81
+ allow(Zlib::GzipWriter).to receive( :new ) { gzw }
82
82
  original_paths = [ "/mysql/a", "/mysql/b" ]
83
83
  combined_paths = extracted_paths + original_paths
84
- Minitar.should_receive( :pack ).with( combined_paths, gzw )
84
+ expect(Minitar).to receive( :pack ).with( combined_paths, gzw )
85
85
 
86
86
  # Delete Files
87
- File.should_receive( :delete ).with( *original_paths )
87
+ expect(File).to receive( :delete ).with( *original_paths )
88
88
 
89
89
  # Go
90
90
  subject.archive "May-2011", ["a", "b"]
@@ -97,7 +97,7 @@ describe Prune::Archiver do
97
97
  subject { Prune::Archiver.new( '/mysql/archives', '/mysql', true ) }
98
98
 
99
99
  it "should use the explicit destination" do
100
- subject.destination.should eq( '/mysql/archives' )
100
+ expect(subject.destination).to eq( '/mysql/archives' )
101
101
  end
102
102
 
103
103
  end
@@ -10,7 +10,7 @@ describe Prune::CommandLineInterface do
10
10
 
11
11
  before(:each) do
12
12
  @messages = []
13
- $stdout.stub( :write ) { |message| @messages << message }
13
+ allow($stdout).to receive( :write ) { |message| @messages << message }
14
14
 
15
15
  @pruner = double( "pruner" )
16
16
  end
@@ -20,7 +20,7 @@ describe Prune::CommandLineInterface do
20
20
  it "should print help" do
21
21
  ARGV.clear
22
22
  Prune::CommandLineInterface::parse_and_run
23
- @messages.should include_match( USAGE_TEXT )
23
+ expect(@messages).to include_match( USAGE_TEXT )
24
24
  end
25
25
 
26
26
  end
@@ -30,17 +30,17 @@ describe Prune::CommandLineInterface do
30
30
 
31
31
  before(:each) do
32
32
  ARGV.clear.push( PATH )
33
- @pruner.stub(:prune)
33
+ allow(@pruner).to receive(:prune)
34
34
  end
35
35
 
36
36
  it "should call prune with path" do
37
- Prune::Pruner.stub( :new ) { @pruner }
38
- @pruner.should_receive( :prune ).with( PATH )
37
+ allow(Prune::Pruner).to receive( :new ) { @pruner }
38
+ expect(@pruner).to receive( :prune ).with( PATH )
39
39
  Prune::CommandLineInterface::parse_and_run
40
40
  end
41
41
 
42
42
  it "should create pruner with defaults" do
43
- Prune::Pruner.stub( :new ).with( Prune::CommandLineInterface::DEFAULT_OPTIONS ) { @pruner }
43
+ allow(Prune::Pruner).to receive( :new ).with( Prune::CommandLineInterface::DEFAULT_OPTIONS ) { @pruner }
44
44
  Prune::CommandLineInterface::parse_and_run
45
45
  end
46
46
 
@@ -89,8 +89,8 @@ describe Prune::CommandLineInterface do
89
89
  describe "and a --config argument" do
90
90
  it "should set the configure option to true" do
91
91
  configurer = double( "Configurer" )
92
- Prune::Configurer.should_receive( :new ).with( PATH, hash_including( :configure => true ) ).and_return( configurer )
93
- configurer.should_receive( :configure )
92
+ expect(Prune::Configurer).to receive( :new ).with( PATH, hash_including( :configure => true ) ).and_return( configurer )
93
+ expect(configurer).to receive( :configure )
94
94
  ARGV.push( "--config" )
95
95
  Prune::CommandLineInterface::parse_and_run
96
96
  end
@@ -103,9 +103,9 @@ describe Prune::CommandLineInterface do
103
103
 
104
104
  describe "with no folder name" do
105
105
  it "should print a parsing error" do
106
- $stderr.stub( :print ) { |message| @messages << message }
106
+ allow($stderr).to receive( :print ) { |message| @messages << message }
107
107
  Prune::CommandLineInterface::parse_and_run
108
- @messages.should include_match( /missing argument: -a/ )
108
+ expect(@messages).to include_match( /missing argument: -a/ )
109
109
  end
110
110
  end
111
111
 
@@ -123,9 +123,9 @@ describe Prune::CommandLineInterface do
123
123
 
124
124
  describe "with no folder name" do
125
125
  it "should print a parsing error" do
126
- $stderr.stub( :print ) { |message| @messages << message }
126
+ allow($stderr).to receive( :print ) { |message| @messages << message }
127
127
  Prune::CommandLineInterface::parse_and_run
128
- @messages.should include_match( /missing argument: --archive-folder/ )
128
+ expect(@messages).to include_match( /missing argument: --archive-folder/ )
129
129
  end
130
130
  end
131
131
 
@@ -144,11 +144,11 @@ describe Prune::CommandLineInterface do
144
144
 
145
145
  it "should print help" do
146
146
  Prune::CommandLineInterface::parse_and_run
147
- @messages.should include_match( USAGE_TEXT )
147
+ expect(@messages).to include_match( USAGE_TEXT )
148
148
  end
149
149
 
150
150
  it "should not invoke prune" do
151
- @pruner.should_not_receive( :prune )
151
+ expect(@pruner).not_to receive( :prune )
152
152
  Prune::CommandLineInterface::parse_and_run
153
153
  end
154
154
 
@@ -162,11 +162,11 @@ describe Prune::CommandLineInterface do
162
162
 
163
163
  it "should print help" do
164
164
  Prune::CommandLineInterface::parse_and_run
165
- @messages.should include_match( USAGE_TEXT )
165
+ expect(@messages).to include_match( USAGE_TEXT )
166
166
  end
167
167
 
168
168
  it "should not invoke prune" do
169
- @pruner.should_not_receive( :prune )
169
+ expect(@pruner).not_to receive( :prune )
170
170
  Prune::CommandLineInterface::parse_and_run
171
171
  end
172
172
 
@@ -175,9 +175,9 @@ describe Prune::CommandLineInterface do
175
175
  describe "and an unknown argument" do
176
176
  it "should print a parsing error" do
177
177
  ARGV.push "--unknown-argument"
178
- $stderr.stub( :print ) { |message| @messages << message }
178
+ allow($stderr).to receive( :print ) { |message| @messages << message }
179
179
  Prune::CommandLineInterface::parse_and_run
180
- @messages.should include_match( /invalid option/ )
180
+ expect(@messages).to include_match( /invalid option/ )
181
181
  end
182
182
  end
183
183
 
@@ -187,13 +187,13 @@ describe Prune::CommandLineInterface do
187
187
  end
188
188
 
189
189
  it "should print version number" do
190
- $stderr.stub( :print ) { |message| @messages << message }
190
+ allow($stderr).to receive( :print ) { |message| @messages << message }
191
191
  Prune::CommandLineInterface::parse_and_run
192
- @messages.should include_match( /Prune #{Prune::VERSION}/ )
192
+ expect(@messages).to include_match( /Prune #{Prune::VERSION}/ )
193
193
  end
194
194
 
195
195
  it "should not invoke prune" do
196
- @pruner.should_not_receive( :prune )
196
+ expect(@pruner).not_to receive( :prune )
197
197
  Prune::CommandLineInterface::parse_and_run
198
198
  end
199
199
 
@@ -206,7 +206,7 @@ describe Prune::CommandLineInterface do
206
206
  end
207
207
 
208
208
  def assert_arg_to_option( arg, *options )
209
- Prune::Pruner.should_receive( :new ).with( hash_including( *options ) ).and_return( @pruner )
209
+ expect(Prune::Pruner).to receive( :new ).with( hash_including( *options ) ).and_return( @pruner )
210
210
  ARGV.push( arg )
211
211
  Prune::CommandLineInterface::parse_and_run
212
212
  end
@@ -16,7 +16,7 @@ describe Prune::Configurer do
16
16
  context "with no config file present" do
17
17
  it "should copy core retention policy if no config file" do
18
18
  surpress_messages
19
- FileUtils.should_receive(:cp).with( match(/default_retention.rb/), CONFIG_FILE )
19
+ expect(FileUtils).to receive(:cp).with( match(/default_retention.rb/), CONFIG_FILE )
20
20
  subject.configure
21
21
  end
22
22
  end
@@ -24,46 +24,46 @@ describe Prune::Configurer do
24
24
  context "with a directory in place of the config file" do
25
25
  before do
26
26
  stub_messages
27
- File.stub( :directory? ) { true }
27
+ allow(File).to receive( :directory? ) { true }
28
28
  end
29
29
  it "should warn that it can't create file" do
30
30
  subject.configure
31
- @messages.should include_match( /cannot create or edit configuration/ )
31
+ expect(@messages).to include_match( /cannot create or edit configuration/ )
32
32
  end
33
33
  end
34
34
 
35
35
  context "with config file that canot be written" do
36
36
  before do
37
- File.stub( :directory? ).with( CONFIG_FILE ) { false }
38
- File.stub( :file? ).with( CONFIG_FILE ) { true }
39
- File.stub( :writable? ).with( CONFIG_FILE ) { false }
37
+ allow(File).to receive( :directory? ).with( CONFIG_FILE ) { false }
38
+ allow(File).to receive( :file? ).with( CONFIG_FILE ) { true }
39
+ allow(File).to receive( :writable? ).with( CONFIG_FILE ) { false }
40
40
  stub_messages
41
41
  end
42
42
  it "should warn that cannot edit config" do
43
43
  subject.configure
44
- @messages.should include_match( /cannot edit configuration/ )
44
+ expect(@messages).to include_match( /cannot edit configuration/ )
45
45
  end
46
46
  end
47
47
 
48
48
  context "with a writeable config file" do
49
49
 
50
50
  before do
51
- File.stub( :directory? ).with( CONFIG_FILE ) { false }
52
- File.stub( :file? ).with( CONFIG_FILE ) { true }
53
- File.stub( :writable? ).with( CONFIG_FILE ) { true }
51
+ allow(File).to receive( :directory? ).with( CONFIG_FILE ) { false }
52
+ allow(File).to receive( :file? ).with( CONFIG_FILE ) { true }
53
+ allow(File).to receive( :writable? ).with( CONFIG_FILE ) { true }
54
54
  end
55
55
 
56
56
  it "should warn if no editor defined" do
57
57
  stub_messages
58
58
  subject.configure
59
- @messages.should include_match( /No editor defined/ )
59
+ expect(@messages).to include_match( /No editor defined/ )
60
60
  end
61
61
 
62
62
  context "with EDITOR environment variable defined" do
63
63
  it "should invoke editor" do
64
64
  surpress_messages
65
65
  ENV['EDITOR']='ed'
66
- subject.should_receive( :system ).with( "ed #{CONFIG_FILE}" ).and_return( true )
66
+ expect(subject).to receive( :system ).with( "ed #{CONFIG_FILE}" ).and_return( true )
67
67
  subject.configure
68
68
  end
69
69
  end
@@ -73,7 +73,7 @@ describe Prune::Configurer do
73
73
  surpress_messages
74
74
  ENV['VISUAL']='gedit'
75
75
  ENV['EDITOR']='ed'
76
- subject.should_receive( :system ).with( "gedit #{CONFIG_FILE}" ).and_return( true )
76
+ expect(subject).to receive( :system ).with( "gedit #{CONFIG_FILE}" ).and_return( true )
77
77
  subject.configure
78
78
  end
79
79
  end
@@ -82,7 +82,7 @@ describe Prune::Configurer do
82
82
  it "should invoke visual editor if defined in VISUAL" do
83
83
  surpress_messages
84
84
  ENV['VISUAL']='gedit'
85
- subject.should_receive( :system ).with( "gedit #{CONFIG_FILE}" ).and_return( true )
85
+ expect(subject).to receive( :system ).with( "gedit #{CONFIG_FILE}" ).and_return( true )
86
86
  subject.configure
87
87
  end
88
88
  end
@@ -14,7 +14,7 @@ describe "Prune::Grouper" do
14
14
  context "w/o files" do
15
15
 
16
16
  it "should not archive" do
17
- @archiver.should_not_receive( :archive )
17
+ expect(@archiver).not_to receive( :archive )
18
18
  @grouper.group( GROUP_PATH, [] ).archive
19
19
  end
20
20
 
@@ -24,26 +24,26 @@ describe "Prune::Grouper" do
24
24
 
25
25
  it "should archive files" do
26
26
  files = mock_files( Date.new(2011,01,01) )
27
- @archiver.should_receive( :archive )
27
+ expect(@archiver).to receive( :archive )
28
28
  @grouper.group( GROUP_PATH, files ).archive
29
29
  end
30
30
 
31
31
  it "should specify month and year" do
32
32
  files = mock_files( Date.new(2008,03,01) )
33
- @archiver.should_receive( :archive ).with( "Mar-2008", files )
33
+ expect(@archiver).to receive( :archive ).with( "Mar-2008", files )
34
34
  @grouper.group( GROUP_PATH, files ).archive
35
35
  end
36
36
 
37
37
  it "should combine files with same month/year" do
38
38
  files = mock_files( Date.new(2008,03,01), Date.new(2008,03,02) )
39
- @archiver.should_receive( :archive ).with( "Mar-2008", files )
39
+ expect(@archiver).to receive( :archive ).with( "Mar-2008", files )
40
40
  @grouper.group( GROUP_PATH, files ).archive
41
41
  end
42
42
 
43
43
  it "should not combine files with same month, different year" do
44
44
  files = mock_files( Date.new(2008,03,01), Date.new(2009,03,01) )
45
- @archiver.should_receive( :archive ).with( "Mar-2008", [files.first] )
46
- @archiver.should_receive( :archive ).with( "Mar-2009", [files.last] )
45
+ expect(@archiver).to receive( :archive ).with( "Mar-2008", [files.first] )
46
+ expect(@archiver).to receive( :archive ).with( "Mar-2009", [files.last] )
47
47
  @grouper.group( GROUP_PATH, files ).archive
48
48
  end
49
49
 
@@ -54,7 +54,7 @@ describe "Prune::Grouper" do
54
54
  dates.map do |item|
55
55
  month_name = Date::ABBR_MONTHNAMES[item.month]
56
56
  file_name = "file-#{month_name}-#{item.year}.sql"
57
- File.stub( :mtime ).with( "#{GROUP_PATH}/#{file_name}" ) { item }
57
+ allow(File).to receive( :mtime ).with( "#{GROUP_PATH}/#{file_name}" ) { item }
58
58
  files << file_name
59
59
  end
60
60
  return files;
@@ -10,8 +10,8 @@ describe Prune::Pruner do
10
10
  before( :each ) do
11
11
  @categories = [ Prune::Category.new( "Unmatched Files", :retain, true ) ]
12
12
  @retention_policy = double( "RetentionPolicy" )
13
- @retention_policy.stub( :categories ) { @categories }
14
- Prune::RetentionPolicy.stub( :new ) { @retention_policy }
13
+ allow(@retention_policy).to receive( :categories ) { @categories }
14
+ allow(Prune::RetentionPolicy).to receive( :new ) { @retention_policy }
15
15
  end
16
16
 
17
17
  context "w/o prompt" do
@@ -20,9 +20,9 @@ describe Prune::Pruner do
20
20
  end
21
21
 
22
22
  it "should not attempt to process folder that does not exist" do
23
- File.stub( :exists? ).with( PRUNE_PATH ) { false }
24
- Dir.should_not_receive( :foreach )
25
- $stdout.should_receive( :write ).with( /ERROR: Cannot find folder/ )
23
+ allow(File).to receive( :exists? ).with( PRUNE_PATH ) { false }
24
+ expect(Dir).not_to receive( :foreach )
25
+ expect($stdout).to receive( :write ).with( /ERROR: Cannot find folder/ )
26
26
  subject.prune( PRUNE_PATH )
27
27
  end
28
28
 
@@ -35,19 +35,19 @@ describe Prune::Pruner do
35
35
  end
36
36
 
37
37
  it "should not invoke the retention policy" do
38
- @retention_policy.should_not_receive( :categorize )
38
+ expect(@retention_policy).not_to receive( :categorize )
39
39
  end
40
40
 
41
41
  it "should print 'Analyzing #{PRUNE_PATH}'" do
42
- @messages.should include("Analyzing '#{PRUNE_PATH}':\n")
42
+ expect(@messages).to include("Analyzing '#{PRUNE_PATH}':\n")
43
43
  end
44
44
 
45
45
  it "should say no action was required" do
46
- @messages.should include("No actions necessary.\n")
46
+ expect(@messages).to include("No actions necessary.\n")
47
47
  end
48
48
 
49
49
  it "should say no files were analyzed" do
50
- @messages.should include_match( /0 file\(s\) analyzed/ )
50
+ expect(@messages).to include_match( /0 file\(s\) analyzed/ )
51
51
  end
52
52
 
53
53
  end
@@ -61,19 +61,19 @@ describe Prune::Pruner do
61
61
  end
62
62
 
63
63
  it "should not invoke the retention policy" do
64
- @retention_policy.should_not_receive( :categorize )
64
+ expect(@retention_policy).not_to receive( :categorize )
65
65
  end
66
66
 
67
67
  it "should print 'Analyzing #{PRUNE_PATH}'" do
68
- @messages.should include("Analyzing '#{PRUNE_PATH}':\n")
68
+ expect(@messages).to include("Analyzing '#{PRUNE_PATH}':\n")
69
69
  end
70
70
 
71
71
  it "should say no action was required" do
72
- @messages.should include("No actions necessary.\n")
72
+ expect(@messages).to include("No actions necessary.\n")
73
73
  end
74
74
 
75
75
  it "should say no files were analyzed" do
76
- @messages.should include_match( /0 file\(s\) analyzed/ )
76
+ expect(@messages).to include_match( /0 file\(s\) analyzed/ )
77
77
  end
78
78
 
79
79
  end
@@ -88,16 +88,16 @@ describe Prune::Pruner do
88
88
  end
89
89
 
90
90
  it "should categorize each file in modified order" do
91
- @retention_policy.should_receive( :categorize ).with( 'alpha.txt' ).ordered
92
- @retention_policy.should_receive( :categorize ).with( 'beta.txt' ).ordered
93
- @retention_policy.should_receive( :categorize ).with( 'gamma.txt' ).ordered
91
+ expect(@retention_policy).to receive( :categorize ).with( 'alpha.txt' ).ordered
92
+ expect(@retention_policy).to receive( :categorize ).with( 'beta.txt' ).ordered
93
+ expect(@retention_policy).to receive( :categorize ).with( 'gamma.txt' ).ordered
94
94
  subject.prune PRUNE_PATH
95
95
  end
96
96
 
97
97
  it "should say three files were analyzed" do
98
98
  @retention_policy.as_null_object
99
99
  subject.prune PRUNE_PATH
100
- @messages.should include_match( /3 file\(s\) analyzed/ )
100
+ expect(@messages).to include_match( /3 file\(s\) analyzed/ )
101
101
  end
102
102
 
103
103
  end
@@ -111,27 +111,27 @@ describe Prune::Pruner do
111
111
  stub_files FILENAME
112
112
 
113
113
  category = double( category )
114
- category.stub( :description ) { "Old" }
115
- category.stub( :action ) { :remove }
116
- category.stub( :quiet? ) { false }
117
- @retention_policy.should_receive( :categorize ).with( FILENAME ) { category }
114
+ allow(category).to receive( :description ) { "Old" }
115
+ allow(category).to receive( :action ) { :remove }
116
+ allow(category).to receive( :quiet? ) { false }
117
+ expect(@retention_policy).to receive( :categorize ).with( FILENAME ) { category }
118
118
  end
119
119
 
120
120
  it "should delete file" do
121
- FileUtils.should_receive( :remove_entry ).with( File.join( PRUNE_PATH, FILENAME ), true ) { 1 }
121
+ expect(FileUtils).to receive( :remove_entry ).with( File.join( PRUNE_PATH, FILENAME ), true ) { 1 }
122
122
  subject.prune PRUNE_PATH
123
123
  end
124
124
 
125
125
  it "should display file deleted message" do
126
- FileUtils.should_receive( :remove_entry ).with( File.join( PRUNE_PATH, FILENAME ), true ) { 1 }
126
+ expect(FileUtils).to receive( :remove_entry ).with( File.join( PRUNE_PATH, FILENAME ), true ) { 1 }
127
127
  subject.prune PRUNE_PATH
128
- @messages.should include_match( /1 file\(s\) deleted/ )
128
+ expect(@messages).to include_match( /1 file\(s\) deleted/ )
129
129
  end
130
130
 
131
131
  it "should display failed deletion mesage" do
132
- FileUtils.should_receive( :remove_entry ).with( File.join( PRUNE_PATH, FILENAME ), true ) { 0 }
132
+ expect(FileUtils).to receive( :remove_entry ).with( File.join( PRUNE_PATH, FILENAME ), true ) { 0 }
133
133
  subject.prune PRUNE_PATH
134
- @messages.should include_match( /0 file\(s\) deleted, 1 file\(s\) could not be deleted/ )
134
+ expect(@messages).to include_match( /0 file\(s\) deleted, 1 file\(s\) could not be deleted/ )
135
135
  end
136
136
 
137
137
  end
@@ -144,17 +144,17 @@ describe Prune::Pruner do
144
144
  stub_messages
145
145
 
146
146
  category = double( "category" )
147
- category.stub( :action ) { :archive }
148
- category.stub( :description ) { "Archive" }
149
- category.stub( :quiet? ) { false }
147
+ allow(category).to receive( :action ) { :archive }
148
+ allow(category).to receive( :description ) { "Archive" }
149
+ allow(category).to receive( :quiet? ) { false }
150
150
 
151
- @retention_policy.stub( :categories ) { [ category ]}
151
+ allow(@retention_policy).to receive( :categories ) { [ category ]}
152
152
  end
153
153
 
154
154
  it "should indicate no archive necessary" do
155
155
  subject.prune PRUNE_PATH
156
156
  puts "Messages: #{@messages}"
157
- @messages.should include_match( /No files categorized for archival/ )
157
+ expect(@messages).to include_match( /No files categorized for archival/ )
158
158
  end
159
159
 
160
160
  end
@@ -168,17 +168,17 @@ describe Prune::Pruner do
168
168
  stub_messages
169
169
 
170
170
  category = double( "category" )
171
- @retention_policy.stub( :categorize ) { category }
172
- category.stub( :action ) { :archive }
173
- category.stub( :description ) { "Ancient" }
174
- category.stub( :quiet? ) { false }
171
+ allow(@retention_policy).to receive( :categorize ) { category }
172
+ allow(category).to receive( :action ) { :archive }
173
+ allow(category).to receive( :description ) { "Ancient" }
174
+ allow(category).to receive( :quiet? ) { false }
175
175
  end
176
176
 
177
177
  it "should archive files in groups" do
178
178
  grouper = double( "Grouper" )
179
- Prune::Grouper.stub( :new ) { grouper }
180
- grouper.should_receive( :group ).with( PRUNE_PATH, files )
181
- grouper.should_receive( :archive ) { "2 Archives created." }
179
+ allow(Prune::Grouper).to receive( :new ) { grouper }
180
+ expect(grouper).to receive( :group ).with( PRUNE_PATH, files )
181
+ expect(grouper).to receive( :archive ) { "2 Archives created." }
182
182
 
183
183
  subject.prune PRUNE_PATH
184
184
  end
@@ -186,7 +186,7 @@ describe Prune::Pruner do
186
186
  it "should display message if archive option disabled" do
187
187
  subject.options[:archive] = false
188
188
  subject.prune PRUNE_PATH
189
- @messages.should include_match( /Archive option disabled/ )
189
+ expect(@messages).to include_match( /Archive option disabled/ )
190
190
  end
191
191
  end
192
192
 
@@ -206,17 +206,17 @@ describe Prune::Pruner do
206
206
 
207
207
  it "should display empty categories" do
208
208
  subject.display_categories( { Prune::Category.new( "Empty Category", :retain ) => [] } )
209
- @messages.should include_match( /Empty Category/ )
209
+ expect(@messages).to include_match( /Empty Category/ )
210
210
  end
211
211
 
212
212
  it "should display quiet categories" do
213
213
  subject.display_categories( { Prune::Category.new( "Quiet Category", :retain, true ) => [ 'quiet.txt' ] } )
214
- @messages.should include_match( /Quiet Category/ )
214
+ expect(@messages).to include_match( /Quiet Category/ )
215
215
  end
216
216
 
217
217
  it "should display categories with files" do
218
218
  subject.display_categories( { Prune::Category.new( "Normal Category", :retain ) => [ 'normal.txt' ] } )
219
- @messages.should include_match( /Normal Category/ )
219
+ expect(@messages).to include_match( /Normal Category/ )
220
220
  end
221
221
  end
222
222
 
@@ -228,17 +228,17 @@ describe Prune::Pruner do
228
228
 
229
229
  it "should not display empty categories" do
230
230
  subject.display_categories( { Prune::Category.new( "Empty Category", :retain, true ) => [] } )
231
- @messages.should_not include_match( /Empty Category/ )
231
+ expect(@messages).not_to include_match( /Empty Category/ )
232
232
  end
233
233
 
234
234
  it "should not display quiet categories" do
235
235
  subject.display_categories( { Prune::Category.new( "Quiet Category", :retain, true ) => [ 'shhh.txt' ] } )
236
- @messages.should_not include_match( /Quiet Category/ )
236
+ expect(@messages).not_to include_match( /Quiet Category/ )
237
237
  end
238
238
 
239
239
  it "should display categories with files" do
240
240
  subject.display_categories( { Prune::Category.new( "Normal Category", :retain ) => [ 'normal.txt' ] } )
241
- @messages.should include_match( /Normal Category/ )
241
+ expect(@messages).to include_match( /Normal Category/ )
242
242
  end
243
243
 
244
244
  end
@@ -251,76 +251,76 @@ describe Prune::Pruner do
251
251
 
252
252
  it "should interpret 'Y' as true" do
253
253
  expect_prompt_with_response( "Y\n")
254
- subject.prompt.should be_true
254
+ expect(subject.prompt).to be_truthy
255
255
  end
256
256
 
257
257
  it "should interpret 'Y ' as true" do
258
258
  expect_prompt_with_response("Y \n")
259
- subject.prompt.should be_true
259
+ expect(subject.prompt).to be_truthy
260
260
  end
261
261
 
262
262
  it "should interpret ' Y' as true" do
263
263
  expect_prompt_with_response(" Y\n")
264
- subject.prompt.should be_true
264
+ expect(subject.prompt).to be_truthy
265
265
  end
266
266
 
267
267
  it "should interpret ' Y ' as true" do
268
268
  expect_prompt_with_response(" Y \n")
269
- subject.prompt.should be_true
269
+ expect(subject.prompt).to be_truthy
270
270
  end
271
271
 
272
272
  it "should interpret 'y' as true" do
273
273
  expect_prompt_with_response("y\n")
274
- subject.prompt.should be_true
274
+ expect(subject.prompt).to be_truthy
275
275
  end
276
276
 
277
277
  it "should interpret 'yes' as true" do
278
278
  expect_prompt_with_response("yes\n")
279
- subject.prompt.should be_true
279
+ expect(subject.prompt).to be_truthy
280
280
  end
281
281
 
282
282
  it "should interpret 'no' as false" do
283
283
  expect_prompt_with_response("no\n")
284
- subject.prompt.should be_false
284
+ expect(subject.prompt).to be_falsey
285
285
  end
286
286
 
287
287
  it "should interpret 'n' as false" do
288
288
  expect_prompt_with_response("n\n")
289
- subject.prompt.should be_false
289
+ expect(subject.prompt).to be_falsey
290
290
  end
291
291
 
292
292
  it "should interpret 'N' as false" do
293
293
  expect_prompt_with_response("N\n")
294
- subject.prompt.should be_false
294
+ expect(subject.prompt).to be_falsey
295
295
  end
296
296
 
297
297
  it "should interpret 'q' as false" do
298
298
  expect_prompt_with_response("q\n")
299
- subject.prompt.should be_false
299
+ expect(subject.prompt).to be_falsey
300
300
  end
301
301
 
302
302
  def expect_prompt_with_response( response )
303
- $stdout.should_receive( :write ).with( /Proceed?/ )
304
- STDIN.stub(:gets) { response }
303
+ expect($stdout).to receive( :write ).with( /Proceed?/ )
304
+ allow(STDIN).to receive(:gets) { response }
305
305
  end
306
306
 
307
307
  end
308
308
 
309
309
  def stub_files( files = nil )
310
- File.stub( :exists? ).with( PRUNE_PATH ) { true }
311
- File.stub( :directory? ).with( PRUNE_PATH ) { true }
310
+ allow(File).to receive( :exists? ).with( PRUNE_PATH ) { true }
311
+ allow(File).to receive( :directory? ).with( PRUNE_PATH ) { true }
312
312
  case files
313
313
  when nil
314
- Dir.stub( :entries ).with( PRUNE_PATH ) { Array.new }
314
+ allow(Dir).to receive( :entries ).with( PRUNE_PATH ) { Array.new }
315
315
  when String
316
- subject.stub(:test).with( ?M, File.join( PRUNE_PATH, files ) ) { Time.now }
317
- Dir.stub( :entries ).with( PRUNE_PATH ) { [ files ] }
316
+ allow(subject).to receive(:test).with( ?M, File.join( PRUNE_PATH, files ) ) { Time.now }
317
+ allow(Dir).to receive( :entries ).with( PRUNE_PATH ) { [ files ] }
318
318
  when Array
319
- files.each_index { |index| subject.stub(:test).with( ?M, File.join( PRUNE_PATH, files[index] ) ) { index } }
320
- Dir.stub( :entries ).with( PRUNE_PATH ) { files }
319
+ files.each_index { |index| allow(subject).to receive(:test).with( ?M, File.join( PRUNE_PATH, files[index] ) ) { index } }
320
+ allow(Dir).to receive( :entries ).with( PRUNE_PATH ) { files }
321
321
  when Hash
322
- files.each_key { |key| subject.stub(:test).with( ?M, File.join( PRUNE_PATH, key ) ) { files[key] } }
323
- Dir.stub( :entries ).with( PRUNE_PATH ) { files.keys }
322
+ files.each_key { |key| allow(subject).to receive(:test).with( ?M, File.join( PRUNE_PATH, key ) ) { files[key] } }
323
+ allow(Dir).to receive( :entries ).with( PRUNE_PATH ) { files.keys }
324
324
  else
325
325
  raise "Don't know how to stub files for #{files.class}"
326
326
  end
@@ -21,28 +21,28 @@ describe Prune::RetentionPolicy do
21
21
 
22
22
  it "should return categories in dsl order" do
23
23
  cats = subject.categories
24
- cats.shift.description.should include( "Ignoring directories" )
25
- cats.shift.description.should include( "from the Last Two Weeks" )
26
- cats.shift.description.should include( "Retaining 'Friday'" )
27
- cats.shift.description.should include( "Removing 'Non-Friday'" )
28
- cats.shift.description.should include( "Archiving" )
29
- cats.should be_empty
24
+ expect(cats.shift.description).to include( "Ignoring directories" )
25
+ expect(cats.shift.description).to include( "from the Last Two Weeks" )
26
+ expect(cats.shift.description).to include( "Retaining 'Friday'" )
27
+ expect(cats.shift.description).to include( "Removing 'Non-Friday'" )
28
+ expect(cats.shift.description).to include( "Archiving" )
29
+ expect(cats).to be_empty
30
30
  end
31
31
 
32
32
  describe "analyzing a directory" do
33
33
  let( :dircat ) do
34
- File.stub( :directory? ).with( SOURCE_PATH ) { true }
35
- File.stub( :mtime ).with( SOURCE_PATH ) { Time.now }
34
+ allow(File).to receive( :directory? ).with( SOURCE_PATH ) { true }
35
+ allow(File).to receive( :mtime ).with( SOURCE_PATH ) { Time.now }
36
36
  subject.categorize( SOURCE_FILE )
37
37
  end
38
38
 
39
39
 
40
40
  it "should be categorized as 'Ignoring directories'" do
41
- dircat.description.should eq( "Ignoring directories" )
41
+ expect(dircat.description).to eq( "Ignoring directories" )
42
42
  end
43
43
 
44
44
  it "should invoke action :ignore" do
45
- dircat.action.should eq( :ignore )
45
+ expect(dircat.action).to eq( :ignore )
46
46
  end
47
47
  end
48
48
 
@@ -51,35 +51,35 @@ describe Prune::RetentionPolicy do
51
51
  describe "created yesterday" do
52
52
 
53
53
  let( :yestercat ) do
54
- File.stub( :directory? ).with( SOURCE_PATH ) { false }
55
- File.stub( :mtime ).with( SOURCE_PATH ) { Time.now - DAY }
54
+ allow(File).to receive( :directory? ).with( SOURCE_PATH ) { false }
55
+ allow(File).to receive( :mtime ).with( SOURCE_PATH ) { Time.now - DAY }
56
56
  subject.categorize( SOURCE_FILE )
57
57
  end
58
58
 
59
59
  it "should be categorized as '... Last Two Weeks'" do
60
- yestercat.description.should include( 'Last Two Weeks' )
60
+ expect(yestercat.description).to include( 'Last Two Weeks' )
61
61
  end
62
62
 
63
63
  it "should invoke action :retain" do
64
- yestercat.action.should eq( :retain )
64
+ expect(yestercat.action).to eq( :retain )
65
65
  end
66
66
  end
67
67
 
68
68
  describe "created three weeks ago, wednesday" do
69
69
 
70
70
  let( :weeksago ) do
71
- File.stub( :directory? ).with( SOURCE_PATH ) { false }
72
- File.stub( :mtime ).with( SOURCE_PATH ) { weeks_ago( 3, 'Wed' ) }
71
+ allow(File).to receive( :directory? ).with( SOURCE_PATH ) { false }
72
+ allow(File).to receive( :mtime ).with( SOURCE_PATH ) { weeks_ago( 3, 'Wed' ) }
73
73
  subject.categorize( SOURCE_FILE )
74
74
  end
75
75
 
76
76
  it "should be described as 'Older than Two Weeks' and 'Non-Friday'" do
77
- weeksago.description.should include 'Non-Friday'
78
- weeksago.description.should include 'Older than Two Weeks'
77
+ expect(weeksago.description).to include 'Non-Friday'
78
+ expect(weeksago.description).to include 'Older than Two Weeks'
79
79
  end
80
80
 
81
81
  it "should invoke action :remove" do
82
- weeksago.action.should eq( :remove )
82
+ expect(weeksago.action).to eq( :remove )
83
83
  end
84
84
 
85
85
  end
@@ -87,18 +87,18 @@ describe Prune::RetentionPolicy do
87
87
  describe "created three weeks ago, friday" do
88
88
 
89
89
  let( :weeksagofriday ) do
90
- File.stub( :directory? ).with( SOURCE_PATH ) { false }
91
- File.stub( :mtime ).with( SOURCE_PATH ) { weeks_ago( 3, 'Fri' ) }
90
+ allow(File).to receive( :directory? ).with( SOURCE_PATH ) { false }
91
+ allow(File).to receive( :mtime ).with( SOURCE_PATH ) { weeks_ago( 3, 'Fri' ) }
92
92
  subject.categorize( SOURCE_FILE )
93
93
  end
94
94
 
95
95
  it "should be described as 'Friday files', 'Older than Two Weeks'" do
96
- weeksagofriday.description.should include( "'Friday' files" )
97
- weeksagofriday.description.should include( 'Older than Two Weeks' )
96
+ expect(weeksagofriday.description).to include( "'Friday' files" )
97
+ expect(weeksagofriday.description).to include( 'Older than Two Weeks' )
98
98
  end
99
99
 
100
100
  it "should invoke action :remove" do
101
- weeksagofriday.action.should eq( :retain )
101
+ expect(weeksagofriday.action).to eq( :retain )
102
102
  end
103
103
 
104
104
  end
@@ -106,17 +106,17 @@ describe Prune::RetentionPolicy do
106
106
  describe "created three months ago, friday" do
107
107
 
108
108
  let( :oldfriday ) do
109
- File.stub( :directory? ).with( SOURCE_PATH ) { false }
110
- File.stub( :mtime ).with( SOURCE_PATH ) { weeks_ago( 12, 'Fri' ) }
109
+ allow(File).to receive( :directory? ).with( SOURCE_PATH ) { false }
110
+ allow(File).to receive( :mtime ).with( SOURCE_PATH ) { weeks_ago( 12, 'Fri' ) }
111
111
  subject.categorize( SOURCE_FILE )
112
112
  end
113
113
 
114
114
  it "should be described as 'Older than Two Months'" do
115
- oldfriday.description.should include( 'Older than Two Months' )
115
+ expect(oldfriday.description).to include( 'Older than Two Months' )
116
116
  end
117
117
 
118
118
  it "should invoke action :archive" do
119
- oldfriday.action.should eq( :archive )
119
+ expect(oldfriday.action).to eq( :archive )
120
120
  end
121
121
 
122
122
  end
@@ -124,18 +124,18 @@ describe Prune::RetentionPolicy do
124
124
  describe "created three months ago, wednesday" do
125
125
 
126
126
  let( :oldwednesday ) do
127
- File.stub( :directory? ).with( SOURCE_PATH ) { false }
128
- File.stub( :mtime ).with( SOURCE_PATH ) { weeks_ago( 12, 'Wed' ) }
127
+ allow(File).to receive( :directory? ).with( SOURCE_PATH ) { false }
128
+ allow(File).to receive( :mtime ).with( SOURCE_PATH ) { weeks_ago( 12, 'Wed' ) }
129
129
  subject.categorize( SOURCE_FILE )
130
130
  end
131
131
 
132
132
  it "should be described as 'Non-Friday files', 'Older than Two Weeks'" do
133
- oldwednesday.description.should include( "'Non-Friday' files" )
134
- oldwednesday.description.should include( "Older than Two Weeks" )
133
+ expect(oldwednesday.description).to include( "'Non-Friday' files" )
134
+ expect(oldwednesday.description).to include( "Older than Two Weeks" )
135
135
  end
136
136
 
137
137
  it "should invoke action :remove" do
138
- oldwednesday.action.should eq( :remove )
138
+ expect(oldwednesday.action).to eq( :remove )
139
139
  end
140
140
 
141
141
  end
@@ -170,33 +170,33 @@ describe Prune::RetentionPolicy do
170
170
  end
171
171
 
172
172
  it "should ignore directories" do
173
- subject.categorize( "." ).description.should eq( "Ignoring" )
173
+ expect(subject.categorize( "." ).description).to eq( "Ignoring" )
174
174
  end
175
175
 
176
176
  it "should ignore files not matching pattern" do
177
- File.stub(:file?) { true }
178
- subject.categorize( 'readme.txt' ).description.should eq( 'Ignoring' )
177
+ allow(File).to receive(:file?) { true }
178
+ expect(subject.categorize( 'readme.txt' ).description).to eq( 'Ignoring' )
179
179
  end
180
180
 
181
181
  describe "with a file named with 20101001" do
182
182
  before do
183
- File.stub(:directory?) { false }
184
- File.stub(:file?) { true }
183
+ allow(File).to receive(:directory?) { false }
184
+ allow(File).to receive(:file?) { true }
185
185
  end
186
186
 
187
187
  it "should categorize as 2010" do
188
- subject.categorize( 'mysql-prod-20101001.sql.gz' ).description.should eq( '2010' )
188
+ expect(subject.categorize( 'mysql-prod-20101001.sql.gz' ).description).to eq( '2010' )
189
189
  end
190
190
  end
191
191
 
192
192
  describe "with a file named with 20110215" do
193
193
  before do
194
- File.stub(:directory?) { false }
195
- File.stub(:file?) { true }
194
+ allow(File).to receive(:directory?) { false }
195
+ allow(File).to receive(:file?) { true }
196
196
  end
197
197
 
198
198
  it "should categorize as 2011" do
199
- subject.categorize( 'subversion-20110215.tar.gz' ).description.should eq( '2011' )
199
+ expect(subject.categorize( 'subversion-20110215.tar.gz' ).description).to eq( '2011' )
200
200
  end
201
201
  end
202
202
  end
@@ -3,11 +3,11 @@ SimpleCov.start
3
3
 
4
4
  def stub_messages
5
5
  @messages = []
6
- $stdout.stub( :write ) { |message| @messages << message }
6
+ allow($stdout).to receive( :write ) { |message| @messages << message }
7
7
  end
8
8
 
9
9
  def surpress_messages
10
- $stdout.stub( :write )
10
+ allow($stdout).to receive( :write )
11
11
  end
12
12
 
13
13
  RSpec::Matchers.define :include_match do |expected|
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geoffreywiseman-prune
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Geoffrey Wiseman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-24 00:00:00.000000000 Z
11
+ date: 2018-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitar
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.5.3
19
+ version: '0.6'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.5.3
26
+ version: '0.6'
27
27
  description: Prune is meant to analyze a folder full of files, run them against a
28
28
  retention policy and decide which to keep, which to remove and which to archive.
29
29
  It is extensible and embeddable.
@@ -54,7 +54,8 @@ files:
54
54
  - spec/retention_spec.rb
55
55
  - spec/spec_helper.rb
56
56
  homepage: http://geoffreywiseman.github.com/prune
57
- licenses: []
57
+ licenses:
58
+ - UNLICENSE
58
59
  metadata: {}
59
60
  post_install_message:
60
61
  rdoc_options: []