krikri 0.12.0 → 0.12.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/krikri/activity.rb +34 -8
- data/lib/generators/krikri/templates/schema.xml +1 -0
- data/lib/generators/krikri/templates/solrconfig.xml +1 -0
- data/lib/krikri/async_uri_getter.rb +27 -0
- data/lib/krikri/engine.rb +19 -4
- data/lib/krikri/enricher.rb +3 -6
- data/lib/krikri/entity_behavior.rb +57 -11
- data/lib/krikri/entity_behaviors/aggregation_entity_behavior.rb +1 -1
- data/lib/krikri/entity_behaviors/original_record_entity_behavior.rb +1 -1
- data/lib/krikri/entity_consumer.rb +40 -17
- data/lib/krikri/indexer.rb +7 -7
- data/lib/krikri/mapper.rb +23 -14
- data/lib/krikri/search_index.rb +4 -0
- data/lib/krikri/software_agent.rb +8 -4
- data/lib/krikri/version.rb +1 -1
- data/spec/internal/Gemfile +3 -3
- data/spec/internal/Gemfile.lock +28 -28
- data/spec/internal/app/assets/javascripts/application.js +1 -1
- data/spec/internal/config/initializers/blacklight_initializer.rb +1 -1
- data/spec/internal/config/initializers/devise.rb +2 -2
- data/spec/internal/config/secrets.yml +2 -2
- data/spec/internal/db/development.sqlite3 +0 -0
- data/spec/internal/db/migrate/{20160304151204_devise_create_users.rb → 20160226160200_devise_create_users.rb} +0 -0
- data/spec/internal/db/migrate/{20160304151247_create_searches.blacklight.rb → 20160226160226_create_searches.blacklight.rb} +0 -0
- data/spec/internal/db/migrate/{20160304151248_create_bookmarks.blacklight.rb → 20160226160227_create_bookmarks.blacklight.rb} +0 -0
- data/spec/internal/db/migrate/{20160304151249_add_polymorphic_type_to_bookmarks.blacklight.rb → 20160226160228_add_polymorphic_type_to_bookmarks.blacklight.rb} +0 -0
- data/spec/internal/db/schema.rb +1 -1
- data/spec/internal/db/test.sqlite3 +0 -0
- data/spec/internal/log/development.log +92 -92
- data/spec/lib/krikri/async_uri_getter_spec.rb +31 -7
- data/spec/lib/krikri/entity_consumer_spec.rb +37 -7
- data/spec/lib/krikri/harvester_spec.rb +7 -3
- data/spec/lib/krikri/indexer_spec.rb +7 -4
- data/spec/lib/krikri/mapper_agent_spec.rb +10 -9
- data/spec/lib/krikri/search_index_spec.rb +3 -6
- data/spec/models/activity_spec.rb +32 -0
- data/spec/models/dpla/map/aggregation_spec.rb +40 -21
- data/spec/models/provider_spec.rb +2 -9
- data/spec/spec_helper.rb +1 -2
- data/spec/support/shared_contexts/indexed_item.rb +1 -3
- data/spec/support/shared_examples/software_agent.rb +1 -1
- metadata +11 -14
- data/lib/generators/krikri/templates/schema.xml +0 -767
- data/lib/generators/krikri/templates/solrconfig.xml +0 -160
- data/spec/internal/log/test.log +0 -8537
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 66d34d2d357a32a8406cd36a09e0333abec7ac0f
|
4
|
+
data.tar.gz: af0783e05398a667a1380bd0cad675ec546b489d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9806d3d2968791b32b743c49bf5b4ab9bda09bf44533680f194560b51adcab7948067f3d8df067dec6b74567c93c3648d3ca531c8c0be279ed7adcbfee13c3b9
|
7
|
+
data.tar.gz: 97087dbff34ec494908a678f8b02d37b61c3110ae8aef07c769dbe09b3092e116dc814f0dd020f50d53c1d0d777abe9dfffbadb169077f8b4a99eb489e553275
|
@@ -10,16 +10,42 @@ module Krikri
|
|
10
10
|
class Activity < ActiveRecord::Base
|
11
11
|
# @!attribute agent
|
12
12
|
# @return [String] a string representing the Krikri::SoftwareAgent
|
13
|
-
#
|
13
|
+
# responsible for the activity.
|
14
|
+
# @!attribute start_time
|
15
|
+
# @return [DateTime] a datestamp marking the activity's start
|
14
16
|
# @!attribute end_time
|
15
17
|
# @return [DateTime] a datestamp marking the activity's competion
|
16
18
|
# @!attribute opts
|
17
19
|
# @return [JSON] the options to pass to the #agent class when running
|
18
|
-
#
|
19
|
-
|
20
|
-
# @return [DateTime] a datestamp marking the activity's start
|
20
|
+
# the activity
|
21
|
+
|
21
22
|
validate :agent_must_be_a_software_agent
|
22
23
|
|
24
|
+
##
|
25
|
+
# @example building a valid URI from the base
|
26
|
+
# Krikri::Activity.base_uri / 1
|
27
|
+
#
|
28
|
+
# @return [RDF::URI] the configured base URI for this class
|
29
|
+
def self.base_uri
|
30
|
+
RDF::URI.intern(Krikri::Settings['marmotta']['ldp']) /
|
31
|
+
Krikri::Settings['prov']['activity']
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# @param uri [#to_s] a uri for this activity
|
36
|
+
#
|
37
|
+
# @return [Krikri::Activity] the activity with the given uri
|
38
|
+
#
|
39
|
+
# @raise [RuntimeError] if the URI form does not match the activity
|
40
|
+
# @raise [ActiveRecord::RecordNotFound] if no activity is found
|
41
|
+
def self.from_uri(uri)
|
42
|
+
raise "Cannot find #{self} from URI: #{uri}; " \
|
43
|
+
"the requested uri does not match #{base_uri}" unless
|
44
|
+
uri.start_with? base_uri
|
45
|
+
|
46
|
+
find(uri.to_s.sub(base_uri.to_s, '').sub('/', ''))
|
47
|
+
end
|
48
|
+
|
23
49
|
def agent_must_be_a_software_agent
|
24
50
|
errors.add(:agent, 'does not represent a SoftwareAgent') unless
|
25
51
|
agent.constantize < Krikri::SoftwareAgent
|
@@ -81,7 +107,9 @@ module Krikri
|
|
81
107
|
def agent_instance
|
82
108
|
@agent_instance ||= agent.constantize.new(parsed_opts)
|
83
109
|
end
|
84
|
-
|
110
|
+
|
111
|
+
##
|
112
|
+
# @return [Hash] the options parsed as JSON
|
85
113
|
def parsed_opts
|
86
114
|
JSON.parse(opts, symbolize_names: true)
|
87
115
|
end
|
@@ -89,11 +117,9 @@ module Krikri
|
|
89
117
|
##
|
90
118
|
# @return [RDF::URI] the uri for this activity
|
91
119
|
def rdf_subject
|
92
|
-
|
93
|
-
Krikri::Settings['prov']['activity'] / id.to_s
|
120
|
+
self.class.base_uri / id.to_s
|
94
121
|
end
|
95
122
|
alias_method :to_term, :rdf_subject
|
96
|
-
|
97
123
|
|
98
124
|
##
|
99
125
|
# @return [String] a string reprerestation of the activity
|
@@ -0,0 +1 @@
|
|
1
|
+
../../../../solr_conf/schema.xml
|
@@ -0,0 +1 @@
|
|
1
|
+
../../../../solr_conf/solrconfig.xml
|
@@ -51,6 +51,8 @@ module Krikri
|
|
51
51
|
# redirects.
|
52
52
|
# @option opts [Integer] :max_redirects Number of redirects to follow before
|
53
53
|
# giving up. (default: 10)
|
54
|
+
# @option opts [Boolean] :inline_exceptions If true, pass exceptions as a
|
55
|
+
# 5xx response with the exception string in the body. (default: false)
|
54
56
|
def initialize(opts: {})
|
55
57
|
@default_opts = { max_redirects: MAX_REDIRECTS }.merge(opts)
|
56
58
|
end
|
@@ -80,16 +82,41 @@ module Krikri
|
|
80
82
|
# Wait for the request thread to complete
|
81
83
|
def join
|
82
84
|
@request_thread.join
|
85
|
+
rescue => e
|
86
|
+
# If the join throws an exception, the thread is dead anyway. The
|
87
|
+
# subsequent call to `with_response` will propagate the exception to the
|
88
|
+
# calling thread.
|
89
|
+
raise e unless inline_exceptions?
|
83
90
|
end
|
84
91
|
|
85
92
|
##
|
86
93
|
# @yield [Faraday::Response] the response returned for the request
|
87
94
|
def with_response
|
88
95
|
yield @request_thread.value
|
96
|
+
rescue => e
|
97
|
+
if inline_exceptions?
|
98
|
+
# Deliver an error response to the caller to allow uniform access
|
99
|
+
msg = e.message + "\n\n" + e.backtrace.join("\n")
|
100
|
+
yield Faraday::Response.new(status: 500,
|
101
|
+
body: msg,
|
102
|
+
response_headers: {
|
103
|
+
'X-Exception' => e,
|
104
|
+
'X-Exception-Message' => e.message,
|
105
|
+
'X-Internal-Response' => 'true'
|
106
|
+
})
|
107
|
+
else
|
108
|
+
raise e
|
109
|
+
end
|
89
110
|
end
|
90
111
|
|
91
112
|
private
|
92
113
|
|
114
|
+
##
|
115
|
+
# True if we are using inline exceptions
|
116
|
+
def inline_exceptions?
|
117
|
+
opts.fetch(:inline_exceptions, false)
|
118
|
+
end
|
119
|
+
|
93
120
|
##
|
94
121
|
# Run the Faraday request in a new thread
|
95
122
|
def start_request
|
data/lib/krikri/engine.rb
CHANGED
@@ -129,13 +129,13 @@ module Krikri
|
|
129
129
|
# Get the persisted original record for this Aggregation.
|
130
130
|
# @return [Krikri::OriginalRecord, nil]
|
131
131
|
#
|
132
|
-
# @raise [NameError] when the original record
|
133
|
-
#
|
132
|
+
# @raise [NameError] when the original record is empty or is a blank
|
133
|
+
# node.
|
134
134
|
#
|
135
135
|
# @raise [Faraday::ConnectionError] when there is a connection problem
|
136
136
|
# with Marmotta.
|
137
137
|
def original_record
|
138
|
-
raise NameError,
|
138
|
+
raise NameError, no_origrec_message if
|
139
139
|
originalRecord.empty? || originalRecord.first.node?
|
140
140
|
Krikri::OriginalRecord.load(originalRecord.first.rdf_subject
|
141
141
|
.to_s)
|
@@ -164,10 +164,25 @@ module Krikri
|
|
164
164
|
|
165
165
|
def mint_id_fragment(seed = nil)
|
166
166
|
return seed if seed
|
167
|
-
|
167
|
+
# We rely on originalRecord for consistent ID minting, so we have to
|
168
|
+
# raise an exception if it's empty or is a blank node; for example,
|
169
|
+
# if a mapping failed to map it.
|
170
|
+
raise NameError, no_origrec_message if
|
168
171
|
originalRecord.empty? || originalRecord.first.node?
|
169
172
|
local_name_from_original_record
|
170
173
|
end
|
174
|
+
|
175
|
+
def no_origrec_message
|
176
|
+
"#{dpla_id} #{no_origrec_cond}"
|
177
|
+
end
|
178
|
+
|
179
|
+
def no_origrec_cond
|
180
|
+
if originalRecord.empty?
|
181
|
+
"has an empty originalRecord"
|
182
|
+
else
|
183
|
+
"has a blank node for its originalRecord"
|
184
|
+
end
|
185
|
+
end
|
171
186
|
end
|
172
187
|
end
|
173
188
|
|
data/lib/krikri/enricher.rb
CHANGED
@@ -2,9 +2,8 @@ module Krikri
|
|
2
2
|
##
|
3
3
|
# A SoftwareAgent that runs enrichment processes.
|
4
4
|
#
|
5
|
-
# @example
|
6
|
-
#
|
7
|
-
# To enrich records that were mapped by the mapping activity with ID 3:
|
5
|
+
# @example to enrich records that were mapped by the mapping activity
|
6
|
+
# with ID 3:
|
8
7
|
#
|
9
8
|
# # Define which enrichments are run, and thier parameters:
|
10
9
|
# chain = {
|
@@ -43,7 +42,6 @@ module Krikri
|
|
43
42
|
# @see Audumbla::Enrichment
|
44
43
|
# @param opts [Hash] a hash of options
|
45
44
|
def initialize(opts = {})
|
46
|
-
@generator_uri = RDF::URI(opts.fetch(:generator_uri))
|
47
45
|
@chain = deep_sym(opts.fetch(:chain) { {} })
|
48
46
|
@entity_behavior = self.class.entity_behavior
|
49
47
|
assign_generator_activity!(opts)
|
@@ -56,8 +54,7 @@ module Krikri
|
|
56
54
|
# instantiation, and apply each enrichment from the enrichment chain.
|
57
55
|
#
|
58
56
|
def run(activity_uri = nil)
|
59
|
-
|
60
|
-
mapped_records.each do |rec|
|
57
|
+
entities.each do |rec|
|
61
58
|
begin
|
62
59
|
chain_enrichments!(rec)
|
63
60
|
activity_uri ? rec.save_with_provenance(activity_uri) : rec.save
|
@@ -1,19 +1,36 @@
|
|
1
1
|
|
2
2
|
module Krikri
|
3
3
|
##
|
4
|
-
# Base class for behaviors related to entities that
|
5
|
-
# by
|
4
|
+
# Base class for retrieval behaviors related to entities that were generated
|
5
|
+
# or revised by a `Krikri::Activity`.
|
6
6
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
7
|
+
# @example implementing an entity behavior
|
8
|
+
# class CustomBehavior < Krikri::EntityBehavior
|
9
|
+
# def entities(load = true, include_invalidated = false)
|
10
|
+
# activity_uris(include_invalidated) do |uri|
|
11
|
+
# # some behavior over URIs to return initialized entities
|
12
|
+
# end
|
13
|
+
# end
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# @example retrieving entities with a behavior
|
17
|
+
# Krikri::Activity.find(activity_id)
|
18
|
+
# CustomBehavor.entities(activity)
|
19
|
+
#
|
20
|
+
# A `SoftwareAgent` implements `#entity_behavior`, which returns an appropriate
|
21
|
+
# subclass of `EntityBehavior`. When an Activity is queried for its entities,
|
22
|
+
# it instantiates an instance of its particular `SoftwareAgent`, and then
|
23
|
+
# calls the `#entities` method of the agent's entity behavior.
|
11
24
|
#
|
12
25
|
# @see Krikri::Activity#entities
|
13
26
|
# @see lib/krikri/entity_behaviors
|
14
|
-
#
|
15
27
|
class EntityBehavior
|
28
|
+
# @!attribute [r] activity
|
29
|
+
# @return [Krikri::Activity]
|
16
30
|
attr_reader :activity
|
31
|
+
|
32
|
+
##
|
33
|
+
# @param activity [Krikri::Activity]
|
17
34
|
def initialize(activity)
|
18
35
|
@activity = activity
|
19
36
|
end
|
@@ -21,20 +38,49 @@ module Krikri
|
|
21
38
|
##
|
22
39
|
# Return an Enumerator of objects that have been affected by our @activity.
|
23
40
|
#
|
24
|
-
# @
|
41
|
+
# @param load [Boolean] `true` to force load the entities from the datastore
|
42
|
+
# on access
|
43
|
+
# @param include_invalidated [Boolean] `true` to include entities marked as
|
44
|
+
# invalid.
|
45
|
+
#
|
46
|
+
# @return [Enumerator] the entities. When possible, they should be
|
47
|
+
# initialized & retrieved lazily.
|
48
|
+
#
|
49
|
+
#
|
25
50
|
# @see lib/krikri/entity_behaviors
|
26
51
|
# @see Krikri::Activity#entities
|
27
52
|
#
|
53
|
+
# @see Krikri::LDP::Invalidatable for more about "invalidated" entities
|
28
54
|
def entities(*args)
|
29
|
-
raise NotImplementedError
|
55
|
+
raise NotImplementedError
|
30
56
|
end
|
31
57
|
|
32
58
|
##
|
33
|
-
#
|
34
|
-
#
|
59
|
+
# Initializes an instance of this class with the given `Activity` and
|
60
|
+
# returns an enumerator of the associated entities.
|
35
61
|
#
|
62
|
+
# @param activity [Krikri::Activity]
|
63
|
+
# @param load [Boolean]
|
64
|
+
# @param include_invalidated [Boolean]
|
65
|
+
#
|
66
|
+
# @see Krikri::EntityBehavior#entities
|
67
|
+
# @see Krikri::Activity#entities
|
36
68
|
def self.entities(activity, *args)
|
37
69
|
new(activity).entities(*args)
|
38
70
|
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
##
|
75
|
+
# Private utility method capturing common logic for applying entity logic to
|
76
|
+
# uris gathered from the instance's `Krikri::Activity`.
|
77
|
+
#
|
78
|
+
# @param include_invalided [Boolean]
|
79
|
+
#
|
80
|
+
# @return [Enumerator::Lazy] the uris, lazily mapped to the behavior in the
|
81
|
+
# given block
|
82
|
+
def activity_uris(include_invalidated, &block)
|
83
|
+
activity.entity_uris(include_invalidated).lazy.map(&block)
|
84
|
+
end
|
39
85
|
end
|
40
86
|
end
|
@@ -22,7 +22,7 @@ module Krikri
|
|
22
22
|
# @return [Enumerator] DPLA::MAP::Aggregation objects
|
23
23
|
#
|
24
24
|
def entities(load = true, include_invalidated = false)
|
25
|
-
|
25
|
+
activity_uris(include_invalidated) do |uri|
|
26
26
|
agg = DPLA::MAP::Aggregation.new(uri)
|
27
27
|
agg.get if load
|
28
28
|
agg
|
@@ -23,7 +23,7 @@ module Krikri
|
|
23
23
|
# @return [Enumerator] OriginalRecord objects
|
24
24
|
#
|
25
25
|
def entities(load = true, include_invalidated = false)
|
26
|
-
|
26
|
+
activity_uris(include_invalidated) do |uri|
|
27
27
|
load ? OriginalRecord.load(uri) : OriginalRecord.new(uri)
|
28
28
|
end
|
29
29
|
end
|
@@ -1,15 +1,21 @@
|
|
1
1
|
module Krikri
|
2
2
|
##
|
3
|
-
# A mixin for
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
3
|
+
# A mixin for `Krikri::SoftwareAgent`s that use entities. Provides a
|
4
|
+
# mechanism for setting an `#entity_source` and consuming entities.
|
5
|
+
#
|
6
|
+
# For backwards compatability, this supports an older interface where entities
|
7
|
+
# are selected based on a `generator_activity`.
|
8
|
+
#
|
9
|
+
# @example the deprecated interface
|
10
|
+
# class AnAgent
|
11
|
+
# include Krikri::EntityConsumer
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# agent = AnAgent.new
|
15
|
+
# agent.assign_generator_activity!(generator_uri:
|
16
|
+
# Krikri::Activity.find(1).rdf_subject)
|
17
|
+
#
|
18
|
+
# agent.generator_activity.entities
|
13
19
|
#
|
14
20
|
module EntityConsumer
|
15
21
|
extend ActiveSupport::Concern
|
@@ -32,17 +38,34 @@ module Krikri
|
|
32
38
|
#
|
33
39
|
# @see Krikri::Mapper::Agent
|
34
40
|
# @see Krikri::Harvester
|
35
|
-
#
|
36
41
|
def assign_generator_activity!(opts)
|
37
42
|
if opts.include?(:generator_uri)
|
38
43
|
generator_uri = opts.delete(:generator_uri)
|
39
|
-
|
40
|
-
|
41
|
-
fail "Can not determine ID for #{generator_uri}" if activity_id == 0
|
42
|
-
@generator_activity = Krikri::Activity.find_by_id(activity_id)
|
43
|
-
raise "Generator activity not found for id #{activity_id}" \
|
44
|
-
unless @generator_activity
|
44
|
+
@entity_source =
|
45
|
+
@generator_activity = Krikri::Activity.from_uri(generator_uri)
|
45
46
|
end
|
46
47
|
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# @return [Enumerator<Krikri::LDP::Resource>] entities this agent will use
|
51
|
+
def entities
|
52
|
+
entity_source ? entity_source.entities : []
|
53
|
+
end
|
54
|
+
|
55
|
+
##
|
56
|
+
# @return [#entities, nil]
|
57
|
+
def entity_source
|
58
|
+
@entity_source
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# Sets the entity source to a new instance of the provided class,
|
63
|
+
# initialized with the provided arguments and block.
|
64
|
+
#
|
65
|
+
# @param klass [Class] a class with an instance method `#entities`
|
66
|
+
# @return [void]
|
67
|
+
def set_entity_source!(klass, *args, &block)
|
68
|
+
@entity_source = klass.new(*args, &block)
|
69
|
+
end
|
47
70
|
end
|
48
71
|
end
|
data/lib/krikri/indexer.rb
CHANGED
@@ -2,21 +2,21 @@ module Krikri
|
|
2
2
|
##
|
3
3
|
# A SoftwareAgent to run indexing processes.
|
4
4
|
#
|
5
|
-
# @example
|
6
|
-
#
|
7
|
-
# To index records enriched by the enrichment activity with ID 3:
|
8
|
-
#
|
5
|
+
# @example To index records enriched by the enrichment activity with ID 3:
|
9
6
|
# Krikri::Indexer.enqueue({
|
10
7
|
# index_class: 'Krikri::QASearchIndex',
|
11
8
|
# generator_uri: 'http://ldp.local.dp.la/ldp/activity/3'
|
12
9
|
# some_option_for_index_class: 'abc'
|
13
10
|
# })
|
14
11
|
#
|
15
|
-
#
|
16
|
-
#
|
12
|
+
# The options hash contains options for the `Indexer` as well as the
|
13
|
+
# `SearchIndex`.
|
17
14
|
#
|
15
|
+
# @todo use generalized `EntityConsumer` interface that is independent from
|
16
|
+
# `Activity`. `#index` needs to be largely rewritten due to
|
17
|
+
# `#update_from_activity`, which is tighly bound to `Activity` rather than
|
18
|
+
# `Enumerator<#entities>`.
|
18
19
|
# @see Krikri::SoftwareAgent#enqueue
|
19
|
-
#
|
20
20
|
class Indexer
|
21
21
|
include SoftwareAgent
|
22
22
|
include EntityConsumer
|
data/lib/krikri/mapper.rb
CHANGED
@@ -75,38 +75,48 @@ module Krikri
|
|
75
75
|
##
|
76
76
|
# A SoftwareAgent to run mapping processes.
|
77
77
|
#
|
78
|
-
# @example
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
82
|
-
# Krikri::Mapper::Agent.enqueue(
|
83
|
-
# :mapping,
|
84
|
-
# opts = {
|
85
|
-
# name: 'scdl_qdc',
|
86
|
-
# generator_uri: 'http://ldp.local.dp.la/ldp/activity/1'
|
87
|
-
# }
|
88
|
-
# )
|
78
|
+
# @example to map the records harvested by the harvest activity with ID 1:
|
79
|
+
# Krikri::Mapper::Agent.enqueue(name: :scdl_qdc,
|
80
|
+
# generator_uri: 'http://ldp.local.dp.la/ldp/activity/1')
|
89
81
|
#
|
90
82
|
# @see: Krikri::SoftwareAgent, Krikri::Activity
|
91
83
|
class Agent
|
92
84
|
include SoftwareAgent
|
93
85
|
include EntityConsumer
|
94
86
|
|
87
|
+
# @!attribute [r] name
|
88
|
+
# @return [Symbol]
|
95
89
|
attr_reader :name
|
96
90
|
|
91
|
+
##
|
92
|
+
# @return [Symbol] the default queue for jobs using this agent
|
97
93
|
def self.queue_name
|
98
94
|
:mapping
|
99
95
|
end
|
100
96
|
|
97
|
+
##
|
98
|
+
# @see Krikri::Activity#entities
|
99
|
+
# @see Krikri::EntityBehavior
|
100
|
+
# @see Krikri::SoftwareAgent#entity_behavior
|
101
|
+
def entity_behavior
|
102
|
+
@entity_behavior ||= Krikri::AggregationEntityBehavior
|
103
|
+
end
|
104
|
+
|
105
|
+
##
|
106
|
+
# @param opts [Hash]
|
107
|
+
# @option opts [#to_sym] name the symbol naming the mapping to use
|
101
108
|
def initialize(opts = {})
|
102
109
|
@name = opts.fetch(:name).to_sym
|
103
110
|
@entity_behavior = self.class.entity_behavior
|
104
111
|
assign_generator_activity!(opts)
|
105
112
|
end
|
106
113
|
|
114
|
+
##
|
115
|
+
# @param activity_uri [RDF::URI] the uri of the activity to attribute
|
116
|
+
# for provenance purposes (default: nil)
|
117
|
+
# @see SoftwareAgent#run
|
107
118
|
def run(activity_uri = nil)
|
108
|
-
|
109
|
-
Krikri::Mapper.map(name, harvest_records).each do |rec|
|
119
|
+
Krikri::Mapper.map(name, entities).each do |rec|
|
110
120
|
begin
|
111
121
|
rec.mint_id! if rec.node?
|
112
122
|
activity_uri ? rec.save_with_provenance(activity_uri) : rec.save
|
@@ -116,7 +126,6 @@ module Krikri
|
|
116
126
|
end
|
117
127
|
end
|
118
128
|
end
|
119
|
-
|
120
129
|
end
|
121
130
|
end
|
122
131
|
end
|
data/lib/krikri/search_index.rb
CHANGED
@@ -6,6 +6,10 @@ module Krikri
|
|
6
6
|
##
|
7
7
|
# Search index base class that gets extended by QA and Production index
|
8
8
|
# classes
|
9
|
+
#
|
10
|
+
# @todo rewrite to use generalized `EntityConsumer` interface & avoid
|
11
|
+
# `#update_from_activity`, which is tighly bound to `Activity` rather than
|
12
|
+
# `Enumerator<#entities>`.
|
9
13
|
class SearchIndex
|
10
14
|
def initialize(opts)
|
11
15
|
@bulk_update_size = opts.delete(:bulk_update_size) { 10 }
|
@@ -1,13 +1,17 @@
|
|
1
1
|
module Krikri
|
2
2
|
##
|
3
|
-
# SoftwareAgent is a mixin for logic common to
|
4
|
-
# `Krikri::Activity`.
|
3
|
+
# SoftwareAgent is a mixin for logic common to classes that carry out the
|
4
|
+
# work involved in a `Krikri::Activity`. This corresponds to a
|
5
|
+
# prov:SoftwareAgent within PROV-O & PROV-DM.
|
5
6
|
#
|
6
7
|
# Software Agents should handle internal errors that do not result in full
|
7
8
|
# activity failure, and raise a `RuntimeError` when the job fails. `Activity`
|
8
9
|
# handles logging of activity start/stop, and failure status.
|
9
10
|
#
|
11
|
+
# Implementers must provide a `#run` method.
|
12
|
+
#
|
10
13
|
# @see Krikri::Activity
|
14
|
+
# @see https://www.w3.org/TR/prov-dm/#concept-software-agent
|
11
15
|
module SoftwareAgent
|
12
16
|
extend ActiveSupport::Concern
|
13
17
|
|
@@ -30,13 +34,13 @@ module Krikri
|
|
30
34
|
|
31
35
|
##
|
32
36
|
# @abstract Perform this agent's work. The method may accept an
|
33
|
-
# `activity_uri` to record as the Activity in provenance metadata.
|
37
|
+
# `activity_uri` to record as the prov:Activity in provenance metadata.
|
34
38
|
# If so, the implementation must be optional and handle `nil` values by
|
35
39
|
# declining to record provenance
|
36
40
|
#
|
37
41
|
# @return [Boolean] `true` if the run has succeeded; otherwise `false`
|
38
42
|
#
|
39
|
-
# @raise [RuntimeError] when the software agent's
|
43
|
+
# @raise [RuntimeError] when the software agent's process fails
|
40
44
|
#
|
41
45
|
# @see Krirkri::Activity
|
42
46
|
# @see Krikri::Job.run
|
data/lib/krikri/version.rb
CHANGED
data/spec/internal/Gemfile
CHANGED
@@ -2,7 +2,7 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
|
4
4
|
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
|
5
|
-
gem 'rails', '4.1.
|
5
|
+
gem 'rails', '4.1.14.1'
|
6
6
|
# Use sqlite3 as the database for Active Record
|
7
7
|
gem 'sqlite3'
|
8
8
|
# Use SCSS for stylesheets
|
@@ -11,7 +11,7 @@ gem 'sass-rails', '~> 4.0.3'
|
|
11
11
|
gem 'uglifier', '>= 1.3.0'
|
12
12
|
# Use CoffeeScript for .js.coffee assets and views
|
13
13
|
gem 'coffee-rails', '~> 4.0.0'
|
14
|
-
# See https://github.com/
|
14
|
+
# See https://github.com/rails/execjs#readme for more supported runtimes
|
15
15
|
# gem 'therubyracer', platforms: :ruby
|
16
16
|
|
17
17
|
# Use jquery as the JavaScript library
|
@@ -36,7 +36,7 @@ gem 'sdoc', '~> 0.4.0', group: :doc
|
|
36
36
|
# gem 'debugger', group: [:development, :test]
|
37
37
|
|
38
38
|
|
39
|
-
gem 'krikri', :path => '/
|
39
|
+
gem 'krikri', :path => '/Users/mark/Documents/Code/dpla/KriKri'
|
40
40
|
|
41
41
|
gem "factory_girl_rails", "~> 4.4.0", group: :development
|
42
42
|
gem "jettywrapper", "~> 2.0", group: :development
|