pubid-iso 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.adoc +48 -1
- data/lib/pubid/iso/amendment.rb +2 -25
- data/lib/pubid/iso/corrigendum.rb +20 -19
- data/lib/pubid/iso/errors.rb +8 -0
- data/lib/pubid/iso/harmonized_stage_code.rb +59 -19
- data/lib/pubid/iso/identifier.rb +124 -20
- data/lib/pubid/iso/parser.rb +24 -19
- data/lib/pubid/iso/renderer/base.rb +95 -40
- data/lib/pubid/iso/renderer/dir.rb +1 -1
- data/lib/pubid/iso/renderer/french.rb +7 -2
- data/lib/pubid/iso/renderer/russian.rb +10 -7
- data/lib/pubid/iso/renderer/urn.rb +33 -4
- data/lib/pubid/iso/stage.rb +44 -15
- data/lib/pubid/iso/supplement.rb +10 -8
- data/lib/pubid/iso/transformer.rb +64 -20
- data/lib/pubid/iso/type.rb +77 -0
- data/lib/pubid/iso/typed_stage.rb +204 -0
- data/lib/pubid/iso/version.rb +1 -1
- data/lib/pubid/iso.rb +2 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 418f8b225027cf9b50cb2ec43aad7d043b3bfd0db87733366c6021df8f92f940
|
4
|
+
data.tar.gz: fd9a028a0cb2721b4422b2f515aa46263c7d713da57e02c8fc1ed4c54c22f737
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf1f97bde499237e29b24b793d7e9fe115e03e42a92471a549f90aea9c416ddc357fcfd95079a97bff4b200b4fe8c93f786fc8e3c8256ad3275f2365f9c946e8
|
7
|
+
data.tar.gz: d4b53365fc22d587b204a7c38fcaf362e7f85b5cc5a07767ecb4f97fe5c7a3b8c70c3e24c8c30b63166321bd4f757f7d6658df154a4ccab4715ae94c62e8f17e
|
data/README.adoc
CHANGED
@@ -64,6 +64,31 @@ pubid.to_s
|
|
64
64
|
=> "ISO 1234-1"
|
65
65
|
----
|
66
66
|
|
67
|
+
==== Iteration
|
68
|
+
|
69
|
+
[source,ruby]
|
70
|
+
----
|
71
|
+
pubid = Pubid::Iso::Identifier.new(publisher: "ISO", number: 123, part: 1, stage: :DIS, iteration: 1)
|
72
|
+
pubid.to_s
|
73
|
+
|
74
|
+
=> "ISO/DIS 1234-1.1"
|
75
|
+
----
|
76
|
+
To apply iteration to document stage should be provided as well.
|
77
|
+
Without stage error will be raised.
|
78
|
+
|
79
|
+
==== Amendment and Corrigendum
|
80
|
+
[source,ruby]
|
81
|
+
----
|
82
|
+
> pubid = Pubid::Iso::Identifier.new(publisher: "ISO", number: 123, part: 1, year: 2019, amendments: [{ number: "1", year: "2021", stage: :WD }])
|
83
|
+
> pubid.to_s
|
84
|
+
=> "ISO 1234-1:2019/WD Amd 1:2021"
|
85
|
+
|
86
|
+
> pubid = Pubid::Iso::Identifier.new(publisher: "ISO", number: 123, part: 1, year: 2019, corrigendums: [{ number: "1", year: "2021", stage: :WD }])
|
87
|
+
> pubid.to_s
|
88
|
+
=> "ISO 1234-1:2019/WD Cor 1:2021"
|
89
|
+
----
|
90
|
+
See documentation on https://rubydoc.info/gems/pubid-iso/Pubid%2FIso%2FSupplement:initialize[PubId::Iso::Supplement#initialize] and https://rubydoc.info/gems/pubid-core/Pubid%2FCore%2FSupplement:initialize[Pubid::Core::Supplement#initialize] to see all available options.
|
91
|
+
|
67
92
|
==== Using format options
|
68
93
|
[source,ruby]
|
69
94
|
----
|
@@ -107,12 +132,34 @@ pubid.to_s
|
|
107
132
|
part: "1",
|
108
133
|
year: 2019,
|
109
134
|
edition: 1,
|
110
|
-
|
135
|
+
amendments: {number: "1", year: "2021", stage: "DIS"}
|
111
136
|
)
|
112
137
|
> pubid.urn
|
113
138
|
=> "urn:iso:std:iso:8601:-1:ed-1:amd:2021:v1"
|
114
139
|
----
|
115
140
|
|
141
|
+
==== Typed stage abbreviation
|
142
|
+
[source,ruby]
|
143
|
+
----
|
144
|
+
> pubid = Pubid::Iso::Identifier.parse("ISO/FDIS 26000:2010")
|
145
|
+
> pubid.typed_stage_abbrev
|
146
|
+
=> "FDIS"
|
147
|
+
> pubid.typed_stage_name
|
148
|
+
=> "Final Draft"
|
149
|
+
|
150
|
+
> pubid = Pubid::Iso::Identifier.parse("ISO/FDTR 26000:2010")
|
151
|
+
> pubid.typed_stage_abbrev
|
152
|
+
=> "FDTR"
|
153
|
+
> pubid.typed_stage_name
|
154
|
+
=> "Final Draft Technical Report"
|
155
|
+
|
156
|
+
> pubid = Pubid::Iso::Identifier.parse("ISO/WD TR 26000:2010")
|
157
|
+
> pubid.typed_stage_abbrev
|
158
|
+
=> "WD TR"
|
159
|
+
> pubid.typed_stage_name
|
160
|
+
=> "Working Draft Technical Report"
|
161
|
+
----
|
162
|
+
|
116
163
|
See documentation (https://www.rubydoc.info/gems/pubid-iso/Pubid/Iso/Identifier#initialize-instance_method[Pubid::Iso::Identifier] and https://www.rubydoc.info/gems/pubid-core/Pubid/Core/Identifier#initialize-instance_method[Pubid::Core::Identifier]) for all available attributes and options.
|
117
164
|
|
118
165
|
== Elements of the PubID
|
data/lib/pubid/iso/amendment.rb
CHANGED
@@ -3,32 +3,9 @@ module Pubid::Iso
|
|
3
3
|
# @param stage_format_long [Boolean] long or short format for stage rendering
|
4
4
|
# @param with_date [Boolean] include date
|
5
5
|
def render_pubid(stage_format_long = true, with_date = true)
|
6
|
-
stage = render_pubid_stage
|
7
6
|
pubid_number = render_pubid_number(with_date: with_date)
|
8
|
-
|
9
|
-
|
10
|
-
if stage_format_long
|
11
|
-
"/DAmd #{pubid_number}"
|
12
|
-
else
|
13
|
-
"/DAM #{pubid_number}"
|
14
|
-
end
|
15
|
-
when "FDIS"
|
16
|
-
if stage_format_long
|
17
|
-
"/FDAmd #{pubid_number}"
|
18
|
-
else
|
19
|
-
"/FDAM #{pubid_number}"
|
20
|
-
end
|
21
|
-
when "CD"
|
22
|
-
if stage_format_long
|
23
|
-
"/CD Amd #{pubid_number}"
|
24
|
-
else
|
25
|
-
"/CDAM #{pubid_number}"
|
26
|
-
end
|
27
|
-
when ""
|
28
|
-
"/Amd #{pubid_number}"
|
29
|
-
else
|
30
|
-
"/#{stage} Amd #{pubid_number}"
|
31
|
-
end
|
7
|
+
|
8
|
+
"/#{@typed_stage.to_s(stage_format_long)} #{pubid_number}"
|
32
9
|
end
|
33
10
|
|
34
11
|
def render_urn
|
@@ -1,26 +1,27 @@
|
|
1
1
|
module Pubid::Iso
|
2
2
|
class Corrigendum < Supplement
|
3
3
|
def render_pubid(stage_format_long = true, with_date = true)
|
4
|
-
stage = render_pubid_stage
|
4
|
+
# stage = render_pubid_stage
|
5
5
|
pubid_number = render_pubid_number(with_date: with_date)
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
6
|
+
"/#{@typed_stage.to_s(stage_format_long)} #{pubid_number}"
|
7
|
+
# case stage.to_s
|
8
|
+
# when "DIS"
|
9
|
+
# if stage_format_long
|
10
|
+
# "/DCor #{pubid_number}"
|
11
|
+
# else
|
12
|
+
# "/DCOR #{pubid_number}"
|
13
|
+
# end
|
14
|
+
# when "FDIS"
|
15
|
+
# if stage_format_long
|
16
|
+
# "/FDCor #{pubid_number}"
|
17
|
+
# else
|
18
|
+
# "/FDCOR #{pubid_number}"
|
19
|
+
# end
|
20
|
+
# when ""
|
21
|
+
# "/Cor #{pubid_number}"
|
22
|
+
# else
|
23
|
+
# "/#{stage} Cor #{pubid_number}"
|
24
|
+
# end
|
24
25
|
end
|
25
26
|
|
26
27
|
def render_urn
|
data/lib/pubid/iso/errors.rb
CHANGED
@@ -3,11 +3,19 @@ module Pubid::Iso
|
|
3
3
|
class ParseError < StandardError; end
|
4
4
|
class PublishedIterationError < StandardError; end
|
5
5
|
class HarmonizedStageCodeInvalidError < StandardError; end
|
6
|
+
class HarmonizedStageRenderingError < StandardError; end
|
6
7
|
class StageInvalidError < StandardError; end
|
7
8
|
class IsStageIterationError < StandardError; end
|
9
|
+
class IterationWithoutStageError < StandardError; end
|
8
10
|
class WrongFormat < StandardError; end
|
9
11
|
# Error raised when supplement applied to base document without publication year or stage
|
10
12
|
class SupplementWithoutYearOrStageError < StandardError; end
|
11
13
|
class NoEditionError < StandardError; end
|
14
|
+
class WrongTypeError < StandardError; end
|
15
|
+
class ParseTypeError < StandardError; end
|
16
|
+
class TypeStageInvalidError < StandardError; end
|
17
|
+
class TypeStageParseError < StandardError; end
|
18
|
+
|
19
|
+
class SupplementRenderingError < StandardError; end
|
12
20
|
end
|
13
21
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
module Pubid::Iso
|
2
2
|
class HarmonizedStageCode
|
3
3
|
include Comparable
|
4
|
-
attr_accessor :stage, :substage
|
4
|
+
# attr_accessor :stage, :substage
|
5
|
+
attr_accessor :stages
|
5
6
|
|
6
7
|
DESCRIPTIONS = {
|
7
8
|
"00.00" => "Proposal for new project received",
|
@@ -50,7 +51,15 @@ module Pubid::Iso
|
|
50
51
|
"95.60" => "Close of voting",
|
51
52
|
"95.92" => "Decision not to withdraw International Standard",
|
52
53
|
"95.99" => "Withdrawal of International Standard"
|
53
|
-
}
|
54
|
+
}.freeze
|
55
|
+
|
56
|
+
DRAFT_STAGES = %w[00.00 00.20 00.60 00.99 10.00 10.20 10.60 10.92 10.99 20.00 20.20 20.60 20.99 30.00
|
57
|
+
30.20 30.60 30.92 30.99 40.00 40.20 40.60 40.92 40.93 40.99 50.00 50.20 50.60
|
58
|
+
50.92 50.99].freeze
|
59
|
+
|
60
|
+
CANCELED_STAGES = %w[00.98 10.98 20.98 30.98 40.98 50.98 95.99].freeze
|
61
|
+
|
62
|
+
PUBLISHED_STAGES = %w[60.00 60.60 90.20 90.60 90.92 90.93 90.99 95.20 95.60 95.92].freeze
|
54
63
|
|
55
64
|
STAGES_NAMES = {
|
56
65
|
preliminary: "00",
|
@@ -74,32 +83,63 @@ module Pubid::Iso
|
|
74
83
|
proceed: "99",
|
75
84
|
}.freeze
|
76
85
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
86
|
+
# @param stage_or_code [String,Array<String>] stage number or whole harmonized code with substage
|
87
|
+
# or list or stages for fuzzy stages eg. "10", 10, "20.20", ["10.20", "20.20"]
|
88
|
+
# @param substage [Integer, String] eg. "00", 0
|
89
|
+
def initialize(stage_or_code, substage = "00")
|
90
|
+
@stages = if stage_or_code.is_a?(Array)
|
91
|
+
stage_or_code
|
92
|
+
elsif stage_or_code.is_a?(String) && DESCRIPTIONS.key?(stage_or_code)
|
93
|
+
[stage_or_code]
|
94
|
+
# when stage is stage name
|
95
|
+
elsif STAGES_NAMES.key?(stage_or_code)
|
96
|
+
["#{STAGES_NAMES[stage_or_code]}.#{SUBSTAGES_NAMES[substage]}"]
|
97
|
+
else
|
98
|
+
# stage is number
|
99
|
+
["#{stage_or_code}.#{substage}"]
|
100
|
+
end
|
101
|
+
validate_stages
|
102
|
+
end
|
103
|
+
|
104
|
+
def validate_stages
|
105
|
+
@stages.each do |stage|
|
106
|
+
# raise an error when stage is wrong
|
107
|
+
raise Errors::HarmonizedStageCodeInvalidError unless DESCRIPTIONS.key?(stage)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def to_s
|
112
|
+
if fuzzy?
|
113
|
+
return "draft" if @stages.all? { |s| DRAFT_STAGES.include?(s) || CANCELED_STAGES.include?(s) }
|
114
|
+
|
115
|
+
return "published" if @stages.all? { |s| PUBLISHED_STAGES.include?(s) }
|
116
|
+
|
117
|
+
raise Errors::HarmonizedStageRenderingError, "cannot render fuzzy stages"
|
82
118
|
else
|
83
|
-
|
84
|
-
@stage, @substage = stage, substage
|
85
|
-
validate_stage(stage, substage)
|
119
|
+
@stages.first
|
86
120
|
end
|
87
121
|
end
|
88
122
|
|
89
|
-
def
|
90
|
-
|
91
|
-
|
123
|
+
def ==(other)
|
124
|
+
(stages & other.stages) == other.stages
|
125
|
+
end
|
92
126
|
|
93
|
-
|
94
|
-
|
127
|
+
def fuzzy?
|
128
|
+
@stages.length > 1
|
95
129
|
end
|
96
130
|
|
97
|
-
def
|
98
|
-
"
|
131
|
+
def stage
|
132
|
+
raise Errors::HarmonizedStageRenderingError, "cannot render stage for fuzzy stages" if fuzzy?
|
133
|
+
|
134
|
+
return nil if @stages.empty?
|
135
|
+
|
136
|
+
@stages.first.split(".").first
|
99
137
|
end
|
100
138
|
|
101
|
-
def
|
102
|
-
|
139
|
+
def substage
|
140
|
+
raise Errors::HarmonizedStageRenderingError, "cannot render substage for fuzzy stages" if fuzzy?
|
141
|
+
|
142
|
+
@stages.first.split(".").last
|
103
143
|
end
|
104
144
|
|
105
145
|
def description
|
data/lib/pubid/iso/identifier.rb
CHANGED
@@ -3,15 +3,17 @@ module Pubid::Iso
|
|
3
3
|
attr_accessor :stage,
|
4
4
|
:iteration, :joint_document,
|
5
5
|
:tctype, :sctype, :wgtype, :tcnumber, :scnumber, :wgnumber,
|
6
|
-
:
|
6
|
+
:dirtype,
|
7
7
|
# supplement for DIR type identifiers
|
8
|
-
:supplement
|
8
|
+
:supplement,
|
9
|
+
:base,
|
10
|
+
:typed_stage,
|
11
|
+
:supplements
|
9
12
|
|
10
13
|
# Creates new identifier from options provided, includes options from
|
11
14
|
# Pubid::Core::Identifier#initialize
|
12
15
|
#
|
13
|
-
# @param stage [Stage, Symbol, String] stage, e.g. "PWI", "NP", "50.00", Stage.new(abbr: :WD)
|
14
|
-
# @param urn_stage [Float] numeric stage for URN rendering
|
16
|
+
# @param stage [Stage, TypedStage, Symbol, String] stage or typed stage, e.g. "PWI", "NP", "50.00", Stage.new(abbr: :WD), "DTR"
|
15
17
|
# @param iteration [Integer] document iteration, eg. "1", "2", "3"
|
16
18
|
# @param joint_document [Identifier] joint document
|
17
19
|
# @param supplement [Supplement] supplement
|
@@ -22,42 +24,73 @@ module Pubid::Iso
|
|
22
24
|
# @param scnumber [Integer] Subsommittee number, eg. "1", "2"
|
23
25
|
# @param wgnumber [Integer] Working group number, eg. "1", "2"
|
24
26
|
# @param dirtype [String] Directives document type, eg. "JTC"
|
27
|
+
# @param base [Identifier] base document for supplement's identifier
|
28
|
+
# @param type [nil, :tr, :ts, :amd, :cor, :guide, :dir, :tc, Type] document's type, eg. :tr, :ts, :amd, :cor, Type.new(:tr)
|
25
29
|
# @raise [Errors::SupplementWithoutYearOrStageError] when trying to apply
|
26
30
|
# supplement to the document without edition year or stage
|
27
31
|
# @raise [Errors::IsStageIterationError] when trying to apply iteration
|
28
32
|
# to document with IS stage
|
33
|
+
# @raise [Errors::IterationWithoutStageError] when trying to applu iteration
|
34
|
+
# to document without stage
|
29
35
|
# @see Supplement
|
30
36
|
# @see Identifier
|
31
37
|
# @see Pubid::Core::Identifier
|
32
38
|
# @see Parser
|
33
39
|
#
|
34
40
|
def initialize(publisher: "ISO", number: nil, stage: nil, iteration: nil, supplement: nil,
|
35
|
-
joint_document: nil,
|
36
|
-
tctype: nil, sctype: nil, wgtype: nil, tcnumber: nil,
|
41
|
+
joint_document: nil, tctype: nil, sctype: nil, wgtype: nil, tcnumber: nil,
|
37
42
|
scnumber: nil, wgnumber:nil,
|
38
43
|
dir: nil, dirtype: nil, year: nil, amendments: nil,
|
39
|
-
corrigendums: nil, type: nil, **opts)
|
44
|
+
corrigendums: nil, type: nil, base: nil, supplements: nil, **opts)
|
40
45
|
super(**opts.merge(number: number, publisher: publisher, year: year,
|
41
|
-
amendments: amendments, corrigendums: corrigendums
|
46
|
+
amendments: amendments, corrigendums: corrigendums))
|
42
47
|
|
43
|
-
if
|
44
|
-
|
48
|
+
if supplements
|
49
|
+
@supplements = supplements.map do |supplement|
|
50
|
+
if supplement.is_a?(Hash)
|
51
|
+
self.class.get_transformer_class.new.apply(:supplements => [supplement])[:supplements].first
|
52
|
+
else
|
53
|
+
supplement
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
if %i(amd cor).include?(type) && (base.year.nil? && base.stage.nil?)
|
59
|
+
raise Errors::SupplementWithoutYearOrStageError,
|
60
|
+
"Cannot apply supplement to document without base identifieredition year or stage"
|
45
61
|
end
|
46
|
-
if stage
|
47
|
-
@stage = stage.is_a?(Stage) ? stage : Stage.parse(stage)
|
48
62
|
|
49
|
-
|
63
|
+
if stage.is_a?(TypedStage)
|
64
|
+
@typed_stage = stage
|
65
|
+
# add type to typed stage when missing (case for amendment with stage, eg. "CD Amd")
|
66
|
+
@typed_stage.type = Type.new(type) if @typed_stage.type.nil? && type
|
67
|
+
elsif stage || type
|
68
|
+
@typed_stage = if type
|
69
|
+
TypedStage.new(type: type.is_a?(Type) ? type : Type.new(type))
|
70
|
+
else
|
71
|
+
TypedStage.new
|
72
|
+
end
|
73
|
+
|
74
|
+
if @typed_stage.type == :is && iteration
|
50
75
|
raise Errors::IsStageIterationError, "IS stage document cannot have iteration"
|
51
76
|
end
|
52
77
|
|
53
|
-
if
|
54
|
-
|
78
|
+
if stage
|
79
|
+
provided_type = @typed_stage.type
|
80
|
+
|
81
|
+
@typed_stage.parse_stage(stage.is_a?(Parslet::Slice) ? stage.to_s : stage)
|
82
|
+
if !provided_type.nil? && @typed_stage.type != provided_type
|
83
|
+
raise Errors::StageInvalidError,
|
84
|
+
"cannot assign typed stage for document with different type (#{provided_type} vs #{@typed_stage.type})"
|
85
|
+
end
|
55
86
|
end
|
87
|
+
elsif iteration
|
88
|
+
raise Errors::IterationWithoutStageError, "Document without stage cannot have iteration"
|
56
89
|
end
|
90
|
+
|
57
91
|
@iteration = iteration.to_i if iteration
|
58
92
|
@supplement = supplement if supplement
|
59
93
|
@joint_document = joint_document if joint_document
|
60
|
-
@urn_stage = urn_stage if urn_stage
|
61
94
|
@tctype = tctype if tctype
|
62
95
|
@sctype = sctype.to_s if sctype
|
63
96
|
@wgtype = wgtype.to_s if wgtype
|
@@ -66,6 +99,7 @@ module Pubid::Iso
|
|
66
99
|
@wgnumber = wgnumber.to_s if wgnumber
|
67
100
|
@dir = dir.to_s if dir
|
68
101
|
@dirtype = dirtype.to_s if dirtype
|
102
|
+
@base = base if base
|
69
103
|
end
|
70
104
|
|
71
105
|
def self.parse_from_title(title)
|
@@ -78,6 +112,53 @@ module Pubid::Iso
|
|
78
112
|
end
|
79
113
|
|
80
114
|
class << self
|
115
|
+
def supplements_has_type?(supplements, type)
|
116
|
+
supplements.any? do |supplement|
|
117
|
+
supplement.typed_stage.type == type
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def supplement_by_type(supplements, type)
|
122
|
+
supplements.select { |supplement| supplement.type == type }.first
|
123
|
+
end
|
124
|
+
|
125
|
+
def transform_supplements(supplements_params, base_params)
|
126
|
+
supplements = supplements_params.map do |supplement|
|
127
|
+
new(number: supplement[:number], year: supplement[:year],
|
128
|
+
stage: supplement[:typed_stage], edition: supplement[:edition],
|
129
|
+
iteration: supplement[:iteration],
|
130
|
+
base: new(**base_params))
|
131
|
+
end
|
132
|
+
|
133
|
+
return supplements.first if supplements.count == 1
|
134
|
+
|
135
|
+
# update corrigendum base to amendment
|
136
|
+
if supplements_has_type?(supplements, :cor) &&
|
137
|
+
supplements_has_type?(supplements, :amd) && supplements.count == 2
|
138
|
+
|
139
|
+
supplement = supplement_by_type(supplements, :cor)
|
140
|
+
supplement.base = supplement_by_type(supplements, :amd)
|
141
|
+
supplement
|
142
|
+
else
|
143
|
+
raise Errors::SupplementRenderingError, "don't know how to render provided supplements"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def transform(params)
|
148
|
+
identifier_params = params.map do |k, v|
|
149
|
+
get_transformer_class.new.apply(k => v).to_a.first
|
150
|
+
end.to_h
|
151
|
+
|
152
|
+
# return supplement if supplements applied
|
153
|
+
if identifier_params[:supplements]
|
154
|
+
return transform_supplements(
|
155
|
+
identifier_params[:supplements],
|
156
|
+
identifier_params.dup.tap { |h| h.delete(:supplements) })
|
157
|
+
end
|
158
|
+
|
159
|
+
new(**identifier_params)
|
160
|
+
end
|
161
|
+
|
81
162
|
def get_amendment_class
|
82
163
|
Pubid::Iso::Amendment
|
83
164
|
end
|
@@ -102,10 +183,10 @@ module Pubid::Iso
|
|
102
183
|
# Render URN identifier
|
103
184
|
# @return [String] URN identifier
|
104
185
|
def urn
|
105
|
-
if (@
|
186
|
+
if %i(amd cor).include?(type&.type) && (@base.base.nil? && !@base.edition || (!@base.base.nil? && !@base.base.edition))
|
106
187
|
raise Errors::NoEditionError, "Base document must have edition"
|
107
188
|
end
|
108
|
-
(@tctype && Renderer::UrnTc ||
|
189
|
+
(@tctype && Renderer::UrnTc || type == :dir && Renderer::UrnDir || Pubid::Iso::Renderer::Urn).new(get_params).render
|
109
190
|
end
|
110
191
|
|
111
192
|
# Renders pubid identifier
|
@@ -115,6 +196,7 @@ module Pubid::Iso
|
|
115
196
|
# @param with_edition [Boolean] render identifier with edition
|
116
197
|
# @param stage_format_long [Boolean] render with long or short stage format
|
117
198
|
# @param format [:ref_num_short,:ref_num_long,:ref_dated,:ref_dated_long,:ref_undated,:ref_undated_long] create reference with specified format
|
199
|
+
# @param with_prf [Boolean] include PRF stage in output
|
118
200
|
# Format options are:
|
119
201
|
# :ref_num_short -- instance reference number: 1 letter language code + short form (DAM) + dated
|
120
202
|
# :ref_num_long -- instance reference number long: 2 letter language code + long form (DAmd) + dated
|
@@ -162,16 +244,38 @@ module Pubid::Iso
|
|
162
244
|
else
|
163
245
|
if @tctype
|
164
246
|
Renderer::Tc.new(get_params)
|
165
|
-
elsif @type ==
|
247
|
+
elsif @typed_stage&.type == :dir
|
166
248
|
Renderer::Dir.new(get_params)
|
167
249
|
else
|
168
250
|
self.class.get_renderer_class.new(get_params)
|
169
251
|
end
|
170
252
|
end.render(with_date: with_date, with_language_code: with_language_code, with_edition: with_edition,
|
171
253
|
stage_format_long: stage_format_long, with_prf: with_prf) +
|
172
|
-
if @joint_document && @type !=
|
254
|
+
if @joint_document && @typed_stage&.type != :dir
|
173
255
|
"|#{@joint_document}"
|
174
256
|
end.to_s
|
175
257
|
end
|
258
|
+
|
259
|
+
def stage
|
260
|
+
typed_stage&.stage
|
261
|
+
end
|
262
|
+
|
263
|
+
def type
|
264
|
+
typed_stage&.type
|
265
|
+
end
|
266
|
+
|
267
|
+
# Return typed stage abbreviation, eg. "FDTR", "DIS", "TR"
|
268
|
+
def typed_stage_abbrev
|
269
|
+
typed_stage.to_s
|
270
|
+
end
|
271
|
+
|
272
|
+
# Return typed stage name, eg. "Final Draft Technical Report" for "FDTR"
|
273
|
+
def typed_stage_name
|
274
|
+
typed_stage.name
|
275
|
+
end
|
276
|
+
|
277
|
+
def ==(other)
|
278
|
+
get_params == other.get_params
|
279
|
+
end
|
176
280
|
end
|
177
281
|
end
|
data/lib/pubid/iso/parser.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
module Pubid::Iso
|
2
2
|
class Parser < Pubid::Core::Parser
|
3
|
-
STAGES = %w[NP NWIP WD CD
|
4
|
-
TYPES = %w[DATA ISP IWA R TTA TS TR PAS Guide GUIDE DIR].freeze
|
3
|
+
STAGES = %w[NP NWIP WD CD PRF AWI PWI FPD].freeze
|
4
|
+
TYPES = %w[DATA ISP IWA R TTA TS TR IS PAS Guide GUIDE DIR].freeze
|
5
|
+
TYPED_STAGES = %w[DIS FDIS DPAS FDTR FDTS DTS DTR PDTR PDTS].freeze
|
6
|
+
SUPPLEMENTS = %w[Amd Cor AMD COR]
|
7
|
+
STAGED_SUPPLEMENTS = %w[DAmd DAM DCor FDAmd FDCor DCOR FCOR FDCOR FDAM PDAM pDCOR FPDAM]
|
5
8
|
|
6
9
|
TCTYPES = ["TC", "JTC", "PC", "IT", "CAB", "CASCO", "COPOLCO",
|
7
10
|
"COUNCIL", "CPSG", "CS", "DEVCO", "GA", "GAAB", "INFCO",
|
@@ -21,6 +24,18 @@ module Pubid::Iso
|
|
21
24
|
array_to_str(Renderer::Russian::STAGE.values) | array_to_str(STAGES)
|
22
25
|
end
|
23
26
|
|
27
|
+
rule(:typed_stage) do
|
28
|
+
array_to_str(TYPED_STAGES)
|
29
|
+
end
|
30
|
+
|
31
|
+
rule(:staged_supplement) do
|
32
|
+
array_to_str(STAGED_SUPPLEMENTS)
|
33
|
+
end
|
34
|
+
|
35
|
+
rule(:supplements) do
|
36
|
+
array_to_str(SUPPLEMENTS)
|
37
|
+
end
|
38
|
+
|
24
39
|
rule(:type) do
|
25
40
|
(array_to_str(Renderer::Russian::TYPE.values) | array_to_str(TYPES)).as(:type)
|
26
41
|
end
|
@@ -56,24 +71,13 @@ module Pubid::Iso
|
|
56
71
|
str(".") >> digits.as(:iteration)
|
57
72
|
end
|
58
73
|
|
59
|
-
rule(:
|
60
|
-
((str("/")
|
61
|
-
|
62
|
-
(str("Amd") | str("AMD") | str("AM")) >>
|
63
|
-
(space | str(".")).repeat(1).maybe >>
|
64
|
-
digits.as(:number) >>
|
65
|
-
(str(".") >> digits.as(:iteration)).maybe >>
|
66
|
-
((str(":") | str("-")) >> digits.as(:year)).maybe).repeat(1).as(:amendments)
|
67
|
-
end
|
68
|
-
|
69
|
-
rule(:corrigendum) do
|
70
|
-
((str("/") >> stage.as(:stage)).maybe >>
|
71
|
-
(str("/") | space).maybe >>
|
72
|
-
(str("Cor") | str("COR")) >>
|
74
|
+
rule(:supplement) do
|
75
|
+
((str("/") | space).maybe >>
|
76
|
+
(staged_supplement | (stage >> space).maybe >> supplements).as(:typed_stage) >>
|
73
77
|
(space | str(".")).repeat(1).maybe >>
|
74
78
|
digits.as(:number) >>
|
75
79
|
(str(".") >> digits.as(:iteration)).maybe >>
|
76
|
-
((str(":") | str("-")) >> digits.as(:year)).maybe).repeat(1).as(:
|
80
|
+
((str(":") | str("-")) >> digits.as(:year)).maybe).repeat(1).as(:supplements)
|
77
81
|
end
|
78
82
|
|
79
83
|
rule(:language) do
|
@@ -117,7 +121,7 @@ module Pubid::Iso
|
|
117
121
|
rule(:std_document_body) do
|
118
122
|
(type | stage.as(:stage)).maybe >>
|
119
123
|
# for ISO/IEC WD TS 25025
|
120
|
-
space? >> ((stage.as(:stage) | type) >> space).maybe >>
|
124
|
+
space? >> ((stage.as(:stage) | typed_stage.as(:stage) | type) >> space).maybe >>
|
121
125
|
digits.as(:number) >>
|
122
126
|
# for identifiers like ISO 5537/IDF 26
|
123
127
|
(str("|") >> (str("IDF").as(:publisher) >> space >> digits.as(:number)).as(:joint_document)).maybe >>
|
@@ -126,7 +130,7 @@ module Pubid::Iso
|
|
126
130
|
# stage before amendment
|
127
131
|
(
|
128
132
|
# stage before corrigendum
|
129
|
-
(
|
133
|
+
(supplement).maybe) >>
|
130
134
|
edition.maybe >>
|
131
135
|
language.maybe
|
132
136
|
end
|
@@ -138,6 +142,7 @@ module Pubid::Iso
|
|
138
142
|
# for French and Russian PubIDs starting with Guide type
|
139
143
|
(guide_prefix.as(:type) >> space).maybe >>
|
140
144
|
(stage.as(:stage) >> space).maybe >>
|
145
|
+
(typed_stage.as(:stage) >> space).maybe >>
|
141
146
|
originator >> (space | str("/")) >>
|
142
147
|
(tc_document_body | std_document_body | (dir_document_body >>
|
143
148
|
(str(" + ") >> (originator >> space >> dir_document_body).as(:joint_document)).maybe))
|