relaton-bipm 1.14.1 → 1.14.3

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.
@@ -0,0 +1,176 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RelatonBipm
4
+ module RawdataBipmMetrologia
5
+ class Fetcher
6
+ DIR = "rawdata-bipm-metrologia/data/*content/0026-1394"
7
+
8
+ # @param data_fetcher [RelatonBipm::DataFetcher]
9
+ def self.fetch(data_fetcher)
10
+ new(data_fetcher).fetch
11
+ end
12
+
13
+ # @param data_fetcher [RelatonBipm::DataFetcher]
14
+ def initialize(data_fetcher)
15
+ @data_fetcher = WeakRef.new data_fetcher
16
+ end
17
+
18
+ #
19
+ # Fetch documents from rawdata-bipm-metrologia and save to files
20
+ #
21
+ def fetch
22
+ fetch_metrologia
23
+ fetch_volumes
24
+ fetch_issues
25
+ fetch_articles
26
+ end
27
+
28
+ #
29
+ # Fetch articles from rawdata-bipm-metrologia and save to files
30
+ #
31
+ def fetch_articles # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
32
+ Dir["#{DIR}/**/*.xml"].each do |path|
33
+ doc = Nokogiri::XML File.read(path, encoding: "UTF-8")
34
+ item = ArticleParser.parse doc.at("/article")
35
+ file = "#{item.docidentifier.first.id.downcase.gsub(' ', '-')}.#{@data_fetcher.ext}"
36
+ out_path = File.join(@data_fetcher.output, file)
37
+ @data_fetcher.index[[item.docidentifier.first.id]] = out_path
38
+ @data_fetcher.index_new.add_or_update [item.docidentifier.first.id], out_path
39
+ key = Id.new(item.docidentifier.first.id).normalized_hash
40
+ @data_fetcher.index2.add_or_update key, out_path
41
+ @data_fetcher.write_file out_path, item
42
+ end
43
+ end
44
+
45
+ #
46
+ # Fetch volumes from rawdata-bipm-metrologia and save to files
47
+ #
48
+ def fetch_volumes
49
+ Dir["#{DIR}/*"].map { |path| path.split("/").last }.uniq.each do |volume|
50
+ fetch_metrologia volume
51
+ end
52
+ end
53
+
54
+ #
55
+ # Fetch issues from rawdata-bipm-metrologia and save to files
56
+ #
57
+ def fetch_issues
58
+ Dir["#{DIR}/*/*"].each do |path|
59
+ volume, issue = path.split("/").last(2)
60
+ fetch_metrologia volume, issue
61
+ end
62
+ end
63
+
64
+ #
65
+ # Fetch metrologia root document from rawdata-bipm-metrologia and save to a file
66
+ #
67
+ # @overload set(volume, issue)
68
+ # @param [String] volume volume number
69
+ # @param [String] issue issue number
70
+ # @overload set(volume)
71
+ # @param [String] volume volume number
72
+ #
73
+ def fetch_metrologia(*args) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
74
+ id = identifier(*args)
75
+ item = BipmBibliographicItem.new(
76
+ type: "article", formattedref: formattedref(id), docid: docidentifier(id),
77
+ language: ["en"], script: ["Latn"], relation: relation(*args),
78
+ link: typed_uri(*args)
79
+ )
80
+ file = "#{id.downcase.gsub(' ', '-')}.#{@data_fetcher.ext}"
81
+ path = File.join(@data_fetcher.output, file)
82
+ @data_fetcher.index[[id]] = path
83
+ @data_fetcher.index_new.add_or_update [id], path
84
+ @data_fetcher.index2.add_or_update Id.new(id).normalized_hash, path
85
+ @data_fetcher.write_file path, item
86
+ end
87
+
88
+ #
89
+ # Create formattedref
90
+ #
91
+ # @param [String] id document identifier
92
+ #
93
+ # @return [RelatonBib::FormattedRef] formattedref
94
+ #
95
+ def formattedref(id)
96
+ RelatonBib::FormattedRef.new content: id, language: "en", script: "Latn"
97
+ end
98
+
99
+ #
100
+ # Create docidentifier
101
+ #
102
+ # @param [String] id document identifier
103
+ #
104
+ # @return [Array<RelatonBib::DocumentIdentifier>] docidentifier
105
+ #
106
+ def docidentifier(id)
107
+ [RelatonBib::DocumentIdentifier.new(id: id, type: "BIPM", primary: true)]
108
+ end
109
+
110
+ #
111
+ # Create identifier
112
+ #
113
+ # @overload set(volume, issue, article)
114
+ # @param [String] volume volume number
115
+ # @param [String] issue issue number
116
+ # @param [String] article article number
117
+ # @overload set(volume, issue)
118
+ # @param [String] volume volume number
119
+ # @param [String] issue issue number
120
+ # @overload set(volume)
121
+ # @param [String] volume volume number
122
+ #
123
+ # @return [String] document identifier
124
+ #
125
+ def identifier(*args)
126
+ ["Metrologia", *id_parts(*args)].join(" ")
127
+ end
128
+
129
+ def id_parts(*args)
130
+ args.map { |p| p.match(/[^_]+$/).to_s }
131
+ end
132
+
133
+ #
134
+ # Fetch relations
135
+ #
136
+ # @param (see #fetch_metrologia)
137
+ #
138
+ # @return [Array<RelatonBib::DocumentRelation>] relations
139
+ #
140
+ def relation(*args)
141
+ dir = [DIR, *args].join("/")
142
+ Dir["#{dir}/*"].map do |path|
143
+ part = path.split("/").last
144
+ id = identifier(*args, part)
145
+ RelatonBib::DocumentRelation.new(type: "partOf", bibitem: rel_bibitem(id))
146
+ end
147
+ end
148
+
149
+ #
150
+ # Create relation bibitem
151
+ #
152
+ # @param [String] id document identifier
153
+ #
154
+ # @return [RelatonBipm::BipmBibliographicItem] bibitem
155
+ #
156
+ def rel_bibitem(id)
157
+ BipmBibliographicItem.new(
158
+ formattedref: formattedref(id), docid: docidentifier(id),
159
+ )
160
+ end
161
+
162
+ def typed_uri(*args)
163
+ [RelatonBib::TypedUri.new(type: "src", content: link(*args))]
164
+ end
165
+
166
+ def link(*args)
167
+ params = id_parts(*args).join("/")
168
+ case args.size
169
+ when 0 then "https://iopscience.iop.org/journal/0026-1394"
170
+ when 1 then "https://iopscience.iop.org/volume/0026-1394/#{params}"
171
+ when 2 then "https://iopscience.iop.org/issue/0026-1394/#{params}"
172
+ end
173
+ end
174
+ end
175
+ end
176
+ end
@@ -1,3 +1,3 @@
1
1
  module RelatonBipm
2
- VERSION = "1.14.1".freeze
2
+ VERSION = "1.14.3".freeze
3
3
  end
data/lib/relaton_bipm.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  require "zip"
2
2
  require "fileutils"
3
+ require "parslet"
3
4
  require "relaton_bib"
5
+ require "relaton/index"
6
+ require "relaton_bipm/id_parser"
4
7
  require "relaton_bipm/version"
5
8
  require "relaton_bipm/editorial_group"
6
9
  require "relaton_bipm/committee"
@@ -13,10 +16,11 @@ require "relaton_bipm/bipm_bibliographic_item"
13
16
  require "relaton_bipm/bipm_bibliography"
14
17
  require "relaton_bipm/hash_converter"
15
18
  require "relaton_bipm/xml_parser"
16
- require "relaton_bipm/index"
17
19
  require "relaton_bipm/data_fetcher"
18
20
  require "relaton_bipm/data_outcomes_parser"
19
21
  require "relaton_bipm/bipm_si_brochure_parser"
22
+ require "relaton_bipm/rawdata_bipm_metrologia/fetcher"
23
+ require "relaton_bipm/rawdata_bipm_metrologia/article_parser"
20
24
 
21
25
  module RelatonBipm
22
26
  class Error < StandardError; end
data/relaton_bipm.gemspec CHANGED
@@ -32,17 +32,13 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
32
32
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
33
  spec.require_paths = ["lib"]
34
34
 
35
- spec.add_development_dependency "byebug"
36
35
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
37
- spec.add_development_dependency "pry-byebug"
38
- spec.add_development_dependency "ruby-jing"
39
- spec.add_development_dependency "simplecov"
40
- spec.add_development_dependency "vcr"
41
- spec.add_development_dependency "webmock"
42
36
 
43
37
  spec.add_dependency "faraday", "~> 1.0"
44
38
  spec.add_dependency "mechanize", "~> 2.8.0"
39
+ spec.add_dependency "parslet", "~> 2.0.0"
45
40
  spec.add_dependency "relaton-bib", "~> 1.14.0"
41
+ spec.add_dependency "relaton-index", "~> 0.1.0"
46
42
  spec.add_dependency "rubyzip", "~> 2.3.0"
47
43
  spec.add_dependency "serrano", "~> 1.0"
48
44
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: relaton-bipm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.14.1
4
+ version: 1.14.3
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-12-06 00:00:00.000000000 Z
11
+ date: 2023-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: byebug
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: equivalent-xml
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -39,117 +25,75 @@ dependencies:
39
25
  - !ruby/object:Gem::Version
40
26
  version: '0.6'
41
27
  - !ruby/object:Gem::Dependency
42
- name: pry-byebug
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: ruby-jing
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: simplecov
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: vcr
28
+ name: faraday
85
29
  requirement: !ruby/object:Gem::Requirement
86
30
  requirements:
87
- - - ">="
31
+ - - "~>"
88
32
  - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
33
+ version: '1.0'
34
+ type: :runtime
91
35
  prerelease: false
92
36
  version_requirements: !ruby/object:Gem::Requirement
93
37
  requirements:
94
- - - ">="
38
+ - - "~>"
95
39
  - !ruby/object:Gem::Version
96
- version: '0'
40
+ version: '1.0'
97
41
  - !ruby/object:Gem::Dependency
98
- name: webmock
42
+ name: mechanize
99
43
  requirement: !ruby/object:Gem::Requirement
100
44
  requirements:
101
- - - ">="
45
+ - - "~>"
102
46
  - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
47
+ version: 2.8.0
48
+ type: :runtime
105
49
  prerelease: false
106
50
  version_requirements: !ruby/object:Gem::Requirement
107
51
  requirements:
108
- - - ">="
52
+ - - "~>"
109
53
  - !ruby/object:Gem::Version
110
- version: '0'
54
+ version: 2.8.0
111
55
  - !ruby/object:Gem::Dependency
112
- name: faraday
56
+ name: parslet
113
57
  requirement: !ruby/object:Gem::Requirement
114
58
  requirements:
115
59
  - - "~>"
116
60
  - !ruby/object:Gem::Version
117
- version: '1.0'
61
+ version: 2.0.0
118
62
  type: :runtime
119
63
  prerelease: false
120
64
  version_requirements: !ruby/object:Gem::Requirement
121
65
  requirements:
122
66
  - - "~>"
123
67
  - !ruby/object:Gem::Version
124
- version: '1.0'
68
+ version: 2.0.0
125
69
  - !ruby/object:Gem::Dependency
126
- name: mechanize
70
+ name: relaton-bib
127
71
  requirement: !ruby/object:Gem::Requirement
128
72
  requirements:
129
73
  - - "~>"
130
74
  - !ruby/object:Gem::Version
131
- version: 2.8.0
75
+ version: 1.14.0
132
76
  type: :runtime
133
77
  prerelease: false
134
78
  version_requirements: !ruby/object:Gem::Requirement
135
79
  requirements:
136
80
  - - "~>"
137
81
  - !ruby/object:Gem::Version
138
- version: 2.8.0
82
+ version: 1.14.0
139
83
  - !ruby/object:Gem::Dependency
140
- name: relaton-bib
84
+ name: relaton-index
141
85
  requirement: !ruby/object:Gem::Requirement
142
86
  requirements:
143
87
  - - "~>"
144
88
  - !ruby/object:Gem::Version
145
- version: 1.14.0
89
+ version: 0.1.0
146
90
  type: :runtime
147
91
  prerelease: false
148
92
  version_requirements: !ruby/object:Gem::Requirement
149
93
  requirements:
150
94
  - - "~>"
151
95
  - !ruby/object:Gem::Version
152
- version: 1.14.0
96
+ version: 0.1.0
153
97
  - !ruby/object:Gem::Dependency
154
98
  name: rubyzip
155
99
  requirement: !ruby/object:Gem::Requirement
@@ -216,8 +160,10 @@ files:
216
160
  - lib/relaton_bipm/document_relation.rb
217
161
  - lib/relaton_bipm/editorial_group.rb
218
162
  - lib/relaton_bipm/hash_converter.rb
219
- - lib/relaton_bipm/index.rb
163
+ - lib/relaton_bipm/id_parser.rb
220
164
  - lib/relaton_bipm/processor.rb
165
+ - lib/relaton_bipm/rawdata_bipm_metrologia/article_parser.rb
166
+ - lib/relaton_bipm/rawdata_bipm_metrologia/fetcher.rb
221
167
  - lib/relaton_bipm/structured_identifier.rb
222
168
  - lib/relaton_bipm/version.rb
223
169
  - lib/relaton_bipm/workgroup.rb
@@ -1,68 +0,0 @@
1
- module RelatonBipm
2
- class Index
3
- #
4
- # Initialize index
5
- #
6
- def initialize
7
- read_index_file || get_index_from_gh
8
- end
9
-
10
- #
11
- # Search index entry
12
- #
13
- # @param [String] ref reference
14
- #
15
- # @return [String] path to document file
16
- #
17
- def search(ref)
18
- @index.detect { |key, _| key.include? ref }&.last
19
- end
20
-
21
- private
22
-
23
- #
24
- # Create dir if need and return path to index file
25
- #
26
- # @return [String] path to index file
27
- #
28
- def path
29
- @path ||= begin
30
- dir = File.join Dir.home, ".relaton", "bipm"
31
- FileUtils.mkdir_p dir
32
- File.join dir, "index.yaml"
33
- end
34
- end
35
-
36
- #
37
- # Read index from file if it exists and not outdated
38
- #
39
- # @return [Hash, nil] index content
40
- #
41
- def read_index_file
42
- return if !File.exist?(path) || File.ctime(path).to_date < Date.today
43
-
44
- @index = RelatonBib.parse_yaml File.read(path, encoding: "UTF-8")
45
- end
46
-
47
- #
48
- # Save index to file
49
- #
50
- # @return [<Type>] <description>
51
- #
52
- def save_index_file
53
- File.write path, @index.to_yaml, encoding: "UTF-8"
54
- end
55
-
56
- #
57
- # Get index from a GitHub repository
58
- #
59
- # @return [Hash] index content
60
- #
61
- def get_index_from_gh # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
62
- resp = Zip::InputStream.new URI("#{BipmBibliography::GH_ENDPOINT}index.zip").open
63
- zip = resp.get_next_entry
64
- @index = RelatonBib.parse_yaml zip.get_input_stream.read
65
- save_index_file
66
- end
67
- end
68
- end