In a previous post, I introduced SPQR and presented a couple of examples of how one could use SPQR to publish Ruby objects over QMF. Sometimes, though, you aren't starting from an application -- instead, you're starting from an XML QMF schema document. SPQR includes spqr-gen, a tool designed to automatically generate a skeleton SPQR application from a QMF schema. In this post, we'll see an example of spqr-gen in action.

First, let's look at a simple QMF schema for a class that exposes one method, echo, which returns its argument (note that the code examples may not show up if you're viewing this in a feed reader):

<schema package="examples.codegen">
  <class name="EchoAgent">
    <method name="echo" desc="returns its argument">
      <arg name="arg" dir="IO" type="lstr"/>

Running spqr-gen on this example produces two files: agent-app.rb and examples/codegen/EchoAgent.rb. As you can see, these two files contain all of the boilerplate we need to start implementing these QMF methods --- and, by chance, the boilerplate methods actually have the behavior that our agent is meant to!

require 'spqr/spqr'
require 'spqr/app'
require 'examples/codegen/EchoAgent'
app = => :debug)
app.register Examples::Codegen::EchoAgent
module Examples
  module Codegen
    class EchoAgent
      include SPQR::Manageable
      # Find method (NB:  you must implement this)
      def EchoAgent.find_by_id(objid)
# Find-all method (NB:  you must implement this)
      def EchoAgent.find_all
      ### Schema method declarations
      # echo returns its argument
      # * arg (lstr/IO)
      def echo(args)
        # Print values of in/out parameters
        log.debug "arg => #{args["arg"]}" # 
        # Assign values to in/out parameters
        args["arg"] = args["arg"]
      spqr_expose :echo do |args|
        args.declare :arg, :lstr, :inout, {}

spqr-gen is included in the SPQR repository; the system as documented in the last two posts is tagged "introducing-spqr".

  spqrqpidqmfruby • You may reply to this post on Twitter or