dim-toolkit 2.1.1 → 2.2.0

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