rb_banyan 0.1.2.pre

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.
data/README.md ADDED
@@ -0,0 +1,135 @@
1
+ ## A Simple Echo Server
2
+ ```
3
+ require 'rb_banyan/banyan_base.rb'
4
+
5
+ class SimpleEchoServer < BanyanBase
6
+
7
+ def initialize
8
+ # set the process name for the console banner
9
+ super(process_name: 'SimpleEchoServer')
10
+
11
+ # allow time for zmq connections to complete
12
+ sleep(0.3)
13
+
14
+ # set the subscriber topic
15
+ set_subscriber_topic('echo')
16
+
17
+ # wait for messages to arrive
18
+ begin
19
+ receive_loop
20
+ rescue SystemExit, Interrupt
21
+ clean_up
22
+ end
23
+ end
24
+
25
+ # process incoming messages - just resend the payload with
26
+ # a topic of 'reply'
27
+ def incoming_message_processing(_topic, payload)
28
+ publish_payload(payload, 'reply')
29
+ end
30
+ end
31
+
32
+
33
+ SimpleEchoServer.new
34
+
35
+ ```
36
+ ## A Simple Echo Client
37
+
38
+ ```
39
+ require 'rubygems'
40
+ require 'rb_banyan/banyan_base.rb'
41
+
42
+ # This is a simple echo client. It sends out a series of messages and expects an
43
+ # echo reply from the server
44
+
45
+ # To use: 1. Start the backplane.
46
+ # 2. Start the server.
47
+ # 3. Start this client.
48
+
49
+ class SimpleEchoClient < BanyanBase
50
+
51
+ def initialize
52
+
53
+ # set the process name for the console banner
54
+ super(process_name:'SimpleEchoClient')
55
+
56
+ # allow time for zmq connections to complete
57
+ sleep(0.3)
58
+
59
+ # initialize the number of messages to send and receive
60
+ @number_of_messages = @message_number = 10
61
+
62
+ # set the subscriber topic
63
+ set_subscriber_topic('reply')
64
+
65
+ # send the first message
66
+ publish_payload({'message_number': @message_number}, 'echo')
67
+
68
+ # adjust the message number for the next send
69
+ @message_number -= 1
70
+
71
+ # get the reply messages
72
+ # wait for messages to arrive
73
+ begin
74
+ receive_loop
75
+ rescue SystemExit, Interrupt
76
+ clean_up
77
+ end
78
+ end
79
+
80
+ # With each incoming message, adjust the message number and
81
+ # publish the next message until the count is achieved.
82
+ def incoming_message_processing(_topic, payload)
83
+ # if all messages received, we are done.
84
+ if payload['message_number'] == 0
85
+ puts('All messages sent and received')
86
+ clean_up
87
+ exit(0)
88
+
89
+ # we have more to send - bump the message number and send the message out
90
+ else
91
+ @message_number -= 1
92
+ publish_payload({'message_number': @message_number}, 'echo')
93
+ end
94
+ end
95
+ end
96
+
97
+ SimpleEchoClient.new
98
+
99
+ ```
100
+
101
+ # RbBanyan
102
+
103
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/rb_banyan`. To experiment with that code, run `bin/console` for an interactive prompt.
104
+
105
+ TODO: Delete this and the text above, and describe your gem
106
+
107
+ ## Installation
108
+
109
+ Add this line to your application's Gemfile:
110
+
111
+ ```ruby
112
+ gem 'rb_banyan'
113
+ ```
114
+
115
+ And then execute:
116
+
117
+ $ bundle
118
+
119
+ Or install it yourself as:
120
+
121
+ $ gem install rb_banyan
122
+
123
+ ## Usage
124
+
125
+ TODO: Write usage instructions here
126
+
127
+ ## Development
128
+
129
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
130
+
131
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
132
+
133
+ ## Contributing
134
+
135
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/rb_banyan.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "rb_banyan"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,85 @@
1
+ ########################################################################################
2
+ # Copyright (c) 2017 Alan Yorinks - All Rights Reserved.
3
+ #
4
+ # This file is part of JavaScript-Banyan.
5
+ #
6
+ # Ruby Banyan is free software; you can redistribute it and/or
7
+ # modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
8
+ # Version 3 as published by the Free Software Foundation; either
9
+ # or (at your option) any later version.
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # General Public License for more details.
14
+
15
+ # You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
16
+ # along with this library; if not, write to the Free Software
17
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
+ #
19
+ # simple_echo_server.rb
20
+ ########################################################################################
21
+
22
+ require_relative '../../lib/rb_banyan/banyan_base.rb'
23
+
24
+ # This is a simple echo client. It sends out a series of messages and expects an
25
+ # echo reply from the server
26
+
27
+ # To use: 1. Start the backplane.
28
+ # 2. Start the server.
29
+ # 3. Start this client.
30
+
31
+ class SimpleEchoClient < BanyanBase
32
+
33
+ def initialize(process_name: 'SimpleEchoClient',
34
+ subscribe_topic: 'echo',
35
+ publish_topic: 'reply',
36
+ publish_payload: {'message_number': @message_number})
37
+
38
+ super(process_name:process_name)
39
+
40
+ # allow time for zmq connections to complete
41
+ sleep(0.3)
42
+
43
+ # initialize the number of messages to send and receive
44
+ @number_of_messages = @message_number = 10
45
+
46
+
47
+
48
+ # set the subscriber topic
49
+ set_subscriber_topic('reply')
50
+
51
+ # send the first message - make sure that the server is already started
52
+ publish_payload({'message_number': @message_number}, 'echo')
53
+ # adjust the message number for the next send
54
+ @message_number -= 1
55
+
56
+ # get the reply messages
57
+ begin
58
+ receive_loop
59
+ rescue SystemExit, Interrupt
60
+ clean_up
61
+ exit(0)
62
+ end
63
+ end
64
+
65
+ def incoming_message_processing(_topic, payload)
66
+ if payload['message_number'] == 0
67
+ # all messages sent - wait for user to press Enter to exit the client.
68
+ begin
69
+ puts((@number_of_messages).to_s + ' messages sent and received. ')
70
+ puts('Press enter to exit.')
71
+ gets
72
+ clean_up
73
+ exit(0)
74
+ end
75
+
76
+ # bump the message number and send the message out
77
+ else
78
+ @message_number -= 1
79
+ publish_payload({'message_number': @message_number}, 'echo')
80
+ end
81
+
82
+ end
83
+ end
84
+
85
+ SimpleEchoClient.new
@@ -0,0 +1,97 @@
1
+ ########################################################################################
2
+ # Copyright (c) 2017 Alan Yorinks - All Rights Reserved.
3
+ #
4
+ # This file is part of JavaScript-Banyan.
5
+ #
6
+ # Ruby Banyan is free software; you can redistribute it and/or
7
+ # modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
8
+ # Version 3 as published by the Free Software Foundation; either
9
+ # or (at your option) any later version.
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # General Public License for more details.
14
+
15
+ # You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
16
+ # along with this library; if not, write to the Free Software
17
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
+ #
19
+ # simple_echo_server.rb
20
+ #############################################################################
21
+
22
+ require_relative '../../lib/rb_banyan/banyan_base.rb'
23
+ ###################################################################
24
+ # This is a very basic echo server.
25
+ # It subscribes to receive messages with a topic of 'echo', and
26
+ # when a message is received, it publishes the received payload,
27
+ # with a topic of 'reply'
28
+ ###################################################################
29
+ class SimpleEchoServer < BanyanBase
30
+
31
+ def initialize(process_name: 'SimpleEchoServer',
32
+ subscribe_topic: 'echo',
33
+ publish_topic: 'reply')
34
+
35
+ super(process_name:process_name)
36
+ sleep(0.3)
37
+
38
+ @subscribe_topic = subscribe_topic
39
+ @publish_topic = publish_topic
40
+
41
+ # allow time for zmq connections to complete
42
+
43
+ # set the subscriber topic
44
+ set_subscriber_topic(@subscribe_topic)
45
+
46
+ # wait for messages to arrive
47
+ begin
48
+ receive_loop
49
+ rescue SystemExit, Interrupt
50
+ clean_up
51
+ end
52
+
53
+ end
54
+
55
+ # process incoming messages - just resend the payload with
56
+ # a topic of 'reply'
57
+ def incoming_message_processing(_topic, payload)
58
+ publish_payload(payload, @publish_topic)
59
+ end
60
+
61
+ end
62
+
63
+
64
+ options = { process_name: 'MultiEchoClient',
65
+ subscribe_topic: 'echo',
66
+ publish_topic: 'reply'}
67
+
68
+ optparse = OptionParser.new do |opts|
69
+ opts.on('-n', '--n Process Name',
70
+ 'Name Of This Banyan Component') do |process_name|
71
+ options[:process_name] = process_name
72
+ end
73
+
74
+ opts.on('-p', '--p Publish Topic',
75
+ 'Topic String') do |loop_time|
76
+ options[:publish_topic] = loop_time
77
+ end
78
+
79
+ opts.on('-s', '--s Subscribe Topic',
80
+ 'Topic String') do |loop_time|
81
+ options[:subscribe_topic] = loop_time
82
+ end
83
+
84
+ opts.on('-h', '--help', 'Display this screen') do
85
+ puts opts
86
+ exit
87
+ end
88
+ end
89
+
90
+ begin
91
+ optparse.parse!
92
+ end
93
+
94
+ options[:loop_time] = options[:loop_time].to_f
95
+ SimpleEchoServer.new(process_name: options[:process_name],
96
+ publish_topic: options[:publish_topic],
97
+ subscribe_topic: options[:subscribe_topic])
@@ -0,0 +1,5 @@
1
+ {
2
+ "result": {
3
+ "covered_percent": 100.0
4
+ }
5
+ }
File without changes
data/exe/rb_backplane ADDED
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ ###########################################################################
5
+ # Copyright (c) 2017 Alan Yorinks - All Rights Reserved.
6
+ #
7
+ # This file is part of Ruby-Banyan.
8
+ #
9
+ # Ruby Banyan is free software; you can redistribute it and/or
10
+ # modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
+ # Version 3 as published by the Free Software Foundation; either
12
+ # or (at your option) any later version.
13
+ # This library is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
+ # General Public License for more details.
17
+
18
+ # You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
19
+ # along with this library; if not, write to the Free Software
20
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ #
22
+ # banyan_base.rb
23
+ #############################################################################
24
+
25
+ require 'rubygems'
26
+ require 'ffi-rzmq'
27
+ require 'socket'
28
+ require 'msgpack'
29
+ require 'optparse'
30
+
31
+ ###################################################################
32
+ # This the banyan backplane for ruby. It must be started before
33
+ # any other banyan components are invoked.
34
+
35
+ ###################################################################
36
+
37
+ # noinspection RubyResolve,RubyResolve
38
+
39
+ class BackPlane
40
+
41
+ def initialize(subscriber_port: '43125', publisher_port: '43124',
42
+ process_name: 'Backplane', loop_time: 0.001)
43
+
44
+ # This is the initializer for the Banyan BackPlane class. The class must be instantiated
45
+ # before starting any other Python Banyan modules
46
+
47
+ # :param subscriber_port: subscriber IP port number
48
+ # :param publisher_port: publisher IP port number
49
+ # :param backplane_name: name to appear on the console for this backplane
50
+ # :param loop_time: event loop idle timer
51
+
52
+ @subscriber_port = subscriber_port
53
+ @publisher_port = publisher_port
54
+ @process_name = process_name
55
+ @loop_time = loop_time
56
+
57
+ @back_plane_ip_address = Socket.ip_address_list[1].ip_address
58
+
59
+ puts('************************************************************')
60
+ # noinspection RubyResolve
61
+ puts(process_name + ' BackPlane on IP address: ' +
62
+ @back_plane_ip_address)
63
+ puts('Subscriber Port = ' + @subscriber_port)
64
+ puts('Publisher Port = ' + @publisher_port)
65
+ puts('Loop Time = ' + @loop_time.to_s + ' seconds')
66
+ puts('************************************************************')
67
+
68
+ # establish the zeromq sub and pub sockets and connect to the backplane
69
+ @context = ZMQ::Context.create
70
+
71
+ @subscriber = @context.socket ZMQ::SUB
72
+ @publisher = @context.socket ZMQ::PUB
73
+
74
+ # subscribe to all messages
75
+ @subscriber.setsockopt ZMQ::SUBSCRIBE, ''
76
+
77
+ # noinspection RubyResolve
78
+ # this looks backwards, but is correct. the backplane
79
+ # accepts messages and re-sends them.
80
+ @subscriber.bind 'tcp://' + @back_plane_ip_address + ':' + @publisher_port
81
+ @publisher.bind 'tcp://' + @back_plane_ip_address + ':' + @subscriber_port
82
+ trap("INT") {puts "Control C detected - bye bye."; @publisher.close; @subscriber.close; @context.terminate; exit}
83
+
84
+ loop do
85
+ list = []
86
+ p = @subscriber.recv_strings(list, ZMQ::DONTWAIT)
87
+ begin
88
+ if p == -1
89
+ sleep(@loop_time)
90
+ if ZMQ::Util.errno == ZMQ::EAGAIN
91
+ next
92
+ else
93
+ puts ZMQ::Util.errno
94
+ end
95
+ else
96
+ @publisher.send_strings(list, flags = ZMQ::DONTWAIT)
97
+ end
98
+ rescue Interrupt
99
+ clean_up
100
+ end
101
+ end
102
+ end
103
+
104
+ def clean_up
105
+ # cleanup before exiting
106
+
107
+ @publisher.close
108
+ @subscriber.close
109
+ @context.terminate
110
+ exit
111
+ end
112
+ end
113
+
114
+ options = {publisher_port: '43124',
115
+ subscriber_port: '43125', process_name: 'Unknown',
116
+ loop_time: '0.01'}
117
+
118
+ optparse = OptionParser.new do |opts|
119
+
120
+ opts.on('-p', '--p PUBLISHER PORT', 'Publisher Port Number') do |publisher_port|
121
+ options[:publisher_port] = publisher_port
122
+ end
123
+
124
+ opts.on('-s', '--s SUBSCRIBER PORT', 'Subscriber Port Number') do |subscriber_port|
125
+ options[:subscriber_port] = subscriber_port
126
+ end
127
+
128
+ opts.on('-n', '--n Process Name', 'Name Of This Banyan Component') do |process_name|
129
+ options[:process_name] = process_name
130
+ end
131
+
132
+ opts.on('-t', '--t Loop Delay Time', 'Time In Seconds') do |loop_time|
133
+ options[:loop_time] = loop_time
134
+ end
135
+ opts.on('-h', '--help', 'Display this screen') do
136
+ puts opts
137
+ exit
138
+ end
139
+ end
140
+
141
+ begin
142
+ optparse.parse!
143
+ end
144
+
145
+ options[:loop_time] = options[:loop_time].to_f
146
+ BackPlane.new(subscriber_port: options[:subscriber_port],
147
+ publisher_port: options[:publisher_port],
148
+ process_name: options[:process_name],
149
+ loop_time: options[:loop_time])
150
+
data/exe/rb_monitor ADDED
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/rb_banyan/banyan_base.rb'
4
+
5
+
6
+ class RBMonitor < BanyanBase
7
+ def initialize(back_plane_ip_address: nil, subscriber_port: '43125', publisher_port: '43124',
8
+ process_name: 'Monitor', loop_time: 0.1)
9
+
10
+ back_plane_ip_address = Socket.ip_address_list[1].ip_address if back_plane_ip_address.nil?
11
+
12
+ super(back_plane_ip_address: back_plane_ip_address, subscriber_port: subscriber_port, publisher_port: publisher_port,
13
+ process_name: process_name, loop_time: loop_time)
14
+
15
+ # allow time for zmq connections to complete
16
+ sleep(0.3)
17
+
18
+ set_subscriber_topic('')
19
+
20
+ # wait for messages to arrive
21
+ begin
22
+ receive_loop
23
+ rescue SystemExit, Interrupt
24
+ clean_up
25
+ end
26
+ end
27
+
28
+ def incoming_message_processing(topic, payload)
29
+ puts(topic, payload)
30
+ STDOUT.flush
31
+ end
32
+ end
33
+
34
+ options = {back_plane_ip_address: nil, publisher_port: '43124',
35
+ subscriber_port: '43125', process_name: 'Banyan Monitor',
36
+ loop_time: '0.001'}
37
+
38
+ optparse = OptionParser.new do |opts|
39
+ opts.on('-b', '--b Backplane Ip Address', 'IP address of Backplane in use') do |back_plane_ip_address|
40
+ options[:back_plane_ip_address] = back_plane_ip_address
41
+ end
42
+
43
+ opts.on('-p', '--p PUBLISHER PORT', 'Publisher Port Number') do |publisher_port|
44
+ options[:publisher_port] = publisher_port
45
+ end
46
+
47
+ opts.on('-s', '--s SUBSCRIBER PORT', 'Subscriber Port Number') do |subscriber_port|
48
+ options[:subscriber_port] = subscriber_port
49
+ end
50
+
51
+ opts.on('-n', '--n Process Name', 'Name Of This Banyan Component') do |process_name|
52
+ options[:process_name] = process_name
53
+ end
54
+
55
+ opts.on('-t', '--t Loop Delay Time', 'Time In Seconds') do |loop_time|
56
+ options[:loop_time] = loop_time
57
+ end
58
+ opts.on('-h', '--help', 'Display this screen') do
59
+ puts opts
60
+ exit
61
+ end
62
+ end
63
+
64
+ begin
65
+ optparse.parse!
66
+ end
67
+
68
+ options[:loop_time] = options[:loop_time].to_f
69
+ b = RBMonitor.new(back_plane_ip_address: options[:back_plane_ip_address],
70
+ subscriber_port: options[:subscriber_port],
71
+ publisher_port: options[:publisher_port],
72
+ process_name: options[:process_name],
73
+ loop_time: options[:loop_time])
74
+
75
+