Almirah 0.2.4 → 0.2.6

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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/bin/almirah +4 -4
  3. data/lib/almirah/doc_fabric.rb +65 -65
  4. data/lib/almirah/doc_items/blockquote.rb +21 -21
  5. data/lib/almirah/doc_items/code_block.rb +26 -26
  6. data/lib/almirah/doc_items/controlled_paragraph.rb +112 -112
  7. data/lib/almirah/doc_items/controlled_table.rb +224 -224
  8. data/lib/almirah/doc_items/controlled_table_row.rb +22 -22
  9. data/lib/almirah/doc_items/doc_footer.rb +16 -16
  10. data/lib/almirah/doc_items/doc_item.rb +22 -20
  11. data/lib/almirah/doc_items/frontmatter.rb +9 -0
  12. data/lib/almirah/doc_items/heading.rb +93 -93
  13. data/lib/almirah/doc_items/image.rb +27 -27
  14. data/lib/almirah/doc_items/markdown_list.rb +156 -158
  15. data/lib/almirah/doc_items/markdown_table.rb +61 -63
  16. data/lib/almirah/doc_items/paragraph.rb +25 -27
  17. data/lib/almirah/doc_items/text_line.rb +296 -296
  18. data/lib/almirah/doc_items/todo_block.rb +21 -21
  19. data/lib/almirah/doc_parser.rb +378 -330
  20. data/lib/almirah/doc_types/base_document.rb +64 -70
  21. data/lib/almirah/doc_types/coverage.rb +95 -81
  22. data/lib/almirah/doc_types/index.rb +173 -169
  23. data/lib/almirah/doc_types/persistent_document.rb +17 -20
  24. data/lib/almirah/doc_types/protocol.rb +24 -24
  25. data/lib/almirah/doc_types/specification.rb +67 -67
  26. data/lib/almirah/doc_types/traceability.rb +142 -142
  27. data/lib/almirah/dom/doc_section.rb +25 -25
  28. data/lib/almirah/dom/document.rb +78 -72
  29. data/lib/almirah/navigation_pane.rb +16 -16
  30. data/lib/almirah/project.rb +287 -306
  31. data/lib/almirah/project_configuration.rb +41 -41
  32. data/lib/almirah/project_template.rb +298 -0
  33. data/lib/almirah/project_utility.rb +52 -0
  34. data/lib/almirah/search/specifications_db.rb +79 -83
  35. data/lib/almirah/templates/css/main.css +300 -300
  36. data/lib/almirah/templates/css/search.css +40 -40
  37. data/lib/almirah/templates/page.html +42 -42
  38. data/lib/almirah/templates/scripts/main.js +111 -111
  39. data/lib/almirah/templates/scripts/orama_search.js +138 -138
  40. data/lib/almirah.rb +93 -49
  41. metadata +28 -5
@@ -1,306 +1,287 @@
1
- # frozen_string_literal: true
2
-
3
- require 'fileutils'
4
- require_relative 'doc_fabric'
5
- require_relative 'navigation_pane'
6
- require_relative 'doc_types/traceability'
7
- require_relative 'doc_types/index'
8
- require_relative 'search/specifications_db'
9
-
10
- class Project # rubocop:disable Metrics/ClassLength,Style/Documentation
11
- attr_accessor :specifications, :protocols, :traceability_matrices, :coverage_matrices, :specifications_dictionary,
12
- :index, :project, :configuration
13
-
14
- def initialize(configuration)
15
- @configuration = configuration
16
- @specifications = []
17
- @protocols = []
18
- @traceability_matrices = []
19
- @coverage_matrices = []
20
- @specifications_dictionary = {}
21
- @covered_specifications_dictionary = {}
22
- @index = nil
23
- @project = self
24
- FileUtils.remove_dir("#{@configuration.project_root_directory}/build", true)
25
- copy_resources
26
- end
27
-
28
- def copy_resources
29
- # scripts
30
- gem_root = File.expand_path './../..', File.dirname(__FILE__)
31
- src_folder = "#{gem_root}/lib/almirah/templates/scripts"
32
- dst_folder = "#{@configuration.project_root_directory}/build/scripts"
33
- FileUtils.mkdir_p(dst_folder)
34
- FileUtils.copy_entry(src_folder, dst_folder)
35
- # css
36
- src_folder = "#{gem_root}/lib/almirah/templates/css"
37
- dst_folder = "#{@configuration.project_root_directory}/build/css"
38
- FileUtils.mkdir_p(dst_folder)
39
- FileUtils.copy_entry(src_folder, dst_folder)
40
- end
41
-
42
- def specifications_and_protocols # rubocop:disable Metrics/MethodLength
43
- parse_all_specifications
44
- parse_all_protocols
45
- link_all_specifications
46
- link_all_protocols
47
- check_wrong_specification_referenced
48
- create_index
49
- render_all_specifications(@specifications)
50
- render_all_specifications(@traceability_matrices)
51
- render_all_specifications(@coverage_matrices)
52
- render_all_protocols
53
- render_index
54
- create_search_data
55
- end
56
-
57
- def specifications_and_results(test_run) # rubocop:disable Metrics/MethodLength
58
- parse_all_specifications
59
- parse_test_run test_run
60
- link_all_specifications
61
- link_all_protocols
62
- check_wrong_specification_referenced
63
- create_index
64
- render_all_specifications(@specifications)
65
- render_all_specifications(@traceability_matrices)
66
- render_all_specifications(@coverage_matrices)
67
- render_all_protocols
68
- render_index
69
- create_search_data
70
- end
71
-
72
- def transform(file_extension)
73
- transform_all_specifications file_extension
74
- end
75
-
76
- def transform_all_specifications(_file_extension)
77
- path = @configuration.project_root_directory
78
-
79
- # find all specifications
80
- Dir.glob("#{path}/specifications/**/*.md").each do |f|
81
- puts f
82
- # make a copy with another extention to preserve the content
83
- f_directory = File.dirname(f)
84
- f_name = File.basename(f, File.extname(f)).downcase + '._md'
85
- FileUtils.copy_file(f, "#{f_directory}/#{f_name}")
86
- # transform the original one
87
- # but do nothing for now - TODO
88
- end
89
- end
90
-
91
- def parse_all_specifications
92
- path = @configuration.project_root_directory
93
- # do a lasy pass first to get the list of documents id
94
- Dir.glob("#{path}/specifications/**/*.md").each do |f|
95
- DocFabric.add_lazy_doc_id(f)
96
- end
97
- # parse documents in the second pass
98
- Dir.glob("#{path}/specifications/**/*.md").each do |f| # rubocop:disable Style/CombinableLoops
99
- doc = DocFabric.create_specification(f)
100
- @specifications.append(doc)
101
- @specifications_dictionary[doc.id.to_s.downcase] = doc
102
- end
103
- end
104
-
105
- def parse_all_protocols
106
- path = @configuration.project_root_directory
107
- Dir.glob("#{path}/tests/protocols/**/*.md").each do |f|
108
- doc = DocFabric.create_protocol(f)
109
- @protocols.append(doc)
110
- end
111
- end
112
-
113
- def parse_test_run(test_run)
114
- path = @configuration.project_root_directory
115
- Dir.glob("#{path}/tests/runs/#{test_run}/**/*.md").each do |f|
116
- doc = DocFabric.create_protocol(f)
117
- @protocols.append(doc)
118
- end
119
- end
120
-
121
- def link_all_specifications # rubocop:disable Metrics/MethodLength
122
- comb_list = @specifications.combination(2)
123
- comb_list.each do |c|
124
- link_two_specifications(c[0], c[1])
125
- # puts "Link: #{c[0].id} - #{c[1].id}"
126
- end
127
- # separatelly create design inputs treceability
128
- @configuration.get_design_inputs.each do |i|
129
- next unless @specifications_dictionary.key? i.to_s.downcase
130
-
131
- document = @specifications_dictionary[i.to_s.downcase]
132
- if document
133
- doc = DocFabric.create_traceability_document(document, nil)
134
- @traceability_matrices.append doc
135
- end
136
- end
137
- end
138
-
139
- def link_all_protocols # rubocop:disable Metrics/MethodLength
140
- @protocols.each do |p|
141
- @specifications.each do |s|
142
- if p.up_link_docs.key?(s.id.to_s)
143
- link_protocol_to_spec(p, s)
144
- @covered_specifications_dictionary[s.id.to_s] = s
145
- end
146
- end
147
- end
148
- # create coverage documents
149
- @covered_specifications_dictionary.each do |_key, value|
150
- doc = DocFabric.create_coverage_matrix(value)
151
- @coverage_matrices.append doc
152
- end
153
- end
154
-
155
- def check_wrong_specification_referenced # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
156
- available_specification_ids = {}
157
-
158
- @specifications.each do |s|
159
- available_specification_ids[s.id.to_s.downcase] = s
160
- end
161
-
162
- @specifications.each do |s| # rubocop:disable Style/CombinableLoops
163
- s.up_link_docs.each do |key, _value|
164
- next if available_specification_ids.key?(key)
165
-
166
- # now key points to the doc_id that does not exist
167
- wrong_doc_id = key
168
- # find the item that reference to it
169
- s.controlled_items.each do |item|
170
- next if item.up_link_ids.nil?
171
-
172
- item.up_link_ids.each do |up_link_id|
173
- next unless tmp = /^([a-zA-Z]+)-\d+/.match(up_link_id) # SRS
174
-
175
- if tmp[1].downcase == wrong_doc_id
176
- # we got it finally!
177
- s.wrong_links_hash[up_link_id.to_s] = item
178
- end
179
- end
180
- end
181
- end
182
- end
183
- end
184
-
185
- def link_two_specifications(doc_a, doc_b) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
186
- if doc_b.up_link_docs.key?(doc_a.id.to_s)
187
- top_document = doc_a
188
- bottom_document = doc_b
189
- elsif doc_a.up_link_docs.key?(doc_b.id.to_s)
190
- top_document = doc_b
191
- bottom_document = doc_a
192
- else
193
- return # no links
194
- end
195
- # puts "Link: #{doc_a.id} - #{doc_b.id}"
196
- bottom_document.controlled_items.each do |item|
197
- next unless item.up_link_ids
198
-
199
- item.up_link_ids.each do |up_lnk|
200
- if top_document.dictionary.key?(up_lnk.to_s)
201
-
202
- top_item = top_document.dictionary[up_lnk.to_s]
203
-
204
- unless top_item.down_links
205
- top_item.down_links = []
206
- top_document.items_with_downlinks_number += 1 # for statistics
207
- end
208
- top_item.down_links.append(item)
209
- elsif tmp = /^([a-zA-Z]+)-\d+/.match(up_lnk)
210
- # check if there is a non existing link with the right doc_id
211
- if tmp[1].downcase == top_document.id.downcase
212
- bottom_document.wrong_links_hash[up_lnk] = item
213
- end # SRS
214
- end
215
- end
216
- end
217
- # create treceability document
218
- doc = DocFabric.create_traceability_document(top_document, bottom_document)
219
- @traceability_matrices.append doc
220
- end
221
-
222
- def link_protocol_to_spec(protocol, specification) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
223
- top_document = specification
224
- bottom_document = protocol
225
-
226
- bottom_document.controlled_items.each do |item|
227
- next unless item.up_link_ids
228
-
229
- item.up_link_ids.each do |up_lnk|
230
- if top_document.dictionary.key?(up_lnk.to_s)
231
-
232
- top_item = top_document.dictionary[up_lnk.to_s]
233
-
234
- unless top_item.coverage_links
235
- top_item.coverage_links = []
236
- top_document.items_with_coverage_number += 1 # for statistics
237
- end
238
- top_item.coverage_links.append(item)
239
- elsif tmp = /^([a-zA-Z]+)-\d+/.match(up_lnk)
240
- # check if there is a non existing link with the right doc_id
241
- if tmp[1].downcase == top_document.id.downcase
242
- bottom_document.wrong_links_hash[up_lnk] = item
243
- end # SRS
244
- end
245
- end
246
- end
247
- end
248
-
249
- def create_index
250
- @index = Index.new(@project)
251
- end
252
-
253
- def render_all_specifications(spec_list) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
254
- path = @configuration.project_root_directory
255
-
256
- FileUtils.mkdir_p("#{path}/build/specifications")
257
-
258
- spec_list.each do |doc|
259
- doc.to_console
260
-
261
- img_src_dir = "#{path}/specifications/#{doc.id}/img"
262
- img_dst_dir = "#{path}/build/specifications/#{doc.id}/img"
263
-
264
- FileUtils.mkdir_p(img_dst_dir)
265
-
266
- FileUtils.copy_entry(img_src_dir, img_dst_dir) if File.directory?(img_src_dir)
267
-
268
- nav_pane = NavigationPane.new(doc)
269
- doc.to_html(nav_pane, "#{path}/build/specifications/")
270
- end
271
- end
272
-
273
- def render_all_protocols
274
- path = @configuration.project_root_directory
275
-
276
- FileUtils.mkdir_p("#{path}/build/tests/protocols")
277
-
278
- @protocols.each do |doc|
279
- img_src_dir = "#{path}/tests/protocols/#{doc.id}/img"
280
- img_dst_dir = "#{path}/build/tests/protocols/#{doc.id}/img"
281
-
282
- FileUtils.mkdir_p(img_dst_dir)
283
-
284
- FileUtils.copy_entry(img_src_dir, img_dst_dir) if File.directory?(img_src_dir)
285
-
286
- nav_pane = NavigationPane.new(doc)
287
- doc.to_html(nav_pane, "#{path}/build/tests/protocols/")
288
- end
289
- end
290
-
291
- def render_index
292
- path = @configuration.project_root_directory
293
-
294
- doc = @index
295
- doc.to_console
296
-
297
- doc.to_html("#{path}/build/")
298
- end
299
-
300
- def create_search_data
301
- db = SpecificationsDb.new @specifications
302
- data_path = "#{@configuration.project_root_directory}/build/data"
303
- FileUtils.mkdir_p(data_path)
304
- db.save(data_path)
305
- end
306
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require_relative 'doc_fabric'
5
+ require_relative 'navigation_pane'
6
+ require_relative 'doc_types/traceability'
7
+ require_relative 'doc_types/index'
8
+ require_relative 'search/specifications_db'
9
+
10
+ class Project # rubocop:disable Metrics/ClassLength,Style/Documentation
11
+ attr_accessor :specifications, :protocols, :traceability_matrices, :coverage_matrices, :specifications_dictionary,
12
+ :index, :project, :configuration
13
+
14
+ def initialize(configuration)
15
+ @configuration = configuration
16
+ @specifications = []
17
+ @protocols = []
18
+ @traceability_matrices = []
19
+ @coverage_matrices = []
20
+ @specifications_dictionary = {}
21
+ @covered_specifications_dictionary = {}
22
+ @index = nil
23
+ @project = self
24
+ FileUtils.remove_dir("#{@configuration.project_root_directory}/build", true)
25
+ copy_resources
26
+ end
27
+
28
+ def copy_resources
29
+ # scripts
30
+ gem_root = File.expand_path './../..', File.dirname(__FILE__)
31
+ src_folder = "#{gem_root}/lib/almirah/templates/scripts"
32
+ dst_folder = "#{@configuration.project_root_directory}/build/scripts"
33
+ FileUtils.mkdir_p(dst_folder)
34
+ FileUtils.copy_entry(src_folder, dst_folder)
35
+ # css
36
+ src_folder = "#{gem_root}/lib/almirah/templates/css"
37
+ dst_folder = "#{@configuration.project_root_directory}/build/css"
38
+ FileUtils.mkdir_p(dst_folder)
39
+ FileUtils.copy_entry(src_folder, dst_folder)
40
+ end
41
+
42
+ def specifications_and_protocols # rubocop:disable Metrics/MethodLength
43
+ parse_all_specifications
44
+ parse_all_protocols
45
+ link_all_specifications
46
+ link_all_protocols
47
+ check_wrong_specification_referenced
48
+ create_index
49
+ render_all_specifications(@specifications)
50
+ render_all_specifications(@traceability_matrices)
51
+ render_all_specifications(@coverage_matrices)
52
+ render_all_protocols
53
+ render_index
54
+ create_search_data
55
+ end
56
+
57
+ def specifications_and_results(test_run) # rubocop:disable Metrics/MethodLength
58
+ parse_all_specifications
59
+ parse_test_run test_run
60
+ link_all_specifications
61
+ link_all_protocols
62
+ check_wrong_specification_referenced
63
+ create_index
64
+ render_all_specifications(@specifications)
65
+ render_all_specifications(@traceability_matrices)
66
+ render_all_specifications(@coverage_matrices)
67
+ render_all_protocols
68
+ render_index
69
+ create_search_data
70
+ end
71
+
72
+ def parse_all_specifications
73
+ path = @configuration.project_root_directory
74
+ # do a lasy pass first to get the list of documents id
75
+ Dir.glob("#{path}/specifications/**/*.md").each do |f|
76
+ DocFabric.add_lazy_doc_id(f)
77
+ end
78
+ # parse documents in the second pass
79
+ Dir.glob("#{path}/specifications/**/*.md").each do |f| # rubocop:disable Style/CombinableLoops
80
+ doc = DocFabric.create_specification(f)
81
+ @specifications.append(doc)
82
+ @specifications_dictionary[doc.id.to_s.downcase] = doc
83
+ end
84
+ end
85
+
86
+ def parse_all_protocols
87
+ path = @configuration.project_root_directory
88
+ Dir.glob("#{path}/tests/protocols/**/*.md").each do |f|
89
+ doc = DocFabric.create_protocol(f)
90
+ @protocols.append(doc)
91
+ end
92
+ end
93
+
94
+ def parse_test_run(test_run)
95
+ path = @configuration.project_root_directory
96
+ Dir.glob("#{path}/tests/runs/#{test_run}/**/*.md").each do |f|
97
+ doc = DocFabric.create_protocol(f)
98
+ @protocols.append(doc)
99
+ end
100
+ end
101
+
102
+ def link_all_specifications # rubocop:disable Metrics/MethodLength
103
+ comb_list = @specifications.combination(2)
104
+ comb_list.each do |c|
105
+ link_two_specifications(c[0], c[1])
106
+ # puts "Link: #{c[0].id} - #{c[1].id}"
107
+ end
108
+ # separatelly create design inputs treceability
109
+ @configuration.get_design_inputs.each do |i|
110
+ next unless @specifications_dictionary.key? i.to_s.downcase
111
+
112
+ document = @specifications_dictionary[i.to_s.downcase]
113
+ if document
114
+ doc = DocFabric.create_traceability_document(document, nil)
115
+ @traceability_matrices.append doc
116
+ end
117
+ end
118
+ end
119
+
120
+ def link_all_protocols # rubocop:disable Metrics/MethodLength
121
+ @protocols.each do |p|
122
+ @specifications.each do |s|
123
+ if p.up_link_docs.key?(s.id.to_s)
124
+ link_protocol_to_spec(p, s)
125
+ @covered_specifications_dictionary[s.id.to_s] = s
126
+ end
127
+ end
128
+ end
129
+ # create coverage documents
130
+ @covered_specifications_dictionary.each do |_key, value|
131
+ doc = DocFabric.create_coverage_matrix(value)
132
+ @coverage_matrices.append doc
133
+ end
134
+ end
135
+
136
+ def check_wrong_specification_referenced # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
137
+ available_specification_ids = {}
138
+
139
+ @specifications.each do |s|
140
+ available_specification_ids[s.id.to_s.downcase] = s
141
+ end
142
+
143
+ @specifications.each do |s| # rubocop:disable Style/CombinableLoops
144
+ s.up_link_docs.each do |key, _value|
145
+ next if available_specification_ids.key?(key)
146
+
147
+ # now key points to the doc_id that does not exist
148
+ wrong_doc_id = key
149
+ # find the item that reference to it
150
+ s.controlled_items.each do |item|
151
+ next if item.up_link_ids.nil?
152
+
153
+ item.up_link_ids.each do |up_link_id|
154
+ next unless tmp = /^([a-zA-Z]+)-\d+/.match(up_link_id) # SRS
155
+
156
+ if tmp[1].downcase == wrong_doc_id
157
+ # we got it finally!
158
+ s.wrong_links_hash[up_link_id.to_s] = item
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+
166
+ def link_two_specifications(doc_a, doc_b) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
167
+ if doc_b.up_link_docs.key?(doc_a.id.to_s)
168
+ top_document = doc_a
169
+ bottom_document = doc_b
170
+ elsif doc_a.up_link_docs.key?(doc_b.id.to_s)
171
+ top_document = doc_b
172
+ bottom_document = doc_a
173
+ else
174
+ return # no links
175
+ end
176
+ # puts "Link: #{doc_a.id} - #{doc_b.id}"
177
+ bottom_document.controlled_items.each do |item|
178
+ next unless item.up_link_ids
179
+
180
+ item.up_link_ids.each do |up_lnk|
181
+ if top_document.dictionary.key?(up_lnk.to_s)
182
+
183
+ top_item = top_document.dictionary[up_lnk.to_s]
184
+
185
+ unless top_item.down_links
186
+ top_item.down_links = []
187
+ top_document.items_with_downlinks_number += 1 # for statistics
188
+ end
189
+ top_item.down_links.append(item)
190
+ elsif tmp = /^([a-zA-Z]+)-\d+/.match(up_lnk)
191
+ # check if there is a non existing link with the right doc_id
192
+ if tmp[1].downcase == top_document.id.downcase
193
+ bottom_document.wrong_links_hash[up_lnk] = item
194
+ end # SRS
195
+ end
196
+ end
197
+ end
198
+ # create treceability document
199
+ doc = DocFabric.create_traceability_document(top_document, bottom_document)
200
+ @traceability_matrices.append doc
201
+ end
202
+
203
+ def link_protocol_to_spec(protocol, specification) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
204
+ top_document = specification
205
+ bottom_document = protocol
206
+
207
+ bottom_document.controlled_items.each do |item|
208
+ next unless item.up_link_ids
209
+
210
+ item.up_link_ids.each do |up_lnk|
211
+ if top_document.dictionary.key?(up_lnk.to_s)
212
+
213
+ top_item = top_document.dictionary[up_lnk.to_s]
214
+
215
+ unless top_item.coverage_links
216
+ top_item.coverage_links = []
217
+ top_document.items_with_coverage_number += 1 # for statistics
218
+ end
219
+ top_item.coverage_links.append(item)
220
+ elsif tmp = /^([a-zA-Z]+)-\d+/.match(up_lnk)
221
+ # check if there is a non existing link with the right doc_id
222
+ if tmp[1].downcase == top_document.id.downcase
223
+ bottom_document.wrong_links_hash[up_lnk] = item
224
+ end # SRS
225
+ end
226
+ end
227
+ end
228
+ end
229
+
230
+ def create_index
231
+ @index = Index.new(@project)
232
+ end
233
+
234
+ def render_all_specifications(spec_list) # rubocop:disable Metrics/MethodLength
235
+ path = @configuration.project_root_directory
236
+
237
+ FileUtils.mkdir_p("#{path}/build/specifications")
238
+
239
+ spec_list.each do |doc|
240
+ doc.to_console
241
+
242
+ img_src_dir = "#{path}/specifications/#{doc.id}/img"
243
+ img_dst_dir = "#{path}/build/specifications/#{doc.id}/img"
244
+
245
+ FileUtils.mkdir_p(img_dst_dir)
246
+
247
+ FileUtils.copy_entry(img_src_dir, img_dst_dir) if File.directory?(img_src_dir)
248
+
249
+ nav_pane = NavigationPane.new(doc)
250
+ doc.to_html(nav_pane, "#{path}/build/specifications/")
251
+ end
252
+ end
253
+
254
+ def render_all_protocols
255
+ path = @configuration.project_root_directory
256
+
257
+ FileUtils.mkdir_p("#{path}/build/tests/protocols")
258
+
259
+ @protocols.each do |doc|
260
+ img_src_dir = "#{path}/tests/protocols/#{doc.id}/img"
261
+ img_dst_dir = "#{path}/build/tests/protocols/#{doc.id}/img"
262
+
263
+ FileUtils.mkdir_p(img_dst_dir)
264
+
265
+ FileUtils.copy_entry(img_src_dir, img_dst_dir) if File.directory?(img_src_dir)
266
+
267
+ nav_pane = NavigationPane.new(doc)
268
+ doc.to_html(nav_pane, "#{path}/build/tests/protocols/")
269
+ end
270
+ end
271
+
272
+ def render_index
273
+ path = @configuration.project_root_directory
274
+
275
+ doc = @index
276
+ doc.to_console
277
+
278
+ doc.to_html("#{path}/build/")
279
+ end
280
+
281
+ def create_search_data
282
+ db = SpecificationsDb.new @specifications
283
+ data_path = "#{@configuration.project_root_directory}/build/data"
284
+ FileUtils.mkdir_p(data_path)
285
+ db.save(data_path)
286
+ end
287
+ end