backup 3.0.16 → 3.0.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/.travis.yml +10 -0
  2. data/Gemfile.lock +50 -47
  3. data/Guardfile +3 -3
  4. data/README.md +136 -81
  5. data/backup.gemspec +3 -2
  6. data/bin/backup +36 -15
  7. data/lib/backup.rb +30 -20
  8. data/lib/backup/cli.rb +30 -2
  9. data/lib/backup/compressor/lzma.rb +63 -0
  10. data/lib/backup/configuration/compressor/lzma.rb +23 -0
  11. data/lib/backup/configuration/helpers.rb +10 -4
  12. data/lib/backup/configuration/notifier/mail.rb +5 -0
  13. data/lib/backup/configuration/storage/dropbox.rb +19 -4
  14. data/lib/backup/configuration/storage/ftp.rb +4 -0
  15. data/lib/backup/configuration/storage/local.rb +17 -0
  16. data/lib/backup/configuration/storage/ninefold.rb +20 -0
  17. data/lib/backup/configuration/storage/rsync.rb +4 -0
  18. data/lib/backup/database/postgresql.rb +12 -3
  19. data/lib/backup/database/redis.rb +5 -1
  20. data/lib/backup/dependency.rb +11 -12
  21. data/lib/backup/encryptor/gpg.rb +2 -0
  22. data/lib/backup/exception/command_failed.rb +8 -0
  23. data/lib/backup/finder.rb +49 -9
  24. data/lib/backup/notifier/mail.rb +7 -1
  25. data/lib/backup/notifier/twitter.rb +1 -1
  26. data/lib/backup/storage/dropbox.rb +93 -16
  27. data/lib/backup/storage/ftp.rb +10 -3
  28. data/lib/backup/storage/local.rb +78 -0
  29. data/lib/backup/storage/ninefold.rb +96 -0
  30. data/lib/backup/storage/rsync.rb +37 -20
  31. data/lib/backup/storage/s3.rb +1 -1
  32. data/lib/backup/storage/scp.rb +1 -1
  33. data/lib/backup/syncer/rsync.rb +1 -1
  34. data/lib/backup/version.rb +1 -1
  35. data/lib/templates/compressor/lzma +7 -0
  36. data/lib/templates/storage/dropbox +2 -2
  37. data/lib/templates/storage/ftp +8 -7
  38. data/lib/templates/storage/local +7 -0
  39. data/lib/templates/storage/ninefold +9 -0
  40. data/lib/templates/storage/rsync +1 -0
  41. data/spec/archive_spec.rb +0 -1
  42. data/spec/compressor/bzip2_spec.rb +0 -1
  43. data/spec/compressor/gzip_spec.rb +0 -1
  44. data/spec/compressor/lzma_spec.rb +58 -0
  45. data/spec/configuration/compressor/bzip2_spec.rb +28 -0
  46. data/spec/configuration/compressor/lzma_spec.rb +28 -0
  47. data/spec/configuration/database/mongodb_spec.rb +16 -0
  48. data/spec/configuration/database/mysql_spec.rb +17 -0
  49. data/spec/configuration/database/postgresql_spec.rb +17 -0
  50. data/spec/configuration/database/redis_spec.rb +16 -0
  51. data/spec/configuration/notifier/campfire_spec.rb +11 -0
  52. data/spec/configuration/notifier/mail_spec.rb +20 -0
  53. data/spec/configuration/notifier/presently_spec.rb +34 -0
  54. data/spec/configuration/notifier/twitter_spec.rb +12 -0
  55. data/spec/configuration/storage/dropbox_spec.rb +0 -6
  56. data/spec/configuration/storage/ftp_spec.rb +15 -12
  57. data/spec/configuration/storage/local_spec.rb +28 -0
  58. data/spec/configuration/storage/ninefold_spec.rb +31 -0
  59. data/spec/configuration/storage/rsync_spec.rb +2 -0
  60. data/spec/database/mongodb_spec.rb +0 -1
  61. data/spec/database/mysql_spec.rb +0 -1
  62. data/spec/database/postgresql_spec.rb +31 -11
  63. data/spec/database/redis_spec.rb +9 -4
  64. data/spec/encryptor/gpg_spec.rb +1 -1
  65. data/spec/encryptor/open_ssl_spec.rb +0 -1
  66. data/spec/logger_spec.rb +32 -24
  67. data/spec/model_spec.rb +15 -15
  68. data/spec/spec_helper.rb +8 -4
  69. data/spec/storage/base_spec.rb +0 -4
  70. data/spec/storage/cloudfiles_spec.rb +0 -1
  71. data/spec/storage/dropbox_spec.rb +44 -14
  72. data/spec/storage/ftp_spec.rb +26 -15
  73. data/spec/storage/local_spec.rb +83 -0
  74. data/spec/storage/ninefold_spec.rb +142 -0
  75. data/spec/storage/object_spec.rb +1 -1
  76. data/spec/storage/rsync_spec.rb +17 -7
  77. data/spec/storage/s3_spec.rb +4 -3
  78. data/spec/storage/scp_spec.rb +0 -1
  79. data/spec/storage/sftp_spec.rb +0 -1
  80. data/spec/syncer/rsync_spec.rb +8 -8
  81. metadata +62 -36
@@ -0,0 +1,10 @@
1
+ script: "bundle exec rspec ./spec/"
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - ree
7
+ branches:
8
+ only:
9
+ - master
10
+ - develop
@@ -1,34 +1,34 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- activesupport (3.0.5)
5
- addressable (2.2.4)
4
+ Platform (0.4.0)
5
+ addressable (2.2.6)
6
6
  builder (3.0.0)
7
7
  crack (0.1.8)
8
8
  diff-lcs (1.1.2)
9
- dropbox (1.2.3)
9
+ dropbox (1.3.0)
10
10
  json (>= 1.2.0)
11
- mechanize (>= 1.0.0)
12
- multipart-post (>= 1.0)
11
+ multipart-post (>= 1.1.0)
13
12
  oauth (>= 0.3.6)
14
- excon (0.5.6)
15
- faraday (0.5.7)
16
- addressable (~> 2.2.4)
13
+ excon (0.6.6)
14
+ faraday (0.7.4)
15
+ addressable (~> 2.2.6)
17
16
  multipart-post (~> 1.1.0)
18
- rack (< 2, >= 1.1.0)
19
- faraday_middleware (0.3.2)
20
- faraday (~> 0.5.4)
17
+ rack (>= 1.1.0, < 2)
18
+ faraday_middleware (0.7.0)
19
+ faraday (~> 0.7.3)
21
20
  ffi (1.0.9)
22
- fog (0.7.0)
21
+ fog (0.11.0)
23
22
  builder
24
- excon (>= 0.5.5)
25
- formatador (>= 0.1.1)
26
- json
23
+ excon (~> 0.6.5)
24
+ formatador (~> 0.2.0)
27
25
  mime-types
28
- net-ssh (>= 2.0.23)
29
- nokogiri (>= 1.4.4)
26
+ multi_json (~> 1.0.3)
27
+ net-scp (~> 1.0.4)
28
+ net-ssh (~> 2.1.4)
29
+ nokogiri (~> 1.5.0)
30
30
  ruby-hmac
31
- formatador (0.1.1)
31
+ formatador (0.2.1)
32
32
  fuubar (0.0.5)
33
33
  rspec (~> 2.0)
34
34
  rspec-instafail (~> 0.1.4)
@@ -38,33 +38,34 @@ GEM
38
38
  thor (~> 0.14.6)
39
39
  guard-rspec (0.3.1)
40
40
  guard (>= 0.2.2)
41
- hashie (1.0.0)
41
+ hashie (1.1.0)
42
42
  httparty (0.7.4)
43
43
  crack (= 0.1.8)
44
- i18n (0.5.0)
45
- json (1.5.1)
44
+ i18n (0.6.0)
45
+ json (1.5.4)
46
46
  libnotify (0.5.5)
47
- mail (2.2.15)
48
- activesupport (>= 2.3.6)
47
+ mail (2.3.0)
49
48
  i18n (>= 0.4.0)
50
49
  mime-types (~> 1.16)
51
50
  treetop (~> 1.4.8)
52
- mechanize (1.0.0)
53
- nokogiri (>= 1.2.1)
54
51
  mime-types (1.16)
55
52
  mocha (0.9.12)
56
- multi_json (0.0.5)
57
- multi_xml (0.2.1)
58
- multipart-post (1.1.0)
53
+ multi_json (1.0.3)
54
+ multi_xml (0.3.0)
55
+ multipart-post (1.1.3)
59
56
  net-scp (1.0.4)
60
57
  net-ssh (>= 1.99.1)
61
58
  net-sftp (2.0.5)
62
59
  net-ssh (>= 2.0.9)
63
- net-ssh (2.1.3)
64
- nokogiri (1.4.4)
65
- oauth (0.4.4)
66
- polyglot (0.3.1)
67
- rack (1.2.2)
60
+ net-ssh (2.1.4)
61
+ nokogiri (1.5.0)
62
+ oauth (0.4.5)
63
+ open4 (1.1.0)
64
+ polyglot (0.3.2)
65
+ popen4 (0.1.2)
66
+ Platform (>= 0.4.0)
67
+ open4 (>= 0.4.0)
68
+ rack (1.3.2)
68
69
  rb-fsevent (0.4.0)
69
70
  rb-inotify (0.8.5)
70
71
  ffi (>= 0.5.0)
@@ -79,25 +80,26 @@ GEM
79
80
  rspec-mocks (2.5.0)
80
81
  ruby-hmac (0.4.0)
81
82
  ruby-progressbar (0.0.10)
82
- simple_oauth (0.1.4)
83
+ simple_oauth (0.1.5)
83
84
  thor (0.14.6)
84
85
  timecop (0.3.5)
85
- treetop (1.4.9)
86
+ treetop (1.4.10)
87
+ polyglot
86
88
  polyglot (>= 0.3.1)
87
- twitter (1.1.2)
88
- faraday (~> 0.5.4)
89
- faraday_middleware (~> 0.3.1)
90
- hashie (~> 1.0.0)
91
- multi_json (~> 0.0.5)
92
- multi_xml (~> 0.2.0)
93
- simple_oauth (~> 0.1.3)
89
+ twitter (1.7.1)
90
+ faraday (~> 0.7.4)
91
+ faraday_middleware (~> 0.7.0)
92
+ hashie (~> 1.1.0)
93
+ multi_json (~> 1.0.0)
94
+ multi_xml (~> 0.3.0)
95
+ simple_oauth (~> 0.1.5)
94
96
 
95
97
  PLATFORMS
96
98
  ruby
97
99
 
98
100
  DEPENDENCIES
99
- dropbox (~> 1.2.3)
100
- fog (~> 0.7.0)
101
+ dropbox (~> 1.3.0)
102
+ fog (>= 0.11.0)
101
103
  fuubar
102
104
  growl
103
105
  guard
@@ -105,13 +107,14 @@ DEPENDENCIES
105
107
  httparty (~> 0.7.4)
106
108
  json (~> 1.5.1)
107
109
  libnotify
108
- mail (~> 2.2.15)
110
+ mail (~> 2.3.0)
109
111
  mocha
110
112
  net-scp (~> 1.0.4)
111
113
  net-sftp (~> 2.0.5)
112
- net-ssh (~> 2.1.3)
114
+ net-ssh (~> 2.1.4)
115
+ popen4 (~> 0.1.2)
113
116
  rb-fsevent
114
117
  rb-inotify
115
118
  rspec
116
119
  timecop
117
- twitter (~> 1.1.2)
120
+ twitter (>= 1.7.1)
data/Guardfile CHANGED
@@ -7,10 +7,10 @@
7
7
 
8
8
  guard 'rspec',
9
9
  :version => 2,
10
- :rvm => ['1.9.2', '1.8.7', 'ree'],
10
+ :rvm => ['1.9.3', '1.9.2', '1.8.7', 'ree'],
11
11
  :bundler => true,
12
- :cli => '--color --format Fuubar --fail-fast' do
13
-
12
+ :cli => '--color --format Fuubar' do
13
+
14
14
  watch(%r{^spec/.+_spec\.rb})
15
15
  watch(%r{^lib/(.+)\.rb}) { 'spec' }
16
16
  watch('spec/spec_helper.rb') { 'spec' }
data/README.md CHANGED
@@ -3,6 +3,7 @@ Backup 3
3
3
 
4
4
  Backup is a RubyGem, written for Linux and Mac OSX, that allows you to easily perform backup operations on both your remote, as well as your local environment. It provides you with an elegant DSL in Ruby for modeling (configuring) your backups. Backup has built-in support for various databases, storage protocols/services, syncers, compressors, encryptors and notifiers which you can mix and match. It was built with modularity, extensibility and simplicity in mind.
5
5
 
6
+ [![Build Status](https://secure.travis-ci.org/meskyanichi/backup.png)](http://travis-ci.org/meskyanichi/backup)
6
7
 
7
8
  Author
8
9
  ------
@@ -29,7 +30,7 @@ I recommend you read this README first, and refer to the [Wiki pages](https://gi
29
30
  What Backup 3 currently supports
30
31
  ================================
31
32
 
32
- Below you find a list of components that Backup currently supports. Each of these compontents is isolated, meaning that adding new databases, storage location / service, compressor, encryptor or notifier is easy to do.
33
+ Below you find a list of components that Backup currently supports. If you'd like support for components other than the ones listed here, feel free to request them or to fork Backup and add them yourself. Backup is modular and easy to extend with new components.
33
34
 
34
35
  Database Support
35
36
  ----------------
@@ -54,7 +55,8 @@ Storage Locations and Services
54
55
 
55
56
  - Amazon Simple Storage Service (S3)
56
57
  - Rackspace Cloud Files (Mosso)
57
- - Dropbox
58
+ - Ninefold Cloud Storage
59
+ - Dropbox Web Service
58
60
  - Remote Servers *(Available Protocols: FTP, SFTP, SCP and RSync)*
59
61
 
60
62
  [Storage Wiki Page](https://github.com/meskyanichi/backup/wiki/Storages)
@@ -65,7 +67,8 @@ Storage Features
65
67
  - Backup Cycling, applies to:
66
68
  - Amazon Simple Storage Service (S3)
67
69
  - Rackspace Cloud Files (Mosso)
68
- - Dropbox
70
+ - Ninefold Cloud Storage
71
+ - Dropbox Web Service
69
72
  - Remote Servers *(Only Protocols: FTP, SFTP, SCP)*
70
73
  - Incremental Backups, applies to:
71
74
  - Remote Servers *(Only Protocols: RSync)*
@@ -85,6 +88,7 @@ Compressors
85
88
 
86
89
  - Gzip
87
90
  - Bzip2
91
+ - Lzma
88
92
 
89
93
  [Compressors Wiki Page](https://github.com/meskyanichi/backup/wiki/Compressors)
90
94
 
@@ -109,6 +113,7 @@ Notifiers
109
113
  Supported Ruby versions (Tested with RSpec)
110
114
  -------------------------------------------
111
115
 
116
+ - Ruby 1.9.3-preview1
112
117
  - Ruby 1.9.2
113
118
  - Ruby 1.8.7
114
119
  - Ruby Enterprise Edition 1.8.7
@@ -119,87 +124,92 @@ A sample Backup configuration file
119
124
 
120
125
  This is a Backup configuration file. Check it out and read the explanation below. Backup has a [great wiki](https://github.com/meskyanichi/backup/wiki) which explains each component of Backup in detail.
121
126
 
122
- Backup::Model.new(:sample_backup, 'A sample backup configuration') do
123
-
124
- database MySQL do |database|
125
- database.name = 'my_sample_mysql_db'
126
- database.username = 'my_username'
127
- database.password = 'my_password'
128
- database.skip_tables = ['logs']
129
- database.additional_options = ['--single-transaction', '--quick']
130
- end
131
-
132
- database MongoDB do |database|
133
- database.name = 'my_sample_mongo_db'
134
- database.only_collections = ['users', 'events', 'posts']
135
- end
136
-
137
- archive :user_avatars do |archive|
138
- archive.add '/var/apps/my_sample_app/public/avatars'
139
- end
140
-
141
- archive :logs do |archive|
142
- archive.add '/var/apps/my_sample_app/logs/production.log'
143
- archive.add '/var/apps/my_sample_app/logs/newrelic_agent.log'
144
- archive.add '/var/apps/my_sample_app/logs/other.log'
145
- end
146
-
147
- encrypt_with OpenSSL do |encryption|
148
- encryption.password = 'my_secret_password'
149
- end
150
-
151
- compress_with Gzip do |compression|
152
- compression.best = true
153
- end
154
-
155
- store_with S3 do |s3|
156
- s3.access_key_id = 'my_access_key_id'
157
- s3.secret_access_key = 'my_secret_access_key'
158
- s3.region = 'us-east-1'
159
- s3.bucket = 'my_bucket/backups'
160
- s3.keep = 20
161
- end
162
-
163
- sync_with S3 do |s3|
164
- s3.access_key_id = "my_access_key_id"
165
- s3.secret_access_key = "my_secret_access_key"
166
- s3.bucket = "my-bucket"
167
- s3.path = "/backups"
168
- s3.mirror = true
169
-
170
- s3.directories do |directory|
171
- directory.add "/var/apps/my_app/public/videos"
172
- directory.add "/var/apps/my_app/public/music"
173
- end
174
- end
175
-
176
- notify_by Mail do |mail|
177
- mail.on_success = false
178
- mail.on_failure = true
179
- end
180
-
181
- notify_by Twitter do |tweet|
182
- tweet.on_success = true
183
- tweet.on_failure = true
184
- end
185
-
127
+ ``` rb
128
+ Backup::Model.new(:sample_backup, 'A sample backup configuration') do
129
+
130
+ database MySQL do |database|
131
+ database.name = 'my_sample_mysql_db'
132
+ database.username = 'my_username'
133
+ database.password = 'my_password'
134
+ database.skip_tables = ['logs']
135
+ database.additional_options = ['--single-transaction', '--quick']
136
+ end
137
+
138
+ database MongoDB do |database|
139
+ database.name = 'my_sample_mongo_db'
140
+ database.only_collections = ['users', 'events', 'posts']
141
+ end
142
+
143
+ archive :user_avatars do |archive|
144
+ archive.add '/var/apps/my_sample_app/public/avatars'
145
+ end
146
+
147
+ archive :logs do |archive|
148
+ archive.add '/var/apps/my_sample_app/logs/production.log'
149
+ archive.add '/var/apps/my_sample_app/logs/newrelic_agent.log'
150
+ archive.add '/var/apps/my_sample_app/logs/other/'
151
+ archive.exclude '/var/apps/my_sample_app/logs/other/exclude-this.log'
152
+ end
153
+
154
+ encrypt_with OpenSSL do |encryption|
155
+ encryption.password = 'my_secret_password'
156
+ end
157
+
158
+ compress_with Gzip do |compression|
159
+ compression.best = true
160
+ end
161
+
162
+ store_with S3 do |s3|
163
+ s3.access_key_id = 'my_access_key_id'
164
+ s3.secret_access_key = 'my_secret_access_key'
165
+ s3.region = 'us-east-1'
166
+ s3.bucket = 'my_bucket/backups'
167
+ s3.keep = 20
168
+ end
169
+
170
+ sync_with S3 do |s3|
171
+ s3.access_key_id = "my_access_key_id"
172
+ s3.secret_access_key = "my_secret_access_key"
173
+ s3.bucket = "my-bucket"
174
+ s3.path = "/backups"
175
+ s3.mirror = true
176
+
177
+ s3.directories do |directory|
178
+ directory.add "/var/apps/my_app/public/videos"
179
+ directory.add "/var/apps/my_app/public/music"
186
180
  end
181
+ end
182
+
183
+ notify_by Mail do |mail|
184
+ mail.on_success = false
185
+ mail.on_failure = true
186
+ end
187
+
188
+ notify_by Twitter do |tweet|
189
+ tweet.on_success = true
190
+ tweet.on_failure = true
191
+ end
192
+
193
+ end
194
+ ```
187
195
 
188
196
  ### Brief explanation for the above example configuration
189
197
 
190
198
  It will dump two databases (MySQL and MongoDB), it'll create two (.t)archives (user_avatars and logs). It'll package the two database and two archives together in a single (.t)archive. It'll run the Gzip compressor to compress that archive, and then it'll run the OpenSSL encryptor to encrypt the compressed archive. Then that encrypted archive will be stored to your Amazon S3 account. If all goes well, and no exceptions are raised, you'll be notified via the Twitter notifier that the backup succeeded. If there was an exception raised during the backup process, then you'd receive an email in your inbox containing detailed exception information, as well as receive a simple Twitter message that something went wrong.
191
199
 
192
- As you can see, you can freely mix and match **archives**, **databases**, **compressors**, **encryptors**, **storages** and **notifiers** for your backups. You could even specify 3 storage locations: Amazon S3, Rackspace Cloud Files and Dropbox, it'd then store your packaged backup to 3 separate locations for high redundancy. This also applies to encryptors, you could double encrypt your backup with OpenSSL followed by GPG if you wanted.
200
+ As you can see, you can freely mix and match **archives**, **databases**, **compressors**, **encryptors**, **storages** and **notifiers** for your backups. You could even specify 4 storage locations if you wanted: Amazon S3, Rackspace Cloud Files, Ninefold and Dropbox, it'd then store your packaged backup to 4 separate locations for high redundancy. This also applies to compressors (like Gzip, Bzip2, Lzma) and encryptors, you could double encrypt your backup with OpenSSL followed by GPG if you wanted.
193
201
 
194
- Additionally we have also defined a **S3 Syncer** ( `sync_with S3` ), which does not follow the above process of archiving/compression/encryption, but instead will directly sync the whole `videos` and `music` folder structures from your machine to your Amazon S3 account. (very efficient and cost-effective since it will only transfer files that were changed!)
202
+ Additionally we have also defined a **S3 Syncer** ( `sync_with S3` ), which does not follow the above process of archiving/compression/encryption, but instead will directly sync the whole `videos` and `music` folder structures from your machine to your Amazon S3 account. (very efficient and cost-effective since it will only transfer files that were added/changed. Additionally, since we flagged it to 'mirror', it'll also remove files from S3 that no longer exist). If you simply wanted to sync to a separate backup server that you own, you could also use the RSync syncer for even more efficient backups that only transfer the **bytes** of each file that changed.
195
203
 
196
- There are more **archives**, **databases**, **compressors**, **encryptors**, **storages** and **notifiers** than displayed in the example, all available components are listed at the top of this README, as well as in the [Wiki](https://github.com/meskyanichi/backup/wiki).
204
+ There are more **archives**, **databases**, **compressors**, **encryptors**, **storages** and **notifiers** than displayed in the example, all available components are listed at the top of this README, as well as in the [Wiki](https://github.com/meskyanichi/backup/wiki) with more detailed information.
197
205
 
198
206
  ### Running the example
199
207
 
200
208
  Notice the `Backup::Model.new(:sample_backup, 'A sample backup configuration') do` at the top of the above example. The `:sample_backup` is called the **trigger**. This is used to identify the backup procedure/file and initialize it.
201
209
 
202
- backup perform -t [--trigger] sample_backup
210
+ ``` sh
211
+ backup perform -t [--trigger] sample_backup
212
+ ```
203
213
 
204
214
  Now it'll run the backup, it's as simple as that.
205
215
 
@@ -207,9 +217,11 @@ Now it'll run the backup, it's as simple as that.
207
217
 
208
218
  Since Backup is a simple command line utility, you should write a crontask to invoke it periodically. I recommend you use [Whenever](https://github.com/javan/whenever) to manage your crontab. It'll allow you to write to the crontab in pure Ruby, it provides an elegant DSL to do so, for example:
209
219
 
210
- every 6.hours do
211
- command "backup perform --trigger sample_backup"
212
- end
220
+ ``` rb
221
+ every 6.hours do
222
+ command "backup perform --trigger sample_backup"
223
+ end
224
+ ```
213
225
 
214
226
  With this in place, run `whenever --update-crontab backup` to write this Ruby syntax to the crontab in cron-syntax. The operating system will now invoke `backup perform --trigger sample_backup` every 6 hours. Check out the Whenever project page for more information.
215
227
 
@@ -280,6 +292,46 @@ Contributors
280
292
  <td><a href="https://github.com/bgarret" target="_blank">Benoit Garret ( bgarret )</a></td>
281
293
  <td>Presently notifier</td>
282
294
  </tr>
295
+ <tr>
296
+ <td><a href="https://github.com/lleirborras" target="_blank">Lleïr Borràs Metje ( lleirborras )</a></td>
297
+ <td>Lzma Compressor</td>
298
+ </tr>
299
+ <tr>
300
+ <td><a href="https://github.com/jof" target="_blank">Jonathan Lassoff ( jof )</a></td>
301
+ <td>Bugfixes and more secure GPG storage</td>
302
+ </tr>
303
+ <tr>
304
+ <td><a href="https://github.com/mikz" target="_blank">Michal Cichra ( mikz )</a></td>
305
+ <td>Wildcard Triggers</td>
306
+ </tr>
307
+ <tr>
308
+ <td><a href="https://github.com/trybeee" target="_blank">Dmitry Novotochinov ( trybeee )</a></td>
309
+ <td>Dropbox Storage</td>
310
+ </tr>
311
+ <tr>
312
+ <td><a href="https://github.com/Emerson" target="_blank">Emerson Lackey ( Emerson )</a></td>
313
+ <td>Local RSync Storage</td>
314
+ </tr>
315
+ <tr>
316
+ <td><a href="https://github.com/digilord" target="_blank">digilord</a></td>
317
+ <td>OpenSSL Verify Mode for Mail Notifier</td>
318
+ </tr>
319
+ <tr>
320
+ <td><a href="https://github.com/stemps" target="_blank">stemps</a></td>
321
+ <td>FTP Passive Mode</td>
322
+ </tr>
323
+ <tr>
324
+ <td><a href="https://github.com/dkowis" target="_blank">David Kowis ( dkowis )</a></td>
325
+ <td>Fixed PostgreSQL Password issues</td>
326
+ </tr>
327
+ <tr>
328
+ <td><a href="https://github.com/jotto" target="_blank">Jonathan Otto ( jotto )</a></td>
329
+ <td>Allow for running PostgreSQL as another UNIX user</td>
330
+ </tr>
331
+ <tr>
332
+ <td><a href="https://github.com/joaovitor" target="_blank">João Vitor ( joaovitor )</a></td>
333
+ <td>Changed default PostgreSQL example options to appropriate ones</td>
334
+ </tr>
283
335
  </table>
284
336
 
285
337
 
@@ -288,6 +340,7 @@ Want to contribute?
288
340
 
289
341
  - Fork/Clone the **develop** branch
290
342
  - Write RSpec tests, and test against:
343
+ - Ruby 1.9.3-preview1
291
344
  - Ruby 1.9.2
292
345
  - Ruby 1.8.7
293
346
  - Ruby Enterprise Edition 1.8.7
@@ -295,25 +348,27 @@ Want to contribute?
295
348
 
296
349
  I can't guarantee I'll pull every pull request. Also, I may accept your pull request and drastically change parts to improve readability/maintainability. Feel free to discuss about improvements, new functionality/features in the [issue log](https://github.com/meskyanichi/backup/issues) before contributing if you need/want more information.
297
350
 
298
- Easily run tests against all three Ruby versions
299
- ------------------------------------------------
351
+ Easily run tests against all four Ruby versions
352
+ -----------------------------------------------
300
353
 
301
- Install [RVM](https://rvm.beginrescueend.com/) and use it to install Ruby 1.9.2, 1.8.7 and REE.
354
+ Install [RVM](https://rvm.beginrescueend.com/) and use it to install Ruby 1.9.3, 1.9.2, 1.8.7 and REE.
302
355
 
303
- rvm install 1.9.2 && rvm install 1.8.7 && rvm install ree
356
+ rvm get latest && rvm reload
357
+ rvm install 1.9.3 && rvm install 1.9.2 && rvm install 1.8.7 && rvm install ree
304
358
 
305
359
  Once these are installed, go ahead and install all the necessary dependencies.
306
360
 
307
361
  cd backup
362
+ rvm use 1.9.3 && gem install bundler && bundle install
308
363
  rvm use 1.9.2 && gem install bundler && bundle install
309
364
  rvm use 1.8.7 && gem install bundler && bundle install
310
365
  rvm use ree && gem install bundler && bundle install
311
366
 
312
- The Backup gem uses [Guard](https://github.com/guard/guard) along with [Guard::RSpec](https://github.com/guard/guard-rspec) to quickly and easily test Backup's code against all three Rubies. If you've done the above, all you have to do is run:
367
+ The Backup gem uses [Guard](https://github.com/guard/guard) along with [Guard::RSpec](https://github.com/guard/guard-rspec) to quickly and easily test Backup's code against all four Rubies. If you've done the above, all you have to do is run:
313
368
 
314
- guard start
369
+ bundle exec guard
315
370
 
316
- from Backup's root and that's it. It'll now test against all three Rubies each time you adjust a file in the `lib` or `spec` directories.
371
+ from Backup's root and that's it. It'll now test against all four Rubies each time you adjust a file in the `lib` or `spec` directories.
317
372
 
318
373
 
319
374
  Or contribute by writing blogs/tutorials