noam_lemma 0.2.1.2 → 0.2.1.3

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,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3bbf10fe6a3bf7744dc6a6f82fc654591f905c79
4
- data.tar.gz: ac505598a7cb384d97e0baa10b8fb99a24cf14aa
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ N2QwNDk0YTRlNTFkYTBkMWUwYTgwZThkZGFmNjFjYTE1ZWQ0YjAwYw==
5
+ data.tar.gz: !binary |-
6
+ ODZiODFiMDkyMDFhZjQxOWRmOGY5ODVmMjM3OGU4ZTE1YmY0NWExZA==
5
7
  SHA512:
6
- metadata.gz: 6f364b904d08a0d7cf26ea98aa90f2c56ca409d14a3dda1d9a995722f43ff23b11b3b756dea0842ad6825bc6c0b8f3324f18301aab642a6fb6bd4f0528f80954
7
- data.tar.gz: 6ba94ba53aacc4194915bc7d113060e3ba1e8c532eeb02ab007244eb67ff2ede969eefab39cd42c287cc41ae4e749f82e8d59f009852aa069bcd2e4ffc8484c2
8
+ metadata.gz: !binary |-
9
+ OWNmNTYyOWNiMjM0ZmFkYWY2M2QzMmQ5NTk2MWQ1ZDUwZDk3YzI2MjU2ZjEy
10
+ N2E3MzFmZWU4NzVhOTVkOWZjYjkyYjE2MTllOTkxNTgwMTkxNDJmYmY0ZGY2
11
+ YTNkZjI4OTdiYTI0MWFkZDk3NTkwNWE0MTMxMjZhMWM4NWM2NTc=
12
+ data.tar.gz: !binary |-
13
+ ODE2ZDJkMTRmZmVhNDVhNTI3ZDY1MTY5Y2U5MzBiZjZiNWI2OGU4OTc3ZGZh
14
+ NTFkYmRkYmNjOGNmZThjNzdmODM5MThiYmMwZjU5ODAxMWRlNjJiN2JmMzBi
15
+ YWZmYzI3ODJiMDVhNDk0OTZiYjU5NWQ1YzRiNTA4MDYyZDJmZjI=
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 John Van Enk
1
+ Copyright (c) 2014 IDEO
2
2
 
3
3
  MIT License
4
4
 
@@ -2,17 +2,15 @@ require 'noam_lemma'
2
2
 
3
3
  # This is an example of a Ruby Lemma that publishes message and *also* uses the
4
4
  # "Guest" model of connection. This Lemma will advertise that it's available on
5
- # the local network and only begin speaking messages once a server requests a
6
- # connection from the Lemma.
5
+ # the local network, without a specified room, and will only begin speaking
6
+ # messages once a server requests a connection from the Lemma.
7
7
 
8
8
  publisher = Noam::Lemma.new('example-guest-publisher', [], ["e3"])
9
9
 
10
- # Using the `advertise` method asks the Lemma to announce it's presence and
10
+ # Using the `discover` method asks the Lemma to announce it's presence and
11
11
  # wait for a message from a server that may want to connect to it.
12
- #
13
- # The "local-test" parameter is the room name. Servers with a room name that's
14
- # the same as the Lemma's advertised room name will connect automatically.
15
- publisher.advertise("")
12
+
13
+ publisher.discover
16
14
 
17
15
  seq = 0
18
16
  e = "e3"
@@ -20,12 +18,15 @@ loop do
20
18
  # Construct a value to send with the event.
21
19
  v = {"seq" => seq, "time" => Time.now.to_s}
22
20
 
23
- # If `speak` returns false, we're unable to speak the message likely because
21
+ # If `speak` raises a Noam::Disconnected error, we're unable to speak the message likely because
24
22
  # the socket has closed. The connection would have to be restarted.
25
- unless publisher.speak(e, v)
26
- puts "Done"
23
+ begin
24
+ publisher.speak(e, v)
25
+ rescue Noam::Disconnected
26
+ puts "Disconnectd"
27
27
  break
28
28
  end
29
+
29
30
  puts "Wrote: #{e} -> #{v.inspect}"
30
31
 
31
32
  seq += 1
@@ -2,30 +2,32 @@ require 'noam_lemma'
2
2
 
3
3
  # This is an example of a Ruby Lemma that publishes message and *also* uses the
4
4
  # "Guest" model of connection. This Lemma will advertise that it's available on
5
- # the local network and only begin subscribing to messages once a server
6
- # requests a connection from the Lemma.
5
+ # the local network, without a specified room, and will only begin subscribing
6
+ # to messages once a server requests a connection from the Lemma.
7
7
 
8
8
  subscriber = Noam::Lemma.new('example-guest-subscriber', ["e3"], [])
9
9
 
10
- # Using the `advertise` method asks the Lemma to announce it's presence and
10
+ # The `hear` method sets a a block of code to be called when an event is heard
11
+ # from a specific event.
12
+ subscriber.hear('e3') do |message|
13
+ puts "Heard message"
14
+ puts "Event: #{message.event}"
15
+ puts "Value: #{message.value.inspect}"
16
+ end
17
+
18
+ # Using the `discover` method asks the Lemma to announce it's presence and
11
19
  # wait for a message from a server that may want to connect to it.
12
- #
13
- # The "local-test" parameter is the room name. Servers with a room name that's
14
- # the same as the Lemma's advertised room name will connect automatically.
15
- subscriber.advertise("")
20
+
21
+ subscriber.discover
16
22
 
17
23
  loop do
18
- # The `listen` method will return an Event object once one is received by the
24
+ # The `listen` method will return an Message::Heard object once one is received by the
19
25
  # Lemma. Until an event is heard, the `listen` method blocks.
20
- m = subscriber.listen
21
-
22
- # There's one special value that's returned from `listen`: the `:cancelled`
23
- # symbol. If this shows up, it means some one else has called the `stop`
24
- # method on the Lemma.
25
- if :cancelled == m
26
- puts "Done"
27
- break
28
- else
26
+ begin
27
+ m = subscriber.listen
29
28
  puts "Read: #{m.event} -> #{m.value.inspect}"
29
+ rescue Noam::Disconnected
30
+ puts "Disconnected"
31
+ break
30
32
  end
31
33
  end
@@ -88,3 +88,5 @@ class Noam::LemmaVerification
88
88
  end
89
89
  end
90
90
  end
91
+
92
+ Noam::LemmaVerification.run
@@ -6,17 +6,15 @@ require 'noam_lemma'
6
6
  # command should work:
7
7
  #
8
8
  # ruby -Ilib example/publisher.rb
9
- #
10
- # This example _will not_ work on the same machine running the Noam server as
11
- # both programs need to bind to UDP port 1030.
12
9
 
13
10
  publisher = Noam::Lemma.new('example-publisher', [], ["e1", "e2"])
14
11
 
15
- # Using the `discover` method asks the Lemma to proactively try and discover a
16
- # server to connect to on the local network. Once the server is discovered, it
17
- # will connect and send a Noam 'register' message. When `discover` returns, the
18
- # Lemma is ready to send events.
19
- publisher.discover
12
+ # Using the `advertise` method asks the Lemma to announce it's presence and
13
+ # wait for a message from a server that may want to connect to it.
14
+ #
15
+ # The "local-test" parameter is the room name. Servers with a room name that's
16
+ # the same as the Lemma's advertised room name will connect automatically.
17
+ publisher.advertise("local-test")
20
18
 
21
19
  seq = 0
22
20
  loop do
@@ -33,12 +31,17 @@ loop do
33
31
 
34
32
  # Attempt to speak the chosen event with the value. Note, the event is either
35
33
  # "e1" or "e2" based on how rand() returned.
36
- unless publisher.speak(e, v)
37
- # If `speak` returns false, we're unable to speak the message likely because
38
- # the socket has closed. The connection would have to be restarted.
39
- puts "Done"
34
+ begin
35
+ publisher.speak(e, v)
36
+
37
+ # If `speak` returns a Noam::Disconnected error, we're unable to speak the
38
+ # message likely because the socket has closed. The connection
39
+ # would have to be restarted.
40
+ rescue Noam::Disconnected
41
+ puts "Disconnected"
40
42
  break
41
43
  end
44
+
42
45
  puts "Wrote: #{e} -> #{v.inspect}"
43
46
 
44
47
  seq += 1
@@ -12,24 +12,29 @@ require 'noam_lemma'
12
12
 
13
13
  subscriber = Noam::Lemma.new('example-subscriber', ["e1", "e2"], [])
14
14
 
15
- # Using the `discover` method asks the Lemma to proactively try and discover a
15
+ # The `hear` method sets a a block of code to be called when an event is heard
16
+ # from a specific event.
17
+ subscriber.hear('e1') do |message|
18
+ puts "Heard message"
19
+ puts "Event: #{message.event}"
20
+ puts "Value: #{message.value.inspect}"
21
+ end
22
+
23
+ # Using the `advertise` method asks the Lemma to proactively try and discover a
16
24
  # server to connect to on the local network. Once the server is discovered, it
17
25
  # will connect and send a Noam 'register' message. When `discover` returns, the
18
26
  # Lemma is ready to receive events.
19
- subscriber.discover
27
+ subscriber.advertise("local-test")
20
28
 
21
29
  loop do
22
- # The `listen` method will return an Event object once one is received by the
23
- # Lemma. Until an event is heard, the `listen` method blocks.
24
- m = subscriber.listen
25
-
26
- # There's one special value that's returned from `listen`: the `:cancelled`
27
- # symbol. If this shows up, it means some one else has called the `stop`
28
- # method on the Lemma.
29
- if :cancelled == m
30
- puts "Done"
31
- break
32
- else
30
+ # The `listen` method will return a Message::Heard object once one is received by the
31
+ # Lemma, after calling any blocks associated with the event through the `hear`
32
+ # method. Until an event is heard, the `listen` method blocks.
33
+ begin
34
+ m = subscriber.listen
33
35
  puts "Read: #{m.event} -> #{m.value.inspect}"
36
+ rescue Noam::Disconnected
37
+ puts "Disconnected"
38
+ break
34
39
  end
35
40
  end
@@ -7,9 +7,9 @@ module Noam
7
7
  DEVICE_TYPE = 'ruby-script'
8
8
 
9
9
  class NoamThreadCancelled < Exception; end
10
+ class Disconnected < StandardError; end
10
11
  end
11
12
 
12
- require 'noam_lemma/beacon'
13
13
  require 'noam_lemma/lemma'
14
14
  require 'noam_lemma/listener'
15
15
  require 'noam_lemma/message'
@@ -13,32 +13,35 @@ module Noam
13
13
  initialize_message_filter(hears)
14
14
  end
15
15
 
16
- def discover(beacon = nil)
17
- beacon ||= Beacon.discover
18
- start(beacon.host, beacon.port)
19
- end
20
-
21
16
  def advertise(room_name)
22
17
  marco = Noam::Message::Marco.new(room_name, @name)
23
18
  polo = marco.start
24
19
  start(polo.host, polo.port)
25
20
  end
26
21
 
22
+ def discover
23
+ advertise('')
24
+ end
25
+
27
26
  def hear(event_name, &block)
28
27
  @message_filter.hear(event_name, &block)
29
28
  end
30
29
 
31
30
  def speak(event, value)
32
- if @player
31
+ if @player.connected?
33
32
  @player.put(Noam::Message::Playable.new(@name, event, value))
34
33
  true
35
34
  else
36
- false
35
+ raise Noam::Disconnected.new("Player disconnected")
37
36
  end
38
37
  end
39
38
 
40
39
  def listen
41
- @message_filter.receive(@listener.take)
40
+ if @listener.connected?
41
+ @message_filter.receive(@listener.take)
42
+ else
43
+ raise Noam::Disconnected.new("Listener disconnected")
44
+ end
42
45
  end
43
46
 
44
47
  def stop
@@ -1,4 +1,4 @@
1
- require 'thread'
1
+ require 'thread'
2
2
 
3
3
  module Noam
4
4
  class Listener
@@ -21,6 +21,10 @@ module Noam
21
21
  @thread.join
22
22
  end
23
23
 
24
+ def connected?
25
+ !@disconnected
26
+ end
27
+
24
28
  private
25
29
 
26
30
  def manage_queue_on_thread
@@ -40,16 +44,13 @@ module Noam
40
44
  client.close
41
45
  end
42
46
 
43
- if exiting?
44
- @queue.push(:cancelled)
45
- break
46
- end
47
+ break if exiting?
47
48
  end
48
49
  end
49
50
 
50
51
  def listen_for_connection
51
52
  timeout_sec = 0.1
52
- available_ios = select([@server], nil, nil, timeout_sec)
53
+ available_ios = IO.select([@server], nil, nil, timeout_sec)
53
54
  @server.accept if available_ios
54
55
  end
55
56
 
@@ -63,6 +64,8 @@ module Noam
63
64
  end
64
65
  rescue IO::WaitReadable
65
66
  retry unless exiting?
67
+ rescue EOFError
68
+ @disconnected = true
66
69
  end
67
70
  end
68
71
 
@@ -13,23 +13,17 @@ module Noam
13
13
 
14
14
  def start
15
15
  bcast_socket = UDPSocket.new
16
- reply_socket = UDPSocket.new
17
- reply_socket.bind("0.0.0.0", 0)
18
16
 
19
- begin
20
- bcast_socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
17
+ bcast_socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
21
18
 
22
- loop do
23
- bcast_socket.send(noam_encode, 0, "255.255.255.255", Noam::BEACON_PORT)
24
- if message_received?(bcast_socket)
25
- break
26
- end
19
+ loop do
20
+ bcast_socket.send(noam_encode, 0, "255.255.255.255", Noam::BEACON_PORT)
21
+ if message_received?(bcast_socket)
22
+ break
27
23
  end
28
-
29
- get_polo_response(bcast_socket)
30
- ensure
31
- reply_socket.close
32
24
  end
25
+
26
+ get_polo_response(bcast_socket)
33
27
  end
34
28
 
35
29
  def noam_encode
@@ -1,4 +1,4 @@
1
- require 'thread'
1
+ require 'thread'
2
2
 
3
3
  module Noam
4
4
  class NoamPlayerException < Exception; end
@@ -20,13 +20,16 @@ module Noam
20
20
  end
21
21
 
22
22
  def stop
23
- put(:soft_exit)
23
+ put(:exit)
24
24
  @thread.join
25
25
  end
26
26
 
27
27
  def stop!
28
- put(:hard_exit)
29
- @thread.join
28
+ @thread.exit
29
+ end
30
+
31
+ def connected?
32
+ !@disconnected
30
33
  end
31
34
 
32
35
  private
@@ -37,42 +40,23 @@ module Noam
37
40
  loop do
38
41
  message = @queue.pop
39
42
  break if exit?(message)
40
- process(message)
43
+ print_message(message)
41
44
  end
45
+ rescue Errno::EPIPE
46
+ @disconnected = true
42
47
  ensure
43
48
  @socket.close
44
49
  end
45
50
  end
46
51
  end
47
52
 
48
- def process(message)
49
- case message
50
- when :soft_exit
51
- finish_queue
52
- when :hard_exit
53
- else
54
- @socket.print(message.noam_encode)
55
- @socket.flush
56
- end
53
+ def print_message(message)
54
+ @socket.print(message.noam_encode)
55
+ @socket.flush
57
56
  end
58
57
 
59
58
  def exit?(message)
60
- message == :hard_exit || message == :soft_exit
61
- end
62
-
63
- def finish_queue
64
- queue_to_array.each do |message|
65
- @socket.print(message.noam_encode)
66
- @socket.flush
67
- end
68
- end
69
-
70
- def queue_to_array
71
- result = []
72
- while(@queue.size > 0) do
73
- result << @queue.pop
74
- end
75
- result
59
+ message == :exit
76
60
  end
77
61
  end
78
62
  end
@@ -1,3 +1,3 @@
1
1
  module NoamLemma
2
- VERSION = "0.2.1.2"
2
+ VERSION = "0.2.1.3"
3
3
  end
@@ -21,6 +21,6 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency "require_all"
22
22
  spec.add_development_dependency "bundler", "~> 1.3"
23
23
  spec.add_development_dependency "rake", "~> 10.3"
24
- spec.add_development_dependency "rspec", "~> 2.14"
24
+ spec.add_development_dependency "rspec", "~> 3.1.0"
25
25
  spec.add_development_dependency "mocha", "~> 1.1"
26
26
  end
@@ -49,10 +49,14 @@ describe Noam::Lemma do
49
49
 
50
50
  context "with server communication" do
51
51
  let(:server) { FakeManager.server }
52
+ let(:lemma) { Noam::Lemma.new("Example Lemma") }
52
53
 
53
54
  before(:each) do
55
+ Noam::Message::Marco.any_instance.stubs(:start).returns(
56
+ Noam::Message::Polo.new('0.0.0.0', NoamTest::FakeServer::PORT)
57
+ )
54
58
  FakeManager.start
55
- lemma.discover
59
+ lemma.advertise('fake_beacon')
56
60
  sleep(SERVER_DELAY)
57
61
  end
58
62
 
@@ -61,9 +65,7 @@ describe Noam::Lemma do
61
65
  FakeManager.stop
62
66
  end
63
67
 
64
- describe "#discover" do
65
- let(:lemma) { Noam::Lemma.new("Example Lemma") }
66
-
68
+ describe "#advertise" do
67
69
  it "sends a registration message" do
68
70
  server.clients.length.should == 1
69
71
  server.clients.first.port.should be_an(Integer)
@@ -77,11 +79,9 @@ describe Noam::Lemma do
77
79
  end
78
80
 
79
81
  describe "#hear" do
80
- let(:lemma) { Noam::Lemma.new("Example Lemma") }
81
-
82
82
  it "registers messages with blocks" do
83
83
  message = nil
84
- lemma.hear("example_event") {|event| message = event}
84
+ lemma.hear("example_event") { |event| message = event }
85
85
  send_message_from_server("example_event")
86
86
  lemma.listen
87
87
  message.event.should == "example_event"
@@ -89,12 +89,15 @@ describe Noam::Lemma do
89
89
  end
90
90
 
91
91
  describe "#speak" do
92
- let(:lemma) { Noam::Lemma.new("Example Lemma") }
93
-
94
92
  it "sends a message to the server" do
95
93
  lemma.speak("an event", "some value")
96
94
  sleep(SERVER_DELAY)
97
- server.messages.map {|m| m[2]}.include?("an event").should be_true
95
+ server.messages.map { |m| m[2] }.include?("an event").should be_truthy
96
+ end
97
+
98
+ it "raise a disconnected error if the player is not connected" do
99
+ lemma.player.stubs(:connected?).returns(false)
100
+ expect { lemma.speak('event', 'value') }.to raise_error(Noam::Disconnected)
98
101
  end
99
102
  end
100
103
 
@@ -108,6 +111,11 @@ describe Noam::Lemma do
108
111
  message.event.should == "example_event"
109
112
  message.value.should == "noam event"
110
113
  end
114
+
115
+ it "raises a disconnected error if the listener is not connected" do
116
+ lemma.listener.stubs(:connected?).returns(false)
117
+ expect { lemma.listen }.to raise_error(Noam::Disconnected)
118
+ end
111
119
  end
112
120
 
113
121
  def send_message_from_server(source = "test-server", value = "noam event", message)
@@ -0,0 +1,51 @@
1
+ describe Noam::Listener do
2
+ def make_message(message)
3
+ ['test', 'source', 'event', message].to_json
4
+ end
5
+
6
+ class MockTcpSocket
7
+ def queue
8
+ @queue ||= Queue.new
9
+ end
10
+
11
+ def read_nonblock(size)
12
+ if size == ::Noam::Message::MESSAGE_LENGTH_STRING_SIZE
13
+ 1
14
+ else
15
+ queue.pop
16
+ end
17
+ end
18
+
19
+ def close; end
20
+ end
21
+
22
+ let!(:listener) { described_class.new }
23
+ let(:mock_socket) { MockTcpSocket.new }
24
+
25
+ before do
26
+ TCPServer.any_instance.stubs(:accept).returns(mock_socket)
27
+ IO.stubs(:select).returns(true)
28
+ end
29
+
30
+ describe '#connected?' do
31
+ it 'returns true if the connection is open' do
32
+ mock_socket.queue << make_message('message')
33
+ listener.stop
34
+ expect(listener.connected?).to be_truthy
35
+ end
36
+
37
+ it 'returns false if a read has failed' do
38
+ mock_socket.stubs(:read_nonblock).raises(EOFError.new)
39
+ listener.stop
40
+ expect(listener.connected?).to be_falsey
41
+ end
42
+ end
43
+
44
+ describe '#take' do
45
+ it 'returns the next message from the queue' do
46
+ mock_socket.queue << make_message('message')
47
+ listener.stop
48
+ expect(listener.take.value).to eq('message')
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,31 @@
1
+ describe Noam::Message::Marco do
2
+ let(:marco) { described_class.new('test_room', 'Test Lemma') }
3
+ let(:message) { ['message', 'room', 1234].to_json }
4
+ let(:sockaddr) { [1, 2, 3, 4] }
5
+
6
+ before do
7
+ described_class.any_instance.stubs(:message_received?).returns(true)
8
+ UDPSocket.any_instance.stubs(:send)
9
+ UDPSocket.any_instance.stubs(:recvfrom).returns([message, sockaddr])
10
+ end
11
+
12
+ it "sends a marco message to the server" do
13
+ UDPSocket.any_instance.expects(:send).with(
14
+ ["marco", 'Test Lemma', 'test_room', Noam::DEVICE_TYPE, Noam::VERSION].to_json,
15
+ 0,
16
+ '255.255.255.255',
17
+ Noam::BEACON_PORT
18
+ )
19
+ marco.start
20
+ end
21
+
22
+ it "returns a polo with the server's host" do
23
+ polo = marco.start
24
+ expect(polo.host).to eq(3)
25
+ end
26
+
27
+ it "returns a polo with the server's port" do
28
+ polo = marco.start
29
+ expect(polo.port).to eq(1234)
30
+ end
31
+ end
@@ -40,8 +40,8 @@ describe Noam::MessageFilter do
40
40
  filter.hear("example_event") {|message| example_received = true}
41
41
  filter.hear("sample_event") {|message| sample_received = true}
42
42
  filter.receive(stub_message("example_event"))
43
- example_received.should be_true
44
- sample_received.should be_false
43
+ example_received.should be_truthy
44
+ sample_received.should be_falsy
45
45
  end
46
46
 
47
47
  it "returns the given message" do
@@ -0,0 +1,60 @@
1
+ describe Noam::Player do
2
+ def make_message(message)
3
+ Noam::Message::Playable.new('host', 'event', message)
4
+ end
5
+
6
+ class MockTcpSocket
7
+ def published_messages
8
+ @published_messages ||= []
9
+ end
10
+
11
+ def print(message)
12
+ published_messages << message
13
+ end
14
+
15
+ def close; end
16
+
17
+ def flush; end
18
+ end
19
+
20
+ let(:player) { described_class.new('0.0.0.0', 1234) }
21
+ let(:mock_socket) { MockTcpSocket.new }
22
+
23
+ before do
24
+ TCPSocket.stubs(:new).returns(mock_socket)
25
+ end
26
+
27
+ describe "connected?" do
28
+ it "returns true if the socket is open" do
29
+ player.stop
30
+ expect(player.connected?).to be_truthy
31
+ end
32
+
33
+ it "returns false if a write to the socket has failed" do
34
+ mock_socket.stubs(:print).raises(Errno::EPIPE.new)
35
+ player.put(make_message("message"))
36
+ player.stop
37
+ expect(player.connected?).to be_falsey
38
+ end
39
+ end
40
+
41
+ describe "stop" do
42
+ it "publishes the remaning messages in the queue" do
43
+ 100.times do
44
+ player.put(make_message("message"))
45
+ end
46
+ player.stop
47
+ expect(mock_socket.published_messages.size).to eq(100)
48
+ end
49
+ end
50
+
51
+ describe "stop!" do
52
+ it "does not finish the queue" do
53
+ 100.times do
54
+ player.put(make_message("message"))
55
+ end
56
+ player.stop!
57
+ expect(mock_socket.published_messages.size).to be < 100
58
+ end
59
+ end
60
+ end
@@ -20,9 +20,6 @@ module NoamTest
20
20
  @thread = Thread.new do |t|
21
21
  begin
22
22
  loop do
23
- msg = ["beacon", "fake_beacon", NoamTest::FakeServer::PORT].to_json
24
- @socket.send(msg, 0, "255.255.255.255", Noam::BEACON_PORT)
25
-
26
23
  # This is normally at 5.0 seconds, but we run faster in order to
27
24
  # make tests faster.
28
25
  sleep(LOOP_DELAY)
@@ -105,7 +102,7 @@ module NoamTest
105
102
  @client_host = @sock.peeraddr[2]
106
103
  @queue = Queue.new
107
104
  end
108
-
105
+
109
106
  def start
110
107
  @thread = Thread.new do |t|
111
108
  begin
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: noam_lemma
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1.2
4
+ version: 0.2.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Van Enk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-05 00:00:00.000000000 Z
11
+ date: 2014-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: require_all
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ! '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ! '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: '2.14'
61
+ version: 3.1.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: '2.14'
68
+ version: 3.1.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: mocha
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -100,7 +100,6 @@ files:
100
100
  - examples/publisher.rb
101
101
  - examples/subscriber.rb
102
102
  - lib/noam_lemma.rb
103
- - lib/noam_lemma/beacon.rb
104
103
  - lib/noam_lemma/lemma.rb
105
104
  - lib/noam_lemma/listener.rb
106
105
  - lib/noam_lemma/message.rb
@@ -113,13 +112,15 @@ files:
113
112
  - lib/noam_lemma/player.rb
114
113
  - lib/noam_lemma/version.rb
115
114
  - noam_lemma.gemspec
116
- - spec/noam_lemma/beacon_spec.rb
117
115
  - spec/noam_lemma/lemma_spec.rb
116
+ - spec/noam_lemma/listener_spec.rb
118
117
  - spec/noam_lemma/message/heard_spec.rb
118
+ - spec/noam_lemma/message/marco_spec.rb
119
119
  - spec/noam_lemma/message/playable_spec.rb
120
120
  - spec/noam_lemma/message/register_spec.rb
121
121
  - spec/noam_lemma/message_filter_spec.rb
122
122
  - spec/noam_lemma/message_spec.rb
123
+ - spec/noam_lemma/player_spec.rb
123
124
  - spec/spec_helper.rb
124
125
  - spec/support/fake_server.rb
125
126
  homepage: https://github.com/noam-io/lemma-ruby
@@ -132,12 +133,12 @@ require_paths:
132
133
  - lib
133
134
  required_ruby_version: !ruby/object:Gem::Requirement
134
135
  requirements:
135
- - - '>='
136
+ - - ! '>='
136
137
  - !ruby/object:Gem::Version
137
138
  version: '0'
138
139
  required_rubygems_version: !ruby/object:Gem::Requirement
139
140
  requirements:
140
- - - '>='
141
+ - - ! '>='
141
142
  - !ruby/object:Gem::Version
142
143
  version: '0'
143
144
  requirements: []
@@ -147,12 +148,14 @@ signing_key:
147
148
  specification_version: 4
148
149
  summary: A lemma factory for the Noam pub-sub system.
149
150
  test_files:
150
- - spec/noam_lemma/beacon_spec.rb
151
151
  - spec/noam_lemma/lemma_spec.rb
152
+ - spec/noam_lemma/listener_spec.rb
152
153
  - spec/noam_lemma/message/heard_spec.rb
154
+ - spec/noam_lemma/message/marco_spec.rb
153
155
  - spec/noam_lemma/message/playable_spec.rb
154
156
  - spec/noam_lemma/message/register_spec.rb
155
157
  - spec/noam_lemma/message_filter_spec.rb
156
158
  - spec/noam_lemma/message_spec.rb
159
+ - spec/noam_lemma/player_spec.rb
157
160
  - spec/spec_helper.rb
158
161
  - spec/support/fake_server.rb
@@ -1,36 +0,0 @@
1
- module Noam
2
- class Beacon
3
- attr_reader :name, :host, :port
4
-
5
- def initialize(name, host, port)
6
- @name = name
7
- @host = host
8
- @port = port
9
- end
10
-
11
- def self.discover(net = "0.0.0.0")
12
- socket = UDPSocket.new
13
- begin
14
- socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
15
- socket.bind(net, Noam::BEACON_PORT)
16
-
17
- raise "Didn't see beacon after #{WAIT_TIME} seconds." unless message_received?(socket)
18
-
19
- data, addr = socket.recvfrom(MAX_RESPONSE_LENGTH)
20
- parsed_data = JSON.parse(data)
21
- Beacon.new(parsed_data[1], addr[2], parsed_data[2])
22
- ensure
23
- socket.close
24
- end
25
- end
26
-
27
- private
28
-
29
- MAX_RESPONSE_LENGTH = 1600
30
- WAIT_TIME = 10.0
31
-
32
- def self.message_received?(socket)
33
- IO.select([socket], [], [], WAIT_TIME) != nil
34
- end
35
- end
36
- end
@@ -1,26 +0,0 @@
1
- describe Noam::Beacon do
2
- describe "#new" do
3
- it "creates a new beacon" do
4
- beacon = Noam::Beacon.new(:name, :host, :noam)
5
- beacon.name.should == :name
6
- beacon.host.should == :host
7
- beacon.port.should == :noam
8
- end
9
- end
10
-
11
- describe "::discover" do
12
- before do
13
- FakeManager.start
14
- end
15
-
16
- after do
17
- FakeManager.stop
18
- end
19
-
20
- it "creates a Beacon based on server beacons" do
21
- beacon = Noam::Beacon.discover
22
- beacon.should be_a(Noam::Beacon)
23
- beacon.port.should == NoamTest::FakeServer::PORT
24
- end
25
- end
26
- end