iso-bib-item 0.3.1 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ac47530f7bb6fa50858b2b0b013864059215c1766a86fcb9691ed2065ed7f0f
4
- data.tar.gz: c93b38d67f60d01897b4a8393009f62b2c18fe3aa53d3aa464a8b37ec1b2aa8c
3
+ metadata.gz: c1a1bd9ee86b20e2f62362a7d3a32a3d652d37a940faf0b84a72a0a33154f7f0
4
+ data.tar.gz: 3b4368c16c6d0339a4fb248a4b625adf4a4480f4a0d9b2d127f4e097e9a9259e
5
5
  SHA512:
6
- metadata.gz: ae4298fbec9d77cde74109953eba1f7208234eb507cd2ca1f1383965386553513b498961cf6d57d2632537507b67ccd0bade9bb0127e71044f8f595c2c9b6170
7
- data.tar.gz: 7734059bb6fc9e4caed7108fca5a2ff6caa60f7c525278c6c4286f5c8f05d36e5c95d42f8e9510680f524497885e5c9c6702735c75b55ba3cad3ff9a942693fd
6
+ metadata.gz: bf24100c5bb263e037001e48cce1d93a5125b794f92738ee3c1b6dfb4422cd3af042dd5d6cf2982c222cc8384ff9547cc06dc5fe78748117905cb3be72940501
7
+ data.tar.gz: 78f2b6faa51d28559b2043bde2e64c47f92487e9b2d1f486218b73258bf0541a844ac82d382e7a6aac725b13502e1fd478de6459bbcf2d5f7edc61a2c6a64cf8
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- iso-bib-item (0.3.0)
4
+ iso-bib-item (0.4.0)
5
5
  isoics (~> 0.1.6)
6
6
  nokogiri (~> 1.8.4)
7
7
  ruby_deep_clone (~> 0.8.0)
@@ -19,7 +19,7 @@ GEM
19
19
  json (2.1.0)
20
20
  method_source (0.9.0)
21
21
  mini_portile2 (2.3.0)
22
- nokogiri (1.8.4)
22
+ nokogiri (1.8.5)
23
23
  mini_portile2 (~> 2.3.0)
24
24
  pry (0.11.3)
25
25
  coderay (~> 1.1.0)
@@ -34,7 +34,7 @@ GEM
34
34
  rspec-mocks (~> 3.8.0)
35
35
  rspec-core (3.8.0)
36
36
  rspec-support (~> 3.8.0)
37
- rspec-expectations (3.8.1)
37
+ rspec-expectations (3.8.2)
38
38
  diff-lcs (>= 1.2.0, < 2.0)
39
39
  rspec-support (~> 3.8.0)
40
40
  rspec-mocks (3.8.0)
@@ -61,4 +61,4 @@ DEPENDENCIES
61
61
  simplecov
62
62
 
63
63
  BUNDLED WITH
64
- 1.16.2
64
+ 1.16.6
@@ -133,7 +133,7 @@ module IsoBibItem
133
133
  attr_reader :formatted_ref
134
134
 
135
135
  # @!attribute [r] abstract
136
- # @return [Arra<IsoBibItem::FormattedString>]
136
+ # @return [Array<IsoBibItem::FormattedString>]
137
137
 
138
138
  # @return [IsoBibItem::DocumentStatus]
139
139
  attr_reader :status
@@ -147,6 +147,9 @@ module IsoBibItem
147
147
  # @return [Array<IsoBibItem::Series>]
148
148
  attr_reader :series
149
149
 
150
+ # @return [Date]
151
+ attr_reader :fetched
152
+
150
153
  # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
151
154
  # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
152
155
 
@@ -163,6 +166,7 @@ module IsoBibItem
163
166
  # script=>String, type=>String}>]
164
167
  # @param relations [Array<Hash{type=>String, identifier=>String}>]
165
168
  # @param series [Array<IsoBibItem::Series>]
169
+ # @param fetched [Date] default today
166
170
  def initialize(**args)
167
171
  @id = args[:id]
168
172
  @title = (args[:titles] || []).map { |t| FormattedString.new t }
@@ -187,6 +191,7 @@ module IsoBibItem
187
191
  @relations = DocRelationCollection.new(args[:relations] || [])
188
192
  @link = args[:link].map { |s| s.is_a?(Hash) ? TypedUri.new(s) : s }
189
193
  @series = args[:series]
194
+ @fetched = args.fetch :fetched, Date.today
190
195
  end
191
196
  # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
192
197
  # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
@@ -207,6 +212,7 @@ module IsoBibItem
207
212
  def to_xml
208
213
  Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
209
214
  xml.bibitem(id: id) do
215
+ xml.fetched fetched
210
216
  title.each { |t| xml.title { t.to_xml xml } }
211
217
  link.each { |s| s.to_xml xml }
212
218
  docidentifier.each { |di| di.to_xml xml }
@@ -8,7 +8,7 @@ require 'iso_bib_item/iso_document_status'
8
8
  require 'iso_bib_item/iso_localized_title'
9
9
  require 'iso_bib_item/iso_project_group'
10
10
  require 'iso_bib_item/document_relation_collection'
11
- require 'iso_bib_item/from_xml'
11
+ require 'iso_bib_item/xml_parser'
12
12
 
13
13
  # Add filter method to Array.
14
14
  class Array
@@ -23,13 +23,13 @@ module IsoBibItem
23
23
  # @return [Integer]
24
24
  attr_reader :tc_document_number
25
25
 
26
- # @return [Integer]
26
+ # @return [String]
27
27
  attr_reader :project_number
28
28
 
29
- # @return [Integer]
29
+ # @return [String]
30
30
  attr_reader :part_number
31
31
 
32
- # @return [Integer]
32
+ # @return [String]
33
33
  attr_reader :subpart_number
34
34
 
35
35
  # @return [String]
@@ -41,19 +41,19 @@ module IsoBibItem
41
41
  # @return [String]
42
42
  attr_reader :type
43
43
 
44
- # @param project_number [Integer]
45
- # @param part_number [Integer]
46
- # @param subpart_number [Integer]
44
+ # @param project_number [String]
45
+ # @param part_number [String]
46
+ # @param subpart_number [String]
47
47
  # @param prefix [String]
48
48
  # @param id [String]
49
49
  # @param type [String]
50
- def initialize(project_number:, part_number:, subpart_number: nil, prefix:, id:, type: nil)
51
- @project_number = project_number
52
- @part_number = part_number
53
- @subpart_number = subpart_number
54
- @prefix = prefix
55
- @type = type
56
- @id = id
50
+ def initialize(**args)
51
+ @project_number = args[:project_number]
52
+ @part_number = args[:part_number]
53
+ @subpart_number = args[:subpart_number]
54
+ @prefix = args[:prefix]
55
+ @type = args[:type]
56
+ @id = args[:id]
57
57
  end
58
58
 
59
59
  # in docid manipulations, assume ISO as the default: id-part:year
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module IsoBibItem
4
- VERSION = '0.3.1'.freeze
4
+ VERSION = '0.4.0'.freeze
5
5
  end
@@ -0,0 +1,196 @@
1
+ require 'nokogiri'
2
+
3
+ module IsoBibItem
4
+ class XMLParser
5
+ class << self
6
+ def from_xml(xml)
7
+ doc = Nokogiri::XML(xml)
8
+ IsoBibliographicItem.new(
9
+ docid: fetch_docid(doc),
10
+ edition: doc.at('/bibitem/edition')&.text,
11
+ language: doc.xpath('/bibitem/language').map(&:text),
12
+ script: doc.xpath('/bibitem/script').map(&:text),
13
+ titles: fetch_titles(doc),
14
+ type: doc.at('bibitem')&.attr(:type),
15
+ docstatus: fetch_status(doc),
16
+ ics: fetch_ics(doc),
17
+ dates: fetch_dates(doc),
18
+ contributors: fetch_contributors(doc),
19
+ workgroup: fetch_workgroup(doc),
20
+ abstract: fetch_abstract(doc),
21
+ copyright: fetch_copyright(doc),
22
+ link: fetch_link(doc),
23
+ relations: fetch_relations(doc)
24
+ )
25
+ end
26
+
27
+ private
28
+
29
+ def get_id(did)
30
+ did.text.match(/^(?<project>.*?\d+)(?<hyphen>-)?(?(<hyphen>)(?<part>\d*))/)
31
+ end
32
+
33
+ def fetch_docid(doc)
34
+ ret = []
35
+ doc.xpath("/bibitem/docidentifier").each do |did|
36
+ #did = doc.at('/bibitem/docidentifier')
37
+ type = did.at("./@type")
38
+ if did.text == "IEV" then ret << IsoBibItem::IsoDocumentId.new(project_number: "IEV", part_number: nil, prefix: nil)
39
+ else
40
+ id = get_id did
41
+ ret << IsoBibItem::IsoDocumentId.new(project_number: id.nil? ? did.text : id[:project],
42
+ part_number: id.nil? ? nil : id[:part],
43
+ prefix: nil,
44
+ id: did.text,
45
+ type: type&.text)
46
+ end
47
+ end
48
+ ret
49
+ end
50
+
51
+ def fetch_titles(doc)
52
+ doc.xpath('/bibitem/title').map do |t|
53
+ titl = t.text.split ' -- '
54
+ case titl.size
55
+ when 0
56
+ intro, main, part = nil, "", nil
57
+ when 1
58
+ intro, main, part = nil, titl[0], nil
59
+ when 2
60
+ if /^(Part|Partie) \d+:/.match? titl[1]
61
+ intro, main, part = nil, titl[0], titl[1]
62
+ else
63
+ intro, main, part = titl[0], titl[1], nil
64
+ end
65
+ when 3
66
+ intro, main, part = titl[0], titl[1], titl[2]
67
+ else
68
+ intro, main, part = titl[0], titl[1], titl[2..-1]&.join(" -- ")
69
+ end
70
+ IsoLocalizedTitle.new(title_intro: intro, title_main: main,
71
+ title_part: part, language: t[:language],
72
+ script: t[:script])
73
+ end
74
+ end
75
+
76
+ def fetch_status(doc)
77
+ status = doc.at('/bibitem/status')
78
+ stage = status&.at('stage')&.text
79
+ substage = status&.at('substage')&.text
80
+ iteration = status&.at('iterarion')&.text&.to_i
81
+ IsoDocumentStatus.new(status: status&.text, stage: stage,
82
+ substage: substage, iteration: iteration)
83
+ end
84
+
85
+ def fetch_ics(doc)
86
+ doc.xpath('/bibitem/ics/code').map { |ics| Ics.new ics.text }
87
+ end
88
+
89
+ def fetch_dates(doc)
90
+ doc.xpath('/bibitem/date').map do |d|
91
+ BibliographicDate.new(type: d[:type], on: d.at('on')&.text,
92
+ from: d.at('from')&.text,
93
+ to: d.at('to')&.text)
94
+ end
95
+ end
96
+
97
+ def get_org(org)
98
+ names = org.xpath('name').map do |n|
99
+ { content: n.text, language: n[:language], script: n[:script] }
100
+ end
101
+ IsoBibItem::Organization.new(name: names,
102
+ abbreviation: org.at('abbreviation')&.text,
103
+ url: org.at('uri')&.text)
104
+ end
105
+
106
+ def get_person(person)
107
+ name = person.at './name/completename'
108
+ affilations = person.xpath('./affiliation').map do |a|
109
+ org = a.at './organization'
110
+ IsoBibItem::Affilation.new get_org(org)
111
+ end
112
+ contacts = person.xpath('./contact').map do |c|
113
+ if (addr = c.at './address')
114
+ streets = addr.xpath('./street').map(&:text)
115
+ IsoBibItem::Address.new(
116
+ street: streets,
117
+ city: addr.at('./city').text,
118
+ state: addr.at('./state').text,
119
+ country: addr.at('./country').text,
120
+ postcode: addr.at('./postcode').text
121
+ )
122
+ else
123
+ contact = c.child
124
+ IsoBibItem::Contact.new(type: contact[:name], value: contact.text)
125
+ end
126
+ end
127
+ completename = IsoBibItem::LocalizedString.new(name.text, name[:language])
128
+ IsoBibItem::Person.new(
129
+ name: IsoBibItem::FullName.new(completename: completename),
130
+ affiliation: affilations,
131
+ contacts: contacts
132
+ )
133
+ end
134
+
135
+ def fetch_contributors(doc)
136
+ doc.xpath('/bibitem/contributor').map do |c|
137
+ entity = if (org = c.at './organization') then get_org(org)
138
+ elsif (person = c.at './person') then get_person(person)
139
+ end
140
+ IsoBibItem::ContributionInfo.new entity: entity, role: [c.at('role')[:type]]
141
+ end
142
+ end
143
+
144
+ # @TODO Organization doesn't recreated
145
+ def fetch_workgroup(doc)
146
+ eg = doc.at('/bibitem/editorialgroup')
147
+ tc = eg&.at('technical_committee')
148
+ sc = eg&.at('subcommittee')
149
+ scom = iso_subgroup(sc)
150
+ wg = eg&.at('workgroup')
151
+ wgrp = iso_subgroup(wg)
152
+ IsoProjectGroup.new(technical_committee: iso_subgroup(tc),
153
+ subcommittee: scom, workgroup: wgrp)
154
+ end
155
+
156
+ def iso_subgroup(com)
157
+ return nil if com.nil?
158
+ IsoSubgroup.new(name: com.text, type: com[:type],
159
+ number: com[:number].to_i)
160
+ end
161
+
162
+ def fetch_abstract(doc)
163
+ doc.xpath('/bibitem/abstract').map do |a|
164
+ FormattedString.new(content: a.text, language: a[:language],
165
+ script: a[:script], type: a[:format])
166
+ end
167
+ end
168
+
169
+ def fetch_copyright(doc)
170
+ cp = doc.at('/bibitem/copyright') || return
171
+ org = cp&.at('owner/organization')
172
+ name = org&.at('name').text
173
+ abbr = org&.at('abbreviation')&.text
174
+ url = org&.at('uri')&.text
175
+ entity = Organization.new(name: name, abbreviation: abbr, url: url)
176
+ from = cp.at('from')&.text
177
+ to = cp.at('to')&.text
178
+ owner = ContributionInfo.new entity: entity
179
+ CopyrightAssociation.new(owner: owner, from: from, to: to)
180
+ end
181
+
182
+ def fetch_link(doc)
183
+ doc.xpath('/bibitem/uri').map do |l|
184
+ TypedUri.new type: l[:type], content: l.text
185
+ end
186
+ end
187
+
188
+ def fetch_relations(doc)
189
+ doc.xpath('/bibitem/relation').map do |r|
190
+ DocumentRelation.new(type: r[:type],
191
+ identifier: r.at('bibitem/formattedref').text)
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iso-bib-item
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-19 00:00:00.000000000 Z
11
+ date: 2018-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -163,7 +163,6 @@ files:
163
163
  - lib/iso_bib_item/document_relation_collection.rb
164
164
  - lib/iso_bib_item/document_status.rb
165
165
  - lib/iso_bib_item/formatted_string.rb
166
- - lib/iso_bib_item/from_xml.rb
167
166
  - lib/iso_bib_item/iso_bibliographic_item.rb
168
167
  - lib/iso_bib_item/iso_document_status.rb
169
168
  - lib/iso_bib_item/iso_localized_title.rb
@@ -173,6 +172,7 @@ files:
173
172
  - lib/iso_bib_item/person.rb
174
173
  - lib/iso_bib_item/series.rb
175
174
  - lib/iso_bib_item/version.rb
175
+ - lib/iso_bib_item/xml_parser.rb
176
176
  homepage: https://github.com/riboseinc/gdbib
177
177
  licenses:
178
178
  - BSD-2-Clause
@@ -1,154 +0,0 @@
1
- require 'nokogiri'
2
-
3
- module IsoBibItem
4
- class << self
5
- def from_xml(xml)
6
- doc = Nokogiri::XML(xml)
7
- IsoBibliographicItem.new(
8
- docid: fetch_docid(doc),
9
- edition: doc.at('/bibitem/edition')&.text,
10
- language: doc.xpath('/bibitem/language').map(&:text),
11
- script: doc.xpath('/bibitem/script').map(&:text),
12
- titles: fetch_titles(doc),
13
- type: doc.at('bibitem')&.attr(:type),
14
- docstatus: fetch_status(doc),
15
- ics: fetch_ics(doc),
16
- dates: fetch_dates(doc),
17
- contributors: fetch_contributors(doc),
18
- workgroup: fetch_workgroup(doc),
19
- abstract: fetch_abstract(doc),
20
- copyright: fetch_copyright(doc),
21
- link: fetch_link(doc),
22
- relations: fetch_relations(doc)
23
- )
24
- end
25
-
26
- private
27
-
28
- def fetch_docid(doc)
29
- ret = []
30
- doc.xpath("/bibitem/docidentifier").each do |did|
31
- #did = doc.at('/bibitem/docidentifier')
32
- type = did.at("./@type")
33
- if did.text == "IEV" then ret << IsoBibItem::IsoDocumentId.new(project_number: "IEV", part_number: nil, prefix: nil)
34
- else
35
- id = did.text.match(/^(?<project>.*\d+)(?<hyphen>-)?(?(<hyphen>)(?<part>\d*))(-(?<subpart>\d+))?$/)
36
- ret << IsoBibItem::IsoDocumentId.new(project_number: id.nil? ? did.text : id[:project],
37
- part_number: id.nil? ? nil : id[:part],
38
- subpart_number: id.nil? ? nil : id[:subpart],
39
- prefix: nil,
40
- id: did.text,
41
- type: type&.text)
42
- end
43
- end
44
- ret
45
- end
46
-
47
- def fetch_titles(doc)
48
- doc.xpath('/bibitem/title').map do |t|
49
- titl = t.text.split ' -- '
50
- case titl.size
51
- when 0
52
- intro, main, part = nil, "", nil
53
- when 1
54
- intro, main, part = nil, titl[0], nil
55
- when 2
56
- if /^(Part|Partie) \d+:/.match? titl[1]
57
- intro, main, part = nil, titl[0], titl[1]
58
- else
59
- intro, main, part = titl[0], titl[1], nil
60
- end
61
- when 3
62
- intro, main, part = titl[0], titl[1], titl[2]
63
- else
64
- intro, main, part = titl[0], titl[1], titl[2..-1]&.join(" -- ")
65
- end
66
- IsoLocalizedTitle.new(title_intro: intro, title_main: main,
67
- title_part: part, language: t[:language],
68
- script: t[:script])
69
- end
70
- end
71
-
72
- def fetch_status(doc)
73
- status = doc.at('/bibitem/status')
74
- stage = status&.at('stage')&.text
75
- substage = status&.at('substage')&.text
76
- iteration = status&.at('iterarion')&.text&.to_i
77
- IsoDocumentStatus.new(status: status&.text, stage: stage,
78
- substage: substage, iteration: iteration)
79
- end
80
-
81
- def fetch_ics(doc)
82
- doc.xpath('/bibitem/ics/code').map { |ics| Ics.new ics.text }
83
- end
84
-
85
- def fetch_dates(doc)
86
- doc.xpath('/bibitem/date').map do |d|
87
- BibliographicDate.new(type: d[:type], on: d.at('on')&.text,
88
- from: d.at('from')&.text,
89
- to: d.at('to')&.text)
90
- end
91
- end
92
-
93
- def fetch_contributors(doc)
94
- doc.xpath('/bibitem/contributor').map do |c|
95
- o = c.at 'organization'
96
- org = Organization.new(name: o.at('name')&.text,
97
- abbreviation: o.at('abbreviation')&.text,
98
- url: o.at('uri')&.text)
99
- ContributionInfo.new entity: org, role: [c.at('role')[:type]]
100
- end
101
- end
102
-
103
- # @TODO Organization doesn't recreated
104
- def fetch_workgroup(doc)
105
- eg = doc.at('/bibitem/editorialgroup')
106
- tc = eg&.at('technical_committee')
107
- sc = eg&.at('subcommittee')
108
- scom = iso_subgroup(sc)
109
- wg = eg&.at('workgroup')
110
- wgrp = iso_subgroup(wg)
111
- IsoProjectGroup.new(technical_committee: iso_subgroup(tc),
112
- subcommittee: scom, workgroup: wgrp)
113
- end
114
-
115
- def iso_subgroup(com)
116
- return nil if com.nil?
117
- IsoSubgroup.new(name: com.text, type: com[:type],
118
- number: com[:number].to_i)
119
- end
120
-
121
- def fetch_abstract(doc)
122
- doc.xpath('/bibitem/abstract').map do |a|
123
- FormattedString.new(content: a.text, language: a[:language],
124
- script: a[:script], type: a[:format])
125
- end
126
- end
127
-
128
- def fetch_copyright(doc)
129
- cp = doc.at('/bibitem/copyright') || return
130
- org = cp&.at('owner/organization')
131
- name = org&.at('name').text
132
- abbr = org&.at('abbreviation')&.text
133
- url = org&.at('uri')&.text
134
- entity = Organization.new(name: name, abbreviation: abbr, url: url)
135
- from = cp.at('from')&.text
136
- to = cp.at('to')&.text
137
- owner = ContributionInfo.new entity: entity
138
- CopyrightAssociation.new(owner: owner, from: from, to: to)
139
- end
140
-
141
- def fetch_link(doc)
142
- doc.xpath('/bibitem/uri').map do |l|
143
- TypedUri.new type: l[:type], content: l.text
144
- end
145
- end
146
-
147
- def fetch_relations(doc)
148
- doc.xpath('/bibitem/relation').map do |r|
149
- DocumentRelation.new(type: r[:type],
150
- identifier: r.at('bibitem/formattedref').text)
151
- end
152
- end
153
- end
154
- end