You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2018/01/05 16:35:55 UTC

[31/50] [abbrv] qpid-proton git commit: PROTON-1537: [ruby] Replace head/next with each

PROTON-1537: [ruby] Replace head/next with each

Connection provides each_session, Connection and Session provide each_link,
each_sender, each_receiver


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/1e256cf7
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/1e256cf7
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/1e256cf7

Branch: refs/heads/go1
Commit: 1e256cf72c283a6998c36baa98e069fa90275706
Parents: a4c50ca
Author: Alan Conway <ac...@redhat.com>
Authored: Thu Dec 14 11:35:32 2017 -0500
Committer: Alan Conway <ac...@redhat.com>
Committed: Fri Dec 15 09:59:47 2017 -0500

----------------------------------------------------------------------
 examples/ruby/broker.rb                         |   6 +-
 proton-c/bindings/ruby/lib/core/connection.rb   | 107 ++++++++-----------
 proton-c/bindings/ruby/lib/core/link.rb         |  15 +--
 proton-c/bindings/ruby/lib/core/session.rb      |  34 ++++--
 proton-c/bindings/ruby/lib/util/deprecation.rb  |   9 +-
 .../ruby/tests/test_connection_driver.rb        |  41 +++++++
 6 files changed, 121 insertions(+), 91 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1e256cf7/examples/ruby/broker.rb
----------------------------------------------------------------------
diff --git a/examples/ruby/broker.rb b/examples/ruby/broker.rb
index aad32a9..9595e2f 100644
--- a/examples/ruby/broker.rb
+++ b/examples/ruby/broker.rb
@@ -127,11 +127,7 @@ class Broker < Qpid::Proton::MessagingHandler
   end
 
   def remove_stale_consumers(connection)
-    l = connection.link_head(Qpid::Proton::Endpoint::REMOTE_ACTIVE)
-    while !l.nil?
-      self.unsubscribe(l) if l.sender?
-      l = l.next(Qpid::Proton::Endpoint::REMOTE_ACTIVE)
-    end
+    connection.each_sender { |s| unsubscribe(s) }
   end
 
   def on_sendable(sender)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1e256cf7/proton-c/bindings/ruby/lib/core/connection.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/core/connection.rb b/proton-c/bindings/ruby/lib/core/connection.rb
index 3ec7c26..2b97f41 100644
--- a/proton-c/bindings/ruby/lib/core/connection.rb
+++ b/proton-c/bindings/ruby/lib/core/connection.rb
@@ -197,78 +197,63 @@ module Qpid::Proton
     # @option opts (see Session#open_receiver)
     def open_receiver(opts=nil) default_session.open_receiver(opts) end
 
-    # Returns the first session from the connection that matches the specified
-    # state mask.
-    #
-    # Examines the state of each session owned by the connection, and returns
-    # the first session that matches the given state mask. If the state mask
-    # contains *both* local and remote flags, then an exact match against
-    # those flags is performed. If the state mask contains only local *or*
-    # remote flags, then a match occurs if a*any* of the local or remote flags
-    # are set, respectively.
-    #
-    # @param mask [Integer] The state mask to be matched.
-    #
-    # @return [Session] The first matching session, or nil if none matched.
-    #
-    # @see Endpoint#LOCAL_UNINIT
-    # @see Endpoint#LOCAL_ACTIVE
-    # @see Endpoint#LOCAL_CLOSED
-    # @see Endpoint#REMOTE_UNINIT
-    # @see Endpoint#REMOTE_ACTIVE
-    # @see Endpoint#REMOTE_CLOSED
-    #
-    def session_head(mask)
-      Session.wrap(Cproton.pn_session_header(@impl, mask))
+    # @deprecated use {#each_session}
+    def  session_head(mask)
+      deprecated __method__, "#each_session"
+      Session.wrap(Cproton.pn_session_head(@impl, mask))
     end
 
-    # Returns the first link that matches the given state mask.
-    #
-    # Examines the state of each link owned by the connection and returns the
-    # first that matches the given state mask. If the state mask contains
-    # *both* local and remote flags, then an exact match against those flags
-    # is performed. If the state mask contains *only* local or remote flags,
-    # then a match occurs if *any* of the local ore remote flags are set,
-    # respectively.
-    #
-    # @param mask [Integer] The state mask to be matched.
-    #
-    # @return [Link] The first matching link, or nil if none matched.
-    #
-    # @see Endpoint#LOCAL_UNINIT
-    # @see Endpoint#LOCAL_ACTIVE
-    # @see Endpoint#LOCAL_CLOSED
-    # @see Endpoint#REMOTE_UNINIT
-    # @see Endpoint#REMOTE_ACTIVE
-    # @see Endpoint#REMOTE_CLOSED
-    #
+    # Get the sessions on this connection.
+    # @overload each_session
+    #   @yieldparam s [Session] pass each session to block
+    # @overload each_session
+    #   @return [Enumerator] enumerator over sessions
+    def each_session(&block)
+      return enum_for(:each_session) unless block_given?
+      s = Cproton.pn_session_head(@impl, 0);
+      while s
+        yield Session.wrap(s)
+        s = Cproton.pn_session_next(s, 0)
+      end
+      self
+    end
+
+    # @deprecated use {#each_link}
     def link_head(mask)
+      deprecated __method__, "#each_link"
       Link.wrap(Cproton.pn_link_head(@impl, mask))
     end
 
-    # Extracts the first delivery on the connection that has pending
-    # operations.
-    #
-    # A readable delivery indicates message data is waiting to be read. A
-    # A writable delivery indcates that message data may be sent. An updated
-    # delivery indicates that the delivery's disposition has changed.
-    #
-    # A delivery will never be *both* readable and writable, but it may be
-    # both readable or writable and updated.
-    #
-    # @return [Delivery] The delivery, or nil if none are available.
-    #
-    # @see Delivery#next
-    #
+    # Get the links on this connection.
+    # @overload each_link
+    #   @yieldparam l [Link] pass each link to block
+    # @overload each_link
+    #   @return [Enumerator] enumerator over links
+    def each_link
+      return enum_for(:each_link) unless block_given?
+      l = Cproton.pn_link_head(@impl, 0);
+      while l
+        yield Link.wrap(l)
+        l = Cproton.pn_link_next(l, 0)
+      end
+      self
+    end
+
+    # Get the {Sender} links - see {#each_link}
+    def each_sender() each_link.select { |l| l.sender? }; end
+
+    # Get the {Receiver} links - see {#each_link}
+    def each_receiver() each_link.select { |l| l.receiver? }; end
+
+    # @deprecated use {#MessagingHandler} to handle work
     def work_head
+      deprecated __method__
       Delivery.wrap(Cproton.pn_work_head(@impl))
     end
 
-    # Returns the code for a connection error.
-    #
-    # @return [Integer] The error code.
-    #
+    # @deprecated use {#condition}
     def error
+      deprecated __method__, "#condition"
       Cproton.pn_error_code(Cproton.pn_connection_error(@impl))
     end
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1e256cf7/proton-c/bindings/ruby/lib/core/link.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/core/link.rb b/proton-c/bindings/ruby/lib/core/link.rb
index 88c0e52..2e656c2 100644
--- a/proton-c/bindings/ruby/lib/core/link.rb
+++ b/proton-c/bindings/ruby/lib/core/link.rb
@@ -48,12 +48,7 @@ module Qpid::Proton
     #
     proton_caller :state
 
-    # @!method open
-    #
-    # Opens the link. Once this operation has completed, the state flag will be
-    # set.
-    #
-    # @see Endpoint::LOCAL_ACTIVE
+    # @deprecated use {Session#open_sender} and {#Session#open_receiver}
     proton_caller :open
 
     # Close the local end of the link. The remote end may or may not be closed.
@@ -226,13 +221,9 @@ module Qpid::Proton
       Cproton.pn_link_error(@impl)
     end
 
-    # Returns the next link that matches the given state mask.
-    #
-    # @param state_mask [Integer] The state mask.
-    #
-    # @return [Sender, Receiver] The next link.
-    #
+    # @deprecated use {Session#each_link, Connection#each_link}
     def next(state_mask)
+      deprecated __method__, "Session#each_link, Connection#each_link"
       return Link.wrap(Cproton.pn_link_next(@impl, state_mask))
     end
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1e256cf7/proton-c/bindings/ruby/lib/core/session.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/core/session.rb b/proton-c/bindings/ruby/lib/core/session.rb
index 14f1a67..78e78a2 100644
--- a/proton-c/bindings/ruby/lib/core/session.rb
+++ b/proton-c/bindings/ruby/lib/core/session.rb
@@ -90,17 +90,9 @@ module Qpid::Proton
       Cproton.pn_session_close(@impl)
     end
 
-    # Retrieves the next session from a given connection that matches the
-    # specified state mask.
-    #
-    # When uses with Connection#session_head an application can access all of
-    # the session son the connection that match the given state.
-    #
-    # @param state_mask [Integer] The state mask to match.
-    #
-    # @return [Session, nil] The next session if one matches, or nil.
-    #
+    # @deprecated use {Connection#each_session}
     def next(state_mask)
+      deprecated __method__, "Connection#each_session"
       Session.wrap(Cproton.pn_session_next(@impl, state_mask))
     end
 
@@ -150,6 +142,28 @@ module Qpid::Proton
       return sender
     end
 
+    # Get the links on this Session.
+    # @overload each_link
+    #   @yieldparam l [Link] pass each link to block
+    # @overload each_link
+    #   @return [Enumerator] enumerator over links
+    def each_link
+      return enum_for(:each_link) unless block_given?
+      l = Cproton.pn_link_head(Cproton.pn_session_connection(@impl), 0);
+      while l
+        link = Link.wrap(l)
+        yield link if link.session == self
+        l = Cproton.pn_link_next(l, 0)
+      end
+      self
+    end
+
+    # Get the {Sender} links - see {#each_link}
+    def each_sender() each_link.select { |l| l.sender? }; end
+
+    # Get the {Receiver} links - see {#each_link}
+    def each_receiver() each_link.select { |l| l.receiver? }; end
+
     private
 
     def _local_condition

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1e256cf7/proton-c/bindings/ruby/lib/util/deprecation.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/util/deprecation.rb b/proton-c/bindings/ruby/lib/util/deprecation.rb
index 2e83783..8e96cd6 100644
--- a/proton-c/bindings/ruby/lib/util/deprecation.rb
+++ b/proton-c/bindings/ruby/lib/util/deprecation.rb
@@ -18,9 +18,12 @@
 module Qpid::Proton::Util
   # @private
   module Deprecation
-    def self.deprecated(old, new=nil, skip=2)
+    MATCH_DIR = /#{File.dirname(File.dirname(__FILE__))}/
+
+    def self.deprecated(old, new=nil)
       replace = new ? "use `#{new}`" : "internal use only"
-      warn "[DEPRECATION] `#{old}` is deprecated, #{replace}. Called from\n  #{caller(skip).first}"
+      line = caller.find { |l| not MATCH_DIR.match(l) }
+      warn "[DEPRECATION] `#{old}` is deprecated, #{replace}. Called from #{line}"
     end
 
     def deprecated(*arg) Deprecation.deprecated(*arg); end
@@ -29,7 +32,7 @@ module Qpid::Proton::Util
       def deprecated_alias(bad, good)
         bad, good = bad.to_sym, good.to_sym
         define_method(bad) do |*args, &block|
-          self.deprecated bad, good, 3
+          self.deprecated bad, good
           self.__send__(good, *args, &block)
         end
       end

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1e256cf7/proton-c/bindings/ruby/tests/test_connection_driver.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/tests/test_connection_driver.rb b/proton-c/bindings/ruby/tests/test_connection_driver.rb
index 3386e49..d8cce2a 100644
--- a/proton-c/bindings/ruby/tests/test_connection_driver.rb
+++ b/proton-c/bindings/ruby/tests/test_connection_driver.rb
@@ -86,4 +86,45 @@ class RawDriverTest < Minitest::Test
     d.run(start + secs*2)   # After 2x timeout, connections should close
     assert_equal [[:on_transport_error, :on_transport_tail_closed, :on_transport_head_closed, :on_transport_closed], [:on_connection_remote_close, :on_transport_tail_closed, :on_transport_head_closed, :on_transport_closed]], d.collect { |x| x.handler.calls }
   end
+
+  # Test each_session/each_link methods both with a block and returning Enumerator
+  def test_enumerators
+    connection = Connection.new()
+    (3.times.collect { connection.open_session }).each { |s|
+      s.open_sender; s.open_receiver
+    }
+
+    assert_equal 3, connection.each_session.to_a.size
+    assert_equal 6, connection.each_link.to_a.size
+
+    # Build Session => Set<Links> map using connection link enumerator
+    map1 = {}
+    connection.each_link { |l| map1[l.session] ||= Set.new; map1[l.session] << l }
+    assert_equal 3, map1.size
+    map1.each do |session,links|
+      assert_equal 2, links.size
+      links.each { |l| assert_equal session, l.session }
+    end
+
+    # Build Session => Set<Links> map using connection and session blocks
+    map2 = {}
+    connection.each_session do |session|
+      map2[session] = Set.new
+      session.each_link { |l| map2[session] << l }
+    end
+    assert_equal map1, map2
+
+    # Build Session => Set<Links> map using connection session and session enumerators
+    map3 = Hash[connection.each_session.collect { |s| [s, Set.new(s.each_link)] }]
+    assert_equal map1, map3
+
+    assert_equal [true, true, true], connection.each_sender.collect { |l| l.is_a? Sender }
+    assert_equal [true, true, true], connection.each_receiver.collect { |l| l.is_a? Receiver }
+    connection.each_session { |session|
+      assert_equal [true], session.each_sender.collect { |l| l.is_a? Sender }
+      assert_equal [true], session.each_receiver.collect { |l| l.is_a? Receiver }
+    }
+
+
+  end
 end


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org