Ruby从规范文件创建一个类

时间:2015-04-26 09:10:07

标签: ruby

我有一个像这样的规范文件Spec.txt

 title     :Test
 attribute :fieldOne, String
 attribute :fieldTwo,  Fixnum
 constraint :fieldOne, 'fieldOne != nil'
 constraint :fieldTwo, 'fieldTwo >= 0'

我需要动态创建一个类名为Test的类,以及属性fieldOnefieldTwo以及属性的约束。 到目前为止,我在文件中读取了分割行并将它们存储到数组中,然后使用

动态创建类
 dynamic_name = @@TITLE
    Object.const_set(dynamic_name, Class.new { 
        def init *args
        ...
        end
        })

但我不确定这是否是正确的方法,甚至现在如何创建属性和约束?

1 个答案:

答案 0 :(得分:1)

一种方法可能是:

file=File.open('Spec.txt')
attrs=[]
constraints=[]
all_attrs=""
new_class=""
file.each do |line|
  if line =~ /title/
    value= line.split[1].tr(':,','')
    new_class=value
  elsif line =~ /attribute/
    value= line.split[1]
    attrs << value
  elsif line =~ /constraint/
    field= line.split[2].tr('\'','')
    constraint= line.split[3]
    constraints << "\n  def #{field}=\n    validation here (#{constraint}) \n  end\n"
  end
end

attrs.map!{|attr| attr+" "}
all_attrs.chomp!(", ")
all_constraints=constraints.join

result=
  "Class "+new_class+"\n"+
  "attr_reader "+
  "#{all_attrs}\n"+
  "#{all_constraints}\n"+
  "end\n"

printf "#{result}"

运行:

$ ruby create_class.rb 
Class Test
attr_reader :fieldOne, :fieldTwo

  def fieldOne=
    validation here (!=) 
  end

  def fieldTwo=
    validation here (>=) 
  end

end
$

需要对验证进行更多的工作,但你明白了。

要立即使用,您可以将输出发送到ruby文件,然后将其作为代码包含在内,例如

# You would add this after the first section of code, after the 'printf "#{result}"'
File.open("#{new_class}.rb", "w") do |file|
  file.write(result)
end

require_relative "#{new_class}.rb"

test_it= Object.const_get(new_class).new
puts "#{test_it}"

否则,如果创建ruby文件就足够了:

ruby create_class.rb > class.rb

正如沃恩所说。