• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

jdantonio / concurrent-ruby / #749

06 Apr 2014 10:19PM UTC coverage: 92.79% (-4.5%) from 97.309%
#749

push

chrisseaton
Update README.md

1583 of 1706 relevant lines covered (92.79%)

655.7 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

27.27
/lib/concurrent/postable.rb
1
require 'concurrent/event'
1✔
2

3
module Concurrent
1✔
4

5
  module Postable
1✔
6

7
    # @!visibility private
8
    Package = Struct.new(:message, :handler, :notifier) # :nodoc:
1✔
9

10
    # Sends a message to and returns. It's a fire-and-forget interaction.
11
    #
12
    # @param [Array] message one or more arguments representing a single message
13
    #   to be sent to the receiver.
14
    #
15
    # @return [Object] false when the message cannot be queued else the number
16
    #   of messages in the queue *after* this message has been post
17
    #
18
    # @raise ArgumentError when the message is empty
19
    #
20
    # @example
21
    #   class EchoActor < Concurrent::Actor
22
    #     def act(*message)
23
    #       p message
24
    #     end
25
    #   end
26
    #   
27
    #   echo = EchoActor.new
28
    #   echo.run!
29
    #   
30
    #   echo.post("Don't panic") #=> true
31
    #   #=> ["Don't panic"]
32
    #   
33
    #   echo.post(1, 2, 3, 4, 5) #=> true
34
    #   #=> [1, 2, 3, 4, 5]
35
    #   
36
    #   echo << "There's a frood who really knows where his towel is." #=> #<EchoActor:0x007fc8012b8448...
37
    #   #=> ["There's a frood who really knows where his towel is."]
38
    def post(*message)
1✔
39
      raise ArgumentError.new('empty message') if message.empty?
×
40
      return false unless ready?
×
41
      queue.push(Package.new(message))
×
42
      true
×
43
    end
44

45
    def <<(message)
1✔
46
      post(*message)
×
47
      self
×
48
    end
49

50
    def post?(*message)
1✔
51
      raise ArgumentError.new('empty message') if message.empty?
×
52
      return nil unless ready?
×
53
      ivar = IVar.new
×
54
      queue.push(Package.new(message, ivar))
×
55
      ivar
×
56
    end
57

58
    def post!(seconds, *message)
1✔
59
      raise ArgumentError.new('empty message') if message.empty?
×
60
      raise Concurrent::Runnable::LifecycleError unless ready?
×
61
      raise Concurrent::TimeoutError if seconds.to_f <= 0.0
×
62
      event = Event.new
×
63
      cback = Queue.new
×
64
      queue.push(Package.new(message, cback, event))
×
65
      if event.wait(seconds)
×
66
        result = cback.pop
×
67
        if result.is_a?(Exception)
×
68
          raise result
×
69
        else
70
          return result
×
71
        end
72
      else
73
        event.set # attempt to cancel
×
74
        raise Concurrent::TimeoutError
×
75
      end
76
    end
77

78
    # @deprecated +Actor+ is being replaced with a completely new framework prior to v1.0.0
79
    def forward(receiver, *message)
1✔
80
      raise ArgumentError.new('empty message') if message.empty?
×
81
      return false unless ready?
×
82
      queue.push(Package.new(message, receiver))
×
83
      queue.length
×
84
    end
85

86
    # @deprecated +Actor+ is being replaced with a completely new framework prior to v1.0.0
87
    def ready?
1✔
88
      if self.respond_to?(:running?) && ! running?
×
89
        false
×
90
      else
91
        true
×
92
      end
93
    end
94

95
    private
1✔
96

97
    # @!visibility private
98
    def queue # :nodoc:
1✔
99
      @queue ||= Queue.new
×
100
    end
101
  end
102
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc