Almirah 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b3ac78a8239af2167c9f9e90c66fe8693a51d8909282757710e45b8a0375aba5
4
- data.tar.gz: 544347bbb28b9e7b288f3c9b37e93c487bc6fd0ac863fcfa7c12fb2cc36d0bc7
3
+ metadata.gz: 877a4c7b296af5fa0418113a4287df82661d23903764f73a74b8794d2be22d9a
4
+ data.tar.gz: 4195b1434e0ca4c75177c4af9ea3e97ffa9a373106bda58fa11621ba273df7cf
5
5
  SHA512:
6
- metadata.gz: d0170e32eac2109e8559413261c43a230730da8dc4add50342a807e3a054e57c8f5950e83cce4bdaded5b317697da863c82e13bd13cc0250887336d2ed2de77a
7
- data.tar.gz: 8388732d6f4fd9d4b4e796470d1ce153a635484cf1d9400d48a3eb3f1d2146d70c8be649bac7927832a29990c6745b0dcc9e4ca247c00b6a5e5c5546d68228a0
6
+ metadata.gz: 4425611cadee99f5686c79abbc853d93bbfeb0e729a97168f93842d998daf8e1a879de8e25918fcbd01bd49abe2b842cc192f24d137cd987d77816f606abed15
7
+ data.tar.gz: ca609c497ebde13428c516a0369f860c323f7bcaba740424d125b9a3c4bd2e1955f8f8aec665d6afd088cc44772c4edfaba5dc64f47827be631253111f82a446
@@ -0,0 +1,200 @@
1
+ #
2
+ require_relative "doc_types/base_document"
3
+ require_relative "doc_types/specification"
4
+ require_relative "doc_types/protocol"
5
+ #
6
+ require_relative "doc_items/doc_item"
7
+ require_relative "doc_items/heading"
8
+ require_relative "doc_items/paragraph"
9
+ require_relative "doc_items/blockquote"
10
+ require_relative "doc_items/controlled_paragraph"
11
+ require_relative "doc_items/markdown_table"
12
+ require_relative "doc_items/controlled_table"
13
+ require_relative "doc_items/image"
14
+ require_relative "doc_items/markdown_list"
15
+
16
+ class DocFabric
17
+
18
+ def self.create_specification(path)
19
+ doc = Specification.new path
20
+ DocFabric.parse_document doc
21
+ return doc
22
+ end
23
+
24
+ def self.create_protocol(path)
25
+ doc = Protocol.new path
26
+ DocFabric.parse_document doc
27
+ return doc
28
+ end
29
+
30
+ def self.parse_document(doc)
31
+
32
+ tempMdTable = nil
33
+ tempMdList = nil
34
+
35
+ file = File.open( doc.path )
36
+ file_lines = file.readlines
37
+ file.close
38
+
39
+ file_lines.each do |s|
40
+ if s.lstrip != ""
41
+ if res = /^([#]{1,})\s(.*)/.match(s) # Heading
42
+
43
+ if tempMdTable
44
+ doc.items.append tempMdTable
45
+ tempMdTable = nil
46
+ end
47
+ if tempMdList
48
+ doc.items.append tempMdList
49
+ tempMdList = nil
50
+ end
51
+
52
+ level = res[1].length
53
+ value = res[2]
54
+ item = Heading.new(value, level)
55
+ doc.items.append(item)
56
+ doc.headings.append(item)
57
+
58
+ if level == 1 && doc.title == ""
59
+ doc.title = value
60
+ end
61
+
62
+ elsif res = /^\[(\S*)\]\s+(.*)/.match(s) # Controlled Paragraph
63
+
64
+ if tempMdTable
65
+ doc.items.append tempMdTable
66
+ tempMdTable = nil
67
+ end
68
+ if tempMdList
69
+ doc.items.append tempMdList
70
+ tempMdList = nil
71
+ end
72
+
73
+ id = res[1]
74
+ text = res[2]
75
+
76
+ #check if it contains the uplink
77
+ if tmp = /(.*)\s+>\[(\S*)\]$/.match(text) # >[SRS-001]
78
+
79
+ text = tmp[1]
80
+ up_link = tmp[2]
81
+
82
+ if tmp = /^([a-zA-Z]+)[-]\d+/.match(up_link) # SRS
83
+ doc.up_link_doc_id = tmp[1].downcase
84
+ end
85
+ end
86
+
87
+ item = ControlledParagraph.new( text, id )
88
+ item.up_link = up_link
89
+
90
+ doc.items.append(item)
91
+ doc.dictionary[ id.to_s ] = item #for fast search
92
+ doc.controlled_items.append(item) #for fast search
93
+
94
+ elsif res = /^[!]\[(.*)\]\((.*)\)/.match(s) # Image
95
+
96
+ if tempMdTable
97
+ doc.items.append tempMdTable
98
+ tempMdTable = nil
99
+ end
100
+ if tempMdList
101
+ doc.items.append tempMdList
102
+ tempMdList = nil
103
+ end
104
+
105
+ img_text = res[1]
106
+ img_path = res[2]
107
+
108
+ item = Image.new( img_text, img_path )
109
+
110
+ doc.items.append(item)
111
+
112
+ elsif res = /^(\*\s?)+(.*)/.match(s) #check if bullet list
113
+
114
+ if tempMdTable
115
+ doc.items.append tempMdTable
116
+ tempMdTable = nil
117
+ end
118
+
119
+ row = res[2]
120
+
121
+ if tempMdList
122
+ tempMdList.addRow(row)
123
+ else
124
+ item = MarkdownList.new(row)
125
+ tempMdList = item
126
+ end
127
+
128
+ elsif s[0] == '|' #check if table
129
+
130
+ if tempMdList
131
+ doc.items.append tempMdList
132
+ tempMdList = nil
133
+ end
134
+
135
+ if res = /^[|](-{3,})[|]/.match(s) #check if it is a separator first
136
+
137
+ if tempMdTable
138
+ #separator is found after heading - just skip it
139
+ else
140
+ #separator out of table scope consider it just as a regular paragraph
141
+ item = Paragraph.new(s)
142
+ doc.items.append(item)
143
+ end
144
+
145
+ elsif res = /^[|](.*[|])/.match(s) #check if it looks as a table
146
+
147
+ row = res[1]
148
+
149
+ if tempMdTable
150
+ # check if it is a controlled table
151
+ unless tempMdTable.addRow(row)
152
+ tempMdTable = ControlledTable.new(tempMdTable, doc)
153
+ tempMdTable.addRow(row)
154
+ end
155
+ else
156
+ #start table from heading
157
+ tempMdTable = MarkdownTable.new(row)
158
+ end
159
+ end
160
+
161
+ elsif res = /^[>](.*)/.match(s) #check if blockquote
162
+
163
+ if tempMdTable
164
+ doc.items.append tempMdTable
165
+ tempMdTable = nil
166
+ end
167
+ if tempMdList
168
+ doc.items.append tempMdList
169
+ tempMdList = nil
170
+ end
171
+
172
+ item = Blockquote.new(res[1])
173
+ doc.items.append(item)
174
+
175
+ else # Reqular Paragraph
176
+ if tempMdTable
177
+ doc.items.append tempMdTable
178
+ tempMdTable = nil
179
+ end
180
+ if tempMdList
181
+ doc.items.append tempMdList
182
+ tempMdList = nil
183
+ end
184
+
185
+ item = Paragraph.new(s)
186
+ doc.items.append(item)
187
+ end
188
+ end
189
+ end
190
+ # Finalize non-closed elements
191
+ if tempMdTable
192
+ doc.items.append tempMdTable
193
+ tempMdTable = nil
194
+ end
195
+ if tempMdList
196
+ doc.items.append tempMdList
197
+ tempMdList = nil
198
+ end
199
+ end
200
+ end
@@ -11,11 +11,11 @@ class Blockquote < DocItem
11
11
  def to_html
12
12
  s = ''
13
13
  if @@htmlTableRenderInProgress
14
- s += "</table>\n\r"
14
+ s += "</table>\n"
15
15
  @@htmlTableRenderInProgress = false
16
16
  end
17
17
 
18
- s += "<div class=\"blockquote\"><p>#{@text}</div>\n\r"
18
+ s += "<div class=\"blockquote\"><p>#{@text}</div>\n"
19
19
  return s
20
20
  end
21
21
  end
@@ -5,47 +5,54 @@ class ControlledParagraph < Paragraph
5
5
  attr_accessor :id
6
6
  attr_accessor :up_link
7
7
  attr_accessor :down_links
8
+ attr_accessor :coverage_links
8
9
 
9
10
  def initialize(text, id)
10
11
  @text = text
11
12
  @id = id
12
13
  @up_link = nil
13
14
  @down_links = nil
15
+ @coverage_links = nil
14
16
  end
15
17
 
16
18
  def to_html
17
19
  s = ''
18
20
  unless @@htmlTableRenderInProgress
19
- s += "<table class=\"controlled\">\n\r"
20
- s += "\t<thead> <th>#</th> <th>Text</th> <th>UL</th> <th>DL</th> <th>COV</th> </thead>\n\r"
21
+ s += "<table class=\"controlled\">\n"
22
+ s += "\t<thead> <th>#</th> <th>Text</th> <th>UL</th> <th>DL</th> <th>COV</th> </thead>\n"
21
23
  @@htmlTableRenderInProgress = true
22
24
  end
23
- s += "\t<tr>\n\r"
24
- s += "\t\t<td class=\"item_id\"> <a name=\"#{@id}\"></a>#{@id} </td>\n\r"
25
- s += "\t\t<td class=\"item_text\">#{@text}</td>\n\r"
25
+ s += "\t<tr>\n"
26
+ s += "\t\t<td class=\"item_id\"> <a name=\"#{@id}\"></a>#{@id} </td>\n"
27
+ s += "\t\t<td class=\"item_text\">#{@text}</td>\n"
26
28
 
27
29
  if @up_link
28
30
  if tmp = /^([a-zA-Z]+)[-]\d+/.match(@up_link)
29
31
  up_link_doc_name = tmp[1].downcase
30
32
  end
31
- s += "\t\t<td class=\"item_id\"><a href=\"./../#{up_link_doc_name}/#{up_link_doc_name}.html\" class=\"external\">#{@up_link}</a></td>\n\r"
33
+ s += "\t\t<td class=\"item_id\"><a href=\"./../#{up_link_doc_name}/#{up_link_doc_name}.html\" class=\"external\">#{@up_link}</a></td>\n"
32
34
  else
33
- s += "\t\t<td class=\"item_id\"></td>\n\r"
35
+ s += "\t\t<td class=\"item_id\"></td>\n"
34
36
  end
35
37
 
36
38
  if @down_links
37
39
  if tmp = /^([a-zA-Z]+)[-]\d+/.match(@down_links[0].id) # guessing that all the links refer to one document
38
40
  down_link_doc_name = tmp[1].downcase
39
41
  end
40
- s += "\t\t<td class=\"item_id\"><a href=\"./../#{down_link_doc_name}/#{down_link_doc_name}.html\" class=\"external\">#{@down_links.length}</a></td>\n\r"
42
+ s += "\t\t<td class=\"item_id\"><a href=\"./../#{down_link_doc_name}/#{down_link_doc_name}.html\" class=\"external\">#{@down_links.length}</a></td>\n"
41
43
  else
42
- s += "\t\t<td class=\"item_id\"></td>\n\r"
44
+ s += "\t\t<td class=\"item_id\"></td>\n"
43
45
  end
44
46
 
45
- #s += "\t\t<td></td>\n\r" # UL
46
- #s += "\t\t<td></td>\n\r" # DL
47
- s += "\t\t<td class=\"item_id\"></td>\n\r" # COV
48
- s += "\t</tr>\n\r"
47
+ if @coverage_links
48
+ if tmp = /^(.+)[.]\d+/.match(@coverage_links[0].id) # guessing that all the links refer to one document
49
+ cov_link_doc_name = tmp[1].downcase
50
+ end
51
+ s += "\t\t<td class=\"item_id\"><a href=\"./../../tests/protocols/#{cov_link_doc_name}/#{cov_link_doc_name}.html\" class=\"external\">#{@coverage_links.length}</a></td>\n"
52
+ else
53
+ s += "\t\t<td class=\"item_id\"></td>\n"
54
+ end
55
+ s += "\t</tr>\n"
49
56
  return s
50
57
  end
51
58
 
@@ -0,0 +1,172 @@
1
+ require_relative "controlled_table_row"
2
+
3
+
4
+ class ControlledTableColumn
5
+
6
+ attr_accessor :text
7
+
8
+ def initialize(text)
9
+ @text = text.strip
10
+ end
11
+
12
+ def to_html
13
+ "\t\t<td>#{@text}</td>\n\r"
14
+ end
15
+ end
16
+
17
+
18
+ class RegualrColumn < ControlledTableColumn
19
+
20
+ end
21
+
22
+
23
+ class TestStepNumberColumn < ControlledTableColumn
24
+
25
+ attr_accessor :step_number
26
+
27
+ def initialize(text)
28
+ text = text.strip
29
+ @step_number = text.to_i
30
+ @text = text
31
+ end
32
+
33
+ def to_html
34
+ "\t\t<td style=\"text-align: center;\">#{@text}</td>\n\r"
35
+ end
36
+ end
37
+
38
+
39
+ class TestStepResultColumn < ControlledTableColumn
40
+
41
+ def to_html
42
+ if @text.downcase == "pass"
43
+ "\t\t<td style=\"background-color: #cfc;\">#{@text}</td>\n\r"
44
+ elsif @text.downcase == "fail"
45
+ "\t\t<td style=\"background-color: #fcc;\">#{@text}</td>\n\r"
46
+ else
47
+ "\t\t<td>#{@text}</td>\n\r"
48
+ end
49
+ end
50
+ end
51
+
52
+
53
+ class TestStepReferenceColumn < ControlledTableColumn
54
+
55
+ attr_accessor :up_link
56
+ attr_accessor :up_link_doc_id
57
+
58
+ def initialize(text)
59
+
60
+ @up_link = nil
61
+ @up_link_doc_id = nil
62
+
63
+ if tmp = />\[(\S*)\]/.match(text) # >[SRS-001]
64
+ @up_link = tmp[1]
65
+ if tmp = /^([a-zA-Z]+)[-]\d+/.match(@up_link) # SRS
66
+ @up_link_doc_id = tmp[1].downcase
67
+ end
68
+ end
69
+ end
70
+
71
+ def to_html
72
+ if @up_link
73
+ "\t\t<td class=\"item_id\"><a href=\"./../../../specifications/#{@up_link_doc_id}/#{@up_link_doc_id}.html\" class=\"external\">#{@up_link}</a></td>\n\r"
74
+ else
75
+ "\t\t<td style=\"text-align: center;\"></td>\n\r"
76
+ end
77
+ end
78
+
79
+ end
80
+
81
+
82
+ class ControlledTable < DocItem
83
+
84
+ attr_accessor :column_names
85
+ attr_accessor :rows
86
+ attr_accessor :parent_doc
87
+
88
+ def initialize(markdown_table, parent_doc)
89
+ @parent_doc = parent_doc
90
+ @column_names = markdown_table.column_names
91
+ # copy and re-format existing rows
92
+ @rows = Array.new
93
+
94
+ markdown_table.rows.each do |r|
95
+ @rows.append(format_columns(r))
96
+ end
97
+ end
98
+
99
+ def addRow(row)
100
+
101
+ columns = row.split('|')
102
+
103
+ @rows.append(format_columns(columns))
104
+
105
+ return true
106
+ end
107
+
108
+ def format_columns(columns)
109
+
110
+ new_row = ControlledTableRow.new
111
+
112
+ columns.each_with_index do | element, index |
113
+
114
+ if index == 0 # it is expected that test step id is placed in the first columl
115
+
116
+ col = TestStepNumberColumn.new element
117
+ new_row.columns.append col
118
+ new_row.id = @parent_doc.id + '.' + col.text
119
+
120
+ elsif index + 1 == columns.length # it is expected that a link is placed to the last column only
121
+
122
+ col = TestStepReferenceColumn.new element
123
+ new_row.columns.append col
124
+ # save uplink key but do not rewrite
125
+ if col.up_link_doc_id != nil
126
+ if @parent_doc.up_link_doc_id == ""
127
+ @parent_doc.up_link_doc_id = col.up_link_doc_id
128
+ end
129
+ # save reference to the test step
130
+ new_row.up_link = col.up_link
131
+ @parent_doc.controlled_items.append new_row
132
+ end
133
+
134
+ elsif index + 2 == columns.length # it is expected that test step result is placed to the pre-last column only
135
+
136
+ col = TestStepResultColumn.new element
137
+ new_row.columns.append col
138
+
139
+ else
140
+ col = RegualrColumn.new element
141
+ new_row.columns.append col
142
+ end
143
+ end
144
+ return new_row
145
+ end
146
+
147
+ def to_html
148
+ s = ''
149
+ if @@htmlTableRenderInProgress
150
+ s += "</table>\n"
151
+ @@htmlTableRenderInProgress = false
152
+ end
153
+
154
+ s += "<table class=\"markdown_table\">\n"
155
+ s += "\t<thead>"
156
+
157
+ @column_names.each do |h|
158
+ s += " <th>#{h}</th>"
159
+ end
160
+
161
+ s += " </thead>\n"
162
+
163
+ @rows.each do |row|
164
+ s += row.to_html
165
+ end
166
+
167
+ s += "</table>\n"
168
+
169
+ return s
170
+ end
171
+
172
+ end
@@ -0,0 +1,23 @@
1
+ require_relative "doc_item"
2
+
3
+ class ControlledTableRow < DocItem
4
+
5
+ attr_accessor :id
6
+ attr_accessor :up_link
7
+ attr_accessor :columns
8
+
9
+ def initialize
10
+ @id = ""
11
+ @up_link = ""
12
+ @columns = Array.new
13
+ end
14
+
15
+ def to_html
16
+ s = ""
17
+ s += "\t<tr>\n"
18
+ @columns.each do |col|
19
+ s += col.to_html # "\t\t<td>#{col}</td>\n\r"
20
+ end
21
+ s += "\t</tr>\n"
22
+ end
23
+ end
@@ -14,11 +14,11 @@ class Heading < Paragraph
14
14
  def to_html
15
15
  s = ''
16
16
  if @@htmlTableRenderInProgress
17
- s += "</table>"
17
+ s += "</table>\n"
18
18
  @@htmlTableRenderInProgress = false
19
19
  end
20
20
  headingLevel = level.to_s
21
- s += "<a name=\"#{@anchor_id}\"></a>\n\r"
21
+ s += "<a name=\"#{@anchor_id}\"></a>\n"
22
22
  s += "<h#{headingLevel}> #{@text} <a href=\"\##{@anchor_id}\" class=\"heading_anchor\">"
23
23
  s += "&para;</a></h#{headingLevel}>"
24
24
  return s
@@ -17,7 +17,7 @@ class Image < DocItem
17
17
  def to_html
18
18
  s = ''
19
19
  if @@htmlTableRenderInProgress
20
- s += "</table>\n\r"
20
+ s += "</table>\n"
21
21
  @@htmlTableRenderInProgress = false
22
22
  end
23
23
 
@@ -16,15 +16,15 @@ class MarkdownList < DocItem
16
16
  def to_html
17
17
  s = ''
18
18
  if @@htmlTableRenderInProgress
19
- s += "</table>/n/r"
19
+ s += "</table>\n"
20
20
  @@htmlTableRenderInProgress = false
21
21
  end
22
22
 
23
- s += "<ul>\n\r"
23
+ s += "<ul>\n"
24
24
  @rows.each do |r|
25
- s += "\t<li>#{r}</li>\n\r"
25
+ s += "\t<li>#{r}</li>\n"
26
26
  end
27
- s += "</ul>\n\r"
27
+ s += "</ul>\n"
28
28
 
29
29
  return s
30
30
  end
@@ -11,35 +11,46 @@ class MarkdownTable < DocItem
11
11
  end
12
12
 
13
13
  def addRow(row)
14
+ #check if row contains a link
15
+ if tmp = /(.*)\s+>\[(\S*)\]/.match(row)
16
+ return false # this is not a regular Markdown table.
17
+ # so the table type shall be changed and this row shall be passed one more time
18
+ end
19
+
14
20
  columns = row.split('|')
15
- @rows.append(columns)
21
+ @rows.append(columns.map!{ |x| x.strip })
22
+ return true
16
23
  end
17
24
 
18
25
  def to_html
19
26
  s = ''
20
27
  if @@htmlTableRenderInProgress
21
- s += "</table>"
28
+ s += "</table>\n"
22
29
  @@htmlTableRenderInProgress = false
23
30
  end
24
31
 
25
- s += "<table class=\"markdown_table\">\n\r"
32
+ s += "<table class=\"markdown_table\">\n"
26
33
  s += "\t<thead>"
27
34
 
28
35
  @column_names.each do |h|
29
36
  s += " <th>#{h}</th>"
30
37
  end
31
38
 
32
- s += " </thead>\n\r"
39
+ s += " </thead>\n"
33
40
 
34
41
  @rows.each do |row|
35
- s += "\t<tr>\n\r"
42
+ s += "\t<tr>\n"
36
43
  row.each do |col|
37
- s += "\t\t<td>#{col}</td>\n\r"
44
+ if col.to_i > 0 && col.to_i.to_s == col # autoalign cells with numbers
45
+ s += "\t\t<td style=\"text-align: center;\">#{col}</td>\n"
46
+ else
47
+ s += "\t\t<td>#{col}</td>\n"
48
+ end
38
49
  end
39
- s += "\t</tr>\n\r"
50
+ s += "\t</tr>\n"
40
51
  end
41
52
 
42
- s += "</table>\n\r"
53
+ s += "</table>\n"
43
54
 
44
55
  return s
45
56
  end
@@ -0,0 +1,18 @@
1
+
2
+ class BaseDocument
3
+
4
+ attr_accessor :path
5
+ attr_accessor :items
6
+ attr_accessor :headings
7
+ attr_accessor :title
8
+ attr_accessor :id
9
+
10
+ def initialize(fele_path)
11
+
12
+ @path = fele_path
13
+ @items = Array.new
14
+ @headings = Array.new
15
+ @title = ""
16
+ @id = ""
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "base_document"
2
+
3
+ class Protocol < BaseDocument
4
+
5
+ attr_accessor :up_link_doc_id
6
+ #attr_accessor :dictionary
7
+ attr_accessor :controlled_items
8
+
9
+ def initialize(fele_path)
10
+
11
+ @path = fele_path
12
+ @title = ""
13
+ @items = Array.new
14
+ @headings = Array.new
15
+ @controlled_items = Array.new
16
+ #@dictionary = Hash.new
17
+
18
+ @id = File.basename(fele_path, File.extname(fele_path)).downcase
19
+ @up_link_doc_id = ""
20
+ end
21
+
22
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "base_document"
2
+
3
+ class Specification < BaseDocument
4
+
5
+ attr_accessor :up_link_doc_id
6
+ attr_accessor :dictionary
7
+ attr_accessor :controlled_items
8
+
9
+ def initialize(fele_path)
10
+
11
+ @path = fele_path
12
+ @title = ""
13
+ @items = Array.new
14
+ @headings = Array.new
15
+ @controlled_items = Array.new
16
+ @dictionary = Hash.new
17
+
18
+ @id = File.basename(fele_path, File.extname(fele_path)).downcase
19
+ @up_link_doc_id = ""
20
+ end
21
+
22
+ end
@@ -1,6 +1,3 @@
1
- require_relative "specification"
2
- require_relative "doc_items/doc_item"
3
- require_relative "navigation_pane"
4
1
 
5
2
  class HtmlRender
6
3
 
@@ -25,7 +22,7 @@ class HtmlRender
25
22
  def render()
26
23
  self.htmlRows.append('')
27
24
 
28
- self.document.docItems.each do |item|
25
+ self.document.items.each do |item|
29
26
  a = item.to_html
30
27
  self.htmlRows.append a
31
28
  end
@@ -44,7 +41,9 @@ class HtmlRender
44
41
  file.puts r
45
42
  end
46
43
  elsif s.include?('{{NAV_PANE}}')
47
- file.puts self.nav_pane.to_html
44
+ if @nav_pane
45
+ file.puts self.nav_pane.to_html
46
+ end
48
47
  else
49
48
  file.puts s
50
49
  end
@@ -1,5 +1,3 @@
1
- require_relative "doc_items/doc_item"
2
- require_relative "specification"
3
1
 
4
2
  class NavigationPane
5
3
 
@@ -12,10 +10,10 @@ class NavigationPane
12
10
  def to_html
13
11
  s = "<ul class=\"fa-ul\">\n"
14
12
  @specifications.each do |spec|
15
- s += "\t<li><span class=\"fa-li\"><i class=\"fa fa-folder-open-o\"> </i></span> #{spec.key.downcase}\n"
13
+ s += "\t<li><span class=\"fa-li\"><i class=\"fa fa-folder-open-o\"> </i></span> #{spec.id}\n"
16
14
  s += "\t\t<ul class=\"fa-ul\">\n"
17
15
  s += "\t\t\t<li><span class=\"fa-li\"><i class=\"fa fa-plus-square-o\"> </i></span>\n"
18
- s += "\t\t\t\t<a href=\".\\..\\#{spec.key.downcase }\\#{spec.key.downcase }.html\">#{spec.title}</a>\n"
16
+ s += "\t\t\t\t<a href=\".\\..\\#{spec.id }\\#{spec.id }.html\">#{spec.title}</a>\n"
19
17
  s += "\t\t\t</li>\n"
20
18
  s += "\t\t</ul>\n"
21
19
  s += "\t</li>\n"
@@ -1,11 +1,11 @@
1
- require_relative "doc_items/doc_item"
2
- require_relative "specification"
1
+ require_relative "doc_fabric"
3
2
  require_relative "html_render"
4
3
  require_relative "navigation_pane"
5
4
 
6
5
  class Project
7
6
 
8
7
  attr_accessor :specifications
8
+ attr_accessor :protocols
9
9
  attr_accessor :project_root_directory
10
10
  attr_accessor :gem_root
11
11
  attr_accessor :specifications_dictionary
@@ -13,45 +13,88 @@ class Project
13
13
  def initialize(path, gem_root)
14
14
  @project_root_directory = path
15
15
  @specifications = Array.new
16
+ @protocols = Array.new
16
17
  @gem_root = gem_root
17
18
  @specifications_dictionary = Hash.new
18
19
 
19
- parse_all_documents()
20
- link_all_specifications()
21
- render_all_specifications()
22
-
20
+ FileUtils.remove_dir(@project_root_directory + "/build", true)
23
21
  end
24
22
 
25
- def parse_all_documents
26
-
27
- Dir.glob( "#{@project_root_directory}/**/*.md" ).each do |f|
28
- puts f
29
- spec = Specification.new(f)
30
- @specifications.append(spec)
23
+ def specifications_and_protocols
24
+
25
+ parse_all_specifications
26
+ parse_all_protocols
27
+ link_all_specifications
28
+ link_all_protocols
29
+ render_all_specifications
30
+ render_all_protocols
31
+ end
32
+
33
+ def specifications_and_results( test_run )
34
+
35
+ parse_all_specifications
36
+ parse_test_run test_run
37
+ link_all_specifications
38
+ link_all_protocols
39
+ render_all_specifications
40
+ render_all_protocols
41
+ end
42
+
43
+ def parse_all_specifications
44
+ Dir.glob( "#{@project_root_directory}/specifications/**/*.md" ).each do |f|
45
+ puts "Spec: " + f
46
+ doc = DocFabric.create_specification(f)
47
+ @specifications.append(doc)
48
+ end
49
+ end
50
+
51
+ def parse_all_protocols
52
+ Dir.glob( "#{@project_root_directory}/tests/protocols/**/*.md" ).each do |f|
53
+ puts "Prot: " + f
54
+ doc = DocFabric.create_protocol(f)
55
+ @protocols.append(doc)
56
+ end
57
+ end
58
+
59
+ def parse_test_run( test_run )
60
+ Dir.glob( "#{@project_root_directory}/tests/runs/#{test_run}/**/*.md" ).each do |f|
61
+ puts "Run: " + f
62
+ doc = DocFabric.create_protocol(f)
63
+ @protocols.append(doc)
31
64
  end
32
65
  end
33
66
 
34
67
  def link_all_specifications
35
68
  combList = @specifications.combination(2)
36
69
  combList.each do |c|
37
- self.link_two_specifications(c[0], c[1])
70
+ link_two_specifications(c[0], c[1])
71
+ end
72
+ end
73
+
74
+ def link_all_protocols
75
+ @protocols.each do |p|
76
+ @specifications.each do |s|
77
+ if s.id == p.up_link_doc_id
78
+ link_protocol_to_spec(p,s)
79
+ end
80
+ end
38
81
  end
39
82
  end
40
83
 
41
84
  def link_two_specifications(doc_A, doc_B)
42
85
 
43
- if doc_A.key == doc_B.up_link_key
86
+ if doc_A.id == doc_B.up_link_doc_id
44
87
  top_document = doc_A
45
88
  bottom_document = doc_B
46
- elsif doc_B.key == doc_A.up_link_key
89
+ elsif doc_B.id == doc_A.up_link_doc_id
47
90
  top_document = doc_B
48
91
  bottom_document = doc_A
49
92
  else
50
93
  puts "No Links"
51
94
  return # no links
52
95
  end
53
-
54
- bottom_document.controlledParagraphs.each do |item|
96
+
97
+ bottom_document.controlled_items.each do |item|
55
98
 
56
99
  if top_document.dictionary.has_key?(item.up_link.to_s)
57
100
 
@@ -69,6 +112,25 @@ class Project
69
112
  end
70
113
  end
71
114
 
115
+ def link_protocol_to_spec(protocol, specification)
116
+
117
+ top_document = specification
118
+ bottom_document = protocol
119
+
120
+ bottom_document.controlled_items.each do |item|
121
+
122
+ if top_document.dictionary.has_key?(item.up_link.to_s)
123
+
124
+ topItem = top_document.dictionary[item.up_link.to_s]
125
+
126
+ unless topItem.coverage_links
127
+ topItem.coverage_links = Array.new
128
+ end
129
+ topItem.coverage_links.append(item)
130
+ end
131
+ end
132
+ end
133
+
72
134
  def render_all_specifications
73
135
 
74
136
  # create a sidebar first
@@ -76,13 +138,39 @@ class Project
76
138
 
77
139
  pass = @project_root_directory
78
140
 
79
- FileUtils.remove_dir(pass + "/build", true)
80
141
  FileUtils.mkdir_p(pass + "/build/specifications")
81
142
 
82
- @specifications.each do |spec|
143
+ @specifications.each do |doc|
144
+
145
+ img_src_dir = pass + "/specifications/" + doc.id + "/img"
146
+ img_dst_dir = pass + "/build/specifications/" + doc.id + "/img"
147
+
148
+ FileUtils.mkdir_p(img_dst_dir)
149
+
150
+ if File.directory?(img_src_dir)
151
+ FileUtils.copy_entry( img_src_dir, img_dst_dir )
152
+ end
153
+
154
+ HtmlRender.new( doc, nav_pane,
155
+ @gem_root + "/lib/almirah/templates/page.html",
156
+ "#{pass}/build/specifications/#{doc.id}/#{doc.id}.html" )
157
+ end
158
+ end
159
+
160
+ def render_all_protocols
161
+
162
+ # create a sidebar first
163
+ #nav_pane = NavigationPane.new(@specifications)
164
+
165
+ pass = @project_root_directory
166
+
167
+ # FileUtils.remove_dir(pass + "/build/tests", true)
168
+ FileUtils.mkdir_p(pass + "/build/tests/protocols")
169
+
170
+ @protocols.each do |doc|
83
171
 
84
- img_src_dir = pass + "/specifications/" + spec.key.downcase + "/img"
85
- img_dst_dir = pass + "/build/specifications/" + spec.key.downcase + "/img"
172
+ img_src_dir = pass + "/tests/protocols/" + doc.id + "/img"
173
+ img_dst_dir = pass + "/build/tests/protocols/" + doc.id + "/img"
86
174
 
87
175
  FileUtils.mkdir_p(img_dst_dir)
88
176
 
@@ -90,9 +178,9 @@ class Project
90
178
  FileUtils.copy_entry( img_src_dir, img_dst_dir )
91
179
  end
92
180
 
93
- HtmlRender.new( spec, nav_pane,
181
+ HtmlRender.new( doc, nil,
94
182
  @gem_root + "/lib/almirah/templates/page.html",
95
- "#{pass}/build/specifications/#{spec.key.downcase}/#{spec.key.downcase}.html" )
183
+ "#{pass}/build/tests/protocols/#{doc.id}/#{doc.id}.html" )
96
184
  end
97
185
  end
98
186
  end
@@ -89,7 +89,7 @@
89
89
  background-color:#e1f1fa;
90
90
  padding: 4px;
91
91
  white-space:nowrap;
92
- font-weight:bold;
92
+ font-weight:normal;
93
93
  border: 1px solid #bbb;
94
94
  }
95
95
  table.controlled td {
data/lib/almirah.rb CHANGED
@@ -2,22 +2,36 @@ require "thor"
2
2
  require_relative "almirah/project"
3
3
 
4
4
  class CLI < Thor
5
- desc "please <pass>", "say <pass>"
6
- def please(pass)
7
- Almirah.new().start(pass)
5
+ desc "please <project_folder>", "say <project_folder>"
6
+ option :results
7
+ def please(project_folder)
8
+ a = Almirah.new project_folder
9
+ if options[:results]
10
+ a.results options[:results]
11
+ else
12
+ a.default
13
+ end
8
14
  end
9
15
  end
10
16
 
11
17
  class Almirah
12
18
 
19
+ attr_accessor :project
20
+
21
+ def initialize project_folder
22
+ @project = Project.new project_folder, getGemRoot
23
+ end
24
+
13
25
  def getGemRoot
14
26
  File.expand_path './..', File.dirname(__FILE__)
15
27
  end
16
28
 
17
- def start(pass)
18
-
19
- prj = Project.new pass, getGemRoot
29
+ def results( test_run )
30
+ @project.specifications_and_results test_run
31
+ end
20
32
 
33
+ def default
34
+ @project.specifications_and_protocols
21
35
  end
22
36
 
23
37
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Almirah
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oleksandr Ivanov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-31 00:00:00.000000000 Z
11
+ date: 2024-02-10 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: The software part of the Almirah system
14
14
  email: oleksandr.ivanov.development@gmail.com
@@ -19,18 +19,23 @@ extra_rdoc_files: []
19
19
  files:
20
20
  - bin/almirah
21
21
  - lib/almirah.rb
22
+ - lib/almirah/doc_fabric.rb
22
23
  - lib/almirah/doc_items/blockquote.rb
23
24
  - lib/almirah/doc_items/controlled_paragraph.rb
25
+ - lib/almirah/doc_items/controlled_table.rb
26
+ - lib/almirah/doc_items/controlled_table_row.rb
24
27
  - lib/almirah/doc_items/doc_item.rb
25
28
  - lib/almirah/doc_items/heading.rb
26
29
  - lib/almirah/doc_items/image.rb
27
30
  - lib/almirah/doc_items/markdown_list.rb
28
31
  - lib/almirah/doc_items/markdown_table.rb
29
32
  - lib/almirah/doc_items/paragraph.rb
33
+ - lib/almirah/doc_types/base_document.rb
34
+ - lib/almirah/doc_types/protocol.rb
35
+ - lib/almirah/doc_types/specification.rb
30
36
  - lib/almirah/html_render.rb
31
37
  - lib/almirah/navigation_pane.rb
32
38
  - lib/almirah/project.rb
33
- - lib/almirah/specification.rb
34
39
  - lib/almirah/templates/page.html
35
40
  homepage: http://almirah.site
36
41
  licenses:
@@ -1,194 +0,0 @@
1
- require_relative "doc_items/doc_item"
2
- require_relative "doc_items/heading"
3
- require_relative "doc_items/paragraph"
4
- require_relative "doc_items/blockquote"
5
- require_relative "doc_items/controlled_paragraph"
6
- require_relative "doc_items/markdown_table"
7
- require_relative "doc_items/image"
8
- require_relative "doc_items/markdown_list"
9
-
10
- class Specification
11
-
12
- attr_accessor :path
13
- attr_accessor :docItems
14
- attr_accessor :headings
15
- attr_accessor :title
16
- attr_accessor :key
17
- attr_accessor :up_link_key
18
- attr_accessor :dictionary
19
- attr_accessor :controlledParagraphs
20
- attr_accessor :tempMdTable
21
- attr_accessor :tempMdList
22
-
23
- def initialize(fele_path)
24
-
25
- @path = fele_path
26
- @title = ""
27
- @docItems = Array.new
28
- @headings = Array.new
29
- @controlledParagraphs = Array.new
30
- @dictionary = Hash.new
31
- @tempMdTable = nil
32
- @tempMdList = nil
33
-
34
- @key = File.basename(fele_path, File.extname(fele_path)).upcase
35
- @up_link_key = ""
36
-
37
- self.parse()
38
- end
39
-
40
- def parse()
41
-
42
- file = File.open( self.path )
43
- file_lines = file.readlines
44
- file.close
45
-
46
- file_lines.each do |s|
47
- if s.lstrip != ""
48
- if res = /^([#]{1,})\s(.*)/.match(s) # Heading
49
-
50
- if @tempMdTable
51
- self.docItems.append(@tempMdTable)
52
- @tempMdTable = nil
53
- end
54
- if @tempMdList
55
- self.docItems.append(@tempMdList)
56
- @tempMdList = nil
57
- end
58
-
59
- level = res[1].length
60
- value = res[2]
61
- item = Heading.new(value, level)
62
- self.docItems.append(item)
63
- self.headings.append(item)
64
-
65
- if level == 1 && self.title == ""
66
- self.title = value
67
- end
68
-
69
- elsif res = /^\[(\S*)\]\s+(.*)/.match(s) # Controlled Paragraph
70
-
71
- if @tempMdTable
72
- self.docItems.append(@tempMdTable)
73
- @tempMdTable = nil
74
- end
75
- if @tempMdList
76
- self.docItems.append(@tempMdList)
77
- @tempMdList = nil
78
- end
79
-
80
- id = res[1]
81
- text = res[2]
82
-
83
- #check if it contains the uplink
84
- if tmp = /(.*)\s+>\[(\S*)\]$/.match(text)
85
-
86
- text = tmp[1]
87
- up_link = tmp[2]
88
-
89
- if tmp = /^([a-zA-Z]+)[-]\d+/.match(up_link)
90
- self.up_link_key = tmp[1]
91
- end
92
- end
93
-
94
- item = ControlledParagraph.new( text, id )
95
- item.up_link = up_link
96
-
97
- self.docItems.append(item)
98
- self.dictionary[ id.to_s ] = item #for fast search
99
- self.controlledParagraphs.append(item) #for fast search
100
-
101
- elsif res = /^[!]\[(.*)\]\((.*)\)/.match(s) # Image
102
-
103
- if @tempMdTable
104
- self.docItems.append(@tempMdTable)
105
- @tempMdTable = nil
106
- end
107
- if @tempMdList
108
- self.docItems.append(@tempMdList)
109
- @tempMdList = nil
110
- end
111
-
112
- img_text = res[1]
113
- img_path = res[2]
114
-
115
- item = Image.new( img_text, img_path )
116
-
117
- self.docItems.append(item)
118
-
119
- elsif res = /^(\*\s?)+(.*)/.match(s) #check if bullet list
120
-
121
- if @tempMdTable
122
- self.docItems.append(@tempMdTable)
123
- @tempMdTable = nil
124
- end
125
-
126
- row = res[2]
127
-
128
- if @tempMdList
129
- @tempMdList.addRow(row)
130
- else
131
- item = MarkdownList.new(row)
132
- @tempMdList = item
133
- end
134
-
135
- elsif s[0] == '|' #check if table
136
-
137
- if @tempMdList
138
- self.docItems.append(@tempMdList)
139
- @tempMdList = nil
140
- end
141
-
142
- if res = /^[|](-{3,})[|]/.match(s) #check if it is a separator first
143
-
144
- if @tempMdTable
145
- #separator is found after heading - just skip it
146
- else
147
- #separator out of table scope consider it just as a regular paragraph
148
- item = Paragraph.new(s)
149
- self.docItems.append(item)
150
- end
151
-
152
- elsif res = /^[|](.*[|])/.match(s) #check if it looks as a table
153
-
154
- row = res[1]
155
-
156
- if @tempMdTable
157
- @tempMdTable.addRow(row)
158
- else
159
- #start table from heading
160
- @tempMdTable = MarkdownTable.new(row)
161
- end
162
- end
163
-
164
- elsif res = /^[>](.*)/.match(s) #check if blockquote
165
-
166
- if @tempMdTable
167
- self.docItems.append(@tempMdTable)
168
- @tempMdTable = nil
169
- end
170
- if @tempMdList
171
- self.docItems.append(@tempMdList)
172
- @tempMdList = nil
173
- end
174
-
175
- item = Blockquote.new(res[1])
176
- self.docItems.append(item)
177
-
178
- else # Reqular Paragraph
179
- if @tempMdTable
180
- self.docItems.append(@tempMdTable)
181
- @tempMdTable = nil
182
- end
183
- if @tempMdList
184
- self.docItems.append(@tempMdList)
185
- @tempMdList = nil
186
- end
187
-
188
- item = Paragraph.new(s)
189
- self.docItems.append(item)
190
- end
191
- end
192
- end
193
- end
194
- end