Module: Libis::Workflow::Base::WorkItem

Includes:
Enumerable, Logging, Status
Included in:
FileItem, Run, WorkItem
Defined in:
lib/libis/workflow/base/work_item.rb

Overview

Base module for all work items.

This module lacks the implementation for the data attributes. It functions as an interface that describes the common functionality regardless of the storage implementation. These attributes require some implementation:

  • parent: [Object|nil] a link to a parent work item. Work items can be organized in any hierarchy you think is

    relevant for your workflow (e.g. directory[/directory...]/file/line or library/section/book/page). Of course
    hierarchies are not mandatory.
    
  • items: [Array] a list of child work items. see above.

  • options: [Hash] a set of options for the task chain on how to deal with this work item. This attribute can be

    used to fine-tune the behaviour of tasks for a particular work item.
    
  • properties: [Hash] a set of properties, typically collected during the workflow processing and used to store

    final or intermediate resulst of tasks. The ::Lias::Ingester::FileItem module uses this attribute to store the
    properties (e.g. size, checksum, ...) of the file it represents.
    
  • status_log: [Array] a list of all status changes the work item went through.

  • summary: [Hash] collected statistics about the ingest for the work item and its children. This structure will

    be filled in by the included task ::Lias::Ingester::Tasks::Analyzer wich is appended to the workflow by default.
    

The module is created so that it is possible to implement an ActiveRecord/Datamapper/… implementation easily. A simple in-memory implementation would require:

attr_accessor :parent attr_accessor :items attr_accessor :options, :properties attr_accessor :status_log attr_accessor :summary

def initialize

self.parent = nil
self.items = []
self.options = {}
self.properties = {}
self.status_log = []
self.summary = {}

end

protected

## Method below should be adapted to match the implementation of the status array

def add_status_log(info)

self.status_log << info

end

The implementation should also take care that the public methods #save and #save! are implemented. ActiveRecord and Mongoid are known to implement these, but others may not.

Instance Method Summary collapse

Methods included from Logging

#<=, #add_log, #log_message

Methods included from Status

#check_status, #compare_status, #set_status, #status, #status_label, #status_progress, #status_text

Instance Method Details

#add_item(item) ⇒ Object Also known as: <<

Add a child work item

Parameters:

  • item (WorkItem)

    to be added to the child list :items



134
135
136
137
138
139
140
141
142
143
# File 'lib/libis/workflow/base/work_item.rb', line 134

def add_item(item)
  return self unless item and item.is_a?(Libis::Workflow::Base::WorkItem)
  self.items << item
  item.parent = self
  # noinspection RubyResolve
  self.save!
  # noinspection RubyResolve
  item.save!
  self
end

#each(&block) ⇒ Object

Iterates over the work item clients and invokes code on each of them.



121
122
123
# File 'lib/libis/workflow/base/work_item.rb', line 121

def each(&block)
  self.items.each(&block)
end

#get_item_listObject

Get list of items.

This method should return a list of items that is safe to iterate over while it is being altered.



157
158
159
# File 'lib/libis/workflow/base/work_item.rb', line 157

def get_item_list
  self.items.dup
end

#get_itemsObject

Get list of items.

This method should return a list of items that can be accessed during long processing times.



150
151
152
# File 'lib/libis/workflow/base/work_item.rb', line 150

def get_items
  self.items
end

#get_parentLibis::Workflow::Base::WorkItem

Return item’s parent



163
164
165
# File 'lib/libis/workflow/base/work_item.rb', line 163

def get_parent
  self.parent
end

#get_rootLibis::Workflow::Base::WorkItem

go up the hierarchy and return the topmost work item



170
171
172
# File 'lib/libis/workflow/base/work_item.rb', line 170

def get_root
  self.get_parent && self.get_parent.is_a?(Libis::Workflow::Base::WorkItem) && self.get_parent.get_root || self
end

#get_runLibis::Workflow::Base::Run

Get the top



177
178
179
180
# File 'lib/libis/workflow/base/work_item.rb', line 177

def get_run
  return self if self.is_a?(Libis::Workflow::Base::Run)
  self.get_parent&.get_run
end

#labelObject

Label is a more descriptive name



93
94
95
# File 'lib/libis/workflow/base/work_item.rb', line 93

def label
  self.properties['label'] || self.name
end

#label=(value) ⇒ Object



97
98
99
# File 'lib/libis/workflow/base/work_item.rb', line 97

def label=(value)
  self.properties['label'] = value
end

#labelpathObject



105
106
107
# File 'lib/libis/workflow/base/work_item.rb', line 105

def labelpath;
  self.labels.join('/');
end

#labelsObject



101
102
103
# File 'lib/libis/workflow/base/work_item.rb', line 101

def labels
  (self.parent.labels rescue Array.new).push(label).compact
end

#nameString

String representation of the identity of the work item.

You may want to overwrite this method as it tries the :name property or whatever #inspect returns if that failes. Typically this should return the key value, file name or id number. If that’s what your :name property contains, you’re fine.

Returns:

  • (String)

    string identification for this work item.



71
72
73
74
# File 'lib/libis/workflow/base/work_item.rb', line 71

def name
  # noinspection RubyResolve
  self.properties['name'] || self.inspect
end

#name=(n) ⇒ Object



76
77
78
# File 'lib/libis/workflow/base/work_item.rb', line 76

def name=(n)
  self.properties['name'] = n
end

#namepathObject



88
89
90
# File 'lib/libis/workflow/base/work_item.rb', line 88

def namepath;
  self.names.join('/');
end

#namesObject



84
85
86
# File 'lib/libis/workflow/base/work_item.rb', line 84

def names
  (self.parent.names rescue Array.new).push(name).compact
end

#sizeObject Also known as: count



125
126
127
# File 'lib/libis/workflow/base/work_item.rb', line 125

def size
  self.items.size
end

#to_filenameString

File name safe version of the to_s output.

The output should be safe to use as a file name to store work item data. Typical use is when extra file items are created by a task and need to be stored on disk. The default implementation URL-encodes (%xx) all characters except alphanumeric, ‘.’ and ‘-’.

Returns:

  • (String)

    file name



116
117
118
# File 'lib/libis/workflow/base/work_item.rb', line 116

def to_filename
  self.to_s.gsub(/[^\w.-]/) { |s| '%%%02x' % s.ord }
end

#to_sObject



80
81
82
# File 'lib/libis/workflow/base/work_item.rb', line 80

def to_s;
  self.name;
end