pubid-iso 0.1.12 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e97d39eae4c4c0962361910084b0ba9ed9613a01761214d2f4a0750e0c71fe39
4
- data.tar.gz: 0b41fc99349db1c5c5672e690305561e01dac3503d7c226b049bada4fcf857b7
3
+ metadata.gz: 93b04a876f8ee73e80af8c49af1efc223d1b63a4d8a6b6b679a114d77befcc73
4
+ data.tar.gz: c39834a8f5290dc71d8bbcd79801e3313c1c888715040a7d67fbbda116d7572e
5
5
  SHA512:
6
- metadata.gz: 7859c8ac83fc94369f1fab9fc6d4c7529cc49d35a5a09c2fa34dda3b95b2d21d1cd5917e277e6c63bbf96ec174496494ca328f8fff0d995e59ae160423d0ba01
7
- data.tar.gz: 7a104ec181c49142996ef2133648a9145a2c0a0d01a05348abddf362285327d915e59d0b283913113b03bd343ee44f5f5de5265ba111ad21ed2da25bffee2ef8
6
+ metadata.gz: 3bef9b0e5791702f0bcf3c291639d78cb3cd0319d94345b953a0e3608b22b895f019ee75bdcc742c78007281392be6cd2d60081fbe0a81cec9109de59fc31005
7
+ data.tar.gz: eb469ae1abc30c718355173cab16ee1b80cf1386adc1e65fbd5ba96b493f7c7ee9abdd0cab0612ec34159214524465d8323007ba3fd344a0ec3d2b611d6718de
data/README.adoc CHANGED
@@ -12,8 +12,7 @@ identifiers.
12
12
  . generate language specific PubID
13
13
  . generate dated vs undated PubIDs
14
14
 
15
- === Usage
16
-
15
+ === Usage samples
17
16
 
18
17
  [source,ruby]
19
18
  ----
@@ -25,12 +24,143 @@ pubid.to_s
25
24
  => "ISO 1234"
26
25
  ----
27
26
 
28
- Available attributes:
27
+ ==== With coopublisher
28
+
29
+ [source,ruby]
30
+ ----
31
+ pubid = Pubid::Iso::Identifier.new(publisher: "ISO", copublisher: "IEC", number: 123)
32
+ pubid.to_s
33
+
34
+ => "ISO/IEC 1234"
35
+ ----
36
+
37
+ ==== With document type
38
+
39
+ [source,ruby]
40
+ ----
41
+ pubid = Pubid::Iso::Identifier.new(publisher: "ISO", type: "TR", number: 123)
42
+ pubid.to_s
43
+
44
+ => "ISO/TR 1234"
45
+ ----
46
+
47
+ ==== With stage
48
+
49
+ [source,ruby]
50
+ ----
51
+ pubid = Pubid::Iso::Identifier.new(publisher: "ISO", stage: :WD, number: 123)
52
+ pubid.to_s
53
+
54
+ => "ISO/WD 1234"
55
+ ----
56
+
57
+ ==== With part number
58
+
59
+ [source,ruby]
60
+ ----
61
+ pubid = Pubid::Iso::Identifier.new(publisher: "ISO", number: 123, part: 1)
62
+ pubid.to_s
63
+
64
+ => "ISO 1234-1"
65
+ ----
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
+
92
+ ==== Using format options
93
+ [source,ruby]
94
+ ----
95
+ > pubid = Pubid::Iso::Identifier.new(
96
+ number: "8601",
97
+ part: "1",
98
+ year: 2019,
99
+ edition: 1,
100
+ amendment: {number: "1", year: "2021", stage: "DIS"}
101
+ )
102
+ > pubid.to_s(:ref_num_short)
103
+ => "ISO 8601-1:2019/DAM 1:2021(E)"
104
+ > pubid.to_s(:ref_num_long)
105
+ => "ISO 8601-1:2019/DAmd 1:2021(en)"
106
+ > pubid.to_s(:ref_dated)
107
+ => "ISO 8601-1:2019/DAM 1:2021"
108
+ > pubid.to_s(:ref_dated_long)
109
+ => "ISO 8601-1:2019/DAmd 1:2021"
110
+ > pubid.to_s(:ref_undated)
111
+ => "ISO 8601-1:2019/DAM 1"
112
+ > pubid.to_s(:ref_undated_long)
113
+ => "ISO 8601-1:2019/DAmd 1"
114
+ ----
115
+
116
+ ==== Using language specific rendering
117
+ [source,ruby]
118
+ ----
119
+ > pubid = Pubid::Iso::Identifier.parse("ISO/FDIS 26000:2010(ru)")
120
+ > pubid.to_s(format: :ref_num_long, lang: :russian)
121
+ => "ИСО/ОПМС 26000:2010(ru)"
122
+ > pubid = Pubid::Iso::Identifier.parse("ISO/IEC Guide 71:2001(fr)")
123
+ > pubid.to_s(format: :ref_num_long, lang: :french)
124
+ => "Guide ISO/CEI 71:2001(fr)"
125
+ ----
126
+
127
+ ==== Rendering URN identifier
128
+ [source,ruby]
129
+ ----
130
+ > pubid = Pubid::Iso::Identifier.new(
131
+ number: "8601",
132
+ part: "1",
133
+ year: 2019,
134
+ edition: 1,
135
+ amendments: {number: "1", year: "2021", stage: "DIS"}
136
+ )
137
+ > pubid.urn
138
+ => "urn:iso:std:iso:8601:-1:ed-1:amd:2021:v1"
139
+ ----
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
+ ----
29
162
 
30
- `number`, `publisher`, `copublisher`, `part`, `type`, `year`, `edition`, `language`, `amendments`,
31
- `corrigendums`, `stage`, `substage`, `iteration`, `supplements`, `amendment_stage`, `corrigendum_stage`,
32
- `joint_document`, `tctype`, `sctype`, `wgtype`, `tcnumber`, `scnumber`, `wgnumber`, `urn_stage`,
33
- `dir`, `dirtype`, `supplement`
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.
34
164
 
35
165
  == Elements of the PubID
36
166
 
@@ -3,9 +3,14 @@ module Pubid::Iso
3
3
  class ParseError < StandardError; end
4
4
  class PublishedIterationError < StandardError; end
5
5
  class HarmonizedStageCodeInvalidError < StandardError; end
6
- class CodeInvalidError < StandardError; end
6
+ class StageInvalidError < StandardError; end
7
7
  class IsStageIterationError < StandardError; end
8
+ class IterationWithoutStageError < StandardError; end
8
9
  class WrongFormat < StandardError; end
9
- class SupplementWithoutYearError < StandardError; end
10
+ # Error raised when supplement applied to base document without publication year or stage
11
+ class SupplementWithoutYearOrStageError < StandardError; end
12
+ class NoEditionError < StandardError; end
13
+ class WrongTypeError < StandardError; end
14
+ class ParseTypeError < StandardError; end
10
15
  end
11
16
  end
@@ -53,22 +53,36 @@ module Pubid::Iso
53
53
  }
54
54
 
55
55
  STAGES_NAMES = {
56
- approval: "50"
57
- }
56
+ preliminary: "00",
57
+ proposal: "10",
58
+ preparatory: "20",
59
+ committee: "30",
60
+ enquiry: "40",
61
+ approval: "50",
62
+ publication: "60",
63
+ review: "90",
64
+ withdrawal: "95",
65
+ }.freeze
58
66
 
59
67
  SUBSTAGES_NAMES = {
60
- registration: "00"
61
- }
68
+ registration: "00",
69
+ start_of_main_action: "20",
70
+ completion_of_main_action: "60",
71
+ repeat_an_earlier_phase: "92",
72
+ repeat_current_phase: "93",
73
+ abandon: "98",
74
+ proceed: "99",
75
+ }.freeze
62
76
 
63
- def initialize(stage, substage = nil)
77
+ def initialize(stage, substage = "00")
64
78
  # when stage is stage name
65
79
  if STAGES_NAMES.key?(stage)
66
80
  @stage = STAGES_NAMES[stage]
67
81
  @substage = SUBSTAGES_NAMES[substage]
68
82
  else
69
83
  # stage is number
70
- validate_stage(stage, substage)
71
84
  @stage, @substage = stage, substage
85
+ validate_stage(stage, substage)
72
86
  end
73
87
  end
74
88
 
@@ -77,8 +91,7 @@ module Pubid::Iso
77
91
  raise Errors::HarmonizedStageCodeInvalidError if Integer(stage).nil?
78
92
 
79
93
  # raise an error when substage wrong
80
- raise Errors::HarmonizedStageCodeInvalidError if stage == "90" && substage == "00"
81
- # raise Errors::HarmonizedStageCodeNotValidError if stage.to_i
94
+ raise Errors::HarmonizedStageCodeInvalidError unless DESCRIPTIONS.key?(to_s)
82
95
  end
83
96
 
84
97
  def to_s
@@ -3,15 +3,15 @@ module Pubid::Iso
3
3
  attr_accessor :stage,
4
4
  :iteration, :joint_document,
5
5
  :tctype, :sctype, :wgtype, :tcnumber, :scnumber, :wgnumber,
6
- :urn_stage, :dirtype,
6
+ :dirtype,
7
7
  # supplement for DIR type identifiers
8
- :supplement
8
+ :supplement,
9
+ :base
9
10
 
10
11
  # Creates new identifier from options provided, includes options from
11
12
  # Pubid::Core::Identifier#initialize
12
13
  #
13
- # @param stage [Stage] stage
14
- # @param urn_stage [Float] numeric stage for URN rendering
14
+ # @param stage [Stage, Symbol, String] stage, e.g. "PWI", "NP", "50.00", Stage.new(abbr: :WD)
15
15
  # @param iteration [Integer] document iteration, eg. "1", "2", "3"
16
16
  # @param joint_document [Identifier] joint document
17
17
  # @param supplement [Supplement] supplement
@@ -22,33 +22,48 @@ module Pubid::Iso
22
22
  # @param scnumber [Integer] Subsommittee number, eg. "1", "2"
23
23
  # @param wgnumber [Integer] Working group number, eg. "1", "2"
24
24
  # @param dirtype [String] Directives document type, eg. "JTC"
25
+ # @param base [Identifier] base document for supplement's identifier
26
+ # @param type [nil, :tr, :ts, :amd, :cor, :guide, :dir, :tc, Type] document's type, eg. :tr, :ts, :amd, :cor, Type.new(:tr)
27
+ # @raise [Errors::SupplementWithoutYearOrStageError] when trying to apply
28
+ # supplement to the document without edition year or stage
29
+ # @raise [Errors::IsStageIterationError] when trying to apply iteration
30
+ # to document with IS stage
31
+ # @raise [Errors::IterationWithoutStageError] when trying to applu iteration
32
+ # to document without stage
25
33
  # @see Supplement
26
34
  # @see Identifier
27
35
  # @see Pubid::Core::Identifier
28
36
  # @see Parser
29
37
  #
30
38
  def initialize(publisher: "ISO", number: nil, stage: nil, iteration: nil, supplement: nil,
31
- joint_document: nil, urn_stage: nil,
32
- tctype: nil, sctype: nil, wgtype: nil, tcnumber: nil,
39
+ joint_document: nil, tctype: nil, sctype: nil, wgtype: nil, tcnumber: nil,
33
40
  scnumber: nil, wgnumber:nil,
34
41
  dir: nil, dirtype: nil, year: nil, amendments: nil,
35
- corrigendums: nil, **opts)
42
+ corrigendums: nil, type: nil, base: nil, **opts)
36
43
  super(**opts.merge(number: number, publisher: publisher, year: year,
37
44
  amendments: amendments, corrigendums: corrigendums))
38
45
 
39
- if (amendments || corrigendums) && year.nil?
40
- raise Errors::SupplementWithoutYearError, "Cannot apply supplement to document without edition year"
46
+ if %i(amd cor).include?(type) && (base.year.nil? && base.stage.nil?)
47
+ raise Errors::SupplementWithoutYearOrStageError,
48
+ "Cannot apply supplement to document without base identifieredition year or stage"
41
49
  end
42
50
  if stage
43
- @stage = (stage.is_a?(Symbol) || stage.is_a?(String)) ? Stage.new(abbr: stage) : stage
51
+ @stage = stage.is_a?(Stage) ? stage : Stage.parse(stage)
52
+
44
53
  if @stage.abbr == "IS" && iteration
45
54
  raise Errors::IsStageIterationError, "IS stage document cannot have iteration"
46
55
  end
56
+
57
+ if @stage.abbr == "FDIS" && type == :pas
58
+ raise Errors::StageInvalidError, "PAS type cannot have FDIS stage"
59
+ end
60
+ elsif iteration
61
+ raise Errors::IterationWithoutStageError, "Document without stage cannot have iteration"
47
62
  end
63
+
48
64
  @iteration = iteration.to_i if iteration
49
65
  @supplement = supplement if supplement
50
66
  @joint_document = joint_document if joint_document
51
- @urn_stage = urn_stage if urn_stage
52
67
  @tctype = tctype if tctype
53
68
  @sctype = sctype.to_s if sctype
54
69
  @wgtype = wgtype.to_s if wgtype
@@ -57,6 +72,8 @@ module Pubid::Iso
57
72
  @wgnumber = wgnumber.to_s if wgnumber
58
73
  @dir = dir.to_s if dir
59
74
  @dirtype = dirtype.to_s if dirtype
75
+ @base = base if base
76
+ @type = type.is_a?(Type) ? type : Type.new(type) unless type.nil?
60
77
  end
61
78
 
62
79
  def self.parse_from_title(title)
@@ -69,6 +86,38 @@ module Pubid::Iso
69
86
  end
70
87
 
71
88
  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
93
+
94
+ supplement = nil
95
+
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
103
+ end
104
+
105
+
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) }))
113
+ end
114
+
115
+
116
+ return supplement if supplement
117
+
118
+ new(**identifier_params)
119
+ end
120
+
72
121
  def get_amendment_class
73
122
  Pubid::Iso::Amendment
74
123
  end
@@ -90,39 +139,62 @@ module Pubid::Iso
90
139
  end
91
140
  end
92
141
 
142
+ # Render URN identifier
143
+ # @return [String] URN identifier
93
144
  def urn
94
- (@tctype && Renderer::UrnTc || @type == "DIR" && Renderer::UrnDir || Pubid::Iso::Renderer::Urn).new(get_params).render
95
- end
96
-
97
- def formatted(format)
98
- case format
99
- when :ref_num_short
100
- to_s(with_language_code: :single, stage_format_long: false)
101
- when :ref_num_long
102
- to_s(with_language_code: :iso, stage_format_long: true)
103
- when :ref_dated
104
- to_s(with_language_code: :none, stage_format_long: false)
105
- when :ref_dated_long
106
- to_s(with_language_code: :none, stage_format_long: true)
107
- when :ref_undated
108
- to_s(with_language_code: :none, stage_format_long: false, with_date: false)
109
- when :ref_undated_long
110
- to_s(with_language_code: :none, stage_format_long: true, with_date: false)
111
- else
112
- raise Errors::WrongFormat, "#{format} is not available"
145
+ if %i(amd cor).include?(@type&.type) && (@base.base.nil? && !@base.edition || (!@base.base.nil? && !@base.base.edition))
146
+ raise Errors::NoEditionError, "Base document must have edition"
113
147
  end
148
+ (@tctype && Renderer::UrnTc || @type == :dir && Renderer::UrnDir || Pubid::Iso::Renderer::Urn).new(get_params).render
114
149
  end
115
150
 
116
151
  # Renders pubid identifier
117
152
  #
118
153
  # @param lang [:french,:russian] use language specific renderer
119
154
  # @param with_date [Boolean] render identifier with date
120
- # @param with_language_code [:iso,:single] use iso format or single language code for rendering
121
155
  # @param with_edition [Boolean] render identifier with edition
122
156
  # @param stage_format_long [Boolean] render with long or short stage format
157
+ # @param format [:ref_num_short,:ref_num_long,:ref_dated,:ref_dated_long,:ref_undated,:ref_undated_long] create reference with specified format
158
+ # @param with_prf [Boolean] include PRF stage in output
159
+ # Format options are:
160
+ # :ref_num_short -- instance reference number: 1 letter language code + short form (DAM) + dated
161
+ # :ref_num_long -- instance reference number long: 2 letter language code + long form (DAmd) + dated
162
+ # :ref_dated -- reference dated: no language code + short form (DAM) + dated
163
+ # :ref_dated_long -- reference dated long: no language code + short form (DAM) + dated
164
+ # :ref_undated -- reference undated: no language code + short form (DAM) + undated
165
+ # :ref_undated_long -- reference undated long: 1 letter language code + long form (DAmd) + undated
123
166
  # @return [String] pubid identifier
124
- def to_s(lang: nil, with_date: true, with_language_code: :iso,
125
- with_edition: true, stage_format_long: true)
167
+ def to_s(lang: nil, with_date: true,
168
+ with_edition: false, with_prf: false,
169
+ format: :ref_dated_long)
170
+ with_language_code = nil
171
+ stage_format_long = nil
172
+ if format
173
+ case format
174
+ when :ref_num_short
175
+ with_language_code = :single
176
+ stage_format_long = false
177
+ when :ref_num_long
178
+ with_language_code = :iso
179
+ stage_format_long = true
180
+ when :ref_dated
181
+ with_language_code = :none
182
+ stage_format_long = false
183
+ when :ref_dated_long
184
+ with_language_code = :none
185
+ stage_format_long = true
186
+ when :ref_undated
187
+ with_language_code = :none
188
+ stage_format_long = false
189
+ with_date = false
190
+ when :ref_undated_long
191
+ with_language_code = :none
192
+ stage_format_long = true
193
+ with_date = false
194
+ else
195
+ raise Errors::WrongFormat, "#{format} is not available"
196
+ end
197
+ end
126
198
  case lang
127
199
  when :french
128
200
  Renderer::French.new(get_params)
@@ -131,16 +203,27 @@ module Pubid::Iso
131
203
  else
132
204
  if @tctype
133
205
  Renderer::Tc.new(get_params)
134
- elsif @type == "DIR"
206
+ elsif @type == :dir
135
207
  Renderer::Dir.new(get_params)
136
208
  else
137
209
  self.class.get_renderer_class.new(get_params)
138
210
  end
139
211
  end.render(with_date: with_date, with_language_code: with_language_code, with_edition: with_edition,
140
- stage_format_long: stage_format_long) +
141
- if @joint_document && @type != "DIR"
212
+ stage_format_long: stage_format_long, with_prf: with_prf) +
213
+ if @joint_document && @type != :dir
142
214
  "|#{@joint_document}"
143
215
  end.to_s
144
216
  end
217
+
218
+ # Return typed stage abbreviation, eg. "FDTR", "DIS", "TR"
219
+ def typed_stage_abbrev
220
+ renderer = self.class.get_renderer_class.new(get_params).prerender
221
+ renderer.prerendered_params[:type_stage]
222
+ end
223
+
224
+ # Return typed stage name, eg. "Final Draft Technical Report" for "FDTR"
225
+ def typed_stage_name
226
+ "#{stage.short_name} #{type.to_s(:long)}"
227
+ end
145
228
  end
146
229
  end
@@ -1,24 +1,56 @@
1
1
  module Pubid::Iso::Renderer
2
2
  class Base < Pubid::Core::Renderer::Base
3
+ attr_accessor :prerendered_params
4
+
5
+ TYPE_VALUES = {
6
+ tr: "TR",
7
+ ts: "TS",
8
+ isp: "ISP",
9
+ guide: "Guide",
10
+ pas: "PAS",
11
+ dpas: "DPAS",
12
+ }.freeze
13
+
14
+ # Prerender parameters
15
+ def prerender(with_edition: true, **args)
16
+ @params[:type_stage] = @params.slice(:stage, :type) if @params[:stage] || @params[:type]
17
+ super
18
+ end
19
+
3
20
  # Render identifier
4
21
  # @param with_edition [Boolean] include edition in output
5
22
  # @see Pubid::Core::Renderer::Base for another options
6
23
  def render(with_edition: true, **args)
7
- params = prerender_params(@params,
8
- { with_edition: with_edition }.merge(args))
9
- # render empty string when the key is not exist
10
- params.default = ""
11
-
12
- render_identifier(params)
24
+ super(**args.merge({ with_edition: with_edition }))
13
25
  end
14
26
 
15
27
  def render_identifier(params)
16
- if @params[:type] && @params[:stage] && %w(DIS FDIS).include?(@params[:stage].abbr)
17
- render_base(params, " #{render_short_stage(@params[:stage].abbr)}#{@params[:type]}")
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) +
34
+ ("%{part}%{iteration}%{year}%{amendments}%{corrigendums}%{edition}" % params)
35
+ end
36
+
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
18
50
  else
19
- render_base(params, "%{type}%{stage}" % params)
20
- end +
21
- "%{part}%{iteration}%{year}%{edition}%{amendments}%{corrigendums}%{language}" % params
51
+ # when only type or stage
52
+ "#{type}#{stage}"
53
+ end
22
54
  end
23
55
 
24
56
  def render_short_stage(stage)
@@ -30,20 +62,10 @@ module Pubid::Iso::Renderer
30
62
  end
31
63
  end
32
64
 
33
- def render_type(type, opts, params)
34
- if params[:copublisher]
35
- " #{type}"
36
- else
37
- "/#{type}"
38
- end
39
- end
65
+ def render_stage(stage, opts, _params)
66
+ return if stage.nil? || (stage.abbr == "PRF" and !opts[:with_prf]) || stage.abbr == "IS"
40
67
 
41
- def render_stage(stage, opts, params)
42
- if params[:copublisher]
43
- " #{stage.abbr}"
44
- else
45
- "/#{stage.abbr}"
46
- end
68
+ stage.abbr
47
69
  end
48
70
 
49
71
  def render_edition(edition, opts, _params)
@@ -1,8 +1,16 @@
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
9
+ end
10
+
3
11
  def render_identifier(params)
4
- if params[:type] == " Guide"
5
- params[:type] = ""
12
+ if params[:type] == :guide
13
+ params[:type] = nil
6
14
  "Guide #{super(params)}"
7
15
  else
8
16
  super
@@ -18,9 +18,17 @@ 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
27
+ end
28
+
21
29
  def render_identifier(params)
22
- if params[:type] == " Guide"
23
- params[:type] = ""
30
+ if params[:type] == :guide
31
+ params[:type] = nil
24
32
  "Руководство #{super(params)}"
25
33
  else
26
34
  super
@@ -43,11 +51,7 @@ module Pubid::Iso::Renderer
43
51
  end
44
52
 
45
53
  def render_stage(stage, _opts, params)
46
- if params[:copublisher]
47
- " #{STAGE[stage.abbr]}"
48
- else
49
- "/#{STAGE[stage.abbr]}"
50
- end
54
+ STAGE[stage.abbr] unless stage.nil?
51
55
  end
52
56
 
53
57
  def render_corrigendums(corrigendums, _opts, _params)
@@ -10,13 +10,33 @@ module Pubid::Iso::Renderer
10
10
  PRF: 50,
11
11
  IS: 60 }.freeze
12
12
 
13
+ def prerender(with_edition: true, **args)
14
+ @params[:type_stage] = @params.slice(:stage, :type) if @params[:stage] || @params[:type]
15
+ super
16
+ end
17
+
18
+ # Render identifier
19
+ # @param with_edition [Boolean] include edition in output
20
+ # @see Pubid::Core::Renderer::Base for another options
21
+ def render(with_edition: true, **args)
22
+ super(**args.merge({ with_edition: with_edition }))
23
+ end
24
+
13
25
  def render_identifier(params)
14
26
  render_base(params) + "%{stage}"\
15
- "%{corrigendum_stage}%{iteration}%{edition}%{amendments}%{corrigendums}%{language}" % params
27
+ "%{corrigendum_stage}%{iteration}%{edition}%{amendments}%{corrigendums}" % params
16
28
  end
17
29
 
18
30
  def render_stage(stage, _opts, params)
19
31
  ":stage-#{stage.harmonized_code}"
20
32
  end
33
+
34
+ def render_type(type, _, _)
35
+ ":#{type.to_s.downcase}"
36
+ end
37
+
38
+ def render_year(year, _opts, _params)
39
+ ":#{year}"
40
+ end
21
41
  end
22
42
  end
@@ -4,30 +4,103 @@ module Pubid::Iso
4
4
 
5
5
  STAGES = { PWI: "00.00",
6
6
  NP: "10.00",
7
- AWI: "20.00",
8
- WD: "20.20",
7
+ AWI: %w[20.00 10.99],
8
+ WD: %w[20.20 20.60 20.98 20.99],
9
9
  CD: "30.00",
10
10
  DIS: "40.00",
11
11
  FDIS: "50.00",
12
- PRF: "50.00",
13
- IS: "60.00" }.freeze
12
+ PRF: "60.00",
13
+ IS: "60.60" }.freeze
14
+
15
+
16
+ STAGE_NAMES = {
17
+ FDIS: "Final Draft International Standard",
18
+ DIS: "Draft International Standard",
19
+ WD: "Working Draft",
20
+ PWI: "Preliminary Work Item",
21
+ NP: "New Proposal",
22
+ CD: "Committee Draft",
23
+ 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
+ }.freeze
14
37
 
15
38
  # @param abbr [String, Symbol] abbreviation eg. :PWI, :WD
16
- # @param harmonized_code [HarmonizedStageCode]
39
+ # @param harmonized_code [String, Float, HarmonizedStageCode]
17
40
  def initialize(abbr: nil, harmonized_code: nil)
18
- @abbr = abbr
19
- @harmonized_code = harmonized_code
41
+ @abbr = abbr&.to_s
20
42
 
21
43
  if harmonized_code
22
- # @abbr = STAGES.select { |k,v| v == @harmonized_code.to_s }.first&.first
23
- @abbr ||= STAGES.key(@harmonized_code.to_s)
44
+ @harmonized_code = if harmonized_code.is_a?(HarmonizedStageCode)
45
+ harmonized_code
46
+ else
47
+ HarmonizedStageCode.new(*harmonized_code.to_s.split("."))
48
+ end
49
+ @abbr ||= lookup_abbr(@harmonized_code.to_s) || lookup_abbr("#{@harmonized_code.stage}.00")
24
50
  end
25
51
 
26
52
  if abbr
27
- raise Errors::CodeInvalidError, "#{abbr} is not valid stage" unless STAGES.key?(abbr.to_sym)
53
+ raise Errors::StageInvalidError, "#{abbr} is not valid stage" unless STAGES.key?(abbr.to_sym)
54
+
55
+ @harmonized_code ||= HarmonizedStageCode.new(*lookup_code(abbr).split("."))
56
+ end
57
+ end
28
58
 
29
- @harmonized_code ||= HarmonizedStageCode.new(*STAGES[abbr.to_sym].split("."))
59
+ # Lookup for abbreviated code by numeric stage code
60
+ # @param lookup_code [String] stage code, e.g. "00.00", "20.20"
61
+ def lookup_abbr(lookup_code)
62
+ STAGES.each do |abbr, codes|
63
+ case codes
64
+ when Array
65
+ codes.each do |code|
66
+ return abbr if code == lookup_code
67
+ end
68
+ when lookup_code
69
+ return abbr
70
+ end
30
71
  end
72
+
73
+ nil
74
+ end
75
+
76
+ def lookup_code(lookup_abbr)
77
+ code = STAGES[lookup_abbr.to_sym]
78
+ code.is_a?(Array) ? code.first : code
79
+ end
80
+
81
+ def self.parse(stage)
82
+ if /\A[\d.]+\z/.match?(stage)
83
+ Stage.new(harmonized_code: stage)
84
+ else
85
+ raise Errors::StageInvalidError unless stage.is_a?(Symbol) || stage.is_a?(String)
86
+
87
+ Stage.new(abbr: stage)
88
+ end
89
+ end
90
+
91
+ # Compares one stage with another
92
+ def ==(other)
93
+ other&.harmonized_code == harmonized_code
94
+ end
95
+
96
+ # Return stage name, eg. "Draft International Standard" for "DIS"
97
+ def name
98
+ STAGE_NAMES[abbr.to_sym]
99
+ end
100
+
101
+ # Return short stage name, eg. "Draft" for "DIS"
102
+ def short_name
103
+ STAGE_NAMES_SHORT[abbr.to_sym]
31
104
  end
32
105
  end
33
106
  end
@@ -2,14 +2,15 @@ module Pubid::Iso
2
2
  class Supplement < Pubid::Core::Supplement
3
3
  attr_accessor :stage, :publisher, :edition, :iteration
4
4
 
5
- # @param stage [Stage] stage, e.g. "PWI", "NP"
6
- # @param publisher [String] publisher, e.g. "ISO", "IEC"
5
+ # @param stage [Stage, Symbol, String] stage, e.g. "PWI", "NP", "50.00", Stage.new(abbr: :WD)
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
10
  def initialize(stage: nil, publisher: nil, edition: nil, iteration: nil, **args)
11
11
  super(**args)
12
- @stage = (stage.is_a?(Symbol) || stage.is_a?(String)) ? Stage.new(abbr: stage) : stage
12
+ @stage = stage.is_a?(Stage) ? stage : Stage.parse(stage) if stage
13
+ # for DIR identifiers only
13
14
  @publisher = publisher.to_s
14
15
  @edition = edition&.to_i
15
16
  @iteration = iteration&.to_i
@@ -44,21 +44,26 @@ module Pubid::Iso
44
44
 
45
45
  rule(type: simple(:type)) do
46
46
  russian_type = Renderer::Russian::TYPE.key(type.to_s)
47
- { type: russian_type&.to_s ||
48
- case type
49
- # XXX: can't put 2 alternative Russian translations to dictionary, temporary hack
50
- when "GUIDE", "Руководства"
51
- "Guide"
52
- when "ТС"
53
- "TS"
54
- when "ТО"
55
- "TR"
56
- when "Directives Part", "Directives, Part", "Directives,"
57
- "DIR"
58
- else
59
- type
60
- end
61
- }
47
+ { type: Type.new(russian_type&.downcase&.to_sym ||
48
+ case type
49
+ # XXX: can't put 2 alternative Russian translations to dictionary, temporary hack
50
+ when "GUIDE", "Guide", "Руководства"
51
+ :guide
52
+ when "ТС", "TS"
53
+ :ts
54
+ when "ТО", "TR"
55
+ :tr
56
+ when "Directives Part", "Directives, Part", "Directives,"
57
+ :dir
58
+ when "PAS"
59
+ :pas
60
+ when "DPAS"
61
+ :dpas
62
+ when "DIR"
63
+ :dir
64
+ else
65
+ type
66
+ end) }
62
67
  end
63
68
 
64
69
  rule(copublisher: simple(:copublisher)) do
@@ -0,0 +1,71 @@
1
+ module Pubid::Iso
2
+ class Type
3
+ attr_accessor :type
4
+
5
+ TYPE_NAMES = {
6
+ tr: {
7
+ long: "Technical Report",
8
+ short: "TR",
9
+ },
10
+ ts: {
11
+ long: "Technical Specification",
12
+ short: "TS",
13
+ },
14
+ is: {
15
+ long: "International Standard",
16
+ short: "IS",
17
+ },
18
+ pas: {
19
+ long: "Publicly Available Specification",
20
+ short: "PAS",
21
+ },
22
+ isp: {
23
+ long: "International Standardized Profiles",
24
+ short: "ISP",
25
+ },
26
+ guide: {
27
+ long: "Guide",
28
+ short: "Guide",
29
+ },
30
+ dir: {
31
+ long: "Directives",
32
+ short: "DIR",
33
+ },
34
+ dpas: {
35
+ long: "Publicly Available Specification Draft",
36
+ short: "DPAS",
37
+ },
38
+ cor: {
39
+ short: "Cor",
40
+ },
41
+ amd: {
42
+ short: "Amd",
43
+ },
44
+ }.freeze
45
+
46
+ # Create new type
47
+ # @param type [Symbol]
48
+ def initialize(type)
49
+ raise Errors::WrongTypeError, "#{type} type is not available" unless TYPE_NAMES.key?(type)
50
+
51
+ @type = type
52
+ end
53
+
54
+ def self.parse(type_string)
55
+ TYPE_NAMES.each do |type, values|
56
+ return new(type) if values[:short] == type_string
57
+ end
58
+ raise Errors::ParseTypeError, "Cannot parse '#{type_string}' type"
59
+ end
60
+
61
+ def to_s(format = :short)
62
+ TYPE_NAMES[type][format]
63
+ end
64
+
65
+ def ==(other)
66
+ return type == other if other.is_a?(Symbol)
67
+
68
+ type == other.type
69
+ end
70
+ end
71
+ end
@@ -1,5 +1,5 @@
1
1
  module Pubid
2
2
  module Iso
3
- VERSION = "0.1.12".freeze
3
+ VERSION = "0.2.2".freeze
4
4
  end
5
5
  end
data/lib/pubid/iso.rb CHANGED
@@ -11,6 +11,7 @@ end
11
11
  require "pubid-core"
12
12
  require_relative "iso/errors"
13
13
  require_relative "iso/stage"
14
+ require_relative "iso/type"
14
15
  require_relative "iso/harmonized_stage_code"
15
16
  require_relative "iso/parser"
16
17
  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.1.12
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-09-19 00:00:00.000000000 Z
11
+ date: 2022-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -138,6 +138,7 @@ files:
138
138
  - lib/pubid/iso/stage.rb
139
139
  - lib/pubid/iso/supplement.rb
140
140
  - lib/pubid/iso/transformer.rb
141
+ - lib/pubid/iso/type.rb
141
142
  - lib/pubid/iso/version.rb
142
143
  homepage: https://github.com/metanorma/pubid-iso
143
144
  licenses: