puter 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.
@@ -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