kryten 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b90431dc32ceeee94a2291b79484345f99b5f114
4
+ data.tar.gz: 27220e16a89720ee2798aef49e3ff9644a6adfcd
5
+ SHA512:
6
+ metadata.gz: 2cb25f8cc35ec56af461631a49c8def24443ba05d5244fe2700fb7ab56950155bd0f263fb8dcb0206041e1e6777e083929ed679e72a18c5fc03e20134bdfc7f3
7
+ data.tar.gz: 814260091434791219ee52d6589bf3e1d05a251998ad2e0a39a94f67e5e14a3ac2b5d617fce3d14d7c691da363df1a782d9503db673a98a4952439d091a616da
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.6
4
+ before_install: gem install bundler -v 1.10.6
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015-2016 Zsolt Fekete
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,65 @@
1
+ # Kryten
2
+
3
+ Kryten Series 4000 Mechanoid is a modular task runner written in Ruby.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'kryten'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install kryten
20
+
21
+ ## Usage
22
+
23
+ ```ruby
24
+
25
+ require 'kryten'
26
+
27
+ # define work to be done in a class with a run method
28
+
29
+ class Work
30
+ include Kryten
31
+
32
+ def run
33
+ log "working..."
34
+ end
35
+
36
+ end
37
+
38
+ # The worker can run on it's own
39
+ Work.new.start # loop run method in foreground
40
+ Work.new.init_daemon # loop run method in a daemon process
41
+
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
48
+
49
+
50
+ ```
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
+
58
+ ## Contributing
59
+
60
+ Bug reports and pull requests are welcome on GitHub at https://github.com/zsoltf/kryten
61
+
62
+
63
+ ## License
64
+
65
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "kryten"
5
+ require "reddwarf"
6
+
7
+ require "pry"
8
+ Pry.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/kryten.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'kryten/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "kryten"
8
+ spec.version = Kryten::VERSION
9
+ spec.authors = ["Zsolt Fekete"]
10
+ spec.email = ["zsoltf@me.com"]
11
+ spec.homepage = "https://github.com/zsoltf/kryten"
12
+
13
+ spec.summary = %q{Modular Task Runner}
14
+ spec.description = %q{Modular task runner and job manager. Supports daemons and threads.}
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.10"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "minitest"
25
+ spec.add_development_dependency "pry"
26
+
27
+ spec.add_dependency "daemons", "~> 1.2.0"
28
+ spec.add_dependency "logger"
29
+ end
@@ -0,0 +1,11 @@
1
+ module Kryten::Environment
2
+
3
+ def env
4
+ @_env ||= ( ENV['RUBY_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development')
5
+ end
6
+
7
+ def env= e
8
+ @_env = e
9
+ end
10
+
11
+ end
@@ -0,0 +1,7 @@
1
+ module Kryten::Helper
2
+
3
+ def hi
4
+ puts "i am helper"
5
+ end
6
+
7
+ end
@@ -0,0 +1,14 @@
1
+ require 'logger'
2
+
3
+ module Kryten::Lawger
4
+
5
+ def log_path
6
+ "/tmp/#{name}.log"
7
+ end
8
+
9
+ def log message
10
+ @logger ||= Logger.new(log_path)
11
+ @logger.debug message
12
+ end
13
+
14
+ end
@@ -0,0 +1,48 @@
1
+ module Kryten::Runner
2
+
3
+ def start
4
+ log "starting #{name}"
5
+ setup
6
+
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
13
+ run
14
+ end
15
+
16
+ log "stopped #{name}"
17
+ rescue => e
18
+ log "error #{e}"
19
+ #raise
20
+ end
21
+
22
+ def run
23
+ log "running #{name}"
24
+ end
25
+
26
+ def stop_running
27
+ # no logging here, this is a signal handler
28
+ @running = false
29
+ end
30
+
31
+ def setup
32
+ log "setting up #{name}"
33
+ end
34
+
35
+ def debug
36
+ log "debugging #{name}"
37
+ setup
38
+ 2.times do
39
+ run
40
+ sleep @timer || 4
41
+ end
42
+ end
43
+
44
+ def log message
45
+ puts message
46
+ end
47
+
48
+ end
@@ -0,0 +1,63 @@
1
+ require 'daemons'
2
+
3
+ module Daemons
4
+ class Application
5
+ def customstatus(app)
6
+ app_name = app.options[:app_name]
7
+ pid = app.pid.pid.to_s
8
+ running = app.running? ? 'running' : 'not running'
9
+ running_and_pid = if app.running? and app.pid.exist?
10
+ " [pid #{pid}]"
11
+ end
12
+ running_no_pid = if app.pid.exist? and not app.running?
13
+ " (but pid-file exists: #{pid}')"
14
+ end
15
+ "#{app_name}: #{running}#{running_and_pid}#{running_no_pid}"
16
+ end
17
+ end
18
+ end
19
+
20
+ module Kryten::Summoner
21
+
22
+ def name
23
+ self.class.to_s.gsub('::','_').downcase
24
+ end
25
+
26
+ def init_daemon
27
+ options = {
28
+ log_output: false,
29
+ backtrace: false,
30
+ multiple: true,
31
+ ARGV: ['start'],
32
+ show_status_callback: :customstatus
33
+ }
34
+
35
+ @daemon = Daemons.run_proc(name, options) { start }
36
+
37
+ end
38
+
39
+ def daemon
40
+ raise 'Initialize daemon first with init_daemon' unless @daemon
41
+ # run_proc with :multiple creates an application group (stack)
42
+ # if there are multiple daemons with the same name,
43
+ # the curent daemon is the last entry
44
+ @daemon.applications.last
45
+ end
46
+
47
+ def start_daemon
48
+ daemon.start
49
+ end
50
+
51
+ def stop
52
+ daemon.stop
53
+ end
54
+
55
+ def pid
56
+ daemon.pid.pid
57
+ end
58
+
59
+ def status
60
+ daemon.show_status
61
+ end
62
+
63
+ end
@@ -0,0 +1,3 @@
1
+ module Kryten
2
+ VERSION = "0.1.0"
3
+ end
data/lib/kryten.rb ADDED
@@ -0,0 +1,18 @@
1
+ require "kryten/version"
2
+ require "kryten/summoner"
3
+ require "kryten/lawger"
4
+ require "kryten/runner"
5
+ require "kryten/helper"
6
+ require "kryten/environment"
7
+
8
+ module Kryten
9
+ include Summoner
10
+ include Runner
11
+ include Lawger
12
+ include Helper
13
+ end
14
+
15
+ module Kryten::Worker
16
+ include Kryten::Lawger
17
+ include Kryten::Helper
18
+ end
data/lib/reddwarf.rb ADDED
@@ -0,0 +1,115 @@
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
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kryten
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Zsolt Fekete
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-02-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: daemons
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.2.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.2.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: logger
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Modular task runner and job manager. Supports daemons and threads.
98
+ email:
99
+ - zsoltf@me.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".travis.yml"
106
+ - Gemfile
107
+ - LICENSE
108
+ - README.md
109
+ - Rakefile
110
+ - bin/console
111
+ - bin/setup
112
+ - kryten.gemspec
113
+ - lib/kryten.rb
114
+ - lib/kryten/environment.rb
115
+ - lib/kryten/helper.rb
116
+ - lib/kryten/lawger.rb
117
+ - lib/kryten/runner.rb
118
+ - lib/kryten/summoner.rb
119
+ - lib/kryten/version.rb
120
+ - lib/reddwarf.rb
121
+ homepage: https://github.com/zsoltf/kryten
122
+ licenses:
123
+ - MIT
124
+ metadata: {}
125
+ post_install_message:
126
+ rdoc_options: []
127
+ require_paths:
128
+ - lib
129
+ required_ruby_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ requirements: []
140
+ rubyforge_project:
141
+ rubygems_version: 2.2.3
142
+ signing_key:
143
+ specification_version: 4
144
+ summary: Modular Task Runner
145
+ test_files: []