relaton-bib 0.1.0
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 +7 -0
- data/.gitignore +13 -0
- data/.rspec +3 -0
- data/.rubocop.yml +10 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +57 -0
- data/LICENSE.txt +21 -0
- data/README.adoc +272 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/relaton_bib.rb +7 -0
- data/lib/relaton_bib/bib_item_locality.rb +46 -0
- data/lib/relaton_bib/bibliographic_date.rb +76 -0
- data/lib/relaton_bib/bibliographic_item.rb +343 -0
- data/lib/relaton_bib/classification.rb +22 -0
- data/lib/relaton_bib/contribution_info.rb +61 -0
- data/lib/relaton_bib/contributor.rb +121 -0
- data/lib/relaton_bib/copyright_association.rb +38 -0
- data/lib/relaton_bib/document_identifier.rb +26 -0
- data/lib/relaton_bib/document_relation.rb +49 -0
- data/lib/relaton_bib/document_relation_collection.rb +21 -0
- data/lib/relaton_bib/document_status.rb +24 -0
- data/lib/relaton_bib/formatted_ref.rb +11 -0
- data/lib/relaton_bib/formatted_string.rb +33 -0
- data/lib/relaton_bib/localized_string.rb +45 -0
- data/lib/relaton_bib/medium.rb +24 -0
- data/lib/relaton_bib/organization.rb +103 -0
- data/lib/relaton_bib/person.rb +131 -0
- data/lib/relaton_bib/series.rb +96 -0
- data/lib/relaton_bib/typed_title_string.rb +41 -0
- data/lib/relaton_bib/typed_uri.rb +20 -0
- data/lib/relaton_bib/validity.rb +31 -0
- data/lib/relaton_bib/version.rb +3 -0
- data/lib/relaton_bib/xml_parser.rb +289 -0
- data/relaton-bib.gemspec +34 -0
- metadata +192 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
module RelatonBib
|
2
|
+
class Medium
|
3
|
+
# @return [String, NilClass]
|
4
|
+
attr_reader :form, :size, :scale
|
5
|
+
|
6
|
+
# @param form [String, NilClass]
|
7
|
+
# @param size [String, NilClass]
|
8
|
+
# @param scale [String, NilClass]
|
9
|
+
def initialize(form: nil, size: nil, scale: nil)
|
10
|
+
@form = form
|
11
|
+
@size = size
|
12
|
+
@scale = scale
|
13
|
+
end
|
14
|
+
|
15
|
+
# @param builder [Nokogiri::XML::Builder]
|
16
|
+
def to_xml(builder)
|
17
|
+
builder.medium do
|
18
|
+
builder.form form if form
|
19
|
+
builder.size size if size
|
20
|
+
builder.scale scale if scale
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "relaton_bib/contributor"
|
4
|
+
|
5
|
+
module RelatonBib
|
6
|
+
# module OrgIdentifierType
|
7
|
+
# ORCID = 'orcid'
|
8
|
+
# URI = 'uri'
|
9
|
+
# end
|
10
|
+
|
11
|
+
# Organization identifier.
|
12
|
+
class OrgIdentifier
|
13
|
+
ORCID = "orcid"
|
14
|
+
URI = "uri"
|
15
|
+
|
16
|
+
# @return [String]
|
17
|
+
attr_reader :type
|
18
|
+
|
19
|
+
# @return [String]
|
20
|
+
attr_reader :value
|
21
|
+
|
22
|
+
# @param type [String] "orcid" or "uri"
|
23
|
+
# @param value [String]
|
24
|
+
def initialize(type, value)
|
25
|
+
unless [ORCID, URI].include? type
|
26
|
+
raise ArgumentError, 'Invalid type. It should be "orsid" or "uri".'
|
27
|
+
end
|
28
|
+
|
29
|
+
@type = type
|
30
|
+
@value = value
|
31
|
+
end
|
32
|
+
|
33
|
+
# @param builder [Nokogiri::XML::Builder]
|
34
|
+
def to_xml(builder)
|
35
|
+
builder.identifier(value, type: type)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Organization.
|
40
|
+
class Organization < Contributor
|
41
|
+
# @return [RelatonBib::LocalizedString]
|
42
|
+
attr_reader :name
|
43
|
+
|
44
|
+
# @return [RelatonBib::LocalizedString]
|
45
|
+
attr_reader :abbreviation
|
46
|
+
|
47
|
+
# @return [RelatonBib::LocalizedString]
|
48
|
+
attr_reader :subdivision
|
49
|
+
|
50
|
+
# @return [Array<RelatonBib::OrgIdentifier>]
|
51
|
+
attr_reader :identifiers
|
52
|
+
|
53
|
+
def hash2locstr(name)
|
54
|
+
name.is_a?(Hash) ? LocalizedString.new(name[:content], name[:language], name[:script]) : LocalizedString.new(name)
|
55
|
+
end
|
56
|
+
|
57
|
+
# @param name [String, Array<String>]
|
58
|
+
# @param abbreviation [RelatoBib::LocalizedStrig, String]
|
59
|
+
# @param subdivision [RelatoBib::LocalizedStrig, String]
|
60
|
+
# @param url [String]
|
61
|
+
# @param identifiers [Array<RelatonBib::OrgIdentifier>]
|
62
|
+
# @param contacts [Array<RelatonBib::Address, RelatonBib::Phone>]
|
63
|
+
def initialize(**args)
|
64
|
+
raise ArgumentError, "missing keyword: name" unless args[:name]
|
65
|
+
|
66
|
+
super(url: args[:url], contacts: args.fetch(:contacts, []))
|
67
|
+
|
68
|
+
@name = if args[:name].is_a?(Array)
|
69
|
+
args[:name].map { |n| hash2locstr(n) }
|
70
|
+
else
|
71
|
+
[hash2locstr(args[:name])]
|
72
|
+
end
|
73
|
+
|
74
|
+
@abbreviation = if args[:abbreviation].is_a?(String)
|
75
|
+
LocalizedString.new(args[:abbreviation])
|
76
|
+
else
|
77
|
+
args[:abbreviation]
|
78
|
+
end
|
79
|
+
|
80
|
+
@subdivision = if args[:subdivision].is_a?(String)
|
81
|
+
LocalizedString.new(args[:subdivision])
|
82
|
+
else
|
83
|
+
args[:subdivision]
|
84
|
+
end
|
85
|
+
|
86
|
+
@identifiers = args.fetch(:identifiers, [])
|
87
|
+
end
|
88
|
+
|
89
|
+
# @param builder [Nokogiri::XML::Builder]
|
90
|
+
def to_xml(builder)
|
91
|
+
builder.organization do
|
92
|
+
name.each do |n|
|
93
|
+
builder.name { |b| n.to_xml b }
|
94
|
+
end
|
95
|
+
builder.subdivision { |s| subdivision.to_xml s } if subdivision
|
96
|
+
builder.abbreviation { |a| abbreviation.to_xml a } if abbreviation
|
97
|
+
builder.uri url if uri
|
98
|
+
identifiers.each { |identifier| identifier.to_xml builder }
|
99
|
+
super
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "relaton_bib/contributor"
|
4
|
+
|
5
|
+
module RelatonBib
|
6
|
+
# Person's full name
|
7
|
+
class FullName
|
8
|
+
# @return [Array<RelatonBib::LocalizedString>]
|
9
|
+
attr_accessor :forenames
|
10
|
+
|
11
|
+
# @return [Array<RelatonBib::LocalizedString>]
|
12
|
+
attr_accessor :initials
|
13
|
+
|
14
|
+
# @return [RelatonBib::LocalizedString]
|
15
|
+
attr_accessor :surname
|
16
|
+
|
17
|
+
# @return [Array<RelatonBib::LocalizedString>]
|
18
|
+
attr_accessor :additions
|
19
|
+
|
20
|
+
# @return [Array<RelatonBib::LocalizedString>]
|
21
|
+
attr_accessor :prefix
|
22
|
+
|
23
|
+
# @return [RelatonBib::LocalizedString]
|
24
|
+
attr_reader :completename
|
25
|
+
|
26
|
+
# @param surname [RelatonBib::LocalizedString]
|
27
|
+
# @param forenames [Array<RelatonBib::LocalizedString>]
|
28
|
+
# @param initials [Array<RelatonBib::LocalizedString>]
|
29
|
+
# @param additions [Array<RelatonBib::LocalizedString>]
|
30
|
+
# @param prefix [Array<RelatonBib::LocalizedString>]
|
31
|
+
# @param completename [RelatonBib::LocalizedString]
|
32
|
+
def initialize(**args)
|
33
|
+
unless args[:surname] || args[:completename]
|
34
|
+
raise ArgumentError, "Should be given :surname or :completename"
|
35
|
+
end
|
36
|
+
|
37
|
+
@surname = args[:surname]
|
38
|
+
@forenames = args.fetch :forenames, []
|
39
|
+
@initials = args.fetch :initials, []
|
40
|
+
@additions = args.fetch :additions, []
|
41
|
+
@prefix = args.fetch :prefix, []
|
42
|
+
@completename = args[:completename]
|
43
|
+
end
|
44
|
+
|
45
|
+
# @param builder [Nokogiri::XML::Builder]
|
46
|
+
def to_xml(builder)
|
47
|
+
builder.name do
|
48
|
+
if completename
|
49
|
+
builder.completename { completename.to_xml builder }
|
50
|
+
else
|
51
|
+
prefix.each { |p| builder.prefix { p.to_xml builder } }
|
52
|
+
initials.each { |i| builder.initial { i.to_xml builder } }
|
53
|
+
additions.each { |a| builder.addition { a.to_xml builder } }
|
54
|
+
builder.surname { surname.to_xml builder }
|
55
|
+
forenames.each { |f| builder.forename { f.to_xml builder } }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Person identifier type.
|
62
|
+
module PersonIdentifierType
|
63
|
+
ISNI = "isni"
|
64
|
+
URI = "uri"
|
65
|
+
|
66
|
+
# Checks type.
|
67
|
+
# @param type [String]
|
68
|
+
# @raise [ArgumentError] if type isn't "isni" or "uri"
|
69
|
+
def self.check(type)
|
70
|
+
unless [ISNI, URI].include? type
|
71
|
+
raise ArgumentError, 'Invalid type. It should be "isni" or "uri".'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Person identifier.
|
77
|
+
class PersonIdentifier
|
78
|
+
# @return [RelatonBib::PersonIdentifierType::ISNI, RelatonBib::PersonIdentifierType::URI]
|
79
|
+
attr_accessor :type
|
80
|
+
|
81
|
+
# @return [String]
|
82
|
+
attr_accessor :value
|
83
|
+
|
84
|
+
# @param type [RelatonBib::PersonIdentifierType::ISNI, RelatonBib::PersonIdentifierType::URI]
|
85
|
+
# @param value [String]
|
86
|
+
def initialize(type, value)
|
87
|
+
PersonIdentifierType.check type
|
88
|
+
|
89
|
+
@type = type
|
90
|
+
@value = value
|
91
|
+
end
|
92
|
+
|
93
|
+
# @param builser [Nokogiri::XML::Builder]
|
94
|
+
def to_xml(builder)
|
95
|
+
builder.identifier value, type: type
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Person class.
|
100
|
+
class Person < Contributor
|
101
|
+
# @return [RelatonBib::FullName]
|
102
|
+
attr_accessor :name
|
103
|
+
|
104
|
+
# @return [Array<RelatonBib::Affilation>]
|
105
|
+
attr_accessor :affiliation
|
106
|
+
|
107
|
+
# @return [Array<RelatonBib::PersonIdentifier>]
|
108
|
+
attr_accessor :identifiers
|
109
|
+
|
110
|
+
# @param name [RelatonBib::FullName]
|
111
|
+
# @param affiliation [Array<RelatonBib::Affiliation>]
|
112
|
+
# @param contacts [Array<RelatonBib::Address, RelatonBib::Phone>]
|
113
|
+
# @param identifiers [Array<RelatonBib::PersonIdentifier>]
|
114
|
+
def initialize(name:, affiliation: [], contacts: [], identifiers: [])
|
115
|
+
super(contacts: contacts)
|
116
|
+
@name = name
|
117
|
+
@affiliation = affiliation
|
118
|
+
@identifiers = identifiers
|
119
|
+
end
|
120
|
+
|
121
|
+
# @param builder [Nokogiri::XML::Builder]
|
122
|
+
def to_xml(builder)
|
123
|
+
builder.person do
|
124
|
+
name.to_xml builder
|
125
|
+
affiliation.each { |a| a.to_xml builder }
|
126
|
+
identifiers.each { |id| id.to_xml builder }
|
127
|
+
contacts.each { |contact| contact.to_xml builder }
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RelatonBib
|
4
|
+
#
|
5
|
+
# Series class.
|
6
|
+
#
|
7
|
+
class Series
|
8
|
+
TYPES = %w[main alt].freeze
|
9
|
+
|
10
|
+
# @return [String, NilClass] allowed values: "main" or "alt"
|
11
|
+
attr_reader :type
|
12
|
+
|
13
|
+
# @return [RelatonBib::FormattedRef, NilClass]
|
14
|
+
attr_reader :formattedref
|
15
|
+
|
16
|
+
# @return [RelatonBib::FormattedString, NilClass] title
|
17
|
+
attr_reader :title
|
18
|
+
|
19
|
+
# @return [String, NilClass]
|
20
|
+
attr_reader :place
|
21
|
+
|
22
|
+
# @return [String, NilClass]
|
23
|
+
attr_reader :organization
|
24
|
+
|
25
|
+
# @return [RelatonBib::LocalizedString, NilClass]
|
26
|
+
attr_reader :abbreviation
|
27
|
+
|
28
|
+
# @return [String, NilClass] date or year
|
29
|
+
attr_reader :from
|
30
|
+
|
31
|
+
# @return [String, NilClass] date or year
|
32
|
+
attr_reader :to
|
33
|
+
|
34
|
+
# @return [String, NilClass]
|
35
|
+
attr_reader :number
|
36
|
+
|
37
|
+
# @return [String, NilClass]
|
38
|
+
attr_reader :partnumber
|
39
|
+
|
40
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
41
|
+
|
42
|
+
# @param type [String, NilClass] title or formattedref argument should be passed
|
43
|
+
# @param formattedref [RelatonBib::FormattedRef, NilClass]
|
44
|
+
# @param title [RelatonBib::TypedTitleString, NilClass]
|
45
|
+
# @param place [String, NilClass]
|
46
|
+
# @param orgaization [String, NilClass]
|
47
|
+
# @param abbreviation [RelatonBib::LocalizedString, NilClass]
|
48
|
+
# @param from [String, NilClass]
|
49
|
+
# @param to [String, NilClass]
|
50
|
+
# @param number [String, NilClass]
|
51
|
+
# @param partnumber [String, NilClass]
|
52
|
+
def initialize(**args)
|
53
|
+
unless args[:title].is_a?(RelatonBib::TypedTitleString) || args[:formattedref]
|
54
|
+
raise ArgumentError, "argument `title` or `formattedref` should present"
|
55
|
+
end
|
56
|
+
|
57
|
+
if args[:type] && !TYPES.include?(args[:type])
|
58
|
+
raise ArgumentError, "invalid argument `type`"
|
59
|
+
end
|
60
|
+
|
61
|
+
@type = args[:type] # if %w[main alt].include? args[:type]
|
62
|
+
@title = args[:title]
|
63
|
+
@formattedref = args[:formattedref]
|
64
|
+
@place = args[:place]
|
65
|
+
@organization = args[:organization]
|
66
|
+
@abbreviation = args[:abbreviation]
|
67
|
+
@from = args[:from]
|
68
|
+
@to = args[:to]
|
69
|
+
@number = args[:number]
|
70
|
+
@partnumber = args[:partnumber]
|
71
|
+
end
|
72
|
+
# rubocop:enable Metrics/MethodLength
|
73
|
+
|
74
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
75
|
+
|
76
|
+
# @param builder [Nokogiri::XML::Builder]
|
77
|
+
def to_xml(builder)
|
78
|
+
builder.series type: type do
|
79
|
+
if formattedref
|
80
|
+
formattedref.to_xml builder
|
81
|
+
else
|
82
|
+
builder.title { title.to_xml builder }
|
83
|
+
builder.place place if place
|
84
|
+
builder.organization organization if organization
|
85
|
+
builder.abbreviation { abbreviation.to_xml builder } if abbreviation
|
86
|
+
builder.from from if from
|
87
|
+
builder.to to if to
|
88
|
+
builder.number number if number
|
89
|
+
builder.partnumber partnumber if partnumber
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
94
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module RelatonBib
|
2
|
+
class TypedTitleString
|
3
|
+
TITLE_TYPES = %w[alternative original unofficial subtitle main].freeze
|
4
|
+
|
5
|
+
# @return [String]
|
6
|
+
attr_reader :type
|
7
|
+
|
8
|
+
# @return [RelatonBib::FormattedString]
|
9
|
+
attr_reader :title
|
10
|
+
|
11
|
+
# @param type [String]
|
12
|
+
# @param title [RelatonBib::FormattedString, Hash]
|
13
|
+
# @param content [String]
|
14
|
+
# @param language [String]
|
15
|
+
# @param script [String]
|
16
|
+
def initialize(**args)
|
17
|
+
if args[:type] && !TITLE_TYPES.include?(args[:type])
|
18
|
+
raise ArgumentError, %{The type #{args[:type]} is invalid.}
|
19
|
+
end
|
20
|
+
|
21
|
+
unless args[:title] || args[:content]
|
22
|
+
raise ArgumentError, %{Keyword "title" or "content" should be passed.}
|
23
|
+
end
|
24
|
+
|
25
|
+
@type = args[:type]
|
26
|
+
|
27
|
+
# if args[:title]
|
28
|
+
# @title = args[:title]
|
29
|
+
# else
|
30
|
+
fsargs = args.select { |k, _v| %i[content language script format].include? k }
|
31
|
+
@title = args.fetch :title, FormattedString.new(fsargs)
|
32
|
+
# end
|
33
|
+
end
|
34
|
+
|
35
|
+
# @param builder [Nokogiri::XML::Builder]
|
36
|
+
def to_xml(builder)
|
37
|
+
builder.parent[:type] = type if type
|
38
|
+
title.to_xml builder
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module RelatonBib
|
2
|
+
# Typed URI
|
3
|
+
class TypedUri
|
4
|
+
# @return [Symbol] :src/:obp/:rss
|
5
|
+
attr_reader :type
|
6
|
+
# @retutn [URI]
|
7
|
+
attr_reader :content
|
8
|
+
|
9
|
+
# @param type [String] src/obp/rss
|
10
|
+
# @param content [String]
|
11
|
+
def initialize(type:, content:)
|
12
|
+
@type = type
|
13
|
+
@content = URI content if content
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_xml(builder)
|
17
|
+
builder.uri(content.to_s, type: type)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module RelatonBib
|
2
|
+
class Validity
|
3
|
+
# @return [Time, NilClass]
|
4
|
+
attr_reader :begins
|
5
|
+
|
6
|
+
# @return [Time, NilClass]
|
7
|
+
attr_reader :ends
|
8
|
+
|
9
|
+
# @return [Time, NilClass]
|
10
|
+
attr_reader :revision
|
11
|
+
|
12
|
+
# @param begins [Time, NilClass]
|
13
|
+
# @param ends [Time, NilClass]
|
14
|
+
# @param revision [Time, NilClass]
|
15
|
+
def initialize(begins: nil, ends: nil, revision: nil)
|
16
|
+
@begins = begins
|
17
|
+
@ends = ends
|
18
|
+
@revision = revision
|
19
|
+
end
|
20
|
+
|
21
|
+
# @param [Nokogiri::XML::Builder]
|
22
|
+
def to_xml(builder)
|
23
|
+
format = "%Y-%m-%d %H:%M"
|
24
|
+
builder.validity do
|
25
|
+
builder.validityBegins begins.strftime(format) if begins
|
26
|
+
builder.validityEnds ends.strftime(format) if ends
|
27
|
+
builder.validityRevision revision.strftime(format) if revision
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|