pubid-iso 0.2.2 → 0.3.0

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: 93b04a876f8ee73e80af8c49af1efc223d1b63a4d8a6b6b679a114d77befcc73
4
- data.tar.gz: c39834a8f5290dc71d8bbcd79801e3313c1c888715040a7d67fbbda116d7572e
3
+ metadata.gz: 418f8b225027cf9b50cb2ec43aad7d043b3bfd0db87733366c6021df8f92f940
4
+ data.tar.gz: fd9a028a0cb2721b4422b2f515aa46263c7d713da57e02c8fc1ed4c54c22f737
5
5
  SHA512:
6
- metadata.gz: 3bef9b0e5791702f0bcf3c291639d78cb3cd0319d94345b953a0e3608b22b895f019ee75bdcc742c78007281392be6cd2d60081fbe0a81cec9109de59fc31005
7
- data.tar.gz: eb469ae1abc30c718355173cab16ee1b80cf1386adc1e65fbd5ba96b493f7c7ee9abdd0cab0612ec34159214524465d8323007ba3fd344a0ec3d2b611d6718de
6
+ metadata.gz: bf1f97bde499237e29b24b793d7e9fe115e03e42a92471a549f90aea9c416ddc357fcfd95079a97bff4b200b4fe8c93f786fc8e3c8256ad3275f2365f9c946e8
7
+ data.tar.gz: d4b53365fc22d587b204a7c38fcaf362e7f85b5cc5a07767ecb4f97fe5c7a3b8c70c3e24c8c30b63166321bd4f757f7d6658df154a4ccab4715ae94c62e8f17e
@@ -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
- case stage.to_s
9
- when "DIS"
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
- case stage.to_s
7
- when "DIS"
8
- if stage_format_long
9
- "/DCor #{pubid_number}"
10
- else
11
- "/DCOR #{pubid_number}"
12
- end
13
- when "FDIS"
14
- if stage_format_long
15
- "/FDCor #{pubid_number}"
16
- else
17
- "/FDCOR #{pubid_number}"
18
- end
19
- when ""
20
- "/Cor #{pubid_number}"
21
- else
22
- "/#{stage} Cor #{pubid_number}"
23
- end
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
@@ -3,6 +3,7 @@ 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
8
9
  class IterationWithoutStageError < StandardError; end
@@ -12,5 +13,9 @@ module Pubid::Iso
12
13
  class NoEditionError < StandardError; end
13
14
  class WrongTypeError < StandardError; end
14
15
  class ParseTypeError < StandardError; end
16
+ class TypeStageInvalidError < StandardError; end
17
+ class TypeStageParseError < StandardError; end
18
+
19
+ class SupplementRenderingError < StandardError; end
15
20
  end
16
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
- def initialize(stage, substage = "00")
78
- # when stage is stage name
79
- if STAGES_NAMES.key?(stage)
80
- @stage = STAGES_NAMES[stage]
81
- @substage = SUBSTAGES_NAMES[substage]
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
- # stage is number
84
- @stage, @substage = stage, substage
85
- validate_stage(stage, substage)
119
+ @stages.first
86
120
  end
87
121
  end
88
122
 
89
- def validate_stage(stage, substage)
90
- # raise an error if stage is not number
91
- raise Errors::HarmonizedStageCodeInvalidError if Integer(stage).nil?
123
+ def ==(other)
124
+ (stages & other.stages) == other.stages
125
+ end
92
126
 
93
- # raise an error when substage wrong
94
- raise Errors::HarmonizedStageCodeInvalidError unless DESCRIPTIONS.key?(to_s)
127
+ def fuzzy?
128
+ @stages.length > 1
95
129
  end
96
130
 
97
- def to_s
98
- "#{stage}.#{substage}"
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 ==(other)
102
- stage == other.stage && substage == other.substage
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
@@ -6,12 +6,14 @@ module Pubid::Iso
6
6
  :dirtype,
7
7
  # supplement for DIR type identifiers
8
8
  :supplement,
9
- :base
9
+ :base,
10
+ :typed_stage,
11
+ :supplements
10
12
 
11
13
  # Creates new identifier from options provided, includes options from
12
14
  # Pubid::Core::Identifier#initialize
13
15
  #
14
- # @param stage [Stage, Symbol, String] stage, e.g. "PWI", "NP", "50.00", Stage.new(abbr: :WD)
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
@@ -39,23 +41,48 @@ module Pubid::Iso
39
41
  joint_document: nil, tctype: nil, sctype: nil, wgtype: nil, tcnumber: nil,
40
42
  scnumber: nil, wgnumber:nil,
41
43
  dir: nil, dirtype: nil, year: nil, amendments: nil,
42
- corrigendums: nil, type: nil, base: nil, **opts)
44
+ corrigendums: nil, type: nil, base: nil, supplements: nil, **opts)
43
45
  super(**opts.merge(number: number, publisher: publisher, year: year,
44
46
  amendments: amendments, corrigendums: corrigendums))
45
47
 
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
+
46
58
  if %i(amd cor).include?(type) && (base.year.nil? && base.stage.nil?)
47
59
  raise Errors::SupplementWithoutYearOrStageError,
48
60
  "Cannot apply supplement to document without base identifieredition year or stage"
49
61
  end
50
- if stage
51
- @stage = stage.is_a?(Stage) ? stage : Stage.parse(stage)
52
62
 
53
- if @stage.abbr == "IS" && iteration
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
54
75
  raise Errors::IsStageIterationError, "IS stage document cannot have iteration"
55
76
  end
56
77
 
57
- if @stage.abbr == "FDIS" && type == :pas
58
- raise Errors::StageInvalidError, "PAS type cannot have FDIS stage"
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
59
86
  end
60
87
  elsif iteration
61
88
  raise Errors::IterationWithoutStageError, "Document without stage cannot have iteration"
@@ -73,7 +100,6 @@ module Pubid::Iso
73
100
  @dir = dir.to_s if dir
74
101
  @dirtype = dirtype.to_s if dirtype
75
102
  @base = base if base
76
- @type = type.is_a?(Type) ? type : Type.new(type) unless type.nil?
77
103
  end
78
104
 
79
105
  def self.parse_from_title(title)
@@ -86,34 +112,49 @@ module Pubid::Iso
86
112
  end
87
113
 
88
114
  class << self
89
- def transform(params)
90
- identifier_params = params.map do |k, v|
91
- get_transformer_class.new.apply(k => v).to_a.first
92
- end.to_h
115
+ def supplements_has_type?(supplements, type)
116
+ supplements.any? do |supplement|
117
+ supplement.typed_stage.type == type
118
+ end
119
+ end
93
120
 
94
- supplement = nil
121
+ def supplement_by_type(supplements, type)
122
+ supplements.select { |supplement| supplement.type == type }.first
123
+ end
95
124
 
96
- if identifier_params[:amendments]
97
- identifier_params[:amendments].first.tap do |amendment|
98
- supplement = new(type: :amd, number: amendment.number, year: amendment.year,
99
- stage: amendment.stage, edition: amendment.edition,
100
- iteration: amendment.iteration,
101
- base: new(**identifier_params.dup.tap { |h| h.delete(:amendments); h.delete(:corrigendums) }))
102
- end
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))
103
131
  end
104
132
 
133
+ return supplements.first if supplements.count == 1
105
134
 
106
- if identifier_params[:corrigendums]
107
- corrigendum = identifier_params[:corrigendums].first
108
- return new(type: :cor, number: corrigendum.number, year: corrigendum.year,
109
- stage: corrigendum.stage, edition: corrigendum.edition,
110
- iteration: corrigendum.iteration,
111
- base: supplement ? supplement :
112
- new(**identifier_params.dup.tap { |h| h.delete(:amendments); h.delete(:corrigendums) }))
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"
113
144
  end
145
+ end
114
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
115
151
 
116
- return supplement if supplement
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
117
158
 
118
159
  new(**identifier_params)
119
160
  end
@@ -142,10 +183,10 @@ module Pubid::Iso
142
183
  # Render URN identifier
143
184
  # @return [String] URN identifier
144
185
  def urn
145
- if %i(amd cor).include?(@type&.type) && (@base.base.nil? && !@base.edition || (!@base.base.nil? && !@base.base.edition))
186
+ if %i(amd cor).include?(type&.type) && (@base.base.nil? && !@base.edition || (!@base.base.nil? && !@base.base.edition))
146
187
  raise Errors::NoEditionError, "Base document must have edition"
147
188
  end
148
- (@tctype && Renderer::UrnTc || @type == :dir && Renderer::UrnDir || Pubid::Iso::Renderer::Urn).new(get_params).render
189
+ (@tctype && Renderer::UrnTc || type == :dir && Renderer::UrnDir || Pubid::Iso::Renderer::Urn).new(get_params).render
149
190
  end
150
191
 
151
192
  # Renders pubid identifier
@@ -203,27 +244,38 @@ module Pubid::Iso
203
244
  else
204
245
  if @tctype
205
246
  Renderer::Tc.new(get_params)
206
- elsif @type == :dir
247
+ elsif @typed_stage&.type == :dir
207
248
  Renderer::Dir.new(get_params)
208
249
  else
209
250
  self.class.get_renderer_class.new(get_params)
210
251
  end
211
252
  end.render(with_date: with_date, with_language_code: with_language_code, with_edition: with_edition,
212
253
  stage_format_long: stage_format_long, with_prf: with_prf) +
213
- if @joint_document && @type != :dir
254
+ if @joint_document && @typed_stage&.type != :dir
214
255
  "|#{@joint_document}"
215
256
  end.to_s
216
257
  end
217
258
 
259
+ def stage
260
+ typed_stage&.stage
261
+ end
262
+
263
+ def type
264
+ typed_stage&.type
265
+ end
266
+
218
267
  # Return typed stage abbreviation, eg. "FDTR", "DIS", "TR"
219
268
  def typed_stage_abbrev
220
- renderer = self.class.get_renderer_class.new(get_params).prerender
221
- renderer.prerendered_params[:type_stage]
269
+ typed_stage.to_s
222
270
  end
223
271
 
224
272
  # Return typed stage name, eg. "Final Draft Technical Report" for "FDTR"
225
273
  def typed_stage_name
226
- "#{stage.short_name} #{type.to_s(:long)}"
274
+ typed_stage.name
275
+ end
276
+
277
+ def ==(other)
278
+ get_params == other.get_params
227
279
  end
228
280
  end
229
281
  end
@@ -1,7 +1,10 @@
1
1
  module Pubid::Iso
2
2
  class Parser < Pubid::Core::Parser
3
- STAGES = %w[NP NWIP WD CD DIS FDIS PRF IS AWI PWI FPD pD PD FD D F].freeze
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(:amendment) do
60
- ((str("/") >> stage.as(:stage)).maybe >>
61
- (str("/") | space).maybe >>
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(:corrigendums)
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
- ((amendment >> corrigendum.maybe) | corrigendum).maybe) >>
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))
@@ -17,42 +17,86 @@ module Pubid::Iso::Renderer
17
17
  super
18
18
  end
19
19
 
20
+ def render_supplement(supplement_params, **args)
21
+ if supplement_params[:base].type == :amd
22
+ # render inner amendment (cor -> amd -> base)
23
+ render_supplement(supplement_params[:base].get_params, **args)
24
+ else
25
+ self.class.new(supplement_params[:base].get_params).render_base_identifier(
26
+ # always render year for identifiers with supplement
27
+ **args.merge({ with_date: true }),
28
+ )
29
+ end +
30
+ case supplement_params[:typed_stage].type.type
31
+ when :amd
32
+ render_amendments(
33
+ [Pubid::Iso::Amendment.new(**supplement_params.slice(:number, :year, :typed_stage, :edition, :iteration))],
34
+ args,
35
+ nil,
36
+ )
37
+ when :cor
38
+ render_corrigendums(
39
+ [Pubid::Iso::Corrigendum.new(**supplement_params.slice(:number, :year, :typed_stage, :edition, :iteration))],
40
+ args,
41
+ nil,
42
+ )
43
+ # copy parameters from Identifier only supported by Corrigendum
44
+ end +
45
+ (supplement_params[:base].language ? render_language(supplement_params[:base].language, args, nil) : "")
46
+ end
47
+
20
48
  # Render identifier
21
49
  # @param with_edition [Boolean] include edition in output
22
50
  # @see Pubid::Core::Renderer::Base for another options
23
- def render(with_edition: true, **args)
24
- super(**args.merge({ with_edition: with_edition }))
51
+ def render(with_edition: true, with_language_code: :iso, with_date: true, **args)
52
+ # super(**args.merge({ with_edition: with_edition }))
53
+ if %i(amd cor).include? @params[:typed_stage]&.type&.type
54
+ render_supplement(@params, **args.merge({ with_date: with_date,
55
+ with_language_code: with_language_code,
56
+ with_edition: with_edition }))
57
+ else
58
+ render_base_identifier(**args.merge({ with_date: with_date,
59
+ with_language_code: with_language_code,
60
+ with_edition: with_edition })) +
61
+ @prerendered_params[:language].to_s
62
+ end
63
+
25
64
  end
26
65
 
27
66
  def render_identifier(params)
28
- type_stage = if params[:type_stage] && !params[:type_stage].empty?
29
- ((params[:copublisher] && !params[:copublisher].empty?) ? " " : "/") + params[:type_stage]
30
- else
31
- ""
32
- end
33
- render_base(params, type_stage) +
67
+ # typed_stage = if params[:typed_stage] && params[:typed_stage] != ""
68
+ # ((params[:copublisher] && !params[:copublisher].empty?) ? " " : "/") + params[:typed_stage].to_s
69
+ # else
70
+ # ""
71
+ # end
72
+ render_base(params, params[:typed_stage]) +
34
73
  ("%{part}%{iteration}%{year}%{amendments}%{corrigendums}%{edition}" % params)
35
74
  end
36
75
 
37
- def render_type_stage(values, opts, params)
38
- # prerender stage and type before
39
- stage = render_stage(values[:stage], opts, params)
40
- type = values[:type]&.to_s
41
- return unless type || stage
42
-
43
- if type && stage
44
- # don't add prefix for pdf format
45
- if %w(DIS FDIS).include?(stage)
46
- "#{render_short_stage(stage)}#{type}"
47
- else
48
- "#{stage} #{type}"
49
- end
50
- else
51
- # when only type or stage
52
- "#{type}#{stage}"
53
- end
76
+ def render_typed_stage(typed_stage, _opts, params)
77
+ (params[:copublisher] ? " " : "/") + typed_stage.to_s
54
78
  end
55
79
 
80
+ # def render_type_stage(values, opts, params)
81
+ #
82
+ # # prerender stage and type before
83
+ # stage = render_stage(values[:stage], opts, params)
84
+ # type = values[:type]&.to_s
85
+ # return unless type || stage
86
+ #
87
+ # if type && stage
88
+ # # don't add prefix for pdf format
89
+ # if %w(DIS FDIS).include?(stage)
90
+ # "#{render_short_stage(stage)}#{type}"
91
+ # else
92
+ # "#{stage} #{type}"
93
+ # end
94
+ # else
95
+ # # when only type or stage
96
+ # "#{type}#{stage}"
97
+ # end
98
+ # end
99
+
56
100
  def render_short_stage(stage)
57
101
  case stage
58
102
  when "DIS"
@@ -1,16 +1,13 @@
1
1
  module Pubid::Iso::Renderer
2
2
  class French < Base
3
- def render_type_stage(values, opts, params)
4
- if values[:type] == :guide
5
- super(values.slice(:stage), opts, params)
6
- else
7
- super
8
- end
3
+ def render_typed_stage(typed_stage, opts, params)
4
+ return nil if typed_stage.type == :guide
5
+
6
+ super
9
7
  end
10
8
 
11
9
  def render_identifier(params)
12
- if params[:type] == :guide
13
- params[:type] = nil
10
+ if @params[:typed_stage]&.type == :guide
14
11
  "Guide #{super(params)}"
15
12
  else
16
13
  super
@@ -18,17 +18,16 @@ module Pubid::Iso::Renderer
18
18
  "ISP" => "ИСП",
19
19
  }.freeze
20
20
 
21
- def render_type_stage(values, opts, params)
22
- if values[:type] == :guide
23
- super(values.slice(:stage), opts, params)
24
- else
25
- super
26
- end
21
+ def render_typed_stage(typed_stage, opts, params)
22
+ return nil if typed_stage.type == :guide
23
+
24
+ return (params[:copublisher] ? " " : "/") + STAGE[typed_stage.to_s] if STAGE.key?(typed_stage.to_s)
25
+
26
+ super
27
27
  end
28
28
 
29
29
  def render_identifier(params)
30
- if params[:type] == :guide
31
- params[:type] = nil
30
+ if @params[:typed_stage]&.type == :guide
32
31
  "Руководство #{super(params)}"
33
32
  else
34
33
  super
@@ -19,20 +19,29 @@ module Pubid::Iso::Renderer
19
19
  # @param with_edition [Boolean] include edition in output
20
20
  # @see Pubid::Core::Renderer::Base for another options
21
21
  def render(with_edition: true, **args)
22
+ # copy type from typed stage
23
+ @params[:type] = @params[:typed_stage].type if @params[:typed_stage] && @params[:typed_stage].type
22
24
  super(**args.merge({ with_edition: with_edition }))
23
25
  end
24
26
 
25
27
  def render_identifier(params)
26
- render_base(params) + "%{stage}"\
28
+ render_base(params) + "%{typed_stage}"\
27
29
  "%{corrigendum_stage}%{iteration}%{edition}%{amendments}%{corrigendums}" % params
28
30
  end
29
31
 
30
- def render_stage(stage, _opts, params)
31
- ":stage-#{stage.harmonized_code}"
32
+ def render_typed_stage(typed_stage, _opts, _params)
33
+ ":stage-#{typed_stage.stage.harmonized_code}" if typed_stage.stage
34
+ end
35
+ # def render_stage(stage, _opts, params)
36
+ # ":stage-#{stage.harmonized_code}"
37
+ # end
38
+
39
+ def render_iteration(iteration, _opts, params)
40
+ ".v#{iteration}" if params[:typed_stage]&.stage
32
41
  end
33
42
 
34
43
  def render_type(type, _, _)
35
- ":#{type.to_s.downcase}"
44
+ ":#{type.to_s.downcase}" unless type == :is
36
45
  end
37
46
 
38
47
  def render_year(year, _opts, _params)
@@ -2,37 +2,20 @@ module Pubid::Iso
2
2
  class Stage
3
3
  attr_accessor :abbr, :harmonized_code
4
4
 
5
- STAGES = { PWI: "00.00",
6
- NP: "10.00",
5
+ STAGES = { PWI: %w[00.00 00.20 00.60 00.98 00.99],
6
+ NP: %w[10.00 10.20 10.60 10.98 10.92],
7
7
  AWI: %w[20.00 10.99],
8
8
  WD: %w[20.20 20.60 20.98 20.99],
9
- CD: "30.00",
10
- DIS: "40.00",
11
- FDIS: "50.00",
12
- PRF: "60.00",
13
- IS: "60.60" }.freeze
9
+ CD: %w[30.00 30.20 30.60 30.92 30.98 30.99],
10
+ PRF: "60.00" }.freeze
14
11
 
15
12
 
16
13
  STAGE_NAMES = {
17
- FDIS: "Final Draft International Standard",
18
- DIS: "Draft International Standard",
19
14
  WD: "Working Draft",
20
15
  PWI: "Preliminary Work Item",
21
16
  NP: "New Proposal",
22
17
  CD: "Committee Draft",
23
18
  PRF: "Proof of a new International Standard",
24
- IS: "International Standard",
25
- }.freeze
26
-
27
- STAGE_NAMES_SHORT = {
28
- FDIS: "Final Draft",
29
- DIS: "Draft",
30
- WD: "Working Draft",
31
- PWI: "Preliminary Work Item",
32
- NP: "New Proposal",
33
- CD: "Committee Draft",
34
- PRF: "Proof of a new International Standard",
35
- IS: "International Standard",
36
19
  }.freeze
37
20
 
38
21
  # @param abbr [String, Symbol] abbreviation eg. :PWI, :WD
@@ -44,27 +27,38 @@ module Pubid::Iso
44
27
  @harmonized_code = if harmonized_code.is_a?(HarmonizedStageCode)
45
28
  harmonized_code
46
29
  else
47
- HarmonizedStageCode.new(*harmonized_code.to_s.split("."))
30
+ HarmonizedStageCode.new(harmonized_code)
48
31
  end
49
- @abbr ||= lookup_abbr(@harmonized_code.to_s) || lookup_abbr("#{@harmonized_code.stage}.00")
32
+ @abbr ||= lookup_abbr(@harmonized_code.stages)
33
+ # unless @harmonized_code.fuzzy?
34
+ # @abbr ||= lookup_abbr(@harmonized_code.to_s) || lookup_abbr("#{@harmonized_code.stage}.00")
35
+ # end
50
36
  end
51
37
 
52
38
  if abbr
53
39
  raise Errors::StageInvalidError, "#{abbr} is not valid stage" unless STAGES.key?(abbr.to_sym)
54
40
 
55
- @harmonized_code ||= HarmonizedStageCode.new(*lookup_code(abbr).split("."))
41
+ @harmonized_code ||= HarmonizedStageCode.new(lookup_code(abbr))
56
42
  end
57
43
  end
58
44
 
59
45
  # Lookup for abbreviated code by numeric stage code
60
- # @param lookup_code [String] stage code, e.g. "00.00", "20.20"
46
+ # @param lookup_code [String, Array] stage code or array of stage codes,
47
+ # e.g. "00.00", "20.20", ["00.00", "00.20"]
61
48
  def lookup_abbr(lookup_code)
49
+ lookup_code = lookup_code.first if lookup_code.is_a?(Array) && lookup_code.count == 1
50
+
62
51
  STAGES.each do |abbr, codes|
63
52
  case codes
64
53
  when Array
65
- codes.each do |code|
66
- return abbr if code == lookup_code
54
+ if lookup_code.is_a?(Array)
55
+ return abbr if codes == lookup_code
56
+ else
57
+ return abbr if codes.include?(lookup_code)
67
58
  end
59
+ # codes.each do |code|
60
+ # return abbr if code == lookup_code
61
+ # end
68
62
  when lookup_code
69
63
  return abbr
70
64
  end
@@ -74,8 +68,8 @@ module Pubid::Iso
74
68
  end
75
69
 
76
70
  def lookup_code(lookup_abbr)
77
- code = STAGES[lookup_abbr.to_sym]
78
- code.is_a?(Array) ? code.first : code
71
+ STAGES[lookup_abbr.to_sym]
72
+ # code.is_a?(Array) ? code.first : code
79
73
  end
80
74
 
81
75
  def self.parse(stage)
@@ -88,6 +82,14 @@ module Pubid::Iso
88
82
  end
89
83
  end
90
84
 
85
+ def self.has_stage?(stage)
86
+ if stage.is_a?(Stage)
87
+ STAGES.key?(stage.abbr.to_sym)
88
+ else
89
+ STAGES.key?(stage.to_sym) || /\A[\d.]+\z/.match?(stage)
90
+ end
91
+ end
92
+
91
93
  # Compares one stage with another
92
94
  def ==(other)
93
95
  other&.harmonized_code == harmonized_code
@@ -97,10 +99,5 @@ module Pubid::Iso
97
99
  def name
98
100
  STAGE_NAMES[abbr.to_sym]
99
101
  end
100
-
101
- # Return short stage name, eg. "Draft" for "DIS"
102
- def short_name
103
- STAGE_NAMES_SHORT[abbr.to_sym]
104
- end
105
102
  end
106
103
  end
@@ -1,35 +1,36 @@
1
1
  module Pubid::Iso
2
2
  class Supplement < Pubid::Core::Supplement
3
- attr_accessor :stage, :publisher, :edition, :iteration
3
+ attr_accessor :typed_stage, :publisher, :edition, :iteration
4
4
 
5
5
  # @param stage [Stage, Symbol, String] stage, e.g. "PWI", "NP", "50.00", Stage.new(abbr: :WD)
6
6
  # @param publisher [String] publisher, e.g. "ISO", "IEC" (only for DIR documents)
7
7
  # @param edition [Integer] edition, e.g. 1, 2, 3
8
8
  # @param iteration [Integer] iteration, e.g. 1, 2, 3
9
9
  # @see Pubid::Core::Supplement for other options
10
- def initialize(stage: nil, publisher: nil, edition: nil, iteration: nil, **args)
10
+ def initialize(typed_stage: nil, publisher: nil, edition: nil, iteration: nil, **args)
11
11
  super(**args)
12
- @stage = stage.is_a?(Stage) ? stage : Stage.parse(stage) if stage
12
+ @typed_stage = TypedStage.parse(typed_stage) if typed_stage
13
13
  # for DIR identifiers only
14
14
  @publisher = publisher.to_s
15
15
  @edition = edition&.to_i
16
16
  @iteration = iteration&.to_i
17
17
 
18
- if @iteration && @stage.nil?
18
+ if @iteration && @typed_stage.nil?
19
19
  raise Errors::PublishedIterationError.new("cannot assign iteration to published supplement")
20
20
  end
21
21
  end
22
22
 
23
23
  def render_pubid_stage
24
- ((@stage && @stage.abbr != "IS" && @stage.abbr) || "")
24
+ # @typed_stage.stage.abbr != "IS" &&
25
+ ((@typed_stage && @typed_stage.to_s) || "")
25
26
  end
26
27
 
27
28
  def render_urn_stage
28
- ((@stage && ":stage-#{@stage.harmonized_code}") || "")
29
+ ((@typed_stage&.stage && ":stage-#{@typed_stage.stage.harmonized_code}") || "")
29
30
  end
30
31
 
31
32
  def <=>(other)
32
- (super == 0) && ((stage.nil? || stage == other.stage) && 0 || -1) || super
33
+ (super == 0) && ((typed_stage.nil? || typed_stage == other.typed_stage) && 0 || -1) || super
33
34
  end
34
35
 
35
36
  def render_iteration
@@ -8,13 +8,47 @@ module Pubid::Iso
8
8
  { stage: convert_stage(context[:stage]) }
9
9
  end
10
10
 
11
+ rule(supplements: subtree(:supplements)) do |context|
12
+ context[:supplements] =
13
+ context[:supplements].map do |supplement|
14
+ supplement[:typed_stage] = case supplement[:typed_stage]
15
+ when "PDAM"
16
+ "CD Amd"
17
+ when "pDCOR"
18
+ "CD Cor"
19
+ when "FCOR"
20
+ "FDCor"
21
+ when "FPDAM"
22
+ "DAmd"
23
+ when "FDAM"
24
+ "FDAmd"
25
+ else
26
+ supplement[:typed_stage]
27
+ end
28
+ # Supplement.new(
29
+ # number: supplement[:number],
30
+ # year: supplement[:year],
31
+ # typed_stage:
32
+ # case supplement[:typed_stage]
33
+ # when "FCOR"
34
+ # "FDCor"
35
+ # else
36
+ # supplement[:typed_stage]
37
+ # end,
38
+ # iteration: supplement[:iteration]
39
+ # )
40
+ supplement
41
+ end
42
+ context
43
+ end
44
+
11
45
  rule(amendments: subtree(:amendments)) do |context|
12
46
  context[:amendments] =
13
47
  context[:amendments].map do |amendment|
14
48
  Amendment.new(
15
49
  number: amendment[:number],
16
50
  year: amendment[:year],
17
- stage: amendment[:stage] && convert_stage(amendment[:stage]),
51
+ typed_stage: amendment[:stage] && convert_stage(amendment[:stage]),
18
52
  iteration: amendment[:iteration])
19
53
  end
20
54
  context
@@ -26,7 +60,7 @@ module Pubid::Iso
26
60
  Corrigendum.new(
27
61
  number: corrigendum[:number],
28
62
  year: corrigendum[:year],
29
- stage: corrigendum[:stage] && convert_stage(corrigendum[:stage]),
63
+ typed_stage: corrigendum[:stage] && convert_stage(corrigendum[:stage]),
30
64
  iteration: corrigendum[:iteration])
31
65
  end
32
66
  context
@@ -124,12 +158,17 @@ module Pubid::Iso
124
158
  "FDIS"
125
159
  when "Fpr"
126
160
  "PRF"
127
- when "pD", "PD"
128
- "CD"
161
+ # when "pD", "PD"
162
+ # "CD"
163
+ when "PDTR"
164
+ "CD TR"
165
+ when "PDTS"
166
+ "CD TS"
129
167
  else
130
168
  code
131
169
  end
132
- Stage.new(abbr: (russian_code || code))
170
+ russian_code || code
171
+ # Stage.new(abbr: (russian_code || code))
133
172
  end
134
173
 
135
174
  def self.convert_language(code)
@@ -67,5 +67,11 @@ module Pubid::Iso
67
67
 
68
68
  type == other.type
69
69
  end
70
+
71
+ def self.has_type?(type)
72
+ TYPE_NAMES.any? do |_, v|
73
+ v[:short] == type
74
+ end
75
+ end
70
76
  end
71
77
  end
@@ -0,0 +1,204 @@
1
+ module Pubid::Iso
2
+ class TypedStage
3
+ attr_accessor :type, :stage, :typed_stage
4
+
5
+ TYPED_STAGES = {
6
+ dtr: {
7
+ abbr: "DTR",
8
+ type: :tr,
9
+ name: "Draft Technical Report",
10
+ harmonized_stages: %w[40.00 40.20 40.60 40.92 40.93 50.00 50.20 50.60 50.92],
11
+ },
12
+ dis: {
13
+ abbr: "DIS",
14
+ type: :is,
15
+ name: "Draft International Standard",
16
+ harmonized_stages: %w[40.00 40.20 40.60 40.92 40.93],
17
+ },
18
+ dts: {
19
+ abbr: "DTS",
20
+ type: :ts,
21
+ name: "Draft Technical Specification",
22
+ harmonized_stages: %w[40.00 40.20 40.60 40.92 40.93 50.00 50.20 50.60 50.92],
23
+ },
24
+ fdts: {
25
+ abbr: "FDTS",
26
+ type: :ts,
27
+ name: "Final Draft Technical Specification",
28
+ harmonized_stages: %w[50.00 50.20 50.60 50.92],
29
+ },
30
+ fdtr: {
31
+ abbr: "FDTR",
32
+ type: :tr,
33
+ name: "Final Draft Technical Report",
34
+ harmonized_stages: %w[50.00 50.20 50.60 50.92],
35
+ },
36
+ fdis: {
37
+ abbr: "FDIS",
38
+ type: :is,
39
+ name: "Final Draft International Standard",
40
+ harmonized_stages: %w[50.00 50.20 50.60 50.92],
41
+ },
42
+ dpas: {
43
+ abbr: "DPAS",
44
+ type: :pas,
45
+ name: "Publicly Available Specification Draft",
46
+ harmonized_stages: %w[40.00 40.20 40.60 40.92 40.93 50.00 50.20 50.60 50.92],
47
+ },
48
+ damd: {
49
+ abbr: { short: "DAM", long: "DAmd" },
50
+ type: :amd,
51
+ name: "Draft Amendment",
52
+ harmonized_stages: %w[40.00 40.20 40.60 40.92 40.93 50.00 50.20 50.60 50.92],
53
+ },
54
+ dcor: {
55
+ abbr: { short: "DCOR", long: "DCor" },
56
+ type: :cor,
57
+ name: "Draft Corrigendum",
58
+ harmonized_stages: %w[40.00 40.20 40.60 40.92 40.93 50.00 50.20 50.60 50.92],
59
+ },
60
+ fdamd: {
61
+ abbr: { short: "FDAM", long: "FDAmd" },
62
+ type: :amd,
63
+ name: "Final Draft Amendment",
64
+ harmonized_stages: %w[50.00 50.20 50.60 50.92],
65
+ },
66
+ fdcor: {
67
+ abbr: { short: "FDCOR", long: "FDCor" },
68
+ type: :cor,
69
+ name: "Final Draft Corrigendum",
70
+ harmonized_stages: %w[50.00 50.20 50.60 50.92],
71
+ },
72
+ }.freeze
73
+
74
+ # @param type [Symbol,Type] eg. :tr, Type.new(:tr)
75
+ # @param stage [Symbol,Stage] eg. :CD, Stage.new(abbr: :CD)
76
+ def initialize(abbr: nil, type: nil, stage: nil)
77
+ @type = type.is_a?(Type) ? type : Type.new(type) if type
78
+ @stage = stage.is_a?(Stage) ? stage : Stage.new(abbr: stage) if stage
79
+
80
+ if abbr
81
+ raise Errors::TypeStageInvalidError, "#{abbr} is not valid typed stage" unless TYPED_STAGES.key?(abbr)
82
+ assign_abbreviation(abbr)
83
+ elsif !@stage.nil?
84
+ # lookup for typed stage
85
+ @typed_stage = lookup_typed_stage
86
+ end
87
+ end
88
+
89
+ def lookup_typed_stage
90
+ return nil unless @stage
91
+
92
+ TYPED_STAGES.each do |typed_stage, values|
93
+ if values[:harmonized_stages].include?(@stage.harmonized_code.to_s) && values[:type] == @type&.type
94
+ return typed_stage
95
+ end
96
+ end
97
+ nil
98
+ end
99
+
100
+ # Assigns type and stage according to provided typed stage abbreviation
101
+ # @param abbr [Symbol] eg. :dtr, :damd, :dis
102
+ def assign_abbreviation(abbr)
103
+ @typed_stage = if TYPED_STAGES.key?(abbr.downcase.to_sym)
104
+ abbr.downcase.to_sym
105
+ else
106
+ TYPED_STAGES.select do |_, v|
107
+ if v[:abbr].is_a?(Hash)
108
+ v[:abbr].values.include?(abbr)
109
+ else
110
+ v[:abbr] == abbr
111
+ end
112
+ end.keys.first
113
+ end
114
+
115
+ @type = Type.new(TYPED_STAGES[@typed_stage][:type])
116
+ @stage = Stage.new(harmonized_code: HarmonizedStageCode.new(TYPED_STAGES[@typed_stage][:harmonized_stages]))
117
+ end
118
+
119
+ # Render typed stage
120
+ # @param stage_format_long [Boolean] render stage in long or short format
121
+ def to_s(stage_format_long = true)
122
+ # return "" if @type == :amd || @type == :cor
123
+ if @typed_stage
124
+ if TYPED_STAGES[@typed_stage][:abbr].is_a?(Hash)
125
+ return TYPED_STAGES[@typed_stage][:abbr][stage_format_long ? :long : :short]
126
+ else
127
+ return TYPED_STAGES[@typed_stage][:abbr]
128
+ end
129
+ end
130
+
131
+ result = (@stage && @stage.abbr != "IS") ? "#{@stage.abbr}" : ""
132
+ result += " " if !result.empty? && @type && stage_format_long
133
+ result + if stage_format_long
134
+ "#{@type&.to_s}"
135
+ else
136
+ if @type == :amd
137
+ "AM"
138
+ elsif @type == :cor
139
+ "COR"
140
+ else
141
+ "#{@type&.to_s}"
142
+ end
143
+ end
144
+ end
145
+
146
+ # Check if typed stage listed in TYPED_STAGES constant
147
+ # @param typed_stage [String,Symbol] typed stage abbreviation, eg. "DTS", :dts, "DAmd", :damd
148
+ def self.has_typed_stage?(typed_stage)
149
+ return true if TYPED_STAGES.key?(typed_stage)
150
+
151
+ TYPED_STAGES.any? do |_, v|
152
+ if v[:abbr].is_a?(Hash)
153
+ v[:abbr].values.include?(typed_stage)
154
+ else
155
+ v[:abbr] == typed_stage
156
+ end
157
+ end
158
+ end
159
+
160
+ # Assigns stage or type or typed stage or stage and type depending on provided string
161
+ # @param stage_or_typed_stage [String, Stage] eg. "DTR", "CD", Stage.new(:CD), "TR", "CD Amd", :dtr
162
+ def parse_stage(stage_or_typed_stage)
163
+ if self.class.has_typed_stage?(stage_or_typed_stage)
164
+ return assign_abbreviation(stage_or_typed_stage)
165
+ end
166
+
167
+ if stage_or_typed_stage.is_a?(Stage)
168
+ @stage = stage_or_typed_stage
169
+ elsif stage_or_typed_stage.is_a?(String) && stage_or_typed_stage.split.count == 2 &&
170
+ Stage.has_stage?(stage_or_typed_stage.split.first)
171
+ # stage and type ("CD Amd")
172
+ @stage = Stage.parse(stage_or_typed_stage.split.first)
173
+ @type = Type.parse(stage_or_typed_stage.split.last)
174
+ elsif Type.has_type?(stage_or_typed_stage)
175
+ @type = Type.parse(stage_or_typed_stage)
176
+ elsif Stage.has_stage?(stage_or_typed_stage)
177
+ @stage = Stage.parse(stage_or_typed_stage.to_s)
178
+ else
179
+ raise Errors::TypeStageParseError, "cannot parse typed stage or stage"
180
+ end
181
+ @typed_stage = lookup_typed_stage
182
+ end
183
+
184
+ # Parse stage or typed stage
185
+ # @return [TypedStage] typed stage object with parsed stage and typed stage
186
+ def self.parse(stage_or_typed_stage)
187
+ return stage_or_typed_stage if stage_or_typed_stage.is_a?(TypedStage)
188
+
189
+ typed_stage = new
190
+ typed_stage.parse_stage(stage_or_typed_stage)
191
+ typed_stage
192
+ end
193
+
194
+ def name
195
+ TYPED_STAGES[@typed_stage][:name]
196
+ end
197
+
198
+ def ==(other)
199
+ return false if other.nil?
200
+
201
+ type == other.type && typed_stage == other.typed_stage && stage == other.stage
202
+ end
203
+ end
204
+ end
@@ -1,5 +1,5 @@
1
1
  module Pubid
2
2
  module Iso
3
- VERSION = "0.2.2".freeze
3
+ VERSION = "0.3.0".freeze
4
4
  end
5
5
  end
data/lib/pubid/iso.rb CHANGED
@@ -12,6 +12,7 @@ require "pubid-core"
12
12
  require_relative "iso/errors"
13
13
  require_relative "iso/stage"
14
14
  require_relative "iso/type"
15
+ require_relative "iso/typed_stage"
15
16
  require_relative "iso/harmonized_stage_code"
16
17
  require_relative "iso/parser"
17
18
  require_relative "iso/transformer"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pubid-iso
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
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-26 00:00:00.000000000 Z
11
+ date: 2022-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 1.2.0
103
+ version: 1.3.0
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 1.2.0
110
+ version: 1.3.0
111
111
  description: Library to generate, parse and manipulate ISO PubID.
112
112
  email:
113
113
  - open.source@ribose.com
@@ -139,6 +139,7 @@ files:
139
139
  - lib/pubid/iso/supplement.rb
140
140
  - lib/pubid/iso/transformer.rb
141
141
  - lib/pubid/iso/type.rb
142
+ - lib/pubid/iso/typed_stage.rb
142
143
  - lib/pubid/iso/version.rb
143
144
  homepage: https://github.com/metanorma/pubid-iso
144
145
  licenses: