evm 0.6.1 → 0.9.0
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 +4 -4
- data/README.md +278 -0
- data/bin/evm +12 -0
- data/lib/evm.rb +7 -28
- data/lib/evm/builder.rb +18 -17
- data/lib/evm/cli.rb +43 -18
- data/lib/evm/command.rb +2 -1
- data/lib/evm/command/bin.rb +2 -2
- data/lib/evm/command/config.rb +19 -0
- data/lib/evm/command/disuse.rb +15 -0
- data/lib/evm/command/install.rb +3 -1
- data/lib/evm/command/list.rb +1 -1
- data/lib/evm/command/uninstall.rb +3 -1
- data/lib/evm/command/use.rb +3 -1
- data/lib/evm/config.rb +43 -0
- data/lib/evm/git.rb +1 -1
- data/lib/evm/package.rb +26 -11
- data/lib/evm/remote_file.rb +9 -55
- data/lib/evm/tar_file.rb +1 -1
- data/spec/evm/builder_spec.rb +209 -0
- data/spec/evm/cli_spec.rb +53 -0
- data/spec/evm/command/bin_spec.rb +32 -0
- data/spec/evm/command/config_spec.rb +34 -0
- data/spec/evm/command/disuse_spec.rb +19 -0
- data/spec/evm/command/install_spec.rb +103 -0
- data/spec/evm/command/list_spec.rb +36 -0
- data/spec/evm/command/uninstall_spec.rb +35 -0
- data/spec/evm/command/use_spec.rb +32 -0
- data/spec/evm/config_spec.rb +36 -0
- data/spec/evm/evm_spec.rb +11 -0
- data/spec/evm/git_spec.rb +39 -0
- data/spec/evm/os_spec.rb +47 -0
- data/spec/evm/package_spec.rb +274 -0
- data/spec/evm/recipe_spec.rb +47 -0
- data/spec/evm/remote_file_spec.rb +47 -0
- data/spec/evm/system_spec.rb +36 -0
- data/spec/evm/tar_file_spec.rb +21 -0
- data/spec/spec_helper.rb +13 -0
- metadata +29 -17
- data/lib/evm/exception.rb +0 -4
- data/lib/evm/progress_bar.rb +0 -37
- data/recipes/emacs-23.4-bin.rb +0 -7
- data/recipes/emacs-23.4.rb +0 -27
- data/recipes/emacs-24.1-bin.rb +0 -7
- data/recipes/emacs-24.1.rb +0 -24
- data/recipes/emacs-24.2-bin.rb +0 -7
- data/recipes/emacs-24.2.rb +0 -24
- data/recipes/emacs-24.3-bin.rb +0 -7
- data/recipes/emacs-24.3.rb +0 -24
- data/recipes/emacs-24.4-bin.rb +0 -7
- data/recipes/emacs-24.4.rb +0 -24
- data/recipes/emacs-git-snapshot.rb +0 -25
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Evm::Cli do
|
4
|
+
let :foo do
|
5
|
+
double('Foo')
|
6
|
+
end
|
7
|
+
|
8
|
+
before do
|
9
|
+
stub_const('Evm::Command::Foo', foo)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should initialize class without argument or option' do
|
13
|
+
expect(foo).to receive(:new).with([], {})
|
14
|
+
|
15
|
+
Evm::Cli.parse(['foo'])
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should initialize class with argument' do
|
19
|
+
expect(foo).to receive(:new).with(['bar'], {})
|
20
|
+
|
21
|
+
Evm::Cli.parse(['foo', 'bar'])
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should initialize class with option' do
|
25
|
+
expect(foo).to receive(:new).with([], :force => true)
|
26
|
+
|
27
|
+
Evm::Cli.parse(['foo', '--force'])
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should support force option' do
|
31
|
+
expect(foo).to receive(:new).with(['bar'], :force => true)
|
32
|
+
|
33
|
+
Evm::Cli.parse(['foo', 'bar', '--force'])
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should support use option' do
|
37
|
+
expect(foo).to receive(:new).with(['bar'], :use => true)
|
38
|
+
|
39
|
+
Evm::Cli.parse(['foo', 'bar', '--use'])
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should support skip option' do
|
43
|
+
expect(foo).to receive(:new).with(['bar'], :skip => true)
|
44
|
+
|
45
|
+
Evm::Cli.parse(['foo', 'bar', '--skip'])
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should print message and exit if command not found' do
|
49
|
+
expect {
|
50
|
+
Evm::Cli.parse(['bar'])
|
51
|
+
}.to raise_error('No such command: bar')
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Evm::Command::Bin do
|
4
|
+
it 'should print current bin when not specified' do
|
5
|
+
allow(Evm::Package).to receive(:current) do |package_name, options|
|
6
|
+
double('package', :bin => 'BIN')
|
7
|
+
end
|
8
|
+
|
9
|
+
expect(STDOUT).to receive(:puts).with('BIN')
|
10
|
+
|
11
|
+
Evm::Command::Bin.new([])
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should print specified bin when specified' do
|
15
|
+
allow(Evm::Package).to receive(:find) do |package_name, options|
|
16
|
+
double('package', :bin => 'BIN')
|
17
|
+
end
|
18
|
+
|
19
|
+
expect(STDOUT).to receive(:puts).with('BIN')
|
20
|
+
|
21
|
+
Evm::Command::Bin.new(['foo'])
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should raise exception when no current and no specified' do
|
25
|
+
allow(Evm::Package).to receive(:find)
|
26
|
+
allow(Evm::Package).to receive(:current)
|
27
|
+
|
28
|
+
expect {
|
29
|
+
Evm::Command::Bin.new([])
|
30
|
+
}.to raise_error('No current selected')
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Evm::Command::Config do
|
4
|
+
let :config do
|
5
|
+
{}
|
6
|
+
end
|
7
|
+
|
8
|
+
before do
|
9
|
+
allow(Evm).to receive(:config).and_return(config)
|
10
|
+
stub_const('Evm::CONFIG_TYPES', [:foo])
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'raises exception unless valid type' do
|
14
|
+
expect {
|
15
|
+
described_class.new(['bar'])
|
16
|
+
}.to raise_error('Invalid config type: bar')
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'get' do
|
20
|
+
it 'prints type value' do
|
21
|
+
config['foo'] = 'FOO'
|
22
|
+
expect(STDOUT).to receive(:puts).with('FOO')
|
23
|
+
described_class.new(['foo'])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'set' do
|
28
|
+
it 'sets type to value and prints value' do
|
29
|
+
expect(STDOUT).to receive(:puts).with('BAR')
|
30
|
+
described_class.new(['foo', 'BAR'])
|
31
|
+
expect(config['foo']).to eq('BAR')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Evm::Command::Disuse do
|
4
|
+
it 'should disuse package name if package selected' do
|
5
|
+
allow(Evm::Package).to receive(:current) do
|
6
|
+
package = double('package')
|
7
|
+
expect(package).to receive(:disuse!)
|
8
|
+
package
|
9
|
+
end
|
10
|
+
|
11
|
+
Evm::Command::Disuse.new([])
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should raise exception if no package selected' do
|
15
|
+
expect {
|
16
|
+
Evm::Command::Disuse.new([])
|
17
|
+
}.to raise_error('No package currently selected')
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Evm::Command::Install do
|
4
|
+
it 'should install if package and not installed' do
|
5
|
+
allow(Evm::Package).to receive(:find) do |package_name|
|
6
|
+
package = double('package')
|
7
|
+
expect(package).to receive(:install!)
|
8
|
+
allow(package).to receive(:installed?).and_return(false)
|
9
|
+
package
|
10
|
+
end
|
11
|
+
|
12
|
+
expect(STDOUT).to receive(:puts).with('Successfully installed foo')
|
13
|
+
|
14
|
+
Evm::Command::Install.new(['foo'])
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should uninstall first if force option' do
|
18
|
+
allow(Evm::Package).to receive(:find) do |package_name|
|
19
|
+
package = double('package')
|
20
|
+
expect(package).to receive(:install!)
|
21
|
+
expect(package).to receive(:uninstall!)
|
22
|
+
allow(package).to receive(:installed?).and_return(false)
|
23
|
+
package
|
24
|
+
end
|
25
|
+
|
26
|
+
expect(STDOUT).to receive(:puts).with('Successfully installed foo')
|
27
|
+
|
28
|
+
Evm::Command::Install.new(['foo'], :force => true)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should install when installed if force' do
|
32
|
+
allow(Evm::Package).to receive(:find) do |package_name|
|
33
|
+
package = double('package')
|
34
|
+
expect(package).to receive(:install!)
|
35
|
+
allow(package).to receive(:uninstall!) {
|
36
|
+
allow(package).to receive(:installed?).and_return(false)
|
37
|
+
}
|
38
|
+
allow(package).to receive(:installed?).and_return(true)
|
39
|
+
package
|
40
|
+
end
|
41
|
+
|
42
|
+
expect(STDOUT).to receive(:puts).with('Successfully installed foo')
|
43
|
+
|
44
|
+
Evm::Command::Install.new(['foo'], :force => true)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should install and use if --use option' do
|
48
|
+
allow(Evm::Package).to receive(:find) do |package_name|
|
49
|
+
package = double('package')
|
50
|
+
expect(package).to receive(:use!)
|
51
|
+
expect(package).to receive(:install!)
|
52
|
+
allow(package).to receive(:installed?).and_return(false)
|
53
|
+
package
|
54
|
+
end
|
55
|
+
|
56
|
+
expect(STDOUT).to receive(:puts).with('Successfully installed foo')
|
57
|
+
|
58
|
+
Evm::Command::Install.new(['foo'], :use => true)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should raise exception if already installed' do
|
62
|
+
allow(Evm::Package).to receive(:find) do |package_name|
|
63
|
+
package = double('package')
|
64
|
+
expect(package).not_to receive(:install!)
|
65
|
+
allow(package).to receive(:installed?).and_return(true)
|
66
|
+
package
|
67
|
+
end
|
68
|
+
|
69
|
+
expect {
|
70
|
+
Evm::Command::Install.new(['foo'])
|
71
|
+
}.to raise_error('Already installed foo')
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'should raise exception if no package name' do
|
75
|
+
expect {
|
76
|
+
Evm::Command::Install.new([nil])
|
77
|
+
}.to raise_error('The install command requires an argument')
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'should not install if already installed and --skip option' do
|
81
|
+
allow(Evm::Package).to receive(:find) do |package_name|
|
82
|
+
package = double('package')
|
83
|
+
expect(package).not_to receive(:install!)
|
84
|
+
allow(package).to receive(:installed?).and_return(true)
|
85
|
+
package
|
86
|
+
end
|
87
|
+
|
88
|
+
Evm::Command::Install.new(['foo'], :skip => true)
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should install if not already installed and --skip option' do
|
92
|
+
allow(Evm::Package).to receive(:find) do |package_name|
|
93
|
+
package = double('package')
|
94
|
+
expect(package).to receive(:install!)
|
95
|
+
allow(package).to receive(:installed?).and_return(false)
|
96
|
+
package
|
97
|
+
end
|
98
|
+
|
99
|
+
expect(STDOUT).to receive(:puts).with('Successfully installed foo')
|
100
|
+
|
101
|
+
Evm::Command::Install.new(['foo'], :skip => true)
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Evm::Command::List do
|
4
|
+
it 'should print list of packages' do
|
5
|
+
allow(Evm::Package).to receive(:all) do
|
6
|
+
foo = double('foo')
|
7
|
+
allow(foo).to receive(:current?).and_return(true)
|
8
|
+
allow(foo).to receive(:installed?).and_return(true)
|
9
|
+
allow(foo).to receive(:to_s).and_return('foo')
|
10
|
+
|
11
|
+
bar = double('bar')
|
12
|
+
allow(bar).to receive(:current?).and_return(false)
|
13
|
+
allow(bar).to receive(:installed?).and_return(false)
|
14
|
+
allow(bar).to receive(:to_s).and_return('bar')
|
15
|
+
|
16
|
+
baz = double('baz')
|
17
|
+
allow(baz).to receive(:current?).and_return(false)
|
18
|
+
allow(baz).to receive(:installed?).and_return(true)
|
19
|
+
allow(baz).to receive(:to_s).and_return('baz')
|
20
|
+
|
21
|
+
[foo, bar, baz]
|
22
|
+
end
|
23
|
+
|
24
|
+
output = []
|
25
|
+
allow(STDOUT).to receive(:puts) { |*args|
|
26
|
+
output << args.first.to_s + "\n"
|
27
|
+
}
|
28
|
+
allow(STDOUT).to receive(:print) { |*args|
|
29
|
+
output << args.first.to_s
|
30
|
+
}
|
31
|
+
|
32
|
+
Evm::Command::List.new()
|
33
|
+
|
34
|
+
expect(output.join).to eq("* foo [I]\nbar\nbaz [I]\n")
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Evm::Command::Uninstall do
|
4
|
+
it 'should uninstall if installed' do
|
5
|
+
allow(Evm::Package).to receive(:find) do |package_name|
|
6
|
+
package = double('package')
|
7
|
+
expect(package).to receive((:uninstall!))
|
8
|
+
allow(package).to receive(:installed?).and_return(true)
|
9
|
+
package
|
10
|
+
end
|
11
|
+
|
12
|
+
expect(STDOUT).to receive(:puts).with('Successfully uninstalled foo')
|
13
|
+
|
14
|
+
Evm::Command::Uninstall.new(['foo'])
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should raise exception if not installed' do
|
18
|
+
allow(Evm::Package).to receive(:find) do |package_name|
|
19
|
+
package = double('package')
|
20
|
+
expect(package).not_to receive(:uninstall!)
|
21
|
+
allow(package).to receive(:installed?).and_return(false)
|
22
|
+
package
|
23
|
+
end
|
24
|
+
|
25
|
+
expect {
|
26
|
+
Evm::Command::Uninstall.new(['foo'])
|
27
|
+
}.to raise_error('Not installed foo')
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should raise exception if no package name' do
|
31
|
+
expect {
|
32
|
+
Evm::Command::Uninstall.new([])
|
33
|
+
}.to raise_error('The uninstall command requires an argument')
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Evm::Command::Use do
|
4
|
+
it 'should use package name if installed' do
|
5
|
+
allow(Evm::Package).to receive(:find) do |package_name|
|
6
|
+
package = double('package')
|
7
|
+
allow(package).to receive(:installed?).and_return(true)
|
8
|
+
expect(package).to receive(:use!)
|
9
|
+
package
|
10
|
+
end
|
11
|
+
|
12
|
+
Evm::Command::Use.new(['foo'])
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should raise exception if package is not installed' do
|
16
|
+
allow(Evm::Package).to receive(:find) do |package_name|
|
17
|
+
package = double('package')
|
18
|
+
allow(package).to receive(:installed?).and_return(false)
|
19
|
+
package
|
20
|
+
end
|
21
|
+
|
22
|
+
expect {
|
23
|
+
Evm::Command::Use.new(['foo'])
|
24
|
+
}.to raise_error('Package not installed: foo')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should raise exception if no package name' do
|
28
|
+
expect {
|
29
|
+
Evm::Command::Use.new([])
|
30
|
+
}.to raise_error('The use command requires an argument')
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Evm::Config do
|
5
|
+
let :config_file do
|
6
|
+
Tempfile.new('foo')
|
7
|
+
end
|
8
|
+
|
9
|
+
let :defaults do
|
10
|
+
{ baz: 'qux' }
|
11
|
+
end
|
12
|
+
|
13
|
+
subject do
|
14
|
+
described_class.new(config_file, defaults)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'can set type to value and get value' do
|
18
|
+
subject[:foo] = 'bar'
|
19
|
+
expect(subject[:foo]).to eq('bar')
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'supports both string and symbol type' do
|
23
|
+
subject[:foo] = 'bar'
|
24
|
+
expect(subject['foo']).to eq('bar')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'returns nil unless type is set to a value' do
|
28
|
+
expect(subject[:foo]).to be_nil
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'returns default value if any and type not set' do
|
32
|
+
expect(subject[:baz]).to eq('qux')
|
33
|
+
subject[:baz] = 'QUX'
|
34
|
+
expect(subject[:baz]).to eq('QUX')
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Evm do
|
4
|
+
it 'should return correct root directory' do
|
5
|
+
expect(Evm::ROOT_PATH).to eq(File.expand_path('../..', File.dirname(__FILE__)))
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should return correct local directory' do
|
9
|
+
expect(Evm::LOCAL_PATH).to eq('/usr/local/evm')
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Evm::Git do
|
4
|
+
before do
|
5
|
+
@path = '/path/to/git'
|
6
|
+
|
7
|
+
@git = Evm::Git.new(@path)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'exist?' do
|
11
|
+
it 'should exist when path does exist' do
|
12
|
+
allow(File).to receive(:exist?).and_return(false)
|
13
|
+
|
14
|
+
expect(@git.exist?).to be false
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should not exist when path does not exist' do
|
18
|
+
allow(File).to receive(:exist?).and_return(true)
|
19
|
+
|
20
|
+
expect(@git.exist?).to be true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'clone' do
|
25
|
+
it 'should clone url to path' do
|
26
|
+
expect(@git).to receive(:git).with('clone', 'URL', @path)
|
27
|
+
@git.clone('URL')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'pull' do
|
32
|
+
it 'should pull in path' do
|
33
|
+
expect(Dir).to receive(:chdir).with(@path).and_yield
|
34
|
+
|
35
|
+
expect(@git).to receive(:git).with('pull')
|
36
|
+
@git.pull
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/spec/evm/os_spec.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Evm::Os do
|
4
|
+
describe '.osx?' do
|
5
|
+
it 'should be osx when osx' do
|
6
|
+
stub_const('RUBY_PLATFORM', 'x86_64-darwin12.3.0')
|
7
|
+
|
8
|
+
expect(Evm::Os.osx?).to be_truthy
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should not be osx when linux' do
|
12
|
+
stub_const('RUBY_PLATFORM', 'x86_64-linux')
|
13
|
+
|
14
|
+
expect(Evm::Os.osx?).to be_falsy
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '.linux?' do
|
19
|
+
it 'should be linux when linux' do
|
20
|
+
stub_const('RUBY_PLATFORM', 'x86_64-linux')
|
21
|
+
|
22
|
+
expect(Evm::Os.linux?).to be_truthy
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should not be linux when osx' do
|
26
|
+
stub_const('RUBY_PLATFORM', 'x86_64-darwin12.3.0')
|
27
|
+
|
28
|
+
expect(Evm::Os.linux?).to be_falsy
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '.platform_name' do
|
33
|
+
it 'should be osx when osx' do
|
34
|
+
allow(Evm::Os).to receive(:osx?).and_return(true)
|
35
|
+
allow(Evm::Os).to receive(:linux?).and_return(false)
|
36
|
+
|
37
|
+
expect(Evm::Os.platform_name).to eq(:osx)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should be linux when linux' do
|
41
|
+
allow(Evm::Os).to receive(:osx?).and_return(false)
|
42
|
+
allow(Evm::Os).to receive(:linux?).and_return(true)
|
43
|
+
|
44
|
+
expect(Evm::Os.platform_name).to eq(:linux)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|