Almirah 0.2.3 → 0.2.5

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