relaton 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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +2 -0
  3. data/docs/README.adoc +73 -1
  4. data/lib/relaton/config.rb +1 -1
  5. data/lib/relaton/db.rb +34 -10
  6. data/lib/relaton/db_cache.rb +14 -5
  7. data/lib/relaton/registry.rb +5 -4
  8. data/lib/relaton/version.rb +1 -1
  9. data/relaton.gemspec +15 -14
  10. data/spec/relaton/db_cache_spec.rb +26 -1
  11. data/spec/relaton/regirtry_spec.rb +7 -3
  12. data/spec/relaton_spec.rb +142 -16
  13. data/spec/spec_helper.rb +10 -5
  14. data/spec/vcr_cassetes/19133_2005.yml +42 -50
  15. data/spec/vcr_cassetes/cc_dir_10005_2019.yml +89 -158
  16. data/spec/vcr_cassetes/ecma_6.yml +473 -0
  17. data/spec/vcr_cassetes/fisp_140.yml +34 -2736
  18. data/spec/vcr_cassetes/gb_t_20223_2006.yml +18 -14
  19. data/spec/vcr_cassetes/hist_cmbined_included.yml +105 -0
  20. data/spec/vcr_cassetes/iec_combined_included.yml +1290 -0
  21. data/spec/vcr_cassetes/ieee_528_2019.yml +59 -49
  22. data/spec/vcr_cassetes/iho_b_11.yml +8 -9
  23. data/spec/vcr_cassetes/iso_111111119115_1.yml +8 -9
  24. data/spec/vcr_cassetes/iso_19115.yml +18 -18
  25. data/spec/vcr_cassetes/iso_19115_1.yml +42 -59
  26. data/spec/vcr_cassetes/iso_19115_1_2.yml +83 -124
  27. data/spec/vcr_cassetes/iso_awi_24229.yml +42 -53
  28. data/spec/vcr_cassetes/iso_combined_applied.yml +361 -0
  29. data/spec/vcr_cassetes/iso_combined_included.yml +361 -0
  30. data/spec/vcr_cassetes/itu_combined_included.yml +1278 -0
  31. data/spec/vcr_cassetes/ogc_19_025r1.yml +22 -11237
  32. data/spec/vcr_cassetes/ogm_ami4ccm_1_0.yml +9 -9
  33. data/spec/vcr_cassetes/rfc_8341.yml +6 -59
  34. data/spec/vcr_cassetes/sp_800_38b.yml +34 -2606
  35. data/spec/vcr_cassetes/un_rtade_cefact_2004_32.yml +179 -150
  36. data/spec/vcr_cassetes/w3c_json_ld11.yml +29 -21
  37. metadata +58 -38
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e6c602c43941a3fbaa3f63c647a229ddde4830a9ae5eebcb077a426bc3cc0d11
4
- data.tar.gz: 91d909efdc5b986ca1c1dce75405a930952ab622252c5478a90b6522a4479c24
3
+ metadata.gz: 47b3cd2f3a5066e5b9bd67b07f02f6811593210e53e16438e5e0ccf32275be11
4
+ data.tar.gz: 677a08b28aff3139512ddc4f37ba0b7cc98f871f3faa80dad3e8fcd224771089
5
5
  SHA512:
6
- metadata.gz: 97a86284b6b88172bcc59f67ca8264f4247b07d8b209f23a336362a50f9e71e3be6bbee89cd77d26d5cad59824fe1e37ff6ad0a89f9c62b42a554245785047b5
7
- data.tar.gz: 79448ae393f6b4e98a746987d83b8f0f8278b7c05268453be948a9c69b34584226d8d54f03aea8b81c62d2018a6a67e7a05cb5c6eba68a7a73880c4df671c971
6
+ metadata.gz: b9379dace67bfc0ac7793b261b9c94306b1425e3794a9b66228cba139b9229b3326a93800da954f26de5c23020cf816655c05af85c592297cbe0b513cddfaa28
7
+ data.tar.gz: 4aaeca235b959c2ec05ce03660639acd65899fdf1af0e96e9ccb5bfa6b6d26a42b9dbb69f1168f7904d36bd29c958ab9cfec3c34a1dc9c107e11c811ec262db1
@@ -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: |
@@ -62,6 +62,8 @@ e.g. `get("ISO 19115-1", "2014", all_parts: true)` is transformed into a referen
62
62
 
63
63
  == Usage
64
64
 
65
+ === Create DB
66
+
65
67
  [source,ruby]
66
68
  ----
67
69
  require "relaton"
@@ -93,7 +95,12 @@ db = Relaton::Db.new("globalcache", "localcache")
93
95
  @local_db=#<Relaton::DbCache:0x007faabc8fa5c0 @dir="localcache", @ext="xml">,
94
96
  @local_db_name="localcache",
95
97
  ...
98
+ ----
99
+
100
+ === Fetch documens
96
101
 
102
+ [source,ruby]
103
+ ----
97
104
  x = db.fetch("IEEE 19011")
98
105
  [relaton-ieee] ("IEEE 19011") fetching...
99
106
  [relaton-ieee] WARNING: no match found online for IEEE 19011. The code must be exactly like it is on the standards website.
@@ -116,10 +123,72 @@ x = db.fetch("ISO 19115", nil, all_parts: true)
116
123
  [relaton-iso] ("ISO 19115") found ISO 19115 (all parts)
117
124
  => #<RelatonIsoBib::IsoBibliographicItem:0x007fb1d0ae8bf0
118
125
  ...
126
+ ----
127
+
128
+ === Fetch combined documents
129
+
130
+ This functionality works only for ISO, IEC, ITU, and NIST documents.
131
+
132
+ ==== Fetch included documents
133
+ [source,ruby]
134
+ ----
135
+ bib = db.fetch "ISO 19115-1 + Amd 1"
136
+ [relaton-iso] ("ISO 19115-1") fetching...
137
+ [relaton-iso] ("ISO 19115-1") found ISO 19115-1:2014
138
+ [relaton-iso] ("ISO 19115-1/Amd 1") fetching...
139
+ [relaton-iso] ("ISO 19115-1/Amd 1") found ISO 19115-1:2014/Amd 1:2018
140
+ => #<RelatonIsoBib::IsoBibliographicItem:0x007f95a929a748
141
+
142
+ bib.docidentifier[0].id
143
+ => "ISO 19115-1 + Amd 1"
144
+
145
+ bib.relation[0].type
146
+ => "updates"
147
+
148
+ bib.relation[0].bibitem.docidentifier[0].id
149
+ => "ISO 19115-1"
150
+
151
+ bib.relation[1].type
152
+ => "derivedFrom"
153
+
154
+ bib.relation[1].bibitem.docidentifier[0].id
155
+ => "ISO 19115-1/Amd 1:2018"
156
+
157
+ bib.docidentifier[0].id
158
+ => "ISO 19115-1, Amd 1"
159
+
160
+ bib.relation[0].type
161
+ => "updates"
119
162
 
163
+ bib.relation[0].bibitem.docidentifier[0].id
164
+ => "ISO 19115-1"
165
+
166
+ bib.relation[1].type
167
+ => "complements"
168
+
169
+ bib.relation[1].description
170
+ => "amendment"
171
+
172
+ bib.relation[1].bibitem.docidentifier[0].id
173
+ => "ISO 19115-1/Amd 1:2018"
174
+ ----
175
+
176
+ ==== Fetch applied documents
177
+ [source,ruby]
178
+ ----
179
+ bib = db.fetch "ISO 19115-1, Amd 1"
180
+ ----
181
+
182
+ === Get document type
183
+ [source,ruby]
184
+ ----
120
185
  db.docid_type("CN(GB/T 1.1)")
121
186
  => ["Chinese Standard", "GB/T 1.1"]
187
+ ----
122
188
 
189
+ === Serializing
190
+ [source,ruby]
191
+ ----
123
192
  x.to_xml
124
193
  => "<bibitem id="ISO19115(allparts)" type="standard">
125
194
  ...
@@ -146,11 +215,14 @@ db.load_entry("ISO(ISO 19011)")
146
215
  => "<bibdata type="standard">
147
216
  ...
148
217
  <?bibdata>"
218
+ ----
149
219
 
220
+ === Entry manipulation
221
+ [source,ruby]
222
+ ----
150
223
  db.save_entry("ISO(ISO 19011)", nil)
151
224
  => nil
152
225
 
153
226
  db.load_entry("ISO(ISO 19011)")
154
227
  => nil
155
-
156
228
  ----
@@ -15,7 +15,7 @@ module Relaton
15
15
  attr_accessor :logs
16
16
 
17
17
  def initialize
18
- @logs ||= %i(warning error)
18
+ @logs = %i(warning error)
19
19
  end
20
20
  end
21
21
 
@@ -28,9 +28,34 @@ module Relaton
28
28
  # RelatonNist::NistBibliongraphicItem, RelatonGb::GbbibliographicItem]
29
29
  def fetch(code, year = nil, opts = {})
30
30
  stdclass = standard_class(code) || return
31
+ cd = combine_doc code, year, opts, stdclass
32
+ return cd if cd
33
+
31
34
  check_bibliocache(code, year, opts, stdclass)
32
35
  end
33
36
 
37
+ def combine_doc(code, year, opts, stdclass)
38
+ if (refs = code.split " + ").size > 1
39
+ reltype = "derivedFrom"
40
+ reldesc = nil
41
+ elsif (refs = code.split ", ").size > 1
42
+ reltype = "complements"
43
+ reldesc = RelatonBib::FormattedString.new content: "amendment"
44
+ else return
45
+ end
46
+
47
+ doc = @registry.processors[stdclass].hash_to_bib docid: { id: code }
48
+ ref = refs[0]
49
+ updates = check_bibliocache(ref, year, opts, stdclass)
50
+ doc.relation << RelatonBib::DocumentRelation.new(bibitem: updates, type: "updates") if updates
51
+ refs[1..-1].each_with_object(doc) do |c, d|
52
+ bib = check_bibliocache("#{ref}/#{c}", year, opts, stdclass)
53
+ if bib
54
+ d.relation << RelatonBib::DocumentRelation.new(type: reltype, description: reldesc, bibitem: bib)
55
+ end
56
+ end
57
+ end
58
+
34
59
  # @param code [String]
35
60
  # @param year [String, NilClass]
36
61
  # @param stdclass [Symbol, NilClass]
@@ -40,9 +65,8 @@ module Relaton
40
65
  @registry.processors.each do |name, processor|
41
66
  std = name if processor.prefix == stdclass
42
67
  end
43
- unless std
44
- std = standard_class(code) or return nil
45
- end
68
+ std = standard_class(code) or return nil unless std
69
+
46
70
  check_bibliocache(code, year, opts, std)
47
71
  end
48
72
 
@@ -97,9 +121,9 @@ module Relaton
97
121
  m << v.prefix
98
122
  end
99
123
  warn <<~WARN
100
- #{code} does not have a recognised prefix: #{allowed.join(', ')}.
101
- See https://github.com/relaton/relaton/ for instructions on prefixing and wrapping document identifiers to disambiguate them.
102
- WARN
124
+ #{code} does not have a recognised prefix: #{allowed.join(', ')}.
125
+ See https://github.com/relaton/relaton/ for instructions on prefixing and wrapping document identifiers to disambiguate them.
126
+ WARN
103
127
  end
104
128
 
105
129
  # TODO: i18n
@@ -133,8 +157,8 @@ module Relaton
133
157
  # @return [NilClass, RelatonIsoBib::IsoBibliographicItem,
134
158
  # RelatonItu::ItuBibliographicItem, RelatonIetf::IetfBibliographicItem,
135
159
  # RelatonNist::NistBibliongraphicItem, RelatonGb::GbbibliographicItem]
136
- def bib_retval(entry, stdclass, id)
137
- entry =~ /^not_found/ ? nil : @registry.processors[stdclass].from_xml(entry)
160
+ def bib_retval(entry, stdclass, _id)
161
+ entry.match?(/^not_found/) ? nil : @registry.processors[stdclass].from_xml(entry)
138
162
  end
139
163
 
140
164
  # @param code [String]
@@ -145,7 +169,7 @@ module Relaton
145
169
  # RelatonItu::ItuBibliographicItem, RelatonIetf::IetfBibliographicItem,
146
170
  # RelatonNist::NistBibliongraphicItem, RelatonGb::GbbibliographicItem,
147
171
  # RelatonOgc::OgcBibliographicItem, RelatonCalconnect::CcBibliographicItem]
148
- def check_bibliocache(code, year, opts, stdclass)
172
+ def check_bibliocache(code, year, opts, stdclass) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
149
173
  id, searchcode = std_id(code, year, opts, stdclass)
150
174
  yaml = @static_db[id]
151
175
  return @registry.processors[stdclass].hash_to_bib YAML.safe_load(yaml) if yaml
@@ -176,7 +200,7 @@ module Relaton
176
200
  # @param db [Relaton::DbCache,`NilClass]
177
201
  # @param id [String] docid
178
202
  # @return [String]
179
- def new_bib_entry(code, year, opts, stdclass, **args)
203
+ def new_bib_entry(code, year, opts, stdclass, **args) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
180
204
  bib = @registry.processors[stdclass].get(code, year, opts)
181
205
  bib_id = bib&.docidentifier&.first&.id
182
206
 
@@ -26,7 +26,7 @@ module Relaton
26
26
  prefix_dir = "#{@dir}/#{prefix(key)}"
27
27
  FileUtils::mkdir_p prefix_dir unless Dir.exist? prefix_dir
28
28
  set_version prefix_dir
29
- File.write "#{filename(key)}.#{ext(value)}", value, encoding: "utf-8"
29
+ file_safe_write "#{filename(key)}.#{ext(value)}", value
30
30
  end
31
31
 
32
32
  # @param value [String]
@@ -65,7 +65,7 @@ module Relaton
65
65
  value = self[key]
66
66
  return unless value
67
67
 
68
- if value =~ /^not_found/
68
+ if value.match? /^not_found/
69
69
  value.match(/\d{4}-\d{2}-\d{2}/).to_s
70
70
  else
71
71
  doc = Nokogiri::XML value
@@ -106,7 +106,7 @@ module Relaton
106
106
  def set_version(fdir)
107
107
  file_version = "#{fdir}/version"
108
108
  unless File.exist? file_version
109
- File.write file_version, grammar_hash(fdir), encoding: "utf-8"
109
+ file_safe_write file_version, grammar_hash(fdir)
110
110
  end
111
111
  self
112
112
  end
@@ -159,7 +159,7 @@ module Relaton
159
159
  def filename(key)
160
160
  prefcode = key.downcase.match /^(?<prefix>[^\(]+)\((?<code>[^\)]+)/
161
161
  fn = if prefcode
162
- "#{prefcode[:prefix]}/#{prefcode[:code].gsub(/[-:\s\/\()]/, '_').squeeze("_")}"
162
+ "#{prefcode[:prefix]}/#{prefcode[:code].gsub(/[-:\s\/\()]/, '_').squeeze('_')}"
163
163
  else
164
164
  key.gsub(/[-:\s]/, "_")
165
165
  end
@@ -189,6 +189,15 @@ module Relaton
189
189
  key.downcase.match(/^[^\(]+(?=\()/).to_s
190
190
  end
191
191
 
192
+ # @param file [String]
193
+ # @content [String]
194
+ def file_safe_write(file, content)
195
+ File.open file, File::RDWR | File::CREAT, encoding: "UTF-8" do |f|
196
+ Timeout.timeout(1) { f.flock File::LOCK_EX }
197
+ f.write content
198
+ end
199
+ end
200
+
192
201
  class << self
193
202
  private
194
203
 
@@ -209,7 +218,7 @@ module Relaton
209
218
  # local_cache: local cache name; none created if nil; "relaton" created
210
219
  # if empty global_cache: boolean to create global_cache
211
220
  # flush_caches: flush caches
212
- def init_bib_caches(opts)
221
+ def init_bib_caches(opts) # rubocop:disable Metrics/CyclomaticComplexity
213
222
  globalname = global_bibliocache_name if opts[:global_cache]
214
223
  localname = local_bibliocache_name(opts[:local_cache])
215
224
  localname = "relaton" if localname&.empty?
@@ -8,7 +8,7 @@ module Relaton
8
8
  SUPPORTED_GEMS = %w[
9
9
  relaton_gb relaton_iec relaton_ietf relaton_iso relaton_itu relaton_nist
10
10
  relaton_ogc relaton_calconnect relaton_omg relaton_un relaton_w3c
11
- relaton_ieee relaton_iho relaton_bipm
11
+ relaton_ieee relaton_iho relaton_bipm relaton_ecma
12
12
  ].freeze
13
13
 
14
14
  include Singleton
@@ -57,9 +57,10 @@ module Relaton
57
57
  # Find processor by type
58
58
  #
59
59
  # @param type [String]
60
- # @return [RelatonIso::Processor, RelatonIec::Processor, RelatonNist::Processor,
61
- # RelatonIetf::Processot, RelatonItu::Processor, RelatonGb::Processor,
62
- # RelatonOgc::Processor, RelatonCalconnect::Processor]
60
+ # @return [RelatonIso::Processor, RelatonIec::Processor,
61
+ # RelatonNist::Processor, RelatonIetf::Processot, RelatonItu::Processor,
62
+ # RelatonGb::Processor, RelatonOgc::Processor,
63
+ # RelatonCalconnect::Processor]
63
64
  def by_type(type)
64
65
  processors.values.detect { |v| v.prefix == type&.upcase }
65
66
  end
@@ -1,3 +1,3 @@
1
1
  module Relaton
2
- VERSION = "1.5.0".freeze
2
+ VERSION = "1.7.2".freeze
3
3
  end
@@ -30,20 +30,21 @@ Gem::Specification.new do |spec|
30
30
  spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
31
31
 
32
32
  # spec.add_dependency "algoliasearch"
33
- spec.add_dependency "relaton-bipm", "~> 1.5.0"
34
- spec.add_dependency "relaton-calconnect", "~> 1.5.0"
35
- spec.add_dependency "relaton-gb", "~> 1.5.0"
36
- spec.add_dependency "relaton-iec", "~> 1.5.0"
37
- spec.add_dependency "relaton-ieee", "~> 1.5.0"
38
- spec.add_dependency "relaton-ietf", "~> 1.5.0"
39
- spec.add_dependency "relaton-iho", "~> 1.5.0"
40
- spec.add_dependency "relaton-iso", "~> 1.5.0"
41
- spec.add_dependency "relaton-itu", "~> 1.5.0"
42
- spec.add_dependency "relaton-nist", "~> 1.5.0"
43
- spec.add_dependency "relaton-ogc", "~> 1.5.0"
44
- spec.add_dependency "relaton-omg", "~> 1.5.0"
45
- spec.add_dependency "relaton-un", "~> 1.5.0"
46
- spec.add_dependency "relaton-w3c", "~> 1.5.0"
33
+ spec.add_dependency "relaton-bipm", "~> 1.7.0"
34
+ spec.add_dependency "relaton-calconnect", "~> 1.7.0"
35
+ spec.add_dependency "relaton-ecma", "1.7.pre1"
36
+ spec.add_dependency "relaton-gb", "~> 1.7.0"
37
+ spec.add_dependency "relaton-iec", ">= 1.7.3"
38
+ spec.add_dependency "relaton-ieee", "~> 1.7.0"
39
+ spec.add_dependency "relaton-ietf", "~> 1.7.0"
40
+ spec.add_dependency "relaton-iho", "~> 1.7.0"
41
+ spec.add_dependency "relaton-iso", ">= 1.7.1"
42
+ spec.add_dependency "relaton-itu", ">= 1.7.2"
43
+ spec.add_dependency "relaton-nist", ">= 1.7.1"
44
+ spec.add_dependency "relaton-ogc", "~> 1.7.0"
45
+ spec.add_dependency "relaton-omg", "~> 1.7.0"
46
+ spec.add_dependency "relaton-un", "~> 1.7.0"
47
+ spec.add_dependency "relaton-w3c", "~> 1.7.0"
47
48
 
48
49
  spec.add_development_dependency "byebug", "~> 11.0"
49
50
  spec.add_development_dependency "debase"
@@ -1,13 +1,38 @@
1
+ require "fileutils"
2
+ require "timeout"
3
+
1
4
  RSpec.describe Relaton::DbCache do
2
5
  it "creates default caches" do
3
6
  cache_path = File.expand_path("~/.relaton/cache")
4
7
  FileUtils.mv cache_path, "relaton1/cache", force: true
5
8
  FileUtils.rm_rf %w(relaton)
6
9
  Relaton::DbCache.init_bib_caches(
7
- global_cache: true, local_cache: "", flush_caches: true,
10
+ global_cache: true, local_cache: "", flush_caches: true
8
11
  )
9
12
  expect(File.exist?(cache_path)).to be true
10
13
  expect(File.exist?("relaton")).to be true
11
14
  FileUtils.mv "relaton1/cache", cache_path if File.exist? "relaton1"
12
15
  end
16
+
17
+ it "write same file by concurent processes" do
18
+ dir = "testcache/iso"
19
+ FileUtils.mkdir_p dir unless File.exist? dir
20
+ file_name = File.join dir, "iso_123.xml"
21
+ file = File.open file_name, File::RDWR | File::CREAT, encoding: "UTF-8"
22
+ file.flock File::LOCK_EX
23
+ command = <<~RBY
24
+ require "relaton"
25
+ cache = Relaton::DbCache.new "testcache"
26
+ cache["ISO(ISO 123)"] = "test 1"
27
+ RBY
28
+ pid = spawn RbConfig.ruby, "-e #{command}"
29
+ sleep 0.1
30
+ file.write "test 2"
31
+ file.flock File::LOCK_UN
32
+ file.close
33
+ Process.waitpid pid, 0
34
+ expect($?.exitstatus).to eq 0
35
+ expect(File.read(file_name)).to eq "test 1"
36
+ FileUtils.rm_rf "testcache"
37
+ end
13
38
  end
@@ -2,13 +2,13 @@ RSpec.describe Relaton::Registry do
2
2
  it "outputs backend not present" do
3
3
  stub_const "Relaton::Registry::SUPPORTED_GEMS", ["not_supported_gem"]
4
4
  expect { Relaton::Registry.clone.instance }.to output(
5
- /backend not_supported_gem not present/,
5
+ /backend not_supported_gem not present/
6
6
  ).to_stdout
7
7
  end
8
8
 
9
9
  it "finds ISO processor" do
10
- expect(Relaton::Registry.instance.find_processor("relaton_iso")).
11
- to be_instance_of RelatonIso::Processor
10
+ expect(Relaton::Registry.instance.find_processor("relaton_iso"))
11
+ .to be_instance_of RelatonIso::Processor
12
12
  end
13
13
 
14
14
  it "returns supported processors" do
@@ -70,4 +70,8 @@ RSpec.describe Relaton::Registry do
70
70
  it "finds processor by type" do
71
71
  expect(Relaton::Registry.instance.by_type("BIPM")).to be_instance_of RelatonBipm::Processor
72
72
  end
73
+
74
+ it "finds processor by type" do
75
+ expect(Relaton::Registry.instance.by_type("ECMA")).to be_instance_of RelatonEcma::Processor
76
+ end
73
77
  end
@@ -5,7 +5,9 @@ RSpec.describe Relaton::Db do
5
5
  end
6
6
 
7
7
  it "rejects an illegal reference prefix" do
8
- expect { @db.fetch("XYZ XYZ", nil, {}) }.to output(/does not have a recognised prefix/).to_stderr
8
+ expect { @db.fetch("XYZ XYZ", nil, {}) }.to output(
9
+ /does not have a recognised prefix/
10
+ ).to_stderr
9
11
  end
10
12
 
11
13
  context "gets an ISO reference" do
@@ -13,13 +15,16 @@ RSpec.describe Relaton::Db do
13
15
  VCR.use_cassette "iso_19115_1" do
14
16
  bib = @db.fetch("ISO 19115-1", nil, {})
15
17
  expect(bib).to be_instance_of RelatonIsoBib::IsoBibliographicItem
16
- expect(bib.to_xml(bibdata: true)).to include "<project-number>ISO 19115</project-number>"
18
+ expect(bib.to_xml(bibdata: true)).to include "<project-number>"\
19
+ "ISO 19115</project-number>"
17
20
  expect(File.exist?("testcache")).to be true
18
21
  expect(File.exist?("testcache2")).to be true
19
22
  testcache = Relaton::DbCache.new "testcache"
20
- expect(testcache["ISO(ISO 19115-1)"]).to include "<project-number>ISO 19115</project-number>"
23
+ expect(testcache["ISO(ISO 19115-1)"]).to include "<project-number>"\
24
+ "ISO 19115</project-number>"
21
25
  testcache = Relaton::DbCache.new "testcache2"
22
- expect(testcache["ISO(ISO 19115-1)"]).to include "<project-number>ISO 19115</project-number>"
26
+ expect(testcache["ISO(ISO 19115-1)"]).to include "<project-number>"\
27
+ "ISO 19115</project-number>"
23
28
  end
24
29
  bib = @db.fetch("ISO 19115-1", nil, {})
25
30
  expect(bib).to be_instance_of RelatonIsoBib::IsoBibliographicItem
@@ -29,9 +34,12 @@ RSpec.describe Relaton::Db do
29
34
  VCR.use_cassette "19133_2005" do
30
35
  bib = @db.fetch("ISO 19133:2005")
31
36
  expect(bib).to be_instance_of RelatonIsoBib::IsoBibliographicItem
32
- expect(bib.to_xml).to include '<bibitem id="ISO19133-2005" type="standard">'
37
+ expect(bib.to_xml).to include '<bibitem id="ISO19133-2005" '\
38
+ 'type="standard">'
33
39
  testcache = Relaton::DbCache.new "testcache"
34
- expect(testcache.valid_entry?("ISO(ISO 19133:2005)", Date.today.year.to_s)).to eq Date.today.year.to_s
40
+ expect(
41
+ testcache.valid_entry?("ISO(ISO 19133:2005)", Date.today.year.to_s)
42
+ ).to eq Date.today.year.to_s
35
43
  end
36
44
  end
37
45
 
@@ -60,6 +68,13 @@ RSpec.describe Relaton::Db do
60
68
  end
61
69
 
62
70
  context "NIST references" do
71
+ before(:each) do
72
+ nist_fr = /\.relaton\/nist\/pubs-export\.zip/
73
+ expect(File).to receive(:exist?).with(nist_fr).and_return false
74
+ expect(File).to receive(:exist?).and_call_original.at_least :once
75
+ # expect(FileUtils).to receive(:mv).with kind_of(String), nist_fr
76
+ end
77
+
63
78
  it "gets FISP" do
64
79
  VCR.use_cassette "fisp_140" do
65
80
  bib = @db.fetch "NIST FIPS 140"
@@ -119,13 +134,19 @@ RSpec.describe Relaton::Db do
119
134
  VCR.use_cassette "gb_t_20223_2006" do
120
135
  bib = @db.fetch "CN(GB/T 20223)", "2006", {}
121
136
  expect(bib).to be_instance_of RelatonGb::GbBibliographicItem
122
- expect(bib.to_xml(bibdata: true)).to include "<project-number>GB/T 20223</project-number>"
137
+ expect(bib.to_xml(bibdata: true)).to include <<~XML
138
+ <project-number>GB/T 20223</project-number>
139
+ XML
123
140
  expect(File.exist?("testcache")).to be true
124
141
  expect(File.exist?("testcache2")).to be true
125
142
  testcache = Relaton::DbCache.new "testcache"
126
- expect(testcache["CN(GB/T 20223:2006)"]).to include "<project-number>GB/T 20223</project-number>"
143
+ expect(testcache["CN(GB/T 20223:2006)"]).to include <<~XML
144
+ <project-number>GB/T 20223</project-number>
145
+ XML
127
146
  testcache = Relaton::DbCache.new "testcache2"
128
- expect(testcache["CN(GB/T 20223:2006)"]).to include "<project-number>GB/T 20223</project-number>"
147
+ expect(testcache["CN(GB/T 20223:2006)"]).to include <<~XML
148
+ <project-number>GB/T 20223</project-number>
149
+ XML
129
150
  end
130
151
  end
131
152
 
@@ -133,13 +154,19 @@ RSpec.describe Relaton::Db do
133
154
  VCR.use_cassette "gb_t_20223_2006" do
134
155
  bib = @db.fetch "CN(GB/T 20223-2006)", nil, {}
135
156
  expect(bib).to be_instance_of RelatonGb::GbBibliographicItem
136
- expect(bib.to_xml(bibdata: true)).to include "<project-number>GB/T 20223</project-number>"
157
+ expect(bib.to_xml(bibdata: true)).to include <<~XML
158
+ <project-number>GB/T 20223</project-number>
159
+ XML
137
160
  expect(File.exist?("testcache")).to be true
138
161
  expect(File.exist?("testcache2")).to be true
139
162
  testcache = Relaton::DbCache.new "testcache"
140
- expect(testcache["CN(GB/T 20223:2006)"]).to include "<project-number>GB/T 20223</project-number>"
163
+ expect(testcache["CN(GB/T 20223:2006)"]).to include <<~XML
164
+ <project-number>GB/T 20223</project-number>
165
+ XML
141
166
  testcache = Relaton::DbCache.new "testcache2"
142
- expect(testcache["CN(GB/T 20223:2006)"]).to include "<project-number>GB/T 20223</project-number>"
167
+ expect(testcache["CN(GB/T 20223:2006)"]).to include <<~XML
168
+ <project-number>GB/T 20223</project-number>
169
+ XML
143
170
  end
144
171
  end
145
172
  end
@@ -152,9 +179,11 @@ RSpec.describe Relaton::Db do
152
179
  expect(File.exist?("testcache")).to be true
153
180
  expect(File.exist?("testcache2")).to be true
154
181
  testcache = Relaton::DbCache.new "testcache"
155
- expect(testcache["IETF(RFC 8341)"]).to include "<docidentifier type=\"IETF\">RFC 8341</docidentifier>"
182
+ expect(testcache["IETF(RFC 8341)"]).to include "<docidentifier "\
183
+ "type=\"IETF\">RFC 8341</docidentifier>"
156
184
  testcache = Relaton::DbCache.new "testcache2"
157
- expect(testcache["IETF(RFC 8341)"]).to include "<docidentifier type=\"IETF\">RFC 8341</docidentifier>"
185
+ expect(testcache["IETF(RFC 8341)"]).to include "<docidentifier "\
186
+ "type=\"IETF\">RFC 8341</docidentifier>"
158
187
  end
159
188
  end
160
189
 
@@ -166,6 +195,13 @@ RSpec.describe Relaton::Db do
166
195
  end
167
196
 
168
197
  it "get Calconnect refrence and cache it" do
198
+ cc_fr = /\.relaton\/calconnect\/bibliography\.yml/
199
+ expect(File).to receive(:exist?).with(cc_fr).and_return false
200
+ expect(File).to receive(:exist?).with(/etag\.txt/).and_return false
201
+ expect(File).to receive(:exist?).and_call_original.at_least :once
202
+ expect(File).to receive(:write).with(cc_fr, kind_of(String), kind_of(Hash))
203
+ .at_most :once
204
+ expect(File).to receive(:write).and_call_original.at_least :once
169
205
  VCR.use_cassette "cc_dir_10005_2019", match_requests_on: [:path] do
170
206
  bib = @db.fetch "CC/DIR 10005:2019", nil, {}
171
207
  expect(bib).to be_instance_of RelatonCalconnect::CcBibliographicItem
@@ -187,6 +223,11 @@ RSpec.describe Relaton::Db do
187
223
  end
188
224
 
189
225
  it "get W3C reference" do
226
+ w3c_fr = /\.relaton\/w3c\/bibliography\.yml/
227
+ expect(File).to receive(:exist?).with(w3c_fr).and_return false
228
+ expect(File).to receive(:exist?).and_call_original.at_least :once
229
+ expect(File).to receive(:write).with w3c_fr, kind_of(String), kind_of(Hash)
230
+ # expect(File).to receive(:write).and_call_original.at_least :once
190
231
  VCR.use_cassette "w3c_json_ld11" do
191
232
  bib = @db.fetch "W3C JSON-LD 1.1", nil, {}
192
233
  expect(bib).to be_instance_of RelatonW3c::W3cBibliographicItem
@@ -207,6 +248,89 @@ RSpec.describe Relaton::Db do
207
248
  end
208
249
  end
209
250
 
251
+ it "get ECMA reference" do
252
+ VCR.use_cassette "ecma_6" do
253
+ bib = @db.fetch "ECMA-6"
254
+ expect(bib).to be_instance_of RelatonBib::BibliographicItem
255
+ end
256
+ end
257
+
258
+ context "get combined documents" do
259
+ context "ISO" do
260
+ it "included" do
261
+ VCR.use_cassette "iso_combined_included" do
262
+ bib = @db.fetch "ISO 19115-1 + Amd 1"
263
+ expect(bib.docidentifier[0].id).to eq "ISO 19115-1 + Amd 1"
264
+ expect(bib.relation[0].type).to eq "updates"
265
+ expect(bib.relation[0].bibitem.docidentifier[0].id).to eq "ISO 19115-1"
266
+ expect(bib.relation[1].type).to eq "derivedFrom"
267
+ expect(bib.relation[1].description).to be_nil
268
+ expect(bib.relation[1].bibitem.docidentifier[0].id).to eq "ISO 19115-1/Amd 1:2018"
269
+ end
270
+ end
271
+
272
+ it "applied" do
273
+ VCR.use_cassette "iso_combined_applied" do
274
+ bib = @db.fetch "ISO 19115-1, Amd 1"
275
+ expect(bib.docidentifier[0].id).to eq "ISO 19115-1, Amd 1"
276
+ expect(bib.relation[0].type).to eq "updates"
277
+ expect(bib.relation[0].bibitem.docidentifier[0].id).to eq "ISO 19115-1"
278
+ expect(bib.relation[1].type).to eq "complements"
279
+ expect(bib.relation[1].description.content).to eq "amendment"
280
+ expect(bib.relation[1].bibitem.docidentifier[0].id).to eq "ISO 19115-1/Amd 1:2018"
281
+ end
282
+ end
283
+ end
284
+
285
+ context "IEC" do
286
+ it "included" do
287
+ VCR.use_cassette "iec_combined_included" do
288
+ bib = @db.fetch "IEC 60027-1, Amd 1, Amd 2"
289
+ expect(bib.docidentifier[0].id).to eq "IEC 60027-1, Amd 1, Amd 2"
290
+ expect(bib.relation[0].type).to eq "updates"
291
+ expect(bib.relation[0].bibitem.docidentifier[0].id).to eq "IEC 60027-1"
292
+ expect(bib.relation[1].type).to eq "complements"
293
+ expect(bib.relation[1].description.content).to eq "amendment"
294
+ expect(bib.relation[1].bibitem.docidentifier[0].id).to eq "IEC 60027-1/AMD1:1997"
295
+ expect(bib.relation[2].type).to eq "complements"
296
+ expect(bib.relation[2].description.content).to eq "amendment"
297
+ expect(bib.relation[2].bibitem.docidentifier[0].id).to eq "IEC 60027-1/AMD2:2005"
298
+ end
299
+ end
300
+ end
301
+
302
+ context "ITU" do
303
+ it "included" do
304
+ VCR.use_cassette "itu_combined_included" do
305
+ bib = @db.fetch "ITU-T G.989.2, Amd 1, Amd 2"
306
+ expect(bib.docidentifier[0].id).to eq "ITU-T G.989.2, Amd 1, Amd 2"
307
+ expect(bib.relation[0].type).to eq "updates"
308
+ expect(bib.relation[0].bibitem.docidentifier[0].id).to eq "ITU-T G.989.2"
309
+ expect(bib.relation[1].type).to eq "complements"
310
+ expect(bib.relation[1].description.content).to eq "amendment"
311
+ expect(bib.relation[1].bibitem.docidentifier[0].id).to eq "ITU-T G.989.2/Amd 1"
312
+ expect(bib.relation[2].type).to eq "complements"
313
+ expect(bib.relation[2].description.content).to eq "amendment"
314
+ expect(bib.relation[2].bibitem.docidentifier[0].id).to eq "ITU-T G.989.2/Amd 2"
315
+ end
316
+ end
317
+ end
318
+
319
+ context "HIST" do
320
+ it "included" do
321
+ VCR.use_cassette "hist_cmbined_included" do
322
+ bib = @db.fetch "NIST SP 800-38A, Add"
323
+ expect(bib.docidentifier[0].id).to eq "NIST SP 800-38A, Add"
324
+ expect(bib.relation[0].type).to eq "updates"
325
+ expect(bib.relation[0].bibitem.docidentifier[0].id).to eq "SP 800-38A"
326
+ expect(bib.relation[1].type).to eq "complements"
327
+ expect(bib.relation[1].description.content).to eq "amendment"
328
+ expect(bib.relation[1].bibitem.docidentifier[0].id).to eq "SP 800-38A-Add"
329
+ end
330
+ end
331
+ end
332
+ end
333
+
210
334
  context "version control" do
211
335
  before(:each) { @db.save_entry "iso(test_key)", value: "test_value" }
212
336
 
@@ -222,8 +346,10 @@ RSpec.describe Relaton::Db do
222
346
  expect(File.exist?("testcache")).to be true
223
347
  expect(File.exist?("testcache2")).to be true
224
348
  processor = double
225
- expect(processor).to receive(:grammar_hash).and_return("new_version").exactly(2).times
226
- expect(Relaton::Registry.instance).to receive(:by_type).and_return(processor).exactly(2).times
349
+ expect(processor).to receive(:grammar_hash).and_return("new_version")
350
+ .exactly(2).times
351
+ expect(Relaton::Registry.instance).to receive(:by_type)
352
+ .and_return(processor).exactly(2).times
227
353
  db = Relaton::Db.new "testcache", "testcache2"
228
354
  testcache = db.instance_variable_get :@db
229
355
  expect(testcache.all).not_to be_any