puter 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,24 @@
1
+ module Puter
2
+ module UI
3
+ def info(message, color = :bold)
4
+ say(message, color)
5
+ end
6
+
7
+ def warn(message, color = :yellow)
8
+ say(message, color)
9
+ end
10
+
11
+ def error(message, color = :red)
12
+ say(message, color)
13
+ end
14
+
15
+ def remote_stdout(message, color = :white)
16
+ say(message, color)
17
+ end
18
+
19
+ def remote_stderr(message, color = :orange)
20
+ say(message, color)
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,3 @@
1
+ module Puter
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'puter/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "puter"
8
+ spec.version = Puter::VERSION
9
+ spec.authors = ['Brian Dupras', 'Dave Smith', 'Gerred Dillon']
10
+ spec.email = ['brian@duprasville.com', 'dawsmith8@gmail.com', 'hello@gerred.com']
11
+ spec.summary = %q{To be determined.}
12
+ spec.description = %q{To be determined.}
13
+ spec.homepage = 'https://github.com/vmtricks/puter'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.7'
22
+ spec.add_development_dependency 'rake', '~> 10.0'
23
+ spec.add_development_dependency 'rspec', '~> 3.1'
24
+ spec.add_development_dependency 'rspec-its'
25
+
26
+ spec.add_dependency 'thor', '~> 0.18'
27
+ spec.add_dependency 'vmonkey', '~> 0.16'
28
+ spec.add_dependency 'net-ssh', '~> 2.9'
29
+ spec.add_dependency 'net-scp', '~> 1.2'
30
+ end
File without changes
@@ -0,0 +1,3 @@
1
+ FROM fixture1
2
+
3
+ RUN touch /tmp/puter.txt
@@ -0,0 +1,4 @@
1
+ # can't comment line one - line one must be a FROM line
2
+ FROM fixture1
3
+
4
+ RUN touch /tmp/puter.txt
@@ -0,0 +1,16 @@
1
+ # require_relative '../../lib/puter/providers/vm'
2
+
3
+ # # note - we're assuming a .vmonkey for now that really goes to vsphere, need to think about mocking
4
+
5
+ # describe Puter::Provider::Vm do
6
+ # let(:vm) { Puter::Provider::Vm.new }
7
+ # let(:templates_path) { '/Templates'}
8
+
9
+ # describe '#images' do
10
+ # #vm.stub!(:vmonkey).and_return(MockVMonkey.new) hard to mock...
11
+ # it 'should return a list of images' do
12
+ # expect(vm.images(templates_path).length).to be > 0
13
+ # end
14
+ # end
15
+
16
+ # end
@@ -0,0 +1,162 @@
1
+ require 'spec_helper'
2
+ require 'puter/puterfile'
3
+
4
+ describe Puter::Puterfile do
5
+ describe '#parse_operation' do
6
+ context 'should raise a syntax error on' do
7
+ specify('a nil line') { expect { Puter::Puterfile.parse_operation(nil) }.to raise_error Puter::SyntaxError }
8
+ specify('an unknown command') { expect { Puter::Puterfile.parse_operation('BLAH') }.to raise_error Puter::SyntaxError }
9
+ specify('non-blank line without a continuation') { expect { Puter::Puterfile.parse_operation(' BLAH') }.to raise_error Puter::SyntaxError }
10
+ specify('a command line without data') { expect { Puter::Puterfile.parse_operation('FROM') }.to raise_error Puter::SyntaxError }
11
+ end
12
+
13
+ context 'empty line' do
14
+ subject { Puter::Puterfile.parse_operation("") }
15
+ specify { expect(subject[:operation]).to eq(Puter::Puterfile::BLANK) }
16
+ specify { expect(subject[:continue]).to be_falsey }
17
+ end
18
+
19
+ context 'whitspace only line' do
20
+ subject { Puter::Puterfile.parse_operation(" \t ") }
21
+ specify { expect(subject[:operation]).to eq(Puter::Puterfile::BLANK) }
22
+ specify { expect(subject[:continue]).to be_falsey }
23
+ end
24
+
25
+ context 'comment line' do
26
+ subject { Puter::Puterfile.parse_operation('# a comment') }
27
+ specify { expect(subject[:operation]).to eq(Puter::Puterfile::COMMENT) }
28
+ specify { expect(subject[:data]).to eq('# a comment') }
29
+ specify { expect(subject[:continue]).to be_falsey }
30
+ end
31
+
32
+ context 'comment line starting with whitespace' do
33
+ subject { Puter::Puterfile.parse_operation(' # a comment') }
34
+ specify { expect(subject[:operation]).to eq(Puter::Puterfile::COMMENT) }
35
+ specify { expect(subject[:data]).to eq(' # a comment') }
36
+ specify { expect(subject[:continue]).to be_falsey }
37
+ end
38
+
39
+ context 'comment line after a continuation line' do
40
+ subject { Puter::Puterfile.parse_operation(' # a comment', " \\") }
41
+ specify { expect(subject[:operation]).to eq(Puter::Puterfile::COMMENT) }
42
+ specify { expect(subject[:data]).to eq(' # a comment') }
43
+ specify { expect(subject[:continue]).to be_falsey }
44
+ end
45
+
46
+ context 'non-comment line after a continuation line' do
47
+ subject { Puter::Puterfile.parse_operation(' more', " \\") }
48
+ specify { expect(subject[:operation]).to eq(Puter::Puterfile::CONTINUE) }
49
+ specify { expect(subject[:data]).to eq('more') }
50
+ specify { expect(subject[:continue]).to be_falsey }
51
+ end
52
+
53
+ context 'line with a continuation' do
54
+ subject { Puter::Puterfile.parse_operation("RUN echo hello \\") }
55
+ specify { expect(subject[:operation]).to eq(Puter::Puterfile::RUN) }
56
+ specify { expect(subject[:data]).to eq('echo hello ') }
57
+ specify { expect(subject[:continue]).to be_truthy }
58
+ end
59
+
60
+ context 'FROM' do
61
+ subject { Puter::Puterfile.parse_operation('FROM blah') }
62
+ specify { expect(subject[:operation]).to eq(Puter::Puterfile::FROM) }
63
+ specify { expect(subject[:data]).to eq('blah') }
64
+ specify { expect(subject[:continue]).to be_falsey }
65
+ end
66
+ end
67
+
68
+ describe '#parse_operations' do
69
+ context 'with a simple Puterfile' do
70
+ subject do
71
+ Puter::Puterfile.parse <<-EOF.unindent
72
+ FROM scratch
73
+
74
+ # comment
75
+ RUN echo foo
76
+ COPY afile tofile
77
+
78
+ RUN yum install \\
79
+ # comment line in a continuation \\
80
+ package1 \\
81
+ package2
82
+
83
+ COPY foo.tar.gz \\
84
+ /tmp/foo.tar.gz
85
+ EOF
86
+ end
87
+
88
+ specify { expect(subject.operations[0][:operation]).to eq(Puter::Puterfile::FROM) }
89
+ specify { expect(subject.operations[1][:operation]).to eq(Puter::Puterfile::BLANK) }
90
+ specify { expect(subject.operations[2][:operation]).to eq(Puter::Puterfile::COMMENT) }
91
+ specify { expect(subject.operations[3][:operation]).to eq(Puter::Puterfile::RUN) }
92
+ specify { expect(subject.operations[4][:operation]).to eq(Puter::Puterfile::COPY) }
93
+ specify { expect(subject.operations[5][:operation]).to eq(Puter::Puterfile::BLANK) }
94
+ specify { expect(subject.operations[6][:operation]).to eq(Puter::Puterfile::RUN) }
95
+ specify { expect(subject.operations[6][:data]).to eq('yum install ') }
96
+ specify { expect(subject.operations[6][:continue]).to be_truthy }
97
+ specify { expect(subject.operations[7][:operation]).to eq(Puter::Puterfile::COMMENT) }
98
+ specify { expect(subject.operations[8][:operation]).to eq(Puter::Puterfile::CONTINUE) }
99
+ specify { expect(subject.operations[8][:data]).to eq('package1 ') }
100
+ specify { expect(subject.operations[8][:continue]).to be_truthy }
101
+ specify { expect(subject.operations[9][:operation]).to eq(Puter::Puterfile::CONTINUE) }
102
+
103
+ specify { expect(subject.executable_ops.length).to eq(5) }
104
+ specify { expect(subject.executable_ops[0][:operation]).to eq(Puter::Puterfile::FROM) }
105
+ specify { expect(subject.executable_ops[0][:data]).to match(/scratch/) }
106
+ specify { expect(subject.executable_ops[0][:start_line]).to eq(0) }
107
+ specify { expect(subject.executable_ops[0][:end_line]).to eq(0) }
108
+
109
+ specify { expect(subject.executable_ops[1][:operation]).to eq(Puter::Puterfile::RUN) }
110
+ specify { expect(subject.executable_ops[1][:data]).to match(/echo foo/) }
111
+ specify { expect(subject.executable_ops[1][:start_line]).to eq(3) }
112
+ specify { expect(subject.executable_ops[1][:end_line]).to eq(3) }
113
+
114
+ specify { expect(subject.executable_ops[2][:operation]).to eq(Puter::Puterfile::COPY) }
115
+ specify { expect(subject.executable_ops[2][:data]).to match(/afile/) }
116
+ specify { expect(subject.executable_ops[2][:start_line]).to eq(4) }
117
+ specify { expect(subject.executable_ops[2][:end_line]).to eq(4) }
118
+
119
+ specify { expect(subject.executable_ops[3][:operation]).to eq(Puter::Puterfile::RUN) }
120
+ specify { expect(subject.executable_ops[3][:data]).to match(/yum install\s+package1\s+package2/) }
121
+ specify { expect(subject.executable_ops[3][:start_line]).to eq(6) }
122
+ specify { expect(subject.executable_ops[3][:end_line]).to eq(9) }
123
+
124
+ specify { expect(subject.executable_ops[4][:operation]).to eq(Puter::Puterfile::COPY) }
125
+ specify { expect(subject.executable_ops[4][:from]).to eq('foo.tar.gz') }
126
+ specify { expect(subject.executable_ops[4][:to]).to eq('/tmp/foo.tar.gz') }
127
+ specify { expect(subject.executable_ops[4][:start_line]).to eq(11) }
128
+ specify { expect(subject.executable_ops[4][:end_line]).to eq(12) }
129
+ end
130
+
131
+ context 'should raise a syntax error with a line number' do
132
+ subject do
133
+ begin
134
+ Puter::Puterfile.parse <<-EOF.unindent
135
+ FROM scratch
136
+ XXX
137
+ EOF
138
+ rescue Puter::SyntaxError => e
139
+ return e
140
+ end
141
+ end
142
+
143
+ its(:message) { should match /line 2/ }
144
+ end
145
+
146
+ context 'should raise a syntax error when COPY operation lacks two parameters' do
147
+ specify { expect { Puter::Puterfile.parse("FROM foo\nCOPY just_one\n") }.to raise_error Puter::SyntaxError }
148
+ end
149
+
150
+ context 'when the first line is not a FROM command' do
151
+ specify { expect { Puter::Puterfile.parse_operations(['# not a FROM']) }.to raise_error Puter::SyntaxError }
152
+ end
153
+
154
+ context 'when the Puterfile is empty' do
155
+ specify { expect { Puter::Puterfile.parse_operations([]) }.to raise_error Puter::SyntaxError }
156
+ end
157
+
158
+ context 'when the Puterfile is whitespace only' do
159
+ specify { expect { Puter::Puterfile.parse_operations([' ']) }.to raise_error Puter::SyntaxError }
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'puter/puterfile'
3
+
4
+ describe Puter::Puterfile do
5
+ describe '#parse' do
6
+ context 'with a simple Puterfile' do
7
+ subject do
8
+ Puter::Puterfile.parse(<<-EOF.gsub /^\s+/, ""
9
+ FROM scratch
10
+
11
+ # comment
12
+ RUN echo foo
13
+ COPY afile tofile
14
+
15
+ EOF
16
+ )
17
+ end
18
+
19
+ its(:raw) { should =~ /afile/ }
20
+ its(:lines) { should include 'RUN echo foo' }
21
+ its(:from) { should == 'scratch' }
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ require 'rspec'
2
+ require 'rspec/its'
3
+ require_relative '../lib/puter'
4
+
5
+ #was thinking VMonkey could be mocked, but would need to return RbvMomi stuff, unsure what to do here
6
+ class MockVMonkey
7
+ #mock vmonkey call here, but they return RbvMomi things, eg - would have to mock what Rbvmomi returns, sigh
8
+ end
9
+
10
+ RSpec.configure do |c|
11
+ c.formatter = :documentation
12
+ c.color = true
13
+ end
14
+
15
+ class String
16
+ def unindent
17
+ gsub /^#{self[/\A\s*/]}/, ''
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,195 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: puter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Brian Dupras
8
+ - Dave Smith
9
+ - Gerred Dillon
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2015-01-16 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: bundler
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '1.7'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '1.7'
29
+ - !ruby/object:Gem::Dependency
30
+ name: rake
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '10.0'
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '10.0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: rspec
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '3.1'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '3.1'
57
+ - !ruby/object:Gem::Dependency
58
+ name: rspec-its
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: thor
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '0.18'
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '0.18'
85
+ - !ruby/object:Gem::Dependency
86
+ name: vmonkey
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '0.16'
92
+ type: :runtime
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: '0.16'
99
+ - !ruby/object:Gem::Dependency
100
+ name: net-ssh
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '2.9'
106
+ type: :runtime
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '2.9'
113
+ - !ruby/object:Gem::Dependency
114
+ name: net-scp
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '1.2'
120
+ type: :runtime
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: '1.2'
127
+ description: To be determined.
128
+ email:
129
+ - brian@duprasville.com
130
+ - dawsmith8@gmail.com
131
+ - hello@gerred.com
132
+ executables:
133
+ - puter
134
+ extensions: []
135
+ extra_rdoc_files: []
136
+ files:
137
+ - ".gitignore"
138
+ - Gemfile
139
+ - LICENSE.txt
140
+ - NOTES.md
141
+ - README.md
142
+ - Rakefile
143
+ - bin/puter
144
+ - examples/Puterfile
145
+ - examples/localfile.txt
146
+ - examples/localfile_with_a_really_really_longname.txt
147
+ - lib/puter.rb
148
+ - lib/puter/backend/ssh.rb
149
+ - lib/puter/cli.rb
150
+ - lib/puter/cli/aws.rb
151
+ - lib/puter/cli/vm.rb
152
+ - lib/puter/providers/vm.rb
153
+ - lib/puter/puterfile.rb
154
+ - lib/puter/ui.rb
155
+ - lib/puter/version.rb
156
+ - puter.gemspec
157
+ - spec/cli/vm_spec.rb
158
+ - spec/fixtures/Puterfile
159
+ - spec/fixtures/Puterfile.bad
160
+ - spec/providers/vm_spec.rb
161
+ - spec/puterfile/parse_operation_spec.rb
162
+ - spec/puterfile/parse_spec.rb
163
+ - spec/spec_helper.rb
164
+ homepage: https://github.com/vmtricks/puter
165
+ licenses:
166
+ - MIT
167
+ metadata: {}
168
+ post_install_message:
169
+ rdoc_options: []
170
+ require_paths:
171
+ - lib
172
+ required_ruby_version: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ required_rubygems_version: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ requirements: []
183
+ rubyforge_project:
184
+ rubygems_version: 2.2.2
185
+ signing_key:
186
+ specification_version: 4
187
+ summary: To be determined.
188
+ test_files:
189
+ - spec/cli/vm_spec.rb
190
+ - spec/fixtures/Puterfile
191
+ - spec/fixtures/Puterfile.bad
192
+ - spec/providers/vm_spec.rb
193
+ - spec/puterfile/parse_operation_spec.rb
194
+ - spec/puterfile/parse_spec.rb
195
+ - spec/spec_helper.rb