stepmod-utils 0.3.23 → 0.3.25

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.
@@ -0,0 +1,194 @@
1
+ require "nokogiri"
2
+ require "stepmod/utils/change_collection"
3
+ require "stepmod/utils/smrl_description_converter"
4
+
5
+ module Stepmod
6
+ module Utils
7
+ class ChangesExtractor
8
+ MODULE_TYPES = %w[arm mim arm_longform mim_longform].freeze
9
+
10
+ attr_accessor :stepmod_dir
11
+
12
+ def self.call(stepmod_dir:, stdout: $stdout)
13
+ new(stepmod_dir: stepmod_dir, stdout: stdout).call
14
+ end
15
+
16
+ def initialize(stepmod_dir:, stdout: $stdout)
17
+ @stdout = stdout
18
+ @stepmod_dir = stepmod_dir
19
+ @collection = Stepmod::Utils::ChangeCollection.new(
20
+ stepmod_dir: stepmod_dir,
21
+ )
22
+ end
23
+
24
+ def call
25
+ all_resource_changes_files.each do |resource_change_file|
26
+ xml_changes = Nokogiri::XML(File.read(resource_change_file)).root
27
+ add_resource_changes_to_collection(xml_changes, @collection)
28
+ end
29
+
30
+ all_modules_changes_files.each do |module_change_file|
31
+ xml_changes = Nokogiri::XML(File.read(module_change_file)).root
32
+ schema_name = Pathname.new(module_change_file).parent.basename.to_s
33
+ add_module_changes_to_collection(xml_changes, @collection, schema_name)
34
+ end
35
+
36
+ @collection
37
+ end
38
+
39
+ private
40
+
41
+ # rubocop:disable Metrics/MethodLength
42
+ def add_resource_changes_to_collection(xml_data, collection)
43
+ xml_data.xpath("//changes").each do |changes_node|
44
+ changes_node.xpath("change_edition").each do |change_edition_node|
45
+ options = {
46
+ version: change_edition_node.attr("version"),
47
+ description: Stepmod::Utils::SmrlDescriptionConverter.convert(
48
+ change_edition_node.at("description"),
49
+ ),
50
+ }
51
+
52
+ add_resource_changes(
53
+ collection,
54
+ change_edition_node,
55
+ options,
56
+ )
57
+ end
58
+ end
59
+ end
60
+
61
+ def add_module_changes_to_collection(xml_data, collection, schema_name)
62
+ xml_data.xpath("//changes").each do |changes_node|
63
+ changes_node.xpath("change").each do |change_node|
64
+ options = {
65
+ schema_name: schema_name,
66
+ version: change_node.attr("version"),
67
+ description: converted_description(change_node.at("description")),
68
+ }
69
+
70
+ MODULE_TYPES.each do |type|
71
+ add_module_changes(
72
+ collection,
73
+ change_node,
74
+ options,
75
+ type,
76
+ )
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ def add_resource_changes(collection, change_node, options)
83
+ change_node.xpath("schema.changes").each do |changes|
84
+ schema_name = correct_schema_name(changes.attr("schema_name"))
85
+ change = collection.fetch_or_initialize(schema_name, "schema")
86
+
87
+ change_edition = extract_change_edition(changes, options)
88
+ change.add_change_edition(change_edition)
89
+ end
90
+ end
91
+
92
+ def add_module_changes(collection, change_node, options, type)
93
+ options[:type] = type
94
+ # assuming there will only be one change related to a type in the
95
+ # same version.
96
+ changes = change_node.xpath("#{type}.changes").first
97
+ schema_name = options[:schema_name]
98
+ change = collection.fetch_or_initialize(schema_name, type)
99
+
100
+ change_edition = extract_change_edition(changes, options)
101
+ change.add_change_edition(change_edition)
102
+
103
+ if type == "arm"
104
+ add_mapping_changes(collection, change_node, options)
105
+ end
106
+ end
107
+
108
+ def add_mapping_changes(collection, change_node, options)
109
+ change_edition = collection
110
+ .fetch_or_initialize(options[:schema_name], "arm")
111
+ .change_editions
112
+ .fetch_or_initialize(options[:version])
113
+
114
+ change_edition.mapping = extract_mapping_changes(change_node)
115
+ end
116
+
117
+ def extract_mapping_changes(change_node)
118
+ mappings = []
119
+
120
+ change_node.xpath("mapping.changes").each do |changes|
121
+ changes.xpath("mapping.change").each do |change|
122
+ mappings << { "change" => change.text }
123
+ end
124
+
125
+ changes.xpath("description").each do |change|
126
+ mappings << { "description" => change.text }
127
+ end
128
+ end
129
+
130
+ mappings
131
+ end
132
+
133
+ def extract_change_edition(schema_changes, options)
134
+ type = options[:type] || "schema"
135
+ addition_nodes = schema_changes&.xpath("#{type}.additions") || []
136
+ modification_nodes = schema_changes&.xpath("#{type}.modifications") || []
137
+ deletion_nodes = schema_changes&.xpath("#{type}.deletions") || []
138
+
139
+ {
140
+ version: options[:version],
141
+ description: options[:description],
142
+ additions: extract_modified_objects(addition_nodes),
143
+ modifications: extract_modified_objects(modification_nodes),
144
+ deletions: extract_modified_objects(deletion_nodes),
145
+ }
146
+ end
147
+ # rubocop:enable Metrics/MethodLength
148
+
149
+ def extract_modified_objects(nodes)
150
+ nodes.map do |node|
151
+ node.xpath("modified.object").map do |object|
152
+ {
153
+ type: object.attr("type"),
154
+ name: object.attr("name"),
155
+ description: converted_description(object.at("description")),
156
+ interfaced_items: object.attr("interfaced.items"),
157
+ }.compact
158
+ end
159
+ end.flatten
160
+ end
161
+
162
+ def converted_description(description)
163
+ return if description.to_s.empty?
164
+
165
+ Stepmod::Utils::SmrlDescriptionConverter.convert(description)
166
+ end
167
+
168
+ def all_resource_changes_files
169
+ Dir.glob(
170
+ File.join(stepmod_dir, "data", "resource_docs", "*", "resource.xml"),
171
+ )
172
+ end
173
+
174
+ def all_modules_changes_files
175
+ Dir.glob(
176
+ File.join(stepmod_dir, "data", "modules", "*", "module.xml"),
177
+ )
178
+ end
179
+
180
+ # rubocop:disable Layout/LineLength
181
+ def correct_schema_name(schema_name)
182
+ schema_name_corrector = {
183
+ "material_property_definition" => "material_property_definition_schema",
184
+ "qualified_measure" => "qualified_measure_schema",
185
+ "material_property_representation" => "material_property_representation_schema",
186
+ "annotated_3d_model_data_quality_criteria" => "annotated_3d_model_data_quality_criteria_schema",
187
+ }
188
+
189
+ schema_name_corrector[schema_name] || schema_name
190
+ end
191
+ # rubocop:enable Layout/LineLength
192
+ end
193
+ end
194
+ end
@@ -8,6 +8,10 @@ module Stepmod
8
8
  reference_anchor
9
9
  converted_definition
10
10
  file_path
11
+ schema
12
+ part
13
+ domain
14
+ document
11
15
  )
12
16
 
13
17
  # TODO: converted_definition is not supposed to be an attribute, it is
@@ -40,8 +44,8 @@ module Stepmod
40
44
  # TODO: `designations:` should include the `alt:[...]` terms here,
41
45
  # they are now only included in definition_xml_converted_definition.
42
46
  new(
43
- designations: [designation],
44
- definition: definition,
47
+ designations: designation,
48
+ definition: [definition],
45
49
  converted_definition: converted_definition,
46
50
  id: "#{reference_anchor}.#{reference_clause}",
47
51
  reference_anchor: reference_anchor,
@@ -65,11 +69,16 @@ module Stepmod
65
69
  definition_xml.xpath(".//term").first
66
70
  )
67
71
 
68
- {
69
- # [4..-1] because we want to skip the initial `=== {title}`
70
- accepted: term[4..-1],
71
- alt: alts,
72
- }
72
+ # [4..-1] because we want to skip the initial `=== {title}`
73
+ designations = [
74
+ { "designation" => term[4..-1], "type" => "expression", "normative_status" => "preferred" },
75
+ ]
76
+
77
+ alts.each do |alt|
78
+ designations << { "designation" => alt, "type" => "expression" }
79
+ end
80
+
81
+ designations
73
82
  end
74
83
 
75
84
  def definition_xml_definition(definition_xml, reference_anchor)
@@ -95,12 +104,24 @@ module Stepmod
95
104
  end
96
105
 
97
106
  def definition_xml_converted_definition(designation, definition)
98
- if designation[:alt].length.positive?
99
- alt_notation = "alt:[#{designation[:alt].map(&:strip).join(',')}]"
107
+ accepted_designation = designation.select do |des|
108
+ des["normative_status"] == "preferred"
109
+ end
110
+
111
+ alt_designations = designation.reject do |des|
112
+ des["normative_status"] == "preferred"
113
+ end
114
+
115
+ if alt_designations.length.positive?
116
+ alt_designations_text = alt_designations.map do |d|
117
+ d["designation"].strip
118
+ end.join(",")
119
+
120
+ alt_notation = "alt:[#{alt_designations_text}]"
100
121
  end
101
122
 
102
123
  result = <<~TEXT
103
- === #{designation[:accepted].strip}
124
+ === #{accepted_designation.map { |d| d['designation'].strip }.join(',')}
104
125
  TEXT
105
126
 
106
127
  if alt_notation
@@ -117,6 +138,15 @@ module Stepmod
117
138
  end
118
139
  end
119
140
 
141
+ def to_h
142
+ super.merge({
143
+ "domain" => domain,
144
+ "part" => part,
145
+ "schema" => schema,
146
+ "document" => document,
147
+ }.compact)
148
+ end
149
+
120
150
  def to_mn_adoc
121
151
  <<~TEXT
122
152
  // STEPmod path:#{file_path.empty? ? '' : " #{file_path}"}
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Description < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ treat_children(node, state)
9
+ end
10
+
11
+ private
12
+
13
+ def treat_children(node, state)
14
+ res = node.children.map { |child| treat(child, state) }
15
+ res.map(&:strip).reject(&:empty?).join("\n\n")
16
+ end
17
+ end
18
+
19
+ ReverseAdoc::Converters.register :description, Description.new
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,111 @@
1
+ module Stepmod
2
+ module Utils
3
+ class ExpressBibdata
4
+ DOCNUMBER = 10303
5
+
6
+ attr_accessor *%w(
7
+ type doctype part title_en version pub_year pubid published_info number
8
+ )
9
+
10
+ def initialize(schema:)
11
+ # module, resource, application_protocol, business_object_model
12
+ # @type = document.name
13
+
14
+ # raise "UnknownFileError" unless %w(module resource
15
+ # application_protocol business_object_model).include?(@type)
16
+
17
+ @published_info = schema.find("__published_in")&.remarks&.first
18
+ @number = schema.find("__identifier")&.remarks&.first&.split("N")&.last
19
+ @schema = schema
20
+
21
+ if !published_info.nil?
22
+ @pubid = Pubid::Iso::Identifier.parse(published_info)
23
+
24
+ @part = pubid.part
25
+ @version = pubid.edition
26
+ @pub_year = pubid.year
27
+ elsif !schema.version.nil?
28
+ @part = schema.version.items.find { |i| i.name == "part" }.value
29
+ @version = schema.version.items.find { |i| i.name == "part" }.value
30
+ @pub_year = schema.version.items.find { |i| i.name == "part" }.value
31
+ else
32
+ raise "PublishedInfoNotFound"
33
+ end
34
+
35
+ @doctype = schema.find("__status")&.remarks&.first
36
+ self
37
+ end
38
+
39
+ def title_en
40
+ @title_en ||= @schema.find("__title")
41
+ .remarks
42
+ .first
43
+ .gsub("_", " ")
44
+ .capitalize
45
+ .gsub("2d", "2D")
46
+ .gsub("3d", "3D")
47
+ end
48
+
49
+ def docid
50
+ no_date = case doctype
51
+ when "IS"
52
+ "ISO #{DOCNUMBER}-#{part}"
53
+ when "WD"
54
+ "ISO/WD #{DOCNUMBER}-#{part}"
55
+ when "CD"
56
+ "ISO/CD #{DOCNUMBER}-#{part}"
57
+ when "DIS"
58
+ "ISO/DIS #{DOCNUMBER}-#{part}"
59
+ when "FDIS"
60
+ "ISO/FDIS #{DOCNUMBER}-#{part}"
61
+ when "TS"
62
+ "ISO/TS #{DOCNUMBER}-#{part}"
63
+ when "CD-TS"
64
+ "ISO/CD TS #{DOCNUMBER}-#{part}"
65
+ else
66
+ "UNKNOWN DOCTYPE: (#{doctype})"
67
+ end
68
+
69
+ if pub_year
70
+ "#{no_date}:#{pub_year}"
71
+ else
72
+ no_date
73
+ end
74
+ end
75
+
76
+ def part_title
77
+ case part
78
+ when [200..299]
79
+ "Application protocol: #{title_en}"
80
+ when [300..399]
81
+ "Abstract test suite: #{title_en}"
82
+ when [400..499]
83
+ "Application module: #{title_en}"
84
+ when [500..599]
85
+ "Application interpreted construct: #{title_en}"
86
+ when [1000..1799]
87
+ "Application module: #{title_en}"
88
+ else
89
+ title_en
90
+ end
91
+ end
92
+
93
+ def full_title
94
+ "Industrial automation systems and integration -- Product data" \
95
+ " representation and exchange -- Part #{part}: #{part_title}"
96
+ end
97
+
98
+ def anchor
99
+ docid.gsub("/", "-").gsub(" ", "_").gsub(":", "_")
100
+ end
101
+
102
+ def to_mn_adoc
103
+ if title_en
104
+ "* [[[#{anchor},#{docid}]]], _#{full_title}_"
105
+ else
106
+ "* [[[#{anchor},#{docid}]]]"
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -6,6 +6,7 @@ require "stepmod/utils/converters/blockquote"
6
6
  require "stepmod/utils/converters/br"
7
7
  require "stepmod/utils/converters/bypass"
8
8
  require "stepmod/utils/converters/code"
9
+ require "stepmod/utils/converters/description"
9
10
  require "stepmod/utils/converters/drop"
10
11
  require "stepmod/utils/converters/em_express_description"
11
12
  require "stepmod/utils/converters/example"