relaton-bipm 1.14.1 → 1.14.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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