phantom 0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e5395b53c7f1561a2687b7df2cbafff5ee34c5e1
4
+ data.tar.gz: 74be7c0eb42b6e2fbc896677b8a1d514d9e582ee
5
+ SHA512:
6
+ metadata.gz: c371d61bdcd53237401c978780fdd98250ed368a09b3db89e91943af4cc700beb3d8d00c9b06bfce608fcf866af220fc2ce824067d22285c6f2410f24601456a
7
+ data.tar.gz: 914f9d6314cad126cc03e37dcee6872f986bec63d621f03b9ed04a2b21db0b3f28a07e50921e893f72c0a5e96b180d60a9cd4e156f123dbfb2d7d29dae614555
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
4
+ </project>
5
+
data/.idea/misc.xml ADDED
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectRootManager" version="2" project-jdk-name="RVM: ruby-2.0.0-p247" project-jdk-type="RUBY_SDK" />
4
+ </project>
5
+
data/.idea/modules.xml ADDED
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/phantom.iml" filepath="$PROJECT_DIR$/.idea/phantom.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
9
+
data/.idea/phantom.iml ADDED
@@ -0,0 +1,136 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="RUBY_MODULE" version="4">
3
+ <component name="FacetManager">
4
+ <facet type="gem" name="Gem">
5
+ <configuration>
6
+ <option name="GEM_APP_ROOT_PATH" value="$MODULE_DIR$" />
7
+ <option name="GEM_APP_TEST_PATH" value="$MODULE_DIR$/test" />
8
+ <option name="GEM_APP_LIB_PATH" value="$MODULE_DIR$/lib" />
9
+ </configuration>
10
+ </facet>
11
+ </component>
12
+ <component name="ModuleRunConfigurationManager">
13
+ <configuration default="false" name="Phantom: phantom" type="RSpecRunConfigurationType" factoryName="RSpec" temporary="true">
14
+ <predefined_log_file id="RUBY_RSPEC" enabled="true" />
15
+ <module name="phantom" />
16
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="-e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift)" />
17
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="WORK DIR" VALUE="$MODULE_DIR$" />
18
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SHOULD_USE_SDK" VALUE="false" />
19
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="ALTERN_SDK_NAME" VALUE="" />
20
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="myPassParentEnvs" VALUE="true" />
21
+ <envs>
22
+ <env name="JRUBY_OPTS" value="-X+O" />
23
+ </envs>
24
+ <EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="false" />
25
+ <EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
26
+ <EXTENSION ID="RubyCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" track_test_folders="true" runner="rcov">
27
+ <COVERAGE_PATTERN ENABLED="true">
28
+ <PATTERN REGEXPS="/.rvm/" INCLUDED="false" />
29
+ </COVERAGE_PATTERN>
30
+ </EXTENSION>
31
+ <EXTENSION ID="org.jetbrains.plugins.ruby.motion.run.MotionSimulatorRunExtension" />
32
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="" />
33
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/phantom_spec.rb" />
34
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_RUNNER_PATH" VALUE="" />
35
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="**/*_spec.rb" />
36
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="Phantom" />
37
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="TEST_SCRIPT" />
38
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_ARGS" VALUE="" />
39
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_VERSION" VALUE="" />
40
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="USE_CUSTOM_SPEC_RUNNER" VALUE="false" />
41
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="DRB" VALUE="false" />
42
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="ZEUS" VALUE="false" />
43
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
44
+ <RunnerSettings RunnerId="RubyRunner" />
45
+ <ConfigurationWrapper RunnerId="RubyRunner" />
46
+ <method />
47
+ </configuration>
48
+ <configuration default="false" name="phantom_spec: phantom" type="RSpecRunConfigurationType" factoryName="RSpec" temporary="true">
49
+ <predefined_log_file id="RUBY_RSPEC" enabled="true" />
50
+ <module name="phantom" />
51
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="-e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift)" />
52
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="WORK DIR" VALUE="$MODULE_DIR$" />
53
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SHOULD_USE_SDK" VALUE="false" />
54
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="ALTERN_SDK_NAME" VALUE="" />
55
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="myPassParentEnvs" VALUE="true" />
56
+ <envs>
57
+ <env name="JRUBY_OPTS" value="-X+O" />
58
+ </envs>
59
+ <EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="false" />
60
+ <EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
61
+ <EXTENSION ID="RubyCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" track_test_folders="true" runner="rcov">
62
+ <COVERAGE_PATTERN ENABLED="true">
63
+ <PATTERN REGEXPS="/.rvm/" INCLUDED="false" />
64
+ </COVERAGE_PATTERN>
65
+ </EXTENSION>
66
+ <EXTENSION ID="org.jetbrains.plugins.ruby.motion.run.MotionSimulatorRunExtension" />
67
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="" />
68
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/phantom_spec.rb" />
69
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_RUNNER_PATH" VALUE="" />
70
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="**/*_spec.rb" />
71
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="" />
72
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="TEST_SCRIPT" />
73
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_ARGS" VALUE="" />
74
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_VERSION" VALUE="" />
75
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="USE_CUSTOM_SPEC_RUNNER" VALUE="false" />
76
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="DRB" VALUE="false" />
77
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="ZEUS" VALUE="false" />
78
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
79
+ <RunnerSettings RunnerId="RubyCover" />
80
+ <RunnerSettings RunnerId="RubyRunner" />
81
+ <ConfigurationWrapper RunnerId="RubyCover" />
82
+ <ConfigurationWrapper RunnerId="RubyRunner" />
83
+ <method />
84
+ </configuration>
85
+ <configuration default="false" name="All specs in spec: phantom" type="RSpecRunConfigurationType" factoryName="RSpec" temporary="true">
86
+ <predefined_log_file id="RUBY_RSPEC" enabled="true" />
87
+ <module name="phantom" />
88
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="-e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift)" />
89
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="WORK DIR" VALUE="$MODULE_DIR$" />
90
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SHOULD_USE_SDK" VALUE="false" />
91
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="ALTERN_SDK_NAME" VALUE="" />
92
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="myPassParentEnvs" VALUE="true" />
93
+ <envs>
94
+ <env name="JRUBY_OPTS" value="-X+O" />
95
+ </envs>
96
+ <EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="false" />
97
+ <EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
98
+ <EXTENSION ID="RubyCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" track_test_folders="true" runner="rcov">
99
+ <COVERAGE_PATTERN ENABLED="true">
100
+ <PATTERN REGEXPS="/.rvm/" INCLUDED="false" />
101
+ </COVERAGE_PATTERN>
102
+ </EXTENSION>
103
+ <EXTENSION ID="org.jetbrains.plugins.ruby.motion.run.MotionSimulatorRunExtension" />
104
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="$MODULE_DIR$/spec" />
105
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="" />
106
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_RUNNER_PATH" VALUE="" />
107
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="**/*_spec.rb" />
108
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="" />
109
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="ALL_IN_FOLDER" />
110
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_ARGS" VALUE="" />
111
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_VERSION" VALUE="" />
112
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="USE_CUSTOM_SPEC_RUNNER" VALUE="false" />
113
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="DRB" VALUE="false" />
114
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="ZEUS" VALUE="false" />
115
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
116
+ <RunnerSettings RunnerId="RubyRunner" />
117
+ <ConfigurationWrapper RunnerId="RubyRunner" />
118
+ <method />
119
+ </configuration>
120
+ </component>
121
+ <component name="NewModuleRootManager">
122
+ <content url="file://$MODULE_DIR$">
123
+ <sourceFolder url="file://$MODULE_DIR$/spec" isTestSource="true" />
124
+ </content>
125
+ <orderEntry type="inheritedJdk" />
126
+ <orderEntry type="sourceFolder" forTests="false" />
127
+ <orderEntry type="library" scope="PROVIDED" name="bundler (v1.3.5, RVM: ruby-2.0.0-p247) [gem]" level="application" />
128
+ <orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.2.4, RVM: ruby-2.0.0-p247) [gem]" level="application" />
129
+ <orderEntry type="library" scope="PROVIDED" name="rake (v10.1.0, RVM: ruby-2.0.0-p247) [gem]" level="application" />
130
+ <orderEntry type="library" scope="PROVIDED" name="rspec (v2.14.1, RVM: ruby-2.0.0-p247) [gem]" level="application" />
131
+ <orderEntry type="library" scope="PROVIDED" name="rspec-core (v2.14.7, RVM: ruby-2.0.0-p247) [gem]" level="application" />
132
+ <orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v2.14.4, RVM: ruby-2.0.0-p247) [gem]" level="application" />
133
+ <orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v2.14.4, RVM: ruby-2.0.0-p247) [gem]" level="application" />
134
+ </component>
135
+ </module>
136
+
@@ -0,0 +1,5 @@
1
+ <component name="DependencyValidationManager">
2
+ <state>
3
+ <option name="SKIP_IMPORT_STATEMENTS" value="false" />
4
+ </state>
5
+ </component>
data/.idea/vcs.xml ADDED
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="$PROJECT_DIR$" vcs="Git" />
5
+ </component>
6
+ </project>
7
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in phantom.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 zhoumh
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # Phantom
2
+
3
+ This gem is made to implement the callback mechanism to sub processes.
4
+
5
+ ## Requirements
6
+
7
+ Ruby >= 2.0.0
8
+
9
+ This gem uses `::fork` and therefore is not compatible with JRuby.
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'phantom'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install phantom
24
+
25
+ ## Usage
26
+
27
+ ```ruby
28
+ begin
29
+ phantom = Phantom.run(pid_file: '/path/to/your.pid',
30
+ on_ok: method(:my_ok_callback),
31
+ on_error: method(:my_error_callback)) do
32
+ # Do your background job here
33
+ end
34
+ rescue Phantom::ForkError => e
35
+ puts e.pid_file #=> pid file path
36
+ puts e.message #=> error message
37
+ end
38
+
39
+ phantom.pid #=> PID or nil if fork fails
40
+ ```
41
+
42
+ The `on_ok` parameter can be any instances that respond to `call` taking no arguments.
43
+
44
+ The `on_error` parameter can be any instances that respond to `call` taking 1 argument, the exception.
45
+
46
+ None of the parameters is required.
47
+
48
+ If `pid_file` is given, `Phantom.run` first check the existence of the file, if exits, raises a `Phantom::ForkError`.
49
+
50
+ ## TODO
51
+
52
+ Implement monitoring and intercepting mechanism
53
+
54
+ ## Contributing
55
+
56
+ 1. Fork it
57
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
58
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
59
+ 4. Push to the branch (`git push origin my-new-feature`)
60
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/lib/phantom.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'phantom/fork_error'
2
+ require 'phantom/base'
3
+ require 'phantom/status'
4
+ require 'phantom/class_methods'
5
+
6
+ module Phantom
7
+
8
+ end
@@ -0,0 +1,38 @@
1
+ module Phantom
2
+ class Base
3
+ attr_reader :pid, :status
4
+
5
+ def initialize(pid)
6
+ @pid = pid
7
+ end
8
+
9
+ def kill(signal)
10
+ Process.kill(signal, @pid) if @pid
11
+ end
12
+
13
+ def sid
14
+ @sid ||= Process.getsid(@pid)
15
+ end
16
+
17
+ def gid
18
+ @gid ||= Process.getpgid(@pid)
19
+ end
20
+
21
+ def user_priority
22
+ @user_priority ||= Process.getpriority(Process::PRIO_USER, @pid)
23
+ end
24
+
25
+ def group_priority
26
+ @group_priority ||= Process.getpriority(Process::PRIO_PGRP, @pid)
27
+ end
28
+
29
+ def process_priority
30
+ @process_priority ||= Process.getpriority(Process::PRIO_PROCESS, @pid)
31
+ end
32
+
33
+ def abort
34
+ kill(:TERM)
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,56 @@
1
+ module Phantom
2
+
3
+ class << self
4
+ def run(pid_file: nil, on_ok: nil, on_error: nil, &block)
5
+ return Phantom::Base.new(nil) unless block_given?
6
+
7
+ raise ForkError.new('Running process exists.', pid_file) if pid_file and File.exist?(pid_file)
8
+
9
+ i, o = IO.pipe
10
+ f = File.new(pid_file, 'w') if pid_file
11
+
12
+ pid = fork do
13
+ at_exit do
14
+ o.flush
15
+ o.close
16
+ File.delete pid_file if pid_file
17
+ end
18
+
19
+ trap(:TERM) do
20
+ Process.abort
21
+ end
22
+
23
+ i.close
24
+ begin
25
+ block.call if block_given?
26
+ Marshal.dump(Status::OK, o)
27
+ rescue StandardError => e
28
+ Marshal.dump(e, o)
29
+ end
30
+ end
31
+
32
+ Process.detach(pid)
33
+ f.write(pid.to_s) if pid_file
34
+ f.close if pid_file
35
+ o.close
36
+
37
+ Thread.abort_on_exception = true
38
+ Thread.new do
39
+ begin
40
+ status = Marshal.load(i)
41
+ if status == Status::OK then
42
+ on_ok.call if on_ok
43
+ else
44
+ on_error.call(status) if on_error
45
+ end
46
+ rescue Errno::EPIPE, EOFError => e
47
+ on_error.call(e) if on_error
48
+ ensure
49
+ i.close
50
+ end
51
+ end
52
+
53
+ return Phantom::Base.new(pid)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,11 @@
1
+ module Phantom
2
+ class ForkError < Exception
3
+ attr_reader :pid, :pid_file
4
+
5
+ def initialize(message, pid_file)
6
+ super(message)
7
+ @pid_file = pid_file
8
+ @pid = File.read @pid_file
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ module Phantom
2
+ module Status
3
+ OK = 'OK'
4
+ ABORTED = 'Aborted'
5
+ ERROR = 'Error'
6
+ PAUSED = 'Paused'
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ module Phantom
2
+ VERSION = "0.0.1"
3
+ end
data/phantom.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'phantom/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "phantom"
8
+ spec.version = Phantom::VERSION
9
+ spec.authors = ["Aetherus"]
10
+ spec.email = ["sasabune0122@gmail.com"]
11
+ spec.description = %q{This gem is developed to implement callback mechanism to sub processes.}
12
+ spec.summary = %q{This gem is developed to implement callback mechanism to sub processes. Not production ready.}
13
+ spec.homepage = "https://github.com/Aetherus/phantom"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ end
data/spec/base_spec.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'phantom'
2
+
3
+ describe Phantom::Base do
4
+ it 'should be kill the process when called on abort' do
5
+ i = 0
6
+ phantom = Phantom.run do
7
+ sleep 3
8
+ i = 1
9
+ end
10
+ phantom.abort
11
+ sleep 5
12
+ i.should == 0
13
+ end
14
+ end
@@ -0,0 +1,60 @@
1
+ require 'phantom'
2
+
3
+ describe Phantom do
4
+ pid_file = 'tmp/phantom.pid'
5
+
6
+ after do
7
+ File.delete pid_file if File.exist? pid_file
8
+ end
9
+
10
+ it 'should remove the pid file when normally ends.' do
11
+ Phantom.run(pid_file: pid_file) {}
12
+ File.should_not exist(pid_file)
13
+ end
14
+
15
+ it 'should raise error if pre-exists pid file' do
16
+ File.new(pid_file, 'w').close
17
+ expect{
18
+ Phantom.run(pid_file: pid_file) do end
19
+ }.to raise_error(Phantom::ForkError)
20
+ end
21
+
22
+ it 'should call on_ok when sub processed normally ends' do
23
+ i = 0
24
+ err = nil
25
+ Phantom.run(pid_file: pid_file, on_ok: lambda{i += 1}, on_error: lambda{|e| err = e}) do
26
+ end
27
+ sleep 3
28
+ i.should == 1
29
+ err.should == nil
30
+ end
31
+
32
+ it 'should call on_error when sub process raises an unhandled error' do
33
+ err = nil
34
+ i = 0
35
+ Phantom.run(pid_file: pid_file, on_ok: lambda{i += 1}, on_error: lambda{|e| err = e}) do
36
+ raise 'Wa ha ha!'
37
+ i += 1
38
+ end
39
+
40
+ sleep 3
41
+
42
+ err.should be_an(StandardError)
43
+ err.message.should == 'Wa ha ha!'
44
+ i.should == 0
45
+ end
46
+
47
+ it 'should be OK if pid_file is not given' do
48
+ Phantom.run do end
49
+ end
50
+
51
+ it 'should return a Phantom::Base instance when run' do
52
+ phantom = Phantom.run do end
53
+ phantom.should be_an(Phantom::Base)
54
+ end
55
+
56
+ it 'should do nothing if block is not given' do
57
+ phantom = Phantom.run
58
+ phantom.pid.should be_nil
59
+ end
60
+ end
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: phantom
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Aetherus
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-11 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.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
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
+ description: This gem is developed to implement callback mechanism to sub processes.
56
+ email:
57
+ - sasabune0122@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - .gitignore
63
+ - .idea/encodings.xml
64
+ - .idea/misc.xml
65
+ - .idea/modules.xml
66
+ - .idea/phantom.iml
67
+ - .idea/scopes/scope_settings.xml
68
+ - .idea/vcs.xml
69
+ - Gemfile
70
+ - LICENSE.txt
71
+ - README.md
72
+ - Rakefile
73
+ - lib/phantom.rb
74
+ - lib/phantom/base.rb
75
+ - lib/phantom/class_methods.rb
76
+ - lib/phantom/fork_error.rb
77
+ - lib/phantom/status.rb
78
+ - lib/phantom/version.rb
79
+ - phantom.gemspec
80
+ - spec/base_spec.rb
81
+ - spec/phantom_spec.rb
82
+ homepage: https://github.com/Aetherus/phantom
83
+ licenses:
84
+ - MIT
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 2.1.9
103
+ signing_key:
104
+ specification_version: 4
105
+ summary: This gem is developed to implement callback mechanism to sub processes. Not
106
+ production ready.
107
+ test_files:
108
+ - spec/base_spec.rb
109
+ - spec/phantom_spec.rb