Almirah 0.2.4 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
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