mn-requirements 0.2.2 → 0.2.3
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:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: ed29bf407c16d8890bb04abf9028498f568a8d42cb2d232aab1f2312ccd045c3
         | 
| 4 | 
            +
              data.tar.gz: 7cb6924aa3b79542533047703be36e769b4e69b299c052868232ed81764b45c0
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: bb1c844f85032d0fac0c678259ca2983debbbe55f7cbf308d155aac2f7f8169142ec2f838a57c0329dd6f9aa1d007e4040c7e3cf0bdf33205b41b6cdc737e40b
         | 
| 7 | 
            +
              data.tar.gz: 49b72dcb20a45e87f82fa0b64bdc7db99374f2cf2c1c0bb031543cef803306e17e240b015c9a6a120a9714d5f8064dc4d18d72adad71d27e4864f91d24f88778
         | 
| @@ -197,9 +197,9 @@ module Metanorma | |
| 197 197 | 
             
                  end
         | 
| 198 198 |  | 
| 199 199 | 
             
                  def requirement_description_parse(node, out)
         | 
| 200 | 
            -
                    lbl = " | 
| 201 | 
            -
                    recommend_class(node.parent) == " | 
| 202 | 
            -
                      lbl = " | 
| 200 | 
            +
                    lbl = "description"
         | 
| 201 | 
            +
                    recommend_class(node.parent) == "recommend" and
         | 
| 202 | 
            +
                      lbl = "statement"
         | 
| 203 203 | 
             
                    out << "<tr><th>#{@labels['modspec'][lbl]}</th>" \
         | 
| 204 204 | 
             
                           "<td>#{node.children.to_xml}</td></tr>"
         | 
| 205 205 | 
             
                    out
         | 
| @@ -1,3 +1,10 @@ | |
| 1 | 
            +
            class Nokogiri::XML::Document
         | 
| 2 | 
            +
              def reqt_iter(&block)
         | 
| 3 | 
            +
                xpath("//xmlns:requirement | //xmlns:recommendation | //xmlns:permission")
         | 
| 4 | 
            +
                  .each_with_object({}, &block)
         | 
| 5 | 
            +
              end
         | 
| 6 | 
            +
            end
         | 
| 7 | 
            +
             | 
| 1 8 | 
             
            module Metanorma
         | 
| 2 9 | 
             
              class Requirements
         | 
| 3 10 | 
             
                class Modspec < Default
         | 
| @@ -36,10 +43,9 @@ module Metanorma | |
| 36 43 | 
             
                  end
         | 
| 37 44 |  | 
| 38 45 | 
             
                  def reqtlabels(doc)
         | 
| 39 | 
            -
                    doc. | 
| 40 | 
            -
                      . | 
| 41 | 
            -
             | 
| 42 | 
            -
                      end
         | 
| 46 | 
            +
                    doc.reqt_iter do |r, m|
         | 
| 47 | 
            +
                      l = r.at(ns("./identifier"))&.text and m[l] = r["id"]
         | 
| 48 | 
            +
                    end
         | 
| 43 49 | 
             
                  end
         | 
| 44 50 |  | 
| 45 51 | 
             
                  # embedded reqts xref to reqts via label lookup
         | 
| @@ -64,30 +70,23 @@ module Metanorma | |
| 64 70 | 
             
                  end
         | 
| 65 71 |  | 
| 66 72 | 
             
                  def reqt_ids(docxml)
         | 
| 67 | 
            -
                    docxml. | 
| 68 | 
            -
                      . | 
| 69 | 
            -
             | 
| 70 | 
            -
                         | 
| 71 | 
            -
             | 
| 72 | 
            -
                      end
         | 
| 73 | 
            +
                    docxml.reqt_iter do |r, m|
         | 
| 74 | 
            +
                      id = r.at(ns("./identifier")) or next
         | 
| 75 | 
            +
                      m[id.text] =
         | 
| 76 | 
            +
                        { id: r["id"], lbl: @xrefs.anchor(r["id"], :xref, false) }
         | 
| 77 | 
            +
                    end
         | 
| 73 78 | 
             
                  end
         | 
| 74 79 |  | 
| 75 80 | 
             
                  def reqt_links_test(docxml)
         | 
| 76 | 
            -
                    docxml. | 
| 77 | 
            -
                      .each_with_object({}) do |r, m|
         | 
| 78 | 
            -
                        reqt_links_test1(r, m)
         | 
| 79 | 
            -
                      end
         | 
| 81 | 
            +
                    docxml.reqt_iter { |r, m| reqt_links_test1(r, m) }
         | 
| 80 82 | 
             
                  end
         | 
| 81 83 |  | 
| 82 84 | 
             
                  def reqt_links_test1(reqt, acc)
         | 
| 83 | 
            -
                     | 
| 84 | 
            -
                                     verification).include?(reqt["type"])
         | 
| 85 | 
            -
             | 
| 85 | 
            +
                    %w(conformanceclass verification).include?(reqt["type"]) or return
         | 
| 86 86 | 
             
                    subj = reqt_extract_target(reqt)
         | 
| 87 87 | 
             
                    id = reqt.at(ns("./identifier")) or return
         | 
| 88 88 | 
             
                    lbl = @xrefs.anchor(@reqt_ids[id.text.strip][:id], :xref, false)
         | 
| 89 | 
            -
                     | 
| 90 | 
            -
             | 
| 89 | 
            +
                    (subj && lbl) or return
         | 
| 91 90 | 
             
                    acc[subj.text] = { lbl: lbl, id: reqt["id"] }
         | 
| 92 91 | 
             
                  end
         | 
| 93 92 |  | 
| @@ -110,23 +109,20 @@ module Metanorma | |
| 110 109 |  | 
| 111 110 | 
             
                  # we have not implemented multiple levels of nesting of classes
         | 
| 112 111 | 
             
                  def reqt_links_class(docxml)
         | 
| 113 | 
            -
                    docxml. | 
| 114 | 
            -
                      . | 
| 115 | 
            -
             | 
| 116 | 
            -
             | 
| 117 | 
            -
                         | 
| 118 | 
            -
                         | 
| 119 | 
            -
                          .each do |r1|
         | 
| 120 | 
            -
                          m = reqt_links_class1(id, r, r1, m)
         | 
| 121 | 
            -
                        end
         | 
| 112 | 
            +
                    docxml.reqt_iter do |r, m|
         | 
| 113 | 
            +
                      %w(class conformanceclass).include?(r["type"]) or next
         | 
| 114 | 
            +
                      id = r.at(ns("./identifier")) or next
         | 
| 115 | 
            +
                      r.xpath(ns("./requirement | ./recommendation | ./permission"))
         | 
| 116 | 
            +
                        .each do |r1|
         | 
| 117 | 
            +
                        m = reqt_links_class1(id, r, r1, m)
         | 
| 122 118 | 
             
                      end
         | 
| 119 | 
            +
                    end
         | 
| 123 120 | 
             
                  end
         | 
| 124 121 |  | 
| 125 122 | 
             
                  def reqt_links_class1(id, parent_reqt, reqt, acc)
         | 
| 126 123 | 
             
                    id1 = reqt.at(ns("./identifier")) or return acc
         | 
| 127 124 | 
             
                    lbl = @xrefs.anchor(@reqt_ids[id.text.strip][:id], :xref, false)
         | 
| 128 | 
            -
                    return acc | 
| 129 | 
            -
             | 
| 125 | 
            +
                    lbl or return acc
         | 
| 130 126 | 
             
                    acc[id1.text] = { lbl: lbl, id: parent_reqt["id"] }
         | 
| 131 127 | 
             
                    acc
         | 
| 132 128 | 
             
                  end
         | 
| @@ -139,10 +135,7 @@ module Metanorma | |
| 139 135 | 
             
                  end
         | 
| 140 136 |  | 
| 141 137 | 
             
                  def reqt_id_base_init(docxml)
         | 
| 142 | 
            -
                    docxml. | 
| 143 | 
            -
                      .each_with_object({}) do |r, m|
         | 
| 144 | 
            -
                        m[r["id"]] = reqt_extract_id_base(r)&.text
         | 
| 145 | 
            -
                      end
         | 
| 138 | 
            +
                    docxml.reqt_iter { |r, m| m[r["id"]] = reqt_extract_id_base(r)&.text }
         | 
| 146 139 | 
             
                  end
         | 
| 147 140 |  | 
| 148 141 | 
             
                  def reqt_id_base_inherit(ret, class2reqt)
         | 
| @@ -1,9 +1,12 @@ | |
| 1 | 
            +
            require "tsort"
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module Metanorma
         | 
| 2 4 | 
             
              class Requirements
         | 
| 3 5 | 
             
                class Modspec < Default
         | 
| 4 6 | 
             
                  def validate(reqt, log)
         | 
| 5 7 | 
             
                    @log ||= log
         | 
| 6 8 | 
             
                    @ids ||= reqt_links(reqt.document)
         | 
| 9 | 
            +
                    reqt_cycles_validate
         | 
| 7 10 | 
             
                    reqt_link_validate(reqt)
         | 
| 8 11 | 
             
                  end
         | 
| 9 12 |  | 
| @@ -140,6 +143,54 @@ module Metanorma | |
| 140 143 | 
             
                      indirect_dependency: classif_tag(reqt, "indirect-dependency"),
         | 
| 141 144 | 
             
                      implements: classif_tag(reqt, "implements") }
         | 
| 142 145 | 
             
                  end
         | 
| 146 | 
            +
             | 
| 147 | 
            +
                  def reqt_cycles_validate
         | 
| 148 | 
            +
                    @cycles_validated and return
         | 
| 149 | 
            +
                    @cycles_validated = true
         | 
| 150 | 
            +
                    %i(child dependency indirect_dependency implements).each do |x|
         | 
| 151 | 
            +
                      reqt_cycles_validate1(x)
         | 
| 152 | 
            +
                    end
         | 
| 153 | 
            +
                  end
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                  def reqt_cycles_validate1(link)
         | 
| 156 | 
            +
                    arr = TSHash.new(@ids[:id].values)
         | 
| 157 | 
            +
                    arr.link = link
         | 
| 158 | 
            +
                    TSort.each_strongly_connected_component(
         | 
| 159 | 
            +
                      lambda { |&b| arr.tsort_each_node(&b) },
         | 
| 160 | 
            +
                      lambda { |n, &b| arr.tsort_each_child(n, &b) },
         | 
| 161 | 
            +
                    ) do |c|
         | 
| 162 | 
            +
                      c.size == 1 and next
         | 
| 163 | 
            +
                      log_cycle(link, c)
         | 
| 164 | 
            +
                    end
         | 
| 165 | 
            +
                  end
         | 
| 166 | 
            +
             | 
| 167 | 
            +
                  def log_cycle(link, path)
         | 
| 168 | 
            +
                    @log.add("Requirements", nil, <<~MSG
         | 
| 169 | 
            +
                      Cycle in Modspec linkages through #{link}: #{(path << path.first).join(' => ')}
         | 
| 170 | 
            +
                    MSG
         | 
| 171 | 
            +
                    )
         | 
| 172 | 
            +
                  end
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                  class TSHash
         | 
| 175 | 
            +
                    include TSort
         | 
| 176 | 
            +
                    attr_accessor :link
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                    def initialize(arr)
         | 
| 179 | 
            +
                      @hash = arr.each_with_object({}) do |v, m|
         | 
| 180 | 
            +
                        m[v[:label]] = v
         | 
| 181 | 
            +
                      end
         | 
| 182 | 
            +
                    end
         | 
| 183 | 
            +
             | 
| 184 | 
            +
                    def tsort_each_node(&block)
         | 
| 185 | 
            +
                      @hash.keys.each(&block)
         | 
| 186 | 
            +
                    end
         | 
| 187 | 
            +
             | 
| 188 | 
            +
                    def tsort_each_child(node, &block)
         | 
| 189 | 
            +
                      (@hash[node] || {})[@link]&.each(&block)
         | 
| 190 | 
            +
                    end
         | 
| 191 | 
            +
                  end
         | 
| 192 | 
            +
             | 
| 193 | 
            +
                  def reqt_cycles_validate_dependency; end
         | 
| 143 194 | 
             
                end
         | 
| 144 195 | 
             
              end
         | 
| 145 196 | 
             
            end
         | 
    
        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. | 
| 4 | 
            +
              version: 0.2.3
         | 
| 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-11- | 
| 11 | 
            +
            date: 2022-11-11 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: isodoc-i18n
         |