#-- # =============================================================================== # Copyright (c) 2005,2006,2007 Christopher Kleckner # All rights reserved # # This file is part of the Rio library for ruby. # # Rio is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # Rio is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Rio; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # =============================================================================== #++ # # To create the documentation for Rio run the command # ruby build_doc.rb # from the distribution directory. # # Suggested Reading # * RIO::Doc::SYNOPSIS # * RIO::Doc::INTRO # * RIO::Doc::HOWTO # * RIO::Doc::EXAMPLES # * RIO::Rio # module RIO module IF module YAML #def file() target.file end #def dir() target.dir end # Puts a Rio in YAML mode. # # # Rio uses the YAML class from the Ruby standard library to provide # support for reading and writing YAML files. Normally using # (skip)records is identical to (skip)lines because # while +records+ only selects and does not specify the record-type, # +lines+ is the default. # # The YAML extension distingishes between items selected using # IF::GrandeStream#records, IF::GrandeStream#rows and IF::GrandeStream#lines. Rio returns objects loaded via # YAML#load when +records+ is used; returns the YAML text as a String # when +rows+ is used; and returns lines as Strings as normal when # +lines+ is used. +records+ is the default. In yaml-mode, # (skip)records can be called as (skip)objects and # (skip)rows can be called as (skip)documents # # To read a single YAML document, Rio provides #getobj and #load For # example, consider the following partial 'database.yml' from the rails # distribution: # # development: # adapter: mysql # database: rails_development # # test: # adapter: mysql # database: rails_test # # # To get the object represented in the yaml file: # # rio('database.yml').yaml.load # ==>{"development"=>{"adapter"=>"mysql", "database"=>"rails_development"}, # "test"=>{"adapter"=>"mysql", "database"=>"rails_test"}} # # Or one could read parts of the file like so: # # rio('database.yml').yaml.getobj['development']['database'] # ==>"rails_development" # # Single objects can be written using #putobj and #putobj! # which is aliased to #dump # # anobject = { # 'production' => { # 'adapter' => 'mysql', # 'database' => 'rails_production', # } # } # rio('afile.yaml').yaml.dump(anobject) # # # Single objects can be written using IF::Grande#putrec (aliased to IF::YAML#putobj # and IF::YAML#dump) # # rio('afile.yaml').yaml.putobj(anobject) # # Single objects can be loaded using IF::Grande#getrec (aliase to IF::Grande#getobj # and IF::YAML#load) # # anobject = rio('afile.yaml').yaml.getobj # # A Rio in yaml-mode is just # like any other Rio. And all the things you can do with any Rio come # for free. They can be iterated over using IF::Grande#each and read into an # array using IF::Grande#[] just like any other Rio. All the selection criteria # are identical also. # # Get the first three objects into an array: # # array_of_objects = rio('afile.yaml').yaml[0..2] # # Iterate over only YAML documents that are a kind_of ::Hash: # # rio('afile.yaml').yaml(::Hash) {|ahash| ...} # # This takes advantage of the fact that the default for matching records # is === # # Selecting records using a Proc can be used as normal: # # anarray = rio('afile.yaml').yaml(proc{|anobject| ...}).to_a # # One could even use the copy operator to convert a CSV file to a YAML # representation of the same data: # # rio('afile.yaml').yaml < rio('afile.csv').csv # def yaml(&block) target.yaml(&block); self end # Queries if the Rio is in yaml-mode. See #yaml def yaml?() target.yaml? end # Select objects from a YAML file. See #yaml and RIO::Doc::INTRO def objects(*selectors,&block) target.objects(*selectors,&block); self end # Reject objects from a YAML file. See #yaml and RIO::Doc::INTRO def skipobjects(*selectors,&block) target.skipobjects(*selectors,&block); self end # Select documents from a YAML file. See #yaml and RIO::Doc::INTRO def documents(*selectors,&block) target.documents(*selectors,&block); self end # Reject documents from a YAML file. Calls #skiprows. See #yaml and RIO::Doc::INTRO def skipdocuments(*selectors,&block) target.skipdocuments(*selectors,&block); self end # Calls YAML.load. # # Loads a single YAML object from the stream referenced by the Rio # # rio('database.yml').yaml.getobj # # See #yaml and RIO::Doc::INTRO # def getobj() target.getobj() end # Alias for #getobj def load() target.load() end # Alias for #getrec #def getdoc() target.getdoc() end # Calls YAML.dump, leaving the Rio open. def putobj(obj) target.putobj(obj); self end # Dumps an object to a Rio as with IF::YAML#putobj, and closes the Rio. # # rio('afile.yaml').yaml.putobj!(anobject) # # is identical to # # rio('afile.yaml').yaml.putobj(anobject).close # def putobj!(obj) target.putobj!(obj); self end # Alias for IF::YAML#putobj! def dump(obj) target.dump(obj); self end end end end