diff options
Diffstat (limited to 'qpid/ruby/lib/qpid/spec.rb')
-rw-r--r-- | qpid/ruby/lib/qpid/spec.rb | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/qpid/ruby/lib/qpid/spec.rb b/qpid/ruby/lib/qpid/spec.rb new file mode 100644 index 0000000000..b3d70d019d --- /dev/null +++ b/qpid/ruby/lib/qpid/spec.rb @@ -0,0 +1,183 @@ +# +# 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. +# + +require "set" +require "rexml/document" +require "qpid/fields" +require "qpid/traverse" + +module Qpid + module Spec + + include REXML + + class Container < Array + + def initialize() + @cache = {} + end + + def [](key) + return @cache[key] if @cache.include?(key) + value = do_lookup(key) + @cache[key] = value + return value + end + + def do_lookup(key) + case key + when String + return find {|x| x.name == key.intern()} + when Symbol + return find {|x| x.name == key} + else + return slice(key) + end + end + + def +(other) + copy = clone() + copy.concat(other) + return copy + end + + end + + class Reference + + fields(:name) + + def init(&block) + @resolver = block + end + + def resolve(*args) + @resolver.call(*args) + end + + end + + class Loader + + def initialize() + @stack = [] + end + + def container() + return Container.new() + end + + def load(obj) + case obj + when String + elem = @stack[-1] + result = container() + elem.elements.each(obj) {|e| + @index = result.size + result << load(e) + } + @index = nil + return result + else + elem = obj + @stack << elem + begin + result = send(:"load_#{elem.name}") + ensure + @stack.pop() + end + return result + end + end + + def element + @stack[-1] + end + + def text + element.text + end + + def attr(name, type = :string, default = nil, path = nil) + if path.nil? + elem = element + else + elem = nil + element.elements.each(path) {|elem|} + if elem.nil? + return default + end + end + + value = elem.attributes[name] + value = value.strip() unless value.nil? + if value.nil? + default + else + send(:"parse_#{type}", value) + end + end + + def parse_int(value) + if value.nil? + return nil + else + value.to_i(0) + end + end + + TRUE = ["yes", "true", "1"].to_set + FALSE = ["no", "false", "0", nil].to_set + + def parse_bool(value) + if TRUE.include?(value) + true + elsif FALSE.include?(value) + false + else + raise Exception.new("parse error, expecting boolean: #{value}") + end + end + + def parse_string(value) + value.to_s + end + + def parse_symbol(value) + value.intern() unless value.nil? + end + + REPLACE = {" " => "_", "-" => "_"} + KEYWORDS = {"global" => "global_", "return" => "return_"} + + def parse_name(value) + return if value.nil? + + REPLACE.each do |k, v| + value = value.gsub(k, v) + end + + value = KEYWORDS[value] if KEYWORDS.has_key? value + return value.intern() + end + + end + + end +end |