class Genprovider::Class

Public Class Methods

keyargs(c, out, first = true) click to toggle source
# File lib/genprovider/class.rb, line 17
def self.keyargs c, out, first = true
  keyargs c.parent, first, out if c.parent
  c.each_key do |k|
    if first
      first = false
    else
      out.write ", "
    end
    out.write(k.name.decamelize)
  end
end
mkdescription(out, element) click to toggle source
# File lib/genprovider/class.rb, line 11
def self.mkdescription out, element
  p = element.qualifiers["description", :string]
  out.comment
  out.comment(p.value).comment if p
end
new(c, out) click to toggle source

generate provider code for class ā€˜c’

# File lib/genprovider/class.rb, line 165
def initialize c, out
  out.comment
  out.comment "Generated by genprovider"
  out.comment
  out.puts("require 'cmpi'").puts
  out.puts("module Cmpi").inc
  
  Genprovider::Class.mkdescription out, c
  
  if c.superclass
    out.puts "d = File.dirname(__FILE__)"
    out.puts "$: << d unless $:.include? d"
    out.puts "require '#{c.superclass.decamelize}'"
  end
  out.comment.comment "Properties:"
  all_features(c, :keys) { |comment| out.comment "[key] #{comment}" }
  all_features(c, :nokeys) { |comment| out.comment comment }
  out.comment
  out.printf("class #{c.name}")
  out.write(" < #{c.superclass}") if c.superclass
  out.puts.inc
  # class functions
  mkstatic c, out
  # initializer
  mkinitialize c, out
  # normal properties
  mkfeatures c.features, out, CIM::Property
  # reference properties
  mkfeatures c.features, out, CIM::Reference
  # methods
  mkfeatures c.features, out, CIM::Method
  out.end # class
  out.end # module
end

Public Instance Methods

all_features(klass, option) { |"- #{type} #{name} (-> #{name})"| ... } click to toggle source

yield class features recursively

which => nil     : all
         :keys   : keys only
         :nokeys : nokeys only
# File lib/genprovider/class.rb, line 151
def all_features(klass, option)
  while klass
    klass.features.each do |f|
      next if option == :nokeys && f.key?
      next if option == :keys && !f.key?
      yield "- #{f.type} #{f.name} (-> #{klass.name})"
    end
    klass = klass.parent
  end
end
mkdef(out, feature) click to toggle source

make feature definition

# File lib/genprovider/class.rb, line 68
def mkdef out, feature
  Genprovider::Class.mkdescription out, feature
  case feature
  when CIM::Property
  # skip
  when CIM::Reference then out.comment "Reference"
  when CIM::Method then out.comment "Method"
  else
    raise "Unknown feature class #{feature.class}"
  end
  out.comment feature.type.to_s + " : " + feature.name
  out.comment "*Key*" if feature.key?
  out.comment
  
  args = nil      
  if feature.method?
    feature.parameters.each do |p|
      args ||= []
      if p.qualifiers.include?(:out,:bool)
        args << "#{p.name.decamelize}_out"
      else
        args << p.name.decamelize
      end
    end
  end
  n = feature.name.decamelize
  out.def n, args
    out.puts "@#{n}"
  out.end
  if feature.property? && feature.qualifiers.include?(:write)
    out.def "#{n}=", "_arg" 
      out.puts "@#{n} = _arg"
    out.end
  end
end
mkfeatures(features, out, match) click to toggle source

generate provider code for features matching match

# File lib/genprovider/class.rb, line 132
def mkfeatures features, out, match
  features.each do |f|
    next unless f.instance_of? match
    case f
    when CIM::Property then mkproperty f, out
    when CIM::Reference then mkreference f, out
    when CIM::Method then mkmethod f, out
    else
      raise "Unknown feature class #{f.class}"
    end
  end
end
mkinitialize(c, out) click to toggle source

make initializer

# File lib/genprovider/class.rb, line 33
def mkinitialize c, out

  out.def "initialize", "reference", "properties"
  if c.parent
    out.puts "super reference,properties"
  end
  out.end
end
mkmethod(method, out) click to toggle source

generate code for method

# File lib/genprovider/class.rb, line 124
def mkmethod method, out
  mkdef out, method
end
mkproperty(property, out) click to toggle source

generate code for property

# File lib/genprovider/class.rb, line 108
def mkproperty property, out
  mkdef out, property
end
mkreference(reference, out) click to toggle source

generate code for reference

# File lib/genprovider/class.rb, line 116
def mkreference reference, out
  mkdef out, reference
end
mkstatic(c, out) click to toggle source

make static methods

# File lib/genprovider/class.rb, line 46
def mkstatic c, out
  out.comment "each: yield CMPIObjectPath references"
  out.comment "  full => false: set only key properties (instance name)"
  out.comment "          true:  with full information to create instances"
  out.def "self.each", "reference", "properties", "full = false"
  out.comment "Retrieve names, adapt reference, and yield CMPIObjectPath"
  out.comment
  out.comment "YOUR CODE HERE"
  out.comment
  out.end
  out.def "self.delete", "reference", "properties = nil"
  out.comment "Remove by reference"
  out.comment
  out.comment "YOUR CODE HERE"
  out.comment
  out.end
end