fork_break 0.1.3 → 0.1.4

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: b499c0a1fefcb573b97b0b927c0715efc4b570b7
4
- data.tar.gz: 4245c08783830dd2819a342e9e02a6247641e110
3
+ metadata.gz: a045eeead39fd72e60950ac324dd97e1886f1adc
4
+ data.tar.gz: 2c8be1f3dd8803350b83aaa87967cbbcde7ef27b
5
5
  SHA512:
6
- metadata.gz: b2ae727120864671c37f8422ff1e9a541829a6751e36cf02b7db2296735e29a1b82134ad5f4241763be90d5d967a1935333b21206fd9efad7d2ab62a9187e866
7
- data.tar.gz: 58c7081315b18fa3d8296a67006c2dd0caeb229b787b2443ef67af6c6cfa8eedf31a57aedeb79314669a4218b5ffc1391d0e87e20e3862da76d88a20ab4fa7ef
6
+ metadata.gz: 76cf51cf876d68c1d97ef8099889b1bc1e829b3d7f4ad121c2bb87f523dcb7afcce3386cda2266bf97d952e288285bef87e0aa4d29a38a8add251565d9afcc34
7
+ data.tar.gz: c6404a9230a6c0d8022d06290db9bd00ed886d5e0dc689159e1055b957ff70ec6b858bfa1d30f390f465161ecd81af93e1df4125457c4560e005438bcbe1281b
@@ -19,3 +19,9 @@ Metrics/AbcSize:
19
19
 
20
20
  Metrics/MethodLength:
21
21
  Max: 15
22
+
23
+ Metrics/CyclomaticComplexity:
24
+ Max: 7
25
+
26
+ Metrics/PerceivedComplexity:
27
+ Max: 8
@@ -0,0 +1,23 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.1.7
5
+ - 2.2.3
6
+ - jruby-19mode
7
+ - jruby-head
8
+ - rbx-2
9
+ - ruby-head
10
+
11
+ matrix:
12
+ allow_failures:
13
+ - rvm: jruby-19mode
14
+ - rvm: jruby-head
15
+
16
+ before_install:
17
+ - gem update --system
18
+ - gem install bundler -v 1.10.6
19
+ install: 'bundle'
20
+ script: 'bundle exec rspec && bundle exec rubocop'
21
+ notifications:
22
+ email:
23
+ - pedro.carrico@gmail.com
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # ForkBreak
2
2
 
3
+ [![Build Status](https://secure.travis-ci.org/forkbreak/fork_break.png)](http://travis-ci.org/forkbreak/fork_break) [![Dependency Status](https://gemnasium.com/forkbreak/fork_break.png)](https://gemnasium.com/forkbreak/fork_break) [![Gem Version](https://badge.fury.io/rb/fork_break.svg)](http://badge.fury.io/rb/fork_break) [![Code Climate](https://codeclimate.com/github/forkbreak/fork_break/badges/gpa.svg)](https://codeclimate.com/github/forkbreak/fork_break)
4
+
3
5
  Testing multiprocess behaviour is difficult and requires a way to synchronize processes at
4
6
  specific execution points. This gem allows the parent process to control the behaviour of child processes using
5
7
  breakpoints. It was originally built for testing the behaviour of database transactions and locking mechanisms.
@@ -98,6 +100,9 @@ puts counter_after_synced_execution("counter_with_lock", true) # => 2
98
100
  puts counter_after_synced_execution("counter_without_lock", false) # => 1
99
101
  ```
100
102
 
103
+ When running outside a ForkBreak process the breakpoints will be ignored so that you can use the same classes with
104
+ breakpoints in production code.
105
+
101
106
  There's also the possibility of adding a predefined timeout to the wait function and having it raise an exception.
102
107
 
103
108
  ```ruby
@@ -115,3 +120,6 @@ process.finish.wait(timeout: 1) # will raise ForkBreak::WaitTimeout after 1 seco
115
120
  3. Commit your changes (`git commit -am 'Added some feature'`)
116
121
  4. Push to the branch (`git push origin my-new-feature`)
117
122
  5. Create new Pull Request
123
+
124
+ ## License
125
+ ForkBreak is released under the [MIT License](http://www.opensource.org/licenses/MIT).
@@ -1,19 +1,20 @@
1
- require_relative 'lib/fork_break/version'
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ require 'fork_break/version'
2
5
 
3
6
  Gem::Specification.new do |gem|
4
- gem.authors = ['Petter Remen']
5
- gem.email = ['petter.remen@gmail.com']
7
+ gem.authors = ['Petter Remen', 'Pedro Carriço']
6
8
  gem.summary =
7
9
  'Testing multiprocess behaviour is difficult and requires a way to synchronize processes at specific execution ' \
8
10
  'points. This gem allows the parent process to control the behaviour of child processes using breakpoints. It was' \
9
11
  'originally built for testing the behaviour of database transactions and locking mechanisms.'
10
12
  gem.description = 'Fork with breakpoints for syncing child process execution'
11
- gem.homepage = 'http://github.com/remen/fork_break'
13
+ gem.homepage = 'http://github.com/forkbreak/fork_break'
12
14
  gem.licenses = ['MIT']
13
-
14
15
  gem.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
15
- gem.executables = gem.files.grep(/^bin\//).map { |f| File.basename(f) }
16
- gem.test_files = gem.files.grep(/^(test|spec|features)\//)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
18
  gem.name = 'fork_break'
18
19
  gem.require_paths = ['lib']
19
20
  gem.version = ForkBreak::VERSION
@@ -1,4 +1,5 @@
1
1
  require 'fork'
2
+ require 'fork_break/null_breakpoint_setter'
2
3
  require 'fork_break/breakpoint_setter'
3
4
  require 'fork_break/breakpoints'
4
5
  require 'fork_break/process'
@@ -0,0 +1,7 @@
1
+ module ForkBreak
2
+ class NullBreakpointSetter
3
+ def <<(*)
4
+ # no-op
5
+ end
6
+ end
7
+ end
@@ -4,16 +4,21 @@ module ForkBreak
4
4
  attr_accessor :breakpoint_setter
5
5
  end
6
6
 
7
+ attr_reader :return_value
8
+
9
+ @breakpoint_setter = NullBreakpointSetter.new
10
+
7
11
  def initialize(debug = false, &block)
8
12
  @debug = debug
9
13
  @fork = Fork.new(:return, :to_fork, :from_fork) do |child_fork|
10
14
  self.class.breakpoint_setter = breakpoints = BreakpointSetter.new(child_fork, debug)
11
15
 
12
16
  breakpoints << :forkbreak_start
13
- block.call(breakpoints)
17
+ returned_value = block.call(breakpoints)
14
18
  breakpoints << :forkbreak_end
15
19
 
16
20
  self.class.breakpoint_setter = nil
21
+ returned_value
17
22
  end
18
23
  end
19
24
 
@@ -31,6 +36,9 @@ module ForkBreak
31
36
  loop do
32
37
  brk = @fork.receive_object
33
38
  puts "Parent is receiving object #{brk} from #{@fork.pid}" if @debug
39
+
40
+ @return_value = @fork.return_value if brk == :forkbreak_end
41
+
34
42
  if brk == @next_breakpoint
35
43
  return self
36
44
  elsif brk == :forkbreak_end
@@ -1,3 +1,3 @@
1
1
  module ForkBreak
2
- VERSION = '0.1.3'.freeze
2
+ VERSION = '0.1.4'.freeze
3
3
  end
@@ -59,7 +59,7 @@ describe ForkBreak::Process do
59
59
  end
60
60
  end
61
61
 
62
- def counter_after_synced_execution(counter_path, with_lock) # rubocop:disable Metrics/AbcSize
62
+ def counter_after_synced_execution(counter_path, with_lock)
63
63
  process1, process2 = 2.times.map do
64
64
  ForkBreak::Process.new { FileCounter.open(counter_path, with_lock).increase }
65
65
  end
@@ -86,6 +86,21 @@ describe ForkBreak::Process do
86
86
  end
87
87
  end
88
88
 
89
+ it 'ignores breakpoints when running outside a ForkBreak process' do
90
+ class Foo
91
+ include ForkBreak::Breakpoints
92
+
93
+ def bar
94
+ breakpoints << :test
95
+ 'baz'
96
+ end
97
+ end
98
+
99
+ expect(Foo.new.breakpoints).to be_kind_of(ForkBreak::NullBreakpointSetter)
100
+ expect { Foo.new.bar }.to_not raise_error
101
+ expect(Foo.new.bar).to eq('baz')
102
+ end
103
+
89
104
  it 'raises the process exception' do
90
105
  class MyException < StandardError; end
91
106
 
@@ -103,4 +118,18 @@ describe ForkBreak::Process do
103
118
 
104
119
  expect { process.finish.wait(timeout: 0.01) }.to raise_error(ForkBreak::WaitTimeout)
105
120
  end
121
+
122
+ it 'keeps the return value of the process' do
123
+ class Foo
124
+ include ForkBreak::Breakpoints
125
+
126
+ def bar
127
+ 'baz'
128
+ end
129
+ end
130
+
131
+ process = ForkBreak::Process.new { Foo.new.bar }.finish.wait
132
+
133
+ expect(process.return_value).to eq('baz')
134
+ end
106
135
  end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fork_break
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Petter Remen
8
+ - Pedro Carriço
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2015-06-02 00:00:00.000000000 Z
12
+ date: 2015-11-06 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: fork
@@ -65,8 +66,7 @@ dependencies:
65
66
  - !ruby/object:Gem::Version
66
67
  version: 0.27.1
67
68
  description: Fork with breakpoints for syncing child process execution
68
- email:
69
- - petter.remen@gmail.com
69
+ email:
70
70
  executables: []
71
71
  extensions: []
72
72
  extra_rdoc_files: []
@@ -74,6 +74,7 @@ files:
74
74
  - ".gitignore"
75
75
  - ".rspec"
76
76
  - ".rubocop.yml"
77
+ - ".travis.yml"
77
78
  - Gemfile
78
79
  - LICENSE
79
80
  - README.md
@@ -82,11 +83,12 @@ files:
82
83
  - lib/fork_break.rb
83
84
  - lib/fork_break/breakpoint_setter.rb
84
85
  - lib/fork_break/breakpoints.rb
86
+ - lib/fork_break/null_breakpoint_setter.rb
85
87
  - lib/fork_break/process.rb
86
88
  - lib/fork_break/version.rb
87
89
  - spec/fork_break_spec.rb
88
90
  - spec/spec_helper.rb
89
- homepage: http://github.com/remen/fork_break
91
+ homepage: http://github.com/forkbreak/fork_break
90
92
  licenses:
91
93
  - MIT
92
94
  metadata: {}
@@ -106,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
108
  version: '0'
107
109
  requirements: []
108
110
  rubyforge_project:
109
- rubygems_version: 2.2.2
111
+ rubygems_version: 2.4.5.1
110
112
  signing_key:
111
113
  specification_version: 4
112
114
  summary: Testing multiprocess behaviour is difficult and requires a way to synchronize