pubid-core 0.1.3 → 0.1.6

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: 1dac8a83909259a5aec69feedb3883fdc064047647334c08235aef1e66b74efb
4
- data.tar.gz: 579ef254a5a1740a29d4f8e13ec725668627c8b98b7c928ef90848f9dd1a1f14
3
+ metadata.gz: c46f13465619dbdc86817f58116f5e1777435535681a2960f54bda577337f196
4
+ data.tar.gz: 11abb71f44d211f354c12d214606b0783f2bcf8d7a3036f114e08746b955a792
5
5
  SHA512:
6
- metadata.gz: 8e43b94b80a8e7b7d4ac838b11ad9dde07ac87f5a83221d95fcb766e3dea0dd1cad277a61516b407aad128c7217371ac74b5163f26c9114775e763f33e104d77
7
- data.tar.gz: c63eb1bdc208613a82922a4640c0741182d8706d051b4646e2af83f70dd963f75a62fe3105b6daea31a19d27dd012dca3ac41625f2e4b961fe91854de24ba1df
6
+ metadata.gz: 298cff787725f61393f2dffa20289c6d773b18bef9bf674fe84dd21158dc641c646375d1de8beea5ea622dd50d1802fa636b2933dd4c29384dd79932791f476c
7
+ data.tar.gz: be51cdf5eea98cf3161b0957890cae3b0cf6698af1dd5e8dc2046bfc591466df17a81a8a0ddb69f741f57356d9b9fbdc89faa349a86f08f1f6899a3d65aa1c1f
@@ -0,0 +1,14 @@
1
+ module Pubid::Core
2
+ class Amendment < Supplement
3
+
4
+ def render_pubid
5
+ stage = render_pubid_stage
6
+ stage += " " unless stage.size == 0
7
+ "/#{stage}Amd #{render_pubid_number}"
8
+ end
9
+
10
+ def render_urn
11
+ "#{render_urn_stage}:amd#{render_urn_number}"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module Pubid::Core
2
+ class Corrigendum < Supplement
3
+
4
+ def render_pubid
5
+ stage = render_pubid_stage
6
+ stage += " " unless stage.size == 0
7
+ "/#{stage}Cor #{render_pubid_number}"
8
+ end
9
+
10
+ def render_urn
11
+ "#{render_urn_stage}:cor#{render_urn_number}"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ module Pubid::Core
2
+ module Errors
3
+ class ParseError < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,79 @@
1
+ module Pubid::Core
2
+ class Identifier
3
+ attr_accessor :number, :publisher, :copublisher, :part,
4
+ :type, :year, :edition, :language, :amendments,
5
+ :corrigendums
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
26
+
27
+ opts.each { |key, value| send("#{key}=", value.is_a?(Array) && value || value.to_s) }
28
+ end
29
+
30
+ def get_params
31
+ instance_variables.map { |var| [var.to_s.gsub("@", "").to_sym, instance_variable_get(var)] }.to_h
32
+ end
33
+
34
+ def to_s
35
+ self.class.get_renderer.new(get_params).render
36
+ end
37
+
38
+ class << self
39
+ def get_amendment_class
40
+ Amendment
41
+ end
42
+
43
+ def get_corrigendum_class
44
+ Corrigendum
45
+ end
46
+
47
+ def get_renderer
48
+ Renderer
49
+ end
50
+
51
+ def parse(code_or_params)
52
+ params = code_or_params.is_a?(String) ? get_parser_class.new.parse(code_or_params) : code_or_params
53
+ # Parslet returns an array when match any copublisher
54
+ # otherwise it's hash
55
+ if params.is_a?(Array)
56
+ new(
57
+ **(
58
+ params.inject({}) do |r, i|
59
+ result = r
60
+ i.map {|k, v| Transformer.new.apply(k => v).to_a.first }.each do |k, v|
61
+ result = result.merge(k => r.key?(k) ? [v, r[k]] : v)
62
+ end
63
+ result
64
+ end
65
+ )
66
+ )
67
+ else
68
+ new(**params.map do |k, v|
69
+ Transformer.new.apply(k => v).to_a.first
70
+ end.to_h)
71
+ end
72
+ # merge values repeating keys into array (for copublishers)
73
+
74
+ rescue Parslet::ParseFailed => failure
75
+ raise Pubid::Iso::Errors::ParseError, "#{failure.message}\ncause: #{failure.parse_failure_cause.ascii_tree}"
76
+ end
77
+ end
78
+ end
79
+ end
@@ -37,5 +37,9 @@ module Pubid::Core
37
37
  rule(:comma_month_year) do
38
38
  comma >> words.as(:month) >> space >> year_digits.as(:year)
39
39
  end
40
+
41
+ rule(:year_month) do
42
+ year_digits >> dash >> month_digits
43
+ end
40
44
  end
41
45
  end
@@ -0,0 +1,100 @@
1
+ module Pubid::Core
2
+ class Renderer
3
+ attr_accessor :params
4
+
5
+ LANGUAGES = {
6
+ "ru" => "R",
7
+ "fr" => "F",
8
+ "en" => "E",
9
+ "ar" => "A",
10
+ }.freeze
11
+
12
+ def initialize(params)
13
+ @params = params
14
+ end
15
+
16
+ def prerender_params(params, opts)
17
+ params.map do |key, value|
18
+ if respond_to?("render_#{key}")
19
+ [key, send("render_#{key}", value, opts, params)]
20
+ else
21
+ [key, value]
22
+ end
23
+ end.to_h
24
+ end
25
+
26
+ # render from hash keys
27
+ def render(with_date: true, with_language_code: :iso)
28
+ params = prerender_params(@params,
29
+ { with_date: with_date, with_language_code: with_language_code })
30
+ # render empty string when the key is not exist
31
+ params.default = ""
32
+
33
+ render_identifier(params)
34
+ end
35
+
36
+ def render_identifier(params)
37
+ "%{publisher}%{copublisher}%{type}%{stage} %{number}%{part}%{iteration}"\
38
+ "%{year}%{edition}%{amendments}%{corrigendums}%{language}" % params
39
+ end
40
+
41
+ def render_copublisher(copublisher, _opts, _params)
42
+ # (!@copublisher.is_a?(Array) && [@copublisher]) || @copublisher
43
+ if copublisher.is_a?(Array)
44
+ copublisher.map(&:to_s).sort.map do |copublisher|
45
+ "/#{copublisher.gsub('-', '/')}"
46
+ end.join
47
+ else
48
+ "/#{copublisher}"
49
+ end
50
+ end
51
+
52
+ def render_amendments(amendments, _opts, _params)
53
+ amendments.map(&:render_pubid).join("+")
54
+ end
55
+
56
+ def render_corrigendums(corrigendums, _opts, _params)
57
+ corrigendums.map(&:render_pubid).join("+")
58
+ end
59
+
60
+ def render_type(type, opts, params)
61
+ if params[:copublisher]
62
+ " #{type}"
63
+ else
64
+ "/#{type}"
65
+ end
66
+ end
67
+
68
+ def render_stage(stage, opts, params)
69
+ if params[:copublisher]
70
+ " #{stage}"
71
+ else
72
+ "/#{stage}"
73
+ end
74
+ end
75
+
76
+ def render_part(part, opts, _params)
77
+ "-#{part}"
78
+ end
79
+
80
+ def render_year(year, opts, _params)
81
+ opts[:with_date] && ":#{year}" || ""
82
+ end
83
+
84
+ def render_language(language, opts, _params)
85
+ if opts[:with_language_code] == :single
86
+ "(#{LANGUAGES[language]})"
87
+ else
88
+ "(#{language})"
89
+ end
90
+ end
91
+
92
+ def render_edition(edition, _opts, _params)
93
+ " ED#{edition}"
94
+ end
95
+
96
+ def render_iteration(iteration, _opts, _params)
97
+ ".#{iteration}"
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,29 @@
1
+ module Pubid::Core
2
+ class Supplement
3
+ attr_accessor :version, :number, :stage
4
+
5
+ def initialize(version:, number: nil, stage: nil)
6
+ @version, @number, @stage = version, number, stage
7
+ end
8
+
9
+ def ==(other)
10
+ other.version == version && (number.nil? || other.number == number) && (stage.nil? || other.stage == stage)
11
+ end
12
+
13
+ def render_pubid_number
14
+ if @number
15
+ "#{@version}:#{@number}"
16
+ else
17
+ "#{@version}"
18
+ end
19
+ end
20
+
21
+ def render_urn_number
22
+ if @number
23
+ ":#{@number}:v#{@version}"
24
+ else
25
+ ":#{@version}:v1"
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,4 @@
1
+ module Pubid::Core
2
+ class Transformer < Parslet::Transform
3
+ end
4
+ end
@@ -1,5 +1,5 @@
1
1
  module Pubid
2
2
  module Core
3
- VERSION = "0.1.3".freeze
3
+ VERSION = "0.1.6".freeze
4
4
  end
5
5
  end
data/lib/pubid/core.rb CHANGED
@@ -1,3 +1,10 @@
1
1
  require "parslet"
2
2
 
3
+ require_relative "core/errors"
3
4
  require_relative "core/parser"
5
+ require_relative "core/supplement"
6
+ require_relative "core/amendment"
7
+ require_relative "core/corrigendum"
8
+ require_relative "core/transformer"
9
+ require_relative "core/renderer"
10
+ require_relative "core/identifier"
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.1.3
4
+ version: 0.1.6
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-06-03 00:00:00.000000000 Z
11
+ date: 2022-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -65,7 +65,14 @@ files:
65
65
  - README.adoc
66
66
  - lib/pubid-core.rb
67
67
  - lib/pubid/core.rb
68
+ - lib/pubid/core/amendment.rb
69
+ - lib/pubid/core/corrigendum.rb
70
+ - lib/pubid/core/errors.rb
71
+ - lib/pubid/core/identifier.rb
68
72
  - lib/pubid/core/parser.rb
73
+ - lib/pubid/core/renderer.rb
74
+ - lib/pubid/core/supplement.rb
75
+ - lib/pubid/core/transformer.rb
69
76
  - lib/pubid/core/version.rb
70
77
  homepage: https://github.com/metanorma/pubid-core
71
78
  licenses: