origen_doc_helpers 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/config/boot.rb +19 -0
  3. data/config/version.rb +1 -1
  4. data/lib/origen_doc_helpers.rb +21 -1
  5. data/lib/origen_doc_helpers/flow_page_generator.rb +110 -0
  6. data/lib/{helpers.rb → origen_doc_helpers/helpers.rb} +0 -0
  7. data/lib/origen_doc_helpers/model_page_generator.rb +151 -0
  8. data/templates/flow_index.md.erb +19 -0
  9. data/templates/flow_page.md.erb +4 -0
  10. data/templates/model_index.md.erb +24 -0
  11. data/templates/model_page.md.erb +125 -0
  12. data/templates/shared/_register.html.erb +51 -7
  13. data/templates/shared/_searchable.html.erb +1 -1
  14. data/templates/shared/test/_flow.md.erb +3 -230
  15. data/templates/web/helpers.md.erb +25 -0
  16. data/templates/web/{examples → helpers}/disqus.md.erb +3 -3
  17. data/templates/web/helpers/flow.md.erb +113 -0
  18. data/templates/web/helpers/model.md.erb +81 -0
  19. data/templates/web/{examples → helpers}/register.md.erb +5 -5
  20. data/templates/web/{examples → helpers}/searchable/intro.md.erb +4 -4
  21. data/templates/web/{examples → helpers}/searchable/page2.md.erb +0 -0
  22. data/templates/web/{examples → helpers}/searchable/topic1/item1.md.erb +0 -0
  23. data/templates/web/{examples → helpers}/searchable/topic1/item2.html.erb +0 -0
  24. data/templates/web/{examples → helpers}/spec.md.erb_NOT_WORKING +2 -2
  25. data/templates/web/{examples → helpers}/yammer.md.erb +1 -1
  26. data/templates/web/index.md.erb +1 -1
  27. data/templates/web/layouts/_doc.html.erb +2 -2
  28. data/templates/web/layouts/{_examples.html.erb → _helpers.html.erb} +1 -1
  29. data/templates/web/partials/_navbar.html.erb +1 -1
  30. metadata +27 -26
  31. data/config/development.rb +0 -16
  32. data/config/environment.rb +0 -32
  33. data/lib/origen_doc_helpers/doc_interface.rb +0 -74
  34. data/program/_func.rb +0 -12
  35. data/program/_hvst.rb +0 -12
  36. data/program/_para.rb +0 -26
  37. data/program/probe_1.rb +0 -7
  38. data/templates/web/examples.md.erb +0 -20
  39. data/templates/web/examples/test/flow.md.erb +0 -35
@@ -5,10 +5,16 @@
5
5
  <a class="anchor" name="<%= "#{reg.name}" %>"></a>
6
6
 
7
7
  <a href='#<%= reg.name %>'>
8
+ % if options[:origen_path] && !options[:origen_path].empty?
9
+ % reg_path = options[:origen_path] + "." + reg.name.to_s
10
+ % reg_path = "#{reg.name} - #{reg_path}"
11
+ % else
12
+ % reg_path = reg.name
13
+ % end
8
14
  % if reg.full_name
9
- <h4>0x<%= reg.address.to_s(16).upcase %> - <%= reg.full_name %> (<%= reg.name %>)</h4>
15
+ <h4>0x<%= reg.address.to_s(16).upcase %> - <%= reg.full_name %> (<%= reg_path %>)</h4>
10
16
  % else
11
- <h4>0x<%= reg.address.to_s(16).upcase %> - <%= reg.name %></h4>
17
+ <h4>0x<%= reg.address.to_s(16).upcase %> - <%= reg_path %></h4>
12
18
  % end
13
19
  </a>
14
20
 
@@ -22,10 +28,11 @@
22
28
  </div>
23
29
  % end
24
30
 
25
- % (reg.size / 8).times do |byte_index|
31
+ % num_bytes = (reg.size / 8.0).ceil
32
+ % num_bytes.times do |byte_index|
26
33
  % # Need to add support for little endian regs here?
27
- % byte_number = (reg.size / 8) - byte_index
28
- % max_bit = reg.size - (byte_index * 8) - 1
34
+ % byte_number = num_bytes - byte_index
35
+ % max_bit = (byte_number * 8) - 1
29
36
  % min_bit = max_bit - 8 + 1
30
37
 
31
38
  <table class="reg table table-condensed" style="margin-bottom: 0; table-layout: fixed;">
@@ -33,7 +40,12 @@
33
40
  <tr class="bit-positions">
34
41
  <th class="spacer"></th>
35
42
  % 8.times do |i|
36
- <th class="bit-position"><%= reg.size - i - 1 - (byte_index * 8) %></th>
43
+ % bit_num = (byte_number * 8) - i - 1
44
+ % if bit_num > reg.size - 1
45
+ <th class="spacer"></th>
46
+ % else
47
+ <th class="bit-position"><%= bit_num %></th>
48
+ % end
37
49
  % end
38
50
  </tr>
39
51
  </thead>
@@ -46,12 +58,21 @@
46
58
  <td class="heading">R</td>
47
59
  % reg.named_bits :include_spacers => true do |name, bit|
48
60
  % if _bit_in_range?(bit, max_bit, min_bit)
61
+ % if max_bit > (reg.size - 1)
62
+ % (max_bit - (reg.size - 1)).times do
63
+ <td class="spacer"></td>
64
+ % end
65
+ % end
49
66
  % if bit.size > 1
50
67
  % if name
51
68
  % if bit.readable?
52
69
  % bit_name = "#{name}[#{bit.size - 1}:0]"
53
70
  <td class="<%= _bit_rw(bit) %>" colspan="<%= _num_bits_in_range(bit, max_bit, min_bit) %>">
71
+ % if options[:descriptions] && !bit.description.empty?
72
+ <span><a href="#<%= "#{reg.name}_#{name}_#{bit.position}" %>"><%= bit_name %></a></span>
73
+ % else
54
74
  <span><%= bit_name %></span>
75
+ % end
55
76
  </td>
56
77
  % else
57
78
  % if bit.access == :worz
@@ -72,7 +93,11 @@
72
93
  % else
73
94
  % if name
74
95
  % if bit.readable?
96
+ % if options[:descriptions] && !bit.description.empty?
97
+ <td class="<%= _bit_rw(bit) %>"><span><a href="#<%= "#{reg.name}_#{name}_#{bit.position}" %>"><%= name %></a></span></td>
98
+ % else
75
99
  <td class="<%= _bit_rw(bit) %>"><span><%= name %></span></td>
100
+ % end
76
101
  % else
77
102
  <td class="<%= _bit_rw(bit) %>"></td>
78
103
  % end
@@ -91,12 +116,21 @@
91
116
  <td class="heading">W</td>
92
117
  % reg.named_bits :include_spacers => true do |name, bit|
93
118
  % if _bit_in_range?(bit, max_bit, min_bit)
119
+ % if max_bit > (reg.size - 1)
120
+ % (max_bit - (reg.size - 1)).times do
121
+ <td class="spacer"></td>
122
+ % end
123
+ % end
94
124
  % if bit.size > 1
95
125
  % if name
96
126
  % if !bit.readable?
97
127
  % bit_name = "#{name}[#{bit.size - 1}:0]"
98
128
  <td class="<%= _bit_rw(bit) %>" colspan="<%= _num_bits_in_range(bit, max_bit, min_bit) %>">
129
+ % if options[:descriptions] && !bit.description.empty?
130
+ <span><a href="#<%= "#{reg.name}_#{name}_#{bit.position}" %>"><%= bit_name %></a></span>
131
+ % else
99
132
  <span><%= bit_name %></span>
133
+ % end
100
134
  </td>
101
135
  % else
102
136
  <td class="<%= _bit_rw(bit) %>" colspan="<%= _num_bits_in_range(bit, max_bit, min_bit) %>"></td>
@@ -111,7 +145,11 @@
111
145
  % else
112
146
  % if name
113
147
  % if !bit.readable?
148
+ % if options[:descriptions] && !bit.description.empty?
149
+ <td class="<%= _bit_rw(bit) %>"><span><a href="#<%= "#{reg.name}_#{name}_#{bit.position}" %>"><%= name %></a></span></td>
150
+ % else
114
151
  <td class="<%= _bit_rw(bit) %>"><span><%= name %></span></td>
152
+ % end
115
153
  % else
116
154
  <td class="<%= _bit_rw(bit) %>"></td>
117
155
  % end
@@ -130,6 +168,11 @@
130
168
  <td class="heading">Reset</td>
131
169
  % reg.named_bits :include_spacers => true do |name, bit|
132
170
  % if _bit_in_range?(bit, max_bit, min_bit)
171
+ % if max_bit > (reg.size - 1)
172
+ % (max_bit - (reg.size - 1)).times do
173
+ <td class="spacer"></td>
174
+ % end
175
+ % end
133
176
  % if bit.size > 1
134
177
  % if name
135
178
  % if bit.nvm_dep != 0 || bit.reset_val == :memory
@@ -164,7 +207,7 @@
164
207
 
165
208
  % end # Byte index loop
166
209
 
167
- % if options[:descriptions]
210
+ % if options[:descriptions] && reg.named_bits.any? { |name, bits| !bits.description.empty? }
168
211
  <table class="bit-descriptions table table-condensed table-bordered" style="margin: 20px 0 0 0">
169
212
  <thead>
170
213
  <tr>
@@ -177,6 +220,7 @@
177
220
  <tr>
178
221
  <td>
179
222
  <p>
223
+ <a class="anchor" name="<%= "#{reg.name}_#{name}_#{bits.position}" %>"></a>
180
224
  % if bits.size == 1
181
225
  <%= bits.position %>
182
226
  % else
@@ -59,7 +59,7 @@
59
59
  %# The markdown attribute is important if you are going to include content written
60
60
  %# in markdown, without this is will be included verbatim
61
61
  <div class="col-md-9 nav-page-container" markdown="1">
62
- <article markdown="1">
62
+ <article markdown="1" class="search-results">
63
63
 
64
64
  % found = options[:index].find{ |k,v| v.has_key?(_resolve_tab(options)) }
65
65
  % topic_key = found ? found[0] : nil
@@ -4,9 +4,8 @@
4
4
  % flows = options[:flow] || options[:flows]
5
5
  % flows = flows ? [flows].flatten : nil
6
6
 
7
- % if !program
8
- % Origen.target.temporary = options[:target]
9
- % program = OrigenTesters.program
7
+ % Origen.target.temporary = options[:target]
8
+ % program = OrigenTesters.program
10
9
 
11
10
  <style>
12
11
  .clickable { cursor: pointer }
@@ -19,6 +18,7 @@
19
18
  .test-overview .panel-group { margin-bottom: 0; }
20
19
  h4 .test-number { font-size: 14px; }
21
20
  table tr th { text-align: left !important; }
21
+ .test-overview:last-child { border-bottom: none; }
22
22
  </style>
23
23
 
24
24
  <script type="text/javascript">
@@ -186,230 +186,3 @@
186
186
  </div>
187
187
  </div>
188
188
  </div>
189
-
190
- % # Legacy output based on Doc tester, abandon hope all ye who enter here...
191
- % else
192
-
193
- <div class="row">
194
- %# The markdown attribute is important if you are going to include content written
195
- %# in markdown, without this is will be included verbatim
196
- %# One downside is that html cannot be indented here, otherwise it will be parsed
197
- %# as a code block.
198
- <div class="col-md-12" markdown="1">
199
- <div class="panel-group" id="test_flow">
200
-
201
- <a href="#_" class="expandcollapse btn btn-xs pull-right btn-default" state="0"><i class='fa fa-plus'></i></a>
202
-
203
- <h2><%= options[:heading] %> <span style="font-size: 14px">(generated for target '<%= program.target %>')</span></h2>
204
-
205
- % program.each_in_flow(flows, :context => options[:context]) do |t|
206
- % type = t[:type]
207
- % instances = t[:instance]
208
- % i = instances
209
- % flow = t[:flow]
210
- % f = flow
211
- % context = t[:context]
212
- % c = context
213
- % description = t[:description]
214
-
215
- % if type == :label || type == :branch
216
- % # Need to decide how to deal with label based jumps
217
-
218
- % elsif type == :section_start
219
-
220
- <%= _stop_test_flow_table %>
221
- <%= _start_accordion(description.first) %>
222
-
223
- % description.each_with_index do |line, ix|
224
- % unless ix == 0
225
- <%= line %>
226
- % end
227
- % end
228
-
229
- % elsif type == :section_stop
230
-
231
- <%= _stop_test_flow_table %>
232
- <%= _stop_accordion %>
233
-
234
- % else
235
-
236
- % unless flow[:name] == "power_cycle_ti"
237
- <%= _start_test_flow_table %>
238
-
239
- <tr>
240
- <td class="col1">
241
- <a class="anchor" name="<%= "#{_test_name(t)}_#{_test_number(t)}" %>"></a>
242
- <div><%= _test_to_local_link(t) %></div>
243
-
244
- % if f[:id]
245
- % dependents = program.dependents_of(f[:id], flows, :context => options[:context])
246
- % unless dependents.empty?
247
- <div class="alert alert-info">
248
- % if dependents[:if_failed]
249
- <p><strong>Note</strong>
250
- - This test does not bin out as later tests are dependent on it.
251
- </p>
252
- <p>These tests will run if this test FAILS:
253
- <ul>
254
- % dependents[:if_failed].each do |dependent|
255
- <li><%= _test_to_local_link(dependent) %></li>
256
- % end
257
- </ul></p>
258
- % end
259
- % if dependents[:if_passed]
260
- <p><strong>Note</strong>
261
- - This test does not bin out as later tests are dependent on it.
262
- </p>
263
- <p>These tests will run if this test PASSES:
264
- <ul>
265
- % dependents[:if_passed].each do |dependent|
266
- <li><%= _test_to_local_link(dependent) %></li>
267
- % end
268
- </ul></p>
269
- % end
270
- % if dependents[:if_ran]
271
- <p><strong>Note</strong> - These tests will run if this test RUNS:
272
- <ul>
273
- <ul>
274
- % dependents[:if_ran].each do |dependent|
275
- <li><%= _test_to_local_link(dependent) %></li>
276
- % end
277
- </ul></p>
278
- % end
279
- % if dependents[:unless_ran]
280
- <p><strong>Note</strong> - These tests will run if this test DOES NOT RUN:
281
- <ul>
282
- % dependents[:unless_ran].each do |dependent|
283
- <li><%= _test_to_local_link(dependent) %></li>
284
- % end
285
- </ul></p>
286
- % end
287
- </div>
288
- % end
289
- % end
290
-
291
- % if c[:if_enable]
292
- <div class="alert alert-success">
293
- <strong>Note</strong>
294
- - This test will only run when '<%= c[:if_enable] %>' is enabled.
295
- </div>
296
- % end
297
-
298
- % if c[:unless_enable]
299
- <div class="alert alert-success">
300
- <strong>Note</strong>
301
- - This test will NOT run when '<%= c[:unless_enable] %>' is enabled.
302
- </div>
303
- % end
304
-
305
- % if f[:continue]
306
- <div class="alert alert-danger">
307
- <strong>Warning!</strong>
308
- - This test does not bin out when failed.
309
- </div>
310
- % end
311
-
312
- % if c[:if_passed]
313
- <div class="alert alert-success">
314
- <p><strong>Note</strong>
315
- - This test will only run if this test PASSED:
316
- <ul><li><%= _test_to_local_link(program.find_by_id(c[:if_passed], flows, :context => options[:context])) %></li></ul>
317
- </p>
318
- </div>
319
- % end
320
-
321
- % if c[:if_failed]
322
- <div class="alert alert-success">
323
- <p><strong>Note</strong>
324
- - This test will only run if this test FAILED:
325
- <ul><li><%= _test_to_local_link(program.find_by_id(c[:if_failed], flows, :context => options[:context])) %></li></ul>
326
- </p>
327
- </div>
328
- % end
329
-
330
- % if c[:if_ran]
331
- <div class="alert alert-success">
332
- <p><strong>Note</strong>
333
- - This test will only run if this test RAN:
334
- <ul><li><%= _test_to_local_link(program.find_by_id(c[:if_ran], flows, :context => options[:context])) %></li></ul>
335
- </p>
336
- </div>
337
- % end
338
-
339
- % if c[:unless_ran]
340
- <div class="alert alert-success">
341
- <p><strong>Note</strong>
342
- - This test will only run if this test DID NOT RUN:
343
- <ul><li><%= _test_to_local_link(program.find_by_id(c[:unless_ran], flows, :context => options[:context])) %></li></ul>
344
- </p>
345
- </div>
346
- % end
347
-
348
-
349
- </td>
350
- <td class="col2">#<%= _test_number(t) %></td>
351
- <td class="col3">B<%= _bin_number(t) %></td>
352
- <td class="col4">B<%= _sbin_number(t) %></td>
353
- <td class="col5 attributes" markdown="1">
354
-
355
- % instances.each_with_index do |instance, i|
356
- % if i > 0
357
-
358
- ***
359
-
360
- % end
361
- % instance.each do |key, val|
362
- % unless [:patterns, :pattern, :by_block, :name, :id].include?(key)
363
- %# if val.is_a?(Numeric)
364
- %# if val > 1000000
365
- %# val =
366
- %# if val > 1000000
367
- %# end
368
- * **<%= key.to_s.capitalize.gsub("_", " ") %>**: <%= val %>
369
- % end
370
- % end
371
- % patterns = [instance[:pattern], instance[:patterns]].flatten.compact
372
- % unless patterns.empty?
373
- % if options[:link_to_pattern_docs]
374
-
375
- <div class="pattern-links">
376
- % patterns.each_with_index do |pattern, i|
377
- % if patterns.size > 1
378
- % txt = "Pattern #{i}"
379
- % else
380
- % txt = "Pattern"
381
- % end
382
- <a href="<%= path "/patterns/#{pattern}" %>" role="button" class="btn btn-primary btn-small"><%= txt %></a>
383
- % end
384
- </div>
385
- % else
386
- * **Patterns**:
387
- % patterns.each_with_index do |pattern, i|
388
- * <%= pattern %>
389
- % end
390
-
391
- % end
392
- %
393
- % end
394
- % end
395
- </td>
396
-
397
- <td class="col6" markdown="1">
398
-
399
- % description.each do |line|
400
- <%= line %>
401
- % end
402
-
403
- </td>
404
- </tr>
405
- % end
406
- % end
407
- % end
408
-
409
- <%= _stop_test_flow_table %>
410
-
411
- </div>
412
- </div>
413
- </div>
414
-
415
- % end
@@ -0,0 +1,25 @@
1
+ % render "layouts/basic.html", :tab => :helpers do
2
+
3
+ # Available Helpers
4
+
5
+ These are the helpers currently provided by this plugin, click the helper of
6
+ of interest to see a live example of it and the required application code to use it.
7
+
8
+ ### Complete Web Pages
9
+
10
+ These helpers will generate complete web pages for you.
11
+
12
+ [Model Documentation](<%= path "/helpers/model" %>) | Create a reference manual style set of doc pages for a given model, including full register descriptions
13
+ [Test Program Flow](<%= path "/helpers/flow" %>) | Create documentation for a test program flow that has been created using Origen Testers
14
+
15
+ ### Components
16
+
17
+ The following are components that you can embed within your own web pages.
18
+
19
+ | [Searchable Documents](<%= path "/helpers/searchable/intro" %>) | Provides a layout for a guides section of your website, complete with search box (the [Origen Guides](http://origen-sdk.org/guides) uses this)
20
+ | [Register Descriptions](<%= path "/helpers/register" %>) | Create a tabular register view, similar to that used in device reference manuals
21
+ | [Yammer Comments](<%= path "/helpers/yammer" %>) | Embed a comments section at the bottom of your page using Yammer
22
+ | [Disqus Comments](<%= path "/helpers/disqus" %>) | Embed a comments section at the bottom of your page using Disqus
23
+
24
+
25
+ % end
@@ -1,13 +1,13 @@
1
- % render "../layouts/examples.html" do
1
+ % render "../layouts/helpers.html" do
2
2
 
3
3
  # Disqus Comments
4
4
 
5
5
  These helpers make it easy to drop a [Disqus](https://disqus.com/) comments section at the
6
- bottom of your pages, just like [the one below](<%= path "examples/disqus/#Comments" %>).
6
+ bottom of your pages, just like [the one below](<%= path "helpers/disqus/#Comments" %>).
7
7
 
8
8
  Note that such comments will be externally visible and therefore **this should not be used for
9
9
  company internal applications/web pages**. For similar functionality within a company you
10
- can use [Yammer comments](<%= path "examples/yammer" %>) instead if your company uses the
10
+ can use [Yammer comments](<%= path "helpers/yammer" %>) instead if your company uses the
11
11
  Office 365 suite.
12
12
 
13
13
  ## Community Selection
@@ -0,0 +1,113 @@
1
+ % render "../layouts/helpers.html" do
2
+
3
+ # Test Program Flow Documentation
4
+
5
+ This helper will build a web page to document a test program flow the has been created with Origen.
6
+
7
+ [Here is an example](http://origen-sdk.org/link_demo/flows/probe_1_flow/).
8
+
9
+ Multiple flows can be supplied and an [index page like this](http://origen-sdk.org/link_demo/flows)
10
+ is generated to help locate the documentation for a given flow.
11
+
12
+ ## How To Use
13
+
14
+ Call the helper from an <code>after_web_site_compile</code> callback handler in your
15
+ application's <code>config/application.rb</code> like this:
16
+
17
+ ~~~ruby
18
+ def after_web_site_compile(options)
19
+ # First build the program to create a flow model
20
+ Origen.app.runner.launch action: :program, files: "program/probe1.rb"
21
+ # Then the documentation for it
22
+ OrigenDocHelpers.generate_flow_docs layout: "#{Origen.root}/templates/web/layouts/_basic.html.erb", tab: :flows do |d|
23
+ d.page flow: :probe1,
24
+ name: "Probe 1 Flow",
25
+ target: "default.rb"
26
+ end
27
+ end
28
+ ~~~
29
+
30
+ Pages for multiple flows can be created like this:
31
+
32
+ ~~~ruby
33
+ def after_web_site_compile(options)
34
+ # First build the program to create a flow model
35
+ Origen.app.runner.launch action: :program, files: "program/production.list"
36
+ # Then the documentation for it
37
+ OrigenDocHelpers.generate_flow_docs layout: "#{Origen.root}/templates/web/layouts/_basic.html.erb", tab: :flows do |d|
38
+ d.page flow: :probe1,
39
+ name: "Probe 1 Flow",
40
+ target: "default.rb"
41
+ d.page flow: :probe2,
42
+ name: "Probe 2 Flow",
43
+ target: "default.rb"
44
+ d.page flow: :ft,
45
+ name: "Final Test Flow",
46
+ target: "default.rb"
47
+ end
48
+ end
49
+ ~~~
50
+
51
+ Multiple flows can be included on the one page like this:
52
+
53
+ ~~~ruby
54
+ def after_web_site_compile(options)
55
+ # First build the program to create a flow model
56
+ Origen.app.runner.launch action: :program, files: "program/production.list"
57
+ # Then the documentation for it
58
+ OrigenDocHelpers.generate_flow_docs layout: "#{Origen.root}/templates/web/layouts/_basic.html.erb", tab: :flows do |d|
59
+ d.page flows: [:probe1_start, :probe1_middle, :probe1_end],
60
+ name: "Probe 1 Flow",
61
+ target: "default.rb"
62
+ end
63
+ end
64
+ ~~~
65
+
66
+ Or finally the same flow can be documented as generated for different targets:
67
+
68
+ ~~~ruby
69
+ def after_web_site_compile(options)
70
+ # First build the program to create a flow model
71
+ Origen.target.loop targets: ["device_a", "device_b"] do
72
+ Origen.app.runner.launch action: :program, files: "program/production.list"
73
+ end
74
+ # Then the documentation for it
75
+ OrigenDocHelpers.generate_flow_docs layout: "#{Origen.root}/templates/web/layouts/_basic.html.erb", tab: :flows do |d|
76
+ ["device_a", "device_b"].each do |target|
77
+ d.page flows: [:probe1_start, :probe1_middle, :probe1_end],
78
+ name: "Probe 1 Flow",
79
+ target: target
80
+ end
81
+ end
82
+ end
83
+ ~~~
84
+
85
+ ## Options
86
+
87
+ <code>OrigenDocHelpers.generate_flow_docs</code>
88
+
89
+ * <code>:layout</code> - **Required**, supply a full path to your application's layout file
90
+ * Any other options will be passed to your layout file unmodified, e.g. to set the tab in the generated
91
+ pages in the above example
92
+
93
+ <code>page</code>
94
+
95
+ * <code>:flow(s)</code> - **Required**, the ID of the flow or flows to run, this is the ID that would be referenced when running <code>origen testers:run FLOW_ID</code>
96
+ * <code>:name</code> - **Required**, the name of the given flow
97
+ * <code>:target</code> - **Required**, the name of the target that has been used to generate the program model
98
+ * <code>:group</code> - Optional, a heading to group similar flows under on the index page, e.g. "Production", "In Development"
99
+ * <code>:context</code> - Optional, a hash of flow runtime conditions, similar to that accepted by <code>origen testers:run</code>, e.g. <code>{ job: "P1" }</code>. This will determine what tests are included in the documentation.
100
+
101
+ ## Website Integration
102
+
103
+ The flows index page will be generated at path <code>/flows</code> within your application, and it is common
104
+ to create a "Flows(s)" tab in your website's navigation bar to link to this.
105
+
106
+ If your application only has one flow, then the navbar link should be setup to point directly to
107
+ that flows's page.
108
+
109
+ The location of the pages for the individual flows are based on the flow name and will be unique to each application,
110
+ you can find them initially via the index page.
111
+
112
+
113
+ % end