dim-toolkit 2.1.1 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,142 +1,142 @@
1
- require 'json'
2
-
3
- module Dim
4
- class Rst < ExporterInterface
5
- EXPORTER['rst'] = self
6
-
7
- def initialize(loader)
8
- super(loader)
9
- @hasIndex = true
10
- end
11
-
12
- def document(f, name)
13
- raw_html_name = ':raw-html:`' + name + '`'
14
- f.puts raw_html_name
15
- f.puts '=' * raw_html_name.length
16
- @lastHeadingLevel = 0
17
- @moduleName = name
18
- end
19
-
20
- def metadata(f, meta)
21
- f.puts ''
22
- f.puts html(meta.strip.escape_html, with_space: false)
23
- end
24
-
25
- def level2char(level)
26
- { 0 => '=',
27
- 1 => '-',
28
- 2 => '+',
29
- 3 => '~',
30
- 4 => '^',
31
- 5 => '"' }.fetch(level, '"')
32
- end
33
-
34
- def html(elem, with_space: true)
35
- return if elem.empty?
36
-
37
- with_space ? " :raw-html:`#{elem}`" : ":raw-html:`#{elem}`"
38
- end
39
-
40
- def handle_empty_value(value)
41
- return '' if value.empty?
42
-
43
- ' ' + (value.is_a?(Array) ? value.join(', ') : value)
44
- end
45
-
46
- def createMultiLanguageElement(r, name)
47
- lang_elems = r.data.keys.select { |k| k.start_with?("#{name}_") && !r.data[k].empty? }.sort
48
- if lang_elems.empty?
49
- return r.data[name].empty? ? '' : r.data[name]
50
- end
51
-
52
- str = (r.data[name].empty? ? '-' : r.data[name])
53
- lang_elems.each do |l|
54
- str << "<br><br><b>#{l.split('_').map(&:capitalize).join(' ')}: </b>"
55
- str << r.data[l]
56
- end
57
- str
58
- end
59
-
60
- def requirement(f, r)
61
- r.data.each { |k, v| r.data[k] = v.strip.escape_html }
62
-
63
- if r.data['type'].start_with?('heading')
64
- (@lastHeadingLevel + 1...r.depth).each do |l|
65
- str = '<Skipped Heading Level>'
66
- f.puts ''
67
- f.puts str
68
- f.puts level2char(l) * str.length
69
- end
70
- f.puts ''
71
- str = ':raw-html:`' + r.data['text'] + '`'
72
- f.puts str
73
- f.puts level2char(r.depth) * str.length
74
- @lastHeadingLevel = r.depth
75
- return
76
- end
77
-
78
- r.data['tester'].gsub!('<br>', ' ')
79
- r.data['developer'].gsub!('<br>', ' ')
80
- text = createMultiLanguageElement(r, 'text')
81
- comment = createMultiLanguageElement(r, 'comment')
82
- refs = r.data['refs'].cleanUniqArray.select do |ref|
83
- !@loader.requirements.has_key?(ref) || !@loader.requirements[ref].type.start_with?('heading')
84
- end
85
- tags = r.data['tags'].cleanUniqString
86
- sources = r.data['sources'].cleanUniqString
87
-
88
- f.puts ''
89
- f.puts ".. #{r.data['type']}:: #{r.id}"
90
- f.puts " :category: #{r.category}"
91
- f.puts " :status: #{r.data['status']}"
92
- f.puts " :review_status: #{r.data['review_status']}"
93
- f.puts " :asil: #{r.data['asil']}"
94
- f.puts " :cal: #{r.data['cal']}"
95
- f.puts " :tags:#{handle_empty_value(tags)}"
96
- f.puts " :comment:#{html(comment)}"
97
- f.puts " :miscellaneous:#{html(r.data['miscellaneous'])}"
98
- f.puts " :refs:#{handle_empty_value(refs)}"
99
- @loader.custom_attributes.each_key do |custom_attribute|
100
- f.puts " :#{custom_attribute}:#{handle_empty_value(r.data[custom_attribute])}"
101
- end
102
- if r.data['type'] == 'requirement'
103
- vc = createMultiLanguageElement(r, 'verification_criteria')
104
-
105
- f.puts " :sources:#{handle_empty_value(sources)}"
106
- f.puts " :feature:#{html(r.data['feature'])}"
107
- f.puts " :change_request:#{html(r.data['change_request'])}"
108
- f.puts " :developer:#{handle_empty_value(r.data['developer'])}"
109
- f.puts " :tester:#{handle_empty_value(r.data['tester'])}"
110
- f.puts " :verification_methods:#{handle_empty_value(r.data['verification_methods'])}"
111
- f.puts " :verification_criteria:#{html(vc)}"
112
- end
113
-
114
- f.puts "\n #{html(text)}" unless text.empty?
115
- end
116
-
117
- def footer(f)
118
- files = @loader.module_data[@moduleName][:files].values.flatten
119
- return if files.empty?
120
-
121
- f.puts ''
122
- f.puts '.. enclosed::'
123
- f.puts ''
124
- files.each do |file|
125
- f.puts " #{file}"
126
- end
127
- end
128
-
129
- def index(f, category, origin, modules)
130
- caption = category.capitalize + ' (' + origin + ')'
131
- f.puts caption
132
- f.puts '=' * caption.length
133
- f.puts ''
134
- f.puts '.. toctree::'
135
- f.puts ' :maxdepth: 1'
136
- f.puts ''
137
- modules.sort.each do |m|
138
- f.puts " #{m.sanitize}/Requirements"
139
- end
140
- end
141
- end
142
- end
1
+ require 'json'
2
+
3
+ module Dim
4
+ class Rst < ExporterInterface
5
+ EXPORTER['rst'] = self
6
+
7
+ def initialize(loader)
8
+ super(loader)
9
+ @hasIndex = true
10
+ end
11
+
12
+ def document(f, name)
13
+ raw_html_name = ':raw-html:`' + name + '`'
14
+ f.puts raw_html_name
15
+ f.puts '=' * raw_html_name.length
16
+ @lastHeadingLevel = 0
17
+ @moduleName = name
18
+ end
19
+
20
+ def metadata(f, meta)
21
+ f.puts ''
22
+ f.puts html(meta.strip.escape_html, with_space: false)
23
+ end
24
+
25
+ def level2char(level)
26
+ { 0 => '=',
27
+ 1 => '-',
28
+ 2 => '+',
29
+ 3 => '~',
30
+ 4 => '^',
31
+ 5 => '"' }.fetch(level, '"')
32
+ end
33
+
34
+ def html(elem, with_space: true)
35
+ return if elem.empty?
36
+
37
+ with_space ? " :raw-html:`#{elem}`" : ":raw-html:`#{elem}`"
38
+ end
39
+
40
+ def handle_empty_value(value)
41
+ return '' if value.empty?
42
+
43
+ ' ' + (value.is_a?(Array) ? value.join(', ') : value)
44
+ end
45
+
46
+ def createMultiLanguageElement(r, name)
47
+ lang_elems = r.data.keys.select { |k| k.start_with?("#{name}_") && !r.data[k].empty? }.sort
48
+ if lang_elems.empty?
49
+ return r.data[name].empty? ? '' : r.data[name]
50
+ end
51
+
52
+ str = (r.data[name].empty? ? '-' : r.data[name])
53
+ lang_elems.each do |l|
54
+ str << "<br><br><b>#{l.split('_').map(&:capitalize).join(' ')}: </b>"
55
+ str << r.data[l]
56
+ end
57
+ str
58
+ end
59
+
60
+ def requirement(f, r)
61
+ r.data.each { |k, v| r.data[k] = v.strip.escape_html }
62
+
63
+ if r.data['type'].start_with?('heading')
64
+ (@lastHeadingLevel + 1...r.depth).each do |l|
65
+ str = '<Skipped Heading Level>'
66
+ f.puts ''
67
+ f.puts str
68
+ f.puts level2char(l) * str.length
69
+ end
70
+ f.puts ''
71
+ str = ':raw-html:`' + r.data['text'] + '`'
72
+ f.puts str
73
+ f.puts level2char(r.depth) * str.length
74
+ @lastHeadingLevel = r.depth
75
+ return
76
+ end
77
+
78
+ r.data['tester'].gsub!('<br>', ' ')
79
+ r.data['developer'].gsub!('<br>', ' ')
80
+ text = createMultiLanguageElement(r, 'text')
81
+ comment = createMultiLanguageElement(r, 'comment')
82
+ refs = r.data['refs'].cleanUniqArray.select do |ref|
83
+ !@loader.requirements.has_key?(ref) || !@loader.requirements[ref].type.start_with?('heading')
84
+ end
85
+ tags = r.data['tags'].cleanUniqString
86
+ sources = r.data['sources'].cleanUniqString
87
+
88
+ f.puts ''
89
+ f.puts ".. #{r.data['type']}:: #{r.id}"
90
+ f.puts " :category: #{r.category}"
91
+ f.puts " :status: #{r.data['status']}"
92
+ f.puts " :review_status: #{r.data['review_status']}"
93
+ f.puts " :asil: #{r.data['asil']}"
94
+ f.puts " :cal: #{r.data['cal']}"
95
+ f.puts " :tags:#{handle_empty_value(tags)}"
96
+ f.puts " :comment:#{html(comment)}"
97
+ f.puts " :miscellaneous:#{html(r.data['miscellaneous'])}"
98
+ f.puts " :refs:#{handle_empty_value(refs)}"
99
+ @loader.custom_attributes.each_key do |custom_attribute|
100
+ f.puts " :#{custom_attribute}:#{handle_empty_value(r.data[custom_attribute])}"
101
+ end
102
+ if r.data['type'] == 'requirement'
103
+ vc = createMultiLanguageElement(r, 'verification_criteria')
104
+
105
+ f.puts " :sources:#{handle_empty_value(sources)}"
106
+ f.puts " :feature:#{html(r.data['feature'])}"
107
+ f.puts " :change_request:#{html(r.data['change_request'])}"
108
+ f.puts " :developer:#{handle_empty_value(r.data['developer'])}"
109
+ f.puts " :tester:#{handle_empty_value(r.data['tester'])}"
110
+ f.puts " :verification_methods:#{handle_empty_value(r.data['verification_methods'])}"
111
+ f.puts " :verification_criteria:#{html(vc)}"
112
+ end
113
+
114
+ f.puts "\n #{html(text)}" unless text.empty?
115
+ end
116
+
117
+ def footer(f)
118
+ files = @loader.module_data[@moduleName][:files].values.flatten
119
+ return if files.empty?
120
+
121
+ f.puts ''
122
+ f.puts '.. enclosed::'
123
+ f.puts ''
124
+ files.each do |file|
125
+ f.puts " #{file}"
126
+ end
127
+ end
128
+
129
+ def index(f, category, origin, modules)
130
+ caption = category.capitalize + ' (' + origin + ')'
131
+ f.puts caption
132
+ f.puts '=' * caption.length
133
+ f.puts ''
134
+ f.puts '.. toctree::'
135
+ f.puts ' :maxdepth: 1'
136
+ f.puts ''
137
+ modules.sort.each do |m|
138
+ f.puts " #{m.sanitize}/Requirements"
139
+ end
140
+ end
141
+ end
142
+ end
data/lib/dim/ext/psych.rb CHANGED
@@ -1,63 +1,63 @@
1
- require_relative '../exit_helper'
2
-
3
- module Dim
4
- module Refinements
5
- refine Psych::Nodes::Document do
6
- def line_numbers
7
- hash = {}
8
- children[0].children.each do |node|
9
- if node.is_a?(Psych::Nodes::Scalar)
10
- hash[node.value] = node.start_line + 1
11
- end
12
- end
13
- hash
14
- end
15
- end
16
- end
17
- end
18
-
19
- module Psych
20
- module Visitors
21
- class ToRuby
22
- alias revive_hash_org revive_hash
23
-
24
- def patched_revive_hash(hash, o)
25
- test_hash = {}
26
- o.children.each_slice(2) do |k, _v|
27
- key = accept(k)
28
- if test_hash.has_key?(key)
29
- line = "line #{k.start_line + 1}: "
30
- Dim::ExitHelper.exit(code: 1, msg: "#{line}found \"#{key}\" twice which must be unique.")
31
- end
32
- test_hash[key] = k
33
- end
34
- revive_hash_org hash, o
35
- end
36
-
37
- def self.add_patch
38
- alias revive_hash patched_revive_hash
39
- end
40
-
41
- def self.revert_patch
42
- alias revive_hash revive_hash_org
43
- end
44
- end
45
- end
46
-
47
- module Nodes
48
- class Scalar
49
- alias initialize_org initialize
50
- def quoted_initialize(value, anchor = nil, tag = nil, plain = true, _quoted = false, style = ANY)
51
- initialize_org(value, anchor, tag, plain, true, style)
52
- end
53
-
54
- def self.add_patch
55
- alias initialize quoted_initialize
56
- end
57
-
58
- def self.revert_patch
59
- alias initialize initialize_org
60
- end
61
- end
62
- end
63
- end
1
+ require_relative '../exit_helper'
2
+
3
+ module Dim
4
+ module Refinements
5
+ refine Psych::Nodes::Document do
6
+ def line_numbers
7
+ hash = {}
8
+ children[0].children.each do |node|
9
+ if node.is_a?(Psych::Nodes::Scalar)
10
+ hash[node.value] = node.start_line + 1
11
+ end
12
+ end
13
+ hash
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ module Psych
20
+ module Visitors
21
+ class ToRuby
22
+ alias revive_hash_org revive_hash
23
+
24
+ def patched_revive_hash(hash, o)
25
+ test_hash = {}
26
+ o.children.each_slice(2) do |k, _v|
27
+ key = accept(k)
28
+ if test_hash.has_key?(key)
29
+ line = "line #{k.start_line + 1}: "
30
+ Dim::ExitHelper.exit(code: 1, msg: "#{line}found \"#{key}\" twice which must be unique.")
31
+ end
32
+ test_hash[key] = k
33
+ end
34
+ revive_hash_org hash, o
35
+ end
36
+
37
+ def self.add_patch
38
+ alias revive_hash patched_revive_hash
39
+ end
40
+
41
+ def self.revert_patch
42
+ alias revive_hash revive_hash_org
43
+ end
44
+ end
45
+ end
46
+
47
+ module Nodes
48
+ class Scalar
49
+ alias initialize_org initialize
50
+ def quoted_initialize(value, anchor = nil, tag = nil, plain = true, _quoted = false, style = ANY)
51
+ initialize_org(value, anchor, tag, plain, true, style)
52
+ end
53
+
54
+ def self.add_patch
55
+ alias initialize quoted_initialize
56
+ end
57
+
58
+ def self.revert_patch
59
+ alias initialize initialize_org
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,85 +1,85 @@
1
- class String
2
- def cleanString
3
- cleanArray.join(', ')
4
- end
5
-
6
- def cleanUniqString
7
- cleanUniqArray.join(', ')
8
- end
9
-
10
- def cleanUniqArray
11
- cleanArray.uniq
12
- end
13
-
14
- def cleanArray
15
- cleanSplit.select { |s| !s.empty? }
16
- end
17
-
18
- def cleanSplit
19
- split(/(?<!\\),/).map(&:strip)
20
- end
21
-
22
- def addEnum(e)
23
- replace((cleanArray << e).uniq.join(', '))
24
- end
25
-
26
- def removeEnum(e)
27
- arr = cleanArray
28
- arr.delete(e)
29
- replace(arr.join(', '))
30
- end
31
-
32
- def escapeHtmlOutside
33
- gsub(/&(?!(amp|lt|gt|quot|apos|emsp);)/, '&amp;')
34
- .gsub('<', '&lt;')
35
- .gsub('>', '&gt;')
36
- .gsub('"', '&quot;')
37
- .gsub("'", '&apos;')
38
- .gsub("\t", '&emsp;')
39
- .gsub("\n", '<br>')
40
- .gsub('`', '&#96;')
41
- .gsub(/(?<= ) /, '&nbsp')
42
- end
43
-
44
- def escape_html_inside
45
- gsub('`', '&#96;')
46
- .gsub("\t", '&emsp;')
47
- .gsub("\n", ' ')
48
- end
49
-
50
- def get_next_escape_token(pos)
51
- ind = index(%r{<\s*(\/?)\s*html\s*>}, pos)
52
- return [:none, length - pos, -1] if ind.nil?
53
-
54
- type = Regexp.last_match(1).empty? ? :start : :end
55
- [type, ind - pos, ind + Regexp.last_match(0).length]
56
- end
57
-
58
- def escape_html
59
- str = ''
60
- search_pos = 0
61
- nested = 0
62
- while true
63
- next_token, token_pos, after_token_pos = get_next_escape_token(search_pos)
64
- if nested == 0
65
- str << self[search_pos, token_pos].escapeHtmlOutside
66
- nested = 1 if next_token == :start
67
- else
68
- str << self[search_pos, token_pos].escape_html_inside
69
- nested += (next_token == :start ? +1 : -1)
70
- end
71
- break if next_token == :none
72
-
73
- search_pos = after_token_pos
74
- end
75
- str.strip
76
- end
77
-
78
- def sanitize
79
- gsub(/[^a-zA-Z0-9.\-_]/, '_')
80
- end
81
-
82
- def universal_newline
83
- encode(encoding, universal_newline: true)
84
- end
85
- end
1
+ class String
2
+ def cleanString
3
+ cleanArray.join(', ')
4
+ end
5
+
6
+ def cleanUniqString
7
+ cleanUniqArray.join(', ')
8
+ end
9
+
10
+ def cleanUniqArray
11
+ cleanArray.uniq
12
+ end
13
+
14
+ def cleanArray
15
+ cleanSplit.select { |s| !s.empty? }
16
+ end
17
+
18
+ def cleanSplit
19
+ split(/(?<!\\),/).map(&:strip)
20
+ end
21
+
22
+ def addEnum(e)
23
+ replace((cleanArray << e).uniq.join(', '))
24
+ end
25
+
26
+ def removeEnum(e)
27
+ arr = cleanArray
28
+ arr.delete(e)
29
+ replace(arr.join(', '))
30
+ end
31
+
32
+ def escapeHtmlOutside
33
+ gsub(/&(?!(amp|lt|gt|quot|apos|emsp);)/, '&amp;')
34
+ .gsub('<', '&lt;')
35
+ .gsub('>', '&gt;')
36
+ .gsub('"', '&quot;')
37
+ .gsub("'", '&apos;')
38
+ .gsub("\t", '&emsp;')
39
+ .gsub("\n", '<br>')
40
+ .gsub('`', '&#96;')
41
+ .gsub(/(?<= ) /, '&nbsp')
42
+ end
43
+
44
+ def escape_html_inside
45
+ gsub('`', '&#96;')
46
+ .gsub("\t", '&emsp;')
47
+ .gsub("\n", ' ')
48
+ end
49
+
50
+ def get_next_escape_token(pos)
51
+ ind = index(%r{<\s*(\/?)\s*html\s*>}, pos)
52
+ return [:none, length - pos, -1] if ind.nil?
53
+
54
+ type = Regexp.last_match(1).empty? ? :start : :end
55
+ [type, ind - pos, ind + Regexp.last_match(0).length]
56
+ end
57
+
58
+ def escape_html
59
+ str = ''
60
+ search_pos = 0
61
+ nested = 0
62
+ while true
63
+ next_token, token_pos, after_token_pos = get_next_escape_token(search_pos)
64
+ if nested == 0
65
+ str << self[search_pos, token_pos].escapeHtmlOutside
66
+ nested = 1 if next_token == :start
67
+ else
68
+ str << self[search_pos, token_pos].escape_html_inside
69
+ nested += (next_token == :start ? +1 : -1)
70
+ end
71
+ break if next_token == :none
72
+
73
+ search_pos = after_token_pos
74
+ end
75
+ str.strip
76
+ end
77
+
78
+ def sanitize
79
+ gsub(/[^a-zA-Z0-9.\-_]/, '_')
80
+ end
81
+
82
+ def universal_newline
83
+ encode(encoding, universal_newline: true)
84
+ end
85
+ end
data/lib/dim/globals.rb CHANGED
@@ -1,12 +1,12 @@
1
- OPTIONS ||= {}
2
- SUBCOMMANDS ||= {}
3
- EXPORTER ||= {}
4
- CATEGORY_ORDER = {
5
- 'input' => 1,
6
- 'system' => 2,
7
- 'software' => 3,
8
- 'architecture' => 4,
9
- 'module' => 5,
10
- }.freeze
11
- ALLOWED_CATEGORIES = CATEGORY_ORDER.keys.each_with_object({}) { |k, obj| obj[k.to_sym] = k }.freeze
12
- SRS_NAME_REGEX = /[^a-zA-Z0-9-]+/.freeze
1
+ OPTIONS ||= {}
2
+ SUBCOMMANDS ||= {}
3
+ EXPORTER ||= {}
4
+ CATEGORY_ORDER = {
5
+ 'input' => 1,
6
+ 'system' => 2,
7
+ 'software' => 3,
8
+ 'architecture' => 4,
9
+ 'module' => 5,
10
+ }.freeze
11
+ ALLOWED_CATEGORIES = CATEGORY_ORDER.keys.each_with_object({}) { |k, obj| obj[k.to_sym] = k }.freeze
12
+ SRS_NAME_REGEX = /[^a-zA-Z0-9-]+/.freeze