You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by mc...@apache.org on 2015/06/03 22:30:48 UTC

[11/34] qpid-proton git commit: PROTON-799: Created a wrapper helper module for Ruby bindings.

PROTON-799: Created a wrapper helper module for Ruby bindings.

This module provides methods to make it easier to write wrapper methods
for the underlying Proton C libraries, reducing a lot of boilerplate
coding and removing the potential for bugs due to typos.


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

Branch: refs/heads/master
Commit: 0530d1a194c1e94e347a9fb04fa8e5380bf2db1a
Parents: 57deee4
Author: Darryl L. Pierce <mc...@gmail.com>
Authored: Tue Feb 10 15:22:50 2015 -0500
Committer: Darryl L. Pierce <mc...@gmail.com>
Committed: Wed Jun 3 16:29:21 2015 -0400

----------------------------------------------------------------------
 proton-c/bindings/ruby/lib/messenger/filters.rb |   2 +-
 .../bindings/ruby/lib/messenger/selectable.rb   |   2 +-
 proton-c/bindings/ruby/lib/qpid_proton.rb       |   1 +
 proton-c/bindings/ruby/lib/util/swig_helper.rb  | 114 +++++++++++++++++++
 4 files changed, 117 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0530d1a1/proton-c/bindings/ruby/lib/messenger/filters.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/messenger/filters.rb b/proton-c/bindings/ruby/lib/messenger/filters.rb
index e2b50bc..0ab3407 100644
--- a/proton-c/bindings/ruby/lib/messenger/filters.rb
+++ b/proton-c/bindings/ruby/lib/messenger/filters.rb
@@ -17,7 +17,7 @@
 # under the License.
 #++
 
-module Qpid::Proton
+module Qpid::Proton::Messenger
 
   # @private
   module Filters

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0530d1a1/proton-c/bindings/ruby/lib/messenger/selectable.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/messenger/selectable.rb b/proton-c/bindings/ruby/lib/messenger/selectable.rb
index 36b5761..9a61317 100644
--- a/proton-c/bindings/ruby/lib/messenger/selectable.rb
+++ b/proton-c/bindings/ruby/lib/messenger/selectable.rb
@@ -25,7 +25,7 @@ module Qpid::Proton::Messenger
   # @private
   class Selectable
 
-    include Qpid::Proton::Filters
+    include Filters
 
     call_before :check_is_initialized,
                 :fileno, :capacity, :pending, :deadline,

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0530d1a1/proton-c/bindings/ruby/lib/qpid_proton.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/qpid_proton.rb b/proton-c/bindings/ruby/lib/qpid_proton.rb
index e90df84..da9983c 100644
--- a/proton-c/bindings/ruby/lib/qpid_proton.rb
+++ b/proton-c/bindings/ruby/lib/qpid_proton.rb
@@ -31,6 +31,7 @@ require "core/exceptions"
 require "util/version"
 require "util/error_handler"
 require "util/constants"
+require "util/swig_helper"
 
 # Types
 require "types/strings"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0530d1a1/proton-c/bindings/ruby/lib/util/swig_helper.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/util/swig_helper.rb b/proton-c/bindings/ruby/lib/util/swig_helper.rb
new file mode 100644
index 0000000..d60e9e4
--- /dev/null
+++ b/proton-c/bindings/ruby/lib/util/swig_helper.rb
@@ -0,0 +1,114 @@
+#--
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#++
+
+module Qpid::Proton::Util
+
+  # Provides helper functions for writing wrapper functions for the
+  # underlying C APIs.
+  #
+  # Before defining any mutators the class must define the name of the
+  # prefix for methods with the constant PROTON_METOD_PREFIX.
+  #
+  # == Mutators, Setters And Getters
+  #
+  # There are three types of wrappers that are supported:
+  #
+  # [proton_writer] Defines a set-only method for the named attribute.
+  # [proton_reader] Defines a get-only method for the named attribute.
+  # [proton_accessor] Defines both a set- and a get-method for the named
+  #                  attribute.
+  # [proton_caller] A simple wrapper for calling an underlying method,
+  #                  avoids repetitive boiler plate coding.
+  #
+  # == Arguments
+  #
+  # [:is_or_get => {:is, :get}] For both the getter and the mutator types
+  # you can also declare that the method uses "is" instead of "get" in the
+  # underlying API. Such methods are then defined with "?"
+  #
+  # @example
+  #   class Terminus
+  #
+  #     include WrapperHelper
+  #
+  #     PROTON_METHOD_PREFIX = "pn_terminus"
+  #
+  #     # add methods "type" and "type=" that call "pn_terminus_{get,set}_type"
+  #     proton_accessor :type
+  #
+  #     # adds the method "dynamic?" that calls "pn_terminus_is_dynamic"
+  #     proton_accessor :dynamic, :is_or_get => :is
+  #
+  #     # adds a method named "foo" that calls "pn_terminus_foo"
+  #     proton_caller :foo
+  #
+  #   end
+  #
+  # @private
+  module SwigHelper
+
+    def self.included(base)
+      base.extend ClassMethods
+    end
+
+    module ClassMethods # :nodoc:
+
+      def create_wrapper_method(name, proton_method, with_arg = false)
+        if with_arg
+          define_method "#{name}" do |arg|
+            Cproton.__send__(proton_method.to_sym, @impl, arg)
+          end
+        else
+          define_method "#{name}" do
+            Cproton.__send__(proton_method.to_sym, @impl)
+          end
+        end
+      end
+
+      # Defines a method that calls an underlying C library function.
+      def proton_caller(name, options = {})
+        proton_method = "#{self::PROTON_METHOD_PREFIX}_#{name}"
+        # drop the trailing '?' if this is a property method
+        proton_method = proton_method[0..-2] if proton_method.end_with? "?"
+        create_wrapper_method(name, proton_method)
+      end
+
+      def proton_writer(name, options = {})
+        proton_method = "#{self::PROTON_METHOD_PREFIX}_set_#{name}"
+        create_wrapper_method("#{name}=", proton_method, true)
+      end
+
+      def proton_reader(name, options = {})
+        an_is_method = options[:is_or_get] == :is
+        prefix = (an_is_method) ? "is" : "get"
+        proton_method = "#{self::PROTON_METHOD_PREFIX}_#{prefix}_#{name}"
+        name = "#{name}?" if an_is_method
+        create_wrapper_method(name, proton_method)
+      end
+
+      def proton_accessor(name, options = {})
+        proton_writer(name, options)
+        proton_reader(name, options)
+      end
+
+    end
+
+  end
+
+end


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