Almirah 0.1.3 → 0.1.5
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 +4 -4
- data/lib/almirah/doc_fabric.rb +45 -5
- data/lib/almirah/doc_items/code_block.rb +27 -0
- data/lib/almirah/doc_items/doc_footer.rb +17 -0
- data/lib/almirah/doc_items/markdown_list.rb +21 -6
- data/lib/almirah/doc_items/text_line.rb +1 -1
- data/lib/almirah/doc_types/index.rb +17 -0
- data/lib/almirah/doc_types/specification.rb +2 -0
- data/lib/almirah/doc_types/traceability.rb +12 -1
- data/lib/almirah/project.rb +42 -0
- data/lib/almirah/templates/page.html +23 -5
- data/lib/almirah.rb +17 -4
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99a9591235fc0f0e1820c572da3c24a1365e93ff7f32a78ceda1083e982f9ad3
|
4
|
+
data.tar.gz: 95a400de1b4ad0c471d1fbbc1ee68339618127ac18d9cb5e9429dc36bda2d252
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f77bcf2b93586fe371b48b863d27604390c22180666441cc8bc7329d2e87d361ce33d08da873b410245d77cabbc0784c285fad17946838fbd9f4d30d1ca34da2
|
7
|
+
data.tar.gz: 5f227475da116c2b5d13a023d3d1cb4476a49a862392819a854ac35e4d0624af20f7abe8730fa092177fa733259953bf1ab410dc96ba3f37d1e635955b4b0647
|
data/lib/almirah/doc_fabric.rb
CHANGED
@@ -8,12 +8,14 @@ require_relative "doc_items/doc_item"
|
|
8
8
|
require_relative "doc_items/heading"
|
9
9
|
require_relative "doc_items/paragraph"
|
10
10
|
require_relative "doc_items/blockquote"
|
11
|
+
require_relative "doc_items/code_block"
|
11
12
|
require_relative "doc_items/todo_block"
|
12
13
|
require_relative "doc_items/controlled_paragraph"
|
13
14
|
require_relative "doc_items/markdown_table"
|
14
15
|
require_relative "doc_items/controlled_table"
|
15
16
|
require_relative "doc_items/image"
|
16
17
|
require_relative "doc_items/markdown_list"
|
18
|
+
require_relative "doc_items/doc_footer"
|
17
19
|
|
18
20
|
class DocFabric
|
19
21
|
|
@@ -39,6 +41,7 @@ class DocFabric
|
|
39
41
|
|
40
42
|
tempMdTable = nil
|
41
43
|
tempMdList = nil
|
44
|
+
tempCodeBlock = nil
|
42
45
|
|
43
46
|
file = File.open( doc.path )
|
44
47
|
file_lines = file.readlines
|
@@ -186,7 +189,7 @@ class DocFabric
|
|
186
189
|
|
187
190
|
doc.items.append(item)
|
188
191
|
|
189
|
-
elsif res = /^(\*\s
|
192
|
+
elsif res = /^(\*\s+)(.*)/.match(s) #check if unordered list start
|
190
193
|
|
191
194
|
if tempMdTable
|
192
195
|
doc.items.append tempMdTable
|
@@ -272,6 +275,32 @@ class DocFabric
|
|
272
275
|
item = Blockquote.new(res[1])
|
273
276
|
item.parent_doc = doc
|
274
277
|
doc.items.append(item)
|
278
|
+
|
279
|
+
elsif res = /^```(\w*)/.match(s) #check if code block
|
280
|
+
|
281
|
+
if tempMdTable
|
282
|
+
doc.items.append tempMdTable
|
283
|
+
tempMdTable = nil
|
284
|
+
end
|
285
|
+
if tempMdList
|
286
|
+
doc.items.append tempMdList
|
287
|
+
tempMdList = nil
|
288
|
+
end
|
289
|
+
|
290
|
+
suggested_format = ""
|
291
|
+
if res.length == 2
|
292
|
+
suggested_format = res[1]
|
293
|
+
end
|
294
|
+
|
295
|
+
if tempCodeBlock
|
296
|
+
# close already opened block
|
297
|
+
doc.items.append(tempCodeBlock)
|
298
|
+
tempCodeBlock = nil
|
299
|
+
else
|
300
|
+
#start code block
|
301
|
+
tempCodeBlock = CodeBlock.new(suggested_format)
|
302
|
+
tempCodeBlock.parent_doc = doc
|
303
|
+
end
|
275
304
|
|
276
305
|
elsif res = /^TODO\:(.*)/.match(s) #check if TODO block
|
277
306
|
|
@@ -305,10 +334,13 @@ class DocFabric
|
|
305
334
|
tempMdList = nil
|
306
335
|
end
|
307
336
|
end
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
337
|
+
if tempCodeBlock
|
338
|
+
tempCodeBlock.code_lines.append(s)
|
339
|
+
else
|
340
|
+
item = Paragraph.new(s)
|
341
|
+
item.parent_doc = doc
|
342
|
+
doc.items.append(item)
|
343
|
+
end
|
312
344
|
end
|
313
345
|
else
|
314
346
|
if tempMdList # lists are separated by emty line from each other
|
@@ -326,5 +358,13 @@ class DocFabric
|
|
326
358
|
doc.items.append tempMdList
|
327
359
|
tempMdList = nil
|
328
360
|
end
|
361
|
+
if tempCodeBlock
|
362
|
+
doc.items.append tempCodeBlock
|
363
|
+
tempCodeBlock = nil
|
364
|
+
end
|
365
|
+
# Add footer to close opened tables if any
|
366
|
+
item = DocFooter.new
|
367
|
+
item.parent_doc = doc
|
368
|
+
doc.items.append(item)
|
329
369
|
end
|
330
370
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative "doc_item"
|
2
|
+
|
3
|
+
class CodeBlock < DocItem
|
4
|
+
|
5
|
+
attr_accessor :suggested_format
|
6
|
+
attr_accessor :code_lines
|
7
|
+
|
8
|
+
def initialize(suggested_format)
|
9
|
+
@suggested_format = suggested_format
|
10
|
+
@code_lines = Array.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_html
|
14
|
+
s = ''
|
15
|
+
|
16
|
+
if @@htmlTableRenderInProgress
|
17
|
+
s += "</table>\n"
|
18
|
+
@@htmlTableRenderInProgress = false
|
19
|
+
end
|
20
|
+
s += "<code>"
|
21
|
+
@code_lines.each do |l|
|
22
|
+
s += l + " </br>"
|
23
|
+
end
|
24
|
+
s += "</code>\n"
|
25
|
+
return s
|
26
|
+
end
|
27
|
+
end
|
@@ -47,7 +47,9 @@ class MarkdownList < DocItem
|
|
47
47
|
|
48
48
|
elsif pos < @@lists_stack[-1].indent_position
|
49
49
|
|
50
|
-
@@lists_stack.
|
50
|
+
while pos < @@lists_stack[-1].indent_position
|
51
|
+
@@lists_stack.pop
|
52
|
+
end
|
51
53
|
@@lists_stack[-1].rows.append(row)
|
52
54
|
|
53
55
|
else
|
@@ -70,14 +72,27 @@ class MarkdownList < DocItem
|
|
70
72
|
def calculate_text_position(s)
|
71
73
|
s.downcase
|
72
74
|
pos = 0
|
73
|
-
|
75
|
+
state = 'looking_for_list_item_marker'
|
74
76
|
s.each_char do |c|
|
75
|
-
if
|
76
|
-
if c
|
77
|
+
if state == 'looking_for_list_item_marker'
|
78
|
+
if c == '*'
|
79
|
+
state = 'looking_for_space'
|
80
|
+
elsif numeric?(c)
|
81
|
+
state = 'looking_for_dot'
|
82
|
+
end
|
83
|
+
elsif state == 'looking_for_dot'
|
84
|
+
if c == '.'
|
85
|
+
state = 'looking_for_space'
|
86
|
+
end
|
87
|
+
elsif state == 'looking_for_space'
|
88
|
+
if c == ' ' || c == '\t'
|
89
|
+
state = 'looking_for_non_space'
|
90
|
+
end
|
91
|
+
elsif state == 'looking_for_non_space'
|
92
|
+
if c != ' ' || c != '\t'
|
93
|
+
state = 'list_item_text_pos_found'
|
77
94
|
break
|
78
95
|
end
|
79
|
-
elsif c == ' ' || c == '\t'
|
80
|
-
space_detected = true
|
81
96
|
end
|
82
97
|
pos += 1
|
83
98
|
end
|
@@ -155,7 +155,7 @@ class TextLine
|
|
155
155
|
def link(link_text, link_url)
|
156
156
|
|
157
157
|
# define default result first
|
158
|
-
result = "<a href=\"#{link_url}\" class=\"external\">#{link_text}</a>"
|
158
|
+
result = "<a target=\"_blank\" rel=\"noopener\" href=\"#{link_url}\" class=\"external\">#{link_text}</a>"
|
159
159
|
|
160
160
|
lazy_doc_id, anchor = nil, nil
|
161
161
|
|
@@ -34,6 +34,7 @@ class Index < BaseDocument
|
|
34
34
|
s += "\t\t<th>Items<br>w/ Downlinks</th>\n"
|
35
35
|
s += "\t\t<th>Covered<br>by Tests</th>\n"
|
36
36
|
s += "\t\t<th>Duplicated<br>ids</th>\n"
|
37
|
+
s += "\t\t<th>Wrong<br>links</th>\n"
|
37
38
|
s += "\t\t<th>TODOs</th>\n"
|
38
39
|
s += "\t\t<th>Last Used<br>id</th>\n"
|
39
40
|
s += "</thead>\n"
|
@@ -63,6 +64,22 @@ class Index < BaseDocument
|
|
63
64
|
else
|
64
65
|
s += "\t\t<td class=\"item_id\" style='width: 7%;'>#{doc.duplicated_ids_number.to_s}</td>\n"
|
65
66
|
end
|
67
|
+
|
68
|
+
if doc.wrong_links_hash.length >0
|
69
|
+
s += "\t\t<td class=\"item_id\" style='width: 7%; background-color: #fcc;'>"
|
70
|
+
s += "<div id=\"DL_#{doc.id}wl\" style=\"display: block;\">"
|
71
|
+
s += "<a href=\"#\" onclick=\"downlink_OnClick(this.parentElement); return false;\" class=\"external\">#{doc.wrong_links_hash.length.to_s}</a>"
|
72
|
+
s += "</div>"
|
73
|
+
s += "<div id=\"DLS_#{doc.id}wl\" style=\"display: none;\">"
|
74
|
+
doc.wrong_links_hash.each do |wrong_lnk, item|
|
75
|
+
s += "\t\t\t<a href=\"./specifications/#{doc.id}/#{doc.id}.html##{item.id}\" class=\"external\">#{wrong_lnk}</a>\n<br>"
|
76
|
+
end
|
77
|
+
s += "</div>"
|
78
|
+
s += "</td>\n"
|
79
|
+
else
|
80
|
+
s += "\t\t<td class=\"item_id\" style='width: 7%;'>#{doc.wrong_links_hash.length.to_s}</td>\n"
|
81
|
+
end
|
82
|
+
|
66
83
|
if doc.todo_blocks.length >0
|
67
84
|
color = "background-color: #fcc;"
|
68
85
|
else
|
@@ -6,6 +6,7 @@ class Specification < BaseDocument
|
|
6
6
|
attr_accessor :dictionary
|
7
7
|
attr_accessor :controlled_items
|
8
8
|
attr_accessor :todo_blocks
|
9
|
+
attr_accessor :wrong_links_hash
|
9
10
|
|
10
11
|
attr_accessor :items_with_uplinks_number
|
11
12
|
attr_accessor :items_with_downlinks_number
|
@@ -25,6 +26,7 @@ class Specification < BaseDocument
|
|
25
26
|
@dictionary = Hash.new
|
26
27
|
@duplicates_list = Array.new
|
27
28
|
@todo_blocks = Array.new
|
29
|
+
@wrong_links_hash = Hash.new
|
28
30
|
|
29
31
|
@items_with_uplinks_number = 0
|
30
32
|
@items_with_downlinks_number = 0
|
@@ -57,7 +57,7 @@ class Traceability < BaseDocument
|
|
57
57
|
def render_table_row(top_item)
|
58
58
|
s = ""
|
59
59
|
top_f_text = top_item.format_string( top_item.text )
|
60
|
-
|
60
|
+
|
61
61
|
if top_item.down_links
|
62
62
|
|
63
63
|
if @is_agregated
|
@@ -81,6 +81,7 @@ class Traceability < BaseDocument
|
|
81
81
|
end
|
82
82
|
|
83
83
|
else
|
84
|
+
top_item_rendered = false
|
84
85
|
top_item.down_links.each do |bottom_item|
|
85
86
|
|
86
87
|
id_color = ""
|
@@ -97,8 +98,18 @@ class Traceability < BaseDocument
|
|
97
98
|
s += "\t\t<td class=\"item_text\" style='width: 34%;'>#{bottom_f_text}</td>\n"
|
98
99
|
s += "\t\t<td class=\"item_text\" style='width: 16%;'>#{document_section}</td>\n"
|
99
100
|
s += "\t</tr>\n"
|
101
|
+
top_item_rendered = true
|
100
102
|
end
|
101
103
|
end
|
104
|
+
unless top_item_rendered
|
105
|
+
s += "\t<tr>\n"
|
106
|
+
s += "\t\t<td class=\"item_id\" #{id_color}><a href=\"./../#{top_item.parent_doc.id}/#{top_item.parent_doc.id}.html##{top_item.id}\" class=\"external\">#{top_item.id}</a></td>\n"
|
107
|
+
s += "\t\t<td class=\"item_text\" style='width: 34%;'>#{top_f_text}</td>\n"
|
108
|
+
s += "\t\t<td class=\"item_id\"></td>\n"
|
109
|
+
s += "\t\t<td class=\"item_text\" style='width: 34%;'></td>\n"
|
110
|
+
s += "\t\t<td class=\"item_text\" style='width: 16%;'></td>\n"
|
111
|
+
s += "\t</tr>\n"
|
112
|
+
end
|
102
113
|
end
|
103
114
|
else
|
104
115
|
s += "\t<tr>\n"
|
data/lib/almirah/project.rb
CHANGED
@@ -15,6 +15,7 @@ class Project
|
|
15
15
|
attr_accessor :specifications_dictionary
|
16
16
|
attr_accessor :index
|
17
17
|
attr_accessor :project
|
18
|
+
attr_accessor :on_server
|
18
19
|
|
19
20
|
def initialize(path)
|
20
21
|
@project_root_directory = path
|
@@ -25,6 +26,7 @@ class Project
|
|
25
26
|
@specifications_dictionary = Hash.new
|
26
27
|
@index = nil
|
27
28
|
@project = self
|
29
|
+
@on_server = false
|
28
30
|
|
29
31
|
FileUtils.remove_dir(@project_root_directory + "/build", true)
|
30
32
|
end
|
@@ -35,6 +37,7 @@ class Project
|
|
35
37
|
parse_all_protocols
|
36
38
|
link_all_specifications
|
37
39
|
link_all_protocols
|
40
|
+
check_wrong_specification_referenced
|
38
41
|
create_index
|
39
42
|
render_all_specifications(@specifications)
|
40
43
|
render_all_specifications(@traceability_matrices)
|
@@ -49,6 +52,7 @@ class Project
|
|
49
52
|
parse_test_run test_run
|
50
53
|
link_all_specifications
|
51
54
|
link_all_protocols
|
55
|
+
check_wrong_specification_referenced
|
52
56
|
create_index
|
53
57
|
render_all_specifications(@specifications)
|
54
58
|
render_all_specifications(@traceability_matrices)
|
@@ -123,6 +127,37 @@ class Project
|
|
123
127
|
end
|
124
128
|
end
|
125
129
|
|
130
|
+
def check_wrong_specification_referenced
|
131
|
+
|
132
|
+
available_specification_ids = Hash.new
|
133
|
+
|
134
|
+
@specifications.each do |s|
|
135
|
+
available_specification_ids[ s.id.to_s.downcase ] = s
|
136
|
+
end
|
137
|
+
|
138
|
+
@specifications.each do |s|
|
139
|
+
s.up_link_doc_id.each do |key, value|
|
140
|
+
unless available_specification_ids.has_key?(key)
|
141
|
+
# now key points to the doc_id that does not exist
|
142
|
+
wrong_doc_id = key
|
143
|
+
# find the item that reference to it
|
144
|
+
s.controlled_items.each do |item|
|
145
|
+
unless item.up_link_ids.nil?
|
146
|
+
item.up_link_ids.each do |up_link_id|
|
147
|
+
if tmp = /^([a-zA-Z]+)[-]\d+/.match(up_link_id) # SRS
|
148
|
+
if tmp[1].downcase == wrong_doc_id
|
149
|
+
# we got it finally!
|
150
|
+
s.wrong_links_hash[ up_link_id.to_s ] = item
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
126
161
|
def link_two_specifications(doc_A, doc_B)
|
127
162
|
|
128
163
|
if doc_B.up_link_doc_id.has_key?(doc_A.id.to_s)
|
@@ -149,6 +184,13 @@ class Project
|
|
149
184
|
top_document.items_with_downlinks_number += 1 # for statistics
|
150
185
|
end
|
151
186
|
topItem.down_links.append(item)
|
187
|
+
else
|
188
|
+
# check if there is a non existing link with the right doc_id
|
189
|
+
if tmp = /^([a-zA-Z]+)[-]\d+/.match(up_lnk) # SRS
|
190
|
+
if tmp[1].downcase == top_document.id.downcase
|
191
|
+
bottom_document.wrong_links_hash[ up_lnk ] = item
|
192
|
+
end
|
193
|
+
end
|
152
194
|
end
|
153
195
|
end
|
154
196
|
end
|
@@ -145,6 +145,15 @@
|
|
145
145
|
margin-top: 4px;
|
146
146
|
margin-bottom: 4px;
|
147
147
|
}
|
148
|
+
code {
|
149
|
+
display: block;
|
150
|
+
background:#ffffee;
|
151
|
+
border-left: 3px double #bbb;
|
152
|
+
font-family: Consolas, Menlo, "Liberation Mono", Courier, monospace;
|
153
|
+
padding: 4px 1em 4px 4px;
|
154
|
+
margin-top: 4px;
|
155
|
+
margin-bottom: 4px;
|
156
|
+
}
|
148
157
|
div.todoblock {
|
149
158
|
display: block;
|
150
159
|
background:#fcc;
|
@@ -294,6 +303,13 @@ window.onload = (event) => {
|
|
294
303
|
elem.style.width = "640px";
|
295
304
|
}
|
296
305
|
}
|
306
|
+
// Scroll a bit to make navigated anchor visible
|
307
|
+
setTimeout(function() {
|
308
|
+
window.scrollBy({
|
309
|
+
top: -40,
|
310
|
+
behavior: "smooth"
|
311
|
+
});
|
312
|
+
}, 200);
|
297
313
|
};
|
298
314
|
|
299
315
|
function downlink_OnClick(clicked){
|
@@ -307,6 +323,8 @@ function navigate_to_home(){
|
|
307
323
|
if (document.title != "Document Index")
|
308
324
|
{
|
309
325
|
window.location.href = "./../../index.html";
|
326
|
+
}else{
|
327
|
+
window.location.href = "./index.html";
|
310
328
|
}
|
311
329
|
}
|
312
330
|
|
@@ -341,16 +359,16 @@ function modal_close_OnClick(clicked){
|
|
341
359
|
</div>
|
342
360
|
<div id="content" href="javascript:void(0)" onclick="closeNav()">
|
343
361
|
{{CONTENT}}
|
344
|
-
</div
|
345
|
-
</div
|
362
|
+
</div><!-- content -->
|
363
|
+
</div><!-- main -->
|
364
|
+
<div id="footer">
|
365
|
+
Powered by <a target="_blank" rel="noopener" href="https://www.almirah.site/">Almirah Framework</a>
|
366
|
+
</div><!-- footer -->
|
346
367
|
<!-- The modal window for image zoom -->
|
347
368
|
<div id="image_modal_div" class="modal">
|
348
369
|
<span class="modal_close_btn" href="javascript:void(0)" onclick="modal_close_OnClick(this)">×</span>
|
349
370
|
<img class="modal_image" id="modal_image_id">
|
350
371
|
<div id="modal_image_caption"></div>
|
351
372
|
</div>
|
352
|
-
<div id="footer">
|
353
|
-
Powered by <a target="_blank" rel="noopener" href="https://www.almirah.site/">Almirah Framework</a>
|
354
|
-
</div>
|
355
373
|
</body>
|
356
374
|
|
data/lib/almirah.rb
CHANGED
@@ -7,9 +7,9 @@ class CLI < Thor
|
|
7
7
|
def please(project_folder)
|
8
8
|
a = Almirah.new project_folder
|
9
9
|
if options[:results]
|
10
|
-
a.results options[:results]
|
10
|
+
a.results( options[:results], false )
|
11
11
|
else
|
12
|
-
a.default
|
12
|
+
a.default(false)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -18,6 +18,17 @@ class CLI < Thor
|
|
18
18
|
a = Almirah.new project_folder
|
19
19
|
a.transform "docx"
|
20
20
|
end
|
21
|
+
|
22
|
+
option :results
|
23
|
+
desc "server <project_folder>", "say <project_folder>"
|
24
|
+
def server(project_folder)
|
25
|
+
a = Almirah.new project_folder
|
26
|
+
if options[:results]
|
27
|
+
a.results( options[:results], true )
|
28
|
+
else
|
29
|
+
a.default(true)
|
30
|
+
end
|
31
|
+
end
|
21
32
|
end
|
22
33
|
|
23
34
|
class Almirah
|
@@ -32,7 +43,8 @@ class Almirah
|
|
32
43
|
File.expand_path './..', File.dirname(__FILE__)
|
33
44
|
end
|
34
45
|
|
35
|
-
def results( test_run )
|
46
|
+
def results( test_run, on_server )
|
47
|
+
@project.on_server = on_server
|
36
48
|
@project.specifications_and_results test_run
|
37
49
|
end
|
38
50
|
|
@@ -40,7 +52,8 @@ class Almirah
|
|
40
52
|
@project.transform file_extension
|
41
53
|
end
|
42
54
|
|
43
|
-
def default()
|
55
|
+
def default(on_server)
|
56
|
+
@project.on_server = on_server
|
44
57
|
@project.specifications_and_protocols
|
45
58
|
end
|
46
59
|
|
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.1.
|
4
|
+
version: 0.1.5
|
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-
|
11
|
+
date: 2024-04-28 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: The software part of the Almirah framework
|
14
14
|
email: oleksandr.ivanov.development@gmail.com
|
@@ -21,9 +21,11 @@ files:
|
|
21
21
|
- lib/almirah.rb
|
22
22
|
- lib/almirah/doc_fabric.rb
|
23
23
|
- lib/almirah/doc_items/blockquote.rb
|
24
|
+
- lib/almirah/doc_items/code_block.rb
|
24
25
|
- lib/almirah/doc_items/controlled_paragraph.rb
|
25
26
|
- lib/almirah/doc_items/controlled_table.rb
|
26
27
|
- lib/almirah/doc_items/controlled_table_row.rb
|
28
|
+
- lib/almirah/doc_items/doc_footer.rb
|
27
29
|
- lib/almirah/doc_items/doc_item.rb
|
28
30
|
- lib/almirah/doc_items/heading.rb
|
29
31
|
- lib/almirah/doc_items/image.rb
|
@@ -60,7 +62,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
60
62
|
- !ruby/object:Gem::Version
|
61
63
|
version: '0'
|
62
64
|
requirements: []
|
63
|
-
rubygems_version: 3.5.
|
65
|
+
rubygems_version: 3.5.9
|
64
66
|
signing_key:
|
65
67
|
specification_version: 4
|
66
68
|
summary: Almirah
|