mn-requirements 0.2.0 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
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