foreverb 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES.md CHANGED
@@ -1,3 +1,10 @@
1
+ # Version 0.2.4 (unreleased)
2
+
3
+ * Ruby 1.9.2 compatibility
4
+ * Stop process using pid instead of file
5
+ * Added specs
6
+ * Fixed `foreverb list` where in some scenarios don't return a list of processes
7
+
1
8
  # Version 0.2.3
2
9
 
3
10
  * Added global monitoring, to easily watch each `foreverb` daemon
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source "http://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in forever.gemspec
4
4
  gemspec
5
+
6
+ gem 'guard'
7
+ gem 'guard-rspec'
8
+ gem 'growl'
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard 'rspec', :cli => '--color' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
data/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'rubygems' unless defined?(Gem)
2
2
  require 'bundler/gem_tasks'
3
+ require 'rspec/core/rake_task'
3
4
 
4
5
  %w(install release).each do |task|
5
6
  Rake::Task[task].enhance do
@@ -9,9 +10,18 @@ end
9
10
 
10
11
  desc "Bump version on github"
11
12
  task :bump do
12
- puts "Nothing to commit (working directory clean)" and return if `git status -s`.strip == ""
13
+ puts "\e[31mNothing to commit (working directory clean)\e[0m" and return unless `git status -s`.chomp!
13
14
  version = Bundler.load_gemspec(Dir[File.expand_path('../*.gemspec', __FILE__)].first).version
14
- sh "git add .; git commit -m \"Bump to version #{version}\""
15
+ sh "git add .; git commit -a -m \"Bump to version #{version}\""
15
16
  end
16
17
 
17
- task :release => :bump
18
+ task :release => :bump
19
+
20
+ desc "Run complete application spec suite"
21
+ RSpec::Core::RakeTask.new("spec") do |t|
22
+ t.skip_bundler = true
23
+ t.pattern = './spec/**/*_spec.rb'
24
+ t.rspec_opts = %w(-fs --color --fail-fast)
25
+ end
26
+
27
+ task :default => :spec
data/bin/foreverb CHANGED
@@ -3,6 +3,7 @@ require 'rubygems' unless defined?(Gem)
3
3
  require File.expand_path('../../lib/forever/version.rb', __FILE__)
4
4
  require 'thor'
5
5
  require 'yaml'
6
+ require 'fileutils'
6
7
 
7
8
  FOREVER_PATH = ENV['FOREVER_PATH'] ||= File.expand_path("~/.foreverb") unless defined?(FOREVER_PATH)
8
9
 
@@ -11,19 +12,20 @@ class CLI < Thor
11
12
  desc "list", "List Forever running daemons"
12
13
  method_option :monitor, :type => :boolean, :aliases => "-m", :default => false, :desc => "Show memory and cpu usage with ps"
13
14
  def list
14
- say "No deamons running", :red if config.empty?
15
+ say "Your config is empty, so no deamons was found.", :red if config.empty? && !options.monitor
15
16
 
16
17
  if options.monitor
17
18
  print_table([%w(PID RSS CPU CMD), *ps])
18
19
  else
19
20
  config.each do |conf|
20
21
  status = begin
21
- "WRONG CONFIG" and return unless File.exist?(conf[:pid])
22
22
  pid = File.read(conf[:pid]).to_i
23
23
  Process.kill(0, pid)
24
24
  "RUNNING"
25
25
  rescue Errno::ESRCH, Errno::ENOENT
26
26
  "NOT RUNNING"
27
+ rescue Errno::EPERM
28
+ "RUNNING"
27
29
  end
28
30
  say_status status, conf[:file], status =~ /^RUNNING/ ? :green : :red
29
31
  end
@@ -38,7 +40,12 @@ class CLI < Thor
38
40
  find(daemon, :multiple => options.all).each do |conf|
39
41
  if options.yes || yes?("Do you want really stop \e[1m#{conf[:file]}\e[0m?")
40
42
  say_status "STOPPING", conf[:file]
41
- system(conf[:file], 'stop')
43
+ begin
44
+ pid = File.read(conf[:pid]).to_i
45
+ Process.kill(:INT, pid)
46
+ rescue Exception => e
47
+ say_status "ERROR", e.message, :red
48
+ end
42
49
  end
43
50
  end
44
51
  end
@@ -71,7 +78,10 @@ class CLI < Thor
71
78
  method_option :all, :type => :boolean, :aliases => "-a", :desc => "All matching daemons"
72
79
  method_option :yes, :type => :boolean, :aliases => "-y", :desc => "Don't ask permission to start the daemon"
73
80
  def update(daemon=nil)
74
- find(daemon, :multiple => options.all).each do |conf|
81
+ match = find(daemon, :multiple => options.all)
82
+ return if match.empty?
83
+ FileUtils.rm_rf(FOREVER_PATH)
84
+ match.each do |conf|
75
85
  system(conf[:file], 'up') if options.yes || yes?("Do you want really update config from \e[1m#{conf[:file]}\e[0m?")
76
86
  end
77
87
  end
data/foreverb.gemspec CHANGED
@@ -18,4 +18,5 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = %w(lib)
20
20
  s.add_dependency 'thor', '~>0.14.6'
21
+ s.add_development_dependency 'rspec', '~>2.6.0'
21
22
  end
data/lib/forever.rb CHANGED
@@ -1,9 +1,14 @@
1
+ require 'yaml' unless defined?(YAML)
1
2
  require "forever/extensions"
2
3
  require "forever/every"
3
4
  require "forever/base"
4
5
  require "forever/version"
5
6
 
7
+ YAML::ENGINE.yamler = "syck" if defined?(YAML::ENGINE)
8
+
6
9
  FOREVER_PATH = ENV['FOREVER_PATH'] ||= File.expand_path("~/.foreverb") unless defined?(FOREVER_PATH)
10
+ path = File.dirname(FOREVER_PATH)
11
+ Dir.mkdir(path) unless File.exist?(path)
7
12
 
8
13
  module Forever
9
14
  extend self
data/lib/forever/base.rb CHANGED
@@ -53,6 +53,8 @@ module Forever
53
53
  end
54
54
  threads.map(&:join)
55
55
  end
56
+
57
+ self
56
58
  end
57
59
 
58
60
  ##
@@ -22,4 +22,5 @@ module Kernel
22
22
  print text; $stdout.flush
23
23
  text
24
24
  end
25
+ alias :log :puts
25
26
  end
@@ -1,3 +1,3 @@
1
1
  module Forever
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4" unless defined?(Forever::VERSION)
3
3
  end
data/spec/cli_spec.rb ADDED
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe "CLI" do
4
+
5
+ it "should list no daemons" do
6
+ cli('list').should match(/Your config is empty/)
7
+ cli('list').should match(FOREVER_PATH)
8
+ cli('list -m').should match(/PID RSS CPU CMD/)
9
+ end
10
+
11
+ it "should list a daemon" do
12
+ run_example
13
+ cli('list').should match(/RUNNING/)
14
+ cli('list -m').should match(/Forever:\s/)
15
+ end
16
+
17
+ it "should stop daemons" do
18
+ run_example
19
+ cli('list').should match(/RUNNING/)
20
+ result = cli('stop -a -y')
21
+ result.should match(/STOPPING/)
22
+ result.should_not match(/ERROR/)
23
+ cli('list').should match(/NOT RUNNING/)
24
+ end
25
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forever do
4
+
5
+ before :each do
6
+ ARGV << 'up'
7
+ end
8
+
9
+ it 'should set a basic config' do
10
+ @forever = Forever.run {}
11
+ @forever.dir.should == File.expand_path("../../", __FILE__)
12
+ @forever.log.should == File.join(@forever.dir, 'log', File.basename(__FILE__) + '.log')
13
+ @forever.pid.should == File.join(@forever.dir, 'tmp', File.basename(__FILE__) + '.pid')
14
+ @forever.file.should == __FILE__
15
+ config = YAML.load_file(FOREVER_PATH)
16
+ config[0][:file].should == __FILE__
17
+ config[0][:log].should == @forever.log
18
+ config[0][:pid].should == @forever.pid
19
+ end
20
+
21
+ it 'should set a custom config' do
22
+ @forever = Forever.run do
23
+ dir File.expand_path('../', __FILE__)
24
+ end
25
+ @forever.dir.should == File.expand_path('../', __FILE__)
26
+ @forever.log.should == File.join(@forever.dir, 'log', File.basename(__FILE__) + '.log')
27
+ @forever.pid.should == File.join(@forever.dir, 'tmp', File.basename(__FILE__) + '.pid')
28
+ @forever.file.should == __FILE__
29
+ config = YAML.load_file(FOREVER_PATH)
30
+ config[0][:file].should == __FILE__
31
+ config[0][:log].should == @forever.log
32
+ config[0][:pid].should == @forever.pid
33
+ end
34
+
35
+ it 'should launch a daemon' do
36
+ ARGV.clear
37
+ stdout_was, $stdout = $stdout, StringIO.new
38
+ @forever = Forever.run do
39
+ on_ready { sleep 2 }
40
+ end
41
+ sleep 0.1 while !File.exist?(@forever.pid)
42
+ pid = File.read(@forever.pid).to_i
43
+ Process.waitpid(pid)
44
+ $stdout.string.should match(/pid not found/i)
45
+ $stdout = stdout_was
46
+ end
47
+ end
@@ -0,0 +1,48 @@
1
+ FOREVER_PATH = ENV['FOREVER_PATH'] ||= File.expand_path("../tmp/db.yaml", __FILE__)
2
+ require 'rubygems' unless defined?(Gem)
3
+ require 'bundler/setup'
4
+ require 'rspec'
5
+ require 'forever'
6
+ require 'fileutils'
7
+
8
+ module Helper
9
+ def capture_stdout(&block)
10
+ stdout_was, $stdout = $stdout, StringIO.new
11
+ block.call
12
+ return $stdout
13
+ ensure
14
+ $stdout = stdout_was
15
+ end
16
+
17
+ def run_example
18
+ capture_stdout do
19
+ @forever = Forever.run do
20
+ on_ready { sleep }
21
+ end
22
+ end
23
+ end
24
+
25
+ def cli(task)
26
+ output = `#{Gem.ruby} #{File.expand_path('../../bin/foreverb', __FILE__)} #{task}`
27
+ end
28
+ end
29
+
30
+ RSpec.configure do |config|
31
+ config.include(Helper)
32
+
33
+ config.before :each do
34
+ FileUtils.rm_rf File.dirname(FOREVER_PATH)
35
+ Dir.mkdir File.dirname(FOREVER_PATH)
36
+ ARGV.clear
37
+ end
38
+
39
+ config.after :each do
40
+ FileUtils.rm_rf(File.dirname(FOREVER_PATH))
41
+ if @forever
42
+ capture_stdout { @forever.stop! }
43
+ FileUtils.rm_rf(File.dirname(@forever.log)) if @forever.log
44
+ FileUtils.rm_rf(File.dirname(@forever.pid)) if @forever.pid
45
+ end
46
+ ARGV.clear
47
+ end
48
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreverb
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 3
10
- version: 0.2.3
9
+ - 4
10
+ version: 0.2.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - DAddYE
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-07-22 00:00:00 +02:00
18
+ date: 2011-07-26 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -34,6 +34,22 @@ dependencies:
34
34
  version: 0.14.6
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 23
46
+ segments:
47
+ - 2
48
+ - 6
49
+ - 0
50
+ version: 2.6.0
51
+ type: :development
52
+ version_requirements: *id002
37
53
  description: Small daemon framework for ruby, with logging, error handler, scheduling and much more.
38
54
  email:
39
55
  - d.dagostino@lipsiasoft.com
@@ -47,6 +63,7 @@ files:
47
63
  - .gitignore
48
64
  - CHANGES.md
49
65
  - Gemfile
66
+ - Guardfile
50
67
  - README.md
51
68
  - Rakefile
52
69
  - bin/foreverb
@@ -57,6 +74,9 @@ files:
57
74
  - lib/forever/every.rb
58
75
  - lib/forever/extensions.rb
59
76
  - lib/forever/version.rb
77
+ - spec/cli_spec.rb
78
+ - spec/foreverb_spec.rb
79
+ - spec/spec_helper.rb
60
80
  has_rdoc: true
61
81
  homepage: https://github.com/daddye/forever
62
82
  licenses: []
@@ -91,5 +111,7 @@ rubygems_version: 1.6.2
91
111
  signing_key:
92
112
  specification_version: 3
93
113
  summary: Small daemon framework for ruby
94
- test_files: []
95
-
114
+ test_files:
115
+ - spec/cli_spec.rb
116
+ - spec/foreverb_spec.rb
117
+ - spec/spec_helper.rb