relaton-iec 1.5.0 → 1.7.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/.github/workflows/macos.yml +2 -0
- data/README.adoc +2 -2
- data/grammars/isodoc.rng +14 -43
- data/lib/relaton_iec/hit_collection.rb +50 -11
- data/lib/relaton_iec/iec_bibliography.rb +23 -8
- data/lib/relaton_iec/scrapper.rb +2 -3
- data/lib/relaton_iec/version.rb +1 -1
- data/relaton_iec.gemspec +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 157261e9f755e3f373aa9bc025389029f4b069519d7ab4842ea41d3c9a9e19ce
|
|
4
|
+
data.tar.gz: 89f46eb034143a119e842677074058db9a684eacef09dc4c5b42ec8670f1636f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ecc69a778b11e14465ef0c1827eb038d22fee208f8920772670d95bb48c62d656179871bf47ef6ef4b7a3615ea997349eeee819bd0bd585133c8c3b794afa737
|
|
7
|
+
data.tar.gz: 74c0e6583725319b9a45429f5cbb9bc7c6434a830268215e243029a3334516854cce54b28229e6797361665bb79da9d42a994bd62cd331710987bb3d46c86244
|
data/.github/workflows/macos.yml
CHANGED
|
@@ -26,6 +26,8 @@ jobs:
|
|
|
26
26
|
- name: Update gems
|
|
27
27
|
run: |
|
|
28
28
|
sudo gem install bundler --force
|
|
29
|
+
ruby -v | grep 2.5 && bundle config set build.debase --with-cflags="-Wno-error=implicit-function-declaration"
|
|
30
|
+
ruby -v | grep 2.5 && bundle config set build.ruby-debug-ide --with-cflags="-Wno-error=implicit-function-declaration"
|
|
29
31
|
bundle install --jobs 4 --retry 3
|
|
30
32
|
- name: Run specs
|
|
31
33
|
run: |
|
data/README.adoc
CHANGED
|
@@ -18,7 +18,7 @@ Add this line to your application's Gemfile:
|
|
|
18
18
|
|
|
19
19
|
[source,ruby]
|
|
20
20
|
----
|
|
21
|
-
gem '
|
|
21
|
+
gem 'relaton-iec'
|
|
22
22
|
----
|
|
23
23
|
|
|
24
24
|
And then execute:
|
|
@@ -27,7 +27,7 @@ And then execute:
|
|
|
27
27
|
|
|
28
28
|
Or install it yourself as:
|
|
29
29
|
|
|
30
|
-
$ gem install
|
|
30
|
+
$ gem install relaton-iec
|
|
31
31
|
|
|
32
32
|
== Usage
|
|
33
33
|
|
data/grammars/isodoc.rng
CHANGED
|
@@ -24,6 +24,14 @@
|
|
|
24
24
|
<start>
|
|
25
25
|
<ref name="standard-document"/>
|
|
26
26
|
</start>
|
|
27
|
+
<define name="doctype">
|
|
28
|
+
<element name="doctype">
|
|
29
|
+
<optional>
|
|
30
|
+
<attribute name="abbreviation"/>
|
|
31
|
+
</optional>
|
|
32
|
+
<ref name="DocumentType"/>
|
|
33
|
+
</element>
|
|
34
|
+
</define>
|
|
27
35
|
<define name="hyperlink">
|
|
28
36
|
<element name="link">
|
|
29
37
|
<attribute name="target">
|
|
@@ -141,6 +149,11 @@
|
|
|
141
149
|
<data type="boolean"/>
|
|
142
150
|
</attribute>
|
|
143
151
|
</optional>
|
|
152
|
+
<optional>
|
|
153
|
+
<attribute name="key">
|
|
154
|
+
<data type="boolean"/>
|
|
155
|
+
</attribute>
|
|
156
|
+
</optional>
|
|
144
157
|
<oneOrMore>
|
|
145
158
|
<ref name="dt"/>
|
|
146
159
|
<ref name="dd"/>
|
|
@@ -1164,49 +1177,7 @@
|
|
|
1164
1177
|
</define>
|
|
1165
1178
|
<define name="annex">
|
|
1166
1179
|
<element name="annex">
|
|
1167
|
-
<
|
|
1168
|
-
<attribute name="id">
|
|
1169
|
-
<data type="ID"/>
|
|
1170
|
-
</attribute>
|
|
1171
|
-
</optional>
|
|
1172
|
-
<optional>
|
|
1173
|
-
<attribute name="language"/>
|
|
1174
|
-
</optional>
|
|
1175
|
-
<optional>
|
|
1176
|
-
<attribute name="script"/>
|
|
1177
|
-
</optional>
|
|
1178
|
-
<optional>
|
|
1179
|
-
<attribute name="inline-header">
|
|
1180
|
-
<data type="boolean"/>
|
|
1181
|
-
</attribute>
|
|
1182
|
-
</optional>
|
|
1183
|
-
<attribute name="obligation">
|
|
1184
|
-
<choice>
|
|
1185
|
-
<value>normative</value>
|
|
1186
|
-
<value>informative</value>
|
|
1187
|
-
</choice>
|
|
1188
|
-
</attribute>
|
|
1189
|
-
<optional>
|
|
1190
|
-
<ref name="section-title"/>
|
|
1191
|
-
</optional>
|
|
1192
|
-
<group>
|
|
1193
|
-
<group>
|
|
1194
|
-
<zeroOrMore>
|
|
1195
|
-
<ref name="BasicBlock"/>
|
|
1196
|
-
</zeroOrMore>
|
|
1197
|
-
<zeroOrMore>
|
|
1198
|
-
<ref name="note"/>
|
|
1199
|
-
</zeroOrMore>
|
|
1200
|
-
</group>
|
|
1201
|
-
<zeroOrMore>
|
|
1202
|
-
<choice>
|
|
1203
|
-
<ref name="annex-subsection"/>
|
|
1204
|
-
<ref name="terms"/>
|
|
1205
|
-
<ref name="definitions"/>
|
|
1206
|
-
<ref name="references"/>
|
|
1207
|
-
</choice>
|
|
1208
|
-
</zeroOrMore>
|
|
1209
|
-
</group>
|
|
1180
|
+
<ref name="Annex-Section"/>
|
|
1210
1181
|
</element>
|
|
1211
1182
|
</define>
|
|
1212
1183
|
<define name="terms">
|
|
@@ -9,23 +9,62 @@ module RelatonIec
|
|
|
9
9
|
DOMAIN = "https://webstore.iec.ch"
|
|
10
10
|
|
|
11
11
|
# @param ref_nbr [String]
|
|
12
|
-
# @param year [String]
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
# @param year [String, nil]
|
|
13
|
+
# @param part [String, nil]
|
|
14
|
+
def initialize(ref_nbr, year = nil, part = nil)
|
|
15
|
+
super ref_nbr, year
|
|
16
|
+
@array = hits ref_nbr, year, part
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
# @param ref [String]
|
|
22
|
+
# @param year [String, nil]
|
|
23
|
+
# @param part [String, nil]
|
|
24
|
+
# @return [Array<RelatonIec::Hit>]
|
|
25
|
+
def hits(ref, year, part)
|
|
15
26
|
from, to = nil
|
|
16
27
|
if year
|
|
17
28
|
from = Date.strptime year, "%Y"
|
|
18
29
|
to = from.next_year.prev_day
|
|
19
30
|
end
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
31
|
+
get_results ref, from, to, part
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# @param ref [String]
|
|
35
|
+
# @param from [Date, nil]
|
|
36
|
+
# @param to [Date, nil]
|
|
37
|
+
# @param part [String, nil]
|
|
38
|
+
# @return [Array<RelatonIec::Hit>]
|
|
39
|
+
def get_results(ref, from, to, part = nil)
|
|
40
|
+
code = part ? ref.sub(/(?<=-\d)\d+/, "*") : ref
|
|
41
|
+
[nil, "trf", "wr"].reduce([]) do |m, t|
|
|
42
|
+
url = "#{DOMAIN}/searchkey"
|
|
43
|
+
url += "&type=#{t}" if t
|
|
44
|
+
url += "&RefNbr=#{code}&From=#{from}&To=#{to}&start=1"
|
|
45
|
+
m + results(Addressable::URI.parse(url).normalize, part)
|
|
28
46
|
end
|
|
29
47
|
end
|
|
48
|
+
|
|
49
|
+
# @param url [String]
|
|
50
|
+
# @param part [String, nil]
|
|
51
|
+
# @return [Array<RelatonIec::Hit>]
|
|
52
|
+
def results(uri, part)
|
|
53
|
+
contains = "[contains(.,'Part #{part}:')]" if part
|
|
54
|
+
Nokogiri::HTML(OpenURI.open_uri(uri)).xpath(
|
|
55
|
+
"//body/li#{contains}",
|
|
56
|
+
"//ul[contains(@class,'search-results')]/li#{contains}",
|
|
57
|
+
"//ul[contains(@class,'morethesame')]/li#{contains}"
|
|
58
|
+
).map { |h| make_hit h }.compact
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def make_hit(hit)
|
|
62
|
+
link = hit.at('a[@href!="#"]')
|
|
63
|
+
return unless link
|
|
64
|
+
|
|
65
|
+
code = link.text.tr [194, 160].pack("c*").force_encoding("UTF-8"), ""
|
|
66
|
+
title = hit.xpath("text()").text.gsub(/[\r\n]/, "")
|
|
67
|
+
Hit.new({ code: code, title: title, url: DOMAIN + link[:href] }, self)
|
|
68
|
+
end
|
|
30
69
|
end
|
|
31
70
|
end
|
|
@@ -9,10 +9,19 @@ module RelatonIec
|
|
|
9
9
|
# Class methods for search ISO standards.
|
|
10
10
|
class IecBibliography
|
|
11
11
|
class << self
|
|
12
|
+
##
|
|
13
|
+
# Search for standards entries. To seach packaged document it needs to
|
|
14
|
+
# pass part parametr.
|
|
15
|
+
#
|
|
16
|
+
# @example Search for packaged standard
|
|
17
|
+
# RelatonIec::IecBibliography.search 'IEC 60050-311', nil, '311'
|
|
18
|
+
#
|
|
12
19
|
# @param text [String]
|
|
20
|
+
# @param year [String, nil]
|
|
21
|
+
# @param part [String, nil] search for packaged stndard if not nil
|
|
13
22
|
# @return [RelatonIec::HitCollection]
|
|
14
|
-
def search(text, year = nil)
|
|
15
|
-
HitCollection.new text, year
|
|
23
|
+
def search(text, year = nil, part = nil)
|
|
24
|
+
HitCollection.new text, year, part
|
|
16
25
|
rescue SocketError, OpenURI::HTTPError, OpenSSL::SSL::SSLError
|
|
17
26
|
raise RelatonBib::RequestError, "Could not access http://www.iec.ch"
|
|
18
27
|
end
|
|
@@ -76,14 +85,20 @@ module RelatonIec
|
|
|
76
85
|
workers.result.sort_by { |a| a[:i] }.map { |x| x[:hit] }
|
|
77
86
|
end
|
|
78
87
|
|
|
79
|
-
def isobib_search_filter(code)
|
|
88
|
+
def isobib_search_filter(code, year) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
80
89
|
docidrx = %r{^(ISO|IEC)[^0-9]*\s[0-9-]+}
|
|
81
90
|
corrigrx = %r{^(ISO|IEC)[^0-9]*\s[0-9-]+:[0-9]+/}
|
|
82
91
|
warn "[relaton-iec] (\"#{code}\") fetching..."
|
|
83
|
-
result = search(code)
|
|
92
|
+
result = search(code, year)
|
|
93
|
+
if result.empty? && /(?<=-)(?<part>\d+)/ =~ code
|
|
94
|
+
# try to search packaged standard
|
|
95
|
+
result = search code, year, part
|
|
96
|
+
ref = code.sub /(?<=-\d)\d+/, ""
|
|
97
|
+
else ref = code
|
|
98
|
+
end
|
|
84
99
|
result.select do |i|
|
|
85
100
|
i.hit[:code] &&
|
|
86
|
-
i.hit[:code].match(docidrx).to_s.include?(
|
|
101
|
+
i.hit[:code].match(docidrx).to_s.include?(ref) &&
|
|
87
102
|
corrigrx !~ i.hit[:code]
|
|
88
103
|
end
|
|
89
104
|
end
|
|
@@ -136,9 +151,9 @@ module RelatonIec
|
|
|
136
151
|
return { ret: r } if !year
|
|
137
152
|
|
|
138
153
|
r.date.select { |d| d.type == "published" }.each do |d|
|
|
139
|
-
return { ret: r } if year.to_i == d.on
|
|
154
|
+
return { ret: r } if year.to_i == d.on(:year)
|
|
140
155
|
|
|
141
|
-
missed_years << d.on
|
|
156
|
+
missed_years << d.on(:year)
|
|
142
157
|
end
|
|
143
158
|
end
|
|
144
159
|
end
|
|
@@ -148,7 +163,7 @@ module RelatonIec
|
|
|
148
163
|
def iecbib_get1(code, year, _opts)
|
|
149
164
|
return iev if code.casecmp("IEV").zero?
|
|
150
165
|
|
|
151
|
-
result = isobib_search_filter(code) || return
|
|
166
|
+
result = isobib_search_filter(code, year) || return
|
|
152
167
|
ret = isobib_results_filter(result, year)
|
|
153
168
|
if ret[:ret]
|
|
154
169
|
warn "[relaton-iec] (\"#{code}\") found "\
|
data/lib/relaton_iec/scrapper.rb
CHANGED
|
@@ -170,7 +170,7 @@ module RelatonIec
|
|
|
170
170
|
def fetch_status(doc)
|
|
171
171
|
wip = doc.at('//ROW[STATUS[.="PREPARING"]]')
|
|
172
172
|
if wip
|
|
173
|
-
statuses = YAML.load_file "
|
|
173
|
+
statuses = YAML.load_file File.join __dir__, "statuses.yml"
|
|
174
174
|
s = wip.at("STAGE").text
|
|
175
175
|
stage, substage = statuses[s]["stage"].split "."
|
|
176
176
|
else
|
|
@@ -223,8 +223,7 @@ module RelatonIec
|
|
|
223
223
|
def fetch_status_relations(url)
|
|
224
224
|
pubid = url.match(/\d+$/).to_s
|
|
225
225
|
uri = URI DOMAIN + "/webstore/webstore.nsf/AjaxRequestXML?"\
|
|
226
|
-
"Openagent&url=
|
|
227
|
-
"p=103:390:::::P390_PUBLICATION_ID:" + pubid
|
|
226
|
+
"Openagent&url=" + pubid
|
|
228
227
|
resp = Net::HTTP.get_response uri
|
|
229
228
|
doc = Nokogiri::XML resp.body
|
|
230
229
|
status = fetch_status doc
|
data/lib/relaton_iec/version.rb
CHANGED
data/relaton_iec.gemspec
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: relaton-iec
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.7.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: 2020-
|
|
11
|
+
date: 2020-12-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: debase
|
|
@@ -170,14 +170,14 @@ dependencies:
|
|
|
170
170
|
requirements:
|
|
171
171
|
- - "~>"
|
|
172
172
|
- !ruby/object:Gem::Version
|
|
173
|
-
version: 1.
|
|
173
|
+
version: 1.7.0
|
|
174
174
|
type: :runtime
|
|
175
175
|
prerelease: false
|
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
|
177
177
|
requirements:
|
|
178
178
|
- - "~>"
|
|
179
179
|
- !ruby/object:Gem::Version
|
|
180
|
-
version: 1.
|
|
180
|
+
version: 1.7.0
|
|
181
181
|
description: 'RelatonIec: retrieve IEC Standards for bibliographic use using the IecBibliographicItem
|
|
182
182
|
model'
|
|
183
183
|
email:
|