Class: Glossarist::ReferenceResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/glossarist/reference_resolver.rb

Instance Method Summary collapse

Constructor Details

#initializeReferenceResolver

Returns a new instance of ReferenceResolver.



5
6
7
8
9
10
# File 'lib/glossarist/reference_resolver.rb', line 5

def initialize
  @local_adapter = nil
  @package_adapters = []
  @route_adapter = ResolutionAdapter::Route.new
  @remote_adapters = []
end

Instance Method Details

#add_route(from:, to:) ⇒ Object



25
26
27
# File 'lib/glossarist/reference_resolver.rb', line 25

def add_route(from:, to:)
  @route_adapter.add(from: from, to: to)
end

#load_collection(collection_dir) ⇒ Object



88
89
90
91
92
93
94
95
# File 'lib/glossarist/reference_resolver.rb', line 88

def load_collection(collection_dir)
  config_path = File.join(collection_dir, "collection.yaml")
  if File.exist?(config_path)
    load_collection_config(config_path, collection_dir)
  else
    load_gcr_directory(collection_dir)
  end
end

#register_package(package_or_concepts, uri_prefix: nil) ⇒ Object

Raises:

  • (ArgumentError)


16
17
18
19
20
21
22
23
# File 'lib/glossarist/reference_resolver.rb', line 16

def register_package(package_or_concepts, uri_prefix: nil)
  concepts = extract_concepts(package_or_concepts)
  prefix = uri_prefix || infer_uri_prefix(package_or_concepts)
  raise ArgumentError, "uri_prefix required" unless prefix

  @package_adapters << ResolutionAdapter::Package.new(concepts,
                                                      uri_prefix: prefix)
end

#register_remote(uri_prefix:, endpoint:) ⇒ Object



29
30
31
32
# File 'lib/glossarist/reference_resolver.rb', line 29

def register_remote(uri_prefix:, endpoint:)
  @remote_adapters << ResolutionAdapter::Remote.new(uri_prefix: uri_prefix,
                                                    endpoint: endpoint)
end

#register_self(concepts) ⇒ Object



12
13
14
# File 'lib/glossarist/reference_resolver.rb', line 12

def register_self(concepts)
  @local_adapter = ResolutionAdapter::Local.new(concepts)
end

#registered_datasetsObject



97
98
99
# File 'lib/glossarist/reference_resolver.rb', line 97

def registered_datasets
  @package_adapters.map(&:uri_prefix)
end

#resolve(reference) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/glossarist/reference_resolver.rb', line 34

def resolve(reference)
  if reference.local?
    return @local_adapter&.resolve(reference)
  end

  routed_ref = apply_routes(reference)

  @package_adapters.each do |adapter|
    result = adapter.resolve(routed_ref)
    return result if result
  end

  @remote_adapters.each do |adapter|
    result = adapter.resolve(routed_ref)
    return result if result
  end

  nil
end

#resolve_all(concept, extractor: nil) ⇒ Object



54
55
56
57
58
# File 'lib/glossarist/reference_resolver.rb', line 54

def resolve_all(concept, extractor: nil)
  extractor ||= ReferenceExtractor.new
  refs = extract_refs(concept, extractor)
  refs.map { |ref| [ref, resolve(ref)] }
end

#validate_all(package_or_concepts, extractor: nil, mode: :multi) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/glossarist/reference_resolver.rb', line 60

def validate_all(package_or_concepts, extractor: nil, mode: :multi)
  concepts = extract_concepts(package_or_concepts)
  extractor ||= ReferenceExtractor.new
  result = ValidationResult.new

  concepts.each do |concept|
    refs = extract_refs(concept, extractor)
    termid = extract_termid(concept)

    refs.each do |ref|
      resolved = resolve(ref)
      if resolved.nil?
        scope = ref.local? ? "intra-set" : "inter-set (#{ref.source})"
        result.add_warning("#{termid}: Unresolvable #{scope} reference: #{ref.term} -> #{ref.concept_id}")
      end
    end

    if mode == :single && !@local_adapter
      external_refs = refs.select(&:external?)
      if external_refs.any?
        result.add_warning("#{termid}: #{external_refs.size} external reference(s) not checked in single mode")
      end
    end
  end

  result
end