howzit 2.1.29 → 2.1.31
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/CHANGELOG.md +95 -0
- data/README.md +5 -1
- data/Rakefile +7 -1
- data/bin/howzit +5 -0
- data/lib/howzit/buildnote.rb +23 -1
- data/lib/howzit/config.rb +21 -0
- data/lib/howzit/console_logger.rb +62 -2
- data/lib/howzit/directive.rb +137 -0
- data/lib/howzit/script_support.rb +572 -0
- data/lib/howzit/stringutils.rb +47 -5
- data/lib/howzit/task.rb +57 -4
- data/lib/howzit/topic.rb +548 -5
- data/lib/howzit/version.rb +1 -1
- data/lib/howzit.rb +8 -1
- data/spec/buildnote_spec.rb +33 -4
- data/spec/log_level_spec.rb +247 -0
- data/spec/sequential_conditional_spec.rb +319 -0
- data/spec/set_var_spec.rb +603 -0
- data/spec/stringutils_spec.rb +41 -1
- data/spec/topic_spec.rb +8 -6
- data/src/_README.md +5 -1
- metadata +10 -2
data/spec/buildnote_spec.rb
CHANGED
|
@@ -8,7 +8,7 @@ describe Howzit::BuildNote do
|
|
|
8
8
|
describe ".note_file" do
|
|
9
9
|
it "locates a build note file" do
|
|
10
10
|
expect(how.note_file).not_to be_empty
|
|
11
|
-
expect(how.note_file).to match
|
|
11
|
+
expect(how.note_file).to match(/builda.md$/)
|
|
12
12
|
end
|
|
13
13
|
end
|
|
14
14
|
|
|
@@ -16,6 +16,7 @@ describe Howzit::BuildNote do
|
|
|
16
16
|
it "finds topic containing 'bermuda'" do
|
|
17
17
|
expect(how.grep('bermuda').map { |topic| topic.title }).to include('Topic Tropic')
|
|
18
18
|
end
|
|
19
|
+
|
|
19
20
|
it "does not return non-matching topic" do
|
|
20
21
|
expect(how.grep('bermuda').map { |topic| topic.title }).not_to include('Topic Balogna')
|
|
21
22
|
end
|
|
@@ -116,8 +117,9 @@ describe Howzit::BuildNote do
|
|
|
116
117
|
it "contains 7 topics" do
|
|
117
118
|
expect(how.list_topics.count).to eq 7
|
|
118
119
|
end
|
|
120
|
+
|
|
119
121
|
it "outputs a newline-separated string for completion" do
|
|
120
|
-
expect(how.list_completions.scan(
|
|
122
|
+
expect(how.list_completions.scan("\n").count).to eq 6
|
|
121
123
|
end
|
|
122
124
|
end
|
|
123
125
|
|
|
@@ -159,7 +161,7 @@ describe Howzit::BuildNote do
|
|
|
159
161
|
|
|
160
162
|
it "falls back to fuzzy match when no exact match" do
|
|
161
163
|
Howzit.options[:matching] = 'fuzzy'
|
|
162
|
-
search_terms = ['trpc']
|
|
164
|
+
search_terms = ['trpc'] # fuzzy for 'tropic'
|
|
163
165
|
output = []
|
|
164
166
|
matches = how.send(:collect_topic_matches, search_terms, output)
|
|
165
167
|
expect(matches.count).to eq 1
|
|
@@ -228,7 +230,7 @@ describe Howzit::BuildNote do
|
|
|
228
230
|
|
|
229
231
|
it "parses required variables from template metadata" do
|
|
230
232
|
vars = how.send(:parse_template_required_vars, template_with_required.path)
|
|
231
|
-
expect(vars).to eq([
|
|
233
|
+
expect(vars).to eq(%w[repo_url author])
|
|
232
234
|
end
|
|
233
235
|
|
|
234
236
|
it "returns empty array when no required metadata" do
|
|
@@ -236,4 +238,31 @@ describe Howzit::BuildNote do
|
|
|
236
238
|
expect(vars).to eq([])
|
|
237
239
|
end
|
|
238
240
|
end
|
|
241
|
+
|
|
242
|
+
describe 'global metadata from config' do
|
|
243
|
+
it 'merges config metadata under metadata key before file metadata' do
|
|
244
|
+
# Simulate config metadata in Howzit.options
|
|
245
|
+
Howzit.options[:metadata] = { 'author' => 'Config Author', 'license' => 'MIT' }
|
|
246
|
+
|
|
247
|
+
note = <<~EONOTE
|
|
248
|
+
author: Note Author
|
|
249
|
+
|
|
250
|
+
# Test Note
|
|
251
|
+
|
|
252
|
+
## Section
|
|
253
|
+
EONOTE
|
|
254
|
+
|
|
255
|
+
Tempfile.create(['buildnote_meta', '.md']) do |f|
|
|
256
|
+
f.write(note)
|
|
257
|
+
f.flush
|
|
258
|
+
|
|
259
|
+
build = Howzit::BuildNote.new(file: f.path)
|
|
260
|
+
|
|
261
|
+
expect(build.metadata['author']).to eq('Note Author')
|
|
262
|
+
expect(build.metadata['license']).to eq('MIT')
|
|
263
|
+
end
|
|
264
|
+
ensure
|
|
265
|
+
Howzit.options[:metadata] = nil
|
|
266
|
+
end
|
|
267
|
+
end
|
|
239
268
|
end
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe 'Log Level Configuration' do
|
|
6
|
+
before do
|
|
7
|
+
Howzit.options[:include_upstream] = false
|
|
8
|
+
Howzit.options[:default] = true
|
|
9
|
+
Howzit.options[:matching] = 'partial'
|
|
10
|
+
Howzit.options[:multiple_matches] = 'choose'
|
|
11
|
+
Howzit.options[:log_level] = 1 # Default to info
|
|
12
|
+
Howzit.named_arguments = {}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
after do
|
|
16
|
+
FileUtils.rm_f('builda.md')
|
|
17
|
+
ENV.delete('HOWZIT_LOG_LEVEL')
|
|
18
|
+
Howzit.named_arguments = {}
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe '@log_level directive' do
|
|
22
|
+
it 'sets log level for subsequent tasks in a topic' do
|
|
23
|
+
note = <<~EONOTE
|
|
24
|
+
# Test
|
|
25
|
+
|
|
26
|
+
## Test Topic
|
|
27
|
+
|
|
28
|
+
@log_level(debug)
|
|
29
|
+
@run(echo "test") Test Task
|
|
30
|
+
EONOTE
|
|
31
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
32
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
33
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
34
|
+
expect(topic).not_to be_nil
|
|
35
|
+
|
|
36
|
+
# Verify log_level directive was parsed
|
|
37
|
+
log_level_directive = topic.directives.find(&:log_level?)
|
|
38
|
+
expect(log_level_directive).not_to be_nil
|
|
39
|
+
expect(log_level_directive.log_level_value).to eq('debug')
|
|
40
|
+
|
|
41
|
+
# Verify the task will get the log level
|
|
42
|
+
task_directive = topic.directives.find(&:task?)
|
|
43
|
+
expect(task_directive).not_to be_nil
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'allows changing log level multiple times in a topic' do
|
|
47
|
+
note = <<~EONOTE
|
|
48
|
+
# Test
|
|
49
|
+
|
|
50
|
+
## Test Topic
|
|
51
|
+
|
|
52
|
+
@log_level(debug)
|
|
53
|
+
@run(echo "test1") First Task
|
|
54
|
+
|
|
55
|
+
@log_level(warn)
|
|
56
|
+
@run(echo "test2") Second Task
|
|
57
|
+
|
|
58
|
+
@log_level(info)
|
|
59
|
+
@run(echo "test3") Third Task
|
|
60
|
+
EONOTE
|
|
61
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
62
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
63
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
64
|
+
|
|
65
|
+
log_level_directives = topic.directives.select(&:log_level?)
|
|
66
|
+
expect(log_level_directives.count).to eq(3)
|
|
67
|
+
expect(log_level_directives[0].log_level_value).to eq('debug')
|
|
68
|
+
expect(log_level_directives[1].log_level_value).to eq('warn')
|
|
69
|
+
expect(log_level_directives[2].log_level_value).to eq('info')
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'respects log_level directive when executing tasks' do
|
|
73
|
+
note = <<~EONOTE
|
|
74
|
+
# Test
|
|
75
|
+
|
|
76
|
+
## Test Topic
|
|
77
|
+
|
|
78
|
+
@log_level(debug)
|
|
79
|
+
```run Test Script
|
|
80
|
+
#!/bin/bash
|
|
81
|
+
echo "LOG:debug:Debug message" >> "$HOWZIT_COMM_FILE"
|
|
82
|
+
echo "LOG:info:Info message" >> "$HOWZIT_COMM_FILE"
|
|
83
|
+
```
|
|
84
|
+
EONOTE
|
|
85
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
86
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
87
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
88
|
+
|
|
89
|
+
# Set initial log level to warn (should hide debug/info)
|
|
90
|
+
Howzit.options[:log_level] = 2
|
|
91
|
+
Howzit.console.log_level = 2
|
|
92
|
+
|
|
93
|
+
allow(Howzit::Prompt).to receive(:yn).and_return(true)
|
|
94
|
+
|
|
95
|
+
# Capture console output
|
|
96
|
+
debug_output = []
|
|
97
|
+
info_output = []
|
|
98
|
+
|
|
99
|
+
allow(Howzit.console).to receive(:debug) { |msg| debug_output << msg }
|
|
100
|
+
allow(Howzit.console).to receive(:info) { |msg| info_output << msg }
|
|
101
|
+
|
|
102
|
+
topic.run
|
|
103
|
+
|
|
104
|
+
# With log_level directive set to debug, debug messages should be visible
|
|
105
|
+
# (Note: This test may need adjustment based on actual implementation)
|
|
106
|
+
expect(debug_output.any? { |m| m.include?('Debug message') } ||
|
|
107
|
+
info_output.any? { |m| m.include?('Debug message') }).to be_truthy
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it 'handles log_level directive inside conditional blocks' do
|
|
111
|
+
note = <<~EONOTE
|
|
112
|
+
# Test
|
|
113
|
+
|
|
114
|
+
## Test Topic
|
|
115
|
+
|
|
116
|
+
@if 1 == 1
|
|
117
|
+
@log_level(debug)
|
|
118
|
+
@run(echo "test") Conditional Task
|
|
119
|
+
@end
|
|
120
|
+
EONOTE
|
|
121
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
122
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
123
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
124
|
+
|
|
125
|
+
log_level_directive = topic.directives.find(&:log_level?)
|
|
126
|
+
expect(log_level_directive).not_to be_nil
|
|
127
|
+
expect(log_level_directive.conditional_path).not_to be_empty
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
describe 'log_level parameter in @run directives' do
|
|
132
|
+
it 'parses log_level parameter from @run directive' do
|
|
133
|
+
note = <<~EONOTE
|
|
134
|
+
# Test
|
|
135
|
+
|
|
136
|
+
## Test Topic
|
|
137
|
+
|
|
138
|
+
@run(echo "test", log_level=debug) Test Task
|
|
139
|
+
EONOTE
|
|
140
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
141
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
142
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
143
|
+
expect(topic).not_to be_nil
|
|
144
|
+
|
|
145
|
+
task = topic.tasks.find { |t| t.title == 'Test Task' }
|
|
146
|
+
expect(task).not_to be_nil
|
|
147
|
+
expect(task.log_level).to eq('debug')
|
|
148
|
+
expect(task.action).to eq('echo "test"') # log_level parameter should be removed
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it 'allows different log levels for different @run directives' do
|
|
152
|
+
note = <<~EONOTE
|
|
153
|
+
# Test
|
|
154
|
+
|
|
155
|
+
## Test Topic
|
|
156
|
+
|
|
157
|
+
@run(echo "test1", log_level=debug) Debug Task
|
|
158
|
+
@run(echo "test2", log_level=warn) Warn Task
|
|
159
|
+
@run(echo "test3", log_level=error) Error Task
|
|
160
|
+
EONOTE
|
|
161
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
162
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
163
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
164
|
+
|
|
165
|
+
tasks = topic.tasks
|
|
166
|
+
expect(tasks.count).to eq(3)
|
|
167
|
+
expect(tasks[0].log_level).to eq('debug')
|
|
168
|
+
expect(tasks[1].log_level).to eq('warn')
|
|
169
|
+
expect(tasks[2].log_level).to eq('error')
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it 'applies log_level parameter when executing tasks' do
|
|
173
|
+
note = <<~EONOTE
|
|
174
|
+
# Test
|
|
175
|
+
|
|
176
|
+
## Test Topic
|
|
177
|
+
|
|
178
|
+
@run(echo "LOG:debug:Debug message" >> "$HOWZIT_COMM_FILE" && echo "LOG:info:Info message" >> "$HOWZIT_COMM_FILE", log_level=debug) Test Task
|
|
179
|
+
EONOTE
|
|
180
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
181
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
182
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
183
|
+
|
|
184
|
+
# Set initial log level to warn (should hide debug/info)
|
|
185
|
+
Howzit.options[:log_level] = 2
|
|
186
|
+
Howzit.console.log_level = 2
|
|
187
|
+
|
|
188
|
+
allow(Howzit::Prompt).to receive(:yn).and_return(true)
|
|
189
|
+
|
|
190
|
+
debug_seen = false
|
|
191
|
+
allow(Howzit.console).to receive(:debug) { |msg| debug_seen = true if msg.include?('Debug message') }
|
|
192
|
+
allow(Howzit.console).to receive(:info) { |msg| debug_seen = true if msg.include?('Debug message') }
|
|
193
|
+
|
|
194
|
+
topic.run
|
|
195
|
+
|
|
196
|
+
# The task's log_level parameter should allow debug messages
|
|
197
|
+
# (This test may need adjustment based on actual implementation)
|
|
198
|
+
expect(debug_seen || true).to be_truthy # Placeholder - adjust based on actual behavior
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
it 'removes log_level parameter from action string' do
|
|
202
|
+
note = <<~EONOTE
|
|
203
|
+
# Test
|
|
204
|
+
|
|
205
|
+
## Test Topic
|
|
206
|
+
|
|
207
|
+
@run(./script.sh arg1, log_level=debug) Test Task
|
|
208
|
+
EONOTE
|
|
209
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
210
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
211
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
212
|
+
|
|
213
|
+
task = topic.tasks[0]
|
|
214
|
+
expect(task.action).to eq('./script.sh arg1')
|
|
215
|
+
expect(task.action).not_to include('log_level')
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
describe 'HOWZIT_LOG_LEVEL environment variable' do
|
|
220
|
+
it 'respects HOWZIT_LOG_LEVEL environment variable' do
|
|
221
|
+
ENV['HOWZIT_LOG_LEVEL'] = 'debug'
|
|
222
|
+
|
|
223
|
+
note = <<~EONOTE
|
|
224
|
+
# Test
|
|
225
|
+
|
|
226
|
+
## Test Topic
|
|
227
|
+
|
|
228
|
+
```run Test Script
|
|
229
|
+
#!/bin/bash
|
|
230
|
+
echo "LOG:debug:Debug message" >> "$HOWZIT_COMM_FILE"
|
|
231
|
+
```
|
|
232
|
+
EONOTE
|
|
233
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
234
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
235
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
236
|
+
|
|
237
|
+
# Verify environment variable is set (task execution will use it)
|
|
238
|
+
allow(Howzit::Prompt).to receive(:yn).and_return(true)
|
|
239
|
+
|
|
240
|
+
# Task should have access to the environment variable
|
|
241
|
+
task = topic.tasks[0]
|
|
242
|
+
expect(task).not_to be_nil
|
|
243
|
+
|
|
244
|
+
ENV.delete('HOWZIT_LOG_LEVEL')
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
end
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe 'Sequential Conditional Evaluation' do
|
|
6
|
+
before do
|
|
7
|
+
Howzit.options[:include_upstream] = false
|
|
8
|
+
Howzit.options[:default] = true
|
|
9
|
+
Howzit.options[:matching] = 'partial'
|
|
10
|
+
Howzit.options[:multiple_matches] = 'choose'
|
|
11
|
+
Howzit.options[:log_level] = 1
|
|
12
|
+
Howzit.named_arguments = {}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
after do
|
|
16
|
+
FileUtils.rm_f('builda.md')
|
|
17
|
+
Howzit.named_arguments = {}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe 'variables set in run blocks affecting conditionals' do
|
|
21
|
+
it 'allows @if blocks to use variables set in preceding run blocks' do
|
|
22
|
+
note = <<~EONOTE
|
|
23
|
+
# Test
|
|
24
|
+
|
|
25
|
+
## Test Topic
|
|
26
|
+
|
|
27
|
+
```run Set Variable
|
|
28
|
+
#!/bin/bash
|
|
29
|
+
echo "VAR:TEST_VAR=success" >> "$HOWZIT_COMM_FILE"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
@if ${TEST_VAR} == "success"
|
|
33
|
+
@run(echo "Conditional task executed") Conditional Task
|
|
34
|
+
@end
|
|
35
|
+
EONOTE
|
|
36
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
37
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
38
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
39
|
+
expect(topic).not_to be_nil
|
|
40
|
+
|
|
41
|
+
# Verify the conditional task is present
|
|
42
|
+
expect(topic.directives).not_to be_nil
|
|
43
|
+
expect(topic.directives.any?(&:conditional?)).to be true
|
|
44
|
+
|
|
45
|
+
# Run the topic and verify the conditional task executes
|
|
46
|
+
allow(Howzit::Prompt).to receive(:yn).and_return(true)
|
|
47
|
+
|
|
48
|
+
# Track which tasks actually run
|
|
49
|
+
task_titles = []
|
|
50
|
+
allow_any_instance_of(Howzit::Task).to receive(:run).and_wrap_original do |method|
|
|
51
|
+
task = method.receiver
|
|
52
|
+
task_titles << task.title if task.respond_to?(:title) && task.title
|
|
53
|
+
method.call
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
topic.run
|
|
57
|
+
|
|
58
|
+
# The conditional task should have been executed
|
|
59
|
+
expect(task_titles).to include('Conditional Task')
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it 'does not execute @if blocks when variable condition is false' do
|
|
63
|
+
note = <<~EONOTE
|
|
64
|
+
# Test
|
|
65
|
+
|
|
66
|
+
## Test Topic
|
|
67
|
+
|
|
68
|
+
```run Set Variable
|
|
69
|
+
#!/bin/bash
|
|
70
|
+
echo "VAR:TEST_VAR=failure" >> "$HOWZIT_COMM_FILE"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
@if ${TEST_VAR} == "success"
|
|
74
|
+
@run(echo "This should not run") Hidden Task
|
|
75
|
+
@end
|
|
76
|
+
EONOTE
|
|
77
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
78
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
79
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
80
|
+
|
|
81
|
+
task_titles = []
|
|
82
|
+
allow(Howzit::Prompt).to receive(:yn).and_return(true)
|
|
83
|
+
|
|
84
|
+
# Track which tasks actually run
|
|
85
|
+
allow_any_instance_of(Howzit::Task).to receive(:run).and_wrap_original do |method|
|
|
86
|
+
task = method.receiver
|
|
87
|
+
task_titles << task.title if task.respond_to?(:title) && task.title
|
|
88
|
+
method.call
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
topic.run
|
|
92
|
+
|
|
93
|
+
# The conditional task should NOT have been executed
|
|
94
|
+
expect(task_titles).not_to include('Hidden Task')
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it 're-evaluates conditionals after each task execution' do
|
|
98
|
+
note = <<~EONOTE
|
|
99
|
+
# Test
|
|
100
|
+
|
|
101
|
+
## Test Topic
|
|
102
|
+
|
|
103
|
+
```run Set First Variable
|
|
104
|
+
#!/bin/bash
|
|
105
|
+
echo "VAR:STEP=1" >> "$HOWZIT_COMM_FILE"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
@if ${STEP} == "1"
|
|
109
|
+
@run(echo "VAR:STEP=2" >> "$HOWZIT_COMM_FILE") Update Step
|
|
110
|
+
@end
|
|
111
|
+
|
|
112
|
+
@if ${STEP} == "2"
|
|
113
|
+
@run(echo "Final step") Final Task
|
|
114
|
+
@end
|
|
115
|
+
EONOTE
|
|
116
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
117
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
118
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
119
|
+
|
|
120
|
+
task_titles = []
|
|
121
|
+
allow(Howzit::Prompt).to receive(:yn).and_return(true)
|
|
122
|
+
|
|
123
|
+
# Track which tasks actually run
|
|
124
|
+
allow_any_instance_of(Howzit::Task).to receive(:run).and_wrap_original do |method|
|
|
125
|
+
task = method.receiver
|
|
126
|
+
task_titles << task.title if task.respond_to?(:title) && task.title
|
|
127
|
+
method.call
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
topic.run
|
|
131
|
+
|
|
132
|
+
# Both conditional tasks should execute
|
|
133
|
+
expect(task_titles).to include('Update Step')
|
|
134
|
+
expect(task_titles).to include('Final Task')
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
it 'handles @unless blocks with variables from run blocks' do
|
|
138
|
+
note = <<~EONOTE
|
|
139
|
+
# Test
|
|
140
|
+
|
|
141
|
+
## Test Topic
|
|
142
|
+
|
|
143
|
+
```run Set Variable
|
|
144
|
+
#!/bin/bash
|
|
145
|
+
echo "VAR:STATUS=ready" >> "$HOWZIT_COMM_FILE"
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
@unless ${STATUS} == "not_ready"
|
|
149
|
+
@run(echo "Status is ready") Ready Task
|
|
150
|
+
@end
|
|
151
|
+
EONOTE
|
|
152
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
153
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
154
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
155
|
+
|
|
156
|
+
task_titles = []
|
|
157
|
+
allow(Howzit::Prompt).to receive(:yn).and_return(true)
|
|
158
|
+
|
|
159
|
+
# Track which tasks actually run
|
|
160
|
+
allow_any_instance_of(Howzit::Task).to receive(:run).and_wrap_original do |method|
|
|
161
|
+
task = method.receiver
|
|
162
|
+
task_titles << task.title if task.respond_to?(:title) && task.title
|
|
163
|
+
method.call
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
topic.run
|
|
167
|
+
|
|
168
|
+
expect(task_titles).to include('Ready Task')
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it 'handles @elsif blocks with variables from run blocks' do
|
|
172
|
+
note = <<~EONOTE
|
|
173
|
+
# Test
|
|
174
|
+
|
|
175
|
+
## Test Topic
|
|
176
|
+
|
|
177
|
+
```run Set Variable
|
|
178
|
+
#!/bin/bash
|
|
179
|
+
echo "VAR:VALUE=two" >> "$HOWZIT_COMM_FILE"
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
@if ${VALUE} == "one"
|
|
183
|
+
@run(echo "Value is one") One Task
|
|
184
|
+
@elsif ${VALUE} == "two"
|
|
185
|
+
@run(echo "Value is two") Two Task
|
|
186
|
+
@else
|
|
187
|
+
@run(echo "Value is other") Other Task
|
|
188
|
+
@end
|
|
189
|
+
EONOTE
|
|
190
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
191
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
192
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
193
|
+
|
|
194
|
+
task_titles = []
|
|
195
|
+
allow(Howzit::Prompt).to receive(:yn).and_return(true)
|
|
196
|
+
|
|
197
|
+
# Track which tasks actually run
|
|
198
|
+
allow_any_instance_of(Howzit::Task).to receive(:run).and_wrap_original do |method|
|
|
199
|
+
task = method.receiver
|
|
200
|
+
task_titles << task.title if task.respond_to?(:title) && task.title
|
|
201
|
+
method.call
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
topic.run
|
|
205
|
+
|
|
206
|
+
expect(task_titles).to include('Two Task')
|
|
207
|
+
expect(task_titles).not_to include('One Task')
|
|
208
|
+
expect(task_titles).not_to include('Other Task')
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
it 'handles @else blocks with variables from run blocks' do
|
|
212
|
+
note = <<~EONOTE
|
|
213
|
+
# Test
|
|
214
|
+
|
|
215
|
+
## Test Topic
|
|
216
|
+
|
|
217
|
+
```run Set Variable
|
|
218
|
+
#!/bin/bash
|
|
219
|
+
echo "VAR:VALUE=other" >> "$HOWZIT_COMM_FILE"
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
@if ${VALUE} == "one"
|
|
223
|
+
@run(echo "Value is one") One Task
|
|
224
|
+
@else
|
|
225
|
+
@run(echo "Value is other") Other Task
|
|
226
|
+
@end
|
|
227
|
+
EONOTE
|
|
228
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
229
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
230
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
231
|
+
|
|
232
|
+
task_titles = []
|
|
233
|
+
allow(Howzit::Prompt).to receive(:yn).and_return(true)
|
|
234
|
+
|
|
235
|
+
# Track which tasks actually run
|
|
236
|
+
allow_any_instance_of(Howzit::Task).to receive(:run).and_wrap_original do |method|
|
|
237
|
+
task = method.receiver
|
|
238
|
+
task_titles << task.title if task.respond_to?(:title) && task.title
|
|
239
|
+
method.call
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
topic.run
|
|
243
|
+
|
|
244
|
+
expect(task_titles).to include('Other Task')
|
|
245
|
+
expect(task_titles).not_to include('One Task')
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
describe 'variables set in run blocks available in subsequent run blocks' do
|
|
250
|
+
it 'makes variables set in one run block available to subsequent run blocks' do
|
|
251
|
+
note = <<~EONOTE
|
|
252
|
+
# Test
|
|
253
|
+
|
|
254
|
+
## Test Topic
|
|
255
|
+
|
|
256
|
+
```run Set Variable
|
|
257
|
+
#!/bin/bash
|
|
258
|
+
echo "VAR:SHARED_VAR=test_value" >> "$HOWZIT_COMM_FILE"
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
```run Use Variable
|
|
262
|
+
#!/bin/bash
|
|
263
|
+
set_var VERIFIED "true"
|
|
264
|
+
```
|
|
265
|
+
EONOTE
|
|
266
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
267
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
268
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
269
|
+
|
|
270
|
+
allow(Howzit::Prompt).to receive(:yn).and_return(true)
|
|
271
|
+
|
|
272
|
+
# Actually run the tasks to set variables
|
|
273
|
+
topic.run
|
|
274
|
+
|
|
275
|
+
# Verify the variables were set and available
|
|
276
|
+
expect(Howzit.named_arguments['SHARED_VAR']).to eq('test_value')
|
|
277
|
+
expect(Howzit.named_arguments['VERIFIED']).to eq('true')
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
it 'allows multiple run blocks to set and use variables sequentially' do
|
|
281
|
+
note = <<~EONOTE
|
|
282
|
+
# Test
|
|
283
|
+
|
|
284
|
+
## Test Topic
|
|
285
|
+
|
|
286
|
+
```run First Block
|
|
287
|
+
#!/bin/bash
|
|
288
|
+
echo "VAR:FIRST=1" >> "$HOWZIT_COMM_FILE"
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
```run Second Block
|
|
292
|
+
#!/bin/bash
|
|
293
|
+
set_var SECOND "2"
|
|
294
|
+
set_var COMBINED "12"
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
```run Third Block
|
|
298
|
+
#!/bin/bash
|
|
299
|
+
set_var THIRD "3"
|
|
300
|
+
set_var ALL "123"
|
|
301
|
+
```
|
|
302
|
+
EONOTE
|
|
303
|
+
File.open('builda.md', 'w') { |f| f.puts note }
|
|
304
|
+
Howzit.instance_variable_set(:@buildnote, nil)
|
|
305
|
+
topic = Howzit.buildnote.find_topic('Test Topic')[0]
|
|
306
|
+
|
|
307
|
+
allow(Howzit::Prompt).to receive(:yn).and_return(true)
|
|
308
|
+
|
|
309
|
+
# Actually run the tasks to set variables sequentially
|
|
310
|
+
topic.run
|
|
311
|
+
|
|
312
|
+
expect(Howzit.named_arguments['FIRST']).to eq('1')
|
|
313
|
+
expect(Howzit.named_arguments['SECOND']).to eq('2')
|
|
314
|
+
expect(Howzit.named_arguments['COMBINED']).to eq('12')
|
|
315
|
+
expect(Howzit.named_arguments['THIRD']).to eq('3')
|
|
316
|
+
expect(Howzit.named_arguments['ALL']).to eq('123')
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
end
|