s3_rotate 1.0.0 → 1.0.1

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
  SHA256:
3
- metadata.gz: d0a47b24554da5a2107fbb2c2ac19957f2053916c8d1202e6c1dac94358bfa2d
4
- data.tar.gz: 50c281cd8b4453e2075570a8e6a1f1a905e865c5d253215fb193b0769b780650
3
+ metadata.gz: 16f04d3b048eedc89e3a4efaacdb46009bda296f842ace1d1a0c56f87bb88158
4
+ data.tar.gz: df1fd512ebb22a0800ea822364e76f69c0a5409d89e90b95ee7731dcd81f0bed
5
5
  SHA512:
6
- metadata.gz: 9995b0a95d18a51414526b46c3670bac87a53c6355c25e50f6785787a198b3f61aa72547b68fceaaa650cbf822a75cf2dbf8b17f7d1f0fddf75ed50e1ef0785c
7
- data.tar.gz: 725bfa0b4974e2ffca31775954c0c505ec87a2f8ad1560f4e6f045a11d67bab6261d5158e9ea9de3a66d2d8ff4b93663628509a2cee3233d1ee20f5ed30fe688
6
+ metadata.gz: 89caf936d757c6d2afd3bc2eba65361e9d79ed1547b1fed1f51317925af7ddd458dce94cdd6a4402cf07d35889bb3be105c047dbdc6c690bf9f3c71fb715a26e
7
+ data.tar.gz: 30e6a7117c71466ff2bc99dafe37d97edfc574d945c30c6b4886d06f2644a2dae68db59f23d1f6dc11c3e7f32928927ad11182a24e69f1e0749203aee090cc62
data/.gitignore CHANGED
@@ -1,5 +1,6 @@
1
1
  # gems
2
2
  *.gem
3
+ Gemfile.lock
3
4
 
4
5
  # tmp
5
6
  tmp
data/README.md CHANGED
@@ -8,6 +8,10 @@
8
8
 
9
9
 
10
10
 
11
+ ## Requirements
12
+ - Ruby >= 2.0.0
13
+
14
+
11
15
  ## Installation
12
16
  In your `Gemfile`:
13
17
  ```bash
@@ -63,13 +63,13 @@ module S3Rotate
63
63
  weekly_backups = @s3_client.remote_backups(backup_name, "weekly").files
64
64
 
65
65
  # get most recent weekly file
66
- recent_weekly_file = weekly_backups.last
66
+ recent_weekly_file = weekly_backups.last ? weekly_backups.last.key : nil
67
67
 
68
68
  # look through daily backups to find which oness should be promoted
69
69
  daily_backups.each do |backup|
70
70
  # promote to weekly if applicable
71
- if should_promote_daily_to_weekly?(backup.key, recent_weekly_file&.key)
72
- recent_weekly_file = promote(backup_name, backup.key, backup.body, "weekly")
71
+ if should_promote_daily_to_weekly?(backup.key, recent_weekly_file)
72
+ recent_weekly_file = promote(backup_name, backup.key, backup.body, "weekly").key
73
73
  end
74
74
  end
75
75
 
@@ -100,13 +100,13 @@ module S3Rotate
100
100
  monthly_backups = @s3_client.remote_backups(backup_name, "monthly").files
101
101
 
102
102
  # get most recent monthly file
103
- recent_monthly_file = monthly_backups.last
103
+ recent_monthly_file = monthly_backups.last ? monthly_backups.last.key : nil
104
104
 
105
105
  # look through weekly backups to find which oness should be promoted
106
106
  weekly_backups.each do |backup|
107
107
  # promote to monthly if applicable
108
- if should_promote_weekly_to_monthly?(backup.key, recent_monthly_file&.key)
109
- recent_monthly_file = promote(backup_name, backup.key, backup.body, "monthly")
108
+ if should_promote_weekly_to_monthly?(backup.key, recent_monthly_file)
109
+ recent_monthly_file = promote(backup_name, backup.key, backup.body, "monthly").key
110
110
  end
111
111
  end
112
112
 
@@ -15,8 +15,15 @@ module S3Rotate
15
15
  #
16
16
  def FileUtils.date_from_filename(filename, date_regex=/\d{4}-\d{2}-\d{2}/)
17
17
  # match the date in the filename
18
- match = filename.match(date_regex)
19
- date_str = match&.captures&.first || match&.to_s
18
+ match = filename.match(date_regex)
19
+
20
+ if not match
21
+ date_str = nil
22
+ elsif not match.captures
23
+ date_str = match.to_s
24
+ else
25
+ date_str = match.captures.first || match.to_s
26
+ end
20
27
 
21
28
  # if nothing could be match, immediately fail
22
29
  raise "Invalid date_regex or filename format" if not date_str
@@ -2,14 +2,21 @@ require 'date'
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 's3_rotate'
5
- s.version = '1.0.0'
6
- s.homepage = 'https://github.com/Whova/s3_rotate'
7
- s.date = Date.today.to_s
8
5
  s.summary = "AWS S3 upload with rotation mechanism"
9
6
  s.description = s.summary
7
+ s.homepage = 'https://github.com/Whova/s3_rotate'
8
+ s.license = 'MIT'
9
+
10
+ s.version = '1.0.1'
11
+ s.date = Date.today.to_s
12
+
10
13
  s.authors = ["Simon Ninon"]
11
14
  s.email = 'simon.ninon@gmail.com'
15
+
12
16
  s.files = `git ls-files`.split("\n")
13
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
- s.license = 'MIT'
18
+
19
+ s.required_ruby_version = '>= 2.0.0'
20
+
21
+ s.add_dependency 'fog-aws', '~> 3.5.2'
15
22
  end
@@ -147,6 +147,48 @@ describe S3Rotate::BackupRotator do
147
147
  expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
148
148
  end
149
149
 
150
+ it 'rotates multiples when relevant' do
151
+ # mock
152
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
153
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-13.tgz', body: 'some data')
154
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-14.tgz', body: 'some data')
155
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-16.tgz', body: 'some data')
156
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-20.tgz', body: 'some data')
157
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-21.tgz', body: 'some data')
158
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-24.tgz', body: 'some data')
159
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-27.tgz', body: 'some data')
160
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-29.tgz', body: 'some data')
161
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-01-06.tgz', body: 'some data')
162
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-01-06.tgz', body: 'some data')
163
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
164
+
165
+ # perform test
166
+ @rotator.rotate_daily('backup_name', 3)
167
+
168
+ # verify result
169
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 3
170
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].key).to eq '/backup_name/daily/2020-01-24.tgz'
171
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].body).to eq 'some data'
172
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].key).to eq '/backup_name/daily/2020-01-27.tgz'
173
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].body).to eq 'some data'
174
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].key).to eq '/backup_name/daily/2020-01-29.tgz'
175
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].body).to eq 'some data'
176
+
177
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 4
178
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-01-06.tgz'
179
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
180
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].key).to eq '/backup_name/weekly/2020-01-13.tgz'
181
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].body).to eq 'some data'
182
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[2].key).to eq '/backup_name/weekly/2020-01-20.tgz'
183
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[2].body).to eq 'some data'
184
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[3].key).to eq '/backup_name/weekly/2020-01-27.tgz'
185
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[3].body).to eq 'some data'
186
+
187
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 1
188
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].key).to eq '/backup_name/monthly/2020-01-06.tgz'
189
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
190
+ end
191
+
150
192
  it 'always promote when there is no weekly backup' do
151
193
  # mock
152
194
  @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
@@ -338,6 +380,56 @@ describe S3Rotate::BackupRotator do
338
380
  expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[1].body).to eq 'some data'
339
381
  end
340
382
 
383
+ it 'rotates multiple when relevant' do
384
+ # mock
385
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
386
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-13.tgz', body: 'some data')
387
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-14.tgz', body: 'some data')
388
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-15.tgz', body: 'some data')
389
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-16.tgz', body: 'some data')
390
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-17.tgz', body: 'some data')
391
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-07.tgz', body: 'some data')
392
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-14.tgz', body: 'some data')
393
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-03-06.tgz', body: 'some data')
394
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-03-13.tgz', body: 'some data')
395
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-04-05.tgz', body: 'some data')
396
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-04-12.tgz', body: 'some data')
397
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-01-12.tgz', body: 'some data')
398
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
399
+
400
+ # perform test
401
+ @rotator.rotate_weekly('backup_name', 2)
402
+
403
+ # verify result
404
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 6
405
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].key).to eq '/backup_name/daily/2020-01-12.tgz'
406
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].body).to eq 'some data'
407
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].key).to eq '/backup_name/daily/2020-01-13.tgz'
408
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].body).to eq 'some data'
409
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].key).to eq '/backup_name/daily/2020-01-14.tgz'
410
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].body).to eq 'some data'
411
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].key).to eq '/backup_name/daily/2020-01-15.tgz'
412
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].body).to eq 'some data'
413
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].key).to eq '/backup_name/daily/2020-01-16.tgz'
414
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].body).to eq 'some data'
415
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].key).to eq '/backup_name/daily/2020-01-17.tgz'
416
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].body).to eq 'some data'
417
+
418
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 2
419
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-04-05.tgz'
420
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
421
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].key).to eq '/backup_name/weekly/2020-04-12.tgz'
422
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].body).to eq 'some data'
423
+
424
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 3
425
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].key).to eq '/backup_name/monthly/2020-01-12.tgz'
426
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
427
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[1].key).to eq '/backup_name/monthly/2020-02-14.tgz'
428
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[1].body).to eq 'some data'
429
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[2].key).to eq '/backup_name/monthly/2020-04-05.tgz'
430
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[2].body).to eq 'some data'
431
+ end
432
+
341
433
  it 'always promote when there is no monthly backup' do
342
434
  # mock
343
435
  @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
metadata CHANGED
@@ -1,25 +1,38 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: s3_rotate
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Ninon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-27 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2020-01-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: fog-aws
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 3.5.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 3.5.2
13
27
  description: AWS S3 upload with rotation mechanism
14
28
  email: simon.ninon@gmail.com
15
29
  executables: []
16
30
  extensions: []
17
31
  extra_rdoc_files: []
18
32
  files:
19
- - ".gitignore"
20
- - ".rspec"
33
+ - .gitignore
34
+ - .rspec
21
35
  - Gemfile
22
- - Gemfile.lock
23
36
  - LICENSE
24
37
  - README.md
25
38
  - examples/example.rb
@@ -50,16 +63,17 @@ require_paths:
50
63
  - lib
51
64
  required_ruby_version: !ruby/object:Gem::Requirement
52
65
  requirements:
53
- - - ">="
66
+ - - '>='
54
67
  - !ruby/object:Gem::Version
55
- version: '0'
68
+ version: 2.0.0
56
69
  required_rubygems_version: !ruby/object:Gem::Requirement
57
70
  requirements:
58
- - - ">="
71
+ - - '>='
59
72
  - !ruby/object:Gem::Version
60
73
  version: '0'
61
74
  requirements: []
62
- rubygems_version: 3.0.1
75
+ rubyforge_project:
76
+ rubygems_version: 2.7.10
63
77
  signing_key:
64
78
  specification_version: 4
65
79
  summary: AWS S3 upload with rotation mechanism
@@ -1,55 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- builder (3.2.4)
5
- diff-lcs (1.3)
6
- excon (0.71.1)
7
- fog-aws (3.5.2)
8
- fog-core (~> 2.1)
9
- fog-json (~> 1.1)
10
- fog-xml (~> 0.1)
11
- ipaddress (~> 0.8)
12
- fog-core (2.2.0)
13
- builder
14
- excon (~> 0.71)
15
- formatador (~> 0.2)
16
- mime-types
17
- fog-json (1.2.0)
18
- fog-core
19
- multi_json (~> 1.10)
20
- fog-xml (0.1.3)
21
- fog-core
22
- nokogiri (>= 1.5.11, < 2.0.0)
23
- formatador (0.2.5)
24
- ipaddress (0.8.3)
25
- mime-types (3.3.1)
26
- mime-types-data (~> 3.2015)
27
- mime-types-data (3.2019.1009)
28
- mini_portile2 (2.4.0)
29
- multi_json (1.14.1)
30
- nokogiri (1.10.7)
31
- mini_portile2 (~> 2.4.0)
32
- rspec (3.9.0)
33
- rspec-core (~> 3.9.0)
34
- rspec-expectations (~> 3.9.0)
35
- rspec-mocks (~> 3.9.0)
36
- rspec-core (3.9.1)
37
- rspec-support (~> 3.9.1)
38
- rspec-expectations (3.9.0)
39
- diff-lcs (>= 1.2.0, < 2.0)
40
- rspec-support (~> 3.9.0)
41
- rspec-mocks (3.9.1)
42
- diff-lcs (>= 1.2.0, < 2.0)
43
- rspec-support (~> 3.9.0)
44
- rspec-support (3.9.2)
45
-
46
- PLATFORMS
47
- ruby
48
-
49
- DEPENDENCIES
50
- fog-aws (~> 3.5.2)
51
- rspec
52
- rspec-mocks
53
-
54
- BUNDLED WITH
55
- 1.17.2