hem 1.0.1.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +10 -0
  3. data/.gitignore +3 -0
  4. data/.rspec +2 -0
  5. data/CHANGELOG.md +125 -0
  6. data/DoD.md +5 -0
  7. data/Gemfile +4 -0
  8. data/Gemfile.lock +71 -0
  9. data/Guardfile +14 -0
  10. data/Hemfile +43 -0
  11. data/LICENSE +21 -0
  12. data/README.md +42 -0
  13. data/Rakefile +23 -0
  14. data/bin/hem +64 -0
  15. data/features/deps.feature +43 -0
  16. data/features/hem/basic.feature +43 -0
  17. data/features/hem/help.feature +16 -0
  18. data/features/hem/subcommands.feature +15 -0
  19. data/features/seed/plant.feature +64 -0
  20. data/features/step_definitions/env.rb +6 -0
  21. data/features/step_definitions/seed.rb +11 -0
  22. data/features/support/env.rb +6 -0
  23. data/hem.gemspec +47 -0
  24. data/lib/hem/asset_applicator.rb +33 -0
  25. data/lib/hem/asset_applicators/files.rb +5 -0
  26. data/lib/hem/asset_applicators/sqldump.rb +38 -0
  27. data/lib/hem/cli.rb +252 -0
  28. data/lib/hem/config/file.rb +22 -0
  29. data/lib/hem/config.rb +5 -0
  30. data/lib/hem/error_handlers/debug.rb +12 -0
  31. data/lib/hem/error_handlers/exit_code_map.rb +17 -0
  32. data/lib/hem/error_handlers/friendly.rb +58 -0
  33. data/lib/hem/errors.rb +89 -0
  34. data/lib/hem/help_formatter.rb +118 -0
  35. data/lib/hem/helper/file_locator.rb +44 -0
  36. data/lib/hem/helper/github.rb +10 -0
  37. data/lib/hem/helper/http_download.rb +41 -0
  38. data/lib/hem/helper/shell.rb +101 -0
  39. data/lib/hem/helper/vm_command.rb +30 -0
  40. data/lib/hem/lib/github/api.rb +48 -0
  41. data/lib/hem/lib/github/client.rb +52 -0
  42. data/lib/hem/lib/host_check/deps.rb +39 -0
  43. data/lib/hem/lib/host_check/git.rb +76 -0
  44. data/lib/hem/lib/host_check/ruby.rb +53 -0
  45. data/lib/hem/lib/host_check/vagrant.rb +45 -0
  46. data/lib/hem/lib/host_check.rb +34 -0
  47. data/lib/hem/lib/s3/local/file.rb +40 -0
  48. data/lib/hem/lib/s3/local/iohandler.rb +36 -0
  49. data/lib/hem/lib/s3/remote/file.rb +57 -0
  50. data/lib/hem/lib/s3/remote/iohandler.rb +38 -0
  51. data/lib/hem/lib/s3/sync.rb +134 -0
  52. data/lib/hem/lib/seed/project.rb +71 -0
  53. data/lib/hem/lib/seed/replacer.rb +56 -0
  54. data/lib/hem/lib/seed/seed.rb +111 -0
  55. data/lib/hem/lib/self_signed_cert_generator.rb +38 -0
  56. data/lib/hem/lib/vm/command.rb +131 -0
  57. data/lib/hem/lib/vm/inspector.rb +73 -0
  58. data/lib/hem/logging.rb +20 -0
  59. data/lib/hem/metadata.rb +42 -0
  60. data/lib/hem/null.rb +31 -0
  61. data/lib/hem/patches/deepstruct.rb +21 -0
  62. data/lib/hem/patches/rake.rb +101 -0
  63. data/lib/hem/patches/rubygems.rb +6 -0
  64. data/lib/hem/patches/slop.rb +69 -0
  65. data/lib/hem/paths.rb +96 -0
  66. data/lib/hem/tasks/assets.rb +92 -0
  67. data/lib/hem/tasks/config.rb +15 -0
  68. data/lib/hem/tasks/deps.rb +103 -0
  69. data/lib/hem/tasks/exec.rb +3 -0
  70. data/lib/hem/tasks/magento.rb +281 -0
  71. data/lib/hem/tasks/ops.rb +6 -0
  72. data/lib/hem/tasks/pr.rb +45 -0
  73. data/lib/hem/tasks/seed.rb +61 -0
  74. data/lib/hem/tasks/self.rb +45 -0
  75. data/lib/hem/tasks/shell_init.rb +25 -0
  76. data/lib/hem/tasks/system/completions.rb +76 -0
  77. data/lib/hem/tasks/system.rb +18 -0
  78. data/lib/hem/tasks/tools.rb +17 -0
  79. data/lib/hem/tasks/vm.rb +140 -0
  80. data/lib/hem/ui.rb +182 -0
  81. data/lib/hem/util.rb +76 -0
  82. data/lib/hem/version.rb +3 -0
  83. data/lib/hem.rb +72 -0
  84. data/lib/hobo/tasks/magento.rb +3 -0
  85. data/spec/hem/asset_applicator_spec.rb +30 -0
  86. data/spec/hem/cli_spec.rb +166 -0
  87. data/spec/hem/config/file_spec.rb +55 -0
  88. data/spec/hem/error_handlers/debug_spec.rb +43 -0
  89. data/spec/hem/error_handlers/friendly_spec.rb +97 -0
  90. data/spec/hem/error_spec.rb +0 -0
  91. data/spec/hem/help_formatter_spec.rb +162 -0
  92. data/spec/hem/helpers/file_locator_spec.rb +11 -0
  93. data/spec/hem/helpers/github_spec.rb +31 -0
  94. data/spec/hem/helpers/shell_spec.rb +22 -0
  95. data/spec/hem/helpers/vm_command_spec.rb +96 -0
  96. data/spec/hem/lib/github/api_spec.rb +92 -0
  97. data/spec/hem/lib/s3/sync_spec.rb +16 -0
  98. data/spec/hem/lib/seed/project_spec.rb +80 -0
  99. data/spec/hem/lib/seed/replacer_spec.rb +45 -0
  100. data/spec/hem/lib/seed/seed_spec.rb +127 -0
  101. data/spec/hem/logging_spec.rb +27 -0
  102. data/spec/hem/metadata_spec.rb +55 -0
  103. data/spec/hem/null_spec.rb +30 -0
  104. data/spec/hem/patches/rake_spec.rb +230 -0
  105. data/spec/hem/paths_spec.rb +75 -0
  106. data/spec/hem/ui_spec.rb +189 -0
  107. data/spec/hem/util_spec.rb +74 -0
  108. data/spec/spec_helper.rb +12 -0
  109. data/ssl/ca-bundle-s3.crt +3554 -0
  110. data/test_files/vagrant_fail/vagrant +2 -0
  111. metadata +339 -0
@@ -0,0 +1,80 @@
1
+
2
+ describe Hem::Lib::Seed::Project do
3
+ pwd = nil
4
+ tmp_dir = nil
5
+ default_config = {}
6
+
7
+ before do
8
+ tmp_dir = Dir.mktmpdir
9
+ pwd = Dir.pwd
10
+ Dir.chdir tmp_dir
11
+ FileUtils.mkdir_p "project_path"
12
+ FileUtils.touch "project_path/test"
13
+ Hem.ui = double(Hem::Ui).as_null_object
14
+ default_config = {
15
+ :config_class => double(Hem::Config::File).as_null_object,
16
+ :replacer => double(Hem::Lib::Seed::Replacer.new).as_null_object
17
+ }
18
+ end
19
+
20
+ after do
21
+ Dir.chdir pwd
22
+ FileUtils.remove_entry tmp_dir
23
+ end
24
+
25
+ describe "setup" do
26
+ it "should update seed before use" do
27
+ seed = double(Hem::Lib::Seed::Seed).as_null_object
28
+ seed.should_receive :update
29
+
30
+ project = Hem::Lib::Seed::Project.new(default_config)
31
+
32
+ project.setup(seed, { :project_path => "project_path", :seed => {}, :git_url => '.' })
33
+ end
34
+
35
+ it "should export seed to project directory" do
36
+ seed = double(Hem::Lib::Seed::Seed).as_null_object
37
+ seed.should_recieve(:export).with("project_path")
38
+
39
+ project = Hem::Lib::Seed::Project.new(default_config)
40
+
41
+ project.setup(seed, { :project_path => "project_path", :seed => {}, :git_url => '.' })
42
+ end
43
+
44
+ it "should save config in project" do
45
+ seed = double(Hem::Lib::Seed::Seed).as_null_object
46
+ seed.should_recieve :export, "project_path"
47
+
48
+ config_class = double(Hem::Config::File).as_null_object
49
+ config_class.should_recieve(:save).with("project_config_file")
50
+
51
+ project = Hem::Lib::Seed::Project.new(default_config.merge({ :project_config_file => "project_config_file" }))
52
+
53
+ project.setup(seed, { :project_path => "project_path", :seed => {}, :git_url => '.' })
54
+ end
55
+
56
+ it "should initialize the project git repository" do
57
+ seed = double(Hem::Lib::Seed::Seed).as_null_object
58
+
59
+ project = Hem::Lib::Seed::Project.new(default_config)
60
+
61
+ project.setup(seed, { :project_path => "project_path", :seed => {}, :git_url => '.' })
62
+ expect { Hem::Helper.shell("cd project_path && git status")}.not_to raise_error
63
+ end
64
+
65
+ it "should add the git url as the origin remote" do
66
+ seed = double(Hem::Lib::Seed::Seed).as_null_object
67
+
68
+ project = Hem::Lib::Seed::Project.new(default_config)
69
+
70
+ project.setup(seed, { :project_path => "project_path", :seed => {}, :git_url => 'remote_url' })
71
+ Hem::Helper.shell("cd project_path && git remote show -n origin", :capture => true).should match /remote_url/
72
+ end
73
+
74
+ it "should load seed init file if present"
75
+ it "should remove seed init file"
76
+
77
+ it "should set hostname in config"
78
+ it "should set asset bucket in config"
79
+ end
80
+ end
@@ -0,0 +1,45 @@
1
+
2
+ describe Hem::Lib::Seed::Replacer do
3
+ before do
4
+ FakeFS.activate!
5
+ Dir.mkdir("bin")
6
+ Dir.mkdir("dir")
7
+ {
8
+ "./test1" => "some {{test}} is here",
9
+ "./test2" => "no test is here",
10
+ "./dir/test" => "subdir {{test}}",
11
+ "./dir/nested" => "nested {{nested.test}}",
12
+ "./dir/no-utf" => "\xc2 {{test}}", # invalid utf should be skipped
13
+ "./bin/test" => "{{test}}" # bin/ should be ignored
14
+ }.each do |name, content|
15
+ File.write(name, content)
16
+ end
17
+
18
+ @replacer = Hem::Lib::Seed::Replacer.new
19
+ end
20
+
21
+ after do
22
+ FakeFS::FileSystem.clear
23
+ FakeFS.deactivate!
24
+ end
25
+
26
+ it "should respect exclude directories" do
27
+ files = @replacer.replace(".", { :test => 'badger' })
28
+ File.read("./bin/test").should eq "{{test}}"
29
+ end
30
+
31
+ it "should replace placeholders in files" do
32
+ files = @replacer.replace(".", { :test => 'badger' })
33
+ expect(files.sort).to eq(["./dir/test", "./test1"])
34
+
35
+ File.read("./test1").should eq "some badger is here"
36
+ File.read("./dir/test").should eq "subdir badger"
37
+ end
38
+
39
+ it "should handle nested hashes" do
40
+ files = @replacer.replace(".", { :nested => { :test => 'nested' } })
41
+ expect(files.sort).to eq(["./dir/nested"])
42
+
43
+ File.read("./dir/nested").should eq "nested nested"
44
+ end
45
+ end
@@ -0,0 +1,127 @@
1
+
2
+ describe Hem::Lib::Seed::Seed do
3
+ pwd = nil
4
+ tmp_dir = nil
5
+
6
+ before do
7
+ tmp_dir = Dir.mktmpdir
8
+ pwd = Dir.pwd
9
+ Dir.chdir tmp_dir
10
+ Hem.ui = double(Hem::Ui).as_null_object
11
+ end
12
+
13
+ after do
14
+ Dir.chdir pwd
15
+ FileUtils.remove_entry tmp_dir
16
+ end
17
+
18
+ def create_test_repo path, content
19
+ FileUtils.mkdir_p path
20
+ Dir.chdir path do
21
+ `git init`
22
+ `echo "#{content}" > test`
23
+ `git add *`
24
+ `git commit -m "test"`
25
+ end
26
+ end
27
+
28
+ def tag_repo path, tag
29
+ Dir.chdir path do
30
+ `git tag #{tag}`
31
+ end
32
+ end
33
+
34
+ describe "update", :integration do
35
+ it "should fetch the seed if it does not exist locally" do
36
+ # Create test repo as seed remote
37
+ remote_seed_path = File.join(tmp_dir, "seed_1")
38
+ create_test_repo remote_seed_path, "does not exist locally"
39
+
40
+ seed = Hem::Lib::Seed::Seed.new 'seeds/seed_1', remote_seed_path
41
+ seed.update
42
+
43
+ # Repo is bare so we need to use git show to get contents
44
+ `cd seeds/seed_1 && git show HEAD:test`.strip.should eq "does not exist locally"
45
+ end
46
+
47
+ it "should update the seed if it exists locally" do
48
+ # Create test repo as seed remote
49
+ remote_seed_path = File.join(tmp_dir, "seed_2")
50
+ create_test_repo remote_seed_path, "does exist locally"
51
+
52
+ # Clone seed to seed cache directory
53
+ FileUtils.mkdir_p "seeds"
54
+ `cd seeds && git clone #{remote_seed_path} seed_2 --mirror 2> /dev/null`
55
+
56
+ # Update seed origin repo to give test something to update
57
+ `cd seed_2 && echo "updated" > test && git add test && git commit -m "test"`
58
+
59
+ seed = Hem::Lib::Seed::Seed.new 'seeds/seed_2', remote_seed_path
60
+ seed.update
61
+
62
+ # Repo is bare so we need to use git show to get contents
63
+ `cd seeds/seed_2 && git show HEAD:test`.strip.should eq "updated"
64
+ end
65
+ end
66
+
67
+ describe "export", :integration do
68
+ it "should export the seed contents to specified directory" do
69
+ # Create test repo as seed remote
70
+ remote_seed_path = File.join(tmp_dir, "seed_3")
71
+ create_test_repo remote_seed_path, "exported"
72
+
73
+ # Update seed and export
74
+ seed = Hem::Lib::Seed::Seed.new 'seeds/seed_3', remote_seed_path
75
+ seed.update
76
+ seed.export "exported"
77
+
78
+ File.read("exported/test").strip.should eq "exported"
79
+ File.exists?("exported/.git").should be false
80
+ end
81
+
82
+ it "should export seed submodules to the specified directory"
83
+ it "should export a specifified git :ref"
84
+ end
85
+
86
+ describe "tags" do
87
+ it "should return no tags if the repository doesn't have any" do
88
+ # Create test repo as seed remote
89
+ remote_seed_path = File.join(tmp_dir, "seed_5")
90
+ create_test_repo remote_seed_path, "version_test"
91
+
92
+ # Update seed and export
93
+ seed = Hem::Lib::Seed::Seed.new 'seeds/seed_3', remote_seed_path
94
+ seed.update
95
+
96
+ seed.tags.should eq []
97
+ end
98
+
99
+ it "should return a list of tags if there are any" do
100
+ # Create test repo as seed remote
101
+ remote_seed_path = File.join(tmp_dir, "seed_5")
102
+ create_test_repo remote_seed_path, "version_test"
103
+ tag_repo remote_seed_path, "1.2.3"
104
+ tag_repo remote_seed_path, "1.2.4"
105
+
106
+ # Update seed and export
107
+ seed = Hem::Lib::Seed::Seed.new 'seeds/seed_3', remote_seed_path
108
+ seed.update
109
+
110
+ seed.tags.should eq ['1.2.3', '1.2.4']
111
+ end
112
+ end
113
+
114
+ describe "version", :integration do
115
+ it "should return the git sha of the seed" do
116
+ # Create test repo as seed remote
117
+ remote_seed_path = File.join(tmp_dir, "seed_4")
118
+ create_test_repo remote_seed_path, "version_test"
119
+
120
+ # Update seed and export
121
+ seed = Hem::Lib::Seed::Seed.new 'seeds/seed_4', remote_seed_path
122
+ seed.update
123
+
124
+ seed.version.should eq `cd seeds/seed_4 && git rev-parse --short HEAD`.strip
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,27 @@
1
+
2
+ describe Hem::Logging do
3
+ before do
4
+ Hem.logger = nil
5
+ end
6
+
7
+ describe "module logger" do
8
+ it "should return global logger instance" do
9
+ Hem.logger = "TEST"
10
+ class LoggerTest
11
+ include Hem::Logging
12
+ end
13
+
14
+ LoggerTest.new.logger.should match "TEST"
15
+ end
16
+ end
17
+
18
+ describe "global logger" do
19
+ it "should initialize to STDOUT logger" do
20
+ Hem::Logging.logger.instance_variable_get('@logdev').dev.should be STDOUT
21
+ end
22
+
23
+ it "should initialize to WARN log level" do
24
+ Hem::Logging.logger.level.should eq Logger::WARN
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,55 @@
1
+
2
+ describe Hem::Metadata do
3
+ before do
4
+ Hem::Metadata.store = {}
5
+ Hem::Metadata.metadata = {}
6
+ Hem::Metadata.defaults = {}
7
+ end
8
+
9
+ describe "store" do
10
+ it "should expose storage" do
11
+ Hem::Metadata.store[:opts] = {}
12
+ Hem::Metadata.store[:opts].should be {}
13
+ end
14
+ end
15
+
16
+ describe "metadata" do
17
+ it "should expose metadata" do
18
+ Hem::Metadata.store[:type] = "value"
19
+ Hem::Metadata.add "key", :type
20
+ Hem::Metadata.metadata["key"][:type].should match "value"
21
+ end
22
+ end
23
+
24
+ describe "add" do
25
+ it "should assign store value to task metadata for type" do
26
+ Hem::Metadata.store[:type] = "value"
27
+ Hem::Metadata.add "key", :type
28
+ Hem::Metadata.metadata["key"][:type].should match "value"
29
+ end
30
+
31
+ it "should set store value to default after add" do
32
+ Hem::Metadata.default :type, "value"
33
+ Hem::Metadata.add "key", :type
34
+ Hem::Metadata.metadata["key"][:type].should match "value"
35
+ end
36
+ end
37
+
38
+ describe "default" do
39
+ it "should store default value for type" do
40
+ Hem::Metadata.default :type, "default"
41
+ Hem::Metadata.add "key", :type
42
+ Hem::Metadata.metadata["key"][:type].should match "default"
43
+ end
44
+ end
45
+
46
+ describe "reset" do
47
+ it "should reset all current store values to defaults" do
48
+ Hem::Metadata.default :type, "default"
49
+ Hem::Metadata.add "key", :type
50
+ Hem::Metadata.add "key", :other_type
51
+ Hem::Metadata.reset_store
52
+ Hem::Metadata.store.should eq({ :type => "default" })
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,30 @@
1
+
2
+ describe Hem::Null do
3
+ it "should return itself for any method call" do
4
+ null = Hem::Null.new
5
+ null["test"].should eq null
6
+ null.test.should eq null
7
+ (null + null).should eq null
8
+ end
9
+
10
+ it "should convert to identity of types" do
11
+ null = Hem::Null.new
12
+ null.to_s.should match ""
13
+ null.to_i.should eq 0
14
+ null.to_f.should eq 0.0
15
+ null.to_a.should eq []
16
+ end
17
+
18
+ describe "maybe" do
19
+ it "should return nil if nil?" do
20
+ maybe(nil).should eq nil
21
+ maybe(Hem::Null.new).should eq nil
22
+ end
23
+
24
+ it "should return value for !nil?" do
25
+ maybe(true).should eq true
26
+ maybe("").should eq ""
27
+ maybe(1).should eq 1
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,230 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rake do
4
+ cli = nil
5
+
6
+ before do
7
+ Rake::Task.clear
8
+ Hem::Metadata.default :opts, []
9
+ Hem::Metadata.default :desc, nil
10
+ Hem::Metadata.reset_store
11
+ Hem::Metadata.metadata = {}
12
+
13
+ Hem.ui = double(Hem::Ui).as_null_object
14
+ help = double(Hem::HelpFormatter).as_null_object
15
+ host_check = double(Hem::Lib::HostCheck).as_null_object
16
+ cli = Hem::Cli.new help: help, host_check: host_check
17
+
18
+ FakeFS.activate!
19
+ end
20
+
21
+ after do
22
+ FakeFS::FileSystem.clear
23
+ FakeFS.deactivate!
24
+ end
25
+
26
+ describe "before hook" do
27
+
28
+ it "should run block type task before specified task" do
29
+ File.write('Hemfile', "
30
+ task 'block-test' do
31
+ Hem.ui.info 'test'
32
+ end
33
+ before 'block-test' do
34
+ Hem.ui.info 'before'
35
+ end"
36
+ )
37
+
38
+ Hem.ui.should_receive(:info).with('before')
39
+ Hem.ui.should_receive(:info).with('test')
40
+
41
+ cli.start ['block-test']
42
+ end
43
+
44
+ it "should run string type task before specified task" do
45
+ File.write('Hemfile', "
46
+ task 'string-test' do
47
+ Hem.ui.info 'test'
48
+ end
49
+ task 'before' do
50
+ Hem.ui.info 'before'
51
+ end
52
+ before 'string-test', 'before'
53
+ "
54
+ )
55
+
56
+ Hem.ui.should_receive(:info).with('before')
57
+ Hem.ui.should_receive(:info).with('test')
58
+
59
+ cli.start ['string-test']
60
+ end
61
+
62
+ it "should run multiple string type tasks before specified task" do
63
+ File.write('Hemfile', "
64
+ task 'multiple-string-test' do
65
+ Hem.ui.info 'test'
66
+ end
67
+ task 'before1' do
68
+ Hem.ui.info 'before1'
69
+ end
70
+ task 'before2' do
71
+ Hem.ui.info 'before2'
72
+ end
73
+ before 'multiple-string-test', ['before1', 'before2']
74
+ "
75
+ )
76
+
77
+ Hem.ui.should_receive(:info).with('before1')
78
+ Hem.ui.should_receive(:info).with('before2')
79
+ Hem.ui.should_receive(:info).with('test')
80
+
81
+ cli.start ['multiple-string-test']
82
+ end
83
+
84
+ it "should maintain all task metadata" do
85
+ File.write('Hemfile', "
86
+ option '--test', 'A test'
87
+ desc 'A description'
88
+ long_desc 'A long description'
89
+ project_only
90
+ hidden
91
+ task 'metadata-test' do
92
+ Hem.ui.info 'test'
93
+ end
94
+
95
+ task 'before' do
96
+ Hem.ui.info 'before'
97
+ end
98
+
99
+ before 'metadata-test', 'before'
100
+ "
101
+ )
102
+
103
+ cli.start ['metadata-test']
104
+
105
+ Hem::Metadata.metadata['metadata-test'][:opts].should eql([["--test", "A test"]])
106
+ Hem::Metadata.metadata['metadata-test'][:desc].should eql("A description")
107
+ Hem::Metadata.metadata['metadata-test'][:long_desc].should eql("A long description")
108
+ Hem::Metadata.metadata['metadata-test'][:project_only].should be(true)
109
+ Hem::Metadata.metadata['metadata-test'][:hidden].should be(true)
110
+ end
111
+ end
112
+
113
+ describe "after hook" do
114
+ it "should run block type task after specified task" do
115
+ File.write('Hemfile', "
116
+ task 'block-test' do
117
+ Hem.ui.info 'test'
118
+ end
119
+ after 'block-test' do
120
+ Hem.ui.info 'after'
121
+ end"
122
+ )
123
+
124
+ Hem.ui.should_receive(:info).with('test')
125
+ Hem.ui.should_receive(:info).with('after')
126
+
127
+ cli.start ['block-test']
128
+ end
129
+
130
+ it "should run string type task after specified task" do
131
+ File.write('Hemfile', "
132
+ task 'string-test' do
133
+ Hem.ui.info 'test'
134
+ end
135
+ task 'after' do
136
+ Hem.ui.info 'after'
137
+ end
138
+ after 'string-test', 'after'
139
+ "
140
+ )
141
+
142
+ Hem.ui.should_receive(:info).with('test')
143
+ Hem.ui.should_receive(:info).with('after')
144
+
145
+ cli.start ['string-test']
146
+ end
147
+
148
+ it "should run multiple string type tasks after specified task" do
149
+ File.write('Hemfile', "
150
+ task 'multiple-string-test' do
151
+ Hem.ui.info 'test'
152
+ end
153
+ task 'after1' do
154
+ Hem.ui.info 'after1'
155
+ end
156
+ task 'after2' do
157
+ Hem.ui.info 'after2'
158
+ end
159
+ after 'multiple-string-test', ['after1', 'after2']
160
+ "
161
+ )
162
+
163
+ Hem.ui.should_receive(:info).with('test')
164
+ Hem.ui.should_receive(:info).with('after1')
165
+ Hem.ui.should_receive(:info).with('after2')
166
+
167
+ cli.start ['multiple-string-test']
168
+ end
169
+
170
+ it "should maintain all task metadata" do
171
+ File.write('Hemfile', "
172
+ option '--test', 'A test'
173
+ desc 'A description'
174
+ long_desc 'A long description'
175
+ project_only
176
+ hidden
177
+ task :'metadata-test' do
178
+ Hem.ui.info 'test'
179
+ end
180
+
181
+ task 'after' do
182
+ Hem.ui.info 'after'
183
+ end
184
+
185
+ after :'metadata-test', 'after'
186
+ "
187
+ )
188
+
189
+ cli.start ['metadata-test']
190
+
191
+ Hem::Metadata.metadata['metadata-test'][:opts].should eql([["--test", "A test"]])
192
+ Hem::Metadata.metadata['metadata-test'][:desc].should eql("A description")
193
+ Hem::Metadata.metadata['metadata-test'][:long_desc].should eql("A long description")
194
+ Hem::Metadata.metadata['metadata-test'][:project_only].should be(true)
195
+ Hem::Metadata.metadata['metadata-test'][:hidden].should be(true)
196
+ end
197
+ end
198
+
199
+ describe 'invoke' do
200
+ it "should invoke an existing task without args" do
201
+ File.write('Hemfile', "
202
+ task 'invoke-target'do
203
+ Hem.ui.info 'invoked'
204
+ end
205
+ task 'invoker' do
206
+ invoke('invoke-target')
207
+ end
208
+ "
209
+ )
210
+
211
+ Hem.ui.should_receive(:info).with('invoked')
212
+ cli.start ['invoker']
213
+ end
214
+
215
+ it "should invoke an existing task with args" do
216
+ File.write('Hemfile', "
217
+ task 'invoke-target', [:arg1] do |task, args|
218
+ Hem.ui.info args[:arg1]
219
+ end
220
+ task 'invoker' do
221
+ invoke('invoke-target', 'arg1')
222
+ end
223
+ "
224
+ )
225
+
226
+ Hem.ui.should_receive(:info).with('arg1')
227
+ cli.start ['invoker']
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,75 @@
1
+
2
+ describe Hem do
3
+ describe 'project_path' do
4
+ before do
5
+ Hem.project_path = nil
6
+ FakeFS.activate!
7
+ end
8
+
9
+ after do
10
+ FakeFS::FileSystem.clear
11
+ FakeFS.deactivate!
12
+ end
13
+
14
+ it 'should return nil if not in project' do
15
+ Hem.project_path.should eq nil
16
+ end
17
+
18
+ it 'should return project directory if tools/hem exists' do
19
+ FileUtils.mkdir_p 'project/test/tools/hem'
20
+ Dir.chdir 'project/test' do
21
+ Hem.project_path.should eq '/project/test'
22
+ end
23
+ end
24
+
25
+ it 'should traverse up directories search for tools/hem' do
26
+ FileUtils.mkdir_p 'project/test/tools/hem'
27
+ Dir.chdir 'project/test/tools/hem' do
28
+ Hem.project_path.should eq '/project/test'
29
+ end
30
+ end
31
+
32
+ it 'should memoize project path' do
33
+ FileUtils.mkdir_p 'project/test/tools/hem'
34
+ Dir.chdir 'project/test/tools/hem' do
35
+ Hem.project_path.should eq '/project/test'
36
+ end
37
+
38
+ # We remove the hem directory to see if the path was memoized or not
39
+ FileUtils.rmdir('project/test/tools/hem')
40
+ Dir.chdir 'project/test/tools' do
41
+ Hem.project_path.should eq '/project/test'
42
+ end
43
+ end
44
+ end
45
+
46
+ describe 'config_path' do
47
+ it 'should be ~/.hem' do
48
+ Hem.config_path.should eq File.join(ENV['HOME'], '.hem')
49
+ end
50
+ end
51
+
52
+ describe 'seed_cache_path' do
53
+ it 'should be ~/.hem/seeds' do
54
+ Hem.seed_cache_path.should eq File.join(ENV['HOME'], '.hem', 'seeds')
55
+ end
56
+ end
57
+
58
+ describe 'hemfile_path' do
59
+ it 'should be project_path + Hemfile' do
60
+ Hem.hemfile_path.should eq File.join(Hem.project_path, 'Hemfile')
61
+ end
62
+ end
63
+
64
+ describe 'project_config_file' do
65
+ it 'should be project_path + tools/hem/config.yaml' do
66
+ Hem.project_config_file.should eq File.join(Hem.project_path, 'tools', 'hem', 'config.yaml')
67
+ end
68
+ end
69
+
70
+ describe 'user_config_file' do
71
+ it 'should be ~/.hem/config.yaml' do
72
+ Hem.user_config_file.should eq File.join(Hem.config_path, 'config.yaml')
73
+ end
74
+ end
75
+ end