howzit 2.1.29 → 2.1.30
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 +74 -0
- data/README.md +5 -1
- data/Rakefile +7 -1
- data/lib/howzit/config.rb +13 -0
- data/lib/howzit/console_logger.rb +62 -2
- data/lib/howzit/directive.rb +137 -0
- data/lib/howzit/script_support.rb +479 -0
- 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 +2 -0
- 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/topic_spec.rb +8 -6
- data/src/_README.md +5 -1
- metadata +10 -2
|
@@ -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
|