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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +278 -0
  3. data/bin/evm +12 -0
  4. data/lib/evm.rb +7 -28
  5. data/lib/evm/builder.rb +18 -17
  6. data/lib/evm/cli.rb +43 -18
  7. data/lib/evm/command.rb +2 -1
  8. data/lib/evm/command/bin.rb +2 -2
  9. data/lib/evm/command/config.rb +19 -0
  10. data/lib/evm/command/disuse.rb +15 -0
  11. data/lib/evm/command/install.rb +3 -1
  12. data/lib/evm/command/list.rb +1 -1
  13. data/lib/evm/command/uninstall.rb +3 -1
  14. data/lib/evm/command/use.rb +3 -1
  15. data/lib/evm/config.rb +43 -0
  16. data/lib/evm/git.rb +1 -1
  17. data/lib/evm/package.rb +26 -11
  18. data/lib/evm/remote_file.rb +9 -55
  19. data/lib/evm/tar_file.rb +1 -1
  20. data/spec/evm/builder_spec.rb +209 -0
  21. data/spec/evm/cli_spec.rb +53 -0
  22. data/spec/evm/command/bin_spec.rb +32 -0
  23. data/spec/evm/command/config_spec.rb +34 -0
  24. data/spec/evm/command/disuse_spec.rb +19 -0
  25. data/spec/evm/command/install_spec.rb +103 -0
  26. data/spec/evm/command/list_spec.rb +36 -0
  27. data/spec/evm/command/uninstall_spec.rb +35 -0
  28. data/spec/evm/command/use_spec.rb +32 -0
  29. data/spec/evm/config_spec.rb +36 -0
  30. data/spec/evm/evm_spec.rb +11 -0
  31. data/spec/evm/git_spec.rb +39 -0
  32. data/spec/evm/os_spec.rb +47 -0
  33. data/spec/evm/package_spec.rb +274 -0
  34. data/spec/evm/recipe_spec.rb +47 -0
  35. data/spec/evm/remote_file_spec.rb +47 -0
  36. data/spec/evm/system_spec.rb +36 -0
  37. data/spec/evm/tar_file_spec.rb +21 -0
  38. data/spec/spec_helper.rb +13 -0
  39. metadata +29 -17
  40. data/lib/evm/exception.rb +0 -4
  41. data/lib/evm/progress_bar.rb +0 -37
  42. data/recipes/emacs-23.4-bin.rb +0 -7
  43. data/recipes/emacs-23.4.rb +0 -27
  44. data/recipes/emacs-24.1-bin.rb +0 -7
  45. data/recipes/emacs-24.1.rb +0 -24
  46. data/recipes/emacs-24.2-bin.rb +0 -7
  47. data/recipes/emacs-24.2.rb +0 -24
  48. data/recipes/emacs-24.3-bin.rb +0 -7
  49. data/recipes/emacs-24.3.rb +0 -24
  50. data/recipes/emacs-24.4-bin.rb +0 -7
  51. data/recipes/emacs-24.4.rb +0 -24
  52. 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
@@ -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