Class: Pubid::Iso::Identifier::Base

Inherits:
Core::Identifier::Base
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/pubid/iso/identifier/base.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(publisher: "ISO", number: nil, stage: nil, iteration: nil, joint_document: nil, tctype: nil, sctype: nil, wgtype: nil, tcnumber: nil, scnumber: nil, wgnumber: nil, dir: nil, dirtype: nil, year: nil, amendments: nil, corrigendums: nil, type: nil, base: nil, supplements: nil, part: nil, addendum: nil, edition: nil, jtc_dir: nil, month: nil, **opts) ⇒ Base

Creates new identifier from options provided, includes options from Pubid::Core::Identifier#initialize

Parameters:

  • stage (Stage, Symbol, String) (defaults to: nil)

    stage or typed stage, e.g. “PWI”, “NP”, “50.00”, Stage.new(abbr: :WD), “DTR”

  • iteration (Integer) (defaults to: nil)

    document iteration, eg. “1”, “2”, “3”

  • joint_document (Identifier, Hash) (defaults to: nil)

    joint document

  • supplements (Array<Supplement>) (defaults to: nil)

    supplements

  • tctype (String) (defaults to: nil)

    Technical Committee type, eg. “TC”, “JTC”

  • sctype (String) (defaults to: nil)

    TC subsommittee, eg. “SC”

  • wgtype (String) (defaults to: nil)

    TC working group type, eg. “AG”, “AHG”

  • tcnumber (Integer) (defaults to: nil)

    Technical Committee number, eg. “1”, “2”

  • scnumber (Integer) (defaults to: nil)

    Subsommittee number, eg. “1”, “2”

  • wgnumber (Integer) (defaults to: nil)

    Working group number, eg. “1”, “2”

  • dirtype (String) (defaults to: nil)

    Directives document type, eg. “JTC”

  • base (Identifier, Hash) (defaults to: nil)

    base document for supplement’s identifier

  • type (nil, :tr, :ts, :amd, :cor, :guide, :dir, :tc, Type) (defaults to: nil)

    document’s type, eg. :tr, :ts, :amd, :cor, Type.new(:tr)

  • jtc_dir (String) (defaults to: nil)

    String to indicate “JTC 1 Directives” identifier

Raises:

See Also:



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/pubid/iso/identifier/base.rb', line 47

def initialize(publisher: "ISO", number: nil, stage: nil, iteration: nil,
               joint_document: nil, tctype: nil, sctype: nil, wgtype: nil, tcnumber: nil,
               scnumber: nil, wgnumber:nil,
               dir: nil, dirtype: nil, year: nil, amendments: nil,
               corrigendums: nil, type: nil, base: nil, supplements: nil,
               part: nil, addendum: nil, edition: nil, jtc_dir: nil, month: nil, **opts)
  super(**opts.merge(number: number, publisher: publisher, year: year,
                     amendments: amendments, corrigendums: corrigendums))

  if supplements
    @supplements = supplements.map do |supplement|
      if supplement.is_a?(Hash)
        self.class.get_transformer_class.new.apply(:supplements => [supplement])[:supplements].first
      else
        supplement
      end
    end
  end

  if stage
    @stage = resolve_stage(stage)
  elsif iteration && !is_a?(Supplement)
    raise Errors::IterationWithoutStageError, "Document without stage cannot have iteration"
  end

  @iteration = iteration.to_i if iteration
  if joint_document
    if joint_document.is_a?(Hash)
      @joint_document = Identifier.create(**joint_document)
    else
      @joint_document = joint_document
    end
  end
  if tctype
    @tctype = tctype.is_a?(Array) ? tctype.map(&:to_s) : tctype.to_s
  end
  @sctype = sctype.to_s if sctype
  @wgtype = wgtype.to_s if wgtype
  @tcnumber = tcnumber.to_s if tcnumber
  @scnumber = scnumber.to_s if scnumber
  @wgnumber = wgnumber.to_s if wgnumber
  @dir = dir.to_s if dir
  @dirtype = dirtype.to_s if dirtype
  if jtc_dir
    @jtc_dir = jtc_dir
  end
  if base
    if base.is_a?(Hash)
      @base = Identifier.create(**base)
    else
      @base = base
    end
  end
  @part = part.to_s if part
  @addendum = addendum if addendum
  @edition = edition
  @month = month
end

Instance Attribute Details

#addendumObject

Returns the value of attribute addendum.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def addendum
  @addendum
end

#baseObject

Returns the value of attribute base.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def base
  @base
end

#dirtypeObject

Returns the value of attribute dirtype.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def dirtype
  @dirtype
end

#iterationObject

Returns the value of attribute iteration.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def iteration
  @iteration
end

#joint_documentObject

Returns the value of attribute joint_document.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def joint_document
  @joint_document
end

#jtc_dirObject

Returns the value of attribute jtc_dir.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def jtc_dir
  @jtc_dir
end

#monthObject

Returns the value of attribute month.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def month
  @month
end

#scnumberObject

Returns the value of attribute scnumber.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def scnumber
  @scnumber
end

#sctypeObject

Returns the value of attribute sctype.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def sctype
  @sctype
end

#stageObject

Returns the value of attribute stage.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def stage
  @stage
end

#supplementsObject

Returns the value of attribute supplements.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def supplements
  @supplements
end

#tcnumberObject

Returns the value of attribute tcnumber.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def tcnumber
  @tcnumber
end

#tctypeObject

Returns the value of attribute tctype.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def tctype
  @tctype
end

#wgnumberObject

Returns the value of attribute wgnumber.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def wgnumber
  @wgnumber
end

#wgtypeObject

Returns the value of attribute wgtype.



10
11
12
# File 'lib/pubid/iso/identifier/base.rb', line 10

def wgtype
  @wgtype
end

Class Method Details

.get_amendment_classObject



165
166
167
# File 'lib/pubid/iso/identifier/base.rb', line 165

def get_amendment_class
  Pubid::Iso::Amendment
end

.get_corrigendum_classObject



169
170
171
# File 'lib/pubid/iso/identifier/base.rb', line 169

def get_corrigendum_class
  Pubid::Iso::Corrigendum
end

.get_identifierObject



189
190
191
# File 'lib/pubid/iso/identifier/base.rb', line 189

def get_identifier
  Identifier
end

.get_parser_classObject



173
174
175
# File 'lib/pubid/iso/identifier/base.rb', line 173

def get_parser_class
  Parser
end

.get_renderer_classObject



181
182
183
# File 'lib/pubid/iso/identifier/base.rb', line 181

def get_renderer_class
  Renderer::Base
end

.get_transformer_classObject



177
178
179
# File 'lib/pubid/iso/identifier/base.rb', line 177

def get_transformer_class
  Transformer
end

.get_update_codesObject



185
186
187
# File 'lib/pubid/iso/identifier/base.rb', line 185

def get_update_codes
  UPDATE_CODES
end

.supplement_by_type(supplements, type) ⇒ Object



113
114
115
# File 'lib/pubid/iso/identifier/base.rb', line 113

def supplement_by_type(supplements, type)
  supplements.select { |supplement| supplement.type[:key] == type }.first
end

.supplements_has_type?(supplements, type) ⇒ Boolean

Returns:

  • (Boolean)


107
108
109
110
111
# File 'lib/pubid/iso/identifier/base.rb', line 107

def supplements_has_type?(supplements, type)
  supplements.any? do |supplement|
    supplement.type[:key] == type
  end
end

.transform(params) ⇒ Object



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/pubid/iso/identifier/base.rb', line 142

def transform(params)
  identifier_params = params.map do |k, v|
    get_transformer_class.new.apply(k => v)
  end.inject({}, :merge)

  # return supplement if supplements applied
  if identifier_params[:supplements] && identifier_params[:supplements].is_a?(Array)
    return transform_supplements(
      identifier_params[:supplements],
      identifier_params.dup.tap { |h| h.delete(:supplements) }
    )
  end

  if identifier_params[:extract]
    base_parameters = params.reject { |k, _| k == :extract }

    return Identifier.create(base: Identifier.create(**base_parameters),
                             type: :ext, **identifier_params[:extract])
  end

  Identifier.create(**identifier_params)
end

.transform_supplements(supplements_params, base_params) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/pubid/iso/identifier/base.rb', line 117

def transform_supplements(supplements_params, base_params)
  supplements = supplements_params.map do |supplement|
    Identifier.create(number: supplement[:number], year: supplement[:year],
        month: supplement[:month],
        stage: supplement[:typed_stage], edition: supplement[:edition],
        iteration: supplement[:iteration], type: (supplement[:type] || !supplement[:typed_stage] && :sup),
        publisher: supplement[:publisher], base: Identifier.create(**base_params))
  end

  return supplements.first if supplements.count == 1

  # update corrigendum base to amendment
  if supplements_has_type?(supplements, :cor) &&
      (supplements_has_type?(supplements, :amd) ||
        supplements_has_type?(supplements, :sup)) && supplements.count == 2

    supplement = supplement_by_type(supplements, :cor)
    supplement.base = supplement_by_type(supplements, :amd) ||
      supplement_by_type(supplements, :sup)
    supplement
  else
    raise Errors::SupplementRenderingError, "don't know how to render provided supplements"
  end
end

.type_match?(parameters) ⇒ Boolean

Returns:

  • (Boolean)


193
194
195
# File 'lib/pubid/iso/identifier/base.rb', line 193

def type_match?(parameters)
  parameters[:type] ? has_type?(parameters[:type]) : has_typed_stage?(parameters[:stage])
end

Instance Method Details

#render_joint_document(joint_document) ⇒ Object



273
274
275
# File 'lib/pubid/iso/identifier/base.rb', line 273

def render_joint_document(joint_document)
  "|#{@joint_document}"
end

#resolve_format(format = :ref_dated_long) ⇒ Object

Format options are:

:ref_num_short -- instance reference number: 1 letter language code + short form (DAM) + dated
:ref_num_long -- instance reference number long: 2 letter language code + long form (DAmd) + dated
:ref_dated -- reference dated: no language code + short form (DAM) + dated
:ref_dated_long -- reference dated long: no language code + short form (DAM) + dated
:ref_undated -- reference undated: no language code + short form (DAM) + undated
:ref_undated_long -- reference undated long: 1 letter language code + long form (DAmd) + undated

Parameters:

  • format (:ref_num_short, :ref_num_long, :ref_dated, :ref_dated_long, :ref_undated, :ref_undated_long) (defaults to: :ref_dated_long)

    create reference with specified format



214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
# File 'lib/pubid/iso/identifier/base.rb', line 214

def resolve_format(format = :ref_dated_long)
  options = { with_date: true }
  case format
  when :ref_num_short
    options[:with_language_code] = :single
    options[:stage_format_long] = false
  when :ref_num_long
    options[:with_language_code] = :iso
    options[:stage_format_long] = true
  when :ref_dated
    options[:with_language_code] = :none
    options[:stage_format_long] = false
  when :ref_dated_long
    options[:with_language_code] = :none
    options[:stage_format_long] = true
  when :ref_undated
    options[:with_language_code] = :none
    options[:stage_format_long] = false
    options[:with_date] = false
  when :ref_undated_long
    options[:with_language_code] = :none
    options[:stage_format_long] = true
    options[:with_date] = false
  else
    raise Errors::WrongFormat, "#{format} is not available"
  end
  options
end

#rootObject

Return typed stage abbreviation, eg. “FDTR”, “DIS”, “TR” returns root identifier



279
280
281
282
283
# File 'lib/pubid/iso/identifier/base.rb', line 279

def root
  return base.base if base&.base

  base || self
end

#to_s(lang: nil, with_edition: false, with_prf: false, format: :ref_dated_long) ⇒ String

Renders pubid identifier

Format options are:

:ref_num_short -- instance reference number: 1 letter language code + short form (DAM) + dated
:ref_num_long -- instance reference number long: 2 letter language code + long form (DAmd) + dated
:ref_dated -- reference dated: no language code + short form (DAM) + dated
:ref_dated_long -- reference dated long: no language code + short form (DAM) + dated
:ref_undated -- reference undated: no language code + short form (DAM) + undated
:ref_undated_long -- reference undated long: 1 letter language code + long form (DAmd) + undated

Parameters:

  • lang (:french, :russian) (defaults to: nil)

    use language specific renderer

  • with_date (Boolean)

    render identifier with date

  • with_edition (Boolean) (defaults to: false)

    render identifier with edition

  • stage_format_long (Boolean)

    render with long or short stage format

  • format (:ref_num_short, :ref_num_long, :ref_dated, :ref_dated_long, :ref_undated, :ref_undated_long) (defaults to: :ref_dated_long)

    create reference with specified format

  • with_prf (Boolean) (defaults to: false)

    include PRF stage in output

Returns:

  • (String)

    pubid identifier



259
260
261
262
263
264
265
266
267
268
269
270
271
# File 'lib/pubid/iso/identifier/base.rb', line 259

def to_s(lang: nil, with_edition: false, with_prf: false,
         format: :ref_dated_long)

  options = resolve_format(format)
  options[:with_edition] = with_edition
  options[:with_prf] = with_prf
  options[:language] = lang

  self.class.get_renderer_class.new(to_h(deep: false)).render(**options) +
    if @joint_document
      render_joint_document(@joint_document)
    end.to_s
end

#urnString

Render URN identifier

Returns:

  • (String)

    URN identifier



200
201
202
203
204
# File 'lib/pubid/iso/identifier/base.rb', line 200

def urn
  ((@tctype && Renderer::UrnTc) || Pubid::Iso::Renderer::Urn).new(
    to_h(deep: false).merge({ type: type[:key] }),
  ).render + (language ? ":#{language}" : "")
end