pubid-core 0.1.4 → 0.1.7

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