relaton-jis 1.14.0 → 1.14.2
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/grammars/relaton-jis.rng +3 -109
- data/lib/relaton_jis/bibliography.rb +21 -10
- data/lib/relaton_jis/hit.rb +3 -1
- data/lib/relaton_jis/hit_collection.rb +48 -8
- data/lib/relaton_jis/scraper.rb +12 -4
- data/lib/relaton_jis/version.rb +1 -1
- data/relaton_jis.gemspec +1 -0
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6a4ecb8042069c8babc406d37ee36702fa28bb6efe4d4bdbc60c48ed7fc6599
|
4
|
+
data.tar.gz: 45ee95535b80261e3ad03f76a8025b86b9a4854509f2aab94056b6e438e38b6e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c60b2041b0c812cafb40f3f96ab6d253a21f4e7381422551a702cba2ab9b84a2f2f03f1f05aaad6bcd187eaa95d097bf947fc142dcee142d6c2c73f4011fabe4
|
7
|
+
data.tar.gz: 52bfca55bb5bf3e49cb2f26d83d6a8068efb2a112676bfd9450248cbd7aa6e9834f1b96ff5da976c84013adbd846189d89b90bcb5f85ec543776497c60bf6a4d
|
data/grammars/relaton-jis.rng
CHANGED
@@ -6,9 +6,6 @@
|
|
6
6
|
<attribute name="schema-version"/>
|
7
7
|
</optional>
|
8
8
|
<ref name="doctype"/>
|
9
|
-
<optional>
|
10
|
-
<ref name="docsubtype"/>
|
11
|
-
</optional>
|
12
9
|
<ref name="editorialgroup"/>
|
13
10
|
<zeroOrMore>
|
14
11
|
<ref name="ics"/>
|
@@ -18,93 +15,12 @@
|
|
18
15
|
<ref name="stagename"/>
|
19
16
|
</optional>
|
20
17
|
</define>
|
21
|
-
<define name="bdate">
|
22
|
-
<element name="date">
|
23
|
-
<attribute name="type">
|
24
|
-
<choice>
|
25
|
-
<ref name="BibliographicDateType"/>
|
26
|
-
<text/>
|
27
|
-
</choice>
|
28
|
-
</attribute>
|
29
|
-
<choice>
|
30
|
-
<group>
|
31
|
-
<element name="from">
|
32
|
-
<ref name="ISO8601Date"/>
|
33
|
-
</element>
|
34
|
-
<optional>
|
35
|
-
<element name="to">
|
36
|
-
<ref name="ISO8601Date"/>
|
37
|
-
</element>
|
38
|
-
</optional>
|
39
|
-
</group>
|
40
|
-
<element name="on">
|
41
|
-
<choice>
|
42
|
-
<ref name="ISO8601Date"/>
|
43
|
-
<value>--</value>
|
44
|
-
<value>–</value>
|
45
|
-
</choice>
|
46
|
-
</element>
|
47
|
-
</choice>
|
48
|
-
</element>
|
49
|
-
</define>
|
50
|
-
<define name="organization">
|
51
|
-
<element name="organization">
|
52
|
-
<oneOrMore>
|
53
|
-
<ref name="orgname"/>
|
54
|
-
</oneOrMore>
|
55
|
-
<optional>
|
56
|
-
<ref name="abbreviation"/>
|
57
|
-
</optional>
|
58
|
-
<optional>
|
59
|
-
<ref name="uri"/>
|
60
|
-
</optional>
|
61
|
-
<zeroOrMore>
|
62
|
-
<ref name="org-identifier"/>
|
63
|
-
</zeroOrMore>
|
64
|
-
<zeroOrMore>
|
65
|
-
<ref name="contact"/>
|
66
|
-
</zeroOrMore>
|
67
|
-
<optional>
|
68
|
-
<ref name="technical-committee"/>
|
69
|
-
</optional>
|
70
|
-
<optional>
|
71
|
-
<ref name="subcommittee"/>
|
72
|
-
</optional>
|
73
|
-
<optional>
|
74
|
-
<ref name="workgroup"/>
|
75
|
-
</optional>
|
76
|
-
<optional>
|
77
|
-
<ref name="secretariat"/>
|
78
|
-
</optional>
|
79
|
-
</element>
|
80
|
-
</define>
|
81
18
|
<define name="DocumentType">
|
82
19
|
<choice>
|
83
|
-
<value>
|
84
|
-
<value>draft-for-development</value>
|
85
|
-
<value>published-document</value>
|
86
|
-
<value>privately-subscribed-standard</value>
|
87
|
-
<value>publicly-available-specification</value>
|
88
|
-
<value>flex-standard</value>
|
89
|
-
<value>international-standard</value>
|
90
|
-
<value>technical-specification</value>
|
20
|
+
<value>japanese-industrial-standard</value>
|
91
21
|
<value>technical-report</value>
|
92
|
-
<value>
|
93
|
-
<value>
|
94
|
-
<value>industry-technical-agreement</value>
|
95
|
-
<value>standard</value>
|
96
|
-
<value>european-workshop-agreement</value>
|
97
|
-
<value>fast-track-standard</value>
|
98
|
-
<value>expert-commentary</value>
|
99
|
-
</choice>
|
100
|
-
</define>
|
101
|
-
<define name="DocumentSubtype">
|
102
|
-
<choice>
|
103
|
-
<value>specification</value>
|
104
|
-
<value>method-of-test</value>
|
105
|
-
<value>method-of-specifying</value>
|
106
|
-
<value>vocabulary</value>
|
107
|
-
<value>code-of-practice</value>
|
22
|
+
<value>technical-specification</value>
|
23
|
+
<value>amendment</value>
|
108
24
|
</choice>
|
109
25
|
</define>
|
110
26
|
<define name="structuredidentifier">
|
@@ -126,11 +42,6 @@
|
|
126
42
|
</element>
|
127
43
|
</define>
|
128
44
|
</include>
|
129
|
-
<define name="updates_document_type">
|
130
|
-
<element name="updates-document-type">
|
131
|
-
<ref name="DocumentType"/>
|
132
|
-
</element>
|
133
|
-
</define>
|
134
45
|
<define name="ISOProjectGroup">
|
135
46
|
<zeroOrMore>
|
136
47
|
<ref name="agency"/>
|
@@ -148,21 +59,11 @@
|
|
148
59
|
<ref name="secretariat"/>
|
149
60
|
</optional>
|
150
61
|
</define>
|
151
|
-
<define name="approvalgroup">
|
152
|
-
<element name="approvalgroup">
|
153
|
-
<ref name="ISOProjectGroup"/>
|
154
|
-
</element>
|
155
|
-
</define>
|
156
62
|
<define name="agency">
|
157
63
|
<element name="agency">
|
158
64
|
<text/>
|
159
65
|
</element>
|
160
66
|
</define>
|
161
|
-
<define name="horizontal">
|
162
|
-
<element name="horizontal">
|
163
|
-
<data type="boolean"/>
|
164
|
-
</element>
|
165
|
-
</define>
|
166
67
|
<define name="documentnumber">
|
167
68
|
<element name="project-number">
|
168
69
|
<optional>
|
@@ -221,11 +122,4 @@
|
|
221
122
|
<text/>
|
222
123
|
</element>
|
223
124
|
</define>
|
224
|
-
<define name="coverimages">
|
225
|
-
<element name="coverimages">
|
226
|
-
<oneOrMore>
|
227
|
-
<ref name="image"/>
|
228
|
-
</oneOrMore>
|
229
|
-
</element>
|
230
|
-
</define>
|
231
125
|
</grammar>
|
@@ -16,6 +16,9 @@ module RelatonJis
|
|
16
16
|
agent = Mechanize.new
|
17
17
|
resp = agent.post "#{SOURCE}0010/searchByKeyword", search_type: "JIS", keyword: code
|
18
18
|
disp = JSON.parse resp.body
|
19
|
+
# raise RelatonBib::RequestError, "No results found for #{code}" if disp["disp_screen"].nil?
|
20
|
+
return if disp["disp_screen"].nil?
|
21
|
+
|
19
22
|
result = agent.get "#{SOURCE}#{disp['disp_screen']}/index"
|
20
23
|
HitCollection.new code, year, result: result.xpath("//div[@class='blockGenaral']")
|
21
24
|
end
|
@@ -25,16 +28,24 @@ module RelatonJis
|
|
25
28
|
#
|
26
29
|
# @param [String] ref JIS document reference
|
27
30
|
# @param [String] year JIS document year
|
28
|
-
# @param [Hash]
|
31
|
+
# @param [Hash] opts options
|
32
|
+
# @option opts [String] :all_parts return all parts of document
|
29
33
|
#
|
30
34
|
# @return [RelatonJis::BibliographicItem, nil] JIS document
|
31
35
|
#
|
32
|
-
def get(ref, year = nil,
|
36
|
+
def get(ref, year = nil, opts = {}) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
37
|
+
code = ref.sub(/\s\((all parts|規格群)\)/, "")
|
38
|
+
opts[:all_parts] ||= !$1.nil?
|
33
39
|
warn "[relaton-jis] (\"#{ref}\") fetching..."
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
return
|
40
|
+
hits = search(code, year)
|
41
|
+
unless hits
|
42
|
+
hint [], ref, year
|
43
|
+
return
|
44
|
+
end
|
45
|
+
result = opts[:all_parts] ? hits.find_all_parts : hits.find
|
46
|
+
if result.is_a? RelatonJis::BibliographicItem
|
47
|
+
warn "[relaton-jis] (\"#{ref}\") found #{result.docidentifier[0].id}"
|
48
|
+
return result
|
38
49
|
end
|
39
50
|
hint result, ref, year
|
40
51
|
end
|
@@ -42,16 +53,16 @@ module RelatonJis
|
|
42
53
|
#
|
43
54
|
# Log hint message
|
44
55
|
#
|
45
|
-
# @param [
|
56
|
+
# @param [Array] result search result
|
46
57
|
# @param [String] ref reference to search
|
47
58
|
# @param [String, nil] year year to search
|
48
59
|
#
|
49
60
|
def hint(result, ref, year)
|
50
61
|
warn "[relaton-jis] (\"#{ref}\") not found. The identifier must be " \
|
51
62
|
"exactly as shown on the webdesk.jsa.or.jp website."
|
52
|
-
if result
|
53
|
-
warn "[relaton-jis] (\"#{ref}\") TIP: No match for edition
|
54
|
-
"but matches exist for #{result
|
63
|
+
if result.any?
|
64
|
+
warn "[relaton-jis] (\"#{ref}\") TIP: No match for edition " \
|
65
|
+
"year #{year}, but matches exist for #{result.uniq.join(', ')}."
|
55
66
|
end
|
56
67
|
end
|
57
68
|
end
|
data/lib/relaton_jis/hit.rb
CHANGED
@@ -19,11 +19,13 @@ module RelatonJis
|
|
19
19
|
#
|
20
20
|
# @param [Hash] ref_parts parts of reference
|
21
21
|
# @param [String, nil] year year
|
22
|
+
# @param [Boolean] all_parts check all parts of reference
|
22
23
|
#
|
23
24
|
# @return [Boolean] true if hit matches reference
|
24
25
|
#
|
25
|
-
def
|
26
|
+
def eq?(ref_parts, year = nil, all_parts: false) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/PerceivedComplexity
|
26
27
|
id_parts[:code].include?(ref_parts[:code]) &&
|
28
|
+
(all_parts || (ref_parts[:part].nil? || ref_parts[:part] == id_parts[:part])) &&
|
27
29
|
(year.nil? || year == id_parts[:year]) &&
|
28
30
|
((ref_parts[:expl].nil? || !id_parts[:expl].nil?) &&
|
29
31
|
(ref_parts[:expl_num].nil? || ref_parts[:expl_num] == id_parts[:expl_num])) &&
|
@@ -15,17 +15,56 @@ module RelatonJis
|
|
15
15
|
#
|
16
16
|
# Find hit in collection
|
17
17
|
#
|
18
|
-
# @return [
|
18
|
+
# @return [RelatonJis::BibliographicItem, Array<Strig>] hash with bib ot array of missed years
|
19
19
|
#
|
20
20
|
def find
|
21
|
+
ref_year = year || ref_parts[:year]
|
22
|
+
if ref_year
|
23
|
+
find_by_year ref_year
|
24
|
+
else
|
25
|
+
find_all_years
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def find_by_year(ref_year)
|
21
30
|
missed_years = []
|
22
|
-
y = year || ref_parts[:year]
|
23
31
|
@array.each do |hit|
|
24
|
-
return
|
32
|
+
return hit.fetch if hit.eq? ref_parts, ref_year
|
33
|
+
|
34
|
+
missed_years << hit.id_parts[:year] if hit.eq?(ref_parts)
|
35
|
+
end
|
36
|
+
missed_years
|
37
|
+
end
|
38
|
+
|
39
|
+
def find_all_years # rubocop:disable Metrics/AbcSize
|
40
|
+
hits = @array.select { |hit| hit.eq? ref_parts }
|
41
|
+
item = hits.max_by { |i| i.id_parts[:year].to_i }.fetch
|
42
|
+
item_id = item.docidentifier.first.id
|
43
|
+
parent = item.to_most_recent_reference
|
44
|
+
hits.each do |hit|
|
45
|
+
next if hit.hit[:id] == item_id
|
25
46
|
|
26
|
-
|
47
|
+
parent.relation << create_relation(hit)
|
27
48
|
end
|
28
|
-
|
49
|
+
parent
|
50
|
+
end
|
51
|
+
|
52
|
+
def find_all_parts # rubocop:disable Metrics/AbcSize
|
53
|
+
hits = @array.select { |hit| hit.eq? ref_parts, all_parts: true }
|
54
|
+
item = hits.min_by { |i| i.id_parts[:part].to_i }.fetch.to_all_parts
|
55
|
+
hits.each do |hit|
|
56
|
+
next if hit.hit[:id] == item.docidentifier.first.id
|
57
|
+
|
58
|
+
item.relation << create_relation(hit)
|
59
|
+
end
|
60
|
+
item
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_relation(hit)
|
64
|
+
docid = RelatonBib::DocumentIdentifier.new id: hit.hit[:id], type: "JIS", primary: true
|
65
|
+
fref = RelatonBib::FormattedRef.new content: hit.hit[:id]
|
66
|
+
bibitem = BibliographicItem.new docid: [docid], formattedref: fref
|
67
|
+
RelatonBib::DocumentRelation.new(type: "instance", bibitem: bibitem)
|
29
68
|
end
|
30
69
|
|
31
70
|
#
|
@@ -46,13 +85,14 @@ module RelatonJis
|
|
46
85
|
#
|
47
86
|
def parse_ref(ref)
|
48
87
|
%r{
|
49
|
-
^(?<code>\w+\s\w\s?\
|
88
|
+
^(?<code>\w+\s\w\s?\w+)
|
89
|
+
(?:-(?<part>\w+))?
|
50
90
|
(?::(?<year>\d{4}))?
|
51
91
|
(?:/(?<expl>EXPL(?:ANATION)?)(?:\s(?<expl_num>\d+))?)?
|
52
92
|
(?:/(?<amd>AMDENDMENT)(?:\s(?<amd_num>\d+)(?::(?<amd_year>\d{4}))?)?)?
|
53
93
|
}x =~ ref
|
54
|
-
{ code: code, year: year, expl: expl, expl_num: expl_num,
|
55
|
-
amd_num: amd_num, amd_year: amd_year }
|
94
|
+
{ code: code, part: part, year: year, expl: expl, expl_num: expl_num,
|
95
|
+
amd: amd, amd_num: amd_num, amd_year: amd_year }
|
56
96
|
end
|
57
97
|
end
|
58
98
|
end
|
data/lib/relaton_jis/scraper.rb
CHANGED
@@ -52,15 +52,18 @@ module RelatonJis
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def fetch_docid
|
55
|
-
id
|
56
|
-
[RelatonBib::DocumentIdentifier.new(id: id, type: "JIS", primary: true)]
|
55
|
+
[RelatonBib::DocumentIdentifier.new(id: document_id, type: "JIS", primary: true)]
|
57
56
|
end
|
58
57
|
|
59
58
|
def fetch_docnumber
|
60
|
-
match =
|
59
|
+
match = document_id.match(/^\w+\s(\w)\s?(\d+)/)
|
61
60
|
"#{match[1]}#{match[2]}"
|
62
61
|
end
|
63
62
|
|
63
|
+
def document_id
|
64
|
+
@document_id ||= @doc.at("./h2/text()[1]").text.strip
|
65
|
+
end
|
66
|
+
|
64
67
|
def fetch_date
|
65
68
|
DATETYPES.each_with_object([]) do |(key, type), a|
|
66
69
|
node = @doc.at("./div/div/div/p/text()[contains(.,'#{key}')]")
|
@@ -100,7 +103,12 @@ module RelatonJis
|
|
100
103
|
end
|
101
104
|
|
102
105
|
def fetch_doctype
|
103
|
-
|
106
|
+
case document_id
|
107
|
+
when /JIS\s[A-Z]\s[\w-]+:\d{4}\/AMENDMENT/ then "amendment"
|
108
|
+
when /JIS\s[A-Z]\s[\w-]+/ then "japanese-industrial-standard"
|
109
|
+
when /TR[\s\/][\w-]+/ then "technical-report"
|
110
|
+
when /TS[\s\/][\w-]+/ then "technical-specification"
|
111
|
+
end
|
104
112
|
end
|
105
113
|
|
106
114
|
def fetch_ics
|
data/lib/relaton_jis/version.rb
CHANGED
data/relaton_jis.gemspec
CHANGED
@@ -35,6 +35,7 @@ Gem::Specification.new do |spec|
|
|
35
35
|
|
36
36
|
# Uncomment to register a new dependency of your gem
|
37
37
|
spec.add_dependency "mechanize", "~> 2.8.0"
|
38
|
+
spec.add_dependency "relaton-bib", "~> 1.14.9"
|
38
39
|
spec.add_dependency "relaton-iso-bib", "~> 1.14.0"
|
39
40
|
|
40
41
|
# For more information and examples about making a new gem, check out our
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: relaton-jis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.14.
|
4
|
+
version: 1.14.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mechanize
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 2.8.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: relaton-bib
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.14.9
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.14.9
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: relaton-iso-bib
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -89,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
89
103
|
- !ruby/object:Gem::Version
|
90
104
|
version: '0'
|
91
105
|
requirements: []
|
92
|
-
rubygems_version: 3.
|
106
|
+
rubygems_version: 3.3.26
|
93
107
|
signing_key:
|
94
108
|
specification_version: 4
|
95
109
|
summary: 'RelatonJis: retrieve IETF Standards for bibliographic use using the BibliographicItem
|