harrison 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/.gitignore +24 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +137 -0
- data/Rakefile +7 -0
- data/TODO +26 -0
- data/bin/harrison +7 -0
- data/harrison.gemspec +32 -0
- data/lib/harrison/base.rb +101 -0
- data/lib/harrison/config.rb +9 -0
- data/lib/harrison/deploy.rb +110 -0
- data/lib/harrison/package.rb +87 -0
- data/lib/harrison/ssh.rb +80 -0
- data/lib/harrison/version.rb +3 -0
- data/lib/harrison.rb +91 -0
- data/spec/fixtures/Harrisonfile +34 -0
- data/spec/fixtures/eval_script.rb +1 -0
- data/spec/fixtures/nested/.gitkeep +0 -0
- data/spec/spec_helper.rb +83 -0
- data/spec/unit/harrison/base_spec.rb +221 -0
- data/spec/unit/harrison/deploy_spec.rb +181 -0
- data/spec/unit/harrison/package_spec.rb +127 -0
- data/spec/unit/harrison/ssh_spec.rb +5 -0
- data/spec/unit/harrison_spec.rb +157 -0
- metadata +212 -0
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Harrison::Package do
|
4
|
+
let(:instance) do
|
5
|
+
Harrison::Package.new.tap do |p|
|
6
|
+
p.project = 'test_project'
|
7
|
+
p.host = 'hf_host'
|
8
|
+
p.commit = 'HEAD'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '.initialize' do
|
13
|
+
it 'should add --commit to arg_opts' do
|
14
|
+
instance.instance_variable_get('@arg_opts').to_s.should include(':commit')
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should add --purge to arg_opts' do
|
18
|
+
instance.instance_variable_get('@arg_opts').to_s.should include(':purge')
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should add --pkg-dir to arg_opts' do
|
22
|
+
instance.instance_variable_get('@arg_opts').to_s.should include(':pkg_dir')
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should add --remote-dir to arg_opts' do
|
26
|
+
instance.instance_variable_get('@arg_opts').to_s.should include(':remote_dir')
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should persist options' do
|
30
|
+
instance = Harrison::Package.new(testopt: 'foo')
|
31
|
+
|
32
|
+
instance.instance_variable_get('@options').should include(testopt: 'foo')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'instance methods' do
|
37
|
+
describe '#remote_exec' do
|
38
|
+
before(:each) do
|
39
|
+
@mock_ssh = double(:ssh)
|
40
|
+
allow(instance).to receive(:ssh).and_return(@mock_ssh)
|
41
|
+
allow(instance).to receive(:ensure_remote_dir).and_return(true)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should prepend remote build dir onto passed command' do
|
45
|
+
instance.remote_dir = '~/.harrison'
|
46
|
+
instance.project = 'test_project'
|
47
|
+
|
48
|
+
expect(@mock_ssh).to receive(:exec).with("cd ~/.harrison/test_project/package && test_command").and_return('')
|
49
|
+
|
50
|
+
instance.remote_exec("test_command")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '#run' do
|
55
|
+
context 'when passed a block' do
|
56
|
+
it 'should store the block' do
|
57
|
+
test_block = Proc.new { |test| "block_output" }
|
58
|
+
instance.run(&test_block)
|
59
|
+
|
60
|
+
instance.instance_variable_get("@run_block").should == test_block
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'when not passed a block' do
|
65
|
+
before(:each) do
|
66
|
+
@mock_ssh = double(:ssh, exec: '', upload: true, download: true)
|
67
|
+
allow(instance).to receive(:ssh).at_least(:once).and_return(@mock_ssh)
|
68
|
+
|
69
|
+
allow(instance).to receive(:ensure_local_dir).and_return(true)
|
70
|
+
allow(instance).to receive(:resolve_commit!).and_return('test')
|
71
|
+
allow(instance).to receive(:excludes_for_tar).and_return('')
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'should invoke the previously stored block once with host' do
|
75
|
+
test_block = Proc.new { |test| puts "block for #{test.host}" }
|
76
|
+
instance.run(&test_block)
|
77
|
+
|
78
|
+
output = capture(:stdout) do
|
79
|
+
instance.run
|
80
|
+
end
|
81
|
+
|
82
|
+
output.should include('block for hf_host')
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe 'protected methods' do
|
89
|
+
describe '#remote_project_dir' do
|
90
|
+
it 'should combine remote dir and project name' do
|
91
|
+
instance.remote_dir = '~/.harrison'
|
92
|
+
instance.project = 'test_project'
|
93
|
+
|
94
|
+
instance.send(:remote_project_dir).should include('~/.harrison', 'test_project')
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe '#resolve_commit!' do
|
99
|
+
it 'should resolve commit reference to a short sha using git rev-parse' do
|
100
|
+
instance.commit = 'giant'
|
101
|
+
expect(instance).to receive(:exec).with(/git rev-parse.*giant/).and_return('fef1f0')
|
102
|
+
|
103
|
+
instance.send(:resolve_commit!).should == 'fef1f0'
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe '#excludes_for_tar' do
|
108
|
+
it 'should return an empty string if exclude is nil' do
|
109
|
+
instance.exclude = nil
|
110
|
+
|
111
|
+
instance.send(:excludes_for_tar).should == ''
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'should return an empty string if exclude is empty' do
|
115
|
+
instance.exclude = []
|
116
|
+
|
117
|
+
instance.send(:excludes_for_tar).should == ''
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'should return an --exclude option for each member of exclude' do
|
121
|
+
instance.exclude = [ 'fee', 'fi', 'fo', 'fum' ]
|
122
|
+
|
123
|
+
instance.send(:excludes_for_tar).scan(/--exclude/).size.should == instance.exclude.size
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Harrison do
|
4
|
+
before(:all) do
|
5
|
+
[ :@@args, :@@packager, :@@deployer, :@@config, :@@runner ].each do |class_var|
|
6
|
+
Harrison.class_variable_set(class_var, nil)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
after(:each) do
|
11
|
+
[ :@@args, :@@packager, :@@deployer, :@@config, :@@runner ].each do |class_var|
|
12
|
+
Harrison.class_variable_set(class_var, nil)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '.invoke' do
|
17
|
+
it 'should exit when no args are passed' do
|
18
|
+
output = capture(:stderr) do
|
19
|
+
lambda { Harrison.invoke([]) }.should exit_with_code(1)
|
20
|
+
end
|
21
|
+
|
22
|
+
output.should include('no', 'command', 'given')
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should output base help when first arg is --help' do
|
26
|
+
output = capture(:stdout) do
|
27
|
+
lambda { Harrison.invoke(['--help']) }.should exit_with_code(0)
|
28
|
+
end
|
29
|
+
|
30
|
+
output.should include('options', 'debug', 'help')
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should look for a Harrisonfile' do
|
34
|
+
expect(Harrison).to receive(:find_harrisonfile).and_return(harrisonfile_fixture_path)
|
35
|
+
|
36
|
+
output = capture(:stderr) do
|
37
|
+
lambda { Harrison.invoke(['test']) }.should exit_with_code(1)
|
38
|
+
end
|
39
|
+
|
40
|
+
output.should include('unrecognized', 'command', 'test')
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should complain if unable to find a Harrisonfile' do
|
44
|
+
expect(Harrison).to receive(:find_harrisonfile).and_return(nil)
|
45
|
+
|
46
|
+
output = capture(:stderr) do
|
47
|
+
lambda { Harrison.invoke(['test']) }.should exit_with_code(1)
|
48
|
+
end
|
49
|
+
|
50
|
+
output.should include('could', 'not', 'find', 'harrisonfile')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '.config' do
|
55
|
+
it 'should return a new Harrison::Config' do
|
56
|
+
mock_config = double(:config)
|
57
|
+
expect(Harrison::Config).to receive(:new).and_return(mock_config)
|
58
|
+
|
59
|
+
Harrison.config.should == mock_config
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should return existing Harrison::Config if defined' do
|
63
|
+
mock_config = double(:config)
|
64
|
+
Harrison.class_variable_set(:@@config, mock_config)
|
65
|
+
expect(Harrison::Config).to_not receive(:new)
|
66
|
+
|
67
|
+
Harrison.config.should == mock_config
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should yield config if given a block' do
|
71
|
+
mock_config = double(:config)
|
72
|
+
Harrison.class_variable_set(:@@config, mock_config)
|
73
|
+
|
74
|
+
expect { |b| Harrison.config(&b) }.to yield_with_args(mock_config)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe '.package' do
|
79
|
+
before(:each) do
|
80
|
+
Harrison.class_variable_set(:@@args, ['package'])
|
81
|
+
Harrison.class_variable_set(:@@runner, lambda { Harrison.class_variable_get(:@@packager) if Harrison.class_variable_defined?(:@@packager) })
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'should yield a new Harrison::Package' do
|
85
|
+
mock_package = double(:package, parse: true)
|
86
|
+
expect(Harrison::Package).to receive(:new).and_return(mock_package)
|
87
|
+
|
88
|
+
expect { |b| Harrison.package(&b) }.to yield_with_args(mock_package)
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should yield existing Harrison::Package if defined' do
|
92
|
+
mock_package = double(:package, parse: true)
|
93
|
+
Harrison.class_variable_set(:@@packager, mock_package)
|
94
|
+
expect(Harrison::Package).to_not receive(:new)
|
95
|
+
|
96
|
+
expect { |b| Harrison.package(&b) }.to yield_with_args(mock_package)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe '.deploy' do
|
101
|
+
before(:each) do
|
102
|
+
Harrison.class_variable_set(:@@args, ['deploy'])
|
103
|
+
Harrison.class_variable_set(:@@runner, lambda { Harrison.class_variable_get(:@@deployer) if Harrison.class_variable_defined?(:@@deployer) })
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'should yield a new Harrison::Deploy' do
|
107
|
+
mock_deploy = double(:deploy, parse: true)
|
108
|
+
expect(Harrison::Deploy).to receive(:new).and_return(mock_deploy)
|
109
|
+
|
110
|
+
expect { |b| Harrison.deploy(&b) }.to yield_with_args(mock_deploy)
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should yield existing Harrison::Package if defined' do
|
114
|
+
mock_deploy = double(:deploy, parse: true)
|
115
|
+
Harrison.class_variable_set(:@@deployer, mock_deploy)
|
116
|
+
expect(Harrison::Deploy).to_not receive(:new)
|
117
|
+
|
118
|
+
expect { |b| Harrison.deploy(&b) }.to yield_with_args(mock_deploy)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context 'private methods' do
|
123
|
+
describe '.find_harrisonfile' do
|
124
|
+
it 'should find a Harrisonfile if it exists in pwd' do
|
125
|
+
expect(Dir).to receive(:pwd).and_return(fixture_path)
|
126
|
+
|
127
|
+
Harrison.send(:find_harrisonfile).should == harrisonfile_fixture_path
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'should find a Harrisonfile if it exists in parent of pwd' do
|
131
|
+
expect(Dir).to receive(:pwd).and_return(fixture_path + '/nested')
|
132
|
+
|
133
|
+
Harrison.send(:find_harrisonfile).should == harrisonfile_fixture_path
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should return nil if there is no Harrisonfile in tree' do
|
137
|
+
expect(Dir).to receive(:pwd).and_return(File.dirname(__FILE__))
|
138
|
+
|
139
|
+
# Short circuit upward directory traversal.
|
140
|
+
allow(File).to receive(:expand_path).and_call_original
|
141
|
+
allow(File).to receive(:expand_path).with("..", File.dirname(__FILE__)).and_return(File.dirname(__FILE__))
|
142
|
+
|
143
|
+
Harrison.send(:find_harrisonfile).should be_nil
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
describe '.eval_script' do
|
148
|
+
it 'should eval given script' do
|
149
|
+
output = capture(:stdout) do
|
150
|
+
Harrison.send(:eval_script, fixture_path + '/eval_script.rb')
|
151
|
+
end
|
152
|
+
|
153
|
+
output.should == "this file was eval-led\n"
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
metadata
ADDED
@@ -0,0 +1,212 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: harrison
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jesse Scott
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-07-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: trollop
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
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: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: net-ssh
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
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: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: net-scp
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: bundler
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '1.6'
|
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: '1.6'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rake
|
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: rspec
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '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: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: debugger
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
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: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: sourcify
|
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:
|
143
|
+
email:
|
144
|
+
- jesse@puppetlabs.com
|
145
|
+
executables:
|
146
|
+
- harrison
|
147
|
+
extensions: []
|
148
|
+
extra_rdoc_files: []
|
149
|
+
files:
|
150
|
+
- .gitignore
|
151
|
+
- .rspec
|
152
|
+
- Gemfile
|
153
|
+
- LICENSE.txt
|
154
|
+
- README.md
|
155
|
+
- Rakefile
|
156
|
+
- TODO
|
157
|
+
- bin/harrison
|
158
|
+
- harrison.gemspec
|
159
|
+
- lib/harrison.rb
|
160
|
+
- lib/harrison/base.rb
|
161
|
+
- lib/harrison/config.rb
|
162
|
+
- lib/harrison/deploy.rb
|
163
|
+
- lib/harrison/package.rb
|
164
|
+
- lib/harrison/ssh.rb
|
165
|
+
- lib/harrison/version.rb
|
166
|
+
- spec/fixtures/Harrisonfile
|
167
|
+
- spec/fixtures/eval_script.rb
|
168
|
+
- spec/fixtures/nested/.gitkeep
|
169
|
+
- spec/spec_helper.rb
|
170
|
+
- spec/unit/harrison/base_spec.rb
|
171
|
+
- spec/unit/harrison/deploy_spec.rb
|
172
|
+
- spec/unit/harrison/package_spec.rb
|
173
|
+
- spec/unit/harrison/ssh_spec.rb
|
174
|
+
- spec/unit/harrison_spec.rb
|
175
|
+
homepage: https://github.com/scotje/harrison
|
176
|
+
licenses:
|
177
|
+
- Apache 2.0
|
178
|
+
post_install_message:
|
179
|
+
rdoc_options: []
|
180
|
+
require_paths:
|
181
|
+
- lib
|
182
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
183
|
+
none: false
|
184
|
+
requirements:
|
185
|
+
- - ! '>='
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 1.9.3
|
188
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
189
|
+
none: false
|
190
|
+
requirements:
|
191
|
+
- - ! '>='
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
version: '0'
|
194
|
+
segments:
|
195
|
+
- 0
|
196
|
+
hash: 1981909616735500300
|
197
|
+
requirements: []
|
198
|
+
rubyforge_project:
|
199
|
+
rubygems_version: 1.8.29
|
200
|
+
signing_key:
|
201
|
+
specification_version: 3
|
202
|
+
summary: Simple artifact-based deployment for web applications.
|
203
|
+
test_files:
|
204
|
+
- spec/fixtures/Harrisonfile
|
205
|
+
- spec/fixtures/eval_script.rb
|
206
|
+
- spec/fixtures/nested/.gitkeep
|
207
|
+
- spec/spec_helper.rb
|
208
|
+
- spec/unit/harrison/base_spec.rb
|
209
|
+
- spec/unit/harrison/deploy_spec.rb
|
210
|
+
- spec/unit/harrison/package_spec.rb
|
211
|
+
- spec/unit/harrison/ssh_spec.rb
|
212
|
+
- spec/unit/harrison_spec.rb
|