iev 0.3.9 → 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 +4 -4
- data/.github/workflows/rake.yml +0 -2
- data/.github/workflows/release.yml +3 -1
- data/.gitignore +3 -1
- data/CLAUDE.md +50 -0
- data/Gemfile +3 -0
- data/README.adoc +65 -15
- data/exe/iev +11 -0
- data/iev.gemspec +5 -4
- data/lib/iev/cli/command.rb +119 -76
- data/lib/iev/cli/command_helper.rb +55 -36
- data/lib/iev/config.rb +31 -0
- data/lib/iev/converter/mathml_to_asciimath.rb +119 -158
- data/lib/iev/data_source.rb +124 -0
- data/lib/iev/exporter.rb +122 -0
- data/lib/iev/scraper/page_parser.rb +176 -0
- data/lib/iev/scraper.rb +135 -0
- data/lib/iev/source_parser.rb +31 -18
- data/lib/iev/supersession_parser.rb +9 -13
- data/lib/iev/term_attrs_parser.rb +21 -7
- data/lib/iev/term_builder.rb +100 -94
- data/lib/iev/utilities.rb +91 -42
- data/lib/iev/version.rb +1 -1
- data/lib/iev.rb +47 -35
- metadata +34 -13
- data/lib/iev/db.rb +0 -82
- data/lib/iev/db_cache.rb +0 -124
metadata
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: iev
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ribose Inc.
|
|
8
|
+
autorequire:
|
|
8
9
|
bindir: exe
|
|
9
10
|
cert_chain: []
|
|
10
|
-
date:
|
|
11
|
+
date: 2026-04-27 00:00:00.000000000 Z
|
|
11
12
|
dependencies:
|
|
12
13
|
- !ruby/object:Gem::Dependency
|
|
13
14
|
name: creek
|
|
@@ -38,33 +39,33 @@ dependencies:
|
|
|
38
39
|
- !ruby/object:Gem::Version
|
|
39
40
|
version: 2.3.0
|
|
40
41
|
- !ruby/object:Gem::Dependency
|
|
41
|
-
name:
|
|
42
|
+
name: ferrum
|
|
42
43
|
requirement: !ruby/object:Gem::Requirement
|
|
43
44
|
requirements:
|
|
44
45
|
- - "~>"
|
|
45
46
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: '
|
|
47
|
+
version: '0.15'
|
|
47
48
|
type: :runtime
|
|
48
49
|
prerelease: false
|
|
49
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
50
51
|
requirements:
|
|
51
52
|
- - "~>"
|
|
52
53
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: '
|
|
54
|
+
version: '0.15'
|
|
54
55
|
- !ruby/object:Gem::Dependency
|
|
55
56
|
name: nokogiri
|
|
56
57
|
requirement: !ruby/object:Gem::Requirement
|
|
57
58
|
requirements:
|
|
58
59
|
- - "~>"
|
|
59
60
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: '1.
|
|
61
|
+
version: '1.19'
|
|
61
62
|
type: :runtime
|
|
62
63
|
prerelease: false
|
|
63
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
64
65
|
requirements:
|
|
65
66
|
- - "~>"
|
|
66
67
|
- !ruby/object:Gem::Version
|
|
67
|
-
version: '1.
|
|
68
|
+
version: '1.19'
|
|
68
69
|
- !ruby/object:Gem::Dependency
|
|
69
70
|
name: plurimath
|
|
70
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -79,6 +80,20 @@ dependencies:
|
|
|
79
80
|
- - ">="
|
|
80
81
|
- !ruby/object:Gem::Version
|
|
81
82
|
version: '0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: lutaml-model
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: 0.8.0
|
|
90
|
+
type: :runtime
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: 0.8.0
|
|
82
97
|
- !ruby/object:Gem::Dependency
|
|
83
98
|
name: relaton
|
|
84
99
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -113,14 +128,14 @@ dependencies:
|
|
|
113
128
|
requirements:
|
|
114
129
|
- - "~>"
|
|
115
130
|
- !ruby/object:Gem::Version
|
|
116
|
-
version: 1.7
|
|
131
|
+
version: '1.7'
|
|
117
132
|
type: :runtime
|
|
118
133
|
prerelease: false
|
|
119
134
|
version_requirements: !ruby/object:Gem::Requirement
|
|
120
135
|
requirements:
|
|
121
136
|
- - "~>"
|
|
122
137
|
- !ruby/object:Gem::Version
|
|
123
|
-
version: 1.7
|
|
138
|
+
version: '1.7'
|
|
124
139
|
- !ruby/object:Gem::Dependency
|
|
125
140
|
name: thor
|
|
126
141
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -163,6 +178,7 @@ files:
|
|
|
163
178
|
- ".rspec"
|
|
164
179
|
- ".rubocop.yml"
|
|
165
180
|
- ".rubocop_todo.yml"
|
|
181
|
+
- CLAUDE.md
|
|
166
182
|
- Gemfile
|
|
167
183
|
- LICENSE.txt
|
|
168
184
|
- README.adoc
|
|
@@ -176,16 +192,19 @@ files:
|
|
|
176
192
|
- lib/iev/cli/command.rb
|
|
177
193
|
- lib/iev/cli/command_helper.rb
|
|
178
194
|
- lib/iev/cli/ui.rb
|
|
195
|
+
- lib/iev/config.rb
|
|
179
196
|
- lib/iev/converter.rb
|
|
180
197
|
- lib/iev/converter/mathml_to_asciimath.rb
|
|
181
198
|
- lib/iev/data_conversions.rb
|
|
182
|
-
- lib/iev/
|
|
183
|
-
- lib/iev/db_cache.rb
|
|
199
|
+
- lib/iev/data_source.rb
|
|
184
200
|
- lib/iev/db_writer.rb
|
|
201
|
+
- lib/iev/exporter.rb
|
|
185
202
|
- lib/iev/iso_639_2.yaml
|
|
186
203
|
- lib/iev/iso_639_code.rb
|
|
187
204
|
- lib/iev/profiler.rb
|
|
188
205
|
- lib/iev/relaton_db.rb
|
|
206
|
+
- lib/iev/scraper.rb
|
|
207
|
+
- lib/iev/scraper/page_parser.rb
|
|
189
208
|
- lib/iev/source_parser.rb
|
|
190
209
|
- lib/iev/supersession_parser.rb
|
|
191
210
|
- lib/iev/term_attrs_parser.rb
|
|
@@ -196,6 +215,7 @@ homepage: https://github.com/glossarist/iev
|
|
|
196
215
|
licenses:
|
|
197
216
|
- BSD-2-Clause
|
|
198
217
|
metadata: {}
|
|
218
|
+
post_install_message:
|
|
199
219
|
rdoc_options: []
|
|
200
220
|
require_paths:
|
|
201
221
|
- lib
|
|
@@ -203,14 +223,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
203
223
|
requirements:
|
|
204
224
|
- - ">="
|
|
205
225
|
- !ruby/object:Gem::Version
|
|
206
|
-
version: 3.
|
|
226
|
+
version: 3.2.0
|
|
207
227
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
208
228
|
requirements:
|
|
209
229
|
- - ">="
|
|
210
230
|
- !ruby/object:Gem::Version
|
|
211
231
|
version: '0'
|
|
212
232
|
requirements: []
|
|
213
|
-
rubygems_version:
|
|
233
|
+
rubygems_version: 3.5.22
|
|
234
|
+
signing_key:
|
|
214
235
|
specification_version: 4
|
|
215
236
|
summary: Glossarist toolkit for working with IEV terms from Electropedia
|
|
216
237
|
test_files: []
|
data/lib/iev/db.rb
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# require 'pstore'
|
|
4
|
-
require_relative "db_cache"
|
|
5
|
-
|
|
6
|
-
module Iev
|
|
7
|
-
# Cache class.
|
|
8
|
-
class Db
|
|
9
|
-
# @param global_cache [String] filename of global DB
|
|
10
|
-
# @param local_cache [String] filename of local DB
|
|
11
|
-
def initialize(global_cache, local_cache)
|
|
12
|
-
@db = open_cache_biblio(global_cache)
|
|
13
|
-
@local_db = open_cache_biblio(local_cache, global: false)
|
|
14
|
-
@db_name = global_cache
|
|
15
|
-
@local_db_name = local_cache
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# @param [String] code for example "103-01-02"
|
|
19
|
-
# @param [String] lang language code, for examle "en"
|
|
20
|
-
# @return [String] Relaton XML serialisation of reference
|
|
21
|
-
def fetch(code, lang)
|
|
22
|
-
check_bibliocache(code, lang)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
private
|
|
26
|
-
|
|
27
|
-
def check_bibliocache(code, lang)
|
|
28
|
-
id = "#{code}/#{lang}"
|
|
29
|
-
return bib_retval(new_bib_entry(code, lang)) if @db.nil?
|
|
30
|
-
|
|
31
|
-
# @db.delete(id) unless valid_bib_entry?(@db[id])
|
|
32
|
-
@db[id] ||= new_bib_entry(code, lang)
|
|
33
|
-
if @local_db.nil? then bib_retval(@db[id])
|
|
34
|
-
else
|
|
35
|
-
@local_db[id] ||= @db[id]
|
|
36
|
-
bib_retval(@local_db[id])
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def bib_retval(entry)
|
|
41
|
-
# entry['term'] == 'not_found' ? '' : entry['term']
|
|
42
|
-
# entry["term"]
|
|
43
|
-
/^not_found/.match?(entry) ? nil : entry
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# @return [Hash]
|
|
47
|
-
def new_bib_entry(code, lang)
|
|
48
|
-
Iev.get(code, lang)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# @param dir [String] DB dir
|
|
52
|
-
# @param global [TrueClass, FalseClass]
|
|
53
|
-
# @return [Iev::DbCache, nil]
|
|
54
|
-
def open_cache_biblio(dir, global: true)
|
|
55
|
-
return nil if dir.nil?
|
|
56
|
-
|
|
57
|
-
db = DbCache.new dir
|
|
58
|
-
if global
|
|
59
|
-
unless db.check_version?
|
|
60
|
-
FileUtils.rm_rf(Dir.glob(File.join(dir, "*")), secure: true)
|
|
61
|
-
warn "Global cache version is obsolete and cleared."
|
|
62
|
-
end
|
|
63
|
-
db.set_version
|
|
64
|
-
elsif db.check_version? then db
|
|
65
|
-
else
|
|
66
|
-
warn "Local cache version is obsolete."
|
|
67
|
-
nil
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# def check_cache_version(cache_db)
|
|
72
|
-
# cache_db.transaction { cache_db[:version] == VERSION }
|
|
73
|
-
# end
|
|
74
|
-
|
|
75
|
-
# def save_cache_version(cache_db)
|
|
76
|
-
# unless File.exist? cache_db.path
|
|
77
|
-
# cache_db.transaction { cache_db[:version] = VERSION }
|
|
78
|
-
# end
|
|
79
|
-
# cache_db
|
|
80
|
-
# end
|
|
81
|
-
end
|
|
82
|
-
end
|
data/lib/iev/db_cache.rb
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "fileutils"
|
|
4
|
-
|
|
5
|
-
module Iev
|
|
6
|
-
class DbCache
|
|
7
|
-
# @return [String]
|
|
8
|
-
attr_reader :dir
|
|
9
|
-
|
|
10
|
-
# @param dir [String] DB directory
|
|
11
|
-
def initialize(dir)
|
|
12
|
-
@dir = dir
|
|
13
|
-
FileUtils.mkdir_p @dir
|
|
14
|
-
file_version = "#{@dir}/version"
|
|
15
|
-
File.exist? file_version or
|
|
16
|
-
File.write file_version, VERSION, encoding: "utf-8"
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# Save item
|
|
20
|
-
# @param key [String]
|
|
21
|
-
# @param value [String] Bibitem xml serialization
|
|
22
|
-
def []=(key, value)
|
|
23
|
-
return if value.nil?
|
|
24
|
-
|
|
25
|
-
prefix_dir = "#{@dir}/#{prefix(key)}"
|
|
26
|
-
FileUtils.mkdir_p prefix_dir
|
|
27
|
-
File.write filename(key), value, encoding: "utf-8"
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# Read item
|
|
31
|
-
# @param key [String]
|
|
32
|
-
# @return [String]
|
|
33
|
-
def [](key)
|
|
34
|
-
file = filename key
|
|
35
|
-
return unless File.exist? file
|
|
36
|
-
|
|
37
|
-
File.read(file, encoding: "utf-8")
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# Return fetched date
|
|
41
|
-
# @param key [String]
|
|
42
|
-
# @return [String]
|
|
43
|
-
def fetched(key)
|
|
44
|
-
value = self[key]
|
|
45
|
-
return unless value
|
|
46
|
-
|
|
47
|
-
# if value =~ /^not_found/
|
|
48
|
-
# value.match(/\d{4}-\d{2}-\d{2}/).to_s
|
|
49
|
-
# else
|
|
50
|
-
doc = Nokogiri::XML value
|
|
51
|
-
doc.at("/bibitem/fetched")&.text
|
|
52
|
-
# end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
# Returns all items
|
|
56
|
-
# @return [Array<Hash>]
|
|
57
|
-
def all
|
|
58
|
-
Dir.glob("#{@dir}/**/*.xml").sort.map do |f|
|
|
59
|
-
File.read(f, encoding: "utf-8")
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Delete item
|
|
64
|
-
# @param key [String]
|
|
65
|
-
def delete(key)
|
|
66
|
-
file = filename key
|
|
67
|
-
File.delete file if File.exist? file
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
# Check if version of the DB match to the gem version.
|
|
71
|
-
# @return [TrueClass, FalseClass]
|
|
72
|
-
def check_version?
|
|
73
|
-
version_file = "#{@dir}/version"
|
|
74
|
-
return false unless File.exist?(version_file)
|
|
75
|
-
|
|
76
|
-
v = File.read version_file, encoding: "utf-8"
|
|
77
|
-
v == VERSION
|
|
78
|
-
rescue StandardError
|
|
79
|
-
false
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
# Set version of the DB to the gem version.
|
|
83
|
-
# @return [Iev::DbCache]
|
|
84
|
-
def set_version
|
|
85
|
-
File.write "#{@dir}/version", VERSION, encoding: "utf-8"
|
|
86
|
-
self
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
# if cached reference is undated, expire it after 60 days
|
|
90
|
-
# @param key [String]
|
|
91
|
-
# @param year [String]
|
|
92
|
-
# def valid_entry?(key)
|
|
93
|
-
# datestr = fetched key
|
|
94
|
-
# return false unless datestr
|
|
95
|
-
|
|
96
|
-
# date = Date.parse datestr
|
|
97
|
-
# year || Date.today - date < 60
|
|
98
|
-
# end
|
|
99
|
-
|
|
100
|
-
private
|
|
101
|
-
|
|
102
|
-
# Return item's file name
|
|
103
|
-
# @param key [String]
|
|
104
|
-
# @return [String]
|
|
105
|
-
def filename(key)
|
|
106
|
-
# prefcode = key.downcase.match /^(?<prefix>[^\(]+)\((?<code>[^\)]+)/
|
|
107
|
-
# if prefcode
|
|
108
|
-
# "#{@dir}/#{prefcode[:prefix]}/#{prefcode[:code].gsub(/[-:\s\/]/, '_')}.xml"
|
|
109
|
-
# else
|
|
110
|
-
"#{@dir}/#{key.gsub(%r{[-:\s/]}, '_')}.xml"
|
|
111
|
-
# end
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
# Return item's subdir
|
|
115
|
-
# @param key [String]
|
|
116
|
-
# @return [String]
|
|
117
|
-
def prefix(key)
|
|
118
|
-
# @registry.processors.detect do |_n, p|
|
|
119
|
-
# /^#{p.prefix}/.match(key) || processor.defaultprefix.match(key)
|
|
120
|
-
# end[1].prefix.downcase
|
|
121
|
-
key.downcase.match(/^[^(]+(?=\()/).to_s
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
end
|