aw 0.1.11 → 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 +4 -4
- data/LICENSE.md +1 -1
- data/README.md +65 -30
- data/lib/aw/fork.rb +22 -10
- data/lib/aw.rb +37 -8
- metadata +58 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72301167c4e8ea2ca3f8f2ab8bd7295822577c6539aeedf7bbc67b0feeb2eaf5
|
4
|
+
data.tar.gz: 0e4afe4ec73d3b19a3bdd2e644f2a45366ad9ac4ad73c7c57c7cd290face4639
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72244a26c4a020ef1a5b185ca12d1d06dd87c3814d7acc55a3147f9df06eb414de9dbf4968d3e3d613d022d1475e48f7b60d52074e18047023e2fc6f02a0faa1
|
7
|
+
data.tar.gz: b6176b99c583a856bff7b98db9cbb9007b4ece7111b58739bfabab5c88324cde06581a46db4b9c8151ae7eb213abf05cc0210c57b7f04dcaf6beabcf299cec2c
|
data/LICENSE.md
CHANGED
data/README.md
CHANGED
@@ -1,64 +1,105 @@
|
|
1
1
|
# Aw
|
2
2
|
|
3
|
-
[](https://github.com/fixrb/aw/releases)
|
4
|
+
[](https://rubydoc.info/github/fixrb/aw/main)
|
5
|
+
[](https://github.com/fixrb/aw/actions?query=workflow%3Aci+branch%3Amain)
|
6
|
+
[](https://github.com/fixrb/aw/actions?query=workflow%3Arubocop+branch%3Amain)
|
7
|
+
[](https://github.com/fixrb/aw/raw/main/LICENSE.md)
|
8
8
|
|
9
|
-
> Aw, fork
|
9
|
+
> Aw, fork 😬
|
10
10
|
|
11
|
-
|
11
|
+

|
12
|
+
|
13
|
+
Creates a sub-process to execute a block inside, and returns what it returns (or a boolean).
|
12
14
|
|
13
15
|
## Installation
|
14
16
|
|
15
17
|
Add this line to your application's Gemfile:
|
16
18
|
|
17
19
|
```ruby
|
18
|
-
gem
|
20
|
+
gem "aw"
|
19
21
|
```
|
20
22
|
|
21
23
|
And then execute:
|
22
24
|
|
23
|
-
|
25
|
+
```sh
|
26
|
+
bundle install
|
27
|
+
```
|
24
28
|
|
25
29
|
Or install it yourself as:
|
26
30
|
|
27
|
-
|
31
|
+
```sh
|
32
|
+
gem install aw
|
33
|
+
```
|
28
34
|
|
29
35
|
## Usage
|
30
36
|
|
31
|
-
|
37
|
+
To make __Aw__ available:
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
require "aw"
|
41
|
+
```
|
42
|
+
|
43
|
+
There are two methods:
|
44
|
+
|
45
|
+
- `fork!`
|
46
|
+
- `fork?`
|
47
|
+
|
48
|
+
### Method `.fork!`
|
49
|
+
|
50
|
+
Executes a block of code in a sub-process, and returns the result:
|
32
51
|
|
33
52
|
```ruby
|
34
53
|
Aw.fork! { 6 * 7 } # => 42
|
35
54
|
```
|
36
55
|
|
37
|
-
|
56
|
+
When the execution of a block of code causes side effects, these are limited to the sub-process:
|
38
57
|
|
39
58
|
```ruby
|
40
|
-
arr = [
|
59
|
+
arr = ["foo"] # => ["foo"]
|
41
60
|
|
42
|
-
Aw.fork! { arr <<
|
61
|
+
Aw.fork! { arr << "FUU" } # => ["foo", "FUU"]
|
43
62
|
|
44
63
|
arr # => ["foo"]
|
45
64
|
```
|
46
65
|
|
47
|
-
Exceptions raised
|
66
|
+
Exceptions raised in a block of code are propagated:
|
48
67
|
|
49
68
|
```ruby
|
50
|
-
Aw.fork! { nil + 1 }
|
69
|
+
Aw.fork! { nil + 1 }
|
51
70
|
```
|
52
71
|
|
53
|
-
|
72
|
+
results in the error:
|
73
|
+
|
74
|
+
> `NoMethodError` (undefined method `+' for nil:NilClass)
|
54
75
|
|
55
|
-
|
56
|
-
* Bugs/issues: https://github.com/fixrb/aw/issues
|
76
|
+
### Method `.fork?`
|
57
77
|
|
58
|
-
|
78
|
+
Executes a block of code in a sub-process, and returns `true` if no exception is thrown:
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
Aw.fork? { 6 * 7 } # => true
|
82
|
+
```
|
59
83
|
|
60
|
-
|
61
|
-
|
84
|
+
When the execution of a block of code causes side effects, these are limited to the sub-process:
|
85
|
+
|
86
|
+
```ruby
|
87
|
+
arr = ["foo"] # => ["foo"]
|
88
|
+
|
89
|
+
Aw.fork? { arr << "FUU" } # => true
|
90
|
+
|
91
|
+
arr # => ["foo"]
|
92
|
+
```
|
93
|
+
|
94
|
+
When an exception is raised in a code block, `false` is returned:
|
95
|
+
|
96
|
+
```ruby
|
97
|
+
Aw.fork? { nil + 1 } # => false
|
98
|
+
```
|
99
|
+
|
100
|
+
## Contact
|
101
|
+
|
102
|
+
* Source code: https://github.com/fixrb/aw
|
62
103
|
|
63
104
|
## Versioning
|
64
105
|
|
@@ -66,19 +107,13 @@ __Aw__ follows [Semantic Versioning 2.0](https://semver.org/).
|
|
66
107
|
|
67
108
|
## License
|
68
109
|
|
69
|
-
The gem is available as open source under the terms of the [MIT License](https://
|
110
|
+
The [gem](https://rubygems.org/gems/aw) is available as open source under the terms of the [MIT License](https://github.com/fixrb/aw/raw/main/LICENSE.md).
|
70
111
|
|
71
112
|
***
|
72
113
|
|
73
114
|
<p>
|
74
115
|
This project is sponsored by:<br />
|
75
116
|
<a href="https://sashite.com/"><img
|
76
|
-
src="https://github.com/fixrb/aw/raw/
|
117
|
+
src="https://github.com/fixrb/aw/raw/main/img/sashite.png"
|
77
118
|
alt="Sashite" /></a>
|
78
119
|
</p>
|
79
|
-
|
80
|
-
[gem]: https://rubygems.org/gems/aw
|
81
|
-
[travis]: https://travis-ci.org/fixrb/aw
|
82
|
-
[codeclimate]: https://codeclimate.com/github/fixrb/aw
|
83
|
-
[inchpages]: https://inch-ci.org/github/fixrb/aw
|
84
|
-
[rubydoc]: https://rubydoc.info/gems/aw
|
data/lib/aw/fork.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "English"
|
4
4
|
|
5
5
|
module Aw
|
6
6
|
# The Fork class.
|
7
|
+
#
|
8
|
+
# @api private
|
7
9
|
class Fork
|
8
10
|
# Initialize the class.
|
9
11
|
#
|
@@ -11,7 +13,7 @@ module Aw
|
|
11
13
|
# @param write [IO] The write endpoint.
|
12
14
|
def initialize(read, write)
|
13
15
|
# Currently, not available on all platforms.
|
14
|
-
raise ::NotImplementedError,
|
16
|
+
raise ::NotImplementedError, "fork()" unless ::Process.respond_to?(:fork)
|
15
17
|
|
16
18
|
@read = read
|
17
19
|
@write = write
|
@@ -27,26 +29,34 @@ module Aw
|
|
27
29
|
# @return [IO] The write endpoint.
|
28
30
|
attr_reader :write
|
29
31
|
|
30
|
-
#
|
32
|
+
# Runs the block inside a sub-process, and returns the computed value.
|
31
33
|
#
|
32
|
-
# @
|
33
|
-
|
34
|
+
# @example Computes `6 * 7` in a sub-process and returns `42` to the current process.
|
35
|
+
# call { 6 * 7 } # => 42
|
36
|
+
#
|
37
|
+
# @raise [Exception] Exceptions raised in a block of code are propagated.
|
38
|
+
# @return [#object_id] Returns the value that has been returned in the block.
|
39
|
+
def call(&block)
|
34
40
|
pid = fork_and_return_pid(&block)
|
35
41
|
write.close
|
36
42
|
result = read.read
|
37
43
|
::Process.wait(pid)
|
38
44
|
|
39
45
|
# rubocop:disable Security/MarshalLoad
|
40
|
-
::Marshal.load(result).tap
|
41
|
-
raise r if r.is_a?(::Exception)
|
42
|
-
end
|
46
|
+
::Marshal.load(result).tap { |r| raise r if r.is_a?(::Exception) }
|
43
47
|
# rubocop:enable Security/MarshalLoad
|
44
48
|
end
|
45
49
|
|
46
50
|
private
|
47
51
|
|
52
|
+
# Creates a sub-process to execute a block inside, and returns the
|
53
|
+
# sub-process ID.
|
54
|
+
#
|
55
|
+
# @return [Integer] The ID of the created sub-process.
|
48
56
|
def fork_and_return_pid
|
49
|
-
fork do
|
57
|
+
::Process.fork do
|
58
|
+
# :nocov:
|
59
|
+
|
50
60
|
read.close
|
51
61
|
|
52
62
|
# rubocop:disable Lint/RescueException
|
@@ -58,7 +68,9 @@ module Aw
|
|
58
68
|
# rubocop:enable Lint/RescueException
|
59
69
|
|
60
70
|
::Marshal.dump(result, write)
|
61
|
-
exit!(true)
|
71
|
+
::Process.exit!(true)
|
72
|
+
|
73
|
+
# :nocov:
|
62
74
|
end
|
63
75
|
end
|
64
76
|
end
|
data/lib/aw.rb
CHANGED
@@ -2,19 +2,48 @@
|
|
2
2
|
|
3
3
|
# Namespace for the Aw library.
|
4
4
|
#
|
5
|
-
# @
|
6
|
-
#
|
7
|
-
# @example Fork and return 42 from 6 * 7.
|
5
|
+
# @example Computes `6 * 7` in a sub-process and returns `42` to the current process.
|
8
6
|
# Aw.fork! { 6 * 7 } # => 42
|
7
|
+
#
|
8
|
+
# @example Computes `6 * 7` in a sub-process and returns `true` to the current process if no exception is thrown.
|
9
|
+
# Aw.fork? { 6 * 7 } # => true
|
10
|
+
#
|
11
|
+
# @api public
|
9
12
|
module Aw
|
10
|
-
#
|
13
|
+
# Runs the block inside a sub-process, and returns the computed value.
|
14
|
+
#
|
15
|
+
# @param block [Proc] The code to run in a sub-process.
|
16
|
+
#
|
17
|
+
# @example Computes `6 * 7` in a sub-process and returns `42` to the current process.
|
18
|
+
# Aw.fork! { 6 * 7 } # => 42
|
11
19
|
#
|
12
|
-
# @
|
20
|
+
# @example Computes `nil + 1` in a sub-process and raises `NoMethodError` to the current process.
|
21
|
+
# Aw.fork! { nil + 1 } # => raise NoMethodError (undefined method `+' for nil:NilClass)
|
13
22
|
#
|
14
|
-
# @
|
23
|
+
# @raise [Exception] Exceptions raised in a block of code are propagated.
|
24
|
+
# @return [#object_id] Returns the value that has been returned in the block.
|
15
25
|
def self.fork!(&block)
|
16
|
-
|
26
|
+
read, write = ::IO.pipe
|
27
|
+
Fork.new(read, write).call(&block)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Runs the block inside a sub-process, and returns `true` if no exception is
|
31
|
+
# thrown. Otherwise when an exception is raised, `false` is returned.
|
32
|
+
#
|
33
|
+
# @param block [Proc] The code to run in a sub-process.
|
34
|
+
#
|
35
|
+
# @example Computes `6 * 7` in a sub-process and returns `true` to the current process.
|
36
|
+
# Aw.fork? { 6 * 7 } # => true
|
37
|
+
#
|
38
|
+
# @example Computes `nil + 1` in a sub-process and returns `false` to the current process.
|
39
|
+
# Aw.fork? { nil + 1 } # => false
|
40
|
+
#
|
41
|
+
# @return [Boolean] Returns `true` if stat is successful, `false` if not.
|
42
|
+
def self.fork?(&block)
|
43
|
+
pid = ::Process.fork(&block)
|
44
|
+
_, status = ::Process.wait2(pid)
|
45
|
+
status.success?
|
17
46
|
end
|
18
47
|
end
|
19
48
|
|
20
|
-
require_relative File.join(
|
49
|
+
require_relative File.join("aw", "fork")
|
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cyril Kato
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name: rubocop
|
42
|
+
name: rubocop-md
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0
|
47
|
+
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rubocop-performance
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,35 +66,64 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop-rake
|
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'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop-thread_safety
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: simplecov
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
72
100
|
requirements:
|
73
|
-
- - "
|
101
|
+
- - ">="
|
74
102
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0
|
103
|
+
version: '0'
|
76
104
|
type: :development
|
77
105
|
prerelease: false
|
78
106
|
version_requirements: !ruby/object:Gem::Requirement
|
79
107
|
requirements:
|
80
|
-
- - "
|
108
|
+
- - ">="
|
81
109
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0
|
110
|
+
version: '0'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: yard
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
|
-
- - "
|
115
|
+
- - ">="
|
88
116
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0
|
117
|
+
version: '0'
|
90
118
|
type: :development
|
91
119
|
prerelease: false
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
93
121
|
requirements:
|
94
|
-
- - "
|
122
|
+
- - ">="
|
95
123
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0
|
97
|
-
description: Creates a
|
124
|
+
version: '0'
|
125
|
+
description: Creates a sub-process to execute a block inside, and returns what it
|
126
|
+
returns (or a boolean).
|
98
127
|
email: contact@cyril.email
|
99
128
|
executables: []
|
100
129
|
extensions: []
|
@@ -107,7 +136,8 @@ files:
|
|
107
136
|
homepage: https://github.com/fixrb/aw
|
108
137
|
licenses:
|
109
138
|
- MIT
|
110
|
-
metadata:
|
139
|
+
metadata:
|
140
|
+
rubygems_mfa_required: 'true'
|
111
141
|
post_install_message:
|
112
142
|
rdoc_options: []
|
113
143
|
require_paths:
|
@@ -116,15 +146,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
116
146
|
requirements:
|
117
147
|
- - ">="
|
118
148
|
- !ruby/object:Gem::Version
|
119
|
-
version:
|
149
|
+
version: 2.7.0
|
120
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
151
|
requirements:
|
122
152
|
- - ">="
|
123
153
|
- !ruby/object:Gem::Version
|
124
154
|
version: '0'
|
125
155
|
requirements: []
|
126
|
-
rubygems_version: 3.1.
|
156
|
+
rubygems_version: 3.1.6
|
127
157
|
signing_key:
|
128
158
|
specification_version: 4
|
129
|
-
summary: "Aw, fork
|
159
|
+
summary: "Aw, fork \U0001F62C"
|
130
160
|
test_files: []
|