class GrassCookbook::Recipe

A recipe uses some Data and generates other Data in a GRASS session.

Attributes

description[R]
generated_files[R]
generated_parameters[R]
generated_raster_maps[R]
generated_vector_maps[R]
id[R]
required_files[R]
required_parameters[R]
required_raster_maps[R]
required_vector_maps[R]

Public Class Methods

new(options = {}, &blk) click to toggle source
# File lib/grassgis/cookbook.rb, line 179
def initialize(options = {}, &blk)
  @id = options[:id].to_sym
  @description = options[:description] || "Proceso #{@id}"
  @process = blk
  @required_parameters = blk.parameters.map(&:last)
  @required_raster_maps = Array(options[:required_raster_maps])
  @required_vector_maps = Array(options[:required_vector_maps])
  @required_files = Array(options[:required_files])
  @generated_vector_maps = Array(options[:generated_vector_maps])
  @generated_raster_maps = Array(options[:generated_raster_maps])
  @generated_files = Array(options[:generated_files])
  @generated_parameters = Array(options[:generated_parameters])
end

Public Instance Methods

==(other) click to toggle source
# File lib/grassgis/cookbook.rb, line 265
def ==(other)
  eql? other
end
cook(grass, parameters = {}) click to toggle source

Execute the recipe with given parameters # TODO: mapset PATH

# File lib/grassgis/cookbook.rb, line 231
def cook(grass, parameters = {})
  # grass.g.mapsets '-p'
  # current_mapset = output.lines.last.split.first

  # Leave planning/checking if doable to the caller; not done here:
  # unless doable? GrassCookbook.available_data(grass, parameters)
  #   raise "Requirements for #{@id} not fulfilled"
  # end

  # Also not done here:
  # if done? GrassCookbook.available_data(grass, parameters)
  #   return
  # end

  args = parameters.values_at(*@required_parameters)
  # @process.call grass, *args
  # grass.session &@process, arguments: args
  # TODO: support in GrassGis for injecting/replacing locals
  grass.define_singleton_method(:parameters) { @parameters }
  grass.instance_exec *args, &@process
end
doable?(input) click to toggle source

Can the recipe be done given provided input?

# File lib/grassgis/cookbook.rb, line 220
def doable?(input)
  # input.missing(requirements).empty?
  (requirements - input).empty?
end
done?(existing) click to toggle source

Is the recipe unnecessary given existing data?

# File lib/grassgis/cookbook.rb, line 226
def done?(existing)
  (products - existing).empty?
end
eql?(other) click to toggle source
# File lib/grassgis/cookbook.rb, line 261
def eql?(other)
  @id == other.id
end
generated_maps() click to toggle source
# File lib/grassgis/cookbook.rb, line 214
def generated_maps
  generated_raster_maps.map { |map| [map, :raster] } +
  generated_vector_maps.map { |map| [map, :vector] }
end
hash() click to toggle source
# File lib/grassgis/cookbook.rb, line 269
def hash
  @id.hash
end
inspect() click to toggle source
# File lib/grassgis/cookbook.rb, line 257
def inspect
  "<GrassCookbook::Recipe #{@id.inspect}>"
end
products() click to toggle source

outputs

# File lib/grassgis/cookbook.rb, line 205
def products
  Data[parameters: generated_parameters, files: generated_files, maps: generated_maps]
end
required_maps() click to toggle source
# File lib/grassgis/cookbook.rb, line 209
def required_maps
  required_raster_maps.map { |map| [map, :raster] } +
  required_vector_maps.map { |map| [map, :vector] }
end
requirements() click to toggle source

inputs

# File lib/grassgis/cookbook.rb, line 200
def requirements
  Data[parameters: required_parameters, files: required_files, maps: required_maps]
end
to_s() click to toggle source
# File lib/grassgis/cookbook.rb, line 253
def to_s
  @description
end