relaton 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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