pubid-core 0.2.2 → 1.1.0

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: 5961503e7e921ca44202798588badd95d5977fd62fbf98275777770439b5da17
4
- data.tar.gz: 2840650728ca920a51a615d2ee81e2884607e485e7740fdd4fc4279cb34cb6fd
3
+ metadata.gz: f2ec998c6f62ddf6387a254425f4989052de90cd44f60577c384f1371314e874
4
+ data.tar.gz: f9aa149ce454d7d8c674fe12c6c7dc9246ff06c6197c63686abaacd6babe15a6
5
5
  SHA512:
6
- metadata.gz: 9a956ff7eb7a323b86e3c8656e4396d0c8af503a89f05c96dbd9ff3cc37ec1f6f43ae8a1111eb6c1437b98d3a846f62e0a72b658e2d89a207099351327953c2e
7
- data.tar.gz: d55c54c9dc464c01af7bda543bf482d82472ab169101759b510793824e4ee963725e43fe5a486c05627f886f0111e7525fff05d1bd3beafe7612dbe93abe2b87
6
+ metadata.gz: 502cca40f231aa67f96041c61cb82868a67a1db3b521d8a2e1f7431d3013dfe48d77e698139407c1640f23931d76766c92eeee36033f6f0de1424bd57f669ccc
7
+ data.tar.gz: 63ba052753612c1c239a5fc6bd71a3952f35dd6dd82715899fa02855479bb55039c71e6b2b7d5d13ab2d02abea638089ab96bc4eacf4c64a6bdfa9c5a27797ca
@@ -4,29 +4,37 @@ module Pubid::Core
4
4
  :type, :year, :edition, :language, :amendments,
5
5
  :corrigendums
6
6
 
7
- def initialize(amendments: nil, corrigendums: nil, **opts)
8
- if amendments
9
- @amendments = if amendments.is_a?(Array)
10
- amendments.map do |amendment|
11
- self.class.get_amendment_class.new(**amendment)
12
- end
13
- else
14
- [self.class.get_amendment_class.new(**amendments)]
15
- end
16
- end
17
- if corrigendums
18
- @corrigendums = if corrigendums.is_a?(Array)
19
- corrigendums.map do |corrigendum|
20
- self.class.get_corrigendum_class.new(**corrigendum)
21
- end
22
- else
23
- [self.class.get_corrigendum_class.new(**corrigendums)]
24
- end
25
- end
7
+ # Creates new identifier from options provided:
8
+ # @param publisher [String] document's publisher, eg. "ISO"
9
+ # @param copublisher [String,Array<String>] document's copublisher, eg. "IEC"
10
+ # @param number [Integer] document's number, eg. "1234"
11
+ # @param part [String] document's part and subparts, eg. "1", "1-1A", "2-3D"
12
+ # @param type [String] document's type, eg. "TR", "TS"
13
+ # @param year [Integer] document's year, eg. "2020"
14
+ # @param edition [Integer] document's edition, eg. "1"
15
+ # @param language [String] document's translation language
16
+ # (available languages: "ru", "fr", "en", "ar")
17
+ # @param amendments [Array<Amendment>] document's amendments
18
+ # @param corrigendums [Array<Corrigendum>] document's corrigendums
19
+ # @see Amendment
20
+ # @see Corrigendum
21
+ def initialize(publisher:, number:, copublisher: nil, part: nil, type: nil,
22
+ year: nil, edition: nil, language: nil, amendments: nil,
23
+ corrigendums: nil)
26
24
 
27
- opts.each { |key, value| send("#{key}=", value.is_a?(Parslet::Slice) && value.to_s || value) }
25
+ @amendments = amendments
26
+ @corrigendums = corrigendums
27
+ @publisher = publisher.to_s
28
+ @number = number
29
+ @copublisher = copublisher if copublisher
30
+ @part = part.to_s if part
31
+ @type = type.to_s if type
32
+ @year = year.to_i if year
33
+ @edition = edition.to_i if edition
34
+ @language = language.to_s if language
28
35
  end
29
36
 
37
+ # @return [String] Rendered URN identifier
30
38
  def urn
31
39
  Renderer::Urn.new(get_params).render
32
40
  end
@@ -35,39 +43,26 @@ module Pubid::Core
35
43
  instance_variables.map { |var| [var.to_s.gsub("@", "").to_sym, instance_variable_get(var)] }.to_h
36
44
  end
37
45
 
46
+ # Render identifier using default renderer
38
47
  def to_s
39
48
  self.class.get_renderer_class.new(get_params).render
40
49
  end
41
50
 
42
51
  class << self
43
- def get_amendment_class
44
- Amendment
45
- end
46
-
47
- def get_corrigendum_class
48
- Corrigendum
49
- end
50
-
51
- def get_renderer_class
52
- Renderer::Base
53
- end
54
-
55
- def get_transformer_class
56
- Transformer
57
- end
58
-
59
- def update_old_code(code)
60
- return code unless defined?(UPDATE_CODES)
61
-
62
- UPDATE_CODES.each do |from, to|
63
- code = code.gsub(from.match?(/^\/.*\/$/) ? Regexp.new(from[1..-2]) : /^#{Regexp.escape(from)}$/, to)
64
- end
65
- code
66
- end
67
-
52
+ # Parses given identifier
53
+ # @param code_or_params [String, Hash] code or hash from parser
54
+ # eg. "ISO 1234", { }
55
+ # @return [Pubid::Core::Identifier] identifier
68
56
  def parse(code_or_params)
69
57
  params = code_or_params.is_a?(String) ?
70
58
  get_parser_class.new.parse(update_old_code(code_or_params)) : code_or_params
59
+ transform(params)
60
+ rescue Parslet::ParseFailed => failure
61
+ raise Errors::ParseError, "#{failure.message}\ncause: #{failure.parse_failure_cause.ascii_tree}"
62
+ end
63
+
64
+ # Transform parameters hash or array or hashes to identifier
65
+ def transform(params)
71
66
  # Parslet returns an array when match any copublisher
72
67
  # otherwise it's hash
73
68
  if params.is_a?(Array)
@@ -76,7 +71,7 @@ module Pubid::Core
76
71
  params.inject({}) do |r, i|
77
72
  result = r
78
73
  i.map {|k, v| get_transformer_class.new.apply(k => v).to_a.first }.each do |k, v|
79
- result = result.merge(k => r.key?(k) ? [v, r[k]] : v)
74
+ result = result.merge(k => r.key?(k) ? [v, r[k]].flatten : v)
80
75
  end
81
76
  result
82
77
  end
@@ -88,9 +83,36 @@ module Pubid::Core
88
83
  end.to_h)
89
84
  end
90
85
  # merge values repeating keys into array (for copublishers)
86
+ end
91
87
 
92
- rescue Parslet::ParseFailed => failure
93
- raise Errors::ParseError, "#{failure.message}\ncause: #{failure.parse_failure_cause.ascii_tree}"
88
+ def get_amendment_class
89
+ Amendment
90
+ end
91
+
92
+ def get_corrigendum_class
93
+ Corrigendum
94
+ end
95
+
96
+ def get_renderer_class
97
+ Renderer::Base
98
+ end
99
+
100
+ def get_transformer_class
101
+ Transformer
102
+ end
103
+
104
+ # @return [Hash, nil] replacement patterns
105
+ def get_update_codes
106
+ nil
107
+ end
108
+
109
+ def update_old_code(code)
110
+ return code unless get_update_codes
111
+
112
+ get_update_codes.each do |from, to|
113
+ code = code.gsub(from.match?(/^\/.*\/$/) ? Regexp.new(from[1..-2]) : /^#{Regexp.escape(from)}$/, to)
114
+ end
115
+ code
94
116
  end
95
117
  end
96
118
  end
@@ -41,5 +41,11 @@ module Pubid::Core
41
41
  rule(:year_month) do
42
42
  year_digits >> dash >> month_digits
43
43
  end
44
+
45
+ def array_to_str(array)
46
+ array.reduce(str(array.first)) do |acc, value|
47
+ acc | str(value)
48
+ end
49
+ end
44
50
  end
45
51
  end
@@ -34,9 +34,12 @@ module Pubid::Core::Renderer
34
34
  render_identifier(params)
35
35
  end
36
36
 
37
+ def render_base(params, prefix = "")
38
+ "%{publisher}%{copublisher}#{prefix} %{number}" % params
39
+ end
40
+
37
41
  def render_identifier(params)
38
- "%{publisher}%{copublisher}%{type}%{stage} %{number}%{part}%{iteration}"\
39
- "%{year}%{edition}%{amendments}%{corrigendums}%{language}" % params
42
+ render_base(params)
40
43
  end
41
44
 
42
45
  def render_copublisher(copublisher, _opts, _params)
@@ -58,21 +61,6 @@ module Pubid::Core::Renderer
58
61
  corrigendums.sort.map(&:render_pubid).join("+")
59
62
  end
60
63
 
61
- def render_type(type, opts, params)
62
- if params[:copublisher]
63
- " #{type}"
64
- else
65
- "/#{type}"
66
- end
67
- end
68
-
69
- def render_stage(stage, opts, params)
70
- if params[:copublisher]
71
- " #{stage}"
72
- else
73
- "/#{stage}"
74
- end
75
- end
76
64
 
77
65
  def render_part(part, opts, _params)
78
66
  "-#{part}"
@@ -89,13 +77,5 @@ module Pubid::Core::Renderer
89
77
  "(#{language})"
90
78
  end
91
79
  end
92
-
93
- def render_edition(edition, _opts, _params)
94
- " ED#{edition}"
95
- end
96
-
97
- def render_iteration(iteration, _opts, _params)
98
- ".#{iteration}"
99
- end
100
80
  end
101
81
  end
@@ -1,18 +1,12 @@
1
1
  module Pubid::Core::Renderer
2
2
  class Urn < Base
3
- STAGES = { PWI: 0,
4
- NP: 10,
5
- AWI: 20,
6
- WD: 20.20,
7
- CD: 30,
8
- DIS: 40,
9
- FDIS: 50,
10
- PRF: 50,
11
- IS: 60 }.freeze
3
+
4
+ def render_base(params)
5
+ "urn:iso:std:%{publisher}%{copublisher}%{type}:%{number}%{part}" % params
6
+ end
12
7
 
13
8
  def render_identifier(params)
14
- "urn:iso:std:%{publisher}%{copublisher}%{type}:%{number}%{part}%{stage}"\
15
- "%{urn_stage}%{corrigendum_stage}%{iteration}%{edition}%{amendments}%{corrigendums}%{language}" % params
9
+ render_base(params)
16
10
  end
17
11
 
18
12
  def render_publisher(publisher, _opts, _params)
@@ -20,7 +14,7 @@ module Pubid::Core::Renderer
20
14
  end
21
15
 
22
16
  def render_copublisher(copublisher, _opts, _params)
23
- return "-#{copublisher.downcase}" unless copublisher.is_a?(Array)
17
+ return "-#{copublisher.to_s.downcase}" unless copublisher.is_a?(Array)
24
18
 
25
19
  copublisher.map(&:to_s).sort.map do |copublisher|
26
20
  "-#{copublisher.downcase}"
@@ -47,15 +41,6 @@ module Pubid::Core::Renderer
47
41
  ":#{language}"
48
42
  end
49
43
 
50
- def render_stage(stage, _opts, _params)
51
- return ":stage-#{sprintf('%05.2f', stage)}" if stage.is_a?(Float)
52
-
53
- ":stage-#{sprintf('%05.2f', STAGES[stage.to_sym])}"
54
- end
55
-
56
- def render_urn_stage(stage, opts, params)
57
- render_stage(stage, opts, params)
58
- end
59
44
 
60
45
  def render_corrigendum_stage(stage, opts, params)
61
46
  render_stage(stage, opts, params)
@@ -3,6 +3,9 @@ module Pubid::Core
3
3
  include Comparable
4
4
  attr_accessor :version, :number
5
5
 
6
+ # Creates new supplement with provided version and optional number
7
+ # @param version [Integer]
8
+ # @param number [Integer]
6
9
  def initialize(version:, number: nil)
7
10
  @version, @number = version&.to_i, number&.to_i
8
11
  end
@@ -1,4 +1,46 @@
1
1
  module Pubid::Core
2
2
  class Transformer < Parslet::Transform
3
+ class << self
4
+ def get_amendment_class
5
+ Amendment
6
+ end
7
+
8
+ def get_corrigendum_class
9
+ Corrigendum
10
+ end
11
+ end
12
+
13
+ def initialize
14
+ super
15
+
16
+ rule(amendments: subtree(:amendments)) do |context|
17
+ if context[:amendments].is_a?(Array)
18
+ context[:amendments] = context[:amendments].map do |amendment|
19
+ self.class.get_amendment_class.new(version: amendment[:version], number: amendment[:number])
20
+ end
21
+ else
22
+ context[:amendments] =
23
+ [self.class.get_amendment_class.new(
24
+ version: context[:amendments][:version],
25
+ number: context[:amendments][:number])]
26
+
27
+ end
28
+ context
29
+ end
30
+
31
+ rule(corrigendums: subtree(:corrigendums)) do |context|
32
+ if context[:corrigendums].is_a?(Array)
33
+ context[:corrigendums] = context[:corrigendums].map do |corrigendum|
34
+ self.class.get_corrigendum_class.new(version: corrigendum[:version], number: corrigendum[:number])
35
+ end
36
+ else
37
+ context[:corrigendums] =
38
+ [self.class.get_corrigendum_class.new(
39
+ version: context[:corrigendums][:version],
40
+ number: context[:corrigendums][:number])]
41
+ end
42
+ context
43
+ end
44
+ end
3
45
  end
4
46
  end
@@ -1,5 +1,5 @@
1
1
  module Pubid
2
2
  module Core
3
- VERSION = "0.2.2".freeze
3
+ VERSION = "1.1.0".freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pubid-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 1.1.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-07-12 00:00:00.000000000 Z
11
+ date: 2022-08-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake