backup 3.4.0 → 3.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -4
- data/lib/backup.rb +0 -2
- data/lib/backup/cli.rb +1 -102
- data/lib/backup/database/postgresql.rb +21 -5
- data/lib/backup/model.rb +1 -1
- data/lib/backup/notifier/campfire.rb +1 -4
- data/lib/backup/notifier/hipchat.rb +1 -3
- data/lib/backup/notifier/mail.rb +1 -4
- data/lib/backup/notifier/prowl.rb +1 -4
- data/lib/backup/notifier/twitter.rb +1 -4
- data/lib/backup/package.rb +1 -1
- data/lib/backup/storage/cloudfiles.rb +1 -2
- data/lib/backup/storage/dropbox.rb +1 -2
- data/lib/backup/storage/ftp.rb +0 -1
- data/lib/backup/storage/ninefold.rb +1 -2
- data/lib/backup/storage/s3.rb +62 -20
- data/lib/backup/storage/scp.rb +1 -2
- data/lib/backup/storage/sftp.rb +1 -2
- data/lib/backup/syncer/cloud/base.rb +4 -2
- data/lib/backup/utilities.rb +2 -1
- data/lib/backup/version.rb +1 -39
- data/templates/cli/database/postgresql +2 -0
- data/templates/general/version.erb +2 -2
- metadata +371 -14
- data/lib/backup/dependency.rb +0 -165
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 427a033c5c094cc9f82b80cadd8a8fcf9b18223e
|
4
|
+
data.tar.gz: 77c8acac1d99cea70a94a95ac4fba311cbb232f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 11f4d89ab2012246bc79e22a88764b6898f880d5eb713b07d5621292398d186d6926c5234eddb3cc5706093630436e19294e5ec5bcbcb94115fd56b3a9f2d34a
|
7
|
+
data.tar.gz: bd727cc3c085768a6978de26fa156f9aee61bc6259386a1ad8cf56a28bd272ed9a24407550f7bd30b0f623f5a08b5c9aaabcc5ec845f2b2492bb9fc73a656d9e
|
data/README.md
CHANGED
@@ -8,12 +8,16 @@ was built with modularity, extensibility and simplicity in mind.
|
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
11
|
-
To
|
11
|
+
To install the latest version, run:
|
12
12
|
|
13
|
-
gem install backup
|
13
|
+
$ [sudo] gem install backup
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
_Do not add `gem backup` to an application's `Gemfile`_
|
16
|
+
|
17
|
+
See [Installation](https://github.com/meskyanichi/backup/wiki/Installation) for more information about installing and
|
18
|
+
updating your installation of Backup.
|
19
|
+
|
20
|
+
See [Release Notes](https://github.com/meskyanichi/backup/wiki/Release-Notes) for changes in the latest version.
|
17
21
|
|
18
22
|
Backup supports Ruby versions 1.8.7, 1.9.2, 1.9.3 and 2.0.0.
|
19
23
|
|
data/lib/backup.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
# Load Ruby Core Libraries
|
4
|
-
require 'rubygems'
|
5
4
|
require 'fileutils'
|
6
5
|
require 'tempfile'
|
7
6
|
require 'syslog'
|
@@ -112,7 +111,6 @@ module Backup
|
|
112
111
|
config
|
113
112
|
cli
|
114
113
|
configuration
|
115
|
-
dependency
|
116
114
|
errors
|
117
115
|
logger
|
118
116
|
model
|
data/lib/backup/cli.rb
CHANGED
@@ -362,110 +362,13 @@ module Backup
|
|
362
362
|
end
|
363
363
|
end
|
364
364
|
|
365
|
-
##
|
366
|
-
# [Dependencies]
|
367
|
-
# Returns a list of Backup's dependencies
|
368
|
-
desc 'dependencies', 'Display, Check or Install Dependencies for Backup.'
|
369
|
-
|
370
|
-
long_desc <<-EOS.gsub(/^ +/, '')
|
371
|
-
To display a list of available dependencies, run:
|
372
|
-
|
373
|
-
$ backup dependencies --list
|
374
|
-
|
375
|
-
To install one of these dependencies, run:
|
376
|
-
|
377
|
-
$ backup dependencies --install <name>
|
378
|
-
|
379
|
-
To check if a dependency is already installed, run:
|
380
|
-
|
381
|
-
$ backup dependencies --installed <name>
|
382
|
-
EOS
|
383
|
-
|
384
|
-
method_option :install, :type => :string, :banner => 'NAME'
|
385
|
-
method_option :list, :type => :boolean
|
386
|
-
method_option :installed, :type => :string, :banner => 'NAME'
|
387
|
-
|
388
|
-
def dependencies
|
389
|
-
Helpers.exec!("#{ $0 } help dependencies") unless options.any?
|
390
|
-
|
391
|
-
if options[:list]
|
392
|
-
deps = Dependency.all
|
393
|
-
width = 15 + deps.map {|dep| dep.used_for }.map(&:length).max
|
394
|
-
deps.each do |dep|
|
395
|
-
puts
|
396
|
-
puts "Gem Name: #{ dep.name }"
|
397
|
-
puts "Version: #{ dep.requirements.join(', ') }"
|
398
|
-
puts "Used for: #{ dep.used_for }"
|
399
|
-
puts '-' * width
|
400
|
-
end
|
401
|
-
exit
|
402
|
-
end
|
403
|
-
|
404
|
-
name = options[:install] || options[:installed]
|
405
|
-
unless dep = Dependency.find(name)
|
406
|
-
abort "'#{ name }' is not a Backup dependency."
|
407
|
-
end
|
408
|
-
|
409
|
-
if options[:install]
|
410
|
-
if Helpers.bundler_loaded?
|
411
|
-
abort <<-EOS.gsub(/^ +/, '')
|
412
|
-
=== Bundler Detected ===
|
413
|
-
This command should not be run within a Bundler managed environment.
|
414
|
-
While it is possible to install Backup and it's dependencies using
|
415
|
-
Bundler, the gem version requirements must still be met as shown by:
|
416
|
-
> backup dependencies --list
|
417
|
-
EOS
|
418
|
-
end
|
419
|
-
|
420
|
-
dep.dependencies.each do |_dep|
|
421
|
-
unless _dep.installed?
|
422
|
-
abort <<-EOS.gsub(/^ +/, '')
|
423
|
-
The '#{ dep.name }' gem requires '#{ _dep.name }'
|
424
|
-
Please install this first using the following command:
|
425
|
-
> backup dependencies --install #{ _dep.name }
|
426
|
-
EOS
|
427
|
-
end
|
428
|
-
end
|
429
|
-
|
430
|
-
dep.install!
|
431
|
-
end
|
432
|
-
|
433
|
-
if options[:installed]
|
434
|
-
name, err_msg = nil, nil
|
435
|
-
|
436
|
-
dep.dependencies.each do |_dep|
|
437
|
-
unless _dep.installed?
|
438
|
-
name = _dep.name
|
439
|
-
err_msg = "'#{ dep.name }' requires the '#{ name }' gem."
|
440
|
-
break
|
441
|
-
end
|
442
|
-
end
|
443
|
-
|
444
|
-
unless err_msg || dep.installed?
|
445
|
-
name = dep.name
|
446
|
-
err_msg = "'#{ name }' is not installed."
|
447
|
-
end
|
448
|
-
|
449
|
-
if err_msg
|
450
|
-
abort <<-EOS.gsub(/^ +/, '')
|
451
|
-
#{ err_msg }
|
452
|
-
To install the gem, issue the following command:
|
453
|
-
> backup dependencies --install #{ name }
|
454
|
-
Please try again after installing the missing dependency.
|
455
|
-
EOS
|
456
|
-
else
|
457
|
-
puts "'#{ dep.name }' is installed."
|
458
|
-
end
|
459
|
-
end
|
460
|
-
end
|
461
|
-
|
462
365
|
##
|
463
366
|
# [Version]
|
464
367
|
# Returns the current version of the Backup gem
|
465
368
|
map '-v' => :version
|
466
369
|
desc 'version', 'Display installed Backup version'
|
467
370
|
def version
|
468
|
-
puts "Backup #{Backup::
|
371
|
+
puts "Backup #{ Backup::VERSION }"
|
469
372
|
end
|
470
373
|
|
471
374
|
# This is to avoid Thor's warnings when stubbing methods on the Thor class.
|
@@ -485,10 +388,6 @@ module Backup
|
|
485
388
|
exec(cmd)
|
486
389
|
end
|
487
390
|
|
488
|
-
def bundler_loaded?
|
489
|
-
!ENV['BUNDLE_GEMFILE'].to_s.empty?
|
490
|
-
end
|
491
|
-
|
492
391
|
end
|
493
392
|
end
|
494
393
|
|
@@ -5,7 +5,9 @@ module Backup
|
|
5
5
|
class PostgreSQL < Base
|
6
6
|
|
7
7
|
##
|
8
|
-
# Name of the database that needs to get dumped
|
8
|
+
# Name of the database that needs to get dumped.
|
9
|
+
# To dump all databases, set this to `:all` or leave blank.
|
10
|
+
# +username+ must be a PostgreSQL superuser to run `pg_dumpall`.
|
9
11
|
attr_accessor :name
|
10
12
|
|
11
13
|
##
|
@@ -17,20 +19,24 @@ module Backup
|
|
17
19
|
attr_accessor :host, :port, :socket
|
18
20
|
|
19
21
|
##
|
20
|
-
# Tables to skip while dumping the database
|
22
|
+
# Tables to skip while dumping the database.
|
23
|
+
# If `name` is set to :all (or not specified), these are ignored.
|
21
24
|
attr_accessor :skip_tables
|
22
25
|
|
23
26
|
##
|
24
|
-
# Tables to dump
|
27
|
+
# Tables to dump. This in only valid if `name` is specified.
|
28
|
+
# If none are given, the entire database will be dumped.
|
25
29
|
attr_accessor :only_tables
|
26
30
|
|
27
31
|
##
|
28
|
-
# Additional "pg_dump" options
|
32
|
+
# Additional "pg_dump" or "pg_dumpall" options
|
29
33
|
attr_accessor :additional_options
|
30
34
|
|
31
35
|
def initialize(model, database_id = nil, &block)
|
32
36
|
super
|
33
37
|
instance_eval(&block) if block_given?
|
38
|
+
|
39
|
+
@name ||= :all
|
34
40
|
end
|
35
41
|
|
36
42
|
##
|
@@ -44,7 +50,7 @@ module Backup
|
|
44
50
|
pipeline = Pipeline.new
|
45
51
|
dump_ext = 'sql'
|
46
52
|
|
47
|
-
pipeline << pgdump
|
53
|
+
pipeline << (dump_all? ? pgdumpall : pgdump)
|
48
54
|
|
49
55
|
model.compressor.compress_with do |command, ext|
|
50
56
|
pipeline << command
|
@@ -69,6 +75,12 @@ module Backup
|
|
69
75
|
"#{ user_options } #{ tables_to_dump } #{ tables_to_skip } #{ name }"
|
70
76
|
end
|
71
77
|
|
78
|
+
def pgdumpall
|
79
|
+
"#{ password_option }" +
|
80
|
+
"#{ utility(:pg_dumpall) } #{ username_option } " +
|
81
|
+
"#{ connectivity_options } #{ user_options }"
|
82
|
+
end
|
83
|
+
|
72
84
|
def password_option
|
73
85
|
"PGPASSWORD='#{ password }' " if password
|
74
86
|
end
|
@@ -102,6 +114,10 @@ module Backup
|
|
102
114
|
end.join(' ')
|
103
115
|
end
|
104
116
|
|
117
|
+
def dump_all?
|
118
|
+
name == :all
|
119
|
+
end
|
120
|
+
|
105
121
|
attr_deprecate :utility_path, :version => '3.0.21',
|
106
122
|
:message => 'Use Backup::Utilities.configure instead.',
|
107
123
|
:action => lambda {|klass, val|
|
data/lib/backup/model.rb
CHANGED
@@ -324,7 +324,7 @@ module Backup
|
|
324
324
|
case action
|
325
325
|
when :started
|
326
326
|
Logger.info "Performing Backup for '#{label} (#{trigger})'!\n" +
|
327
|
-
"[ backup #{
|
327
|
+
"[ backup #{ VERSION } : #{ RUBY_DESCRIPTION } ]"
|
328
328
|
|
329
329
|
when :finished
|
330
330
|
msg = "Backup for '#{ label } (#{ trigger })' " +
|
data/lib/backup/notifier/mail.rb
CHANGED
data/lib/backup/package.rb
CHANGED
data/lib/backup/storage/ftp.rb
CHANGED
data/lib/backup/storage/s3.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
|
-
Backup::Dependency.load('fog')
|
2
|
+
require 'fog'
|
4
3
|
require 'base64'
|
5
4
|
require 'digest/md5'
|
6
5
|
|
@@ -56,6 +55,31 @@ module Backup
|
|
56
55
|
# Default: 30
|
57
56
|
attr_accessor :retry_waitsec
|
58
57
|
|
58
|
+
##
|
59
|
+
# Encryption algorithm to use for Amazon Server-Side Encryption
|
60
|
+
#
|
61
|
+
# Supported values:
|
62
|
+
#
|
63
|
+
# - :aes256
|
64
|
+
#
|
65
|
+
# @see http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html
|
66
|
+
#
|
67
|
+
# Default: nil
|
68
|
+
attr_accessor :encryption
|
69
|
+
|
70
|
+
##
|
71
|
+
# Storage class to use for the S3 objects uploaded
|
72
|
+
#
|
73
|
+
# Supported values:
|
74
|
+
#
|
75
|
+
# - :standard (default)
|
76
|
+
# - :reduced_redundancy
|
77
|
+
#
|
78
|
+
# @see http://docs.aws.amazon.com/AmazonS3/latest/dev/SetStoClsOfObjUploaded.html
|
79
|
+
#
|
80
|
+
# Default: :standard
|
81
|
+
attr_accessor :storage_class
|
82
|
+
|
59
83
|
def initialize(model, storage_id = nil, &block)
|
60
84
|
super
|
61
85
|
instance_eval(&block) if block_given?
|
@@ -64,6 +88,7 @@ module Backup
|
|
64
88
|
@max_retries ||= 10
|
65
89
|
@retry_waitsec ||= 30
|
66
90
|
@path ||= 'backups'
|
91
|
+
@storage_class ||= :standard
|
67
92
|
path.sub!(/^\//, '')
|
68
93
|
end
|
69
94
|
|
@@ -87,8 +112,7 @@ module Backup
|
|
87
112
|
src = File.join(Config.tmp_path, filename)
|
88
113
|
dest = File.join(remote_path, filename)
|
89
114
|
Logger.info "Storing '#{ bucket }/#{ dest }'..."
|
90
|
-
Uploader.new(
|
91
|
-
chunk_size, max_retries, retry_waitsec).run
|
115
|
+
Uploader.new(self, connection, src, dest).run
|
92
116
|
end
|
93
117
|
end
|
94
118
|
|
@@ -108,20 +132,21 @@ module Backup
|
|
108
132
|
end
|
109
133
|
|
110
134
|
class Uploader
|
111
|
-
attr_reader :connection, :bucket, :
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
def initialize(
|
116
|
-
|
117
|
-
@
|
118
|
-
@
|
119
|
-
@
|
120
|
-
@
|
121
|
-
@
|
122
|
-
@
|
123
|
-
@
|
124
|
-
@
|
135
|
+
attr_reader :connection, :bucket, :chunk_size, :max_retries,
|
136
|
+
:retry_waitsec, :storage_class, :encryption,
|
137
|
+
:src, :dest, :upload_id, :parts
|
138
|
+
|
139
|
+
def initialize(storage, connection, src, dest)
|
140
|
+
@connection = connection
|
141
|
+
@bucket = storage.bucket
|
142
|
+
@chunk_size = storage.chunk_size * 1024**2
|
143
|
+
@max_retries = storage.max_retries
|
144
|
+
@retry_waitsec = storage.retry_waitsec
|
145
|
+
@encryption = storage.encryption
|
146
|
+
@storage_class = storage.storage_class
|
147
|
+
@src = src
|
148
|
+
@dest = dest
|
149
|
+
@parts = []
|
125
150
|
end
|
126
151
|
|
127
152
|
def run
|
@@ -140,16 +165,17 @@ module Backup
|
|
140
165
|
|
141
166
|
def upload
|
142
167
|
md5 = Base64.encode64(Digest::MD5.file(src).digest).chomp
|
168
|
+
options = headers.merge('Content-MD5' => md5)
|
143
169
|
with_retries do
|
144
170
|
File.open(src, 'r') do |file|
|
145
|
-
connection.put_object(bucket, dest, file,
|
171
|
+
connection.put_object(bucket, dest, file, options)
|
146
172
|
end
|
147
173
|
end
|
148
174
|
end
|
149
175
|
|
150
176
|
def initiate_multipart
|
151
177
|
with_retries do
|
152
|
-
resp = connection.initiate_multipart_upload(bucket, dest)
|
178
|
+
resp = connection.initiate_multipart_upload(bucket, dest, headers)
|
153
179
|
@upload_id = resp.body['UploadId']
|
154
180
|
end
|
155
181
|
end
|
@@ -171,6 +197,22 @@ module Backup
|
|
171
197
|
end
|
172
198
|
end
|
173
199
|
|
200
|
+
def headers
|
201
|
+
headers = {}
|
202
|
+
|
203
|
+
val = encryption.to_s.upcase
|
204
|
+
headers.merge!(
|
205
|
+
{ 'x-amz-server-side-encryption' => val }
|
206
|
+
) unless val.empty?
|
207
|
+
|
208
|
+
val = storage_class.to_s.upcase
|
209
|
+
headers.merge!(
|
210
|
+
{ 'x-amz-storage-class' => val }
|
211
|
+
) unless val.empty? || val == 'STANDARD'
|
212
|
+
|
213
|
+
headers
|
214
|
+
end
|
215
|
+
|
174
216
|
def complete_multipart
|
175
217
|
with_retries do
|
176
218
|
connection.complete_multipart_upload(bucket, dest, upload_id, parts)
|
data/lib/backup/storage/scp.rb
CHANGED
data/lib/backup/storage/sftp.rb
CHANGED
@@ -3,8 +3,10 @@
|
|
3
3
|
##
|
4
4
|
# Only load the Fog gem, along with the Parallel gem, when the
|
5
5
|
# Backup::Syncer::Cloud class is loaded
|
6
|
-
Backup::Dependency.load('fog')
|
7
|
-
Backup::Dependency.load('parallel')
|
6
|
+
# Backup::Dependency.load('fog')
|
7
|
+
# Backup::Dependency.load('parallel')
|
8
|
+
require 'fog'
|
9
|
+
require 'parallel'
|
8
10
|
|
9
11
|
module Backup
|
10
12
|
module Syncer
|
data/lib/backup/utilities.rb
CHANGED
@@ -6,7 +6,7 @@ module Backup
|
|
6
6
|
NAMES = %w{
|
7
7
|
tar cat split find xargs sudo chown
|
8
8
|
gzip bzip2 lzma pbzip2
|
9
|
-
mongo mongodump mysqldump pg_dump redis-cli riak-admin
|
9
|
+
mongo mongodump mysqldump pg_dump pg_dumpall redis-cli riak-admin
|
10
10
|
gpg openssl
|
11
11
|
rsync ssh
|
12
12
|
}
|
@@ -77,6 +77,7 @@ module Backup
|
|
77
77
|
# mongodump '/path/to/mongodump'
|
78
78
|
# mysqldump '/path/to/mysqldump'
|
79
79
|
# pg_dump '/path/to/pg_dump'
|
80
|
+
# pg_dumpall '/path/to/pg_dumpall'
|
80
81
|
# redis_cli '/path/to/redis-cli'
|
81
82
|
# riak_admin '/path/to/riak-admin'
|
82
83
|
#
|
data/lib/backup/version.rb
CHANGED
@@ -1,43 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
module Backup
|
4
|
-
|
5
|
-
|
6
|
-
##
|
7
|
-
# Change the MAJOR, MINOR and PATCH constants below
|
8
|
-
# to adjust the version of the Backup gem
|
9
|
-
#
|
10
|
-
# MAJOR:
|
11
|
-
# Defines the major version
|
12
|
-
# MINOR:
|
13
|
-
# Defines the minor version
|
14
|
-
# PATCH:
|
15
|
-
# Defines the patch version
|
16
|
-
MAJOR, MINOR, PATCH = 3, 4, 0
|
17
|
-
|
18
|
-
##
|
19
|
-
# Returns the major version ( big release based off of multiple minor releases )
|
20
|
-
def self.major
|
21
|
-
MAJOR
|
22
|
-
end
|
23
|
-
|
24
|
-
##
|
25
|
-
# Returns the minor version ( small release based off of multiple patches )
|
26
|
-
def self.minor
|
27
|
-
MINOR
|
28
|
-
end
|
29
|
-
|
30
|
-
##
|
31
|
-
# Returns the patch version ( updates, features and (crucial) bug fixes )
|
32
|
-
def self.patch
|
33
|
-
PATCH
|
34
|
-
end
|
35
|
-
|
36
|
-
##
|
37
|
-
# Returns the current version of the Backup gem ( qualified for the gemspec )
|
38
|
-
def self.current
|
39
|
-
"#{major}.#{minor}.#{patch}"
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
4
|
+
VERSION = '3.5.0'
|
43
5
|
end
|
@@ -2,12 +2,14 @@
|
|
2
2
|
# PostgreSQL [Database]
|
3
3
|
#
|
4
4
|
database PostgreSQL do |db|
|
5
|
+
# To dump all databases, set `db.name = :all` (or leave blank)
|
5
6
|
db.name = "my_database_name"
|
6
7
|
db.username = "my_username"
|
7
8
|
db.password = "my_password"
|
8
9
|
db.host = "localhost"
|
9
10
|
db.port = 5432
|
10
11
|
db.socket = "/tmp/pg.sock"
|
12
|
+
# When dumping all databases, `skip_tables` and `only_tables` are ignored.
|
11
13
|
db.skip_tables = ["skip", "these", "tables"]
|
12
14
|
db.only_tables = ["only", "these", "tables"]
|
13
15
|
db.additional_options = ["-xc", "-E=utf8"]
|
@@ -1,2 +1,2 @@
|
|
1
|
-
Backup
|
2
|
-
Ruby
|
1
|
+
Backup v<%= Backup::VERSION %>
|
2
|
+
Ruby: <%= RUBY_DESCRIPTION %>
|
metadata
CHANGED
@@ -1,49 +1,407 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: backup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael van Rooijen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: builder
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.2.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.2.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: dropbox-sdk
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.5.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.5.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: excon
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.20.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.20.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: faraday
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.8.7
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.8.7
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: fog
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.10.1
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.10.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: formatador
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.2.4
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.2.4
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: hipchat
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.8.0
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.8.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: httparty
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.11.0
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.11.0
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: i18n
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.6.4
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 0.6.4
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: json
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - '='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 1.7.7
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - '='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 1.7.7
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: mail
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - '='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 2.5.3
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - '='
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 2.5.3
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: mime-types
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - '='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '1.23'
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - '='
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '1.23'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: multi_json
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - '='
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 1.7.2
|
188
|
+
type: :runtime
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - '='
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: 1.7.2
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: multi_xml
|
15
197
|
requirement: !ruby/object:Gem::Requirement
|
16
198
|
requirements:
|
17
|
-
- - '
|
199
|
+
- - '='
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: 0.5.3
|
202
|
+
type: :runtime
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - '='
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: 0.5.3
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: multipart-post
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - '='
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: 1.2.0
|
216
|
+
type: :runtime
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - '='
|
18
221
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
20
|
-
|
222
|
+
version: 1.2.0
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
name: net-scp
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - '='
|
21
228
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
229
|
+
version: 1.1.0
|
23
230
|
type: :runtime
|
24
231
|
prerelease: false
|
25
232
|
version_requirements: !ruby/object:Gem::Requirement
|
26
233
|
requirements:
|
27
|
-
- - '
|
234
|
+
- - '='
|
28
235
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
30
|
-
|
236
|
+
version: 1.1.0
|
237
|
+
- !ruby/object:Gem::Dependency
|
238
|
+
name: net-sftp
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - '='
|
31
242
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
243
|
+
version: 2.1.1
|
244
|
+
type: :runtime
|
245
|
+
prerelease: false
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - '='
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: 2.1.1
|
251
|
+
- !ruby/object:Gem::Dependency
|
252
|
+
name: net-ssh
|
253
|
+
requirement: !ruby/object:Gem::Requirement
|
254
|
+
requirements:
|
255
|
+
- - '='
|
256
|
+
- !ruby/object:Gem::Version
|
257
|
+
version: 2.6.7
|
258
|
+
type: :runtime
|
259
|
+
prerelease: false
|
260
|
+
version_requirements: !ruby/object:Gem::Requirement
|
261
|
+
requirements:
|
262
|
+
- - '='
|
263
|
+
- !ruby/object:Gem::Version
|
264
|
+
version: 2.6.7
|
265
|
+
- !ruby/object:Gem::Dependency
|
266
|
+
name: nokogiri
|
267
|
+
requirement: !ruby/object:Gem::Requirement
|
268
|
+
requirements:
|
269
|
+
- - '='
|
270
|
+
- !ruby/object:Gem::Version
|
271
|
+
version: 1.5.9
|
272
|
+
type: :runtime
|
273
|
+
prerelease: false
|
274
|
+
version_requirements: !ruby/object:Gem::Requirement
|
275
|
+
requirements:
|
276
|
+
- - '='
|
277
|
+
- !ruby/object:Gem::Version
|
278
|
+
version: 1.5.9
|
33
279
|
- !ruby/object:Gem::Dependency
|
34
280
|
name: open4
|
35
281
|
requirement: !ruby/object:Gem::Requirement
|
36
282
|
requirements:
|
37
|
-
- -
|
283
|
+
- - '='
|
38
284
|
- !ruby/object:Gem::Version
|
39
285
|
version: 1.3.0
|
40
286
|
type: :runtime
|
41
287
|
prerelease: false
|
42
288
|
version_requirements: !ruby/object:Gem::Requirement
|
43
289
|
requirements:
|
44
|
-
- -
|
290
|
+
- - '='
|
45
291
|
- !ruby/object:Gem::Version
|
46
292
|
version: 1.3.0
|
293
|
+
- !ruby/object:Gem::Dependency
|
294
|
+
name: parallel
|
295
|
+
requirement: !ruby/object:Gem::Requirement
|
296
|
+
requirements:
|
297
|
+
- - '='
|
298
|
+
- !ruby/object:Gem::Version
|
299
|
+
version: 0.6.4
|
300
|
+
type: :runtime
|
301
|
+
prerelease: false
|
302
|
+
version_requirements: !ruby/object:Gem::Requirement
|
303
|
+
requirements:
|
304
|
+
- - '='
|
305
|
+
- !ruby/object:Gem::Version
|
306
|
+
version: 0.6.4
|
307
|
+
- !ruby/object:Gem::Dependency
|
308
|
+
name: polyglot
|
309
|
+
requirement: !ruby/object:Gem::Requirement
|
310
|
+
requirements:
|
311
|
+
- - '='
|
312
|
+
- !ruby/object:Gem::Version
|
313
|
+
version: 0.3.3
|
314
|
+
type: :runtime
|
315
|
+
prerelease: false
|
316
|
+
version_requirements: !ruby/object:Gem::Requirement
|
317
|
+
requirements:
|
318
|
+
- - '='
|
319
|
+
- !ruby/object:Gem::Version
|
320
|
+
version: 0.3.3
|
321
|
+
- !ruby/object:Gem::Dependency
|
322
|
+
name: prowler
|
323
|
+
requirement: !ruby/object:Gem::Requirement
|
324
|
+
requirements:
|
325
|
+
- - '='
|
326
|
+
- !ruby/object:Gem::Version
|
327
|
+
version: 1.3.1
|
328
|
+
type: :runtime
|
329
|
+
prerelease: false
|
330
|
+
version_requirements: !ruby/object:Gem::Requirement
|
331
|
+
requirements:
|
332
|
+
- - '='
|
333
|
+
- !ruby/object:Gem::Version
|
334
|
+
version: 1.3.1
|
335
|
+
- !ruby/object:Gem::Dependency
|
336
|
+
name: ruby-hmac
|
337
|
+
requirement: !ruby/object:Gem::Requirement
|
338
|
+
requirements:
|
339
|
+
- - '='
|
340
|
+
- !ruby/object:Gem::Version
|
341
|
+
version: 0.4.0
|
342
|
+
type: :runtime
|
343
|
+
prerelease: false
|
344
|
+
version_requirements: !ruby/object:Gem::Requirement
|
345
|
+
requirements:
|
346
|
+
- - '='
|
347
|
+
- !ruby/object:Gem::Version
|
348
|
+
version: 0.4.0
|
349
|
+
- !ruby/object:Gem::Dependency
|
350
|
+
name: simple_oauth
|
351
|
+
requirement: !ruby/object:Gem::Requirement
|
352
|
+
requirements:
|
353
|
+
- - '='
|
354
|
+
- !ruby/object:Gem::Version
|
355
|
+
version: 0.2.0
|
356
|
+
type: :runtime
|
357
|
+
prerelease: false
|
358
|
+
version_requirements: !ruby/object:Gem::Requirement
|
359
|
+
requirements:
|
360
|
+
- - '='
|
361
|
+
- !ruby/object:Gem::Version
|
362
|
+
version: 0.2.0
|
363
|
+
- !ruby/object:Gem::Dependency
|
364
|
+
name: thor
|
365
|
+
requirement: !ruby/object:Gem::Requirement
|
366
|
+
requirements:
|
367
|
+
- - '='
|
368
|
+
- !ruby/object:Gem::Version
|
369
|
+
version: 0.18.1
|
370
|
+
type: :runtime
|
371
|
+
prerelease: false
|
372
|
+
version_requirements: !ruby/object:Gem::Requirement
|
373
|
+
requirements:
|
374
|
+
- - '='
|
375
|
+
- !ruby/object:Gem::Version
|
376
|
+
version: 0.18.1
|
377
|
+
- !ruby/object:Gem::Dependency
|
378
|
+
name: treetop
|
379
|
+
requirement: !ruby/object:Gem::Requirement
|
380
|
+
requirements:
|
381
|
+
- - '='
|
382
|
+
- !ruby/object:Gem::Version
|
383
|
+
version: 1.4.12
|
384
|
+
type: :runtime
|
385
|
+
prerelease: false
|
386
|
+
version_requirements: !ruby/object:Gem::Requirement
|
387
|
+
requirements:
|
388
|
+
- - '='
|
389
|
+
- !ruby/object:Gem::Version
|
390
|
+
version: 1.4.12
|
391
|
+
- !ruby/object:Gem::Dependency
|
392
|
+
name: twitter
|
393
|
+
requirement: !ruby/object:Gem::Requirement
|
394
|
+
requirements:
|
395
|
+
- - '='
|
396
|
+
- !ruby/object:Gem::Version
|
397
|
+
version: 4.6.2
|
398
|
+
type: :runtime
|
399
|
+
prerelease: false
|
400
|
+
version_requirements: !ruby/object:Gem::Requirement
|
401
|
+
requirements:
|
402
|
+
- - '='
|
403
|
+
- !ruby/object:Gem::Version
|
404
|
+
version: 4.6.2
|
47
405
|
description: Backup is a RubyGem, written for UNIX-like operating systems, that allows
|
48
406
|
you to easily perform backup operations on both your remote and local environments.
|
49
407
|
It provides you with an elegant DSL in Ruby for modeling your backups. Backup has
|
@@ -78,7 +436,6 @@ files:
|
|
78
436
|
- lib/backup/database/postgresql.rb
|
79
437
|
- lib/backup/database/redis.rb
|
80
438
|
- lib/backup/database/riak.rb
|
81
|
-
- lib/backup/dependency.rb
|
82
439
|
- lib/backup/encryptor/base.rb
|
83
440
|
- lib/backup/encryptor/gpg.rb
|
84
441
|
- lib/backup/encryptor/open_ssl.rb
|
data/lib/backup/dependency.rb
DELETED
@@ -1,165 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Backup
|
4
|
-
##
|
5
|
-
# A little self-contained gem manager for Backup.
|
6
|
-
# Rather than specifying hard dependencies in the gemspec, forcing users to
|
7
|
-
# install gems they do not want/need, Backup will notify them when a gem has
|
8
|
-
# not been installed, or version is incorrect, and provide the command to
|
9
|
-
# install the gem. These dependencies are dynamically loaded in the Gemfile.
|
10
|
-
class Dependency
|
11
|
-
DEPENDENCIES = {
|
12
|
-
'fog' => {
|
13
|
-
:require => 'fog',
|
14
|
-
:version => '~> 1.9.0',
|
15
|
-
:for => 'Amazon S3, Rackspace Cloud Files (S3, CloudFiles Storages)',
|
16
|
-
:dependencies => ['net-ssh', 'net-scp', 'excon']
|
17
|
-
},
|
18
|
-
|
19
|
-
'excon' => {
|
20
|
-
:require => 'excon',
|
21
|
-
:version => '~> 0.17.0',
|
22
|
-
:for => 'HTTP Connection Support for Storages/Syncers'
|
23
|
-
},
|
24
|
-
|
25
|
-
'dropbox-sdk' => {
|
26
|
-
:require => 'dropbox_sdk',
|
27
|
-
:version => '= 1.5.1', # patched in lib/backup/storage/dropbox.rb
|
28
|
-
:for => 'Dropbox Web Service (Dropbox Storage)'
|
29
|
-
},
|
30
|
-
|
31
|
-
'net-sftp' => {
|
32
|
-
:require => 'net/sftp',
|
33
|
-
:version => ['>= 2.0.0', '<= 2.0.5'],
|
34
|
-
:for => 'SFTP Protocol (SFTP Storage)',
|
35
|
-
:dependencies => 'net-ssh'
|
36
|
-
},
|
37
|
-
|
38
|
-
'net-scp' => {
|
39
|
-
:require => 'net/scp',
|
40
|
-
:version => ['>= 1.0.0', '<= 1.0.4'],
|
41
|
-
:for => 'SCP Protocol (SCP Storage)',
|
42
|
-
:dependencies => 'net-ssh'
|
43
|
-
},
|
44
|
-
|
45
|
-
'net-ssh' => {
|
46
|
-
:require => 'net/ssh',
|
47
|
-
:version => ['>= 2.3.0', '<= 2.5.2'],
|
48
|
-
:for => 'SSH Protocol (SSH Storage)'
|
49
|
-
},
|
50
|
-
|
51
|
-
'mail' => {
|
52
|
-
:require => 'mail',
|
53
|
-
:version => '~> 2.5.0',
|
54
|
-
:for => 'Sending Emails (Mail Notifier)'
|
55
|
-
},
|
56
|
-
|
57
|
-
'twitter' => {
|
58
|
-
:require => 'twitter',
|
59
|
-
:version => '~> 4.5.0',
|
60
|
-
:for => 'Sending Twitter Updates (Twitter Notifier)'
|
61
|
-
},
|
62
|
-
|
63
|
-
'httparty' => {
|
64
|
-
:require => 'httparty',
|
65
|
-
:version => '~> 0.10.2',
|
66
|
-
:for => 'Sending Http Updates (Campfire Notifier)'
|
67
|
-
},
|
68
|
-
|
69
|
-
'prowler' => {
|
70
|
-
:require => 'prowler',
|
71
|
-
:version => '~> 1.3.1',
|
72
|
-
:for => 'Sending iOS push notifications (Prowl Notifier)'
|
73
|
-
},
|
74
|
-
|
75
|
-
'hipchat' => {
|
76
|
-
:require => 'hipchat',
|
77
|
-
:version => '~> 0.7.0',
|
78
|
-
:for => 'Sending notifications to Hipchat'
|
79
|
-
},
|
80
|
-
|
81
|
-
'parallel' => {
|
82
|
-
:require => 'parallel',
|
83
|
-
:version => '~> 0.6.0',
|
84
|
-
:for => 'Adding concurrency to Cloud-based syncers.'
|
85
|
-
}
|
86
|
-
}
|
87
|
-
|
88
|
-
class << self
|
89
|
-
def all
|
90
|
-
@all ||= []
|
91
|
-
end
|
92
|
-
|
93
|
-
def find(name)
|
94
|
-
all.select {|dep| dep.name == name }.first
|
95
|
-
end
|
96
|
-
|
97
|
-
def load(name)
|
98
|
-
find(name).load!
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
attr_reader :name, :require_as, :used_for, :requirements
|
103
|
-
|
104
|
-
def initialize(name, options = {})
|
105
|
-
@name = name
|
106
|
-
@require_as = options[:require]
|
107
|
-
@requirements = Array(options[:version])
|
108
|
-
@dependencies = Array(options[:dependencies])
|
109
|
-
@used_for = options[:for]
|
110
|
-
end
|
111
|
-
|
112
|
-
# dependencies should be defined in the order
|
113
|
-
# they should be installed or loaded.
|
114
|
-
def dependencies
|
115
|
-
@dependencies.map {|name| self.class.find(name) }
|
116
|
-
end
|
117
|
-
|
118
|
-
def load!
|
119
|
-
dependencies.each(&:load!)
|
120
|
-
|
121
|
-
gem(name, *requirements)
|
122
|
-
require require_as
|
123
|
-
rescue LoadError
|
124
|
-
raise Errors::Dependency::LoadError, <<-EOS
|
125
|
-
Dependency Missing
|
126
|
-
Gem Name: #{ name }
|
127
|
-
Used for: #{ used_for }
|
128
|
-
|
129
|
-
To install the gem, issue the following command:
|
130
|
-
> backup dependencies --install #{ name }
|
131
|
-
Please try again after installing the missing dependency.
|
132
|
-
EOS
|
133
|
-
end
|
134
|
-
|
135
|
-
def installed?
|
136
|
-
Gem::Specification.find_by_name(name, *requirements)
|
137
|
-
true
|
138
|
-
rescue LoadError
|
139
|
-
false
|
140
|
-
end
|
141
|
-
|
142
|
-
# If multiple version requirements are defined, this tries to find the
|
143
|
-
# version that matches them all. Otherwise, it will fallback to installing
|
144
|
-
# based on the last requirement. This should only be called from the CLI
|
145
|
-
# for `backup dependencies --install <name>`.
|
146
|
-
def install!
|
147
|
-
version = nil
|
148
|
-
if requirements.count > 1
|
149
|
-
begin
|
150
|
-
require 'rubygems/dependency_installer'
|
151
|
-
inst = Gem::DependencyInstaller.new
|
152
|
-
spec, _ = inst.find_spec_by_name_and_version(name, *requirements).first
|
153
|
-
version = spec.version
|
154
|
-
rescue
|
155
|
-
end
|
156
|
-
end
|
157
|
-
version ||= requirements.last
|
158
|
-
command = "gem install --no-ri --no-rdoc #{ name } -v '#{ version }'"
|
159
|
-
puts "\nLaunching `#{ command }`"
|
160
|
-
exec command
|
161
|
-
end
|
162
|
-
|
163
|
-
DEPENDENCIES.each {|name, options| all << new(name, options) }
|
164
|
-
end
|
165
|
-
end
|