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.
@@ -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
@@ -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
@@ -0,0 +1,5 @@
1
+ APP_ROOT ||= (Rails rescue nil).nil? ? Dir.pwd : Rails.root
2
+ APP_PATH ||= File.expand_path('config/application', APP_ROOT)
3
+
4
+ require_relative 'job_base/job.rb'
5
+
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: []