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 +4 -4
- data/lib/pubid/core/amendment.rb +14 -0
- data/lib/pubid/core/corrigendum.rb +14 -0
- data/lib/pubid/core/errors.rb +5 -0
- data/lib/pubid/core/identifier.rb +87 -0
- data/lib/pubid/core/renderer/base.rb +100 -0
- data/lib/pubid/core/renderer/urn.rb +72 -0
- data/lib/pubid/core/supplement.rb +29 -0
- data/lib/pubid/core/transformer.rb +4 -0
- data/lib/pubid/core/version.rb +1 -1
- data/lib/pubid/core.rb +8 -0
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9895b8d56bf37310135d11148c71ea31514d203a4157b6d6bcb9a4d4df81be58
|
4
|
+
data.tar.gz: 92d7bc8de5d97c2bda090ba2e2056819d29a31fff22f67495a7a4947ffaecc98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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,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
|
data/lib/pubid/core/version.rb
CHANGED
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
|
+
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-
|
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:
|