qa 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 85e4df1dd651f734f74b024a0414e4d9f7a919ca
4
- data.tar.gz: 8308624003069a7af0b16a5248683691acd4ccdc
3
+ metadata.gz: 04f7b6155dd96973d581100cf2a1dd4a3d354a9e
4
+ data.tar.gz: fb7def7c149256be271a7b95de1d784f089218f7
5
5
  SHA512:
6
- metadata.gz: 579dbb01782116c072173f4ca96ae6b142f20a98161c308edb08365da03d52520123483d9d63ea4ed8159197fd94739a1483f91a965920f57aa432b4ef1eee25
7
- data.tar.gz: 3ac918adcb01206d99ac08c97ef1e9185f6b2f35c9442fa4cabf2d86dad64ee892c11478488144b320c3da1a97aa2aca6cb4f6ad49ce49eec2d72903b71afcf4
6
+ metadata.gz: 0a19a175ac1cb3b84fd9af171a426229bf0b757c3daf5a1f76dd95fc6074ed8950f233d97aaaeba0d127f0e0eb7e7fedbeb304f530abf82036a1947d0a46b71a
7
+ data.tar.gz: 52cea5dc60f4758990f9bc8c73652c1f7396abd9d3b894d0357ae912e794f9e526a8ef2cfa35ead7aca8129a1c16611541fc0fdb1029e1c02cb30754b7b04bc1
data/README.md CHANGED
@@ -166,11 +166,12 @@ Qa::Authorities::Geonames.username = 'myAccountName'
166
166
 
167
167
  ### Local Authorities
168
168
 
169
+ #### In YAML files
169
170
  For simple use cases when you have a few terms that don't change very often.
170
171
 
171
172
  Run the generator to install configuration files and an example authority.
172
173
 
173
- rails generate qa:local
174
+ rails generate qa:local:files
174
175
 
175
176
  This will install a sample states authority file that lists all the states in the U.S. To query it,
176
177
 
@@ -230,6 +231,44 @@ The second argument is a name of a class that represents your local authority. T
230
231
 
231
232
  You'll be searching with an instance of `LocalNames`
232
233
 
234
+ ### In database tables
235
+
236
+ Run the generator to install configuration files and an example authority.
237
+
238
+ rails generate qa:local:tables
239
+ rake db:migrate
240
+
241
+ This will create two tables/models Qa::LocalAuthority and Qa::LocalAuthorityEntry. You can then add terms to each:
242
+
243
+ language_auth = Qa::LocalAuthority.find_or_create_by(name: 'language')
244
+ Qa::LocalAuthorityEntry.create(local_authority: language_auth,
245
+ label: 'French',
246
+ uri: 'http://id.loc.gov/vocabulary/languages/fre')
247
+ Qa::LocalAuthorityEntry.create(local_authority: language_auth,
248
+ label: 'Uighur',
249
+ uri: 'http://id.loc.gov/vocabulary/languages/uig')
250
+
251
+ Unfortunately, Rails doesn't have a mechnism for adding functional indexes to tables, so if you have a lot of rows, you'll want to add an index:
252
+
253
+ CREATE INDEX "index_qa_local_authority_entries_on_lower_label" ON
254
+ "qa_local_authority_entries" (local_authority_id, lower(label))
255
+
256
+ Finall you want register your authority in an initializer:
257
+
258
+ Qa::Authorities::Local.register_subauthority('languages', 'Qa::Authorities::Local::TableBasedAuthority')
259
+
260
+ Then you can search for
261
+
262
+ /qa/search/local/languages?q=Fre
263
+
264
+ Results are in JSON.
265
+
266
+ [{"id":"http://id.loc.gov/vocabulary/languages/fre","label":"French"}]
267
+
268
+ The entire list (up to the first 1000 terms) can also be returned using:
269
+
270
+ /qa/terms/local/languages/
271
+
233
272
 
234
273
  ### Medical Subject Headings (MeSH)
235
274
 
@@ -1 +1,3 @@
1
- AUTHORITIES_CONFIG = YAML.load_file(File.expand_path("../../authorities.yml", __FILE__))
1
+ Qa::Authorities::Local.load_config(File.expand_path("../../authorities.yml", __FILE__))
2
+
3
+ Qa::Authorities::Local::TableBasedAuthority.check_for_index
@@ -0,0 +1,10 @@
1
+ module Qa::Local
2
+ class FilesGenerator < Rails::Generators::Base
3
+ source_root File.expand_path('../../templates', __FILE__)
4
+
5
+ def copy_local_authority_configs
6
+ copy_file "config/authorities.yml", "config/authorities.yml"
7
+ directory "config/authorities"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,19 @@
1
+ require 'rails/generators/active_record/migration'
2
+ module Qa::Local
3
+ class TablesGenerator < Rails::Generators::Base
4
+ source_root File.expand_path('../templates', __FILE__)
5
+ include ActiveRecord::Generators::Migration
6
+
7
+ def migrations
8
+ generate "model qa/local_authority name:string:uniq"
9
+ generate "model qa/local_authority_entry local_authority:references label:string uri:string:uniq"
10
+ message = "Rails doesn't support functional indexes in migrations, so you'll have to add this manually:\n" \
11
+ "CREATE INDEX \"index_qa_local_authority_entries_on_lower_label\" ON \"qa_local_authority_entries\" (local_authority_id, lower(label))\n" \
12
+ " OR on Sqlite: \n" \
13
+ "CREATE INDEX \"index_qa_local_authority_entries_on_lower_label\" ON \"qa_local_authority_entries\" (local_authority_id, label collate nocase)\n"
14
+ say_status("info", message, :yellow)
15
+ end
16
+
17
+ end
18
+ end
19
+
@@ -0,0 +1,6 @@
1
+ class AddIndexToLocalAuthorities < ActiveRecord::Migration
2
+ # we'd like to be able to run this, but rails quotes the functional index.
3
+ # add_index :local_authority_entries,
4
+ # ['local_authority_id', 'lower(label)'],
5
+ # name: 'index_local_authority_entries_on_lower_label'
6
+ end
@@ -2,9 +2,17 @@ module Qa::Authorities
2
2
  class Geonames < Base
3
3
  include WebServiceBase
4
4
 
5
- class_attribute :username
5
+ class_attribute :username, :label
6
+
7
+ self.label = -> (item) do
8
+ [item['name'], item['adminName1'], item['countryName']].compact.join(', ')
9
+ end
6
10
 
7
11
  def search q
12
+ unless username
13
+ Rails.logger.error "Questioning Authority tried to call geonames, but no username was set"
14
+ return []
15
+ end
8
16
  parse_authority_response(json(build_query_url(q)))
9
17
  end
10
18
 
@@ -36,8 +44,9 @@ module Qa::Authorities
36
44
  def parse_authority_response(response)
37
45
  response['geonames'].map do |result|
38
46
  { 'id' => "http://sws.geonames.org/#{result['geonameId']}",
39
- 'label' => result['name'] }
47
+ 'label' => label.call(result) }
40
48
  end
41
49
  end
50
+
42
51
  end
43
52
  end
@@ -1,9 +1,36 @@
1
1
  module Qa::Authorities
2
2
  module Local
3
+ extend ActiveSupport::Autoload
3
4
  extend AuthorityWithSubAuthority
4
- extend Qa::Authorities::LocalSubauthority
5
- require 'qa/authorities/local/file_based_authority'
5
+ autoload :FileBasedAuthority
6
+ autoload :Registry
7
+ autoload :TableBasedAuthority
6
8
 
9
+ def self.config
10
+ @config
11
+ end
12
+
13
+ def self.load_config(file)
14
+ @config = YAML.load_file(file)
15
+ end
16
+
17
+ # Path to sub-authority files is either the full path to a directory or
18
+ # the path to a directory relative to the Rails application
19
+ def self.subauthorities_path
20
+ if config[:local_path].starts_with?(File::Separator)
21
+ config[:local_path]
22
+ else
23
+ File.join(Rails.root, config[:local_path])
24
+ end
25
+ end
26
+
27
+ # Local sub-authorities are any YAML files in the subauthorities_path
28
+ def self.names
29
+ unless Dir.exists? subauthorities_path
30
+ raise Qa::ConfigDirectoryNotFound, "There's no directory at #{subauthorities_path}. You must create it in order to use local authorities"
31
+ end
32
+ Dir.entries(subauthorities_path).map { |f| File.basename(f, ".yml") if f.match(/yml$/) }.compact
33
+ end
7
34
 
8
35
  def self.subauthority_for(subauthority)
9
36
  validate_subauthority!(subauthority)
@@ -18,7 +45,6 @@ module Qa::Authorities
18
45
  end
19
46
  end
20
47
 
21
-
22
48
  def self.register_subauthority(subauthority, class_name)
23
49
  registry.add(subauthority, class_name)
24
50
  end
@@ -33,54 +59,5 @@ module Qa::Authorities
33
59
  reg.add(name, 'Qa::Authorities::Local::FileBasedAuthority')
34
60
  end
35
61
  end
36
-
37
- class Registry
38
- def initialize
39
- @hash = {}
40
- yield self if block_given?
41
- end
42
-
43
- def keys
44
- @hash.keys
45
- end
46
-
47
- def instance_for(key)
48
- fetch(key).instance
49
- end
50
-
51
- def fetch(key)
52
- @hash.fetch(key)
53
- end
54
-
55
- def self.logger
56
- @logger ||= begin
57
- ::Rails.logger if defined? Rails and Rails.respond_to? :logger
58
- end
59
- end
60
-
61
- def self.logger= logger
62
- @logger = logger
63
- end
64
-
65
- def add(subauthority, class_name)
66
- Registry.logger.debug "Registering Local QA authority: #{subauthority} - #{class_name}"
67
- @hash[subauthority] = RegistryEntry.new(subauthority, class_name)
68
- end
69
-
70
-
71
- class RegistryEntry
72
- def initialize(subauthority, class_name)
73
- @subauthority, @class_name = subauthority, class_name
74
- end
75
-
76
- def klass
77
- @class_name.constantize
78
- end
79
-
80
- def instance
81
- klass.new(@subauthority)
82
- end
83
- end
84
- end
85
62
  end
86
63
  end
@@ -0,0 +1,52 @@
1
+ module Qa::Authorities
2
+ module Local
3
+ class Registry
4
+ def initialize
5
+ @hash = {}
6
+ yield self if block_given?
7
+ end
8
+
9
+ def keys
10
+ @hash.keys
11
+ end
12
+
13
+ def instance_for(key)
14
+ fetch(key).instance
15
+ end
16
+
17
+ def fetch(key)
18
+ @hash.fetch(key)
19
+ end
20
+
21
+ def self.logger
22
+ @logger ||= begin
23
+ ::Rails.logger if defined? Rails and Rails.respond_to? :logger
24
+ end
25
+ end
26
+
27
+ def self.logger= logger
28
+ @logger = logger
29
+ end
30
+
31
+ def add(subauthority, class_name)
32
+ Registry.logger.debug "Registering Local QA authority: #{subauthority} - #{class_name}"
33
+ @hash[subauthority] = RegistryEntry.new(subauthority, class_name)
34
+ end
35
+
36
+
37
+ class RegistryEntry
38
+ def initialize(subauthority, class_name)
39
+ @subauthority, @class_name = subauthority, class_name
40
+ end
41
+
42
+ def klass
43
+ @class_name.constantize
44
+ end
45
+
46
+ def instance
47
+ klass.new(@subauthority)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,53 @@
1
+ module Qa::Authorities
2
+ class Local::TableBasedAuthority < Base
3
+ def self.check_for_index
4
+ conn = ActiveRecord::Base.connection
5
+ if conn.table_exists?('local_authority_entries') && !conn.indexes('local_authority_entries').find { |i| i.name == 'index_local_authority_entries_on_lower_label' }
6
+ Rails.logger.error "You've installed local authority tables, but you haven't indexed the label. Rails doesn't support functional indexes in migrations, so you'll have to add this manually:\n" \
7
+ "CREATE INDEX \"index_qa_local_authority_entries_on_lower_label\" ON \"qa_local_authority_entries\" (local_authority_id, lower(label))\n" \
8
+ " OR on Sqlite: \n" \
9
+ "CREATE INDEX \"index_qa_local_authority_entries_on_lower_label\" ON \"qa_local_authority_entries\" (local_authority_id, label collate nocase)\n" \
10
+ end
11
+ end
12
+
13
+ attr_reader :subauthority
14
+
15
+ def initialize(subauthority)
16
+ @subauthority = subauthority
17
+ end
18
+
19
+ def search(q)
20
+ return [] if q.blank?
21
+ output_set(base_relation.where('lower(label) like ?', "#{q.downcase}%").limit(25))
22
+ end
23
+
24
+ def all
25
+ output_set(base_relation.limit(1000))
26
+ end
27
+
28
+ def find(uri)
29
+ record = base_relation.find_by(uri: uri)
30
+ return unless record
31
+ output(record)
32
+ end
33
+
34
+ private
35
+
36
+ def base_relation
37
+ Qa::LocalAuthorityEntry.where(local_authority: local_authority)
38
+ end
39
+
40
+ def output_set(set)
41
+ set.map { |item| output(item) }
42
+ end
43
+
44
+ def output(item)
45
+ { id: item[:uri], label: item[:label] }.with_indifferent_access
46
+ end
47
+
48
+ def local_authority
49
+ Qa::LocalAuthority.find_by_name(subauthority)
50
+ end
51
+
52
+ end
53
+ end
@@ -1,3 +1,3 @@
1
1
  module Qa
2
- VERSION = "0.7.0"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -6,7 +6,7 @@ describe Qa::Authorities::AssignFast do
6
6
  describe "#new" do
7
7
  context "without a sub-authority" do
8
8
  it "should raise an exception" do
9
- expect { Qa::Authorities::AssignFast.new }.to raise_error
9
+ expect { described_class.new }.to raise_error RuntimeError, "Initializing with as sub authority is removed. use Module.subauthority_for(nil) instead"
10
10
  end
11
11
  end
12
12
  end
@@ -14,7 +14,7 @@ describe Qa::Authorities::AssignFast do
14
14
  describe "#subauthority_for" do
15
15
  context "with an invalid sub-authority" do
16
16
  it "should raise an exception" do
17
- expect { Qa::Authorities::AssignFast.subauthority_for("foo") }.to raise_error
17
+ expect { Qa::Authorities::AssignFast.subauthority_for("foo") }.to raise_error Qa::InvalidSubAuthority
18
18
  end
19
19
  end
20
20
  context "with a valid sub-authority" do
@@ -31,7 +31,7 @@ describe Qa::Authorities::Local::FileBasedAuthority do
31
31
  end
32
32
  context "YAML file is malformed" do
33
33
  it "should raise an error" do
34
- expect { authority_d.all }.to raise_error
34
+ expect { authority_d.all }.to raise_error Psych::SyntaxError
35
35
  end
36
36
  end
37
37
  end
@@ -27,12 +27,35 @@ describe Qa::Authorities::Geonames do
27
27
 
28
28
  subject { authority.search('whatever') }
29
29
 
30
- it "has id and label keys" do
31
- expect(subject.first).to eq("id" => 'http://sws.geonames.org/2088122',
32
- "label" => "Port Moresby")
33
- expect(subject.last).to eq("id" => 'http://sws.geonames.org/377039',
34
- "label" => "Port Sudan")
35
- expect(subject.size).to eq(10)
30
+ context "with default label" do
31
+ it "has id and label keys" do
32
+ expect(subject.first).to eq("id" => 'http://sws.geonames.org/2088122',
33
+ "label" => "Port Moresby, National Capital, Papua New Guinea")
34
+ expect(subject.last).to eq("id" => 'http://sws.geonames.org/377039',
35
+ "label" => "Port Sudan, Red Sea, Sudan")
36
+ expect(subject.size).to eq(10)
37
+ end
38
+ end
39
+
40
+ context "with custom label" do
41
+ before do
42
+ @original_label = described_class.label
43
+ described_class.label = -> (item) { item['name'] }
44
+ end
45
+ after do
46
+ described_class.label = @original_label
47
+ end
48
+ it "uses the lambda" do
49
+ expect(subject.first['label']).to eq("Port Moresby")
50
+ end
51
+ end
52
+
53
+ context "when username isn't set" do
54
+ before { described_class.username = nil }
55
+ it "logs an error" do
56
+ expect(Rails.logger).to receive(:error).with('Questioning Authority tried to call geonames, but no username was set')
57
+ expect(subject).to be_empty
58
+ end
36
59
  end
37
60
  end
38
61
  end
@@ -4,20 +4,20 @@ describe Qa::Authorities::Getty do
4
4
 
5
5
  describe "#new" do
6
6
  it "should raise an exception" do
7
- expect { described_class.new }.to raise_error
7
+ expect { described_class.new }.to raise_error RuntimeError, "Initializing with as sub authority is removed. use Module.subauthority_for(nil) instead"
8
8
  end
9
9
  end
10
10
 
11
11
  describe "#subauthority_for" do
12
12
  context "without a sub-authority" do
13
13
  it "should raise an exception" do
14
- expect { described_class.subauthority_for }.to raise_error
14
+ expect { described_class.subauthority_for }.to raise_error ArgumentError
15
15
  end
16
16
  end
17
17
 
18
18
  context "with an invalid sub-authority" do
19
19
  it "should raise an exception" do
20
- expect { described_class.subauthority_for("foo") }.to raise_error
20
+ expect { described_class.subauthority_for("foo") }.to raise_error Qa::InvalidSubAuthority
21
21
  end
22
22
  end
23
23
 
@@ -5,7 +5,7 @@ describe Qa::Authorities::Loc do
5
5
  describe "#new" do
6
6
  context "without a sub-authority" do
7
7
  it "should raise an exception" do
8
- expect { Qa::Authorities::Loc.new }.to raise_error
8
+ expect { described_class.new }.to raise_error RuntimeError, "Initializing with as sub authority is removed. use Module.subauthority_for(nil) instead"
9
9
  end
10
10
  end
11
11
  end
@@ -13,7 +13,7 @@ describe Qa::Authorities::Loc do
13
13
  describe "#subauthority_for" do
14
14
  context "with an invalid sub-authority" do
15
15
  it "should raise an exception" do
16
- expect { Qa::Authorities::Loc.subauthority_for("foo") }.to raise_error
16
+ expect { Qa::Authorities::Loc.subauthority_for("foo") }.to raise_error Qa::InvalidSubAuthority
17
17
  end
18
18
  end
19
19
  context "with a valid sub-authority" do
@@ -4,17 +4,60 @@ describe Qa::Authorities::Local do
4
4
 
5
5
  describe "new" do
6
6
  it "should raise an error" do
7
- expect { described_class.new }.to raise_error
7
+ expect { described_class.new }.to raise_error RuntimeError, "Initializing with as sub authority is removed. use Module.subauthority_for(nil) instead"
8
8
  end
9
9
  end
10
10
 
11
+ describe "#subauthorities_path" do
12
+ before do
13
+ @original_path = described_class.config[:local_path]
14
+ described_class.config[:local_path] = path
15
+ end
16
+ after { described_class.config[:local_path] = @original_path }
17
+
18
+ context "configured with a full path" do
19
+ let(:path) { "/full/path" }
20
+
21
+ it "returns a full path" do
22
+ expect(described_class.subauthorities_path).to eq(path)
23
+ end
24
+ end
25
+
26
+ context "configured with a relative path" do
27
+ let(:path) { "relative/path" }
28
+
29
+ it "returns a path relative to the Rails applicaition" do
30
+ expect(described_class.subauthorities_path).to eq(File.join(Rails.root, path))
31
+ end
32
+ end
33
+ end
34
+
35
+ describe "#names" do
36
+ it "returns a list of yaml files" do
37
+ expect(described_class.names).to include("authority_A", "authority_B", "authority_C", "authority_D", "states")
38
+ end
39
+
40
+ context "when the path doesn't exist" do
41
+ before do
42
+ @original_path = described_class.config[:local_path]
43
+ described_class.config[:local_path] = '/foo/bar'
44
+ end
45
+ after { described_class.config[:local_path] = @original_path }
46
+
47
+ it "raises an error" do
48
+ expect { described_class.names }.to raise_error Qa::ConfigDirectoryNotFound
49
+ end
50
+ end
51
+ end
52
+
53
+
11
54
  describe ".subauthority_for" do
12
55
  context "without a sub-authority" do
13
56
  it "should raise an error is the sub-authority is not provided" do
14
- expect { described_class.subauthority_for }.to raise_error
57
+ expect { described_class.subauthority_for }.to raise_error ArgumentError
15
58
  end
16
59
  it "should raise an error is the sub-authority does not exist" do
17
- expect { described_class.subauthority_for("foo") }.to raise_error
60
+ expect { described_class.subauthority_for("foo") }.to raise_error Qa::InvalidSubAuthority
18
61
  end
19
62
  end
20
63
 
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qa::Authorities::Local::TableBasedAuthority do
4
+
5
+ let(:language) { Qa::Authorities::Local.subauthority_for("language") }
6
+ let(:subj) { Qa::Authorities::Local.subauthority_for("subject") }
7
+
8
+ let(:language_auth) { Qa::LocalAuthority.find_or_create_by(name: 'language') }
9
+ let(:alternate_auth) { Qa::LocalAuthority.find_or_create_by(name: 'subject') }
10
+ before do
11
+ Qa::Authorities::Local.register_subauthority('language', described_class.to_s)
12
+ Qa::Authorities::Local.register_subauthority('subject', described_class.to_s)
13
+ Qa::LocalAuthorityEntry.create(local_authority: language_auth, label: 'French', uri: 'http://id.loc.gov/vocabulary/languages/fre')
14
+ Qa::LocalAuthorityEntry.create(local_authority: language_auth, label: 'Uighur', uri: 'http://id.loc.gov/vocabulary/languages/uig')
15
+ Qa::LocalAuthorityEntry.create(local_authority: alternate_auth, label: 'French', uri: 'http://example.com/french')
16
+ end
17
+
18
+ describe "#all" do
19
+ let(:expected) { [ { 'id'=> "A1", 'label' => "Abc Term A1" },
20
+ { 'id' => "A2", 'label'=> "Term A2" },
21
+ { 'id' => "A3", 'label' => "Abc Term A3" } ] }
22
+ it "should return all the entries" do
23
+ expect(language.all).to eq [
24
+ {"id"=>"http://id.loc.gov/vocabulary/languages/fre", "label"=>"French"},
25
+ {"id"=>"http://id.loc.gov/vocabulary/languages/uig", "label"=>"Uighur"}]
26
+
27
+ end
28
+ end
29
+
30
+ describe "#search" do
31
+ context "with an empty query string" do
32
+ let(:expected) { [] }
33
+ it "should return no results" do
34
+ expect(language.search("")).to eq(expected)
35
+ end
36
+ end
37
+ context "with at least one matching entry" do
38
+ it "is case insensitive" do
39
+ expect(language.search("fRe")).to eq [{"id"=>"http://id.loc.gov/vocabulary/languages/fre", "label"=>"French"}]
40
+ end
41
+ end
42
+
43
+ context "with no matching entries" do
44
+ it "returns an empty array" do
45
+ expect(language.search("def")).to be_empty
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "#find" do
51
+ context "term exists" do
52
+ it "should return the full term record" do
53
+ record = language.find('http://id.loc.gov/vocabulary/languages/fre')
54
+ expect(record).to be_a HashWithIndifferentAccess
55
+ expect(record).to eq('id' => "http://id.loc.gov/vocabulary/languages/fre",
56
+ 'label' => "French")
57
+ end
58
+ end
59
+ context "term does not exist" do
60
+ let(:id) { "NonID" }
61
+ let(:expected) { {} }
62
+ it "should return an empty hash" do
63
+ expect(language.find('http://id.loc.gov/vocabulary/languages/eng')).to be_nil
64
+ end
65
+ end
66
+ end
67
+ end
@@ -14,7 +14,8 @@ class TestAppGenerator < Rails::Generators::Base
14
14
  end
15
15
 
16
16
  def run_local_authority_installer
17
- generate "qa:local"
17
+ generate "qa:local:files"
18
+ generate "qa:local:tables"
18
19
  end
19
20
 
20
21
  def copy_local_authority_fixtures
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Anderson
@@ -15,7 +15,7 @@ authors:
15
15
  autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
- date: 2016-06-27 00:00:00.000000000 Z
18
+ date: 2016-07-07 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rails
@@ -208,7 +208,9 @@ files:
208
208
  - lib/generators/qa/install/install_generator.rb
209
209
  - lib/generators/qa/install/templates/config/oclcts-authorities.yml
210
210
  - lib/generators/qa/local/USAGE
211
- - lib/generators/qa/local/local_generator.rb
211
+ - lib/generators/qa/local/files/files_generator.rb
212
+ - lib/generators/qa/local/tables/tables_generator.rb
213
+ - lib/generators/qa/local/tables/templates/add_index_to_local_authorities.rb
212
214
  - lib/generators/qa/local/templates/config/authorities.yml
213
215
  - lib/generators/qa/local/templates/config/authorities/states.yml
214
216
  - lib/qa.rb
@@ -228,7 +230,8 @@ files:
228
230
  - lib/qa/authorities/loc_subauthority.rb
229
231
  - lib/qa/authorities/local.rb
230
232
  - lib/qa/authorities/local/file_based_authority.rb
231
- - lib/qa/authorities/local_subauthority.rb
233
+ - lib/qa/authorities/local/registry.rb
234
+ - lib/qa/authorities/local/table_based_authority.rb
232
235
  - lib/qa/authorities/mesh.rb
233
236
  - lib/qa/authorities/mesh_tools.rb
234
237
  - lib/qa/authorities/mesh_tools/mesh_data_parser.rb
@@ -278,9 +281,9 @@ files:
278
281
  - spec/lib/authorities/local_spec.rb
279
282
  - spec/lib/authorities/mesh_spec.rb
280
283
  - spec/lib/authorities/oclcts_spec.rb
284
+ - spec/lib/authorities/table_based_authority_spec.rb
281
285
  - spec/lib/authorities/tgnlang_spec.rb
282
286
  - spec/lib/authorities_loc_subauthorities.rb
283
- - spec/lib/authorities_local_subauthorities_spec.rb
284
287
  - spec/lib/mesh_data_parser_spec.rb
285
288
  - spec/lib/tasks/mesh.rake_spec.rb
286
289
  - spec/models/subject_mesh_term_spec.rb
@@ -348,9 +351,9 @@ test_files:
348
351
  - spec/lib/authorities/local_spec.rb
349
352
  - spec/lib/authorities/mesh_spec.rb
350
353
  - spec/lib/authorities/oclcts_spec.rb
354
+ - spec/lib/authorities/table_based_authority_spec.rb
351
355
  - spec/lib/authorities/tgnlang_spec.rb
352
356
  - spec/lib/authorities_loc_subauthorities.rb
353
- - spec/lib/authorities_local_subauthorities_spec.rb
354
357
  - spec/lib/mesh_data_parser_spec.rb
355
358
  - spec/lib/tasks/mesh.rake_spec.rb
356
359
  - spec/models/subject_mesh_term_spec.rb
@@ -1,9 +0,0 @@
1
- class Qa::LocalGenerator < Rails::Generators::Base
2
- source_root File.expand_path('../templates', __FILE__)
3
-
4
- def copy_local_authority_configs
5
- copy_file "config/authorities.yml", "config/authorities.yml"
6
- directory "config/authorities"
7
- end
8
-
9
- end
@@ -1,21 +0,0 @@
1
- module Qa::Authorities::LocalSubauthority
2
-
3
- # Path to sub-authority files is either the full path to a directory or
4
- # the path to a directory relative to the Rails application
5
- def subauthorities_path
6
- if AUTHORITIES_CONFIG[:local_path].starts_with?(File::Separator)
7
- AUTHORITIES_CONFIG[:local_path]
8
- else
9
- File.join(Rails.root, AUTHORITIES_CONFIG[:local_path])
10
- end
11
- end
12
-
13
- # Local sub-authorities are any YAML files in the subauthorities_path
14
- def names
15
- unless Dir.exists? subauthorities_path
16
- raise Qa::ConfigDirectoryNotFound, "There's no directory at #{subauthorities_path}. You must create it in order to use local authorities"
17
- end
18
- Dir.entries(subauthorities_path).map { |f| File.basename(f, ".yml") if f.match(/yml$/) }.compact
19
- end
20
-
21
- end
@@ -1,51 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Qa::Authorities::LocalSubauthority do
4
-
5
- before do
6
- class TestClass
7
- include Qa::Authorities::LocalSubauthority
8
- end
9
- end
10
-
11
- after { Object.send(:remove_const, :TestClass) }
12
-
13
- let(:test) { TestClass.new }
14
-
15
- before { @original_path = AUTHORITIES_CONFIG[:local_path] }
16
- after { AUTHORITIES_CONFIG[:local_path] = @original_path }
17
-
18
- describe "#subauthorities_path" do
19
- before { AUTHORITIES_CONFIG[:local_path] = path }
20
- context "configured with a full path" do
21
- let(:path) { "/full/path" }
22
-
23
- it "returns a full path" do
24
- expect(test.subauthorities_path).to eq(path)
25
- end
26
- end
27
-
28
- context "configured with a relative path" do
29
- let(:path) { "relative/path" }
30
-
31
- it "returns a path relative to the Rails applicaition" do
32
- expect(test.subauthorities_path).to eq(File.join(Rails.root, path))
33
- end
34
- end
35
- end
36
-
37
- describe "#names" do
38
- it "returns a list of yaml files" do
39
- expect(test.names).to include("authority_A", "authority_B", "authority_C", "authority_D", "states")
40
- end
41
-
42
- context "when the path doesn't exist" do
43
- before { AUTHORITIES_CONFIG[:local_path] = '/foo/bar' }
44
-
45
- it "raises an error" do
46
- expect { test.names }.to raise_error Qa::ConfigDirectoryNotFound
47
- end
48
- end
49
- end
50
-
51
- end