tra 0.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cd1da5cafab185749f54bea2504134b1938be798
4
+ data.tar.gz: 180cbc81a2ed58a413207cd2a76c805351d3e3e2
5
+ SHA512:
6
+ metadata.gz: 476768c1029e5d715004a3339b5c5121409e8e44c45e8f0f65cc85001f4a73bf2db2cd3f2698718187ab611be10b7b2d2d0d92cade11e268d5795cdb3009ee64
7
+ data.tar.gz: e7d27d0e95e8419d24fbaf6079b543a538859fa96b23be7f0e9aec0884586eb4843d69ec0b64a23f45b23f6dc3151cf6b9e0da6982004dffea46388451094fe5
data/lib/tra/fork.rb ADDED
@@ -0,0 +1,7 @@
1
+ module Tra
2
+ module Fork
3
+ def fork
4
+ super { QUEUE.clear; Mailbox.receive; yield }
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ module Tra
2
+ module Mailbox
3
+ def self.receive
4
+ Dir.mkdir DIRECTORY unless Dir.exist? DIRECTORY
5
+ file = FILE[Process.pid]
6
+
7
+ Thread.new do
8
+ Socket.unix_server_loop file do |socket|
9
+ QUEUE << (Marshal.load socket.gets)
10
+ end
11
+ end
12
+
13
+ sleep 0.01 until File.exist? file
14
+ end
15
+ end
16
+ end
data/lib/tra/run.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'tra'
2
+ Tra.run
data/lib/tra.rb ADDED
@@ -0,0 +1,41 @@
1
+ require 'forwardable'
2
+ require 'socket'
3
+
4
+ require_relative 'tra/mailbox'
5
+ require_relative 'tra/fork'
6
+
7
+ module Tra
8
+ QUEUE = Queue.new
9
+
10
+ DIRECTORY = "/tmp/tractor"
11
+ FILE = -> pid { "#{DIRECTORY}/#{pid}" }
12
+
13
+ class << self
14
+ ENUMERATOR = Enumerator.new do |y|
15
+ loop { y << QUEUE.pop }
16
+ end
17
+
18
+ extend Forwardable
19
+ delegate [:next, :take] => :ENUMERATOR
20
+
21
+ def run
22
+ Mailbox.receive
23
+
24
+ patch_Object_shamelessly
25
+ patch_Integer_shamelessly
26
+ end
27
+
28
+ private
29
+ def patch_Object_shamelessly
30
+ Object.prepend Fork
31
+ end
32
+
33
+ def patch_Integer_shamelessly
34
+ Integer.class_eval do
35
+ def put message
36
+ Socket.unix(FILE[self]).write "#{Marshal.dump message}\n"
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
data/test.rb ADDED
@@ -0,0 +1,17 @@
1
+ require_relative 'lib/tra'
2
+ Tra.run
3
+
4
+ child = fork do
5
+ message = [1,2,3]
6
+ p Process.ppid
7
+ 5.times { Process.ppid.put message }
8
+ p Tra.next
9
+ end
10
+
11
+ =begin
12
+ require 'pry'
13
+ binding.pry
14
+ p Tra.next
15
+ =end
16
+ Tra.take(5).each { |message| p message }
17
+ child.put [:my, :message]
data/tra.gemspec ADDED
@@ -0,0 +1,7 @@
1
+ Gem::Specification.new do |g|
2
+ g.name = 'tra'
3
+ g.files = `git ls-files`.split($/)
4
+ g.version = '0.0.0'
5
+ g.summary = 'Erlang-style messaging for Ruby processes'
6
+ g.authors = ['Anatoly Chernow']
7
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tra
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Anatoly Chernow
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-10-29 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email:
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/tra.rb
20
+ - lib/tra/fork.rb
21
+ - lib/tra/mailbox.rb
22
+ - lib/tra/run.rb
23
+ - test.rb
24
+ - tra.gemspec
25
+ homepage:
26
+ licenses: []
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 2.5.1
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Erlang-style messaging for Ruby processes
48
+ test_files: []