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,189 @@
1
+
2
+ describe Hem::Ui do
3
+ def test_ui opts = {}
4
+ opts = {
5
+ :answer => "",
6
+ :output => StringIO.new,
7
+ :error => StringIO.new,
8
+ :eof => false
9
+ }.merge(opts)
10
+
11
+ input = StringIO.new
12
+ input << opts[:answer]
13
+ input.rewind unless opts[:eof]
14
+ Hem.ui = ui = Hem::Ui.new(input, opts[:output], opts[:error])
15
+ ui.interactive = true
16
+ return ui
17
+ end
18
+
19
+ before do
20
+ HighLine.use_color = false
21
+ Hem.logger = Logger.new(nil)
22
+ Hem.logger.level = Logger::WARN
23
+ double(Hem.logger)
24
+ end
25
+
26
+ describe "initialization" do
27
+ it "should provide default color scheme"
28
+ end
29
+
30
+ describe "ask" do
31
+ it "should return default if in non-interactive mode" do
32
+ ui = test_ui()
33
+ ui.interactive = false
34
+ ui.ask("Question", :default => "default").should match "default"
35
+ end
36
+
37
+ it "should raise error if no default provided in non-interactive mode" do
38
+ ui = test_ui(:answer => "Answer\n")
39
+ ui.interactive = false
40
+ expect { ui.ask("Question") }.to raise_exception(Hem::NonInteractiveError)
41
+ end
42
+
43
+ it "should format prompt to include default if provided" do
44
+ output = StringIO.new
45
+ output.should_receive(:write).with(/Question \[default\]:/)
46
+ test_ui(:output => output).ask("Question", :default => "default")
47
+ end
48
+
49
+ it "should use default answer if given answer is empty" do
50
+ test_ui(:answer => "\n").ask("Question", :default => "default").should match "default"
51
+ end
52
+
53
+ it "should handle stdin EOF (Ctrl+d)" do
54
+ test_ui(:eof => true).ask("Question").should be_empty
55
+ end
56
+
57
+ it "should always return an instance of String" do
58
+ test_ui(:answer => "Answer\n").ask("Question").should be_an_instance_of String
59
+ test_ui(:answer => "\n").ask("Question", :default => "").should be_an_instance_of String
60
+ test_ui(:answer => "\x04").ask("Question").should be_an_instance_of String
61
+ end
62
+
63
+ it "should support hidden text for password inputs"
64
+ end
65
+
66
+ describe "ask_choice" do
67
+ it "should return default if in non-interactive mode" do
68
+ ui = test_ui()
69
+ ui.interactive = false
70
+ ui.ask_choice("Question", ['default', 'non-default'], :default => "default").should match "default"
71
+ end
72
+
73
+ it "should raise error if no default provided in non-interactive mode" do
74
+ ui = test_ui(:answer => "Answer\n")
75
+ ui.interactive = false
76
+ expect { ui.ask_choice("Question", ['one', 'two']) }.to raise_exception(Hem::NonInteractiveError)
77
+ end
78
+
79
+ it "should format prompt to include default if provided"
80
+
81
+ it "should give a choice prompt with each option in"
82
+
83
+ it "should convert a number choice to its value if given" do
84
+ test_ui(:answer => "2\n").ask_choice("Question", ['default', 'non-default'], :default => "default").should match "non-default"
85
+ end
86
+
87
+ it "should use default answer if given answer is empty" do
88
+ test_ui(:answer => "\n").ask_choice("Question", ['default', 'non-default'], :default => "default").should match "default"
89
+ end
90
+
91
+ it "should handle stdin EOF (Ctrl+d)" do
92
+ test_ui(:eof => true).ask_choice("Question", ['default', 'non-default']).should be_empty
93
+ end
94
+
95
+ it "should always return an instance of String" do
96
+ test_ui(:answer => "Answer\n").ask_choice("Question", ['Answer']).should be_an_instance_of String
97
+ test_ui(:answer => "\n").ask_choice("Question", ['Answer'], :default => "").should be_an_instance_of String
98
+ test_ui(:answer => "\x04").ask_choice("Question", ['Answer']).should be_an_instance_of String
99
+ end
100
+ end
101
+
102
+ describe "color" do
103
+ it "should format message with ansi style" do
104
+ ui = test_ui
105
+ ui.use_color true
106
+ ui.color("test", :red).should match /\e\[31mtest\e\[0m/
107
+ end
108
+ end
109
+
110
+ describe "use_color" do
111
+ it "should set the use of color" do
112
+ ui = test_ui
113
+ ui.use_color true
114
+ ui.color("test", :red).should match /\e\[31mtest\e\[0m/
115
+ ui.use_color false
116
+ ui.color("test", :red).should match /^test$/
117
+ end
118
+ end
119
+
120
+ describe "color_scheme" do
121
+ it "should set the global color scheme if argument provided"
122
+ it "should return the global color scheme"
123
+ end
124
+
125
+ describe "debug" do
126
+ it "should send message to stdout" do
127
+ output = StringIO.new
128
+ output.should receive(:puts).with("test")
129
+ test_ui(:output => output).debug("test")
130
+ end
131
+
132
+ it "should log to logger" do
133
+ Hem.logger.should_receive(:debug).with("test")
134
+ test_ui.debug("test")
135
+ end
136
+ end
137
+
138
+ describe "info" do
139
+ it "should send message to stdout" do
140
+ output = StringIO.new
141
+ output.should receive(:puts).with("test")
142
+ test_ui(:output => output).info("test")
143
+ end
144
+
145
+ it "should log to logger" do
146
+ Hem.logger.should_receive(:debug).with("test")
147
+ test_ui.info("test")
148
+ end
149
+ end
150
+
151
+ describe "warning" do
152
+ it "should send message to stderr" do
153
+ error = StringIO.new
154
+ error.should receive(:puts).with("test")
155
+ test_ui(:error => error).warning("test")
156
+ end
157
+
158
+ it "should log to logger" do
159
+ Hem.logger.should_receive(:debug).with("test")
160
+ test_ui.warning("test")
161
+ end
162
+ end
163
+
164
+ describe "error" do
165
+ it "should send message to stderr" do
166
+ error = StringIO.new
167
+ error.should receive(:puts).with("test")
168
+ test_ui(:error => error).error("test")
169
+ end
170
+
171
+ it "should log to logger" do
172
+ Hem.logger.should_receive(:debug).with("test")
173
+ test_ui.error("test")
174
+ end
175
+ end
176
+
177
+ describe "success" do
178
+ it "should send message to stdout" do
179
+ output = StringIO.new
180
+ output.should receive(:puts).with("test")
181
+ test_ui(:output => output).success("test")
182
+ end
183
+
184
+ it "should log to logger" do
185
+ Hem.logger.should_receive(:debug).with("test")
186
+ test_ui.success("test")
187
+ end
188
+ end
189
+ end
@@ -0,0 +1,74 @@
1
+
2
+ describe Hem do
3
+ describe "in_project?" do
4
+ it "should return true if project path detected" do
5
+ Hem.project_path = "test"
6
+ Hem.in_project?.should be true
7
+ end
8
+
9
+ it "should return false if no project path detected" do
10
+ Hem.project_path = false
11
+ Hem.in_project?.should be false
12
+ end
13
+ end
14
+
15
+ describe "progress" do
16
+ def progress_mock file, increment, total, type
17
+ out = double(StringIO.new).as_null_object
18
+ out.stub(:tty?).and_return(true)
19
+ Hem.progress(file, increment, total, type, :throttle_rate => nil, :output => out)
20
+ end
21
+
22
+ before do
23
+ Hem.project_bar_cache = {}
24
+ end
25
+
26
+ it "should create new progress bar if one does not exist" do
27
+ bar = progress_mock("test", 0, 10, :update)
28
+ bar.to_s.should match /^test.*0%/
29
+ end
30
+
31
+ it "should force width to 79 if windows" do
32
+ Gem.should_receive(:win_platform?).and_return(true)
33
+ bar = progress_mock("test:79", 0, 10, :update)
34
+ bar.to_s.length.should eq 79
35
+ end
36
+
37
+ it "should update progress bar if type :update" do
38
+ bar = progress_mock("test:update", 0, 10, :update)
39
+ bar.to_s.should match /^test:update.*0%/
40
+
41
+ Hem.progress("test:update", 1, 10, :update)
42
+ bar.to_s.should match /^test.update.*10%/
43
+ end
44
+
45
+ it "should increment progress by specified amount if type :update" do
46
+ bar = progress_mock("test:increment", 0, 10, :update)
47
+ bar.to_s.should match /^test:increment.*0%/
48
+
49
+ Hem.progress("test:increment", 1, 10, :update)
50
+ bar.to_s.should match /^test:increment.*10%/
51
+
52
+ Hem.progress("test:increment", 1, 10, :update)
53
+ bar.to_s.should match /^test:increment.*20%/
54
+ end
55
+
56
+ it "should finalize progress bar if type :finish" do
57
+ bar = progress_mock("test:finish", 0, 10, :update)
58
+ bar.to_s.should match /^test:finish.*0%/
59
+ Hem.progress("test:finish", 10, 10, :update)
60
+ Hem.progress("test:finish", 10, 10, :finish)
61
+ bar.to_s.should match /^test:finish.*100%.*Time/
62
+ end
63
+
64
+ it "should set fixed format" do
65
+ bar = progress_mock("test:format", 1, 10, :update)
66
+ bar.to_s.should match /^test:format \[=+\s+\]\s+10%\s+ETA: 00:00:00/
67
+ end
68
+
69
+ it "should use filename as title" do
70
+ bar = progress_mock("some/path/to/filename.ext", 1, 10, :update)
71
+ bar.to_s.should match /^filename\.ext/
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,12 @@
1
+ require 'simplecov'
2
+
3
+ SimpleCov.start do
4
+ add_filter "spec/"
5
+ end
6
+
7
+ require 'hem'
8
+ require 'fakefs/safe'
9
+
10
+ RSpec.configure do |c|
11
+ c.treat_symbols_as_metadata_keys_with_true_values = true
12
+ end