iev 0.4.4 → 0.4.6

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.
data/lib/iev.rb CHANGED
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "iev/version"
4
- require "iev/config"
5
- require "iev/data_source"
6
-
7
- require "yaml"
8
4
 
9
5
  # plurimath and unitsml both depend on mml, which has a transitive
10
6
  # dependency version mismatch with lutaml-model in some environments.
11
- # Load them when available; the DataSource APIs work without them.
7
+ # Load them when available; the DataSource/Db APIs work without them.
12
8
  begin
13
9
  require "plurimath"
14
10
  rescue LoadError
@@ -22,6 +18,9 @@ rescue LoadError
22
18
  end
23
19
 
24
20
  module Iev
21
+ # IEV dataset URN — single source of truth for all concept references.
22
+ IEV_SOURCE = "urn:iec:std:iec:60050"
23
+
25
24
  autoload :Cli, "iev/cli"
26
25
  autoload :Config, "iev/config"
27
26
  autoload :Converter, "iev/converter"
@@ -29,11 +28,14 @@ module Iev
29
28
  autoload :DataSource, "iev/data_source"
30
29
  autoload :DbWriter, "iev/db_writer"
31
30
  autoload :Exporter, "iev/exporter"
31
+ autoload :IevCode, "iev/iev_code"
32
32
  autoload :Iso639Code, "iev/iso_639_code"
33
33
  autoload :Profiler, "iev/profiler"
34
34
  autoload :RelatonDb, "iev/relaton_db"
35
35
  autoload :Scraper, "iev/scraper"
36
+ autoload :Section, "iev/section"
36
37
  autoload :SourceParser, "iev/source_parser"
38
+ autoload :SubjectArea, "iev/subject_area"
37
39
  autoload :SubjectAreas, "iev/subject_areas"
38
40
  autoload :SubjectAreaConcepts, "iev/subject_area_concepts"
39
41
  autoload :SupersessionParser, "iev/supersession_parser"
@@ -41,6 +43,26 @@ module Iev
41
43
  autoload :TermBuilder, "iev/term_builder"
42
44
  autoload :Utilities, "iev/utilities"
43
45
 
46
+ # --- Configuration ---
47
+
48
+ # @return [Config]
49
+ def self.config
50
+ @config ||= Config.new
51
+ end
52
+
53
+ # Yield the config object for initialization.
54
+ # @yield [Config]
55
+ def self.configure
56
+ yield(config) if block_given?
57
+ end
58
+
59
+ # Reset config (useful in tests).
60
+ def self.reset_config!
61
+ @config = nil
62
+ end
63
+
64
+ # --- Data fetching ---
65
+
44
66
  # Fetch term designation from IEV data.
45
67
  #
46
68
  # @param [String] code for example "103-01-02"
@@ -48,7 +70,6 @@ module Iev
48
70
  #
49
71
  # @return [String, nil] if found then term,
50
72
  # if code or language not found then nil.
51
- #
52
73
  def self.get(code, lang)
53
74
  DataSource.fetch_term_designation(code, lang)
54
75
  rescue DataSource::NotFoundError
@@ -74,6 +95,8 @@ module Iev
74
95
  DataSource.fetch_term(code, lang)
75
96
  end
76
97
 
98
+ # --- Scraping ---
99
+
77
100
  # Scrape concept data from Electropedia for a given IEV code.
78
101
  # Uses Ferrum (headless Chrome) to handle AWS WAF challenge.
79
102
  #
@@ -83,37 +106,46 @@ module Iev
83
106
  Scraper.new.fetch_concept(code)
84
107
  end
85
108
 
109
+ # --- Subject area / section queries ---
110
+
86
111
  # Return all IEV subject areas with their sections (from bundled data).
87
- # @return [Array<Hash>]
112
+ # @return [Array<SubjectArea>]
88
113
  def self.subject_areas
89
114
  SubjectAreas.all
90
115
  end
91
116
 
92
117
  # Find a subject area by code.
93
118
  # @param code [String, Integer] e.g. "102"
94
- # @return [Hash, nil]
119
+ # @return [SubjectArea, nil]
95
120
  def self.find_subject_area(code)
96
121
  SubjectAreas.find_area(code)
97
122
  end
98
123
 
99
124
  # Find a section by its section code.
100
125
  # @param section_code [String] e.g. "102-01"
101
- # @return [Hash, nil]
126
+ # @return [Section, nil]
102
127
  def self.find_section(section_code)
103
128
  SubjectAreas.find_section(section_code)
104
129
  end
105
130
 
106
131
  # Return sections for a given area code.
107
132
  # @param code [String, Integer] e.g. "102"
108
- # @return [Array<Hash>]
133
+ # @return [Array<Section>]
109
134
  def self.sections_for(code)
110
135
  SubjectAreas.sections_for(code)
111
136
  end
112
137
 
113
138
  # Return the parent subject area for a given section code.
114
139
  # @param section_code [String] e.g. "102-01"
115
- # @return [Hash, nil]
140
+ # @return [SubjectArea, nil]
116
141
  def self.area_for_section(section_code)
117
142
  SubjectAreas.area_for_section(section_code)
118
143
  end
144
+
145
+ # Parse an IEV code into its structural components.
146
+ # @param code [String] e.g. "103-01-02"
147
+ # @return [IevCode, nil] nil if the code is blank
148
+ def self.parse_code(code)
149
+ IevCode.parse(code)
150
+ end
119
151
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iev
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.4.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-05-13 00:00:00.000000000 Z
11
+ date: 2026-06-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: creek
@@ -24,34 +24,48 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ferrum
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.15'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.15'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: glossarist
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - ">="
32
46
  - !ruby/object:Gem::Version
33
- version: 2.3.0
47
+ version: 2.8.2
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - ">="
39
53
  - !ruby/object:Gem::Version
40
- version: 2.3.0
54
+ version: 2.8.2
41
55
  - !ruby/object:Gem::Dependency
42
- name: ferrum
56
+ name: lutaml-model
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '0.15'
61
+ version: 0.8.0
48
62
  type: :runtime
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '0.15'
68
+ version: 0.8.0
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: nokogiri
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,20 +94,6 @@ dependencies:
80
94
  - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  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
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: relaton
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -206,6 +206,7 @@ files:
206
206
  - lib/iev/data_source.rb
207
207
  - lib/iev/db_writer.rb
208
208
  - lib/iev/exporter.rb
209
+ - lib/iev/iev_code.rb
209
210
  - lib/iev/iso_639_2.yaml
210
211
  - lib/iev/iso_639_code.rb
211
212
  - lib/iev/profiler.rb
@@ -213,7 +214,9 @@ files:
213
214
  - lib/iev/scraper.rb
214
215
  - lib/iev/scraper/browser.rb
215
216
  - lib/iev/scraper/page_parser.rb
217
+ - lib/iev/section.rb
216
218
  - lib/iev/source_parser.rb
219
+ - lib/iev/subject_area.rb
217
220
  - lib/iev/subject_area_concepts.rb
218
221
  - lib/iev/subject_areas.rb
219
222
  - lib/iev/supersession_parser.rb
@@ -224,7 +227,8 @@ files:
224
227
  homepage: https://github.com/glossarist/iev
225
228
  licenses:
226
229
  - BSD-2-Clause
227
- metadata: {}
230
+ metadata:
231
+ rubygems_mfa_required: 'true'
228
232
  post_install_message:
229
233
  rdoc_options: []
230
234
  require_paths: