pubid-iso 0.1.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a1f95297e422efe82291fd2570ba264ca9daf1b6304dc3050ae7aebcff532739
4
+ data.tar.gz: '08f400bc76e43847ae0ae0b7d0c516de05a6a9bdc1dce60abd9b69ca9745b05e'
5
+ SHA512:
6
+ metadata.gz: 6d2f14cbb013fc0e9097178bc9cf7c3b5255f21699c0e904cbd8bb4aec159464f451c679e5d2f4a24aee9c3c3397d8b882f3fbb89c096104c17da51bfe6cf4f7
7
+ data.tar.gz: 3d263a1fad953c7e508b2d1936fda41fd4d827f09eb81fecc6b3379acb23502d6852cdaa99860717714934af262eb01a13039b00871af2ef8f11cf97b738e3df
data/LICENSE.txt ADDED
@@ -0,0 +1,25 @@
1
+ BSD 2-Clause License
2
+
3
+ Copyright (c) 2018, Ribose
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ * Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.adoc ADDED
@@ -0,0 +1,2 @@
1
+ = ISO publication identifiers ("ISO PubID")
2
+
@@ -0,0 +1,5 @@
1
+ module Pubid::Iso
2
+ module Errors
3
+ class ParseError < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,46 @@
1
+ module Pubid::Iso
2
+ class Identifier
3
+ STAGES = { NP: 10,
4
+ WD: 20,
5
+ CD: 30,
6
+ DIS: 40,
7
+ FDIS: 50,
8
+ PRF: 50,
9
+ IS: 60,
10
+ Fpr: 50 }.freeze
11
+
12
+ attr_accessor :number, :publisher, :copublisher, :stage, :substage, :part,
13
+ :type, :year, :edition, :iteration, :supplements, :language
14
+
15
+ def initialize(stage: nil, supplements: nil, **opts)
16
+ if stage
17
+ @stage = STAGES[stage.to_sym]
18
+ @substage = 0
19
+ end
20
+
21
+ # XXX: temporary hack for ISO/IEC 19794-7:2014/Amd 1:2015/CD Cor 1 parsing
22
+ supplements&.each do |supplement|
23
+ if supplement[:stage]
24
+ @stage = STAGES[Transformer.new.apply(stage: supplement[:stage].to_s)[:stage].to_sym]
25
+ @substage = 0
26
+ end
27
+ end
28
+
29
+ @supplements = supplements
30
+
31
+ opts.each { |key, value| send("#{key}=", value.is_a?(Array) && value || value.to_s) }
32
+ end
33
+
34
+ def urn
35
+ URN.new(self)
36
+ end
37
+
38
+ def self.parse(code)
39
+ new(**Parser.new.parse(code).map do |k, v|
40
+ Transformer.new.apply(k => v).to_a.first
41
+ end.to_h)
42
+ rescue Parslet::ParseFailed => failure
43
+ raise Pubid::Iso::Errors::ParseError, "#{failure.message}\ncause: #{failure.parse_failure_cause.ascii_tree}"
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,103 @@
1
+ # from https://github.com/relaton/relaton-iso/issues/47#issuecomment-512251416
2
+ # ISO {num}-{docpart}:{year} - docpart and year are optional. docpart is [\w-]+
3
+ # ISO/{stage} {num}-{docpart}:{year} or ISO/{subprefix} {stage} {num}:{year} - stages are WD, CD, DIS, FDIS, AWI
4
+ # ISO/{subprefix} {stage} {num}-{docpart}:{year} - subpefixes are IEC, IEEE, IEC/IEEE, TR, R. Any other?
5
+ # ISO {num}:{year}/{correction} {cornum}:{coryear} - corrections are Amd, DAmd, Cor. coryear is optional
6
+ # ISO {num}:{year}/{corstage} {correction} {cornum}:{coryear} - corstages are CD, NP, AWI, PRF, WD, DIS. Any others?
7
+
8
+ module Pubid::Iso
9
+ # ISO/IEC FDIS 7816-6
10
+ # ISO/IEC/IEEE 15289:2019
11
+ #
12
+ # Stage 10: NP (non-public)
13
+ # Stage 20: WD (non-public)
14
+ # Stage 30: CD
15
+ # Stage 40: DIS
16
+ # Stage 50: FDIS
17
+ # Stage 50.60: PRF ("proof") (non-public)
18
+ # Stage 60: IS
19
+ class Parser < Parslet::Parser
20
+ rule(:digits) do
21
+ match('\d').repeat(1)
22
+ end
23
+
24
+ rule(:stage) do
25
+ (str("NP") | str("WD") | str("CD") | str("DIS") | str("FDIS") | str("PRF") |
26
+ str("IS") | str("AWI") | str("FD") | str("D")).as(:stage)
27
+ end
28
+
29
+ # TYPES = {
30
+ # "TS" => "technical-specification",
31
+ # "TR" => "technical-report",
32
+ # "PAS" => "publicly-available-specification",
33
+ # "Guide" => "guide",
34
+ # }.freeze
35
+ # DATA|GUIDE|ISP|IWA|PAS|R|TR|TS|TTA
36
+ # # type = "data" / "guide" / "isp" / "iwa" /
37
+ # # "pas" / "r" / "tr" / "ts" / "tta"
38
+ rule(:type) do
39
+ (str("DATA") | str("ISP") | str("IWA") | str("R") | str("TTA") |
40
+ str("TS") | str("TR") | str("PAS") | str("Guide")).as(:type)
41
+ end
42
+
43
+ rule(:year) do
44
+ match('\d').repeat(4, 4)
45
+ end
46
+
47
+ rule(:part) do
48
+ (str("-") | str("/")) >> str(" ").maybe >>
49
+ (match['[\dA-Z]'] | str("-")).repeat(1).as(:part)
50
+ end
51
+
52
+ rule(:originator) do
53
+ organization.as(:publisher) >>
54
+ (str(" ").maybe >> str("/") >> organization.as(:copublisher)).maybe
55
+ end
56
+
57
+ rule(:organization) do
58
+ str("IEC/IEEE") | str("IEC") | str("IEEE") | str("CIW") | str("SAE") |
59
+ str("CIE") | str("ASME") | str("ASTM") | str("OECD") | str("ISO") |
60
+ str("IWA") | str("HL7")
61
+ end
62
+
63
+ rule(:edition) do
64
+ str(" ") >> ((str("ED") | str("Ed ") | str("Ed.")) >>
65
+ digits.as(:edition) | str("Ed").as(:edition))
66
+ end
67
+
68
+ rule(:iteration) do
69
+ str(".") >> digits.as(:iteration)
70
+ end
71
+
72
+ rule(:supplement) do
73
+ (str("/") | str(" ")).maybe >>
74
+ (str("Amd") | str("AMD") | str("Cor") | str("COR")).as(:supplement) >>
75
+ str(" ") >>
76
+ digits.as(:supplement_version) >>
77
+ (str(":") >> digits.as(:supplement_number)).maybe
78
+ end
79
+
80
+ rule(:language) do
81
+ str("(") >> match["a-z"].repeat(1).as(:language) >> str(")")
82
+ end
83
+
84
+ rule(:identifier) do
85
+ str("Fpr").as(:stage).maybe >>
86
+ # Withdrawn e.g: WD/ISO 10360-5:2000
87
+ str("WD/").maybe >>
88
+ originator >> ((str(" ") | str("/")) >>
89
+ # for ISO/FDIS
90
+ (type | stage)).maybe >>
91
+ # for ISO/IEC WD TS 25025
92
+ str(" ").maybe >> ((stage | type) >> str(" ")).maybe >>
93
+ digits.as(:number) >> part.maybe >> iteration.maybe >>
94
+ (str(" ").maybe >> str(":") >> year).maybe >>
95
+ ((str("/") >> stage).maybe >>
96
+ supplement).repeat.as(:supplements) >>
97
+ edition.maybe >>
98
+ language.maybe
99
+ end
100
+
101
+ rule(:root) { identifier }
102
+ end
103
+ end
@@ -0,0 +1,19 @@
1
+ module Pubid::Iso
2
+ class Transformer < Parslet::Transform
3
+ rule(edition: "Ed") do
4
+ { edition: "1" }
5
+ end
6
+
7
+ rule(stage: simple(:stage)) do
8
+ { stage: case stage
9
+ when "D"
10
+ "DIS"
11
+ when "FD"
12
+ "FDIS"
13
+ else
14
+ stage
15
+ end
16
+ }
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,69 @@
1
+ module Pubid::Iso
2
+ class URN
3
+ attr_accessor :identifier
4
+
5
+ def initialize(identifier)
6
+ @identifier = identifier
7
+ end
8
+
9
+ def to_s
10
+ # docidentifier = originator [":" type] ":" docnumber [":" partnumber]
11
+ # [[":" status] ":" edition]
12
+ # [":" docversion] [":" language]
13
+
14
+ "urn:iso:std:#{originator}#{type}:#{identifier.number}#{part}#{stage}#{edition}#{supplement}#{language}"
15
+ end
16
+
17
+ def part
18
+ ":-#{identifier.part}" if identifier.part
19
+ end
20
+
21
+ def stage
22
+ ":stage-#{identifier.stage}.#{sprintf('%02d', identifier.substage)}#{iteration}" if identifier.stage
23
+ end
24
+
25
+ def originator
26
+ # originator = "iso" / "iso-iec" / "iso-cie" / "iso-astm" /
27
+ # "iso-ieee" / "iec"
28
+
29
+ if identifier.copublisher
30
+ "#{identifier.publisher.downcase}-#{identifier.copublisher.downcase.gsub('/', '-')}"
31
+ else
32
+ identifier.publisher.downcase
33
+ end
34
+ end
35
+
36
+ def edition
37
+ ":ed-#{identifier.edition}" if identifier.edition
38
+ end
39
+
40
+ def iteration
41
+ ".v#{identifier.iteration}" if identifier.iteration
42
+ end
43
+
44
+ def type
45
+ # type = "data" / "guide" / "isp" / "iwa" /
46
+ # "pas" / "r" / "tr" / "ts" / "tta"
47
+
48
+ if identifier.type
49
+ ":#{identifier.type.downcase}"
50
+ end
51
+ end
52
+
53
+ def supplement
54
+ identifier.supplements&.map do |supplement|
55
+ if supplement[:supplement_number]
56
+ ":#{supplement[:supplement].to_s.downcase}:#{supplement[:supplement_number]}:v#{supplement[:supplement_version]}"
57
+ else
58
+ ":#{supplement[:supplement].to_s.downcase}:v#{supplement[:supplement_version]}"
59
+ end
60
+ end&.join
61
+ end
62
+
63
+ def language
64
+ if identifier.language
65
+ ":#{identifier.language}"
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,5 @@
1
+ module Pubid
2
+ module Iso
3
+ VERSION = "0.1.1".freeze
4
+ end
5
+ end
data/lib/pubid/iso.rb ADDED
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parslet"
4
+
5
+ module Pubid
6
+ module Iso
7
+
8
+ end
9
+ end
10
+
11
+ require_relative "iso/errors"
12
+ require_relative "iso/parser"
13
+ require_relative "iso/transformer"
14
+ require_relative "iso/urn"
15
+ require_relative "iso/identifier"
data/lib/pubid-iso.rb ADDED
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "pubid/iso"
metadata ADDED
@@ -0,0 +1,139 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pubid-iso
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Ribose Inc.
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-03-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '13.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '13.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: nokogiri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: lightly
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: parslet
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Library to generate, parse and manipulate ISO PubID.
98
+ email:
99
+ - open.source@ribose.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files:
103
+ - README.adoc
104
+ - LICENSE.txt
105
+ files:
106
+ - LICENSE.txt
107
+ - README.adoc
108
+ - lib/pubid-iso.rb
109
+ - lib/pubid/iso.rb
110
+ - lib/pubid/iso/errors.rb
111
+ - lib/pubid/iso/identifier.rb
112
+ - lib/pubid/iso/parser.rb
113
+ - lib/pubid/iso/transformer.rb
114
+ - lib/pubid/iso/urn.rb
115
+ - lib/pubid/iso/version.rb
116
+ homepage: https://github.com/metanorma/pubid-iso
117
+ licenses:
118
+ - BSD-2-Clause
119
+ metadata: {}
120
+ post_install_message:
121
+ rdoc_options: []
122
+ require_paths:
123
+ - lib
124
+ required_ruby_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: 2.5.0
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ requirements: []
135
+ rubygems_version: 3.3.3
136
+ signing_key:
137
+ specification_version: 4
138
+ summary: Library to generate, parse and manipulate ISO PubID.
139
+ test_files: []