backup 3.0.20 → 3.0.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (178) hide show
  1. data/Gemfile +1 -5
  2. data/Gemfile.lock +46 -50
  3. data/README.md +54 -27
  4. data/lib/backup.rb +16 -39
  5. data/lib/backup/archive.rb +42 -18
  6. data/lib/backup/cleaner.rb +110 -25
  7. data/lib/backup/cli/helpers.rb +17 -32
  8. data/lib/backup/cli/utility.rb +46 -107
  9. data/lib/backup/compressor/base.rb +14 -2
  10. data/lib/backup/compressor/bzip2.rb +10 -24
  11. data/lib/backup/compressor/gzip.rb +10 -24
  12. data/lib/backup/compressor/lzma.rb +10 -23
  13. data/lib/backup/compressor/pbzip2.rb +12 -32
  14. data/lib/backup/config.rb +171 -0
  15. data/lib/backup/configuration/compressor/base.rb +1 -2
  16. data/lib/backup/configuration/compressor/pbzip2.rb +4 -4
  17. data/lib/backup/configuration/database/base.rb +2 -1
  18. data/lib/backup/configuration/database/mongodb.rb +8 -0
  19. data/lib/backup/configuration/database/mysql.rb +4 -0
  20. data/lib/backup/configuration/database/postgresql.rb +4 -0
  21. data/lib/backup/configuration/database/redis.rb +4 -0
  22. data/lib/backup/configuration/database/riak.rb +5 -1
  23. data/lib/backup/configuration/encryptor/base.rb +1 -2
  24. data/lib/backup/configuration/encryptor/open_ssl.rb +1 -1
  25. data/lib/backup/configuration/helpers.rb +7 -2
  26. data/lib/backup/configuration/notifier/base.rb +4 -28
  27. data/lib/backup/configuration/storage/base.rb +1 -1
  28. data/lib/backup/configuration/storage/dropbox.rb +14 -4
  29. data/lib/backup/configuration/syncer/base.rb +10 -0
  30. data/lib/backup/configuration/syncer/rsync/base.rb +28 -0
  31. data/lib/backup/configuration/syncer/rsync/local.rb +11 -0
  32. data/lib/backup/configuration/syncer/rsync/pull.rb +11 -0
  33. data/lib/backup/configuration/syncer/rsync/push.rb +31 -0
  34. data/lib/backup/configuration/syncer/s3.rb +0 -4
  35. data/lib/backup/database/base.rb +25 -7
  36. data/lib/backup/database/mongodb.rb +112 -75
  37. data/lib/backup/database/mysql.rb +54 -29
  38. data/lib/backup/database/postgresql.rb +60 -42
  39. data/lib/backup/database/redis.rb +61 -39
  40. data/lib/backup/database/riak.rb +35 -11
  41. data/lib/backup/dependency.rb +4 -5
  42. data/lib/backup/encryptor/base.rb +13 -1
  43. data/lib/backup/encryptor/gpg.rb +39 -39
  44. data/lib/backup/encryptor/open_ssl.rb +28 -38
  45. data/lib/backup/logger.rb +20 -11
  46. data/lib/backup/model.rb +206 -163
  47. data/lib/backup/notifier/base.rb +27 -25
  48. data/lib/backup/notifier/campfire.rb +7 -13
  49. data/lib/backup/notifier/hipchat.rb +28 -28
  50. data/lib/backup/notifier/mail.rb +24 -26
  51. data/lib/backup/notifier/presently.rb +10 -18
  52. data/lib/backup/notifier/prowl.rb +9 -17
  53. data/lib/backup/notifier/twitter.rb +11 -18
  54. data/lib/backup/package.rb +47 -0
  55. data/lib/backup/packager.rb +81 -16
  56. data/lib/backup/splitter.rb +48 -35
  57. data/lib/backup/storage/base.rb +44 -172
  58. data/lib/backup/storage/cloudfiles.rb +31 -46
  59. data/lib/backup/storage/cycler.rb +117 -0
  60. data/lib/backup/storage/dropbox.rb +92 -76
  61. data/lib/backup/storage/ftp.rb +30 -40
  62. data/lib/backup/storage/local.rb +44 -45
  63. data/lib/backup/storage/ninefold.rb +55 -49
  64. data/lib/backup/storage/rsync.rb +49 -56
  65. data/lib/backup/storage/s3.rb +33 -44
  66. data/lib/backup/storage/scp.rb +21 -48
  67. data/lib/backup/storage/sftp.rb +26 -40
  68. data/lib/backup/syncer/base.rb +7 -0
  69. data/lib/backup/syncer/rsync/base.rb +78 -0
  70. data/lib/backup/syncer/rsync/local.rb +53 -0
  71. data/lib/backup/syncer/rsync/pull.rb +38 -0
  72. data/lib/backup/syncer/rsync/push.rb +113 -0
  73. data/lib/backup/syncer/s3.rb +42 -32
  74. data/lib/backup/version.rb +1 -1
  75. data/spec/archive_spec.rb +235 -69
  76. data/spec/cleaner_spec.rb +304 -0
  77. data/spec/cli/helpers_spec.rb +142 -1
  78. data/spec/cli/utility_spec.rb +338 -13
  79. data/spec/compressor/base_spec.rb +31 -0
  80. data/spec/compressor/bzip2_spec.rb +60 -35
  81. data/spec/compressor/gzip_spec.rb +60 -35
  82. data/spec/compressor/lzma_spec.rb +60 -35
  83. data/spec/compressor/pbzip2_spec.rb +98 -37
  84. data/spec/config_spec.rb +321 -0
  85. data/spec/configuration/base_spec.rb +4 -4
  86. data/spec/configuration/compressor/bzip2_spec.rb +1 -0
  87. data/spec/configuration/compressor/gzip_spec.rb +1 -0
  88. data/spec/configuration/compressor/lzma_spec.rb +1 -0
  89. data/spec/configuration/compressor/pbzip2_spec.rb +32 -0
  90. data/spec/configuration/database/base_spec.rb +2 -1
  91. data/spec/configuration/database/mongodb_spec.rb +26 -16
  92. data/spec/configuration/database/mysql_spec.rb +4 -0
  93. data/spec/configuration/database/postgresql_spec.rb +4 -0
  94. data/spec/configuration/database/redis_spec.rb +4 -0
  95. data/spec/configuration/database/riak_spec.rb +4 -0
  96. data/spec/configuration/encryptor/gpg_spec.rb +1 -0
  97. data/spec/configuration/encryptor/open_ssl_spec.rb +1 -0
  98. data/spec/configuration/notifier/base_spec.rb +32 -0
  99. data/spec/configuration/notifier/campfire_spec.rb +1 -0
  100. data/spec/configuration/notifier/hipchat_spec.rb +1 -0
  101. data/spec/configuration/notifier/mail_spec.rb +1 -0
  102. data/spec/configuration/notifier/presently_spec.rb +1 -0
  103. data/spec/configuration/notifier/prowl_spec.rb +1 -0
  104. data/spec/configuration/notifier/twitter_spec.rb +1 -0
  105. data/spec/configuration/storage/cloudfiles_spec.rb +1 -0
  106. data/spec/configuration/storage/dropbox_spec.rb +4 -3
  107. data/spec/configuration/storage/ftp_spec.rb +1 -0
  108. data/spec/configuration/storage/local_spec.rb +1 -0
  109. data/spec/configuration/storage/ninefold_spec.rb +1 -0
  110. data/spec/configuration/storage/rsync_spec.rb +3 -1
  111. data/spec/configuration/storage/s3_spec.rb +1 -0
  112. data/spec/configuration/storage/scp_spec.rb +1 -0
  113. data/spec/configuration/storage/sftp_spec.rb +1 -0
  114. data/spec/configuration/syncer/rsync/base_spec.rb +33 -0
  115. data/spec/configuration/syncer/rsync/local_spec.rb +10 -0
  116. data/spec/configuration/syncer/rsync/pull_spec.rb +10 -0
  117. data/spec/configuration/syncer/{rsync_spec.rb → rsync/push_spec.rb} +12 -15
  118. data/spec/configuration/syncer/s3_spec.rb +2 -3
  119. data/spec/database/base_spec.rb +35 -20
  120. data/spec/database/mongodb_spec.rb +298 -119
  121. data/spec/database/mysql_spec.rb +147 -72
  122. data/spec/database/postgresql_spec.rb +155 -100
  123. data/spec/database/redis_spec.rb +200 -97
  124. data/spec/database/riak_spec.rb +82 -24
  125. data/spec/dependency_spec.rb +49 -0
  126. data/spec/encryptor/base_spec.rb +30 -0
  127. data/spec/encryptor/gpg_spec.rb +105 -28
  128. data/spec/encryptor/open_ssl_spec.rb +85 -114
  129. data/spec/logger_spec.rb +74 -8
  130. data/spec/model_spec.rb +528 -220
  131. data/spec/notifier/base_spec.rb +89 -0
  132. data/spec/notifier/campfire_spec.rb +147 -119
  133. data/spec/notifier/hipchat_spec.rb +140 -145
  134. data/spec/notifier/mail_spec.rb +190 -248
  135. data/spec/notifier/presently_spec.rb +147 -282
  136. data/spec/notifier/prowl_spec.rb +79 -111
  137. data/spec/notifier/twitter_spec.rb +87 -106
  138. data/spec/package_spec.rb +61 -0
  139. data/spec/packager_spec.rb +154 -0
  140. data/spec/spec_helper.rb +36 -13
  141. data/spec/splitter_spec.rb +90 -41
  142. data/spec/storage/base_spec.rb +95 -239
  143. data/spec/storage/cloudfiles_spec.rb +185 -75
  144. data/spec/storage/cycler_spec.rb +239 -0
  145. data/spec/storage/dropbox_spec.rb +318 -87
  146. data/spec/storage/ftp_spec.rb +165 -152
  147. data/spec/storage/local_spec.rb +206 -54
  148. data/spec/storage/ninefold_spec.rb +264 -128
  149. data/spec/storage/rsync_spec.rb +244 -163
  150. data/spec/storage/s3_spec.rb +175 -64
  151. data/spec/storage/scp_spec.rb +156 -150
  152. data/spec/storage/sftp_spec.rb +153 -135
  153. data/spec/syncer/base_spec.rb +22 -0
  154. data/spec/syncer/rsync/base_spec.rb +118 -0
  155. data/spec/syncer/rsync/local_spec.rb +121 -0
  156. data/spec/syncer/rsync/pull_spec.rb +90 -0
  157. data/spec/syncer/rsync/push_spec.rb +327 -0
  158. data/spec/syncer/s3_spec.rb +180 -91
  159. data/templates/cli/utility/config +1 -1
  160. data/templates/cli/utility/database/mongodb +4 -0
  161. data/templates/cli/utility/database/mysql +3 -0
  162. data/templates/cli/utility/database/postgresql +3 -0
  163. data/templates/cli/utility/database/redis +3 -0
  164. data/templates/cli/utility/database/riak +3 -0
  165. data/templates/cli/utility/storage/dropbox +4 -1
  166. data/templates/cli/utility/syncer/rsync_local +12 -0
  167. data/templates/cli/utility/syncer/{rsync → rsync_pull} +2 -2
  168. data/templates/cli/utility/syncer/rsync_push +17 -0
  169. data/templates/storage/dropbox/authorization_url.erb +1 -1
  170. metadata +42 -17
  171. data/lib/backup/configuration/syncer/rsync.rb +0 -45
  172. data/lib/backup/finder.rb +0 -87
  173. data/lib/backup/storage/object.rb +0 -47
  174. data/lib/backup/syncer/rsync.rb +0 -152
  175. data/spec/backup_spec.rb +0 -11
  176. data/spec/finder_spec.rb +0 -91
  177. data/spec/storage/object_spec.rb +0 -74
  178. data/spec/syncer/rsync_spec.rb +0 -195
@@ -1,45 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Backup
4
- module Configuration
5
- module Syncer
6
- class RSync < Base
7
- class << self
8
-
9
- ##
10
- # Server credentials
11
- attr_accessor :username, :password
12
-
13
- ##
14
- # Server IP Address and SSH port
15
- attr_accessor :ip
16
-
17
- ##
18
- # The SSH port to connect to
19
- attr_accessor :port
20
-
21
- ##
22
- # Directories to sync
23
- attr_accessor :directories
24
-
25
- ##
26
- # Path to store the synced files/directories to
27
- attr_accessor :path
28
-
29
- ##
30
- # Flag for mirroring the files/directories
31
- attr_accessor :mirror
32
-
33
- ##
34
- # Flag for compressing (only compresses for the transfer)
35
- attr_accessor :compress
36
-
37
- ##
38
- # Additional options for the rsync cli
39
- attr_accessor :additional_options
40
-
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,87 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Backup
4
- class Finder
5
- attr_accessor :trigger, :config
6
-
7
- ##
8
- # The wildcard character to match triggers
9
- # Can be used alone or in mask (e.g. web_* )
10
- WILDCARD = '*'
11
-
12
- ##
13
- # Initializes a new Backup::Finder object
14
- # and stores the path to the configuration file
15
- def initialize(trigger, config = CONFIG_FILE)
16
- @trigger = trigger.to_sym
17
- @config = config
18
- end
19
-
20
- ##
21
- # Tries to find and return the proper
22
- # backup model configuration (specified by the 'trigger')
23
- def find
24
- load_config!
25
-
26
- ##
27
- # Iterates through all the instantiated backup models and returns
28
- # the one that matches the specified 'trigger'
29
- Backup::Model.all.each do |model|
30
- if model.trigger.eql?(trigger)
31
- return Backup::Model.current = model
32
- end
33
- end
34
-
35
- raise Errors::Finder::MissingTriggerError,
36
- "Could not find trigger '#{trigger}' in '#{config}'."
37
- end
38
-
39
- ##
40
- # Tries to find and return the all triggers
41
- # matching wildcard (specified by the 'trigger')
42
- def matching
43
- ##
44
- # Define the TIME constants unless defined
45
- ::Backup.send(:const_set, :TIME, Time.now.strftime("%Y.%m.%d.%H.%M.%S")) unless defined? Backup::TIME
46
-
47
- ##
48
- # Parses the backup configuration file
49
- load_config!
50
-
51
- triggers = Backup::Model.all.map{|model| model.trigger.to_s }
52
-
53
- ##
54
- # Removes the TIME constant
55
- ::Backup.send(:remove_const, :TIME) if defined? Backup::TIME
56
-
57
- ##
58
- # Make regexp replacing wildcard character by (.+)
59
- wildcard = %r{^#{trigger.to_s.gsub(WILDCARD, '(.+)')}$}
60
-
61
- ##
62
- # Returns all trigger names matching wildcard
63
- triggers.select { |trigger| trigger =~ wildcard }
64
- end
65
-
66
- private
67
-
68
- ##
69
- # Tries to find and load the configuration file
70
- def load_config!
71
- unless File.exist?(config)
72
- raise Errors::Finder::MissingConfigError,
73
- "Could not find configuration file: '#{config}'."
74
- end
75
-
76
- ##
77
- # Reset the Backup::Model.all to an empty array since this will be
78
- # re-filled during the next Backup::Finder.new(arg1, arg2).find
79
- # or Backup::Finder.new(arg).matching call
80
- Backup::Model.all = Array.new
81
-
82
- ##
83
- # Loads the backup configuration file
84
- Backup.module_eval(File.read(config), config, 1)
85
- end
86
- end
87
- end
@@ -1,47 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Backup
4
- module Storage
5
- class Object
6
-
7
- ##
8
- # Holds the type attribute
9
- attr_accessor :storage_file
10
-
11
- ##
12
- # Instantiates a new Backup::Storage::Object and stores the
13
- # full path to the storage file (yaml) in the @storage_file attribute
14
- def initialize(type, storage_id)
15
- suffix = storage_id.to_s.strip.gsub(/[\W\s]/, '_')
16
- filename = suffix.empty? ? type : "#{type}-#{suffix}"
17
- @storage_file = File.join(DATA_PATH, TRIGGER, "#{filename}.yml")
18
- end
19
-
20
- ##
21
- # Tries to load an existing YAML file and returns an
22
- # array of storage objects. If no file exists, an empty
23
- # array gets returned
24
- #
25
- # If a file is loaded it'll sort the array of objects by @time
26
- # descending. The newest backup storage object comes in Backup::Storage::Object.load[0]
27
- # and the oldest in Backup::Storage::Object.load[-1]
28
- def load
29
- objects = []
30
- if File.exist?(storage_file) and not File.zero?(storage_file)
31
- objects = YAML.load_file(storage_file).sort { |a,b| b.time <=> a.time }
32
- end
33
- objects
34
- end
35
-
36
- ##
37
- # Takes the provided objects and converts it to YAML format.
38
- # The YAML data gets written to the storage file
39
- def write(objects)
40
- File.open(storage_file, 'w') do |file|
41
- file.write(objects.to_yaml)
42
- end
43
- end
44
-
45
- end
46
- end
47
- end
@@ -1,152 +0,0 @@
1
- # encoding: utf-8
2
-
3
- ##
4
- # Require the tempfile Ruby library when Backup::Syncer::RSync is loaded
5
- require 'tempfile'
6
-
7
- module Backup
8
- module Syncer
9
- class RSync < Base
10
-
11
- ##
12
- # Server credentials
13
- attr_accessor :username, :password
14
-
15
- ##
16
- # Server IP Address and SSH port
17
- attr_accessor :ip
18
-
19
- ##
20
- # The SSH port to connect to
21
- attr_writer :port
22
-
23
- ##
24
- # Directories to sync
25
- attr_writer :directories
26
-
27
- ##
28
- # Path to store the synced files/directories to
29
- attr_accessor :path
30
-
31
- ##
32
- # Flag for mirroring the files/directories
33
- attr_writer :mirror
34
-
35
- ##
36
- # Flag for compressing (only compresses for the transfer)
37
- attr_writer :compress
38
-
39
- ##
40
- # Additional options for the rsync cli
41
- attr_accessor :additional_options
42
-
43
- ##
44
- # Instantiates a new RSync Syncer object and sets the default configuration
45
- # specified in the Backup::Configuration::Syncer::RSync. Then it sets the object
46
- # defaults if particular properties weren't set. Finally it'll evaluate the users
47
- # configuration file and overwrite anything that's been defined
48
- def initialize(&block)
49
- load_defaults!
50
-
51
- @directories = Array.new
52
- @additional_options ||= Array.new
53
- @path ||= 'backups'
54
- @port ||= 22
55
- @mirror ||= false
56
- @compress ||= false
57
-
58
- instance_eval(&block) if block_given?
59
- write_password_file!
60
-
61
- @path = path.sub(/^\~\//, '')
62
- end
63
-
64
- ##
65
- # Performs the RSync operation
66
- # debug options: -vhP
67
- def perform!
68
- Logger.message("#{ self.class } started syncing #{ directories }.")
69
- Logger.silent(
70
- run("#{ utility(:rsync) } #{ options } #{ directories } '#{ username }@#{ ip }:#{ path }'")
71
- )
72
-
73
- remove_password_file!
74
- end
75
-
76
- ##
77
- # Returns all the specified Rsync options, concatenated, ready for the CLI
78
- def options
79
- ([archive, mirror, compress, port, password] + additional_options).compact.join("\s")
80
- end
81
-
82
- ##
83
- # Returns Rsync syntax for enabling mirroring
84
- def mirror
85
- '--delete' if @mirror
86
- end
87
-
88
- ##
89
- # Returns Rsync syntax for compressing the file transfers
90
- def compress
91
- '--compress' if @compress
92
- end
93
-
94
- ##
95
- # Returns Rsync syntax for invoking "archive" mode
96
- def archive
97
- '--archive'
98
- end
99
-
100
- ##
101
- # Returns Rsync syntax for defining a port to connect to
102
- def port
103
- "-e 'ssh -p #{@port}'"
104
- end
105
-
106
- ##
107
- # Returns Rsync syntax for setting a password (via a file)
108
- def password
109
- "--password-file='#{@password_file.path}'" unless @password.nil?
110
- end
111
-
112
- ##
113
- # If no block has been provided, it'll return the array of @directories.
114
- # If a block has been provided, it'll evaluate it and add the defined paths to the @directories
115
- def directories(&block)
116
- unless block_given?
117
- return @directories.map do |directory|
118
- "'#{directory}'"
119
- end.join("\s")
120
- end
121
- instance_eval(&block)
122
- end
123
-
124
- ##
125
- # Adds a path to the @directories array
126
- def add(path)
127
- @directories << path
128
- end
129
-
130
- private
131
-
132
- ##
133
- # Writes the provided password to a temporary file so that
134
- # the rsync utility can read the password from this file
135
- def write_password_file!
136
- unless @password.nil?
137
- @password_file = Tempfile.new('backup-rsync-password')
138
- @password_file.write(@password)
139
- @password_file.close
140
- end
141
- end
142
-
143
- ##
144
- # Removes the previously created @password_file
145
- # (temporary file containing the password)
146
- def remove_password_file!
147
- @password_file.unlink unless @password.nil?
148
- end
149
-
150
- end
151
- end
152
- end
@@ -1,11 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.expand_path('../spec_helper.rb', __FILE__)
4
-
5
- describe Backup do
6
- it do
7
- Backup::TMP_PATH.should == File.join(ENV['HOME'], 'Backup', '.tmp')
8
- Backup::DATA_PATH.should == File.join(ENV['HOME'], 'Backup', 'data')
9
- Backup::CONFIG_FILE.should == File.join(ENV['HOME'], 'Backup', 'config.rb')
10
- end
11
- end
@@ -1,91 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.expand_path('../spec_helper.rb', __FILE__)
4
-
5
- describe Backup::Finder do
6
-
7
- describe '#find' do
8
- let(:finder) { Backup::Finder.new('test_trigger', 'foo') }
9
-
10
- before do
11
- finder.stubs(:load_config!)
12
- end
13
-
14
- it 'should return the first model that matches the trigger' do
15
- models = %w{ foo1 test_trigger foo2 test_trigger }.map do |trigger|
16
- stub(:trigger => trigger.to_sym)
17
- end
18
- Backup::Model.expects(:all).returns(models)
19
- Backup::Model.expects(:current=).with(models[1])
20
-
21
- expect do
22
- finder.find.should == models[1]
23
- end.not_to raise_error
24
- end
25
-
26
- it 'should raise an error when no models match the trigger' do
27
- models = %w{ foo1 foo2 foo3 }.map do |trigger|
28
- stub(:trigger => trigger.to_sym)
29
- end
30
- Backup::Model.expects(:all).returns(models)
31
- Backup::Model.expects(:current=).never
32
-
33
- expect do
34
- finder.find
35
- end.to raise_error(
36
- Backup::Errors::Finder::MissingTriggerError,
37
- "Finder::MissingTriggerError: Could not find trigger 'test_trigger' in 'foo'."
38
- )
39
- end
40
-
41
- end # describe '#find'
42
-
43
- describe '#load_config!' do
44
- let(:finder) { Backup::Finder.new('foo', 'config_file') }
45
-
46
- context 'when given a valid config file' do
47
-
48
- before do
49
- File.expects(:exist?).with('config_file').returns(true)
50
- end
51
-
52
- it 'should load the config file' do
53
- File.expects(:read).with('config_file').returns(:file_contents)
54
- Backup.expects(:module_eval).with(:file_contents, 'config_file', 1)
55
-
56
- finder.send(:load_config!)
57
- end
58
-
59
- it 'should reset Model.all' do
60
- File.stubs(:read)
61
- Backup.stubs(:module_eval)
62
- Backup::Model.expects(:all=).with([])
63
-
64
- finder.send(:load_config!)
65
- end
66
-
67
- end # context 'when given a valid config file'
68
-
69
- context 'when given a config file that does not exist' do
70
-
71
- before do
72
- File.expects(:exist?).with('config_file').returns(false)
73
- end
74
-
75
- it 'should raise an error' do
76
- Backup::Model.expects(:all=).never
77
- File.expects(:read).never
78
- Backup.expects(:module_eval).never
79
-
80
- expect do
81
- finder.send(:load_config!)
82
- end.to raise_error(
83
- Backup::Errors::Finder::MissingConfigError,
84
- "Finder::MissingConfigError: Could not find configuration file: 'config_file'."
85
- )
86
- end
87
-
88
- end # context 'when given a config file that does not exist'
89
-
90
- end # describe '#find'
91
- end
@@ -1,74 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.expand_path('../../spec_helper.rb', __FILE__)
4
-
5
- describe Backup::Storage::Object do
6
-
7
- describe '#initialize' do
8
-
9
- it 'uses storage type only as YAML filename if no storage_id' do
10
- [nil, '', ' '].each do |storage_id|
11
- object = Backup::Storage::Object.new(:s3, storage_id)
12
- object.storage_file.should == File.join(Backup::DATA_PATH, Backup::TRIGGER, 's3.yml')
13
- end
14
- end
15
-
16
- it 'appends optional storage_id' do
17
- object = Backup::Storage::Object.new(:s3, 'foo')
18
- object.storage_file.should == File.join(Backup::DATA_PATH, Backup::TRIGGER, 's3-foo.yml')
19
- end
20
-
21
- it 'sanitizes user-defined storage_id for use as filename' do
22
- [ ['Backup Server #1', 'Backup_Server__1'],
23
- [' {Special} Storage ', '_Special__Storage'],
24
- ['Cloud (!@$%^&*) #9', 'Cloud____________9'] ].each do |input, sanitized|
25
- object = Backup::Storage::Object.new(:s3, input)
26
- object.storage_file.should == File.join(Backup::DATA_PATH, Backup::TRIGGER, "s3-#{sanitized}.yml")
27
- end
28
- end
29
-
30
- end
31
-
32
- describe '#load' do
33
- let(:storage_object) { Backup::Storage::Object.new(:s3, nil) }
34
-
35
- it 'should return an array with objects' do
36
- loaded_objects = YAML.load([Backup::Storage::S3.new, Backup::Storage::S3.new].to_yaml)
37
- sorted_objects = loaded_objects.sort {|a,b| b.time <=> a.time }
38
-
39
- File.expects(:exist?).returns(true)
40
- YAML.expects(:load_file).with(
41
- File.join(Backup::DATA_PATH, Backup::TRIGGER, 's3.yml')
42
- ).returns(loaded_objects)
43
-
44
- objects = storage_object.load
45
- objects.should be_an(Array)
46
- objects.first.should be_an_instance_of(Backup::Storage::S3)
47
- end
48
-
49
- it 'should load them sorted by time descending (newest backup is first in the array)' do
50
- obj_1 = Backup::Storage::S3.new; obj_1.time = '2007.00.00.00.00.00'
51
- obj_2 = Backup::Storage::S3.new; obj_2.time = '2009.00.00.00.00.00'
52
- obj_3 = Backup::Storage::S3.new; obj_3.time = '2011.00.00.00.00.00'
53
-
54
- File.stubs(:exist?).returns(true)
55
- File.stubs(:zero?).returns(false)
56
-
57
- [obj_1, obj_2, obj_3].permutation.each do |perm|
58
- loaded_objects = YAML.load(perm.to_yaml)
59
- sorted_objects = loaded_objects.sort {|a,b| b.time <=> a.time }
60
-
61
- YAML.expects(:load_file).with(
62
- File.join(Backup::DATA_PATH, Backup::TRIGGER, 's3.yml')
63
- ).returns(loaded_objects)
64
-
65
- objects = storage_object.load
66
- objects[0].time.should == '2011.00.00.00.00.00'
67
- objects[1].time.should == '2009.00.00.00.00.00'
68
- objects[2].time.should == '2007.00.00.00.00.00'
69
- end
70
- end
71
-
72
- end
73
-
74
- end