robinsp-backitup 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Manifest ADDED
@@ -0,0 +1,14 @@
1
+ bin/backitup
2
+ spec/test-config.backitup
3
+ spec/file_packager_spec.rb
4
+ spec/config_spec.rb
5
+ spec/runner_spec.rb
6
+ spec/spec.opts
7
+ spec/spec_helper.rb
8
+ Rakefile
9
+ Manifest
10
+ lib/back_it_up.rb
11
+ lib/back_it_up/config.rb
12
+ lib/back_it_up/file_packager.rb
13
+ lib/back_it_up/command.rb
14
+ lib/back_it_up/runner.rb
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ require 'spec'
2
+ require 'spec/rake/spectask'
3
+ require 'echoe'
4
+
5
+ Echoe.new('backitup', '0.0.1') do |p|
6
+ p.description = "Simple backup"
7
+ p.url = "http://github.com/robinsp/backitup"
8
+ p.author = "Robin Spainhour"
9
+ p.email = "robin@robinspainhour.com"
10
+ p.ignore_pattern = ["tmp/*"]
11
+ p.dependencies = ["rubyzip"]
12
+ end
13
+
14
+ Spec::Rake::SpecTask.new do |t|
15
+ t.warning = true
16
+ end
data/backitup.gemspec ADDED
@@ -0,0 +1,36 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{backitup}
5
+ s.version = "0.0.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Robin Spainhour"]
9
+ s.date = %q{2009-05-27}
10
+ s.default_executable = %q{backitup}
11
+ s.description = %q{Simple backup}
12
+ s.email = %q{robin@robinspainhour.com}
13
+ s.executables = ["backitup"]
14
+ s.extra_rdoc_files = ["bin/backitup", "lib/back_it_up.rb", "lib/back_it_up/config.rb", "lib/back_it_up/file_packager.rb", "lib/back_it_up/command.rb", "lib/back_it_up/runner.rb"]
15
+ s.files = ["bin/backitup", "spec/test-config.backitup", "spec/file_packager_spec.rb", "spec/config_spec.rb", "spec/runner_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "Rakefile", "Manifest", "lib/back_it_up.rb", "lib/back_it_up/config.rb", "lib/back_it_up/file_packager.rb", "lib/back_it_up/command.rb", "lib/back_it_up/runner.rb", "backitup.gemspec"]
16
+ s.has_rdoc = true
17
+ s.homepage = %q{http://github.com/robinsp/backitup}
18
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Backitup"]
19
+ s.require_paths = ["lib"]
20
+ s.rubyforge_project = %q{backitup}
21
+ s.rubygems_version = %q{1.3.2}
22
+ s.summary = %q{Simple backup}
23
+
24
+ if s.respond_to? :specification_version then
25
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
26
+ s.specification_version = 3
27
+
28
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
29
+ s.add_runtime_dependency(%q<rubyzip>, [">= 0"])
30
+ else
31
+ s.add_dependency(%q<rubyzip>, [">= 0"])
32
+ end
33
+ else
34
+ s.add_dependency(%q<rubyzip>, [">= 0"])
35
+ end
36
+ end
data/bin/backitup ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'back_it_up/command'
@@ -0,0 +1,21 @@
1
+ require 'back_it_up'
2
+
3
+ module BackItUp
4
+ class Command
5
+ def self.run!(args=ARGV)
6
+ filename = args.shift
7
+ if filename == nil || filename == ""
8
+ usage
9
+ else
10
+ BackItUp::Runner.new(filename)
11
+ end
12
+
13
+ end
14
+
15
+ def self.usage
16
+ puts "Usage: backitup config-file"
17
+ end
18
+ end
19
+ end
20
+
21
+ BackItUp::Command.run!
@@ -0,0 +1,55 @@
1
+ module BackItUp
2
+ class Config
3
+ attr_reader :files, :dirs, :dest_filename
4
+
5
+ def initialize(file_handle)
6
+ @files = []
7
+ @dirs = []
8
+
9
+ file_content = ""
10
+
11
+ while l = file_handle.gets do
12
+ file_content << l
13
+ end
14
+
15
+ eval(file_content)
16
+ end
17
+
18
+ def backup
19
+ yield
20
+ end
21
+
22
+ # Full path and name of the package file to create.
23
+ # A timestamp will be appended to the filename and the extension is
24
+ # determined by the packager used.
25
+ #
26
+ # # Using the zip packager with a destination file setting:
27
+ # /var/backup/mybackup
28
+ #
29
+ # # ...then the final result might be:
30
+ # /var/backup/mybackup_200900527_053032.zip
31
+ def destination_file(filename)
32
+ raise "Invalid destination file." if File.directory?(filename)
33
+ @dest_filename = filename
34
+ end
35
+
36
+ def file(filename = nil)
37
+
38
+ unless (filename == "" || filename == nil)
39
+ if File.exists?(filename)
40
+ if File.directory? filename
41
+ @dirs << filename
42
+ else
43
+ @files << filename
44
+ end
45
+
46
+ else
47
+ puts "WARNING: File #{filename} could not be found"
48
+ end
49
+ end
50
+
51
+ end
52
+
53
+ alias_method :dir, :file
54
+ end
55
+ end
@@ -0,0 +1,38 @@
1
+ require 'rubygems'
2
+ require 'zip/zip'
3
+
4
+ module BackItUp
5
+ class FilePackager
6
+ INVALID_CONFIG_MSG = "Invalid config"
7
+ attr_reader :produced_file
8
+
9
+ def initialize(config)
10
+ raise INVALID_CONFIG_MSG if config == nil || !config.is_a?(Config)
11
+ @config = config
12
+ end
13
+
14
+ def package
15
+ target_filename = create_target_filename
16
+
17
+ prefix = File.basename(target_filename, ".zip")
18
+
19
+ Zip::ZipFile.open(target_filename, Zip::ZipFile::CREATE) do |zip|
20
+ @config.files.each do |filename|
21
+ zip.add("./#{prefix}#{filename}", filename)
22
+ end
23
+ end
24
+
25
+ @produced_file = target_filename
26
+ end
27
+
28
+ protected
29
+ def create_target_filename
30
+ @config.dest_filename + "_#{timestamp}" + ".zip"
31
+ end
32
+
33
+ private
34
+ def timestamp
35
+ Time.now.strftime("%Y%m%d_%H%M%S")
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,11 @@
1
+ module BackItUp
2
+ class Runner
3
+ def initialize(filename)
4
+ raise "Couldn't find file #{filename}" unless File.exists?(filename)
5
+
6
+ file = File.open(filename)
7
+ config = Config.new(file)
8
+ puts "Wrote backup to: #{ FilePackager.new(config).package }"
9
+ end
10
+ end
11
+ end
data/lib/back_it_up.rb ADDED
@@ -0,0 +1,3 @@
1
+ require 'back_it_up/runner'
2
+ require 'back_it_up/config'
3
+ require 'back_it_up/file_packager'
@@ -0,0 +1,104 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe BackItUp::Config do
4
+
5
+ it "should eval the file content" do
6
+ file = mock('mock-file')
7
+ file.expects(:gets).twice.returns("file 'string'", nil)
8
+
9
+ BackItUp::Config.any_instance.expects(:file).with("string")
10
+ BackItUp::Config.new(file)
11
+ end
12
+
13
+ it "should be able to handle our test config" do
14
+ test_file = File.dirname(__FILE__) + "/test-config.backitup"
15
+
16
+ BackItUp::Config.new(File.open(test_file))
17
+ end
18
+
19
+ describe "" do
20
+ before do
21
+ mock_file = mock('mock-file')
22
+ mock_file.stubs(:gets).returns(nil)
23
+ @config = BackItUp::Config.new(mock_file)
24
+ end
25
+
26
+ it "should have empty array of files by default" do
27
+ @config.files.should == []
28
+ end
29
+
30
+ it "should have empty array of dirs by default" do
31
+ @config.dirs.should == []
32
+ end
33
+
34
+ describe "destination_file()" do
35
+
36
+ it "should save the filename to dest_filename attribute" do
37
+ filename = File.expand_path(File.dirname(__FILE__) + "backup")
38
+ @config.destination_file(filename)
39
+ @config.dest_filename.should == filename
40
+ end
41
+
42
+ it "should fail if filename is an existing directory" do
43
+ filename = File.expand_path(File.dirname(__FILE__) )
44
+ lambda { @config.destination_file(filename) }.should raise_error("Invalid destination file.")
45
+ end
46
+ end
47
+
48
+ describe "backup()" do
49
+ it "should yield to block" do
50
+ test_value = false
51
+
52
+ @config.backup do
53
+ test_value = true
54
+ end
55
+
56
+ test_value.should be_true
57
+ end
58
+ end
59
+
60
+ describe "file()" do
61
+ before do
62
+ @valid_file = File.expand_path(File.dirname(__FILE__) + '/test-config.backitup')
63
+ end
64
+
65
+ it "should warn if file doesn't exist" do
66
+ file_name = "should-not-exist"
67
+ BackItUp::Config.any_instance.expects(:puts).with("WARNING: File should-not-exist could not be found")
68
+ @config.file(file_name)
69
+ end
70
+
71
+ it "should not add non-existning files to files attribute" do
72
+ file_name = "should-not-exist"
73
+ @config.file(file_name)
74
+ @config.files.should be_empty
75
+ end
76
+
77
+ it "should allow nil file name argument" do
78
+ @config.file
79
+ end
80
+
81
+ it "should check if file exists" do
82
+ File.expects(:exists?).with("filename").returns(false)
83
+ @config.file("filename")
84
+ end
85
+
86
+ it "should add the file to the files array" do
87
+ @config.file(@valid_file)
88
+ @config.files.pop.should == @valid_file
89
+ end
90
+
91
+ it "should check if file argument is directory" do
92
+ File.expects(:directory?).returns(false)
93
+ @config.file(@valid_file)
94
+ end
95
+
96
+ it "should add directories to dirs array" do
97
+ File.stubs(:directory?).returns(true)
98
+ @config.file(@valid_file)
99
+ @config.dirs.pop.should == @valid_file
100
+ end
101
+ end
102
+ end
103
+
104
+ end
@@ -0,0 +1,67 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe BackItUp::FilePackager do
4
+ describe "constructor" do
5
+ it "should fail if initialized with nil config" do
6
+ lambda { BackItUp::FilePackager.new(nil) }.should raise_error(BackItUp::FilePackager::INVALID_CONFIG_MSG )
7
+ end
8
+
9
+ it "should fail if initialized without config" do
10
+ lambda { BackItUp::FilePackager.new("a string") }.should raise_error(BackItUp::FilePackager::INVALID_CONFIG_MSG )
11
+ end
12
+ end
13
+
14
+ describe "package()" do
15
+ before do
16
+ @first_file_to_add = "/etc/passwd"
17
+ @second_file_to_add = "/etc/httpd/apache.cfg"
18
+
19
+ @configured_dst_filename = "/backups/a-file-name"
20
+ mock_config = mock
21
+ mock_config.stubs(:is_a? => true)
22
+ mock_config.stubs(:dest_filename).returns(@configured_dst_filename)
23
+ mock_config.stubs(:files).returns([@first_file_to_add, @second_file_to_add])
24
+
25
+ @mock_zip = mock("mock-zip")
26
+ @mock_zip.stubs(:add)
27
+ Zip::ZipFile.stubs(:open).yields(@mock_zip)
28
+
29
+ @packager = BackItUp::FilePackager.new(mock_config)
30
+
31
+ end
32
+
33
+ it "should use the destination_file setting from config" do
34
+ @packager.package.should =~ /^#{@configured_dst_filename}/
35
+ end
36
+
37
+ it "should append timestamp and zip suffix to destination file name from config" do
38
+ @packager.package.should =~ /^#{@configured_dst_filename}_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9].zip/
39
+ end
40
+
41
+ it "should return name of produced file" do
42
+ @packager.package.should_not be_nil
43
+ end
44
+
45
+ it "should set the produced_file attribute" do
46
+ @packager.package.should == @packager.produced_file
47
+ end
48
+
49
+ it "should create the file package" do
50
+ Zip::ZipFile.expects(:open).with() do |name, type|
51
+ (name =~ /^#{@configured_dst_filename}/ && type == Zip::ZipFile::CREATE)
52
+ end
53
+
54
+ @packager.package
55
+ end
56
+
57
+ it "should add files to the zip" do
58
+ prefix = "./#{File.basename(@configured_dst_filename)}"
59
+
60
+ @mock_zip.expects(:add).with( regexp_matches(/^#{prefix}.*#{@first_file_to_add}$/), @first_file_to_add )
61
+ @mock_zip.expects(:add).with( regexp_matches(/^#{prefix}.*#{@second_file_to_add}$/), @second_file_to_add )
62
+
63
+ @packager.package
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,51 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe BackItUp::Runner do
4
+
5
+ it "should require valid file name to initialize" do
6
+ name_of_invalid_file = "invalidfile.text"
7
+ lambda {BackItUp::Runner.new(name_of_invalid_file)}.should raise_error("Couldn't find file #{name_of_invalid_file}")
8
+ end
9
+
10
+ describe "with valid file" do
11
+ before do
12
+ @package_result_filename = "package_result_filename"
13
+
14
+ File.stubs(:exists?).returns(true)
15
+ @filename = "a-file-name"
16
+
17
+ @file = mock('fake file handle')
18
+ File.stubs(:open).with(@filename).returns(@file)
19
+
20
+ @mock_config = mock('mock-config')
21
+ BackItUp::Config.stubs(:new).returns(@mock_config)
22
+
23
+ @mock_packager
24
+ @mock_packager.stubs(:package).returns(@package_result_filename)
25
+ BackItUp::FilePackager.stubs(:new).returns(@mock_packager)
26
+
27
+
28
+ end
29
+ it "should create Config with file handle" do
30
+ BackItUp::Config.expects(:new).with( @file ).returns(@mock_config)
31
+ BackItUp::Runner.new(@filename)
32
+ end
33
+
34
+ it "should create Packager with Config" do
35
+ BackItUp::FilePackager.expects(:new).with(@mock_config)
36
+ BackItUp::Runner.new(@filename)
37
+ end
38
+
39
+ it "should start packaging" do
40
+ @mock_packager.expects(:package)
41
+ BackItUp::Runner.new(@filename)
42
+ end
43
+
44
+ it "should print name of packaged file" do
45
+ BackItUp::Runner.any_instance.expects(:puts).with {|s| s =~ /#{@package_result_filename}/ }
46
+ BackItUp::Runner.new(@filename)
47
+ end
48
+
49
+ end
50
+
51
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,4 @@
1
+ --colour
2
+ --format progress
3
+ --loadby mtime
4
+ --reverse
@@ -0,0 +1,8 @@
1
+
2
+ $: << File.expand_path(File.dirname(__FILE__) + '/../lib')
3
+
4
+ require 'back_it_up'
5
+
6
+ Spec::Runner.configure do |config|
7
+ config.mock_with :mocha
8
+ end
@@ -0,0 +1,11 @@
1
+
2
+ backup do
3
+ file 'any-filename'
4
+ dir 'a directory'
5
+
6
+ destination_file "backup_name"
7
+
8
+ #ftp_to
9
+ #scp_to
10
+ end
11
+
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: robinsp-backitup
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Robin Spainhour
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-05-27 00:00:00 -07:00
13
+ default_executable: backitup
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rubyzip
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: Simple backup
26
+ email: robin@robinspainhour.com
27
+ executables:
28
+ - backitup
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - bin/backitup
33
+ - lib/back_it_up.rb
34
+ - lib/back_it_up/config.rb
35
+ - lib/back_it_up/file_packager.rb
36
+ - lib/back_it_up/command.rb
37
+ - lib/back_it_up/runner.rb
38
+ files:
39
+ - bin/backitup
40
+ - spec/test-config.backitup
41
+ - spec/file_packager_spec.rb
42
+ - spec/config_spec.rb
43
+ - spec/runner_spec.rb
44
+ - spec/spec.opts
45
+ - spec/spec_helper.rb
46
+ - Rakefile
47
+ - Manifest
48
+ - lib/back_it_up.rb
49
+ - lib/back_it_up/config.rb
50
+ - lib/back_it_up/file_packager.rb
51
+ - lib/back_it_up/command.rb
52
+ - lib/back_it_up/runner.rb
53
+ - backitup.gemspec
54
+ has_rdoc: true
55
+ homepage: http://github.com/robinsp/backitup
56
+ post_install_message:
57
+ rdoc_options:
58
+ - --line-numbers
59
+ - --inline-source
60
+ - --title
61
+ - Backitup
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: "1.2"
75
+ version:
76
+ requirements: []
77
+
78
+ rubyforge_project: backitup
79
+ rubygems_version: 1.2.0
80
+ signing_key:
81
+ specification_version: 3
82
+ summary: Simple backup
83
+ test_files: []
84
+