pubid-core 0.1.4 → 0.1.7

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: c1b28bf047f8339b5d96fb9ef3ea58aede3156ef1f2379e360afcdb96137c5f3
4
- data.tar.gz: 557dd8e1e246b9caf278abcf439001696890f8594116232be357f614b1ae93bd
3
+ metadata.gz: 9895b8d56bf37310135d11148c71ea31514d203a4157b6d6bcb9a4d4df81be58
4
+ data.tar.gz: 92d7bc8de5d97c2bda090ba2e2056819d29a31fff22f67495a7a4947ffaecc98
5
5
  SHA512:
6
- metadata.gz: 78378ed3583f405d843f655ae5e9aee45e071506db0c6a88705ac65f28c2f69b6fcd3304e87578f14742f2fdcca16a32b320e0b2ea51851438115e1dc7aae66d
7
- data.tar.gz: a8422326efe996a0d00aea25b3eda737e598a3e32c7136c47a4112cc57ef1576cc9f967b05b260b8851d2c76290fa75418f0b4f4274be0fbe52eb32911b85e9f
6
+ metadata.gz: 57ad7508563a1bd967e6d60ff78faa2ea7a26e954a001545f0220ccfbbfe6efe935d7d0f8e9a0dec06ef27fb93e5620c6a1e3ca50a43a71b019e63d5bfab4a6b
7
+ data.tar.gz: 0eda4ada9150f10b557a57610f802463773e8573c6f059180cec900ca769e205aa08e51e17d7152b11be88d57fd261b9b1b19d22f5744b51711b5ad1363569d8
@@ -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,87 @@
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 urn
31
+ Renderer::Urn.new(get_params).render
32
+ end
33
+
34
+ def get_params
35
+ instance_variables.map { |var| [var.to_s.gsub("@", "").to_sym, instance_variable_get(var)] }.to_h
36
+ end
37
+
38
+ def to_s
39
+ self.class.get_renderer_class.new(get_params).render
40
+ end
41
+
42
+ 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 parse(code_or_params)
60
+ params = code_or_params.is_a?(String) ? get_parser_class.new.parse(code_or_params) : code_or_params
61
+ # Parslet returns an array when match any copublisher
62
+ # otherwise it's hash
63
+ if params.is_a?(Array)
64
+ new(
65
+ **(
66
+ params.inject({}) do |r, i|
67
+ result = r
68
+ i.map {|k, v| get_transformer_class.new.apply(k => v).to_a.first }.each do |k, v|
69
+ result = result.merge(k => r.key?(k) ? [v, r[k]] : v)
70
+ end
71
+ result
72
+ end
73
+ )
74
+ )
75
+ else
76
+ new(**params.map do |k, v|
77
+ get_transformer_class.new.apply(k => v).to_a.first
78
+ end.to_h)
79
+ end
80
+ # merge values repeating keys into array (for copublishers)
81
+
82
+ rescue Parslet::ParseFailed => failure
83
+ raise Pubid::Iso::Errors::ParseError, "#{failure.message}\ncause: #{failure.parse_failure_cause.ascii_tree}"
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,100 @@
1
+ module Pubid::Core::Renderer
2
+ class Base
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,72 @@
1
+ module Pubid::Core::Renderer
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
12
+
13
+ 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
16
+ end
17
+
18
+ def render_publisher(publisher, _opts, _params)
19
+ publisher.downcase
20
+ end
21
+
22
+ def render_copublisher(copublisher, _opts, _params)
23
+ return "-#{copublisher.downcase}" unless copublisher.is_a?(Array)
24
+
25
+ copublisher.map(&:to_s).sort.map do |copublisher|
26
+ "-#{copublisher.downcase}"
27
+ end.join
28
+ end
29
+
30
+ def render_edition(edition, _opts, _params)
31
+ ":ed-#{edition}"
32
+ end
33
+
34
+ def render_type(type, _, _)
35
+ ":#{type.downcase}"
36
+ end
37
+
38
+ def render_amendments(amendments, _opts, _params)
39
+ amendments&.map(&:render_urn)&.join || ""
40
+ end
41
+
42
+ def render_corrigendums(corrigendums, _opts, _params)
43
+ corrigendums&.map(&:render_urn)&.join || ""
44
+ end
45
+
46
+ def render_language(language, _opts, _params)
47
+ ":#{language}"
48
+ end
49
+
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
+
60
+ def render_corrigendum_stage(stage, opts, params)
61
+ render_stage(stage, opts, params)
62
+ end
63
+
64
+ def render_iteration(iteration, _opts, params)
65
+ ".v#{iteration}" if params[:stage]
66
+ end
67
+
68
+ def render_part(part, _opts, _params)
69
+ ":-#{part}"
70
+ end
71
+ end
72
+ 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.4".freeze
3
+ VERSION = "0.1.7".freeze
4
4
  end
5
5
  end
data/lib/pubid/core.rb CHANGED
@@ -1,3 +1,11 @@
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/base"
10
+ require_relative "core/renderer/urn"
11
+ 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.4
4
+ version: 0.1.7
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-04 00:00:00.000000000 Z
11
+ date: 2022-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -65,7 +65,15 @@ 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/base.rb
74
+ - lib/pubid/core/renderer/urn.rb
75
+ - lib/pubid/core/supplement.rb
76
+ - lib/pubid/core/transformer.rb
69
77
  - lib/pubid/core/version.rb
70
78
  homepage: https://github.com/metanorma/pubid-core
71
79
  licenses: