Class: Krikri::Activity

Inherits:
ActiveRecord::Base
  • Object
show all
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

Instance Method Summary collapse

Instance Attribute Details

#agentString

Returns a string representing the Krikri::SoftwareAgent responsible for the activity.

Returns:

  • (String)

    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_timeDateTime

Returns a datestamp marking the activity's competion

Returns:

  • (DateTime)

    a datestamp marking the activity's competion


22
# File 'app/models/krikri/activity.rb', line 22

validate :agent_must_be_a_software_agent

#optsJSON

Returns the options to pass to the #agent class when running the activity

Returns:

  • (JSON)

    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_timeDateTime

Returns a datestamp marking the activity's start

Returns:

  • (DateTime)

    a datestamp marking the activity's start


22
# File 'app/models/krikri/activity.rb', line 22

validate :agent_must_be_a_software_agent

Instance Method Details

#agent_instanceAgent

Instantiates and returns an instance of the Agent class with the values in opts.

Returns:

  • (Agent)

    an instance of the class stored in Agent


74
75
76
# File 'app/models/krikri/activity.rb', line 74

def agent_instance
  @agent_instance ||= agent.constantize.new(parsed_opts)
end

#agent_must_be_a_software_agentObject


24
25
26
27
# File 'app/models/krikri/activity.rb', line 24

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.

Returns:

  • (Boolean)

    `true` if the activity has been marked as ended, else `false`


65
66
67
# File 'app/models/krikri/activity.rb', line 65

def ended?
  !self.end_time.nil?
end

#parsed_optsObject


78
79
80
# File 'app/models/krikri/activity.rb', line 78

def parsed_opts
  JSON.parse(opts, symbolize_names: true)
end

#rdf_subjectObject


82
83
84
85
# File 'app/models/krikri/activity.rb', line 82

def rdf_subject
  RDF::URI(Krikri::Settings['marmotta']['ldp']) /
    Krikri::Settings['prov']['activity'] / id.to_s
end

#runObject

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.


43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'app/models/krikri/activity.rb', line 43

def run
  if block_given?
    update_attribute(:end_time, nil) if ended?
    set_start_time
    begin
      yield agent_instance, rdf_subject
    rescue => e
      Rails.logger.error("Error performing Activity: #{id}\n" \
                         "#{e.message}\n#{e.backtrace}")
      raise e
    ensure
      set_end_time
    end
  end
end

#set_end_timeObject


33
34
35
36
37
38
# File 'app/models/krikri/activity.rb', line 33

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_timeObject


29
30
31
# File 'app/models/krikri/activity.rb', line 29

def set_start_time
  update_attribute(:start_time, DateTime.now.utc)
end