kryten 0.1.0 → 0.2.0

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 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