Almirah 0.0.6 → 0.0.7

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.
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