Class: Krikri::Activity
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Krikri::Activity
- Defined in:
- app/models/krikri/activity.rb
Overview
Activity wraps code execution with metadata about when it ran, which agents were responsible. It is designed to run a variety of different jobs, and its #run method is passed a block that performs the actual work. It records the start and end time of the job run, and provides the name of the agent to whomever needs it, but it does not care what kind of activity it is – harvest, enrichment, etc.
Instance Attribute Summary collapse
-
#agent ⇒ String
A string representing the Krikri::SoftwareAgent responsible for the activity.
-
#end_time ⇒ DateTime
A datestamp marking the activity’s competion.
-
#opts ⇒ JSON
The options to pass to the #agent class when running the activity.
-
#start_time ⇒ DateTime
A datestamp marking the activity’s start.
Class Method Summary collapse
-
.base_uri ⇒ RDF::URI
The configured base URI for this class.
-
.from_uri(uri) ⇒ Krikri::Activity
The activity with the given uri.
Instance Method Summary collapse
-
#agent_instance ⇒ Agent
Instantiates and returns an instance of the Agent class with the values in opts.
- #agent_must_be_a_software_agent ⇒ Object
-
#ended? ⇒ Boolean
Indicates whether the activity has ended.
-
#entities(*args) ⇒ Enumerator
Return an Enumerator of entities (e.g. aggregations or original records) that have been affected by this activity.
-
#entity_uris(include_invalidated = false) ⇒ Enumerator
Return an Enumerator of URI strings of entities (e.g. aggregations or original records) that pertain to this activity.
-
#parsed_opts ⇒ Hash
The options parsed as JSON.
-
#rdf_subject ⇒ RDF::URI
(also: #to_term)
The uri for this activity.
-
#run ⇒ Object
Runs the block, setting the start and end time of the run.
- #set_end_time ⇒ Object
- #set_start_time ⇒ Object
-
#to_s ⇒ String
A string reprerestation of the activity.
Instance Attribute Details
#agent ⇒ String
Returns a string representing the Krikri::SoftwareAgent responsible for the activity.
22 |
# File 'app/models/krikri/activity.rb', line 22 validate :agent_must_be_a_software_agent |
#end_time ⇒ DateTime
Returns a datestamp marking the activity’s competion.
22 |
# File 'app/models/krikri/activity.rb', line 22 validate :agent_must_be_a_software_agent |
#opts ⇒ JSON
Returns the options to pass to the #agent class when running the activity.
22 |
# File 'app/models/krikri/activity.rb', line 22 validate :agent_must_be_a_software_agent |
#start_time ⇒ DateTime
Returns a datestamp marking the activity’s start.
22 |
# File 'app/models/krikri/activity.rb', line 22 validate :agent_must_be_a_software_agent |
Class Method Details
.base_uri ⇒ RDF::URI
Returns the configured base URI for this class.
29 30 31 32 |
# File 'app/models/krikri/activity.rb', line 29 def self.base_uri RDF::URI.intern(Krikri::Settings['marmotta']['ldp']) / Krikri::Settings['prov']['activity'] end |
.from_uri(uri) ⇒ Krikri::Activity
Returns the activity with the given uri.
41 42 43 44 45 46 47 |
# File 'app/models/krikri/activity.rb', line 41 def self.from_uri(uri) raise "Cannot find #{self} from URI: #{uri}; " \ "the requested uri does not match #{base_uri}" unless uri.start_with? base_uri find(uri.to_s.sub(base_uri.to_s, '').sub('/', '')) end |
Instance Method Details
#agent_instance ⇒ Agent
Instantiates and returns an instance of the Agent class with the values in opts.
107 108 109 |
# File 'app/models/krikri/activity.rb', line 107 def agent_instance @agent_instance ||= agent.constantize.new(parsed_opts) end |
#agent_must_be_a_software_agent ⇒ Object
49 50 51 52 |
# File 'app/models/krikri/activity.rb', line 49 def agent_must_be_a_software_agent errors.add(:agent, 'does not represent a SoftwareAgent') unless agent.constantize < Krikri::SoftwareAgent end |
#ended? ⇒ Boolean
Indicates whether the activity has ended. Does not distinguish between successful and failed completion states.
98 99 100 |
# File 'app/models/krikri/activity.rb', line 98 def ended? !self.end_time.nil? end |
#entities(*args) ⇒ Enumerator
Return an Enumerator of entities (e.g. aggregations or original records) that have been affected by this activity.
The kind of object that is returned depends on the EntityBehavior class that is associated with the SoftwareAgent class that is represented by the Activity’s ‘agent’ field.
162 163 164 |
# File 'app/models/krikri/activity.rb', line 162 def entities(*args) agent.constantize.entity_behavior.entities(self, *args) end |
#entity_uris(include_invalidated = false) ⇒ Enumerator
Return an Enumerator of URI strings of entities (e.g. aggregations or original records) that pertain to this activity
142 143 144 145 146 147 148 149 |
# File 'app/models/krikri/activity.rb', line 142 def entity_uris(include_invalidated = false) activity_uri = RDF::URI(rdf_subject) # This activity's LDP URI query = Krikri::ProvenanceQueryClient .find_by_activity(activity_uri, include_invalidated) query.each_solution.lazy.map do |s| s.record.to_s end end |
#parsed_opts ⇒ Hash
Returns the options parsed as JSON.
113 114 115 |
# File 'app/models/krikri/activity.rb', line 113 def parsed_opts JSON.parse(opts, symbolize_names: true) end |
#rdf_subject ⇒ RDF::URI Also known as: to_term
Returns the uri for this activity.
119 120 121 |
# File 'app/models/krikri/activity.rb', line 119 def rdf_subject self.class.base_uri / id.to_s end |
#run ⇒ Object
Runs the block, setting the start and end time of the run. The given block is passed an instance of the agent, and a URI representing this Activity.
Handles logging of activity start/stop and failure states.
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'app/models/krikri/activity.rb', line 72 def run if block_given? update_attribute(:end_time, nil) if ended? Krikri::Logger .log(:info, "Activity #{agent.constantize}-#{id} is running") set_start_time begin yield agent_instance, rdf_subject rescue => e Krikri::Logger.log(:error, "Error performing Activity: #{id}\n" \ "#{e.}\n#{e.backtrace}") raise e ensure set_end_time Krikri::Logger .log(:info, "Activity #{agent.constantize}-#{id} is done") end end end |
#set_end_time ⇒ Object
58 59 60 61 62 63 |
# File 'app/models/krikri/activity.rb', line 58 def set_end_time now = DateTime.now.utc fail 'Start time must exist and be before now to set an end time' unless self[:start_time] && (self[:start_time] <= now) update_attribute(:end_time, now) end |
#set_start_time ⇒ Object
54 55 56 |
# File 'app/models/krikri/activity.rb', line 54 def set_start_time update_attribute(:start_time, DateTime.now.utc) end |
#to_s ⇒ String
Returns a string reprerestation of the activity.
126 127 128 |
# File 'app/models/krikri/activity.rb', line 126 def to_s inspect.to_s end |