pubid-core 0.1.3 → 0.1.6

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: 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: