relaton 0.0.1

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.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.ribose.yml +66 -0
  3. data/.rubocop.tb.yml +650 -0
  4. data/.rubocop.yml +15 -0
  5. data/.travis.yml +6 -0
  6. data/Gemfile +8 -0
  7. data/Gemfile.lock +255 -0
  8. data/LICENSE +25 -0
  9. data/README.adoc +17 -0
  10. data/bin/rspec +18 -0
  11. data/lib/relaton.rb +4 -0
  12. data/lib/relaton/processor.rb +16 -0
  13. data/lib/relaton/registry.rb +36 -0
  14. data/lib/relaton/relaton.rb +120 -0
  15. data/lib/relaton/version.rb +3 -0
  16. data/relaton.gemspec +48 -0
  17. data/spec/relaton/relaton_spec.rb +73 -0
  18. data/spec/spec_helper.rb +24 -0
  19. data/spec/support/_fr_standard_26020.html +828 -0
  20. data/spec/support/_fr_standard_32557.html +843 -0
  21. data/spec/support/_fr_standard_32579.html +768 -0
  22. data/spec/support/_fr_standard_39229.html +880 -0
  23. data/spec/support/_fr_standard_44361.html +606 -0
  24. data/spec/support/_fr_standard_53798.html +850 -0
  25. data/spec/support/_fr_standard_57104.html +805 -0
  26. data/spec/support/_fr_standard_66197.html +768 -0
  27. data/spec/support/_fr_standard_67039.html +704 -0
  28. data/spec/support/_fr_standard_73118.html +775 -0
  29. data/spec/support/_ru_standard_26020.html +831 -0
  30. data/spec/support/_ru_standard_32557.html +841 -0
  31. data/spec/support/_ru_standard_32579.html +772 -0
  32. data/spec/support/_ru_standard_39229.html +872 -0
  33. data/spec/support/_ru_standard_44361.html +597 -0
  34. data/spec/support/_ru_standard_53798.html +843 -0
  35. data/spec/support/_ru_standard_57104.html +803 -0
  36. data/spec/support/_ru_standard_66197.html +767 -0
  37. data/spec/support/_ru_standard_67039.html +695 -0
  38. data/spec/support/_ru_standard_73118.html +768 -0
  39. data/spec/support/_standard_26020.html +840 -0
  40. data/spec/support/_standard_32557.html +848 -0
  41. data/spec/support/_standard_32579.html +779 -0
  42. data/spec/support/_standard_39229.html +879 -0
  43. data/spec/support/_standard_44361.html +606 -0
  44. data/spec/support/_standard_53798.html +850 -0
  45. data/spec/support/_standard_57104.html +810 -0
  46. data/spec/support/_standard_66197.html +774 -0
  47. data/spec/support/_standard_67039.html +704 -0
  48. data/spec/support/_standard_73118.html +775 -0
  49. data/spec/support/algolia_resp_page_0.json +130 -0
  50. data/spec/support/algolia_resp_page_1.json +148 -0
  51. metadata +335 -0
data/.rubocop.yml ADDED
@@ -0,0 +1,15 @@
1
+ # This project follows the Ribose OSS style guide.
2
+ # https://github.com/riboseinc/oss-guides
3
+ # All project-specific additions and overrides should be specified in this file.
4
+
5
+ inherit_from:
6
+ # Thoughtbot's style guide from: https://github.com/thoughtbot/guides
7
+ - ".rubocop.tb.yml"
8
+ # Overrides from Ribose
9
+ - ".rubocop.ribose.yml"
10
+ AllCops:
11
+ DisplayCopNames: false
12
+ StyleGuideCopsOnly: false
13
+ TargetRubyVersion: 2.5
14
+ Rails:
15
+ Enabled: true
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.4.3
5
+ before_install:
6
+ - gem install bundler -v 1.16.1
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ Encoding.default_external = Encoding::UTF_8
2
+ Encoding.default_internal = Encoding::UTF_8
3
+
4
+ source "https://rubygems.org"
5
+
6
+ # Specify your gem's dependencies in gemspec
7
+ gemspec
8
+
data/Gemfile.lock ADDED
@@ -0,0 +1,255 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ relaton (0.0.1)
5
+ asciidoctor (~> 1.5.7)
6
+ gbbib (~> 0.1.0)
7
+ iev (~> 0.1.0)
8
+ iso-bib-item (~> 0.1.6)
9
+ isobib (~> 0.1.8)
10
+ rfcbib (~> 0.1.0)
11
+
12
+ GEM
13
+ remote: https://rubygems.org/
14
+ specs:
15
+ algoliasearch (1.23.2)
16
+ httpclient (~> 2.8, >= 2.8.3)
17
+ json (>= 1.5.1)
18
+ asciidoctor (1.5.7.1)
19
+ asciidoctor-csand (0.3.1)
20
+ asciidoctor (~> 1.5.7)
21
+ asciidoctor-iso (>= 0.9.0)
22
+ asciimath
23
+ htmlentities (~> 4.3.4)
24
+ image_size
25
+ isodoc (>= 0.8.0)
26
+ mime-types
27
+ nokogiri
28
+ ruby-jing
29
+ ruby-xslt
30
+ thread_safe
31
+ uuidtools
32
+ asciidoctor-csd (0.4.1)
33
+ asciidoctor-iso (>= 0.9.0)
34
+ isodoc (>= 0.8.0)
35
+ asciidoctor-gb (0.3.1)
36
+ asciidoctor-iso (>= 0.9.0)
37
+ gbbib
38
+ isodoc (>= 0.8.0)
39
+ twitter_cldr
40
+ asciidoctor-iso (0.9.3)
41
+ asciidoctor (~> 1.5.7)
42
+ iso-bib-item (~> 0.1.6)
43
+ isobib (~> 0.1.8)
44
+ isodoc (>= 0.8)
45
+ ruby-jing
46
+ asciidoctor-m3d (0.3.2)
47
+ asciidoctor (~> 1.5.7)
48
+ asciidoctor-iso (>= 0.9.0)
49
+ asciimath
50
+ htmlentities (~> 4.3.4)
51
+ image_size
52
+ isodoc (>= 0.8.0)
53
+ mime-types
54
+ nokogiri
55
+ ruby-jing
56
+ ruby-xslt
57
+ thread_safe
58
+ uuidtools
59
+ asciidoctor-rfc (0.9.0)
60
+ asciidoctor (~> 1.5.7)
61
+ htmlentities (~> 4.3.4)
62
+ nokogiri
63
+ ruby-jing
64
+ thread_safe
65
+ asciidoctor-rsd (0.3.1)
66
+ asciidoctor (~> 1.5.7)
67
+ asciidoctor-iso (>= 0.8.0)
68
+ asciimath
69
+ htmlentities (~> 4.3.4)
70
+ image_size
71
+ isodoc (>= 0.7.0)
72
+ mime-types
73
+ nokogiri
74
+ ruby-jing
75
+ ruby-xslt
76
+ thread_safe
77
+ uuidtools
78
+ asciimath (1.0.4)
79
+ ast (2.4.0)
80
+ byebug (9.1.0)
81
+ camertron-eprun (1.1.1)
82
+ cldr-plurals-runtime-rb (1.0.1)
83
+ cnccs (0.1.1)
84
+ coderay (1.1.2)
85
+ diff-lcs (1.3)
86
+ docile (1.3.1)
87
+ duplicate (1.1.1)
88
+ equivalent-xml (0.6.0)
89
+ nokogiri (>= 1.4.3)
90
+ ffi (1.9.25)
91
+ formatador (0.2.5)
92
+ gbbib (0.1.3)
93
+ cnccs
94
+ iso-bib-item
95
+ guard (2.14.2)
96
+ formatador (>= 0.2.4)
97
+ listen (>= 2.7, < 4.0)
98
+ lumberjack (>= 1.0.12, < 2.0)
99
+ nenv (~> 0.1)
100
+ notiffany (~> 0.0)
101
+ pry (>= 0.9.12)
102
+ shellany (~> 0.0)
103
+ thor (>= 0.18.1)
104
+ guard-compat (1.2.1)
105
+ guard-rspec (4.7.3)
106
+ guard (~> 2.1)
107
+ guard-compat (~> 1.1)
108
+ rspec (>= 2.99.0, < 4.0)
109
+ html2doc (0.8.0)
110
+ asciimath
111
+ htmlentities (~> 4.3.4)
112
+ image_size
113
+ mime-types
114
+ nokogiri
115
+ ruby-xslt
116
+ thread_safe
117
+ uuidtools
118
+ htmlentities (4.3.4)
119
+ httpclient (2.8.3)
120
+ iev (0.1.0)
121
+ nokogiri
122
+ image_size (2.0.0)
123
+ iso-bib-item (0.1.10)
124
+ duplicate (~> 1.1.1)
125
+ isoics (~> 0.1.6)
126
+ nokogiri
127
+ isobib (0.1.9)
128
+ algoliasearch
129
+ iso-bib-item (~> 0.1.10)
130
+ isodoc (0.8.1)
131
+ asciimath
132
+ html2doc (>= 0.7.1)
133
+ htmlentities (~> 4.3.4)
134
+ image_size
135
+ liquid
136
+ mime-types
137
+ nokogiri
138
+ roman-numerals
139
+ ruby-xslt
140
+ sass
141
+ thread_safe
142
+ uuidtools
143
+ isoics (0.1.6)
144
+ jaro_winkler (1.5.1)
145
+ json (2.1.0)
146
+ liquid (4.0.0)
147
+ listen (3.1.5)
148
+ rb-fsevent (~> 0.9, >= 0.9.4)
149
+ rb-inotify (~> 0.9, >= 0.9.7)
150
+ ruby_dep (~> 1.2)
151
+ lumberjack (1.0.13)
152
+ metanorma (0.2.5)
153
+ asciidoctor-csand (>= 0.3.0)
154
+ asciidoctor-csd (>= 0.4.0)
155
+ asciidoctor-gb (>= 0.3.0)
156
+ asciidoctor-iso (>= 0.9.1)
157
+ asciidoctor-m3d (>= 0.3.1)
158
+ asciidoctor-rfc (>= 0.9.0)
159
+ asciidoctor-rsd (>= 0.3.0)
160
+ isodoc (>= 0.8.0)
161
+ method_source (0.9.0)
162
+ mime-types (3.1)
163
+ mime-types-data (~> 3.2015)
164
+ mime-types-data (3.2016.0521)
165
+ mini_portile2 (2.3.0)
166
+ nenv (0.3.0)
167
+ nokogiri (1.8.4)
168
+ mini_portile2 (~> 2.3.0)
169
+ notiffany (0.1.1)
170
+ nenv (~> 0.1)
171
+ shellany (~> 0.0)
172
+ optout (0.0.2)
173
+ parallel (1.12.1)
174
+ parser (2.5.1.0)
175
+ ast (~> 2.4.0)
176
+ powerpack (0.1.2)
177
+ pry (0.11.3)
178
+ coderay (~> 1.1.0)
179
+ method_source (~> 0.9.0)
180
+ rainbow (3.0.0)
181
+ rake (12.3.1)
182
+ rb-fsevent (0.10.3)
183
+ rb-inotify (0.9.10)
184
+ ffi (>= 0.5.0, < 2)
185
+ rfcbib (0.1.1)
186
+ iso-bib-item (~> 0.1.10)
187
+ roman-numerals (0.3.0)
188
+ rspec (3.7.0)
189
+ rspec-core (~> 3.7.0)
190
+ rspec-expectations (~> 3.7.0)
191
+ rspec-mocks (~> 3.7.0)
192
+ rspec-core (3.7.1)
193
+ rspec-support (~> 3.7.0)
194
+ rspec-expectations (3.7.0)
195
+ diff-lcs (>= 1.2.0, < 2.0)
196
+ rspec-support (~> 3.7.0)
197
+ rspec-mocks (3.7.0)
198
+ diff-lcs (>= 1.2.0, < 2.0)
199
+ rspec-support (~> 3.7.0)
200
+ rspec-support (3.7.1)
201
+ rubocop (0.57.2)
202
+ jaro_winkler (~> 1.5.1)
203
+ parallel (~> 1.10)
204
+ parser (>= 2.5)
205
+ powerpack (~> 0.1)
206
+ rainbow (>= 2.2.2, < 4.0)
207
+ ruby-progressbar (~> 1.7)
208
+ unicode-display_width (~> 1.0, >= 1.0.1)
209
+ ruby-jing (0.0.1)
210
+ optout (>= 0.0.2)
211
+ ruby-progressbar (1.9.0)
212
+ ruby-xslt (0.9.10)
213
+ ruby_dep (1.5.0)
214
+ sass (3.5.6)
215
+ sass-listen (~> 4.0.0)
216
+ sass-listen (4.0.0)
217
+ rb-fsevent (~> 0.9, >= 0.9.4)
218
+ rb-inotify (~> 0.9, >= 0.9.7)
219
+ shellany (0.0.1)
220
+ simplecov (0.16.1)
221
+ docile (~> 1.1)
222
+ json (>= 1.8, < 3)
223
+ simplecov-html (~> 0.10.0)
224
+ simplecov-html (0.10.2)
225
+ thor (0.20.0)
226
+ thread_safe (0.3.6)
227
+ timecop (0.9.1)
228
+ twitter_cldr (4.4.3)
229
+ camertron-eprun
230
+ cldr-plurals-runtime-rb (~> 1.0)
231
+ tzinfo
232
+ tzinfo (1.2.5)
233
+ thread_safe (~> 0.1)
234
+ unicode-display_width (1.4.0)
235
+ uuidtools (2.1.5)
236
+
237
+ PLATFORMS
238
+ ruby
239
+
240
+ DEPENDENCIES
241
+ bundler (~> 1.15)
242
+ byebug (~> 9.1)
243
+ equivalent-xml (~> 0.6)
244
+ guard (~> 2.14)
245
+ guard-rspec (~> 4.7)
246
+ metanorma (~> 0.2.5)
247
+ rake (~> 12.0)
248
+ relaton!
249
+ rspec (~> 3.6)
250
+ rubocop (~> 0.50)
251
+ simplecov (~> 0.15)
252
+ timecop (~> 0.9)
253
+
254
+ BUNDLED WITH
255
+ 1.16.2
data/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ BSD 2-Clause License
2
+
3
+ Copyright (c) 2018, Ribose
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ * Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.adoc ADDED
@@ -0,0 +1,17 @@
1
+ = relaton
2
+
3
+ gem for importing and caching bibliographic references to technical standards
4
+
5
+ ```ruby
6
+ x = Relaton.fetch("ISO19011")
7
+ => Relaton::Error "No such fetcher"
8
+
9
+ require 'relaton-iso'
10
+ x = Relaton.fetch("ISO19011")
11
+ => <# Relaton::Iso @docidentifier: "ISO 19011:2011" ... >
12
+
13
+ x.to_xml
14
+ => <bib-item ...>
15
+ ```
16
+
17
+
data/bin/rspec ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'rspec' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require "pathname"
10
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
11
+ "../../Gemfile", Pathname.new(__FILE__).realpath
12
+ )
13
+
14
+ require "rubygems"
15
+ require "bundler/setup"
16
+
17
+ load Gem.bin_path("rspec-core", "rspec")
18
+
data/lib/relaton.rb ADDED
@@ -0,0 +1,4 @@
1
+ require_relative "relaton/relaton"
2
+ require_relative "relaton/version"
3
+ require_relative "relaton/registry"
4
+ require_relative "relaton/processor"
@@ -0,0 +1,16 @@
1
+ module Relaton
2
+ class Processor
3
+
4
+ attr_reader :short
5
+ attr_reader :prefix
6
+
7
+ def initialize
8
+ raise "This is an abstract class!"
9
+ end
10
+
11
+ def get(code, date, opts)
12
+ raise "This is an abstract class!"
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,36 @@
1
+ require 'singleton'
2
+
3
+ class Error < StandardError
4
+ end
5
+
6
+ module Relaton
7
+ class Registry
8
+ include Singleton
9
+
10
+ attr_reader :processors
11
+
12
+ def initialize
13
+ @processors = {}
14
+ end
15
+
16
+ def register processor
17
+ raise Error unless processor < :: Relaton::Processor
18
+ p = processor.new
19
+ puts "[relaton] processor \"#{p.short}\" registered"
20
+ @processors[p.short] = p
21
+ end
22
+
23
+ def find_processor(short)
24
+ @processors[short.to_sym]
25
+ end
26
+
27
+ def supported_processors
28
+ @processors.keys
29
+ end
30
+
31
+ def processors
32
+ @processors
33
+ end
34
+ end
35
+ end
36
+
@@ -0,0 +1,120 @@
1
+ require_relative "registry"
2
+
3
+ module Relaton
4
+ class RelatonError < StandardError; end
5
+
6
+ class Db
7
+ #PREFIXES = ["GB Standard", "IETF", "ISO", "IEC", "IEV"]
8
+
9
+ SUPPORTED_GEMS = %w[ isobib rfcbib gbbib ].freeze
10
+
11
+ def initialize(global_cache, local_cache)
12
+ @bibdb = open_cache_biblio(global_cache)
13
+ @local_bibdb = open_cache_biblio(local_cache)
14
+ @bibdb_name = global_cache
15
+ @local_bibdb_name = local_cache
16
+ register_gems
17
+ @registry = Relaton::Registry.instance
18
+ end
19
+
20
+ def register_gems
21
+ puts "[relaton] detecting backends:"
22
+ SUPPORTED_GEMS.each do |b|
23
+ puts b
24
+ require b
25
+ rescue LoadError
26
+ puts "[relaton] backend #{b} not present"
27
+ end
28
+ end
29
+
30
+ # The class of reference requested is determined by the prefix of the code:
31
+ # GB Standard for gbbib, IETF for rfcbib, ISO or IEC or IEV for isobib
32
+ # @param code [String] the ISO standard Code to look up (e..g "ISO 9000")
33
+ # @param year [String] the year the standard was published (optional)
34
+ # @param opts [Hash] options; restricted to :all_parts if all-parts reference is required
35
+ # @return [String] Relaton XML serialisation of reference
36
+ def fetch(code, year = nil, opts = {})
37
+ stdclass = standard_class(code)
38
+ check_bibliocache(code, year, opts, stdclass)
39
+ end
40
+
41
+ def save()
42
+ save_cache_biblio(@bibdb, @bibdb_name)
43
+ save_cache_biblio(@local_bibdb, @local_bibdb_name)
44
+ end
45
+
46
+ private
47
+
48
+ def standard_class(code)
49
+ =begin
50
+ %r{^GB Standard }.match? code and return :gbbib
51
+ %r{^IETF }.match? code and return :rfcbib
52
+ %r{^(ISO|IEC)[ /]|IEV($| )}.match? code and return :isobib
53
+ =end
54
+ @registry.processors.each do |name, processor|
55
+ processor.prefix.match? code and return name
56
+ end
57
+ raise(RelatonError,
58
+ "#{code} does not have a recognised prefix: "\
59
+ "#{@registry.supported_processors.join(', ')}")
60
+ nil
61
+ end
62
+
63
+ def std_id(code, year, opts, _stdclass)
64
+ ret = code
65
+ ret += ":#{year}" if year
66
+ ret += " (all parts)" if opts[:all_parts]
67
+ ret
68
+ end
69
+
70
+ def check_bibliocache(code, year, opts, stdclass)
71
+ id = std_id(code, year, opts, stdclass)
72
+ return nil if @bibdb.nil? # signals we will not be using isobib
73
+ @bibdb[id] = nil unless is_valid_bibcache_entry?(@bibdb[id], year)
74
+ @bibdb[id] ||= new_bibcache_entry(code, year, opts, stdclass)
75
+ @local_bibdb[id] = @bibdb[id] if !@local_bibdb.nil? &&
76
+ !is_valid_bibcache_entry?(@local_bibdb[id], year)
77
+ return @local_bibdb[id]["bib"] unless @local_bibdb.nil?
78
+ @bibdb[id]["bib"]
79
+ end
80
+
81
+ # hash uses => , because the hash is imported from JSON
82
+ def new_bibcache_entry(code, year, opts, stdclass)
83
+ bib = @registry.processors[stdclass].get(code, year, opts)
84
+ return nil if bib.nil?
85
+ { "fetched" => Date.today, "bib" => bib }
86
+ end
87
+
88
+ # if cached reference is undated, expire it after 60 days
89
+ def is_valid_bibcache_entry?(x, year)
90
+ x && x.is_a?(Hash) && x&.has_key?("bib") && x&.has_key?("fetched") &&
91
+ (year || Date.today - Date.iso8601(x["fetched"]) < 60)
92
+ end
93
+
94
+ def open_cache_biblio(filename)
95
+ biblio = {}
96
+ return {} unless !filename.nil? && Pathname.new(filename).file?
97
+ File.open(filename, "r") { |f| biblio = JSON.parse(f.read) }
98
+ biblio.each do |k, v|
99
+ biblio[k]&.fetch("bib") and
100
+ biblio[k]["bib"] = from_xml(biblio[k]["bib"])
101
+ end
102
+ biblio
103
+ end
104
+
105
+ def from_xml(entry)
106
+ entry # will be unmarshaller
107
+ end
108
+
109
+ def save_cache_biblio(biblio, filename)
110
+ return if biblio.nil? || filename.nil?
111
+ biblio.each do |k, v|
112
+ biblio[k]&.fetch("bib")&.respond_to? :to_xml and
113
+ biblio[k]["bib"] = biblio[k]["bib"].to_xml
114
+ end
115
+ File.open(filename, "w") do |b|
116
+ b << biblio.to_json
117
+ end
118
+ end
119
+ end
120
+ end