stepmod-utils 0.4.13 → 0.5.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.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +4 -3
  3. data/exe/stepmod-annotate-all +5 -4
  4. data/exe/stepmod-convert-express-description +4 -6
  5. data/exe/stepmod-convert-express-resource +4 -6
  6. data/exe/stepmod-extract-concepts +5 -4
  7. data/exe/stepmod-srl-migrate +53 -21
  8. data/exe/stepmod-validate-express +13 -15
  9. data/lib/stepmod/utils/change.rb +47 -4
  10. data/lib/stepmod/utils/change_collection.rb +1 -1
  11. data/lib/stepmod/utils/change_edition.rb +6 -6
  12. data/lib/stepmod/utils/changes_extractor.rb +46 -10
  13. data/lib/stepmod/utils/concept.rb +12 -10
  14. data/lib/stepmod/utils/converters/blockquote.rb +0 -2
  15. data/lib/stepmod/utils/converters/def.rb +4 -4
  16. data/lib/stepmod/utils/converters/dt.rb +1 -1
  17. data/lib/stepmod/utils/converters/em_express_description.rb +8 -7
  18. data/lib/stepmod/utils/converters/eqn.rb +8 -6
  19. data/lib/stepmod/utils/converters/express_figure.rb +1 -1
  20. data/lib/stepmod/utils/converters/express_g.rb +1 -1
  21. data/lib/stepmod/utils/converters/express_table.rb +1 -1
  22. data/lib/stepmod/utils/converters/ext_description.rb +2 -1
  23. data/lib/stepmod/utils/converters/figure.rb +5 -5
  24. data/lib/stepmod/utils/converters/module_ref.rb +3 -5
  25. data/lib/stepmod/utils/converters/module_ref_express_description.rb +3 -7
  26. data/lib/stepmod/utils/converters/ol.rb +7 -7
  27. data/lib/stepmod/utils/converters/stepmod_ext_description.rb +3 -3
  28. data/lib/stepmod/utils/converters/strong.rb +12 -11
  29. data/lib/stepmod/utils/converters/term.rb +0 -1
  30. data/lib/stepmod/utils/express_bibdata.rb +6 -2
  31. data/lib/stepmod/utils/html_to_asciimath.rb +80 -80
  32. data/lib/stepmod/utils/parsers/mapping_table_parser.rb +31 -0
  33. data/lib/stepmod/utils/parsers/models/a.rb +40 -0
  34. data/lib/stepmod/utils/parsers/models/aa.rb +53 -0
  35. data/lib/stepmod/utils/parsers/models/ae.rb +54 -0
  36. data/lib/stepmod/utils/parsers/models/aimelt.rb +21 -0
  37. data/lib/stepmod/utils/parsers/models/alt.rb +19 -0
  38. data/lib/stepmod/utils/parsers/models/alt_map.rb +46 -0
  39. data/lib/stepmod/utils/parsers/models/alt_scmap.rb +34 -0
  40. data/lib/stepmod/utils/parsers/models/b.rb +58 -0
  41. data/lib/stepmod/utils/parsers/models/bigeqn.rb +55 -0
  42. data/lib/stepmod/utils/parsers/models/bold.rb +52 -0
  43. data/lib/stepmod/utils/parsers/models/bom_ref.rb +21 -0
  44. data/lib/stepmod/utils/parsers/models/constraint.rb +19 -0
  45. data/lib/stepmod/utils/parsers/models/dd.rb +86 -0
  46. data/lib/stepmod/utils/parsers/models/description.rb +86 -0
  47. data/lib/stepmod/utils/parsers/models/dl.rb +24 -0
  48. data/lib/stepmod/utils/parsers/models/dt.rb +86 -0
  49. data/lib/stepmod/utils/parsers/models/eqn.rb +57 -0
  50. data/lib/stepmod/utils/parsers/models/example.rb +84 -0
  51. data/lib/stepmod/utils/parsers/models/express_extref.rb +21 -0
  52. data/lib/stepmod/utils/parsers/models/express_ref.rb +21 -0
  53. data/lib/stepmod/utils/parsers/models/figure.rb +30 -0
  54. data/lib/stepmod/utils/parsers/models/i.rb +52 -0
  55. data/lib/stepmod/utils/parsers/models/img.rb +25 -0
  56. data/lib/stepmod/utils/parsers/models/imgarea.rb +23 -0
  57. data/lib/stepmod/utils/parsers/models/li.rb +86 -0
  58. data/lib/stepmod/utils/parsers/models/mapping_table.rb +26 -0
  59. data/lib/stepmod/utils/parsers/models/module_ref.rb +21 -0
  60. data/lib/stepmod/utils/parsers/models/note.rb +84 -0
  61. data/lib/stepmod/utils/parsers/models/ol.rb +25 -0
  62. data/lib/stepmod/utils/parsers/models/p.rb +56 -0
  63. data/lib/stepmod/utils/parsers/models/refpath.rb +23 -0
  64. data/lib/stepmod/utils/parsers/models/refpath_extend.rb +23 -0
  65. data/lib/stepmod/utils/parsers/models/rules.rb +19 -0
  66. data/lib/stepmod/utils/parsers/models/sc.rb +36 -0
  67. data/lib/stepmod/utils/parsers/models/screen.rb +55 -0
  68. data/lib/stepmod/utils/parsers/models/source.rb +21 -0
  69. data/lib/stepmod/utils/parsers/models/sub.rb +52 -0
  70. data/lib/stepmod/utils/parsers/models/sup.rb +52 -0
  71. data/lib/stepmod/utils/parsers/models/table.rb +29 -0
  72. data/lib/stepmod/utils/parsers/models/td.rb +98 -0
  73. data/lib/stepmod/utils/parsers/models/th.rb +98 -0
  74. data/lib/stepmod/utils/parsers/models/title.rb +53 -0
  75. data/lib/stepmod/utils/parsers/models/tr.rb +26 -0
  76. data/lib/stepmod/utils/parsers/models/tt.rb +68 -0
  77. data/lib/stepmod/utils/parsers/models/ul.rb +21 -0
  78. data/lib/stepmod/utils/parsers/models.rb +0 -0
  79. data/lib/stepmod/utils/parsers/types/string_without_indent.rb +17 -0
  80. data/lib/stepmod/utils/parsers.rb +4 -0
  81. data/lib/stepmod/utils/smrl_description_converter.rb +2 -1
  82. data/lib/stepmod/utils/smrl_resource_converter.rb +2 -1
  83. data/lib/stepmod/utils/stepmod_file_annotator.rb +14 -7
  84. data/lib/stepmod/utils/term.rb +1 -1
  85. data/lib/stepmod/utils/terms_extractor.rb +33 -31
  86. data/lib/stepmod/utils/version.rb +1 -1
  87. data/stepmod-utils.gemspec +4 -3
  88. metadata +76 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 58a97c3c7381351ce5d0ff391e65f6b5d62ce52f541d51975b53c6e4793b5ae0
4
- data.tar.gz: dd7d17312e634aaab93688e8f3fdee84e1895c025d74dd0a505fd357ea336756
3
+ metadata.gz: 18bfb358046e62d1504ff514004e1c01213a5cd3a86c53985dabcf5ede14e56c
4
+ data.tar.gz: 37bf06f7198d4066bbabba3038ab4107dd4ac16dc65add33d0cd267b26fd2bdd
5
5
  SHA512:
6
- metadata.gz: 896b518262254a61c6e0e6a5df7fe5fd992eef5f9a1fb1f9136ee0753a6dc649c9c1ba07fe192c939cfa51b545a4749ffa2610aa9dc4c609b2f7e9385f917437
7
- data.tar.gz: 54f31dabc624b11cfe48dde83bd0108c07692c4d3d55ee49a7f70ab518cae6914a9013e99f232d1b0c95e2798627904b3f895dad0ff8b47a48d0cd28ed117f21
6
+ metadata.gz: 767a9ba90526a414738cbc5bafe61b0e80da0f5b7ed9a714aa10442f87ca200303bd565ad718b0e5c2f5255311d174400fa00be6932f2b291c0b1ee55ed597b8
7
+ data.tar.gz: a73c95f1f931e1023f44bf308888a38cb1f1f7bc570e7fe910131e50e843b6c2d0384bb863f33fe35456ffdd39512ca85bb0e85f13cb62c7b663dc7178d78e39
@@ -7,11 +7,12 @@ on:
7
7
  inputs:
8
8
  next_version:
9
9
  description: |
10
- Next release version. Possible values: x.y.z, major, minor, patch or pre|rc|etc
10
+ Next release version. Possible values: x.y.z, major, minor, patch (or pre|rc|etc).
11
+ Also, you can pass 'skip' to skip 'git tag' and do 'gem push' for the current version
11
12
  required: true
12
13
  default: 'skip'
13
- push:
14
- tags: [ v* ]
14
+ repository_dispatch:
15
+ types: [ do-release ]
15
16
 
16
17
  jobs:
17
18
  release:
@@ -58,17 +58,20 @@ stepmod_dir = options[:stepmod_dir]
58
58
  raise StandardError.new("--stepmod-dir not set") unless stepmod_dir
59
59
 
60
60
  stepmod_path = Pathname.new(stepmod_dir)
61
- unless (stepmod_path.join("data").exist? && stepmod_path.join("data").directory?)
61
+ unless stepmod_path.join("data").exist? && stepmod_path.join("data").directory?
62
62
  raise StandardError.new("--stepmod-dir should be the root STEPmod directory and contains data/")
63
63
  end
64
+
64
65
  log "STEPmod data path: `#{stepmod_dir}`"
65
66
 
66
67
  srl_output_schemas_dir = options[:srl_output_schemas_dir]
67
68
  raise StandardError.new("--schemas directory for SRL schemas not set") unless srl_output_schemas_dir
69
+
68
70
  log "SRL schemas output path: `#{srl_output_schemas_dir}`"
69
71
 
70
72
  srl_output_docs_dir = options[:srl_output_docs_dir]
71
73
  raise StandardError.new("--documents directory for SRL documents (generated by stepmod2mn) not set") unless srl_output_docs_dir
74
+
72
75
  log "SRL documents path: `#{srl_output_docs_dir}`"
73
76
 
74
77
  unless File.exist?(srl_output_docs_dir) && File.directory?(srl_output_docs_dir)
@@ -126,7 +129,7 @@ def file_system_path(filepath, filename_cache)
126
129
  filename_cache[dir][filepath.downcase]
127
130
  end
128
131
 
129
- MAX_THREADS = 1 #[2, Concurrent.processor_count].max * 2
132
+ MAX_THREADS = 1 # [2, Concurrent.processor_count].max * 2
130
133
  MAX_QUEUE_SIZE = MAX_THREADS * 4
131
134
  # https://github.com/ruby-concurrency/concurrent-ruby/blob/master/docs-source/thread_pools.md
132
135
  # pool = Concurrent::ThreadPoolExecutor.new(
@@ -143,7 +146,6 @@ FileUtils.mkdir_p(srl_output_schemas_dir)
143
146
  srl_output_schemas_path = Pathname.new(srl_output_schemas_dir)
144
147
  srl_output_docs_path = Pathname.new(srl_output_docs_dir)
145
148
 
146
-
147
149
  files.each do |file|
148
150
  puts "#{Thread.current.object_id}: `#{file}` processing..."
149
151
 
@@ -153,7 +155,6 @@ files.each do |file|
153
155
  ).call
154
156
 
155
157
  destination_rel_path = Pathname.new(file).dirname.relative_path_from(stepmod_path.join("data"))
156
- directory_type = destination_rel_path.each_filename.to_a.first
157
158
 
158
159
  destination_path = srl_output_schemas_path.join(destination_rel_path)
159
160
  FileUtils.mkdir_p(destination_path)
@@ -17,10 +17,8 @@ input_content = ARGF.read
17
17
 
18
18
  result = Stepmod::Utils::SmrlDescriptionConverter.convert(input_content, {})
19
19
  result.split("\n").each do |line|
20
- begin
21
- $stdout.puts(line)
22
- $stdout.flush
23
- rescue Errno::EPIPE
24
- exit(74)
25
- end
20
+ $stdout.puts(line)
21
+ $stdout.flush
22
+ rescue Errno::EPIPE
23
+ exit(74)
26
24
  end
@@ -17,10 +17,8 @@ input_content = ARGF.read
17
17
 
18
18
  result = Stepmod::Utils::SmrlResourceConverter.convert(input_content, {})
19
19
  result.split("\n").each do |line|
20
- begin
21
- $stdout.puts(line)
22
- $stdout.flush
23
- rescue Errno::EPIPE
24
- exit(74)
25
- end
20
+ $stdout.puts(line)
21
+ $stdout.flush
22
+ rescue Errno::EPIPE
23
+ exit(74)
26
24
  end
@@ -77,7 +77,8 @@ else
77
77
  )
78
78
  end
79
79
 
80
- default_output_dir = File.join(File.expand_path("..", stepmod_dir), "output_yaml")
80
+ default_output_dir = File.join(File.expand_path("..", stepmod_dir),
81
+ "output_yaml")
81
82
  output_dir = options[:output_dir] || default_output_dir
82
83
  unless File.directory?(output_dir)
83
84
  FileUtils.mkdir_p(output_dir)
@@ -164,7 +165,7 @@ end
164
165
  yaml_outputs = {
165
166
  clause_4_sections: {},
166
167
  clause_5_sections: {},
167
- bibliographies: {}
168
+ bibliographies: {},
168
169
  }
169
170
 
170
171
  part_resources.each do |(_bibdata, current_part_resources)|
@@ -204,9 +205,9 @@ extract_bibliographies(resource_concepts, yaml_outputs[:bibliographies])
204
205
  {
205
206
  clause_4_sections: "resource_sections.yaml",
206
207
  clause_5_sections: "module_sections.yaml",
207
- bibliographies: "bib.yaml"
208
+ bibliographies: "bib.yaml",
208
209
  }.each_pair do |var, filename|
209
210
  path = File.join(output_dir, filename)
210
211
  File.write(path, yaml_outputs[var].values.to_yaml)
211
- log "INFO: #{var.to_s} written to #{path}."
212
+ log "INFO: #{var} written to #{path}."
212
213
  end
@@ -4,6 +4,7 @@
4
4
 
5
5
  require "pathname"
6
6
  require "fileutils"
7
+ require "nokogiri"
7
8
  bin_file = Pathname.new(__FILE__).realpath
8
9
 
9
10
  # add self to libpath
@@ -14,14 +15,14 @@ require "optparse"
14
15
 
15
16
  def log(message, indent = 0)
16
17
  indent_spaces = " " * (indent * 2)
17
- puts "[stepmod-utils] #{message}"
18
+ puts "[stepmod-utils] #{indent_spaces}#{message}"
18
19
  end
19
20
 
20
- def copy_files_to_schemas(path, stepmod_path, srl_output_docs_dir)
21
+ def copy_files_to_schemas(path, stepmod_path, srl_output_schemas_dir)
21
22
  base_path = path.dirname.relative_path_from(File.join(stepmod_path, "data"))
22
23
  file_name = path.basename
23
24
 
24
- new_dir = File.join(srl_output_docs_dir, base_path.to_s)
25
+ new_dir = File.join(srl_output_schemas_dir, base_path.to_s)
25
26
  new_file_path = File.join(new_dir, file_name)
26
27
 
27
28
  unless Dir.exist?(new_dir)
@@ -32,6 +33,28 @@ def copy_files_to_schemas(path, stepmod_path, srl_output_docs_dir)
32
33
  log("Copied #{path.basename} to #{new_file_path}", 1)
33
34
  end
34
35
 
36
+ def copy_files_to_document(path, stepmod_path, srl_output_docs_dir)
37
+ file_name = path.basename
38
+ module_xml_path = path.dirname.join("module.xml")
39
+ # puts "module_xml_path #{module_xml_path}"
40
+ module_xml = Nokogiri::XML(IO.read(module_xml_path)).root
41
+
42
+ part_number = module_xml.xpath("//module").first.attr("part")
43
+ # module_name = module_xml.xpath('//module').first.attr('name')
44
+
45
+ new_dir = File.join(srl_output_docs_dir, "iso-10303-#{part_number}")
46
+ new_file_path = File.join(new_dir, file_name)
47
+ # new_file_path = File.join(new_dir, "#{module_name}.#{file_name}")
48
+
49
+ ## The document directory should already exist.
50
+ # unless Dir.exist?(new_dir)
51
+ # FileUtils.mkdir_p(new_dir)
52
+ # end
53
+
54
+ FileUtils.copy_file(path, new_file_path)
55
+ log("Copied #{path.basename} to #{new_file_path}", 1)
56
+ end
57
+
35
58
  options = {}
36
59
  OptionParser.new do |opts|
37
60
  opts.banner = "Usage: #{$0} [options]"
@@ -75,19 +98,19 @@ OptionParser.new do |opts|
75
98
  end.parse!
76
99
 
77
100
  def download_stepmod2mn(path)
78
- if path && path.exist?
101
+ if path&.exist?
79
102
  puts "Specified `stepmod2mn.jar` found, skipping download."
80
103
  return path
81
104
  end
82
105
 
83
106
  puts "Specified `stepmod2mn.jar` not found, downloading from GitHub."
84
107
 
85
- require 'octokit'
108
+ require "octokit"
86
109
  require "down"
87
110
  require "fileutils"
88
111
 
89
112
  client = Octokit::Client.new
90
- download_url = client.latest_release('metanorma/stepmod2mn').assets.first.browser_download_url
113
+ download_url = client.latest_release("metanorma/stepmod2mn").assets.first.browser_download_url
91
114
 
92
115
  filename = Pathname.new(download_url).basename.to_s
93
116
 
@@ -123,7 +146,7 @@ end
123
146
 
124
147
  stepmod_path = Pathname.new(stepmod_dir)
125
148
  unless stepmod_path.exist? && stepmod_path.directory? &&
126
- stepmod_path.join("data").exist? && stepmod_path.join("data").directory?
149
+ stepmod_path.join("data").exist? && stepmod_path.join("data").directory?
127
150
  puts "Specified STEPmod directory not found, not a directory, or does not contain `data/`. Aborting."
128
151
  exit 1
129
152
  end
@@ -143,42 +166,51 @@ unless File.directory?(srl_output_docs_dir)
143
166
  end
144
167
  log "SRL output documents directory path: `#{srl_output_docs_dir}`"
145
168
 
146
- log("*"*30)
169
+ log("*" * 30)
147
170
  log("[SRL MIGRATION] Migration starts!")
148
171
 
149
- log("*"*30)
172
+ log("*" * 30)
150
173
  log("[SRL MIGRATION: stepmod2mn.jar] START SVG generation.")
151
- log("*"*30)
174
+ log("*" * 30)
152
175
  system "java -Xss5m -jar #{stepmod2mn_path} #{stepmod_dir} --output-documents #{srl_output_docs_dir} --output-schemas #{srl_output_schemas_dir} --svg"
153
176
 
154
- log("*"*30)
177
+ log("*" * 30)
155
178
  log("[SRL MIGRATION: stepmod2mn.jar] COMPLETE SVG generation.")
156
179
 
157
- log("*"*30)
180
+ log("*" * 30)
158
181
  log("[SRL MIGRATION: stepmod2mn.jar] START document migration and SVG generation.")
159
- log("*"*30)
182
+ log("*" * 30)
160
183
  system "java -Xss5m -jar #{stepmod2mn_path} #{stepmod_dir} --output-documents #{srl_output_docs_dir} --output-schemas #{srl_output_schemas_dir}"
161
- log("*"*30)
184
+ log("*" * 30)
162
185
  log("[SRL MIGRATION: stepmod2mn.jar] COMPLETE document migration and SVG generation.")
163
186
 
164
- log("*"*30)
187
+ log("*" * 30)
165
188
  log("[SRL MIGRATION: stepmod-utils] START Annotated EXPRESS generation.")
166
- log("*"*30)
189
+ log("*" * 30)
167
190
  system "stepmod-annotate-all --stepmod-dir #{stepmod_dir} --documents #{srl_output_docs_dir} --schemas #{srl_output_schemas_dir}"
168
- log("*"*30)
191
+ log("*" * 30)
169
192
  log("[SRL MIGRATION: stepmod-utils] COMPLETE Annotated EXPRESS generation.")
170
193
 
171
- log("*"*30)
194
+ log("*" * 30)
172
195
  log("[SRL MIGRATION: stepmod-utils] START EXPRESS change YAML extraction.")
173
196
  system "stepmod-extract-changes -p #{stepmod_dir}"
197
+
198
+ # Move arm/mim/arm_lf/mim_lf/mapping changes into schema directories
174
199
  Dir.glob("#{stepmod_dir}/data/**/*.changes.yaml").each do |filepath|
175
200
  path = Pathname.new(filepath)
176
201
  copy_files_to_schemas(path, stepmod_dir, srl_output_schemas_dir)
177
202
  end
178
- log("*"*30)
203
+
204
+ # Move document changes into document directories
205
+ Dir.glob("#{stepmod_dir}/data/**/changes.yaml").each do |filepath|
206
+ path = Pathname.new(filepath)
207
+ copy_files_to_document(path, stepmod_dir, srl_output_docs_dir)
208
+ end
209
+
210
+ log("*" * 30)
179
211
  log("[SRL MIGRATION: stepmod-utils] COMPLETE EXPRESS change YAML extraction.")
180
212
 
181
- log("*"*30)
213
+ log("*" * 30)
182
214
  log("[SRL MIGRATION] Migration complete!")
183
215
 
184
- log("*"*30)
216
+ log("*" * 30)
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'nokogiri'
4
- require 'expressir'
5
- require 'expressir/express/parser'
6
- require 'expressir/express/formatter'
3
+ require "nokogiri"
4
+ require "expressir"
5
+ require "expressir/express/parser"
6
+ require "expressir/express/formatter"
7
7
 
8
8
  stepmod_dir = ARGV.pop || "iso-10303-stepmod-wg12"
9
9
  stepmod_path = Pathname.new(stepmod_dir)
@@ -38,7 +38,7 @@ end
38
38
 
39
39
  def parse_express_schema(path)
40
40
  Expressir::Express::Parser.from_file(path)
41
- rescue
41
+ rescue StandardError
42
42
  puts "ERROR: Broken schema detected in #{path}!"
43
43
  nil
44
44
  end
@@ -54,7 +54,7 @@ puts REPO_INDEX_XML
54
54
  puts
55
55
  puts "NOTE: SHOULD_REWRITE mode is turned #{SHOULD_REWRITE ? 'ON' : 'OFF'}"
56
56
 
57
- all_express_files(stepmod_dir).each_with_index do |exp_file, i|
57
+ all_express_files(stepmod_dir).each_with_index do |exp_file, _i|
58
58
  # puts "i #{i}"
59
59
  # next if i > 10
60
60
 
@@ -62,7 +62,6 @@ all_express_files(stepmod_dir).each_with_index do |exp_file, i|
62
62
  exp_path = Pathname.new(exp_file)
63
63
  repo = parse_express_schema(exp_file)
64
64
 
65
-
66
65
  schemas_status[exp_path.to_s] = repo ? true : false
67
66
 
68
67
  if repo.nil?
@@ -77,28 +76,27 @@ all_express_files(stepmod_dir).each_with_index do |exp_file, i|
77
76
  formatted_schema = format_express_schema(repo)
78
77
  # experimental_path = exp_path.dirname.join(exp_path.basename('.exp').to_s+".x.exp")
79
78
 
80
- puts "rewriting : #{exp_path.to_s}"
79
+ puts "rewriting : #{exp_path}"
81
80
  exp_path.truncate(0)
82
81
  exp_path.write(formatted_schema)
83
82
  end
84
-
85
83
  end
86
84
 
87
- puts "*"*30
85
+ puts "*" * 30
88
86
 
89
- if schemas_status.values.include?(false)
87
+ if schemas_status.value?(false)
90
88
  puts "The following schemas failed validation:"
91
- schemas_status.select do |path, status|
89
+ schemas_status.select do |_path, status|
92
90
  status == false
93
- end.each_pair do |path, status|
91
+ end.each_pair do |path, _status|
94
92
  puts "SCHEMA: #{path}"
95
93
  end
96
- puts "*"*30
94
+ puts "*" * 30
97
95
 
98
96
  exit 1
99
97
  end
100
98
 
101
99
  puts "All schemas passed validation."
102
- puts "*"*30
100
+ puts "*" * 30
103
101
 
104
102
  exit 0
@@ -5,7 +5,7 @@ require "stepmod/utils/change_edition_collection"
5
5
  module Stepmod
6
6
  module Utils
7
7
  class Change
8
- attr_accessor :schema_name
8
+ attr_accessor :schema_name, :mapping_table
9
9
  attr_reader :change_editions
10
10
 
11
11
  MODULE_TYPES = {
@@ -13,11 +13,20 @@ module Stepmod
13
13
  mim: "mim",
14
14
  arm_longform: "arm_lf",
15
15
  mim_longform: "mim_lf",
16
+ mapping: "mapping",
17
+ changes: "changes",
18
+ mapping_table: "mapping",
16
19
  }.freeze
17
20
 
21
+ TYPES_WITHOUT_EXTENSION = %w[
22
+ changes
23
+ mapping_table
24
+ ].freeze
25
+
18
26
  def initialize(stepmod_dir:, schema_name:, type:)
19
27
  @stepmod_dir = stepmod_dir
20
28
  @change_editions = Stepmod::Utils::ChangeEditionCollection.new
29
+ @mapping_table = {}
21
30
  @schema_name = schema_name
22
31
  @type = type
23
32
  end
@@ -40,13 +49,24 @@ module Stepmod
40
49
  alias_method :[], :fetch_change_edition
41
50
 
42
51
  def save_to_file
43
- File.write(filepath(@type), Psych.dump(to_h))
52
+ change_hash = if @type == "mapping_table"
53
+ @mapping_table
54
+ else
55
+ to_h
56
+ end
57
+ return if change_hash.empty?
58
+
59
+ File.write(filepath(@type), Psych.dump(stringify_keys(change_hash)))
44
60
  end
45
61
 
46
62
  def to_h
63
+ change_editions_list = change_editions.to_h
64
+
65
+ return {} if change_editions_list.empty?
66
+
47
67
  {
48
68
  "schema" => schema_name,
49
- "change_edition" => change_editions.to_h,
69
+ "change_edition" => change_editions_list,
50
70
  }
51
71
  end
52
72
 
@@ -58,10 +78,16 @@ module Stepmod
58
78
  "data",
59
79
  base_folder,
60
80
  schema_name,
61
- "#{MODULE_TYPES[type.to_sym] || schema_name}.changes.yaml",
81
+ filename(type),
62
82
  )
63
83
  end
64
84
 
85
+ def filename(type)
86
+ return "#{MODULE_TYPES[type.to_sym]}.yaml" if TYPES_WITHOUT_EXTENSION.include?(type.to_s)
87
+
88
+ "#{MODULE_TYPES[type.to_sym] || schema_name}.changes.yaml"
89
+ end
90
+
65
91
  def base_folder
66
92
  if resource?
67
93
  "resources"
@@ -69,6 +95,23 @@ module Stepmod
69
95
  "modules"
70
96
  end
71
97
  end
98
+
99
+ # Hash#transform_keys is not available in Ruby 2.4
100
+ # so we have to do this ourselves :(
101
+ # symbolize hash keys
102
+ def stringify_keys(hash)
103
+ result = {}
104
+ hash.each_pair do |key, value|
105
+ result[key.to_s] = if value.is_a?(Hash)
106
+ stringify_keys(value)
107
+ elsif value.is_a?(Array)
108
+ value.map { |v| stringify_keys(v) }
109
+ else
110
+ value
111
+ end
112
+ end
113
+ result
114
+ end
72
115
  end
73
116
  end
74
117
  end
@@ -24,7 +24,7 @@ module Stepmod
24
24
  end
25
25
 
26
26
  def save_to_files
27
- @changes.values.each(&:save_to_file)
27
+ @changes.each_value(&:save_to_file)
28
28
  end
29
29
 
30
30
  def count
@@ -2,7 +2,7 @@ module Stepmod
2
2
  module Utils
3
3
  class ChangeEdition
4
4
  attr_accessor :version, :description
5
- attr_reader :additions, :modifications, :deletions, :mapping
5
+ attr_reader :additions, :modifications, :deletions, :changes
6
6
 
7
7
  def initialize(options)
8
8
  @version = options[:version]
@@ -10,7 +10,7 @@ module Stepmod
10
10
  self.additions = options[:additions] || []
11
11
  self.modifications = options[:modifications] || []
12
12
  self.deletions = options[:deletions] || []
13
- self.mapping = options[:mapping] || []
13
+ self.changes = options[:changes] || []
14
14
  end
15
15
 
16
16
  def additions=(additions)
@@ -31,10 +31,10 @@ module Stepmod
31
31
  @deletions = deletions
32
32
  end
33
33
 
34
- def mapping=(mapping)
35
- validate_type("mapping", mapping, Array)
34
+ def changes=(changes)
35
+ validate_type("changes", changes, Array)
36
36
 
37
- @mapping = mapping
37
+ @changes = changes
38
38
  end
39
39
 
40
40
  def to_h
@@ -44,7 +44,7 @@ module Stepmod
44
44
  "additions" => additions,
45
45
  "modifications" => modifications,
46
46
  "deletions" => deletions,
47
- "mapping" => mapping,
47
+ "changes" => changes,
48
48
  }.reject { |_k, v| v.nil? || v.empty? }
49
49
  end
50
50
 
@@ -1,6 +1,7 @@
1
1
  require "nokogiri"
2
2
  require "stepmod/utils/change_collection"
3
3
  require "stepmod/utils/smrl_description_converter"
4
+ require_relative "parsers"
4
5
 
5
6
  module Stepmod
6
7
  module Utils
@@ -30,7 +31,11 @@ module Stepmod
30
31
  all_modules_changes_files.each do |module_change_file|
31
32
  xml_changes = Nokogiri::XML(File.read(module_change_file)).root
32
33
  schema_name = Pathname.new(module_change_file).parent.basename.to_s
33
- add_module_changes_to_collection(xml_changes, @collection, schema_name)
34
+ add_module_changes_to_collection(xml_changes, @collection,
35
+ schema_name)
36
+
37
+ add_mapping_table_changes_to_collection(xml_changes, schema_name,
38
+ @collection)
34
39
  end
35
40
 
36
41
  @collection
@@ -38,6 +43,17 @@ module Stepmod
38
43
 
39
44
  private
40
45
 
46
+ def add_mapping_table_changes_to_collection(xml_data, schema_name,
47
+ collection)
48
+ mapping_table = xml_data.at_xpath("//mapping_table")
49
+ return unless mapping_table
50
+
51
+ shale_object = Stepmod::Utils::Parsers::MappingTableParser.parse(mapping_table)
52
+
53
+ change = collection.fetch_or_initialize(schema_name, "mapping_table")
54
+ change.mapping_table = shale_object.to_hash
55
+ end
56
+
41
57
  # rubocop:disable Metrics/MethodLength
42
58
  def add_resource_changes_to_collection(xml_data, collection)
43
59
  xml_data.xpath("//changes").each do |changes_node|
@@ -64,9 +80,12 @@ module Stepmod
64
80
  options = {
65
81
  schema_name: schema_name,
66
82
  version: change_node.attr("version"),
67
- description: converted_description(change_node.xpath("description").first),
83
+ # description: converted_description(change_node.xpath("description").first),
68
84
  }
69
85
 
86
+ add_mapping_changes(collection, change_node, options)
87
+ add_changes(collection, change_node, options)
88
+
70
89
  MODULE_TYPES.each do |type|
71
90
  add_module_changes(
72
91
  collection,
@@ -97,21 +116,34 @@ module Stepmod
97
116
  schema_name = options[:schema_name]
98
117
  change = collection.fetch_or_initialize(schema_name, type)
99
118
 
119
+ return if changes.nil?
120
+
100
121
  change_edition = extract_change_edition(changes, options)
101
122
  change.add_change_edition(change_edition)
102
-
103
- if type == "arm"
104
- add_mapping_changes(collection, change_node, options)
105
- end
106
123
  end
107
124
 
108
125
  def add_mapping_changes(collection, change_node, options)
126
+ mapping_changes = extract_mapping_changes(change_node)
127
+ return if mapping_changes.empty?
128
+
109
129
  change_edition = collection
110
- .fetch_or_initialize(options[:schema_name], "arm")
130
+ .fetch_or_initialize(options[:schema_name], "mapping")
111
131
  .change_editions
112
132
  .fetch_or_initialize(options[:version])
113
133
 
114
- change_edition.mapping = extract_mapping_changes(change_node)
134
+ change_edition.changes = mapping_changes
135
+ end
136
+
137
+ def add_changes(collection, change_node, options)
138
+ description = converted_description(change_node.xpath("description").first)
139
+ return if description.nil? || description.empty?
140
+
141
+ change_edition = collection
142
+ .fetch_or_initialize(options[:schema_name], "changes")
143
+ .change_editions
144
+ .fetch_or_initialize(options[:version])
145
+
146
+ change_edition.description = description
115
147
  end
116
148
 
117
149
  def extract_mapping_changes(change_node)
@@ -119,17 +151,21 @@ module Stepmod
119
151
 
120
152
  change_node.xpath("mapping.changes").each do |changes|
121
153
  changes.xpath("mapping.change").each do |change|
122
- mappings << { "change" => change.text }
154
+ mappings << { "change" => clean_string(change.text.strip) }
123
155
  end
124
156
 
125
157
  changes.xpath("description").each do |change|
126
- mappings << { "description" => change.text }
158
+ mappings << { "description" => clean_string(change.text.strip) }
127
159
  end
128
160
  end
129
161
 
130
162
  mappings
131
163
  end
132
164
 
165
+ def clean_string(string)
166
+ string.gsub(/[\n\t]/, " ").squeeze(" ")
167
+ end
168
+
133
169
  def extract_change_edition(schema_changes, options)
134
170
  type = options[:type] || "schema"
135
171
  node_type = type.gsub("_longform", "")
@@ -17,7 +17,8 @@ module Stepmod
17
17
  # TODO: converted_definition is not supposed to be an attribute, it is
18
18
  # supposed to be a method!
19
19
  class << self
20
- def parse(definition_xml, reference_anchor:, reference_clause:, file_path:, language_code: "eng")
20
+ def parse(definition_xml, reference_anchor:, reference_clause:,
21
+ file_path:, language_code: "eng")
21
22
  converted_definition = Stepmod::Utils::StepmodDefinitionConverter.convert(
22
23
  definition_xml,
23
24
  {
@@ -64,14 +65,15 @@ module Stepmod
64
65
  end
65
66
 
66
67
  term = Stepmod::Utils::Converters::Term
67
- .new
68
- .convert(
69
- definition_xml.xpath(".//term").first
70
- )
68
+ .new
69
+ .convert(
70
+ definition_xml.xpath(".//term").first,
71
+ )
71
72
 
72
73
  # [4..-1] because we want to skip the initial `=== {title}`
73
74
  designations = [
74
- { "designation" => term[4..-1], "type" => "expression", "normative_status" => "preferred" },
75
+ { "designation" => term[4..-1], "type" => "expression",
76
+ "normative_status" => "preferred" },
75
77
  ]
76
78
 
77
79
  alts.each do |alt|
@@ -84,10 +86,10 @@ module Stepmod
84
86
  def definition_xml_definition(definition_xml, reference_anchor)
85
87
  # We reject the <p> that was considered an alternative term (length<=20)
86
88
  text_nodes = definition_xml
87
- .xpath(".//def")
88
- .first
89
- .children
90
- .reject { |n| n.name == "p" && n.text.length <= 20 }
89
+ .xpath(".//def")
90
+ .first
91
+ .children
92
+ .reject { |n| n.name == "p" && n.text.length <= 20 }
91
93
 
92
94
  wrapper = "<def>#{text_nodes.map(&:to_s).join}</def>"
93
95