From: Makoto K. <kw...@ku...> - 2006-05-30 21:05:20
|
I have released Kwalify-ruby 0.6.0. http://www.kuwata-lab.com/kwalify Kwalify is a schema validator for YAML and JSON. Changes from 0.5.1: * Kwalify now supports simple Object-YAML mapping. It means that Kwalify generates class definition from schema definition file, and bind YAML document to instance object of that class. Example: address-book.yaml : data file -------------------- groups: - name: family desc: my family - name: friend desc: my friends - name: business desc: those who works together persons: - name: Sumire group: family birth: 2000-01-01 blood: A - name: Shiina group: friend birth: 1995-01-01 email: sh...@ma... - name: Sakura group: business email: ch...@ma... phone: 012-345-6789 -------------------- address-book.schema.yaml : schema definition file -------------------- type: map classname: AddressBook desc: address-book class mapping: "groups": type: seq sequence: - type: map classname: Group desc: group class mapping: "name": { type: str, required: yes } "desc": { type: str } "persons": type: seq sequence: - type: map classname: Person desc: person class mapping: "name": { type: str, required: yes } "desc": { type: str } "group": { type: str } "email": { type: str, pattern: '/@/' } "phone": { type: str } "birth": { type: date } "blood": { type: str, enum: [A, B, O, AB] } -------------------- generate class definition ==================== $ kwalify -a genclass-ruby -tf address-book.schema.yaml > address-book.rb ==================== address-book.rb : generated class definition -------------------- ## address-book class class AddressBook def initialize(hash) @persons = (v=hash['persons']) ? v.map!{|e| e.is_a?(Person) ? e : Person.new(e)} : v @groups = (v=hash['groups']) ? v.map!{|e| e.is_a?(Group) ? e : Group.new(e)} : v end attr_accessor :persons # seq attr_accessor :groups # seq end ## person class class Person def initialize(hash) @name = hash['name'] @desc = hash['desc'] @phone = hash['phone'] @blood = hash['blood'] @group = hash['group'] @birth = hash['birth'] @email = hash['email'] end attr_accessor :name # str attr_accessor :desc # str attr_accessor :phone # str attr_accessor :blood # str attr_accessor :group # str attr_accessor :birth # date attr_accessor :email # str end ## group class class Group def initialize(hash) @name = hash['name'] @desc = hash['desc'] end attr_accessor :name # str attr_accessor :desc # str end -------------------- example-address-book.rb : example code of using address-book.rb -------------------- require 'address-book' require 'yaml' require 'pp' str = File.read('address-book.yaml') ydoc = YAML.load(str) addrbook = AddressBook.new(ydoc) ## bind YAML document to object pp addrbook.groups pp addrbook.persons -------------------- -- regards, kwatch |