Personal tools

Difference between revisions of "Ruby examples"

From MohidWiki

Jump to: navigation, search
Line 73: Line 73:
  
 
end
 
end
 +
</pre>
 +
</htm>
 +
 +
==Class PatternTransform==
 +
 +
<htm>
 +
<pre name="code" class="ruby">
 +
 +
class IsTheActionToPerformWith
 +
 
 +
  attr_reader :patterncontent, :listofsubs
 +
  attr_reader :matchline, :batch
 +
 
 +
  def initialize (patterncontent, listofsubs)
 +
    @patterncontent, @listofsubs = patterncontent, listofsubs
 +
    @listofsubs = @listofsubs.to_a if !@listofsubs.is_a?(Array)
 +
    @matchline = @listofsubs.shift
 +
    @matches = @matchline.tr('()','').split(' ')
 +
    @closings = @matchline.gsub(/\(.+?\)/, '*').split(/\*| /)
 +
    puts @closings.join(' ')
 +
  end
 +
 
 +
  #private
 +
  def thePatternIsTransformedByTheBlock
 +
    @j = 1
 +
    @listofsubs.each do |line|
 +
      yield line
 +
      @j = @j + 1
 +
    end
 +
  end
 +
 
 +
  #private
 +
  def buildHashOfSubs(array)
 +
    hash = Hash.new
 +
    array.size.times { |i| hash.store(@matches[i], @closings[2*i].chomp + array[i] + @closings[2*i + 1].chomp) }
 +
    return hash
 +
  end
 +
 
 +
  def usesTransformedFilesNamedAfter(filename)
 +
   
 +
   
 +
    @outfilename = filename
 +
    thePatternIsTransformedByTheBlock{ |line|   
 +
      filecontent = String.new( @patterncontent )
 +
     
 +
      tokens = line.split( ' ' )
 +
      subhash = buildHashOfSubs(tokens)
 +
      subhash.each { |match, sub| filecontent.replace filecontent.gsub(match, sub) }
 +
     
 +
      mytrgfile = File.new(filename + "_" + @j.to_s.rjust(3,"0")  + ".dat", "w")
 +
      mytrgfile.puts filecontent
 +
      mytrgfile.close
 +
     
 +
      puts filecontent
 +
    }
 +
   
 +
  end
 +
 
 +
  #Running
 +
  def ing
 +
    puts "Running #{@batchfilename}..."
 +
  end
 +
 
 +
  #Running
 +
  def ning
 +
    ing
 +
  end
 +
 +
#Method 1
 +
  def usesTheFollowingBatchfileNameAndBlock(batchfilename)
 +
   
 +
    @batchfilename = batchfilename
 +
   
 +
    @batch = String.new
 +
   
 +
    batchhead = <<HEAD
 +
    @echo off
 +
    for %%i in (#{@outfilename}_*.dat) do (
 +
HEAD
 +
 +
    yield
 +
   
 +
    batchfoot = <<FOOT
 +
    )
 +
    pause
 +
    @echo on
 +
FOOT
 +
 +
    batchfile = File.new(@batchfilename, "w")
 +
    batchfile.puts batchhead + @batch + batchfoot
 +
    batchfile.close
 +
   
 +
  end
 +
 +
  #Method 2
 +
  def usesAGenericMohidtoolBatchfile(mohidtool, batchfilename, configfilename)
 +
    usesTheFollowingBatchfileNameAndBlock(batchfilename){
 +
      @batch = <<BATCH
 +
      copy %%i #{configfilename}
 +
      #{mohidtool}
 +
BATCH
 +
    }
 +
  end
 +
 
 +
  def usesAGenericMohidtool(mohidtool, configfilename)
 +
    usesAGenericMohidtoolBatchfile(mohidtool, "All_UseTool.bat", configfilename)
 +
  end
 +
 +
#Methods 3
 +
  def usesAConverttohdf5BatchfileNamed(batchfilename)
 +
    usesAGenericMohidtoolBatchfile( "ConvertToHdf5.exe", batchfilename, "ConvertToHDF5Action.dat")
 +
  end
 +
 
 +
  def usesAConvert2netcdfBatchfileNamed(batchfilename)
 +
    usesAGenericMohidtoolBatchfile( "Convert2Netcdf.exe", batchfilename, "Convert2Netcdf.dat")
 +
  end
 +
 +
end
 +
 +
class IsTheActionToPerformWithFiles < IsTheActionToPerformWith
 +
 
 +
  def initialize(patternfilename, listofsubsfilename)
 +
   
 +
    if File.exists?(patternfilename) and File.exists?(listofsubsfilename) then
 +
     
 +
      #patternfile = File.open(patternfilename)
 +
      patterncontent = String.new( File.open(patternfilename).read )
 +
     
 +
      #listofsubsfile = File.open(listofsubsfilename)
 +
      listofsubs = String.new( File.open(listofsubsfilename).read )
 +
     
 +
      super(patterncontent, listofsubs)
 +
     
 +
    else
 +
     
 +
      puts "Error: one or both of #{patternfilename} or #{listofsubsfilename} doesn't exist."
 +
     
 +
    end
 +
   
 +
  end
 +
 
 +
end
 +
 +
if __FILE__ == $0
 +
 
 +
mycontent = <<CONVERTTOHDF5ACTION
 +
<begin_file>
 +
ACTION                  : GLUES HDF5 FILES
 +
 +
OUTPUTFILENAME          : MOHID_WATER_01.hdf5
 +
 +
<<begin_listofsubs>>
 +
..\\Extraction\\Stride_WaterProperties_1.hdf5
 +
..\\Extraction\\Stride_WaterProperties_2.hdf5
 +
<<end_listofsubs>>
 +
<end_file>
 +
CONVERTTOHDF5ACTION
 +
 +
mylistofsubs = <<listofsubs
 +
_(01) s_(1). s_(2). (WATER) (WaterProperties)
 +
  01      1        2    WATER  WaterProperties
 +
  01      1        2    HYDRO  Hydrodynamic
 +
  02      3        5    WATER  WaterProperties
 +
  02      3        5    HYDRO  Hydrodynamic
 +
listofsubs
 +
 +
  ## 1 Create ##########
 +
  #You can create the class object with files ...
 +
  glue = IsTheActionToPerformWithFiles.new("root_ConvertToHDF5Action.dat", "listofsubs.txt") 
 +
  #... or with strings
 +
  glue = IsTheActionToPerformWith.new(mycontent, mylistofsubs) 
 +
 +
  ## 2 Generate new files ##########
 +
  glue.usesTransformedFilesNamedAfter("GlueAction")
 +
 
 +
  ## 3 Generate runscript ##########
 +
  #You can easily customize the batchfile main loop ...
 +
  glue.usesTheFollowingBatchfileNameAndBlock("GlueAllHdf5.bat") {
 +
    glue.batch.replace <<BATCH
 +
      copy %%i ConvertToHdf5Action.dat
 +
      ConvertToHdf5.exe
 +
BATCH
 +
  } 
 +
  #... or use a standard one
 +
  glue.usesAConverttohdf5BatchfileNamed("GlueAllHdf5.bat")
 +
 
 +
  ## 4 Run ##########
 +
  glue.ing
 +
 
 +
end
 +
 
</pre>
 
</pre>
 
</htm>
 
</htm>

Revision as of 13:09, 27 March 2010

Class IsTheRootStringToTransform

class IsTheRootStringToTransform
  
  attr_reader :rootfilecontent, :list, :matches 
  attr_reader :matchexpr, :j, :outfilename, :batch
  
  def initialize (rootstring, list)
    @rootfilecontent, @list = rootstring, list
    @list = @list.to_a if !@list.is_a?(Array)
    @matchexpr = @list.shift
    @matches = @matchexpr.tr('()','').split(' ')
    @closings = @matchexpr.gsub(/\(.+?\)/, '*').split(/\*| /)
    puts @closings.join(' ')
  end
  
  def isTransformedByTheBlock
    @j = 1
    @list.each do |line|
      yield line
      @j = @j + 1
    end
  end
  
  def buildHashOfSubs(array)
    hash = Hash.new
    array.size.times { |i| hash.store(@matches[i], @closings[2*i].chomp + array[i] + @closings[2*i + 1].chomp) }
    return hash
  end
  
  def isTransformedIntoFile(filename)
    
    @outfilename = filename
    isTransformedByTheBlock{ |line|    
      filecontent = String.new( @rootfilecontent )
      
      tokens = line.split( ' ' )
      subhash = buildHashOfSubs(tokens)
      subhash.each { |match, sub| filecontent.replace filecontent.gsub(match, sub) }
      
      mytrgfile = File.new(filename + "_" + @j.to_s.rjust(3,"0") + ".dat", "w")
      mytrgfile.puts filecontent
      mytrgfile.close
      
      puts filecontent
    }
    
  end
  
  def hasTheFollowingBatchFileBlock(batchfilename)
    
    @batch = String.new
    
batchhead = <


Class PatternTransform


class IsTheActionToPerformWith
  
  attr_reader :patterncontent, :listofsubs
  attr_reader :matchline, :batch
  
  def initialize (patterncontent, listofsubs)
    @patterncontent, @listofsubs = patterncontent, listofsubs
    @listofsubs = @listofsubs.to_a if !@listofsubs.is_a?(Array)
    @matchline = @listofsubs.shift
    @matches = @matchline.tr('()','').split(' ')
    @closings = @matchline.gsub(/\(.+?\)/, '*').split(/\*| /)
    puts @closings.join(' ')
  end
  
  #private
  def thePatternIsTransformedByTheBlock
    @j = 1
    @listofsubs.each do |line|
      yield line
      @j = @j + 1
    end
  end
  
  #private
  def buildHashOfSubs(array)
    hash = Hash.new
    array.size.times { |i| hash.store(@matches[i], @closings[2*i].chomp + array[i] + @closings[2*i + 1].chomp) }
    return hash
  end
  
  def usesTransformedFilesNamedAfter(filename)
    
    
    @outfilename = filename
    thePatternIsTransformedByTheBlock{ |line|    
      filecontent = String.new( @patterncontent )
      
      tokens = line.split( ' ' )
      subhash = buildHashOfSubs(tokens)
      subhash.each { |match, sub| filecontent.replace filecontent.gsub(match, sub) }
      
      mytrgfile = File.new(filename + "_" + @j.to_s.rjust(3,"0")  + ".dat", "w")
      mytrgfile.puts filecontent
      mytrgfile.close
      
      puts filecontent
    }
    
  end
  
  #Running
  def ing
    puts "Running #{@batchfilename}..."
  end
  
  #Running
  def ning
    ing
  end

#Method 1
  def usesTheFollowingBatchfileNameAndBlock(batchfilename)
    
    @batchfilename = batchfilename
    
    @batch = String.new
    
    batchhead = <
ACTION                   : GLUES HDF5 FILES

OUTPUTFILENAME           : MOHID_WATER_01.hdf5
 
<>
..\\Extraction\\Stride_WaterProperties_1.hdf5
..\\Extraction\\Stride_WaterProperties_2.hdf5
<>

CONVERTTOHDF5ACTION

mylistofsubs = <