reflection 0.0.2 → 0.3.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/Reflection.gemspec +5 -2
- data/TODO +3 -1
- data/VERSION +1 -1
- data/lib/reflection.rb +1 -0
- data/lib/reflection/cli.rb +12 -47
- data/lib/reflection/config.rb +99 -0
- data/spec/reflection/cli_spec.rb +17 -16
- data/spec/reflection/config_spec.rb +110 -0
- metadata +5 -2
data/Reflection.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{reflection}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Andreas Wolff"]
|
12
|
-
s.date = %q{2009-11-
|
12
|
+
s.date = %q{2009-11-17}
|
13
13
|
s.default_executable = %q{reflection}
|
14
14
|
s.description = %q{
|
15
15
|
Reflection is designed to keep your production assets (database comming soon) in sync with your development system.
|
@@ -38,6 +38,7 @@ Gem::Specification.new do |s|
|
|
38
38
|
"lib/reflection/command/apply.rb",
|
39
39
|
"lib/reflection/command/base.rb",
|
40
40
|
"lib/reflection/command/stash.rb",
|
41
|
+
"lib/reflection/config.rb",
|
41
42
|
"lib/reflection/directory.rb",
|
42
43
|
"lib/reflection/directory/base.rb",
|
43
44
|
"lib/reflection/directory/stash.rb",
|
@@ -48,6 +49,7 @@ Gem::Specification.new do |s|
|
|
48
49
|
"lib/reflection/validations.rb",
|
49
50
|
"spec/reflection/cli_spec.rb",
|
50
51
|
"spec/reflection/command/stash_spec.rb",
|
52
|
+
"spec/reflection/config_spec.rb",
|
51
53
|
"spec/reflection/directory/base_spec.rb",
|
52
54
|
"spec/reflection/directory/stash_spec.rb",
|
53
55
|
"spec/reflection/repository_spec.rb",
|
@@ -65,6 +67,7 @@ Gem::Specification.new do |s|
|
|
65
67
|
s.test_files = [
|
66
68
|
"spec/reflection/cli_spec.rb",
|
67
69
|
"spec/reflection/command/stash_spec.rb",
|
70
|
+
"spec/reflection/config_spec.rb",
|
68
71
|
"spec/reflection/directory/base_spec.rb",
|
69
72
|
"spec/reflection/directory/stash_spec.rb",
|
70
73
|
"spec/reflection/repository_spec.rb",
|
data/TODO
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
+
+ Add config files ('$ reflection path/to/config')
|
1
2
|
+ Add DB Dumper (include in cli-opt-parser)
|
2
3
|
+ Remove stash directory if its empty (on reinit)
|
3
4
|
+ Add Logger (Reflection::Support.log)
|
4
5
|
+ After command callbacks: Twitter, Campfire on Serverside
|
5
6
|
+ List existing reflections in client side
|
6
7
|
+ Allow to apply any (git) version, not just the latest
|
7
|
-
+
|
8
|
+
+ Add cli option use tmp-apply (removes ~/.reflection/apply-dir after command)
|
9
|
+
+ Allow collection of assets from Akamai and/or CloudFront (hm.. does that make sense?)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.1
|
data/lib/reflection.rb
CHANGED
data/lib/reflection/cli.rb
CHANGED
@@ -1,64 +1,29 @@
|
|
1
|
-
require 'optparse'
|
2
|
-
require 'ostruct'
|
3
|
-
|
4
1
|
module Reflection
|
5
2
|
module CLI
|
6
3
|
class << self
|
7
4
|
|
8
5
|
def run!(args = nil)
|
9
|
-
|
10
|
-
|
6
|
+
config = Reflection::Config.parse(args)
|
7
|
+
|
8
|
+
if verify_config(config) == false
|
11
9
|
Reflection::Support.exit_with_error("Ahh ja, missing arguments. Please read 'reflection --help' to get a feeling of how it works.")
|
12
10
|
else
|
13
|
-
case
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def parse_options(args)
|
25
|
-
options = OpenStruct.new
|
26
|
-
|
27
|
-
opt_parser = OptionParser.new do |opts|
|
28
|
-
opts.banner = "Usage: reflection --COMMAND --repository=GIT_REPO --directory=PATH"
|
29
|
-
|
30
|
-
opts.separator " "
|
31
|
-
opts.separator "On the server side:"
|
32
|
-
|
33
|
-
opts.on("-s", "--stash", "Store your assets and/or a database dump in a git-repository.") do |stash|
|
34
|
-
options.command = :stash
|
35
|
-
end
|
36
|
-
|
37
|
-
opts.separator "On the client side:"
|
38
|
-
opts.on("-a", "--apply", "Apply assets and/or a database dump loaded from a git-repository.") do |apply|
|
39
|
-
options.command = :apply
|
40
|
-
end
|
41
|
-
|
42
|
-
opts.separator " "
|
43
|
-
opts.separator "Required options for both:"
|
44
|
-
opts.on("-r", "--repository GIT_URL", "A Git repository(url) to be used as storage") do |repository|
|
45
|
-
options.repository = repository
|
46
|
-
end
|
47
|
-
|
48
|
-
opts.on("-d", "--directory PATH", "Path to your asset directory") do |directory|
|
49
|
-
options.directory = directory
|
11
|
+
case config.command
|
12
|
+
when :apply
|
13
|
+
Reflection::Command::Apply.run!(config)
|
14
|
+
when :stash
|
15
|
+
Reflection::Command::Stash.run!(config)
|
16
|
+
else
|
17
|
+
Reflection::Support.exit_with_error("Couldn't identify command. Please run 'reflection --help'.")
|
50
18
|
end
|
51
19
|
end
|
52
|
-
|
53
|
-
opt_parser.parse!(args)
|
54
|
-
verify_options(options)
|
55
20
|
end
|
56
21
|
|
57
22
|
|
58
23
|
private
|
59
24
|
|
60
|
-
def
|
61
|
-
return ([:stash, :apply].include?(
|
25
|
+
def verify_config(config)
|
26
|
+
return ([:stash, :apply].include?(config.command) && !config.repository.nil? && !config.directory.nil?) ? config : false
|
62
27
|
end
|
63
28
|
end
|
64
29
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'ostruct'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module Reflection
|
6
|
+
|
7
|
+
class ConfigArgumentError < StandardError; end
|
8
|
+
|
9
|
+
class Config
|
10
|
+
|
11
|
+
attr_accessor :command
|
12
|
+
attr_accessor :directory
|
13
|
+
attr_accessor :repository
|
14
|
+
attr_accessor :store_configuration_path
|
15
|
+
|
16
|
+
def self.parse(args = [])
|
17
|
+
config = Config.new
|
18
|
+
case
|
19
|
+
when !args.empty? && File.exists?(args.first)
|
20
|
+
config.read!(args.first)
|
21
|
+
when !args.empty?
|
22
|
+
config.parse_command_line_options(args)
|
23
|
+
config.write(config.store_configuration_path) if config.store_configuration_path
|
24
|
+
else
|
25
|
+
config.read!(File.join(Dir.pwd, 'reflection.yml'))
|
26
|
+
end
|
27
|
+
config
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_hash
|
31
|
+
{ :command => self.command, :repository => self.repository, :directory => self.directory }
|
32
|
+
end
|
33
|
+
|
34
|
+
def from_hash(hash)
|
35
|
+
self.command = hash[:command]
|
36
|
+
self.directory = hash[:directory]
|
37
|
+
self.repository = hash[:repository]
|
38
|
+
end
|
39
|
+
|
40
|
+
def write(path)
|
41
|
+
begin
|
42
|
+
io = File.open(path, 'w')
|
43
|
+
YAML.dump(self.to_hash, io)
|
44
|
+
io.close
|
45
|
+
rescue => e
|
46
|
+
Reflection::Support.exit_with_error("Writing of config file to '#{path}' failed: #{e.message}")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def read!(path)
|
51
|
+
begin
|
52
|
+
if File.exist?(path)
|
53
|
+
options = YAML.load_file(path)
|
54
|
+
raise(Reflection::ConfigArgumentError, "Config file is invalid.") unless options.is_a?(Hash)
|
55
|
+
self.from_hash(options)
|
56
|
+
end
|
57
|
+
rescue => e
|
58
|
+
Reflection::Support.exit_with_error("Parsing of config file '#{path}' failed: #{e.message}")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def parse_command_line_options(args)
|
63
|
+
opt_parser = OptionParser.new do |opts|
|
64
|
+
opts.banner = "Usage: reflection --COMMAND --repository=GIT_REPO --directory=PATH"
|
65
|
+
|
66
|
+
opts.separator " "
|
67
|
+
opts.separator "On the server side:"
|
68
|
+
|
69
|
+
opts.on("-s", "--stash", "Store your assets and/or a database dump in a git-repository.") do |stash|
|
70
|
+
self.command = :stash
|
71
|
+
end
|
72
|
+
|
73
|
+
opts.separator "On the client side:"
|
74
|
+
opts.on("-a", "--apply", "Apply assets and/or a database dump loaded from a git-repository.") do |apply|
|
75
|
+
self.command = :apply
|
76
|
+
end
|
77
|
+
|
78
|
+
opts.separator " "
|
79
|
+
opts.separator "Required options for both:"
|
80
|
+
opts.on("-r", "--repository GIT_URL", "A Git repository(url) to be used as storage") do |repository|
|
81
|
+
self.repository = repository
|
82
|
+
end
|
83
|
+
|
84
|
+
opts.on("-d", "--directory PATH", "Path to your asset directory") do |directory|
|
85
|
+
self.directory = directory
|
86
|
+
end
|
87
|
+
|
88
|
+
opts.separator " "
|
89
|
+
opts.separator "Additional options for both:"
|
90
|
+
opts.on("--write [FILE]", "Create a configuration FILE from the current commandline options") do |config_file_path|
|
91
|
+
self.store_configuration_path = config_file_path if config_file_path
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
opt_parser.parse!(args)
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
data/spec/reflection/cli_spec.rb
CHANGED
@@ -6,33 +6,34 @@ describe Reflection::CLI do
|
|
6
6
|
end
|
7
7
|
|
8
8
|
describe '#run!' do
|
9
|
-
|
9
|
+
before(:each) do
|
10
|
+
@config = mock('Reflection::Config', :command => :stash)
|
11
|
+
Reflection::Config.stub!(:parse).and_return(@config)
|
12
|
+
@subject.stub!(:verify_config).and_return(true)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should create a config object, holding the parsed commandline options' do
|
16
|
+
Reflection::Config.should_receive(:parse).with("args").and_return(@config)
|
10
17
|
Reflection::Command::Stash.stub!(:run!)
|
11
|
-
@subject.
|
12
|
-
@subject.run!
|
18
|
+
@subject.run!("args")
|
13
19
|
end
|
14
20
|
|
15
|
-
it 'should fail gracefully displaying a message if
|
21
|
+
it 'should verify the config and fail gracefully displaying a message if verification fails' do
|
16
22
|
Reflection::Support.should_receive(:exit_with_error).with(/reflection --help/)
|
17
|
-
@subject.stub!(:
|
18
|
-
@subject.run!
|
23
|
+
@subject.stub!(:verify_config).and_return(false)
|
24
|
+
@subject.run!("args")
|
19
25
|
end
|
20
26
|
|
21
|
-
context '
|
22
|
-
before(:each) do
|
23
|
-
@parse_options = OpenStruct.new(:options => "more")
|
24
|
-
@subject.stub!(:parse_options).and_return(@parse_options)
|
25
|
-
end
|
26
|
-
|
27
|
+
context 'successfully parsed options' do
|
27
28
|
it 'should call the Stash command if parse_options returned succesfull with command :stash' do
|
28
|
-
|
29
|
-
|
29
|
+
Reflection::Command::Stash.should_receive(:run!).with(@config)
|
30
|
+
@config.stub!(:command).and_return(:stash)
|
30
31
|
@subject.run!
|
31
32
|
end
|
32
33
|
|
33
34
|
it 'should call the Apply command if parse_options returned succesfull with command :apply' do
|
34
|
-
|
35
|
-
|
35
|
+
Reflection::Command::Apply.should_receive(:run!).with(@config)
|
36
|
+
@config.stub!(:command).and_return(:apply)
|
36
37
|
@subject.run!
|
37
38
|
end
|
38
39
|
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe Reflection::Config do
|
4
|
+
before(:each) do
|
5
|
+
@valid_options = { :command => :stash, :repository => 'repo', :directory => 'dir' }
|
6
|
+
end
|
7
|
+
|
8
|
+
describe 'parse' do
|
9
|
+
before(:each) do
|
10
|
+
@mock_config = mock('Reflection::Config', :store_configuration_path => nil)
|
11
|
+
Reflection::Config.stub!(:new).and_return(@mock_config)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should parse a yaml file if the first arg is an existing file' do
|
15
|
+
@mock_config.should_receive(:read!).with('/tmp')
|
16
|
+
Reflection::Config.parse(['/tmp'])
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should parse args as options' do
|
20
|
+
@mock_config.should_receive(:parse_command_line_options).with(['-s', '-d'])
|
21
|
+
Reflection::Config.parse(['-s', '-d'])
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should write options to configuration file if --write params is set' do
|
25
|
+
@mock_config.should_receive(:write).with('/test/path')
|
26
|
+
@mock_config.stub!(:parse_command_line_options)
|
27
|
+
@mock_config.stub!(:store_configuration_path).and_return('/test/path')
|
28
|
+
Reflection::Config.parse(['-s','-d', '--write /test/path'])
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should expect a reflection.yml config file in path if args are empty' do
|
32
|
+
Dir.stub!(:pwd).and_return('/current_dir')
|
33
|
+
@mock_config.should_receive(:read!).with('/current_dir/reflection.yml')
|
34
|
+
Reflection::Config.parse
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#to_hash' do
|
39
|
+
it 'should turn its attributes into a hash' do
|
40
|
+
@config = Reflection::Config.new
|
41
|
+
@config.command = :stash
|
42
|
+
@config.repository = 'repo'
|
43
|
+
@config.directory = 'dir'
|
44
|
+
@config.to_hash.should == @valid_options
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#from_hash' do
|
49
|
+
it 'should assign attributes from a hash' do
|
50
|
+
@config = Reflection::Config.new
|
51
|
+
@config.from_hash( @valid_options )
|
52
|
+
@config.command.should eql(:stash)
|
53
|
+
@config.repository.should eql('repo')
|
54
|
+
@config.directory.should eql('dir')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '#write' do
|
59
|
+
before(:each) do
|
60
|
+
@config = Reflection::Config.new
|
61
|
+
@mock_file = mock('File')
|
62
|
+
@mock_file.stub!(:close)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should dump the config values to a file at the given path' do
|
66
|
+
@config.stub!(:to_hash).and_return( @valid_options )
|
67
|
+
YAML.should_receive(:dump).with( @valid_options, @mock_file )
|
68
|
+
File.should_receive(:open).with('/test/path', 'w').and_return(@mock_file)
|
69
|
+
@config.write('/test/path')
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should gracefully fail if it cannot dump the yaml file' do
|
73
|
+
Reflection::Support.should_receive(:exit_with_error)
|
74
|
+
File.should_receive(:open).with('/test/path', 'w').and_raise(StandardError)
|
75
|
+
@config.write('/test/path')
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe '#read!' do
|
80
|
+
before(:each) do
|
81
|
+
File.stub!(:exist?).and_return(true)
|
82
|
+
@config = Reflection::Config.new
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should get the config attributes from a yaml file' do
|
86
|
+
YAML.should_receive(:load_file).with('/tmp/test').and_return( @valid_options )
|
87
|
+
@config.should_receive(:from_hash).with(@valid_options)
|
88
|
+
@config.read!('/tmp/test')
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should not try to load a yaml file if it doesn't exist" do
|
92
|
+
YAML.should_not_receive(:load_file)
|
93
|
+
File.stub!(:exist?).and_return(false)
|
94
|
+
@config.read!('/tmp/test')
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should gracefully fail if yaml file loading crashed" do
|
98
|
+
Reflection::Support.should_receive(:exit_with_error)
|
99
|
+
YAML.stub!(:load_file).and_raise(StandardError)
|
100
|
+
@config.read!('/tmp/test')
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should gracefully fail if parsing result is not a hash" do
|
104
|
+
Reflection::Support.should_receive(:exit_with_error)
|
105
|
+
YAML.stub!(:load_file).and_return("String Instead Of Hash")
|
106
|
+
@config.read!('/tmp/test')
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reflection
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Wolff
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-11-
|
12
|
+
date: 2009-11-17 00:00:00 +01:00
|
13
13
|
default_executable: reflection
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -57,6 +57,7 @@ files:
|
|
57
57
|
- lib/reflection/command/apply.rb
|
58
58
|
- lib/reflection/command/base.rb
|
59
59
|
- lib/reflection/command/stash.rb
|
60
|
+
- lib/reflection/config.rb
|
60
61
|
- lib/reflection/directory.rb
|
61
62
|
- lib/reflection/directory/base.rb
|
62
63
|
- lib/reflection/directory/stash.rb
|
@@ -67,6 +68,7 @@ files:
|
|
67
68
|
- lib/reflection/validations.rb
|
68
69
|
- spec/reflection/cli_spec.rb
|
69
70
|
- spec/reflection/command/stash_spec.rb
|
71
|
+
- spec/reflection/config_spec.rb
|
70
72
|
- spec/reflection/directory/base_spec.rb
|
71
73
|
- spec/reflection/directory/stash_spec.rb
|
72
74
|
- spec/reflection/repository_spec.rb
|
@@ -106,6 +108,7 @@ summary: Helps you keeping your development machine in sync with production.
|
|
106
108
|
test_files:
|
107
109
|
- spec/reflection/cli_spec.rb
|
108
110
|
- spec/reflection/command/stash_spec.rb
|
111
|
+
- spec/reflection/config_spec.rb
|
109
112
|
- spec/reflection/directory/base_spec.rb
|
110
113
|
- spec/reflection/directory/stash_spec.rb
|
111
114
|
- spec/reflection/repository_spec.rb
|