s3streambackup 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source "http://rubygems.org"
2
+ ruby "1.9.3"
3
+
4
+ gem "cli", "~> 1.3"
5
+ gem "aws-sdk", "~> 1.10"
6
+
7
+ # Add dependencies to develop your gem here.
8
+ # Include everything needed to run rake, tests, features, etc.
9
+ group :development do
10
+ gem "rspec", "~> 2.8"
11
+ gem "rdoc", "~> 3.12"
12
+ gem "cucumber", ">= 0"
13
+ gem "bundler", "~> 1.0"
14
+ gem "jeweler", "~> 1.8"
15
+ gem "simplecov-rcov", ">= 0"
16
+ end
17
+
data/Gemfile.lock ADDED
@@ -0,0 +1,88 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ addressable (2.3.5)
5
+ aws-sdk (1.10.0)
6
+ json (~> 1.4)
7
+ nokogiri (>= 1.4.4)
8
+ uuidtools (~> 2.1)
9
+ builder (3.2.2)
10
+ cli (1.3.1)
11
+ cucumber (1.3.5)
12
+ builder (>= 2.1.2)
13
+ diff-lcs (>= 1.1.3)
14
+ gherkin (~> 2.12.0)
15
+ multi_json (~> 1.7.5)
16
+ multi_test (>= 0.0.2)
17
+ diff-lcs (1.2.4)
18
+ faraday (0.8.8)
19
+ multipart-post (~> 1.2.0)
20
+ gherkin (2.12.0)
21
+ multi_json (~> 1.3)
22
+ git (1.2.5)
23
+ github_api (0.10.1)
24
+ addressable
25
+ faraday (~> 0.8.1)
26
+ hashie (>= 1.2)
27
+ multi_json (~> 1.4)
28
+ nokogiri (~> 1.5.2)
29
+ oauth2
30
+ hashie (2.0.5)
31
+ highline (1.6.19)
32
+ httpauth (0.2.0)
33
+ jeweler (1.8.6)
34
+ builder
35
+ bundler (~> 1.0)
36
+ git (>= 1.2.5)
37
+ github_api (= 0.10.1)
38
+ highline (>= 1.6.15)
39
+ nokogiri (= 1.5.10)
40
+ rake
41
+ rdoc
42
+ json (1.8.0)
43
+ jwt (0.1.8)
44
+ multi_json (>= 1.5)
45
+ multi_json (1.7.8)
46
+ multi_test (0.0.2)
47
+ multi_xml (0.5.4)
48
+ multipart-post (1.2.0)
49
+ nokogiri (1.5.10)
50
+ oauth2 (0.9.2)
51
+ faraday (~> 0.8)
52
+ httpauth (~> 0.2)
53
+ jwt (~> 0.1.4)
54
+ multi_json (~> 1.0)
55
+ multi_xml (~> 0.5)
56
+ rack (~> 1.2)
57
+ rack (1.5.2)
58
+ rake (10.1.0)
59
+ rdoc (3.12.2)
60
+ json (~> 1.4)
61
+ rspec (2.14.1)
62
+ rspec-core (~> 2.14.0)
63
+ rspec-expectations (~> 2.14.0)
64
+ rspec-mocks (~> 2.14.0)
65
+ rspec-core (2.14.4)
66
+ rspec-expectations (2.14.0)
67
+ diff-lcs (>= 1.1.3, < 2.0)
68
+ rspec-mocks (2.14.2)
69
+ simplecov (0.7.1)
70
+ multi_json (~> 1.0)
71
+ simplecov-html (~> 0.7.1)
72
+ simplecov-html (0.7.1)
73
+ simplecov-rcov (0.2.3)
74
+ simplecov (>= 0.4.1)
75
+ uuidtools (2.1.4)
76
+
77
+ PLATFORMS
78
+ ruby
79
+
80
+ DEPENDENCIES
81
+ aws-sdk (~> 1.10)
82
+ bundler (~> 1.0)
83
+ cli (~> 1.3)
84
+ cucumber
85
+ jeweler (~> 1.8)
86
+ rdoc (~> 3.12)
87
+ rspec (~> 2.8)
88
+ simplecov-rcov
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Jakub Pastuszek
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # S3 Stream Backup
2
+
3
+ Stores data from STDIN in S3 object using multipart upload and removes oldest backups to keep maximum desired backup object count.
4
+
5
+ ## Installing
6
+
7
+ You will need the following system packages installed: `gcc`, `make` and `libxslt-devel`.
8
+
9
+ Then you can install the gem as usual:
10
+
11
+ ```bash
12
+ gem install s3streambackup
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ```bash
18
+ s3streambackup mybucket some-backup < some-backup.file
19
+ ```
20
+
21
+ Note that you should have your S3 key and secret set in environment `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` or you can specify them in command line with `--key` and `--secret`.
22
+
23
+ You can store your backup object within prefix by using `--prefix` option e.g.: `--prefix backups/server1/`.
24
+
25
+ By default two backup copies will be kept. You can change this number by using `--keep` options.
26
+
27
+ For other usage information use `--help`.
28
+
29
+ ### PostgreSQL backup example
30
+
31
+ ```bash
32
+ /bin/su - postgres -c '/usr/bin/pg_dumpall' | xz -2 | s3streambackup --keep 7 --prefix backups/zabbix/ mybucket postgress-all
33
+ ```
34
+
35
+ ## Contributing to S3 Stream Backup
36
+
37
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
38
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
39
+ * Fork the project
40
+ * Start a feature/bugfix branch
41
+ * Commit and push until you are happy with your contribution
42
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
43
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
44
+
45
+ ## Copyright
46
+
47
+ Copyright (c) 2013 Jakub Pastuszek. See LICENSE.txt for
48
+ further details.
49
+
data/Rakefile ADDED
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "s3streambackup"
18
+ gem.homepage = "http://github.com/jpastuszek/s3streambackup"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{streaming backup of STDIN to S3 object}
21
+ gem.description = %Q{Stores data from STDIN in S3 object using multipart upload and removes oldest backups to keep maximum desired backup object count.}
22
+ gem.email = "jpastuszek@gmail.com"
23
+ gem.authors = ["Jakub Pastuszek"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rspec/core'
29
+ require 'rspec/core/rake_task'
30
+ RSpec::Core::RakeTask.new(:spec) do |spec|
31
+ spec.pattern = FileList['spec/**/*_spec.rb']
32
+ end
33
+
34
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
35
+ spec.pattern = 'spec/**/*_spec.rb'
36
+ spec.rcov = true
37
+ end
38
+
39
+ require 'cucumber/rake/task'
40
+ Cucumber::Rake::Task.new(:features)
41
+
42
+ task :default => :spec
43
+
44
+ require 'rdoc/task'
45
+ Rake::RDocTask.new do |rdoc|
46
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
47
+
48
+ rdoc.rdoc_dir = 'rdoc'
49
+ rdoc.title = "s3streambackup #{version}"
50
+ rdoc.rdoc_files.include('README*')
51
+ rdoc.rdoc_files.include('lib/**/*.rb')
52
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'cli'
4
+ require 'aws-sdk'
5
+ require 'logger'
6
+
7
+ ## HACK: Auto select region based on location_constraint
8
+ module AWS
9
+ class S3
10
+ class BucketCollection
11
+ def [](name)
12
+ # if name is DNS compatible we still cannot use it for writes if it does contain dots
13
+ return S3::Bucket.new(name.to_s, :owner => nil, :config => config) if client.dns_compatible_bucket_name?(name) and not name.include? '.'
14
+
15
+ # save region mapping for bucket for futher requests
16
+ @@location_cache = {} unless defined? @@location_cache
17
+ # if we have it cased use it; else try to fetch it and if it is nil bucket is in standard region
18
+ region = @@location_cache[name] || @@location_cache[name] = S3::Bucket.new(name.to_s, :owner => nil, :config => config).location_constraint || @@location_cache[name] = :standard
19
+
20
+ # no need to specify region if bucket is in standard region
21
+ return S3::Bucket.new(name.to_s, :owner => nil, :config => config) if region == :standard
22
+
23
+ # use same config but with region specified for buckets that are not DNS compatible or have dots and are not in standard region
24
+ S3::Bucket.new(name.to_s, :owner => nil, :config => config.with(region: region))
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ settings = CLI.new do
31
+ stdin :data
32
+ option :key,
33
+ short: :k,
34
+ description: 'S3 key',
35
+ default: ENV['AWS_ACCESS_KEY_ID']
36
+ option :secret,
37
+ short: :s,
38
+ description: 'S3 key secret',
39
+ default_label: '<secret>',
40
+ default: ENV['AWS_SECRET_ACCESS_KEY']
41
+ option :prefix,
42
+ short: :p,
43
+ description: 'prefix under which the objects will be kept',
44
+ default: ''
45
+ option :keep,
46
+ short: :K,
47
+ description: 'how many backup file to keep',
48
+ cast: Integer,
49
+ default: 2
50
+ option :log_file,
51
+ short: :l,
52
+ description: 'location of log file'
53
+ switch :plain,
54
+ description: 'use plain connections instead of SSL to S3'
55
+ switch :debug,
56
+ description: 'log debug messages'
57
+ argument :bucket,
58
+ description: 'name of bucket to upload data to'
59
+ argument :name,
60
+ description: 'name under which the object will be stored'
61
+ end.parse! do |settings|
62
+ fail 'AWS_ACCESS_KEY_ID environment not set and --key not used' unless settings.key
63
+ fail 'AWS_SECRET_ACCESS_KEY environment not set and --secret not used' unless settings.secret
64
+ end
65
+
66
+ log = Logger.new(settings.log_file ? settings.log_file : STDOUT)
67
+ log.formatter = proc do |severity, datetime, progname, msg|
68
+ "[#{datetime.utc.strftime "%Y-%m-%d %H:%M:%S.%6N %Z"}] [#{$$}] #{severity}: #{msg.strip}\n"
69
+ end
70
+
71
+ log.level = Logger::INFO
72
+ log.level = Logger::DEBUG if settings.debug
73
+
74
+ begin
75
+ s3 = AWS::S3.new(
76
+ access_key_id: settings.key,
77
+ secret_access_key: settings.secret,
78
+ logger: log,
79
+ log_level: :debug,
80
+ use_ssl: ! settings.plain
81
+ )
82
+
83
+ upload_date = Time.now.utc.strftime "%y%m%d_%H%M%S"
84
+ prefix = "#{settings.prefix}#{settings.name}.backup."
85
+ path = "#{prefix}#{upload_date}"
86
+
87
+ bucket = s3.buckets[settings.bucket]
88
+ backup = bucket.objects[path]
89
+ log.info "writting to: #{path}"
90
+
91
+ # make sure we use multipart upload
92
+ total_bytes = 0
93
+ backup.write(estimated_content_length: 10 * 1024 ** 3) do |buffer, bytes|
94
+ log.info "#{total_bytes} bytes written..."
95
+ data = settings.stdin.read(bytes)
96
+ total_bytes += data.bytesize
97
+ buffer.write data
98
+ end
99
+ log.info "total upload size: #{total_bytes}"
100
+
101
+ backups = bucket.objects.with_prefix(prefix).to_a
102
+
103
+ log.info "keeping maximum #{settings.keep} latest buckups of #{backups.length} storred"
104
+
105
+ if backups.length > settings.keep
106
+ backups.take(backups.length - settings.keep).each do |backup|
107
+ log.info "removing oldest backup: #{backup.key}"
108
+ backup.delete
109
+ end
110
+ end
111
+ rescue => error
112
+ msg = "#{error.class.name}: #{error.message}\n#{error.backtrace.join("\n")}"
113
+ log.error msg
114
+ STDERR.write msg
115
+ exit 10
116
+ end
117
+
@@ -0,0 +1,9 @@
1
+ Feature: something something
2
+ In order to something something
3
+ A user something something
4
+ something something something
5
+
6
+ Scenario: something something
7
+ Given inspiration
8
+ When I create a sweet new gem
9
+ Then everyone should see how awesome I am
File without changes
@@ -0,0 +1,13 @@
1
+ require 'bundler'
2
+ begin
3
+ Bundler.setup(:default, :development)
4
+ rescue Bundler::BundlerError => e
5
+ $stderr.puts e.message
6
+ $stderr.puts "Run `bundle install` to install missing gems"
7
+ exit e.status_code
8
+ end
9
+
10
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
11
+ require 's3streambackup'
12
+
13
+ require 'rspec/expectations'
@@ -0,0 +1,76 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "s3streambackup"
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jakub Pastuszek"]
12
+ s.date = "2013-08-05"
13
+ s.description = "Stores data from STDIN in S3 object using multipart upload and removes oldest backups to keep maximum desired backup object count."
14
+ s.email = "jpastuszek@gmail.com"
15
+ s.executables = ["s3streambackup"]
16
+ s.extra_rdoc_files = [
17
+ "LICENSE.txt",
18
+ "README.md"
19
+ ]
20
+ s.files = [
21
+ ".document",
22
+ ".rspec",
23
+ "Gemfile",
24
+ "Gemfile.lock",
25
+ "LICENSE.txt",
26
+ "README.md",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "bin/s3streambackup",
30
+ "features/s3streambackup.feature",
31
+ "features/step_definitions/s3streambackup_steps.rb",
32
+ "features/support/env.rb",
33
+ "s3streambackup.gemspec",
34
+ "spec/s3streambackup_spec.rb",
35
+ "spec/spec_helper.rb"
36
+ ]
37
+ s.homepage = "http://github.com/jpastuszek/s3streambackup"
38
+ s.licenses = ["MIT"]
39
+ s.require_paths = ["lib"]
40
+ s.rubygems_version = "1.8.25"
41
+ s.summary = "streaming backup of STDIN to S3 object"
42
+
43
+ if s.respond_to? :specification_version then
44
+ s.specification_version = 3
45
+
46
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
47
+ s.add_runtime_dependency(%q<cli>, ["~> 1.3"])
48
+ s.add_runtime_dependency(%q<aws-sdk>, ["~> 1.10"])
49
+ s.add_development_dependency(%q<rspec>, ["~> 2.8"])
50
+ s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
51
+ s.add_development_dependency(%q<cucumber>, [">= 0"])
52
+ s.add_development_dependency(%q<bundler>, ["~> 1.0"])
53
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8"])
54
+ s.add_development_dependency(%q<simplecov-rcov>, [">= 0"])
55
+ else
56
+ s.add_dependency(%q<cli>, ["~> 1.3"])
57
+ s.add_dependency(%q<aws-sdk>, ["~> 1.10"])
58
+ s.add_dependency(%q<rspec>, ["~> 2.8"])
59
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
60
+ s.add_dependency(%q<cucumber>, [">= 0"])
61
+ s.add_dependency(%q<bundler>, ["~> 1.0"])
62
+ s.add_dependency(%q<jeweler>, ["~> 1.8"])
63
+ s.add_dependency(%q<simplecov-rcov>, [">= 0"])
64
+ end
65
+ else
66
+ s.add_dependency(%q<cli>, ["~> 1.3"])
67
+ s.add_dependency(%q<aws-sdk>, ["~> 1.10"])
68
+ s.add_dependency(%q<rspec>, ["~> 2.8"])
69
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
70
+ s.add_dependency(%q<cucumber>, [">= 0"])
71
+ s.add_dependency(%q<bundler>, ["~> 1.0"])
72
+ s.add_dependency(%q<jeweler>, ["~> 1.8"])
73
+ s.add_dependency(%q<simplecov-rcov>, [">= 0"])
74
+ end
75
+ end
76
+
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "S3streambackup" do
4
+ it "fails" do
5
+ fail "hey buddy, you should probably rename this file and start specing for real"
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 's3streambackup'
5
+
6
+ # Requires supporting files with custom matchers and macros, etc,
7
+ # in ./support/ and its subdirectories.
8
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
+
10
+ RSpec.configure do |config|
11
+
12
+ end
metadata ADDED
@@ -0,0 +1,195 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: s3streambackup
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jakub Pastuszek
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-08-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: cli
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: aws-sdk
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.10'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1.10'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '2.8'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '2.8'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rdoc
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '3.12'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '3.12'
78
+ - !ruby/object:Gem::Dependency
79
+ name: cucumber
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: bundler
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: '1.0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: '1.0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: jeweler
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '1.8'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: '1.8'
126
+ - !ruby/object:Gem::Dependency
127
+ name: simplecov-rcov
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ description: Stores data from STDIN in S3 object using multipart upload and removes
143
+ oldest backups to keep maximum desired backup object count.
144
+ email: jpastuszek@gmail.com
145
+ executables:
146
+ - s3streambackup
147
+ extensions: []
148
+ extra_rdoc_files:
149
+ - LICENSE.txt
150
+ - README.md
151
+ files:
152
+ - .document
153
+ - .rspec
154
+ - Gemfile
155
+ - Gemfile.lock
156
+ - LICENSE.txt
157
+ - README.md
158
+ - Rakefile
159
+ - VERSION
160
+ - bin/s3streambackup
161
+ - features/s3streambackup.feature
162
+ - features/step_definitions/s3streambackup_steps.rb
163
+ - features/support/env.rb
164
+ - s3streambackup.gemspec
165
+ - spec/s3streambackup_spec.rb
166
+ - spec/spec_helper.rb
167
+ homepage: http://github.com/jpastuszek/s3streambackup
168
+ licenses:
169
+ - MIT
170
+ post_install_message:
171
+ rdoc_options: []
172
+ require_paths:
173
+ - lib
174
+ required_ruby_version: !ruby/object:Gem::Requirement
175
+ none: false
176
+ requirements:
177
+ - - ! '>='
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ segments:
181
+ - 0
182
+ hash: -1306132470382039118
183
+ required_rubygems_version: !ruby/object:Gem::Requirement
184
+ none: false
185
+ requirements:
186
+ - - ! '>='
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ requirements: []
190
+ rubyforge_project:
191
+ rubygems_version: 1.8.25
192
+ signing_key:
193
+ specification_version: 3
194
+ summary: streaming backup of STDIN to S3 object
195
+ test_files: []