mn-requirements 0.2.0 → 0.2.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1cc32c6334d63f4745d279e84ea08305400eccc4f020ac410b85488e47e3c6ce
4
- data.tar.gz: 57e1f8b559a619d6d01a18520d15f3de7787d0eb7fed17add4c120bc58b0d862
3
+ metadata.gz: 30c82855931f4c0fb8b033a7fcb15583826ef041cee6ff1c4630570abd42a074
4
+ data.tar.gz: c3765be67270e9fdad7d61b30654ce5a7ed5a7327d3b77598170354cd930c91a
5
5
  SHA512:
6
- metadata.gz: 817a441beba95552171c674b07c7d447808496a642c90181baf039723b7fcdef1dbb5ee23ecac9e167ffea9d09871af3bfa48dec7c40c7cc46b4fe48559e1286
7
- data.tar.gz: '09ee6db13e6fc2eb7e99ec2fbeb281a6ce3a9aed08e8d41b865a1acd458c2ec9fa642325bfff50de1ec8689ba9f8e8a74f914e0c5e3759670ee85c183f787ec1'
6
+ metadata.gz: '098e5bd08fdb6628f7b493e5cbdde2ff793168008837f5b0184034ed79e202a31295d29ba8e5707aa56c2abfdee7bf31c8a7677ed7deb3f7fc2732e9f731cb6e'
7
+ data.tar.gz: ddcd729ae096912a304b1763092c135d5967f1a21d35f5f907dc16b408c75e8c64c3ba1864fd5941d08b36e77e6051e339353b6f19e92244e700f775c4dd5c21
@@ -21,7 +21,7 @@ module Metanorma
21
21
 
22
22
  def requirement_metadata_component_tags
23
23
  %w(test-purpose test-method test-method-type conditions part description
24
- reference step guidance) +
24
+ statement reference step guidance) +
25
25
  requirement_metadata_requirement_tags
26
26
  end
27
27
 
@@ -35,6 +35,7 @@ module Metanorma
35
35
  ins1 = super
36
36
  dlist.xpath("./dt").each do |e|
37
37
  tag = e.text&.gsub(/ /, "-")&.downcase
38
+ tag = "description" if tag == "statement"
38
39
  next unless requirement_metadata_component_tags.include?(tag)
39
40
 
40
41
  ins1.next = requirement_metadata1_component(e, tag)
@@ -75,7 +76,7 @@ module Metanorma
75
76
 
76
77
  def requirement_target_identifiers(reqt)
77
78
  reqt.xpath("./classification[tag][value/link]").each do |c|
78
- %w(target indirect-dependency implements)
79
+ %w(target indirect-dependency implements identifier-base)
79
80
  .include?(c.at("./tag").text.downcase) or next
80
81
  v = c.at("./value[link]")
81
82
  v.children = v.at("./link/@target").text
@@ -83,7 +84,7 @@ module Metanorma
83
84
  end
84
85
 
85
86
  def requirement_metadata_to_component(reqt)
86
- xpath = requirement_metadata_component_tags - %w(description) -
87
+ xpath = requirement_metadata_component_tags - %w(statement description) -
87
88
  requirement_metadata_requirement_tags
88
89
  reqt.xpath(xpath.map { |x| ".//#{x}" }.join(" | ")).each do |c|
89
90
  c["class"] = c.name
@@ -119,6 +120,40 @@ module Metanorma
119
120
  c.children = "<p>#{c.children.to_xml}</p>"
120
121
  end
121
122
  end
123
+
124
+ def add_misc_container(xmldoc)
125
+ unless ins = xmldoc.at("//misc-container")
126
+ a = xmldoc.at("//termdocsource") || xmldoc.at("//bibdata")
127
+ a.next = "<misc-container/>"
128
+ ins = xmldoc.at("//misc-container")
129
+ end
130
+ ins
131
+ end
132
+
133
+ def add_misccontainer_anchor_aliases(xmldoc)
134
+ m = add_misc_container(xmldoc)
135
+ x = ".//table[@id = '_misccontainer_anchor_aliases']/tbody"
136
+ unless ins = m.at(x)
137
+ m << "<table id = '_misccontainer_anchor_aliases'><tbody/></table>"
138
+ ins = m.at(x)
139
+ end
140
+ ins
141
+ end
142
+
143
+ def requirement_anchor_aliases(reqt)
144
+ x = reqt.xpath("./identifier")
145
+ x.empty? and return
146
+ table = add_misccontainer_anchor_aliases(reqt.document)
147
+ ids = x.each_with_object([]) do |i, m|
148
+ m << "<td>#{i.text}</td>"
149
+ end
150
+ table << "<tr><th>#{reqt['id']}</th>#{ids.join}</tr>"
151
+ end
152
+
153
+ def requirement_identifier_cleanup(reqt)
154
+ super
155
+ requirement_anchor_aliases(reqt)
156
+ end
122
157
  end
123
158
  end
124
159
  end
@@ -69,8 +69,11 @@ module Metanorma
69
69
 
70
70
  def recommend_title(node, out)
71
71
  label = node.at(ns("./identifier")) or return
72
- out.add_child("<tr><th>#{@labels['modspec']['identifier']}</th>" \
73
- "<td><tt>#{label.children.to_xml}</tt></td>")
72
+ ret = <<~OUTPUT
73
+ <tr><th>#{@labels['modspec']['identifier']}</th>
74
+ <td><tt><modspec-ident>#{label.children.to_xml}</modspec-ident></tt></td>
75
+ OUTPUT
76
+ out.add_child(ret)
74
77
  end
75
78
 
76
79
  def recommendation_attributes1(node)
@@ -162,7 +165,7 @@ module Metanorma
162
165
  def recommendation_attr_keyvalue(node, key, value)
163
166
  tag = node.at(ns("./#{key}")) or return nil
164
167
  value = node.at(ns("./#{value}")) or return nil
165
- !%w(target indirect-dependency
168
+ !%w(target indirect-dependency identifier-base
166
169
  implements).include?(tag.text.downcase) or
167
170
  return nil
168
171
  [Metanorma::Utils.strict_capitalize_first(tag.text), value.children]
@@ -5,6 +5,10 @@ require_relative "isodoc"
5
5
  module Metanorma
6
6
  class Requirements
7
7
  class Modspec < Default
8
+ def initialize(options)
9
+ super
10
+ @modspecidentifierbase = @parent.modspecidentifierbase
11
+ end
8
12
  end
9
13
  end
10
14
  end
@@ -31,6 +31,8 @@ module Metanorma
31
31
  @reqt_ids = reqt_ids(doc)
32
32
  @reqt_links_class = reqt_links_class(doc)
33
33
  @reqt_links_test = reqt_links_test(doc)
34
+ @reqt_id_base = reqt_id_base(doc)
35
+ truncate_id_base_outside_reqts(doc)
34
36
  end
35
37
 
36
38
  def reqtlabels(doc)
@@ -95,11 +97,18 @@ module Metanorma
95
97
  end&.at(ns("./value"))
96
98
  end
97
99
 
100
+ def reqt_extract_id_base(reqt)
101
+ reqt.xpath(ns("./classification[tag][value]")).detect do |x|
102
+ x.at(ns("./tag")).text.casecmp("identifier-base").zero?
103
+ end&.at(ns("./value"))
104
+ end
105
+
98
106
  def recommendation_link_test(ident)
99
107
  test = @reqt_links_test[ident&.strip] or return nil
100
108
  "<xref target='#{test[:id]}'>#{test[:lbl]}</xref>"
101
109
  end
102
110
 
111
+ # we have not implemented multiple levels of nesting of classes
103
112
  def reqt_links_class(docxml)
104
113
  docxml.xpath(ns("//requirement | //recommendation | //permission"))
105
114
  .each_with_object({}) do |r, m|
@@ -108,15 +117,50 @@ module Metanorma
108
117
  id = r.at(ns("./identifier")) or next
109
118
  r.xpath(ns("./requirement | ./recommendation | ./permission"))
110
119
  .each do |r1|
111
- id1 = r1.at(ns("./identifier")) or next
112
- lbl = @xrefs.anchor(@reqt_ids[id.text.strip][:id], :xref, false)
113
- next unless lbl
114
-
115
- m[id1.text] = { lbl: lbl, id: r["id"] }
120
+ m = reqt_links_class1(id, r, r1, m)
116
121
  end
117
122
  end
118
123
  end
119
124
 
125
+ def reqt_links_class1(id, parent_reqt, reqt, acc)
126
+ id1 = reqt.at(ns("./identifier")) or return acc
127
+ lbl = @xrefs.anchor(@reqt_ids[id.text.strip][:id], :xref, false)
128
+ return acc unless lbl
129
+
130
+ acc[id1.text] = { lbl: lbl, id: parent_reqt["id"] }
131
+ acc
132
+ end
133
+
134
+ def reqt_hierarchy_extract
135
+ @reqt_links_class.each_with_object({}) do |(k, v), m|
136
+ m[v[:id]] ||= []
137
+ m[v[:id]] << @reqt_ids[k][:id]
138
+ end
139
+ end
140
+
141
+ def reqt_id_base_init(docxml)
142
+ docxml.xpath(ns("//requirement | //recommendation | //permission"))
143
+ .each_with_object({}) do |r, m|
144
+ m[r["id"]] = reqt_extract_id_base(r)&.text
145
+ end
146
+ end
147
+
148
+ def reqt_id_base_inherit(ret, class2reqt)
149
+ ret.each_key do |k|
150
+ class2reqt[k]&.each do |k1|
151
+ ret[k1] ||= ret[k]
152
+ end
153
+ end
154
+ ret
155
+ end
156
+
157
+ def reqt_id_base(docxml)
158
+ ret = reqt_id_base_init(docxml)
159
+ ret = reqt_id_base_inherit(ret, reqt_hierarchy_extract)
160
+ @modspecidentifierbase or return ret
161
+ ret.each_key { |k| ret[k] ||= @modspecidentifierbase }
162
+ end
163
+
120
164
  def recommendation_link_class(ident)
121
165
  test = @reqt_links_class[ident&.strip] or return nil
122
166
  "<xref target='#{test[:id]}'>#{test[:lbl]}</xref>"
@@ -143,6 +187,17 @@ module Metanorma
143
187
  ret
144
188
  end
145
189
 
190
+ def truncate_id_base_outside_reqts(docxml)
191
+ @modspecidentifierbase or return
192
+
193
+ (docxml.xpath(ns("//xref[@style = 'id']")) - docxml
194
+ .xpath(ns("//requirement//xref | //permission//xref | " \
195
+ "//recommendation//xref"))).each do |x|
196
+ @reqt_id_base[x["target"]] or next # is a modspec requirement
197
+ x.children = x.children.to_xml.delete_prefix(@modspecidentifierbase)
198
+ end
199
+ end
200
+
146
201
  def rec_subj(node)
147
202
  case node["type"]
148
203
  when "class" then @labels["modspec"]["targettype"]
@@ -4,6 +4,8 @@ module Metanorma
4
4
  def requirement_table_cleanup(node, table)
5
5
  table = requirement_table_nested_cleanup(node, table)
6
6
  requirement_table_consec_rows_cleanup(node, table)
7
+ node.ancestors("requirement, recommendation, permission").empty? and
8
+ truncate_id_base_in_reqt(table)
7
9
  table
8
10
  end
9
11
 
@@ -57,6 +59,37 @@ module Metanorma
57
59
  node["type"] == "conformanceclass" and label = "conformancetest"
58
60
  @i18n.get["requirements"]["modspec"][label]
59
61
  end
62
+
63
+ def strip_id_base(elem, base)
64
+ return elem.children if base.nil?
65
+
66
+ elem.children.to_xml.delete_prefix(base)
67
+ end
68
+
69
+ def truncate_id_base_in_reqt1(table, base)
70
+ table.xpath(ns(".//xref[@style = 'id']")).each do |x|
71
+ @reqt_id_base[x["target"]] or next # is a modspec requirement
72
+ x.children = strip_id_base(x, base)
73
+ end
74
+ table.xpath(ns(".//modspec-ident")).each do |x|
75
+ x.replace(strip_id_base(x, base))
76
+ end
77
+ end
78
+
79
+ # any xrefs not yet expanded out to rendering need to be expanded out,
80
+ # so that the identifier instances they contain can be truncated
81
+ def expand_xrefs_in_reqt(table)
82
+ table.xpath(ns(".//xref[not(@style)][normalize-space(text()) = '']"))
83
+ .each do |x|
84
+ x << @xrefs.anchor(x["target"], :xref, false)
85
+ end
86
+ end
87
+
88
+ def truncate_id_base_in_reqt(table)
89
+ base = @reqt_id_base[table["id"]]
90
+ expand_xrefs_in_reqt(table)
91
+ truncate_id_base_in_reqt1(table, base)
92
+ end
60
93
  end
61
94
  end
62
95
  end
@@ -73,7 +73,8 @@ module Metanorma
73
73
  super
74
74
  anchor[:xref_bare] = anchor[:xref]
75
75
  if l = block.at(ns("./identifier"))&.text
76
- anchor[:xref] += l10n(": ") + "<tt>#{l}</tt>"
76
+ anchor[:xref] += l10n(": ") +
77
+ "<tt><xref style='id' target='#{block['id']}'>#{l}</xref></tt>"
77
78
  end
78
79
  anchor
79
80
  end
@@ -5,7 +5,7 @@ require "metanorma-utils"
5
5
 
6
6
  module Metanorma
7
7
  class Requirements
8
- attr_accessor :i18n, :labels
8
+ attr_accessor :i18n, :labels, :modspecidentifierbase
9
9
 
10
10
  Hash.include Metanorma::Utils::Hash
11
11
 
@@ -17,6 +17,7 @@ module Metanorma
17
17
  options[:labels])
18
18
  # @labels = @i18n.get.deep_merge(options[:labels] || {})["requirements"]
19
19
  @labels = @i18n.get["requirements"]
20
+ @modspecidentifierbase = options[:modspecidentifierbase]
20
21
  @models =
21
22
  model_names.each_with_object({}) { |k, m| m[k] = create(k) }
22
23
  end
@@ -1,5 +1,5 @@
1
1
  module Metanorma
2
2
  class Requirements
3
- VERSION = "0.2.0".freeze
3
+ VERSION = "0.2.2".freeze
4
4
  end
5
5
  end
@@ -17,12 +17,13 @@ Gem::Specification.new do |spec|
17
17
  spec.license = "BSD-2-Clause"
18
18
 
19
19
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
- f.match(%r{^(test|spec|features)/})
20
+ f.match(%r{^(test|spec|features|bin|.github)/}) \
21
+ || f.match(%r{Rakefile|bin/rspec})
21
22
  end
22
23
  spec.bindir = "exe"
23
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
25
  spec.require_paths = ["lib"]
25
- spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
26
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
26
27
 
27
28
  spec.add_dependency "isodoc-i18n", "~> 1.1.2"
28
29
  spec.add_dependency "metanorma-utils", "~> 1.4.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mn-requirements
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-21 00:00:00.000000000 Z
11
+ date: 2022-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: isodoc-i18n
@@ -201,18 +201,12 @@ executables: []
201
201
  extensions: []
202
202
  extra_rdoc_files: []
203
203
  files:
204
- - ".github/workflows/rake.yml"
205
- - ".github/workflows/release.yml"
206
204
  - ".hound.yml"
207
205
  - ".rubocop.yml"
208
206
  - CODE_OF_CONDUCT.md
209
207
  - Gemfile
210
208
  - LICENSE
211
209
  - README.adoc
212
- - Rakefile
213
- - bin/console
214
- - bin/rspec
215
- - bin/setup
216
210
  - lib/isodoc-yaml/i18n-ar.yaml
217
211
  - lib/isodoc-yaml/i18n-de.yaml
218
212
  - lib/isodoc-yaml/i18n-en.yaml
@@ -249,14 +243,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
249
243
  requirements:
250
244
  - - ">="
251
245
  - !ruby/object:Gem::Version
252
- version: 2.5.0
246
+ version: 2.7.0
253
247
  required_rubygems_version: !ruby/object:Gem::Requirement
254
248
  requirements:
255
249
  - - ">="
256
250
  - !ruby/object:Gem::Version
257
251
  version: '0'
258
252
  requirements: []
259
- rubygems_version: 3.1.6
253
+ rubygems_version: 3.3.7
260
254
  signing_key:
261
255
  specification_version: 4
262
256
  summary: Requirements processing and rendering according to different models
@@ -1,15 +0,0 @@
1
- # Auto-generated by Cimas: Do not edit it manually!
2
- # See https://github.com/metanorma/cimas
3
- name: rake
4
-
5
- on:
6
- push:
7
- branches: [ master, main ]
8
- tags: [ v* ]
9
- pull_request:
10
-
11
- jobs:
12
- rake:
13
- uses: metanorma/ci/.github/workflows/generic-rake.yml@main
14
- secrets:
15
- pat_token: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
@@ -1,27 +0,0 @@
1
- # Auto-generated by Cimas: Do not edit it manually!
2
- # See https://github.com/metanorma/cimas
3
- name: release
4
-
5
- on:
6
- workflow_dispatch:
7
- inputs:
8
- next_version:
9
- description: |
10
- Next release version. Possible values: x.y.z, major, minor, patch or pre|rc|etc
11
- required: true
12
- default: 'skip'
13
- push:
14
- tags: [ v* ]
15
-
16
- jobs:
17
- release:
18
- uses: metanorma/ci/.github/workflows/rubygems-release.yml@main
19
- with:
20
- next_version: ${{ github.event.inputs.next_version }}
21
- release_command: rake release
22
- bundler_cache: false
23
- post_install: gem install bundler rake rspec
24
- secrets:
25
- rubygems-api-key: ${{ secrets.METANORMA_CI_RUBYGEMS_API_KEY }}
26
- pat_token: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
27
-
data/Rakefile DELETED
@@ -1,6 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
3
-
4
- RSpec::Core::RakeTask.new(:spec)
5
-
6
- task default: :spec
data/bin/console DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "metanorma/ogc"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start(__FILE__)
data/bin/rspec DELETED
@@ -1,17 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # This file was generated by Bundler.
4
- #
5
- # The application 'rspec' is installed as part of a gem, and
6
- # this file is here to facilitate running it.
7
- #
8
-
9
- require "pathname"
10
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
11
- "../../Gemfile", Pathname.new(__FILE__).realpath
12
- )
13
-
14
- require "rubygems"
15
- require "bundler/setup"
16
-
17
- load Gem.bin_path("rspec-core", "rspec")
data/bin/setup DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here