ruby-jobs 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/job_base/job.rb +228 -0
- data/lib/job_base/job_logging.rb +43 -0
- data/lib/logging/plain_logger.rb +92 -0
- data/lib/logging/progress_logger.rb +52 -0
- data/lib/ruby-jobs.rb +5 -0
- metadata +49 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d6997cd1ced4df1ccabb37b460026977a393a06f
|
4
|
+
data.tar.gz: 9c8968f82980eaad85b4a1dcaa3693f39806bba6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1f8575e84d7d2e454707a13b3623b1fffaefc578c56fdc91b1ecbed8953de5f2504fa49e9db17096f0fc34ec2afeb5c3aa5e2334ee193db2ae5727c72e60c32d
|
7
|
+
data.tar.gz: 5cb4943b59e93608959e94ca0ceead2dff728f43408ac3ebfb71cc7a013959e6290fb46582525019ad6ef866b089d87d6917402a13282e205d52f3fddd8f1a92
|
data/lib/job_base/job.rb
ADDED
@@ -0,0 +1,228 @@
|
|
1
|
+
require_relative 'job_logging'
|
2
|
+
|
3
|
+
module RubyJobs
|
4
|
+
module JobBase
|
5
|
+
class Job
|
6
|
+
include JobLogging
|
7
|
+
|
8
|
+
@@bootstrapped = false
|
9
|
+
@@requires_rails = nil
|
10
|
+
@@puts_overridden = false
|
11
|
+
|
12
|
+
def initialize(defaults=nil)
|
13
|
+
@values = self.class.defaults.dup
|
14
|
+
@values.merge! defaults unless defaults.nil?
|
15
|
+
end
|
16
|
+
|
17
|
+
def instance
|
18
|
+
@instance
|
19
|
+
end
|
20
|
+
|
21
|
+
def job_name
|
22
|
+
self.class.name.gsub(/([^$])([A-Z])/, '\1_\2').downcase # underscore without rails
|
23
|
+
end
|
24
|
+
|
25
|
+
def run(values=nil, &block)
|
26
|
+
@running = true
|
27
|
+
|
28
|
+
puts_block = @puts_block || self.class.puts_block
|
29
|
+
if puts_block && !@@puts_overridden
|
30
|
+
@@puts_overridden = true
|
31
|
+
@puts_overridden = true
|
32
|
+
|
33
|
+
Kernel.send(:define_method, :puts) do |m|
|
34
|
+
puts_block.call m
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
@values.merge! values unless values.nil?
|
40
|
+
if block_given?
|
41
|
+
block_values = instance_exec @values, &block
|
42
|
+
@values.merge! block_values if block_values.is_a? Hash
|
43
|
+
end
|
44
|
+
|
45
|
+
result = instance_exec @values, &self.class.block
|
46
|
+
|
47
|
+
@running = false
|
48
|
+
|
49
|
+
if @puts_overridden
|
50
|
+
Kernel.send :remove_method, :puts
|
51
|
+
Kernel.send :alias_method, :puts, :_puts
|
52
|
+
@puts_overridden = false
|
53
|
+
@@puts_overridden = false
|
54
|
+
end
|
55
|
+
|
56
|
+
result
|
57
|
+
end
|
58
|
+
|
59
|
+
class << self
|
60
|
+
def initialize
|
61
|
+
unless @initialized
|
62
|
+
@initialized = true
|
63
|
+
@defaults = {}
|
64
|
+
@default_blocks = {}
|
65
|
+
@instance_hashes = {}
|
66
|
+
@instance_blocks = {}
|
67
|
+
@loaded_rails = false
|
68
|
+
load_rails if @@requires_rails || @@requires_rails.nil?
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def defaults
|
73
|
+
default_blocks = @default_blocks.dup
|
74
|
+
@default_blocks = {}
|
75
|
+
default_blocks.each do |k,b|
|
76
|
+
if k.nil?
|
77
|
+
b.call.each do |key, value|
|
78
|
+
@defaults[key] = value
|
79
|
+
end
|
80
|
+
else
|
81
|
+
@defaults[k] = b.call
|
82
|
+
end
|
83
|
+
end
|
84
|
+
@defaults
|
85
|
+
end
|
86
|
+
|
87
|
+
attr_reader :instance_hashes, :instance_blocks, :puts_block, :block
|
88
|
+
|
89
|
+
def run(instance_or_values=nil, &block)
|
90
|
+
initialize
|
91
|
+
if instance_or_values.is_a? Hash
|
92
|
+
values = instance_or_values
|
93
|
+
job = self.new
|
94
|
+
job.run values, &block
|
95
|
+
else
|
96
|
+
instance = instance_or_values
|
97
|
+
run = true
|
98
|
+
if block_given?
|
99
|
+
@block = block
|
100
|
+
if !@@bootstrapped && (!defined?(Rails) || @loaded_rails)
|
101
|
+
instance = ARGV.first || instance
|
102
|
+
@@bootstrapped = true
|
103
|
+
else
|
104
|
+
run = false
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
if run
|
109
|
+
job = self.new
|
110
|
+
job.load_instance instance.to_sym if instance
|
111
|
+
job.run
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def rails
|
117
|
+
load_rails
|
118
|
+
return yield Rails if block_given?
|
119
|
+
Rails
|
120
|
+
end
|
121
|
+
|
122
|
+
def load_rails
|
123
|
+
initialize
|
124
|
+
begin
|
125
|
+
load_rails = require_relative File.expand_path('config/boot', APP_ROOT)
|
126
|
+
load_rails &&= require APP_PATH
|
127
|
+
if load_rails
|
128
|
+
puts "loading rails..."
|
129
|
+
Rails.application.require_environment!
|
130
|
+
return @loaded_rails = true
|
131
|
+
end
|
132
|
+
false
|
133
|
+
rescue Exception
|
134
|
+
false
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def instance(name=nil, hash=nil, &block)
|
139
|
+
initialize
|
140
|
+
if name
|
141
|
+
@instance_hashes[name] = hash unless hash.nil?
|
142
|
+
@instance_blocks[name] = block
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def default(key=nil, value=nil, &block)
|
147
|
+
initialize
|
148
|
+
if value.nil? && block_given?
|
149
|
+
@default_blocks[key] = block
|
150
|
+
else
|
151
|
+
if value.nil? && key.is_a?(Hash)
|
152
|
+
key.each do |key, value|
|
153
|
+
@defaults[key] = value
|
154
|
+
end
|
155
|
+
else
|
156
|
+
@defaults[key] = value
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def requires_rails=(value)
|
162
|
+
@@requires_rails ||= value
|
163
|
+
end
|
164
|
+
|
165
|
+
def define_puts(&block)
|
166
|
+
initialize
|
167
|
+
@puts_block = block
|
168
|
+
end
|
169
|
+
|
170
|
+
def const_missing(const)
|
171
|
+
initialize
|
172
|
+
value = defaults[const.to_s.downcase.to_sym]
|
173
|
+
value.nil? ? Object.const_get(const) : value
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def method_missing(method, *args, &block)
|
178
|
+
if method.to_s.end_with? "="
|
179
|
+
@values[method.to_s[0..-2].to_sym] = args.first
|
180
|
+
elsif @values.include? method
|
181
|
+
@values[method]
|
182
|
+
else
|
183
|
+
super
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def const_missing(const)
|
188
|
+
@values[const.to_s.downcase.to_sym]
|
189
|
+
end
|
190
|
+
|
191
|
+
def define_puts(&block)
|
192
|
+
if block_given?
|
193
|
+
@puts_block = block
|
194
|
+
if @running && (!@@puts_overridden || @puts_overridden)
|
195
|
+
@@puts_overridden = true
|
196
|
+
@puts_overridden = true
|
197
|
+
Kernel.send(:define_method, :puts) do |m|
|
198
|
+
block.call m
|
199
|
+
nil
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
alias_method :def_puts, :define_puts
|
205
|
+
|
206
|
+
def _puts(message)
|
207
|
+
if @puts_overridden
|
208
|
+
super
|
209
|
+
message
|
210
|
+
else
|
211
|
+
puts(message)
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
def load_instance(instance, values={})
|
216
|
+
@values.merge! self.class.instance_hashes[instance].merge(values) if self.class.instance_hashes.include?(instance)
|
217
|
+
block = self.class.instance_blocks[instance]
|
218
|
+
if block
|
219
|
+
block_values = instance_exec @values, &block
|
220
|
+
@values.merge! block_values if block_values.is_a? Hash
|
221
|
+
end
|
222
|
+
@instance = instance
|
223
|
+
end
|
224
|
+
|
225
|
+
Kernel.send :alias_method, :_puts, :puts
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative '../logging/plain_logger'
|
2
|
+
require_relative '../logging/progress_logger'
|
3
|
+
|
4
|
+
module RubyJobs
|
5
|
+
module JobBase
|
6
|
+
module JobLogging
|
7
|
+
def logger(type, logger_id=nil, logger_name=nil)
|
8
|
+
@loggers ||= {}
|
9
|
+
loggers_of_type = (@loggers[type] ||= {})
|
10
|
+
|
11
|
+
logger_class = "#{type}Logger"
|
12
|
+
logger_class[0] = logger_class[0].upcase
|
13
|
+
|
14
|
+
base_name = job_name
|
15
|
+
base_name += "_#{instance}" unless instance.nil? || instance.empty?
|
16
|
+
logger_name ||= (logger_id ? "#{base_name}_#{logger_id}" : base_name)
|
17
|
+
logger = (loggers_of_type[logger_id] ||= Logging.const_get(logger_class).new(logger_name))
|
18
|
+
|
19
|
+
if block_given?
|
20
|
+
yield logger
|
21
|
+
end
|
22
|
+
|
23
|
+
logger
|
24
|
+
end
|
25
|
+
|
26
|
+
def init_logger(id_or_name, name=nil, type=:plain)
|
27
|
+
logger(type, id_or_name.to_sym, name || id_or_name.to_s)
|
28
|
+
end
|
29
|
+
|
30
|
+
def log(*messages)
|
31
|
+
return logger(:plain) if messages.empty?
|
32
|
+
return logger(:plain, messages.first).log *messages.drop(1) if messages.first.is_a? Symbol || messages.first.nil?
|
33
|
+
logger(:plain).log *messages
|
34
|
+
end
|
35
|
+
|
36
|
+
def progress(*messages, &block)
|
37
|
+
return logger(:progress) if messages.empty?
|
38
|
+
return logger(:progress, messages.first).log *messages.drop(1) if messages.first.is_a? Symbol
|
39
|
+
block_given? ? logger(:progress).log(*messages, &block) : logger(:progress).log(*messages)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module RubyJobs
|
4
|
+
module Logging
|
5
|
+
class PlainLogger
|
6
|
+
DEFAULT_PATH = "log/plain"
|
7
|
+
|
8
|
+
def initialize(*names)
|
9
|
+
@names = names.compact
|
10
|
+
@path = DEFAULT_PATH
|
11
|
+
@time_prefix = true
|
12
|
+
@print_timestamp = false
|
13
|
+
@write_file = true
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_accessor :path, :time_prefix, :separator, :extension, :print_timestamp
|
17
|
+
|
18
|
+
def file(&block)
|
19
|
+
File.open(file_path, 'a+', &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
def exist?
|
23
|
+
File.exist? file_path
|
24
|
+
end
|
25
|
+
|
26
|
+
def log_dir
|
27
|
+
dir = File.expand_path(@path, APP_ROOT)
|
28
|
+
FileUtils.mkpath dir
|
29
|
+
dir
|
30
|
+
end
|
31
|
+
|
32
|
+
def file_path
|
33
|
+
File.join(log_dir, file_name)
|
34
|
+
end
|
35
|
+
|
36
|
+
def file_name
|
37
|
+
return @file_name if @file_name
|
38
|
+
|
39
|
+
file_name = ""
|
40
|
+
if @time_prefix
|
41
|
+
file_name << Time.now.strftime("%Y%m%d%H%M%S")
|
42
|
+
file_name << "_"
|
43
|
+
end
|
44
|
+
file_name << @names.map{|w| w.to_s.gsub(/^[\W_]*|[\W_]*$/, '').gsub(/[\W_]+/, '_')}.join("_")
|
45
|
+
file_name << ".#{extension}" if extension
|
46
|
+
@file_name = file_name
|
47
|
+
end
|
48
|
+
|
49
|
+
def puts(message)
|
50
|
+
if @puts
|
51
|
+
if @clear_puts
|
52
|
+
@puts.call ((@last_message ? (("\b" * @last_message.length) + message) : message)), file_name
|
53
|
+
else
|
54
|
+
@puts.call @separator if @separater
|
55
|
+
@puts.call message, file_name
|
56
|
+
end
|
57
|
+
@last_message = message
|
58
|
+
end
|
59
|
+
|
60
|
+
if @write_file
|
61
|
+
file do |file|
|
62
|
+
file.puts @separator if @separater
|
63
|
+
file.puts message
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def def_puts(write_file=false, clear=false, &block)
|
69
|
+
@clear_puts = clear
|
70
|
+
@write_file = write_file
|
71
|
+
if block_given?
|
72
|
+
@puts = block
|
73
|
+
else
|
74
|
+
@puts = clear ? Proc.new{|m| print m} : Proc.new{|m| Kernel.puts m}
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def timestamp
|
79
|
+
"[#{Time.now.strftime "%Y-%m-%d %H:%M:%S"}]"
|
80
|
+
end
|
81
|
+
|
82
|
+
def log(*message)
|
83
|
+
message = message.map(&:to_s).join(" ")
|
84
|
+
message = "#{timestamp} - #{message}" if @print_timestamp
|
85
|
+
|
86
|
+
puts message
|
87
|
+
|
88
|
+
message
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module RubyJobs
|
2
|
+
module Logging
|
3
|
+
class ProgressLogger < PlainLogger
|
4
|
+
PATH = "log/progress"
|
5
|
+
|
6
|
+
def initialize(*names)
|
7
|
+
super
|
8
|
+
@path = PATH
|
9
|
+
@start = 0.0
|
10
|
+
@end = 100.0
|
11
|
+
@progress = 0.0
|
12
|
+
@progress_key = :count
|
13
|
+
@print_timestamp = true
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_accessor :progress, :progress_key
|
17
|
+
attr_reader :start, :end
|
18
|
+
|
19
|
+
def start=(value)
|
20
|
+
@start = value.to_f
|
21
|
+
end
|
22
|
+
|
23
|
+
def end=(value)
|
24
|
+
@end = value.to_f
|
25
|
+
end
|
26
|
+
|
27
|
+
def log(progress, *message)
|
28
|
+
if progress.is_a?(Hash) && progress.include?(@progress_key)
|
29
|
+
@progress = (progress[@progress_key].to_f - @start) / (@end - @start) * 100.0
|
30
|
+
message = ([progress] + message)
|
31
|
+
elsif !progress.is_a?(String) && progress.respond_to?(:to_f)
|
32
|
+
@progress = (progress.to_f - @start) / (@end - @start) * 100.0
|
33
|
+
message = [progress] if message.empty?
|
34
|
+
else
|
35
|
+
message = ([progress] + message)
|
36
|
+
end
|
37
|
+
|
38
|
+
if @print_timestamp
|
39
|
+
@print_timestamp = false
|
40
|
+
messsage = super @progress.to_i, "%", timestamp, "-", *message
|
41
|
+
@print_timestamp = true
|
42
|
+
else
|
43
|
+
messsage = super @progress.to_i, "%", *message
|
44
|
+
end
|
45
|
+
|
46
|
+
yield @progress, message if block_given?
|
47
|
+
|
48
|
+
messsage
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/ruby-jobs.rb
ADDED
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby-jobs
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Helge Holzmann
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-07-30 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A simple way to run jobs, wether simple scripts or experiments for you
|
14
|
+
reserach. You can log results and progress without a hassle and experiment with
|
15
|
+
different configurations.
|
16
|
+
email: helgeho@invelop.de
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- lib/job_base/job.rb
|
22
|
+
- lib/job_base/job_logging.rb
|
23
|
+
- lib/logging/plain_logger.rb
|
24
|
+
- lib/logging/progress_logger.rb
|
25
|
+
- lib/ruby-jobs.rb
|
26
|
+
homepage: https://github.com/helgeho/ruby-jobs
|
27
|
+
licenses: []
|
28
|
+
metadata: {}
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - '>='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 2.0.3
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: Get your jobs done in ruby.
|
49
|
+
test_files: []
|