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.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/NOTES.md +54 -0
- data/README.md +124 -0
- data/Rakefile +4 -0
- data/bin/puter +5 -0
- data/examples/Puterfile +25 -0
- data/examples/localfile.txt +1 -0
- data/examples/localfile_with_a_really_really_longname.txt +1 -0
- data/lib/puter.rb +23 -0
- data/lib/puter/backend/ssh.rb +69 -0
- data/lib/puter/cli.rb +57 -0
- data/lib/puter/cli/aws.rb +18 -0
- data/lib/puter/cli/vm.rb +167 -0
- data/lib/puter/providers/vm.rb +107 -0
- data/lib/puter/puterfile.rb +198 -0
- data/lib/puter/ui.rb +24 -0
- data/lib/puter/version.rb +3 -0
- data/puter.gemspec +30 -0
- data/spec/cli/vm_spec.rb +0 -0
- data/spec/fixtures/Puterfile +3 -0
- data/spec/fixtures/Puterfile.bad +4 -0
- data/spec/providers/vm_spec.rb +16 -0
- data/spec/puterfile/parse_operation_spec.rb +162 -0
- data/spec/puterfile/parse_spec.rb +24 -0
- data/spec/spec_helper.rb +19 -0
- metadata +195 -0
data/lib/puter/ui.rb
ADDED
@@ -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
|
data/puter.gemspec
ADDED
@@ -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
|
data/spec/cli/vm_spec.rb
ADDED
File without changes
|
@@ -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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|