kryten 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b90431dc32ceeee94a2291b79484345f99b5f114
4
- data.tar.gz: 27220e16a89720ee2798aef49e3ff9644a6adfcd
3
+ metadata.gz: c9f5b08989dcf2d7dbe11eda53457a0fccef4cc5
4
+ data.tar.gz: 8ea02ee22eb5de93bb27154c96b29486735ca2d4
5
5
  SHA512:
6
- metadata.gz: 2cb25f8cc35ec56af461631a49c8def24443ba05d5244fe2700fb7ab56950155bd0f263fb8dcb0206041e1e6777e083929ed679e72a18c5fc03e20134bdfc7f3
7
- data.tar.gz: 814260091434791219ee52d6589bf3e1d05a251998ad2e0a39a94f67e5e14a3ac2b5d617fce3d14d7c691da363df1a782d9503db673a98a4952439d091a616da
6
+ metadata.gz: b92828d495df7fe6e490c90ab96eeadc8f97f50215413ff159965e0f1b6b6256c9623cb1e4439110d888e83fb79195942f0795a8932b1b54b6feec6cbbfde099
7
+ data.tar.gz: 4f8316267b0dcd2671f6d0b21dc4b00a4ef94eb5127a268027cf5174dbe02fa237ea2c30d0c74a0afc66ec47c63594607cb306c22013d0d9aa17b1f778f50ce2
data/README.md CHANGED
@@ -23,11 +23,12 @@ Or install it yourself as:
23
23
  ```ruby
24
24
 
25
25
  require 'kryten'
26
+ include Kryten
26
27
 
27
28
  # define work to be done in a class with a run method
28
29
 
29
30
  class Work
30
- include Kryten
31
+ include ThreadedTask
31
32
 
32
33
  def run
33
34
  log "working..."
@@ -35,25 +36,19 @@ Or install it yourself as:
35
36
 
36
37
  end
37
38
 
38
- # The worker can run on it's own
39
+ # The worker can run on it's own and responds to the interrupt signal.
39
40
  Work.new.start # loop run method in foreground
40
- Work.new.init_daemon # loop run method in a daemon process
41
+ Work.new.start_worker # loop run method in a thread
41
42
 
42
- # One or more workers can be managed by RedDwarf
43
- # Power it up by passing a block with an array of workers
44
- RedDwarf.power_up { Work.new }
45
-
46
- # power_up is non-blocking. Send the power_down message stops all workers
47
- RedDwarf.power_down
43
+ # Two or more workers can be managed by the Supervisor
44
+ tasks = []
45
+ tasks << FirstTask.new
46
+ tasks << SecondTask.new
47
+ Supervisor.start(tasks)
48
48
 
49
49
 
50
50
  ```
51
51
 
52
- ## Development
53
-
54
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
55
-
56
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
57
52
 
58
53
  ## Contributing
59
54
 
data/bin/console CHANGED
@@ -2,7 +2,16 @@
2
2
 
3
3
  require "bundler/setup"
4
4
  require "kryten"
5
- require "reddwarf"
6
-
7
5
  require "pry"
8
- Pry.start
6
+
7
+ include Kryten
8
+
9
+ class Work
10
+ include ThreadedTask
11
+ end
12
+
13
+ w1 = Work.new('work1')
14
+ w2 = Work.new('work2')
15
+ w3 = Work.new('work3')
16
+
17
+ binding.pry
data/bin/kryten ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "kryten"
5
+ require "pry"
6
+
7
+ include Kryten
8
+
9
+ class Work
10
+ include ThreadedTask
11
+ end
12
+
13
+ workers = []
14
+ workers << Work.new('work1')
15
+ workers << Work.new('work2')
16
+ w3 = Work.new('work3').workers do
17
+ [Work.new('work3sub1'),
18
+ Work.new('work3sub2')]
19
+ end
20
+ workers << w3
21
+
22
+ Supervisor.start(workers)
23
+
24
+ sleep 10
data/kryten.gemspec CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "rake", "~> 10.0"
24
24
  spec.add_development_dependency "minitest"
25
25
  spec.add_development_dependency "pry"
26
+ spec.add_development_dependency "awesome_print"
26
27
 
27
28
  spec.add_dependency "daemons", "~> 1.2.0"
28
29
  spec.add_dependency "logger"
data/lib/kryten/lawger.rb CHANGED
@@ -1,14 +1,23 @@
1
1
  require 'logger'
2
2
 
3
3
  module Kryten::Lawger
4
+ attr_accessor :logger
4
5
 
5
6
  def log_path
6
- "/tmp/#{name}.log"
7
+ "log/#{name}.log"
7
8
  end
8
9
 
9
10
  def log message
11
+ default_log_format
12
+ logger.debug(name) { message }
13
+ end
14
+
15
+ def logger
10
16
  @logger ||= Logger.new(log_path)
11
- @logger.debug message
17
+ end
18
+
19
+ def default_log_format
20
+ nil
12
21
  end
13
22
 
14
23
  end
data/lib/kryten/runner.rb CHANGED
@@ -1,48 +1,69 @@
1
1
  module Kryten::Runner
2
+ attr_accessor :timer
3
+ attr_reader :running, :started
4
+
5
+ def initialize title=nil
6
+ @name, @running, @started = title, false, false
7
+ log "initializing"
8
+ Signal.trap("INT", proc { stop_running })
9
+ end
2
10
 
3
11
  def start
4
- log "starting #{name}"
5
12
  setup
13
+ log "starting"
14
+ @started = true
6
15
 
7
- @running = true
8
- Signal.trap("INT", proc { stop_running })
9
- Signal.trap("TERM", proc { stop_running })
10
-
11
- while @running do
12
- sleep @timer || 4
16
+ while started do
17
+ sleep timer
18
+ @running = true
13
19
  run
20
+ @running = false
14
21
  end
15
22
 
16
- log "stopped #{name}"
23
+ log "stopped"
24
+ true
17
25
  rescue => e
18
26
  log "error #{e}"
19
27
  #raise
20
28
  end
21
29
 
22
30
  def run
23
- log "running #{name}"
31
+ log "running"
32
+ end
33
+
34
+ def timer
35
+ @timer || 4
24
36
  end
25
37
 
26
38
  def stop_running
27
- # no logging here, this is a signal handler
28
- @running = false
39
+ @started = false
29
40
  end
30
41
 
31
42
  def setup
32
- log "setting up #{name}"
43
+ log "setting up"
33
44
  end
34
45
 
35
46
  def debug
36
- log "debugging #{name}"
47
+ log "debugging"
37
48
  setup
38
49
  2.times do
39
50
  run
40
- sleep @timer || 4
51
+ sleep timer
41
52
  end
42
53
  end
43
54
 
44
55
  def log message
45
- puts message
56
+ puts [name, message].join(': ')
57
+ end
58
+
59
+ def name
60
+ @name || self.class.to_s.gsub('::','-').downcase
61
+ end
62
+
63
+ def status
64
+ log [started ? 'on and ' : 'off and ',
65
+ running ? 'running' : 'sleeping'].join
66
+ started
46
67
  end
47
68
 
48
69
  end
@@ -1,3 +1,5 @@
1
+ # WARNING: Legacy Code
2
+
1
3
  require 'daemons'
2
4
 
3
5
  module Daemons
@@ -19,10 +21,6 @@ end
19
21
 
20
22
  module Kryten::Summoner
21
23
 
22
- def name
23
- self.class.to_s.gsub('::','_').downcase
24
- end
25
-
26
24
  def init_daemon
27
25
  options = {
28
26
  log_output: false,
@@ -61,3 +59,119 @@ module Kryten::Summoner
61
59
  end
62
60
 
63
61
  end
62
+
63
+ module Kryten::RedDwarf
64
+
65
+ def self.start
66
+
67
+ unless self.daemons.empty?
68
+ puts "BackgroundFactory is already running"
69
+ return
70
+ end
71
+
72
+ raise "No Block Given" unless block_given?
73
+
74
+ puts "starting all daemons"
75
+ @@daemons = []
76
+ @@daemons << yield
77
+ @@daemons = @@daemons.flatten
78
+ @@daemons.each { |d| d.init_daemon }
79
+
80
+ self.can_shutdown = true
81
+
82
+ end
83
+
84
+ def self.daemons
85
+ (@@daemons ||= [])
86
+ end
87
+
88
+ def self.daemon name
89
+ self.daemons.detect { |d| d.name == name }
90
+ end
91
+
92
+ def self.alive
93
+ self.daemons.select(&:pid)
94
+ end
95
+
96
+ def self.dead
97
+ self.daemons - self.alive
98
+ end
99
+
100
+ def self.monitor
101
+ self.start unless self.running?
102
+ self.status
103
+ end
104
+
105
+ def self.status
106
+ status = proc do |job|
107
+ {
108
+ name: job.daemon.pid.progname,
109
+ pid: job.daemon.pid,
110
+ pid_dir: job.daemon.pidfile_dir,
111
+ logfile: job.daemon.logfile,
112
+ output: job.daemon.output_logfile,
113
+ status: job.status,
114
+ object: job
115
+ }
116
+ end
117
+ alive = self.alive.map(&status)
118
+ dead = self.dead.map(&status)
119
+ #puts "#{alive.count} running daemons"
120
+ #puts "#{dead.count} dead daemons"
121
+ { alive: alive, dead: dead }
122
+ end
123
+
124
+ def self.run job
125
+ self.can_shutdown = false
126
+ daemon = self.daemon job
127
+ if daemon.pid
128
+ puts "daemon #{daemon} is still running"
129
+ else
130
+ daemon.start_daemon
131
+ end
132
+ self.can_shutdown = true
133
+ end
134
+
135
+ def self.halt job
136
+ daemon = self.daemon job
137
+ if daemon.pid
138
+ daemon.stop
139
+ else
140
+ puts "daemon #{daemon} was not running"
141
+ end
142
+ end
143
+
144
+ def self.can_shutdown= bool
145
+ @sd = bool
146
+ end
147
+
148
+ def self.can_shutdown
149
+ @sd
150
+ end
151
+
152
+ def self.stop
153
+
154
+ return unless self.can_shutdown
155
+
156
+ if self.running?
157
+ puts "stopping all daemons"
158
+ @@daemons.count.times do
159
+ daemon = @@daemons.pop
160
+ if daemon.pid
161
+ pid = Process.fork { daemon.stop }
162
+ Process.detach(pid)
163
+ else
164
+ puts "daemon #{daemon} was not running"
165
+ end
166
+ end
167
+ else
168
+ puts "BackgroundFactory has not been started yet"
169
+ end
170
+
171
+ end
172
+
173
+ def self.running?
174
+ !self.daemons.empty?
175
+ end
176
+
177
+ end
@@ -1,3 +1,3 @@
1
1
  module Kryten
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -0,0 +1,56 @@
1
+ module Kryten::Weaver
2
+ attr_reader :worker
3
+ attr_accessor :workers
4
+
5
+ def start_work
6
+ workers.each(&:start_work) if workers
7
+
8
+ if worker && worker.alive?
9
+ log 'worker already running'
10
+ return false
11
+ end
12
+ @worker = Thread.new { start }
13
+ end
14
+
15
+ def stop_work
16
+ workers.each(&:stop_work) if workers
17
+ stop_running
18
+ end
19
+
20
+ def workers
21
+ if block_given?
22
+ @workers = Array(yield)
23
+ return self
24
+ end
25
+ @workers
26
+ end
27
+
28
+ end
29
+
30
+ class Kryten::Supervisor
31
+ def self.start(workers)
32
+ start_workers(workers)
33
+ sleep 1 while @started
34
+ end
35
+
36
+ def self.start_workers(workers)
37
+ @workers = workers
38
+ @started = true
39
+ Signal.trap("INT", proc { self.stop })
40
+ workers.each(&:start_work)
41
+ end
42
+
43
+ def self.stop
44
+ if @started
45
+ @workers.each(&:stop_work)
46
+ sleep 1 while self.running?
47
+ @started = false
48
+ end
49
+ end
50
+
51
+ def self.running?
52
+ @workers.detect(&:running)
53
+ end
54
+
55
+ end
56
+
data/lib/kryten.rb CHANGED
@@ -1,18 +1,23 @@
1
1
  require "kryten/version"
2
2
  require "kryten/summoner"
3
+ require "kryten/weaver"
3
4
  require "kryten/lawger"
4
5
  require "kryten/runner"
5
6
  require "kryten/helper"
6
7
  require "kryten/environment"
7
8
 
8
- module Kryten
9
- include Summoner
10
- include Runner
11
- include Lawger
12
- include Helper
13
- end
14
-
15
- module Kryten::Worker
9
+ module Kryten::Task
10
+ include Kryten::Runner
16
11
  include Kryten::Lawger
17
12
  include Kryten::Helper
18
13
  end
14
+
15
+ module Kryten::DaemonTask
16
+ include Kryten::Task
17
+ include Kryten::Summoner
18
+ end
19
+
20
+ module Kryten::ThreadedTask
21
+ include Kryten::Task
22
+ include Kryten::Weaver
23
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kryten
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zsolt Fekete
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-02-27 00:00:00.000000000 Z
11
+ date: 2016-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: awesome_print
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: daemons
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +122,7 @@ files:
108
122
  - README.md
109
123
  - Rakefile
110
124
  - bin/console
125
+ - bin/kryten
111
126
  - bin/setup
112
127
  - kryten.gemspec
113
128
  - lib/kryten.rb
@@ -117,7 +132,7 @@ files:
117
132
  - lib/kryten/runner.rb
118
133
  - lib/kryten/summoner.rb
119
134
  - lib/kryten/version.rb
120
- - lib/reddwarf.rb
135
+ - lib/kryten/weaver.rb
121
136
  homepage: https://github.com/zsoltf/kryten
122
137
  licenses:
123
138
  - MIT
data/lib/reddwarf.rb DELETED
@@ -1,115 +0,0 @@
1
- module RedDwarf
2
-
3
- def self.power_up
4
-
5
- unless self.daemons.empty?
6
- puts "RedDwarf is already running"
7
- return
8
- end
9
-
10
- raise "No Block Given" unless block_given?
11
-
12
- puts "starting all daemons"
13
- @@daemons = []
14
- @@daemons << yield
15
- @@daemons = @@daemons.flatten
16
- @@daemons.each { |d| d.init_daemon }
17
-
18
- self.can_shutdown = true
19
-
20
- end
21
-
22
- def self.daemons
23
- (@@daemons ||= [])
24
- end
25
-
26
- def self.daemon name
27
- self.daemons.detect { |d| d.name == name }
28
- end
29
-
30
- def self.alive
31
- self.daemons.select(&:pid)
32
- end
33
-
34
- def self.dead
35
- self.daemons - self.alive
36
- end
37
-
38
- def self.monitor
39
- self.power_up unless self.running?
40
- self.status
41
- end
42
-
43
- def self.status
44
- status = proc do |replicant|
45
- {
46
- name: replicant.daemon.pid.progname,
47
- pid: replicant.daemon.pid,
48
- pid_dir: replicant.daemon.pidfile_dir,
49
- logfile: replicant.daemon.logfile,
50
- output: replicant.daemon.output_logfile,
51
- status: replicant.status,
52
- object: replicant
53
- }
54
- end
55
- alive = self.alive.map(&status)
56
- dead = self.dead.map(&status)
57
- #puts "#{alive.count} running daemons"
58
- #puts "#{dead.count} dead daemons"
59
- { alive: alive, dead: dead }
60
- end
61
-
62
- def self.start replicant
63
- self.can_shutdown = false
64
- daemon = self.daemon replicant
65
- if daemon.pid
66
- puts "daemon #{daemon} is still running"
67
- else
68
- daemon.start_daemon
69
- end
70
- self.can_shutdown = true
71
- end
72
-
73
- def self.stop replicant
74
- daemon = self.daemon replicant
75
- if daemon.pid
76
- daemon.stop
77
- else
78
- puts "daemon #{daemon} was not running"
79
- end
80
- end
81
-
82
- def self.can_shutdown= bool
83
- @sd = bool
84
- end
85
-
86
- def self.can_shutdown
87
- @sd
88
- end
89
-
90
- def self.power_down
91
-
92
- return unless self.can_shutdown
93
-
94
- if self.running?
95
- puts "stopping all daemons"
96
- @@daemons.count.times do
97
- daemon = @@daemons.pop
98
- if daemon.pid
99
- pid = Process.fork { daemon.stop }
100
- Process.detach(pid)
101
- else
102
- puts "daemon #{daemon} was not running"
103
- end
104
- end
105
- else
106
- puts "RedDwarf has not been started yet"
107
- end
108
-
109
- end
110
-
111
- def self.running?
112
- !self.daemons.empty?
113
- end
114
-
115
- end