deadly_serious 0.8.1 → 0.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 835ccef3d84a0bbe1cbcfd6ad4a78ccbea6709f8
4
- data.tar.gz: d330508f3b852e4ac98c99b9fc679386bdd75f1d
3
+ metadata.gz: b91d01c54129f8158a8f1a949e21b52d938edc11
4
+ data.tar.gz: a02ba9c6fbc11c1a1310b76877ba8af122591374
5
5
  SHA512:
6
- metadata.gz: aad544ea7468318303460244dae5db32074317027509b3f84d512f7011667f78a47868e86c39817779c249223d425076f525626d9a0402ba21723992e83487a0
7
- data.tar.gz: 717bf292b278dd7d41e5e3ffec05e931a7bc69f6de8a143e0ff4a17f414cd3c8238e1cdb5dc8e867b6db1d744cacc63b903eda1f8b910c35015e87f5009e5ef5
6
+ metadata.gz: fffa36bdf4a5e981f79de9e6c0e3c55d30ef40a6e71e5951d9b66098d5f18e7b87bc2907db40cd97c23601fc1aefc698d237329c3542a040aaad8df127d70fae
7
+ data.tar.gz: d28eb902110fea51d82f95a68f5682051e27e251540b6cc3d469058b7b578dca96bf268c55953a5be6572b37a9ffad83c1085546d60df587a10afe7fbd69544c
data/.gitignore CHANGED
@@ -3,9 +3,6 @@
3
3
  .idea/
4
4
  coverage
5
5
  doc/
6
- examples/connected_by_files/data/result
7
- examples/connected_by_files/data/temp1
8
- examples/connected_by_files/data/temp2
9
6
  *.gem
10
7
  Gemfile.lock
11
8
  InstalledFiles
@@ -18,9 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_development_dependency 'bundler', '~> 1.5', '>= 1.5.1'
22
- spec.add_development_dependency 'rake', '~> 10.0'
21
+ spec.add_development_dependency 'bundler', '~> 1.3'
22
+ spec.add_development_dependency 'rake'
23
23
 
24
- spec.add_dependency 'rb-inotify', '~> 0.9'
25
- spec.add_dependency 'json', '~> 1.8'
24
+ spec.add_dependency 'json'
26
25
  end
@@ -0,0 +1,39 @@
1
+ class DeadlySerious::Engine::AutoPipe
2
+ TEMPLATE = '%s.connection.%04d'
3
+
4
+ def initialize
5
+ @net_id = 0
6
+ @connection_stack = []
7
+ @counter = Hash.new { |h, k| h[k.to_sym] = 0}
8
+ end
9
+
10
+ def on_subnet
11
+ @net_id += 1
12
+ @connection_stack << sprintf('%04d', @net_id)
13
+ yield
14
+ ensure
15
+ @connection_stack.pop
16
+ end
17
+
18
+ def net_id
19
+ (@connection_stack.last || 'top').to_sym
20
+ end
21
+
22
+ def counter
23
+ @counter[net_id]
24
+ end
25
+
26
+ def next
27
+ advance_counter
28
+ last
29
+ end
30
+
31
+ def last
32
+ sprintf(TEMPLATE, net_id, counter)
33
+ end
34
+
35
+ private
36
+ def advance_counter
37
+ @counter[net_id] += 1
38
+ end
39
+ end
@@ -4,15 +4,11 @@ require 'deadly_serious/engine/lazy_io'
4
4
  module DeadlySerious
5
5
  module Engine
6
6
  # Fake class, it's actually a factory ¬¬
7
- # Creates a pipe, file or socket, depending on the name informed:
8
- # xyz # create a pipe
9
- # >xyz # create a file
10
- # xyz:8080 # create a socket
11
7
  module Channel
12
8
  def self.new(name)
13
9
  matcher = name.match(/^(>)?(.*?)(?:(:)(\d{1,5}))?$/)
14
10
  if matcher[1] == '>'
15
- FileChannel.new(matcher[2], @data_dir, @pipe_dir)
11
+ FileChannel.new(matcher[2], @data_dir)
16
12
  elsif matcher[3] == ':'
17
13
  SocketChannel.new(matcher[2], matcher[4].to_i)
18
14
  else
@@ -20,26 +16,20 @@ module DeadlySerious
20
16
  end
21
17
  end
22
18
 
23
- def self.config(data_dir, pipe_dir, lock_dir, preserve_pipe_dir, preserve_lock_dir)
19
+ def self.config(data_dir, pipe_dir, preserve_pipe_dir)
24
20
  @data_dir = data_dir
25
21
  @pipe_dir = pipe_dir
26
- @lock_dir = lock_dir
27
22
  @preserve_pipe_dir = preserve_pipe_dir
28
- @preserve_lock_dir = preserve_lock_dir
29
23
  end
30
24
 
31
25
  def self.setup
32
26
  FileUtils.mkdir_p(@pipe_dir) unless File.exist?(@pipe_dir)
33
- FileUtils.mkdir_p(@lock_dir) unless File.exist?(@lock_dir)
34
27
  end
35
28
 
36
29
  def self.teardown
37
30
  if !@preserve_pipe_dir && File.exist?(@pipe_dir)
38
31
  FileUtils.rm_r(@pipe_dir, force: true, secure: true)
39
32
  end
40
- if !@preserve_lock_dir && File.exist?(@lock_dir)
41
- FileUtils.rm_r(@lock_dir, force: true, secure: true)
42
- end
43
33
  end
44
34
 
45
35
  def self.create_pipe(pipe_name)
@@ -48,40 +38,19 @@ module DeadlySerious
48
38
  end
49
39
 
50
40
  class FileChannel
51
- def initialize(name, directory, temp_dir)
41
+ attr_reader :io_name
42
+
43
+ def initialize(name, directory)
52
44
  @io_name = File.join(directory, name)
53
- @readlock_file = "#{temp_dir}/#{name}.readlock"
54
45
  end
55
46
 
56
47
  def create
57
- unless File.exist?(@io_name)
58
- `touch #{@io_name} && touch #{@readlock_file}`
59
- end
48
+ `touch #{@io_name}` unless File.exist?(@io_name)
60
49
  @io_name
61
50
  end
62
51
 
63
- def on_close
64
- FileUtils.rm_f(@readlock_file)
65
- end
66
-
67
- # If the file has a "readlock", blocks the opening
68
- # until the readlock be removed.
69
52
  def open_reader
70
53
  fail %(File "#{@io_name}" not found) unless File.exist?(@io_name)
71
- return open(@io_name, 'r') unless File.exist?(@readlock_file)
72
-
73
- notifier = INotify::Notifier.new
74
- file = nil
75
- notifier.watch(@readlock_file, :delete) do
76
- file = open(@io_name, 'r')
77
- end
78
- notifier.process
79
- file
80
-
81
- rescue Errno::ENOENT
82
- # Should occur ONLY if we deleted the
83
- # readlock file after the guard clause
84
- # and before the Notifier initialization.
85
54
  open(@io_name, 'r')
86
55
  end
87
56
 
@@ -96,6 +65,8 @@ module DeadlySerious
96
65
  end
97
66
 
98
67
  class PipeChannel
68
+ attr_reader :io_name
69
+
99
70
  def initialize(name, directory)
100
71
  @io_name = File.join(directory, name)
101
72
  end
@@ -105,10 +76,6 @@ module DeadlySerious
105
76
  @io_name
106
77
  end
107
78
 
108
- def on_close
109
- # Do nothing
110
- end
111
-
112
79
  def open_reader
113
80
  fail %(Pipe "#{@io_name}" not found) unless File.exist?(@io_name)
114
81
  open(@io_name, 'r')
@@ -130,11 +97,11 @@ module DeadlySerious
130
97
  @retry_counter = 3
131
98
  end
132
99
 
133
- def create
134
- # Do nothing
100
+ def io_name
101
+ "#{@host}@#{@port}"
135
102
  end
136
103
 
137
- def on_close
104
+ def create
138
105
  # Do nothing
139
106
  end
140
107
 
@@ -2,18 +2,12 @@ module DeadlySerious
2
2
  module Engine
3
3
 
4
4
  # Restrict IO class that opens ONLY
5
- # when trying to read or write something.
6
- # This way, the channel is opened during
7
- # the shortest time possible.
5
+ # when trying to read something.
8
6
  #
9
- # We also can be used it to reopen channels
10
- # when they are closed.
7
+ # Also, used to reopend lost connections.
11
8
  #
12
- # By "restrict IO", I mean it implements
9
+ # By "restrict", I mean it implements
13
10
  # just a few IO operations.
14
- #
15
- # Note: Maybe it can be completely removed.
16
- # for the sake of simplicity
17
11
  class LazyIo
18
12
  def initialize(channel)
19
13
  @channel = channel
@@ -54,8 +48,7 @@ module DeadlySerious
54
48
  end
55
49
 
56
50
  def close
57
- @io.close
58
- @channel.on_close
51
+ @io.close unless closed?
59
52
  @io = nil
60
53
  end
61
54
 
@@ -1,17 +1,29 @@
1
1
  require 'deadly_serious/engine/channel'
2
2
  require 'deadly_serious/engine/open_io'
3
+ require 'deadly_serious/engine/auto_pipe'
3
4
  require 'deadly_serious/processes/splitter'
4
5
 
5
6
  module DeadlySerious
6
7
  module Engine
7
8
  class Spawner
8
9
  def initialize(data_dir: './data',
9
- pipe_dir: "/tmp/deadly_serious/#{Process.pid}/pipes",
10
- lock_dir: "/tmp/deadly_serious/#{Process.pid}/locks",
11
- preserve_pipe_dir: false,
12
- preserve_lock_dir: false)
10
+ pipe_dir: "/tmp/deadly_serious/#{Process.pid}",
11
+ preserve_pipe_dir: false)
13
12
  @ids = []
14
- Channel.config(data_dir, pipe_dir, lock_dir, preserve_pipe_dir, preserve_lock_dir)
13
+ @auto_pipe = AutoPipe.new
14
+ Channel.config(data_dir, pipe_dir, preserve_pipe_dir)
15
+ end
16
+
17
+ def on_subnet(&block)
18
+ @auto_pipe.on_subnet &block
19
+ end
20
+
21
+ def next_pipe
22
+ @auto_pipe.next
23
+ end
24
+
25
+ def last_pipe
26
+ @auto_pipe.last
15
27
  end
16
28
 
17
29
  def run
@@ -33,13 +45,14 @@ module DeadlySerious
33
45
  writers.each { |writer| create_pipe(writer) }
34
46
  fork_it do
35
47
  begin
36
- set_process_name(process_name)
48
+ set_process_name(process_name, readers, writers)
37
49
  append_open_io_if_needed(a_class)
38
50
  the_object = a_class.new
39
51
  the_object.run(*args, readers: readers, writers: writers)
40
- rescue => e
52
+ rescue Errno::EPIPE # Broken Pipe, no problem
53
+ # Ignore
54
+ ensure
41
55
  the_object.finalize if the_object.respond_to?(:finalize)
42
- raise e
43
56
  end
44
57
  end
45
58
  end
@@ -117,8 +130,8 @@ module DeadlySerious
117
130
  wait_children
118
131
  end
119
132
 
120
- def set_process_name(name)
121
- $0 = "ruby #{self.class.dasherize(name)}"
133
+ def set_process_name(name, readers, writers)
134
+ $0 = "ruby #{self.class.dasherize(name)} <(#{readers.join(' ')}) >(#{writers.join(' ')})"
122
135
  end
123
136
 
124
137
  # @!endgroup
@@ -6,7 +6,7 @@ module DeadlySerious
6
6
  end
7
7
  def run(readers: [], writers: [])
8
8
  @writers ||= writers
9
- reader = readers.first
9
+ reader = readers.first
10
10
  @outputs = @writers.dup
11
11
  begin
12
12
  reader.each do |line|
@@ -1,3 +1,3 @@
1
1
  module DeadlySerious
2
- VERSION = "0.8.1"
2
+ VERSION = "0.9.0"
3
3
  end
@@ -1,4 +1,3 @@
1
- require 'rb-inotify'
2
1
  require 'deadly_serious/version'
3
2
  require 'deadly_serious/engine/spawner'
4
3
  require 'deadly_serious/engine/base_process'
metadata CHANGED
@@ -1,77 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deadly_serious
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ronie Uliana
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-04 00:00:00.000000000 Z
11
+ date: 2014-02-18 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: '1.5'
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 1.5.1
19
+ version: '1.3'
23
20
  type: :development
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - "~>"
28
- - !ruby/object:Gem::Version
29
- version: '1.5'
30
- - - ">="
24
+ - - ~>
31
25
  - !ruby/object:Gem::Version
32
- version: 1.5.1
26
+ version: '1.3'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: rake
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
- - - "~>"
31
+ - - '>='
38
32
  - !ruby/object:Gem::Version
39
- version: '10.0'
33
+ version: '0'
40
34
  type: :development
41
35
  prerelease: false
42
36
  version_requirements: !ruby/object:Gem::Requirement
43
37
  requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: '10.0'
47
- - !ruby/object:Gem::Dependency
48
- name: rb-inotify
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: '0.9'
54
- type: :runtime
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - "~>"
38
+ - - '>='
59
39
  - !ruby/object:Gem::Version
60
- version: '0.9'
40
+ version: '0'
61
41
  - !ruby/object:Gem::Dependency
62
42
  name: json
63
43
  requirement: !ruby/object:Gem::Requirement
64
44
  requirements:
65
- - - "~>"
45
+ - - '>='
66
46
  - !ruby/object:Gem::Version
67
- version: '1.8'
47
+ version: '0'
68
48
  type: :runtime
69
49
  prerelease: false
70
50
  version_requirements: !ruby/object:Gem::Requirement
71
51
  requirements:
72
- - - "~>"
52
+ - - '>='
73
53
  - !ruby/object:Gem::Version
74
- version: '1.8'
54
+ version: '0'
75
55
  description: Flow Based Programming Engine mechanically sympathetic to *nix.
76
56
  email:
77
57
  - ronie.uliana@gmail.com
@@ -79,13 +59,14 @@ executables: []
79
59
  extensions: []
80
60
  extra_rdoc_files: []
81
61
  files:
82
- - ".gitignore"
62
+ - .gitignore
83
63
  - Gemfile
84
64
  - LICENSE.txt
85
65
  - README.md
86
66
  - Rakefile
87
67
  - deadly_serious.gemspec
88
68
  - lib/deadly_serious.rb
69
+ - lib/deadly_serious/engine/auto_pipe.rb
89
70
  - lib/deadly_serious/engine/base_process.rb
90
71
  - lib/deadly_serious/engine/channel.rb
91
72
  - lib/deadly_serious/engine/json_io.rb
@@ -112,17 +93,17 @@ require_paths:
112
93
  - lib
113
94
  required_ruby_version: !ruby/object:Gem::Requirement
114
95
  requirements:
115
- - - ">="
96
+ - - '>='
116
97
  - !ruby/object:Gem::Version
117
98
  version: '0'
118
99
  required_rubygems_version: !ruby/object:Gem::Requirement
119
100
  requirements:
120
- - - ">="
101
+ - - '>='
121
102
  - !ruby/object:Gem::Version
122
103
  version: '0'
123
104
  requirements: []
124
105
  rubyforge_project:
125
- rubygems_version: 2.2.0
106
+ rubygems_version: 2.1.11
126
107
  signing_key:
127
108
  specification_version: 4
128
109
  summary: Flow Based Programming engine that relies on named pipes and Linux processes