libis-workflow 2.0.beta.9 → 2.0.beta.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,246 @@
1
+ # encoding: utf-8
2
+
3
+ require 'backports/rails/hash'
4
+ require 'libis/tools/extend/hash'
5
+
6
+ require 'libis/workflow/config'
7
+
8
+ module Libis
9
+ module Workflow
10
+ module Base
11
+
12
+ # Base module for all work items.
13
+ #
14
+ # This module lacks the implementation for the data attributes. It functions as an interface that describes the
15
+ # common functionality regardless of the storage implementation. These attributes require some implementation:
16
+ #
17
+ # - status: [Symbol] the status field. Each task sets the status of the items it works on. Before starting processing
18
+ # the status is set to "#{task_name}Started". After successfull processing it is set to "#{task_name}Done" and if
19
+ # the task failed, it is set to "#{task_name}Failed". The status field can be used to perform real-time
20
+ # monitoring, reporting and error-recovery or restart of the ingest.
21
+ # The initial value for this attribute is :START.
22
+ # - parent: [Object|nil] a link to a parent work item. Work items can be organized in any hierarchy you think is
23
+ # relevant for your workflow (e.g. directory[/directory...]/file/line or library/section/book/page). Of course
24
+ # hierarchies are not mandatory.
25
+ # - items: [Array] a list of child work items. see above.
26
+ # - options: [Hash] a set of options for the task chain on how to deal with this work item. This attribute can be
27
+ # used to fine-tune the behaviour of tasks for a particular work item.
28
+ # - properties: [Hash] a set of properties, typically collected during the workflow processing and used to store
29
+ # final or intermediate resulst of tasks. The ::Lias::Ingester::FileItem module uses this attribute to store the
30
+ # properties (e.g. size, checksum, ...) of the file it represents.
31
+ # - log_history: [Array] a list of all logging messages collected for this work item. Whenever a task logs a message
32
+ # it will automatically be registered for the work item that it is processing or for the work item that was
33
+ # supplied as the first argument.
34
+ # - status_log: [Array] a list of all status changes the work item went through.
35
+ # - summary: [Hash] collected statistics about the ingest for the work item and its children. This structure will
36
+ # be filled in by the included task ::Lias::Ingester::Tasks::Analyzer wich is appended to the workflow by default.
37
+ #
38
+ # The module is created so that it is possible to implement an ActiveRecord/Datamapper/... implementation easily.
39
+ # A simple in-memory implementation would require:
40
+ #
41
+ # attr_accessor :parent
42
+ # attr_accessor :items
43
+ # attr_accessor :options, :properties
44
+ # attr_accessor :log_history, :status_log
45
+ # attr_accessor :summary
46
+ #
47
+ # def initialize
48
+ # self.parent = nil
49
+ # self.items = []
50
+ # self.options = {}
51
+ # self.properties = {}
52
+ # self.log_history = []
53
+ # self.status_log = []
54
+ # self.summary = {}
55
+ # end
56
+ #
57
+ # protected
58
+ #
59
+ # ## Methods below should be adapted to match the implementation of the log arrays
60
+ #
61
+ # def add_log_entry(msg)
62
+ # self.log_history << msg.merge(c_at: ::Time.now)
63
+ # end
64
+ #
65
+ # def add_status_log(message, tasklist = nil)
66
+ # self.status_log << { c_at: ::Time.now, tasklist: tasklist, text: message }.cleanup
67
+ # end
68
+ #
69
+ # def status_label(status_entry)
70
+ # "#{status_entry[:tasklist].last rescue nil}#{status_entry[:text] rescue nil}"
71
+ # end
72
+ #
73
+ module WorkItem
74
+ include Enumerable
75
+
76
+ # String representation of the identity of the work item.
77
+ #
78
+ # You may want to overwrite this method as it tries the :name property or whatever #inspect returns if that
79
+ # failes. Typically this should return the key value, file name or id number. If that's what your :name property
80
+ # contains, you're fine.
81
+ #
82
+ # @return [String] string identification for this work item.
83
+ def name
84
+ # noinspection RubyResolve
85
+ self.properties[:name] || self.inspect
86
+ end
87
+
88
+ def to_s;
89
+ self.name;
90
+ end
91
+
92
+ def names
93
+ (self.parent.names rescue Array.new).push(name).compact
94
+ end
95
+
96
+ def namepath;
97
+ self.names.join('/');
98
+ end
99
+
100
+ # File name save version of the to_s output. The output should be safe to use as a file name to store work item
101
+ # data. Typical use is when extra file items are created by a task and need to be stored on disk. The default
102
+ # implementation URL-encodes (%xx) all characters except alphanumeric, '.' and '-'.
103
+ #
104
+ # @return [String] file name
105
+ def to_filename
106
+ self.to_s.gsub(/[^\w.-]/) { |s| '%%%02x' % s.ord }
107
+ end
108
+
109
+ # Gets the current status of the object.
110
+ #
111
+ # @return [Symbol] status code
112
+ def status
113
+ s = self.status_log.last
114
+ label = status_label(s)
115
+ label.empty? ? :NOT_STARTED : label.to_sym
116
+ end
117
+
118
+ # Changes the status of the object. The status changed is logged in the status_log with the current timestamp.
119
+ #
120
+ # @param [Symbol] s
121
+ def status=(s, tasklist = nil)
122
+ s, tasklist = s if s.is_a? Array
123
+ s = s.to_sym
124
+ add_status_log(s, tasklist)
125
+ self.save
126
+ end
127
+
128
+ # Check ingest status of the object. The status is checked to see if it ends in 'Failed'.
129
+ #
130
+ # @return [Boolean] true if the object failed, false otherwise
131
+ def failed?
132
+ self.status.to_s =~ /Failed$/i ? true : false
133
+ end
134
+
135
+ # Helper function for the Tasks to add a log entry to the log_history.
136
+ #
137
+ # The supplied message structure is expected to contain the following fields:
138
+ # - :severity : ::Logger::Severity value
139
+ # - :id : optional message id
140
+ # - :text : message text
141
+ # - :task : list of tasks names (task hierarchy) that submits the message
142
+ #
143
+ # @param [Hash] message
144
+ def add_log(message = {})
145
+ msg = message_struct(message)
146
+ add_log_entry(msg)
147
+ self.save
148
+ end
149
+
150
+ def <=(message = {})
151
+ ; self.add_log(message);
152
+ end
153
+
154
+ # Iterates over the work item clients and invokes code on each of them.
155
+ def each
156
+ self.items.each { |item| yield item }
157
+ end
158
+
159
+ # Add a child work item
160
+ #
161
+ # @param [WorkItem] item to be added to the child list :items
162
+ def add_item(item)
163
+ return self unless item and item.is_a? WorkItem
164
+ self.items << item
165
+ item.parent = self
166
+ self.save!
167
+ item.save!
168
+ self
169
+ end
170
+
171
+ alias :<< :add_item
172
+
173
+ # Dummy method. It is a placeholder for DB backed implementations. Wherever appropriate WorkItem#save will be
174
+ # called to save the current item's state. If state needs to persisted, you should override this method or make
175
+ # sure your persistence layer implements it in your class.
176
+ def save
177
+ end
178
+
179
+ # Dummy method. It is a placeholder for DB backed implementations. Wherever appropriate WorkItem#save will be
180
+ # called to save the current item's state. If state needs to persisted, you should override this method or make
181
+ # sure your persistence layer implements it in your class.
182
+ def save!
183
+ end
184
+
185
+ # Add a structured message to the log history. The message text can be submitted as an integer or text. If an
186
+ # integer is submitted, it will be used to look up the text in the MessageRegistry. The message text will be
187
+ # passed to the % operator with the args parameter. If that failes (e.g. because the format string is not correct)
188
+ # the args value is appended to the message.
189
+ #
190
+ # @param [Symbol] severity
191
+ # @param [Hash] msg should contain message text as :id or :text and the hierarchical name of the task as :task
192
+ # @param [Array] args string format values
193
+ def log_message(severity, msg, *args)
194
+ # Prepare info from msg struct for use with string substitution
195
+ message_id, message_text = if msg[:id]
196
+ [msg[:id], MessageRegistry.instance.get_message(msg[:id])]
197
+ elsif msg[:text]
198
+ [0, msg[:text]]
199
+ else
200
+ [0, '']
201
+ end
202
+ task = msg[:task] || '*UNKNOWN*'
203
+ message_text = (message_text % args rescue "#{message_text} - #{args}")
204
+
205
+ self.add_log severity: severity, id: message_id.to_i, text: message_text, task: task
206
+ name = ''
207
+ begin
208
+ name = self.to_s
209
+ name = self.name
210
+ name = self.namepath
211
+ rescue
212
+ # do nothing
213
+ end
214
+ Config.logger.add(severity, message_text, ('%s - %s ' % [task, name]))
215
+ end
216
+
217
+ protected
218
+
219
+ SEV_LABEL = %w(DEBUG INFO WARN ERROR FATAL ANY) unless const_defined? :SEV_LABEL
220
+
221
+ # go up the hierarchy and return the topmost work item
222
+ #
223
+ # @return [WorkItem] the root work item
224
+ def root
225
+ root = self
226
+ root = root.parent while root.parent and root.parent.is_a? WorkItem
227
+ root
228
+ end
229
+
230
+ # create and return a proper message structure
231
+ # @param [Hash] opts
232
+ def message_struct(opts = {})
233
+ opts.reverse_merge!(severity: ::Logger::INFO, code: nil, text: '')
234
+ {
235
+ severity: SEV_LABEL[opts[:severity]],
236
+ task: opts[:task],
237
+ code: opts[:code],
238
+ message: opts[:text]
239
+ }.cleanup
240
+ end
241
+
242
+ end
243
+
244
+ end
245
+ end
246
+ end
@@ -5,12 +5,70 @@ require 'libis/tools/parameter'
5
5
  module Libis
6
6
  module Workflow
7
7
  module Base
8
+
9
+ # This is the base module for Workflows.
10
+ #
11
+ # This module lacks the implementation for the data attributes. It functions as an interface that describes the
12
+ # common functionality regardless of the storage implementation. These attributes require some implementation:
13
+ #
14
+ # - name: [String] the name of the Workflow. The name will be used to identify the workflow. Each time a workflow
15
+ # is executed, a Run will be created. The Run will get a name that starts with the workflow name and ends with
16
+ # the date and time the Run was started. As such this name attribute serves as an identifier and should be
17
+ # treated as such. If possible is should be unique.
18
+ # - description: [String] more information about the workflow.
19
+ # - config: [Hash] detailed configuration for the workflow. The application assumes it behaves as a Hash and will
20
+ # access it with [], merge! and delete methods. If your implementation decides to implement it with another
21
+ # object, it should implement above methods. The config Hash requires the following keys:
22
+ # - run_object: [String] the full class name of the Run implementation object that should be created when the
23
+ # Workflow is executed.
24
+ # - input: [Hash] all input parameter definitions where the key is the parameter name and the value is another
25
+ # Hash with arguments for the parameter definition. It typically contains the following arguments:
26
+ # - default: default value if no value specified when the workflow is executed
27
+ # - propagate_to: the task name (or path) and parameter name that any set value for this parameter will be
28
+ # propagated to. The syntax is <task name|task path>[#<parameter name>]. It the #<parameter name> part
29
+ # is not present, the same name as the input parameter is used. If you want to push the value to
30
+ # multiple task parameters, you can either supply an array of propagate paths or put them in a string
31
+ # separated by a ','.
32
+ # - tasks: [Array] task definitions that define the order in which the tasks should be executed for the workflow.
33
+ # A task definition is a Hash with the following values:
34
+ # - class: [String] the class name of the task including the module names
35
+ # - name: [String] optional if class is present. A friendly name for the task that will be used in the logs.
36
+ # - subitems: [Boolean] execute the task on the items in the current level or on the
37
+ # child items of the current level. This parameter can be used in combination with the subtasks to
38
+ # control what objects in the hierarchy the tasks are executed against.
39
+ # - recursive: [Boolean] execute the task for the current level items only or automatically recurse through
40
+ # the item's hierarchy and execute on all items below.
41
+ # - tasks: [Array] a list of subtask defintions for this task.
42
+ # Additionally the task definition Hash may specify values for any other parameter that the task knows of.
43
+ # All tasks have parameters 'quiet', 'always_run', 'abort_on_error'. For more information about these see
44
+ # the documentation of the task class.
45
+ # A task definition does not require to have a 'class' entry. If not present the default
46
+ # ::Libis::Workflow::Task class will be instatiated. It will do nothing itself, but will execute the
47
+ # subtasks on the item(s). In such case a 'name' is mandatory.
48
+ #
49
+ # A minimal in-memory implementation could be:
50
+ #
51
+ # class Workflow
52
+ # include ::Libis::Workflow::Base::Workflow
53
+ #
54
+ # attr_accessor :name, :description, :config
55
+ #
56
+ # def initialize
57
+ # @name = ''
58
+ # @descripition = ''
59
+ # @config = Hash.new
60
+ # end
61
+ #
62
+ # end
63
+ #
8
64
  module Workflow
9
65
 
10
66
  module ClassMethods
11
67
  def require_all
12
68
  Config.require_all(File.join(File.dirname(__FILE__), '..', 'tasks'))
69
+ # noinspection RubyResolve
13
70
  Config.require_all(Config.taskdir)
71
+ # noinspection RubyResolve
14
72
  Config.require_all(Config.itemdir)
15
73
  end
16
74
  end
@@ -19,20 +77,11 @@ module Libis
19
77
  base.extend ClassMethods
20
78
  end
21
79
 
22
- def name; raise RuntimeError.new "Method not implemented: #{caller[0]}"; end
23
- def name=(_) ; raise RuntimeError.new "Method not implemented: #{caller[0]}"; end
24
-
25
- def description; raise RuntimeError.new "Method not implemented: #{caller[0]}"; end
26
- def description=(_); raise RuntimeError.new "Method not implemented: #{caller[0]}"; end
27
-
28
- def config; raise RuntimeError.new "Method not implemented: #{caller[0]}"; end
29
- def config=(_); raise RuntimeError.new "Method not implemented: #{caller[0]}"; end
30
-
31
80
  def configure(cfg)
81
+ self.name = cfg.delete(:name) || self.class.name
82
+ self.description = cfg.delete(:description) || ''
32
83
  self.config.merge! input: {}, tasks: []
33
84
  self.config.merge! cfg
34
- self.name = self.config.delete(:name) || self.class.name
35
- self.description = self.config.delete(:description) || ''
36
85
 
37
86
  self.class.require_all
38
87
 
@@ -45,11 +94,15 @@ module Libis
45
94
 
46
95
  def input
47
96
  self.config[:input].inject({}) do |hash, input_def|
48
- parameter = ::Libis::Tools::Parameter.new input_def.first.to_sym
97
+ name = input_def.first.to_sym
98
+ default = input_def.last[:default] || ''
99
+ parameter = ::Libis::Tools::Parameter.new name, default
49
100
  input_def.last.each { |k, v| parameter[k.to_sym] = v}
50
101
  hash[input_def.first.to_sym] = parameter
51
102
  hash
52
103
  end
104
+ rescue
105
+ {}
53
106
  end
54
107
 
55
108
  def run_name(timestamp = Time.now)
@@ -89,7 +142,7 @@ module Libis
89
142
  options[key] = parameter.parse(options[key])
90
143
  propagate_to = []
91
144
  propagate_to = parameter[:propagate_to] if parameter[:propagate_to].is_a? Array
92
- propagate_to = [parameter[:propagate_to]] if parameter[:propagate_to].is_a? String
145
+ propagate_to = parameter[:propagate_to].split(/\s*,\s*/) if parameter[:propagate_to].is_a? String
93
146
  propagate_to.each do |target|
94
147
  task_name, param_name = target.split('#')
95
148
  param_name ||= key
@@ -0,0 +1,6 @@
1
+ require_relative 'base/logger'
2
+ require_relative 'base/work_item'
3
+ require_relative 'base/file_item'
4
+ require_relative 'base/dir_item'
5
+ require_relative 'base/run'
6
+ require_relative 'base/workflow'
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ require 'libis/workflow/file_item'
4
+
5
+ module Libis
6
+ module Workflow
7
+
8
+ class DirItem < ::Libis::Workflow::FileItem
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ require 'digest'
4
+
5
+ require 'libis/workflow/base/file_item'
6
+ require 'libis/workflow/work_item'
7
+
8
+ module Libis
9
+ module Workflow
10
+
11
+ # noinspection RubyResolve
12
+ class FileItem < ::Libis::Workflow::WorkItem
13
+ include ::Libis::Workflow::Base::FileItem
14
+
15
+ end
16
+ end
17
+ end
@@ -4,20 +4,19 @@ require 'libis/workflow/config'
4
4
  require 'libis/workflow/workflow'
5
5
 
6
6
  require 'libis/workflow/base/run'
7
+ require 'libis/workflow/work_item'
7
8
 
8
9
  module Libis
9
10
  module Workflow
10
11
 
11
- class Run
12
+ class Run < ::Libis::Workflow::WorkItem
12
13
  include ::Libis::Workflow::Base::Run
13
14
 
14
- attr_accessor :start_date, :tasks, :workflow
15
+ attr_accessor :start_date, :workflow
15
16
 
16
17
  def initialize
17
18
  @start_date = Time.now
18
- @tasks = nil
19
19
  @workflow = nil
20
- # noinspection RubySuperCallWithoutSuperclassInspection
21
20
  super
22
21
  end
23
22
 
@@ -3,9 +3,9 @@ require 'backports/rails/hash'
3
3
  require 'backports/rails/string'
4
4
 
5
5
  require 'libis/tools/parameter'
6
+ require 'libis/tools/extend/hash'
6
7
 
7
8
  require 'libis/workflow'
8
- require 'libis/workflow/base/logger'
9
9
 
10
10
  module Libis
11
11
  module Workflow
@@ -39,7 +39,7 @@ module Libis
39
39
 
40
40
  def run(item)
41
41
 
42
- check_item_type WorkItem, item
42
+ check_item_type ::Libis::Workflow::Base::WorkItem, item
43
43
 
44
44
  return if item.failed? unless parameter(:always_run)
45
45
 
@@ -64,8 +64,9 @@ module Libis
64
64
  log_started item
65
65
 
66
66
  pre_process item
67
- process_item item
68
- post_process workitem
67
+ i = process_item item
68
+ item = i if i.is_a? Libis::Workflow::Base::WorkItem
69
+ post_process item
69
70
 
70
71
  rescue WorkflowError => e
71
72
  error e.message
@@ -92,14 +93,20 @@ module Libis
92
93
  def namepath; self.names.join('/'); end
93
94
 
94
95
  def apply_options(opts)
95
- o = opts[self.name] || opts[self.names.join('/')]
96
-
97
-
98
- default_values.each do |name,_|
99
- next unless o.key?(name)
100
- parameter = get_parameter_definition name
101
- self.parameter(name, parameter.parse(o[name]))
102
- end if o and o.is_a? Hash
96
+ o = {}
97
+ o.merge!(opts[self.class.to_s] || {})
98
+ o.merge!(opts[self.name] || opts[self.names.join('/')] || {})
99
+ o.key_strings_to_symbols! recursive: true
100
+
101
+ if o and o.is_a? Hash
102
+ default_values.each do |name, _|
103
+ next unless o.key?(name)
104
+ next unless o[name]
105
+ parameter = get_parameter_definition name
106
+ next unless (value = parameter.parse(o[name]))
107
+ self.parameter(name, value)
108
+ end
109
+ end
103
110
 
104
111
  self.tasks.each do |task|
105
112
  task.apply_options opts
@@ -110,16 +117,14 @@ module Libis
110
117
 
111
118
  def log_started(item)
112
119
  item.status = to_status :started
113
- debug 'Started', item
114
120
  end
115
121
 
116
122
  def log_failed(item, message = nil)
117
- warn (message || 'Failed'), item
123
+ warn (message), item if message
118
124
  item.status = to_status :failed
119
125
  end
120
126
 
121
127
  def log_done(item)
122
- debug 'Completed', item
123
128
  item.status = to_status :done
124
129
  end
125
130
 
@@ -210,7 +215,7 @@ module Libis
210
215
  cfg[:options] || {}
211
216
  ).merge(
212
217
  cfg.reject { |k, _| [:options].include? k.to_sym }
213
- ).symbolize_keys!.each { |k,v| parameter(k, v) }
218
+ ).symbolize_keys!.each { |k,v| self[k] = v }
214
219
  end
215
220
 
216
221
  def to_status(text)
@@ -248,7 +253,7 @@ module Libis
248
253
  end
249
254
 
250
255
  def self.default_values
251
- parameters.inject({}) do |hash,parameter|
256
+ parameter_defs.inject({}) do |hash,parameter|
252
257
  hash[parameter.first] = parameter.last[:default]
253
258
  hash
254
259
  end
@@ -8,8 +8,11 @@ module Libis
8
8
 
9
9
  class Analyzer < Task
10
10
 
11
- parameter quiet: true
12
- parameter always_run: true
11
+ parameter quiet: true, frozen: true
12
+ parameter abort_on_error: false, frozen: true
13
+ parameter always_run: true, frozen: true
14
+ parameter subitems: false, frozen: true
15
+ parameter recursive: false, frozen: true
13
16
 
14
17
  def run(item)
15
18
 
@@ -30,7 +33,7 @@ module Libis
30
33
  end
31
34
  end
32
35
 
33
- rescue Exception => ex
36
+ rescue RuntimeError => ex
34
37
 
35
38
  puts 'Failed to analyze item: %s - %s' % [item.class, item.name]
36
39
  puts 'Exception: %s' % ex.message
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Libis
4
4
  module Workflow
5
- VERSION = '2.0.beta.9' unless const_defined? :VERSION # the guard is against a redefinition warning that happens on Travis
5
+ VERSION = '2.0.beta.10' unless const_defined? :VERSION # the guard is against a redefinition warning that happens on Travis
6
6
  end
7
7
  end
@@ -0,0 +1,51 @@
1
+ # encoding: utf-8
2
+ require 'libis/tools/extend/hash'
3
+ require 'libis/workflow/base/work_item'
4
+
5
+ module Libis
6
+ module Workflow
7
+
8
+ # In-memory implementation of ::Libis::Workflow::Base::WorkItem
9
+ class WorkItem
10
+ include ::Libis::Workflow::Base::WorkItem
11
+
12
+ attr_accessor :parent
13
+ attr_accessor :items
14
+ attr_accessor :options, :properties
15
+ attr_accessor :log_history, :status_log
16
+ attr_accessor :summary
17
+
18
+ def initialize
19
+ self.parent = nil
20
+ self.items = []
21
+ self.options = {}
22
+ self.properties = {}
23
+ self.log_history = []
24
+ self.status_log = []
25
+ self.summary = {}
26
+ end
27
+
28
+ protected
29
+
30
+ def add_log_entry(msg)
31
+ # noinspection RubyResolve
32
+ self.log_history << msg.merge(c_at: ::Time.now)
33
+ end
34
+
35
+ def add_status_log(message, tasklist = nil)
36
+ # noinspection RubyResolve
37
+ self.status_log << {
38
+ timestamp: ::Time.now,
39
+ tasklist: tasklist,
40
+ text: message
41
+ }.cleanup
42
+ end
43
+
44
+ def status_label(status_entry)
45
+ "#{status_entry[:tasklist].last rescue nil}#{status_entry[:text] rescue nil}"
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+ end
@@ -7,16 +7,23 @@ module Libis
7
7
  autoload :MessageRegistry, 'libis/workflow/message_registry'
8
8
  autoload :Config, 'libis/workflow/config'
9
9
 
10
- autoload :WorkItem, 'libis/workflow/workitems/work_item'
11
- autoload :FileItem, 'libis/workflow/workitems/file_item'
12
- autoload :DirItem, 'libis/workflow/workitems/dir_item'
10
+ module Base
11
+ autoload :WorkItem, 'libis/workflow/base/work_item'
12
+ autoload :FileItem, 'libis/workflow/base/file_item'
13
+ autoload :DirItem, 'libis/workflow/base/dir_item'
14
+ autoload :Logger, 'libis/workflow/base/logger'
15
+ autoload :Run, 'libis/workflow/base/run'
16
+ autoload :Workflow, 'libis/workflow/base/workflow'
17
+ end
18
+
19
+ autoload :WorkItem, 'libis/workflow/work_item'
20
+ autoload :FileItem, 'libis/workflow/file_item'
21
+ autoload :DirItem, 'libis/workflow/dir_item'
13
22
 
14
23
  autoload :Workflow, 'libis/workflow/workflow'
15
24
  autoload :Run, 'libis/workflow/run'
16
25
  autoload :Task, 'libis/workflow/task'
17
26
 
18
- autoload :Parameter, 'libis/workflow/parameter'
19
-
20
27
  autoload :Worker, 'libis/workflow/worker'
21
28
 
22
29
  def self.configure
@@ -25,4 +32,3 @@ module Libis
25
32
 
26
33
  end
27
34
  end
28
-
@@ -1,8 +1,7 @@
1
1
  # encoding: utf-8
2
- require 'libis/workflow/workitems'
2
+ require 'libis/workflow/dir_item'
3
3
 
4
- class TestDirItem
5
- include ::Libis::Workflow::DirItem
4
+ class TestDirItem < ::Libis::Workflow::DirItem
6
5
 
7
6
  def name=(dir)
8
7
  raise RuntimeError, "'#{dir}' is not a directory" unless File.directory? dir
@@ -1,10 +1,9 @@
1
1
  # encoding: utf-8
2
2
  require 'libis/tools/checksum'
3
3
 
4
- require 'libis/workflow/workitems'
4
+ require 'libis/workflow/file_item'
5
5
 
6
- class TestFileItem
7
- include ::Libis::Workflow::FileItem
6
+ class TestFileItem < ::Libis::Workflow::FileItem
8
7
 
9
8
  def filename=(file)
10
9
  raise RuntimeError, "'#{file}' is not a file" unless File.file? file
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- require 'libis/workflow/workitems'
2
+ require 'libis/workflow/run'
3
3
 
4
4
  require_relative 'test_dir_item'
5
5