Class: GrassCookbook::Recipe

Inherits:
Object
  • Object
show all
Defined in:
lib/grassgis/cookbook.rb

Overview

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}, &blk) ⇒ Recipe

Returns a new instance of Recipe.



179
180
181
182
183
184
185
186
187
188
189
190
191
# 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

Instance Attribute Details

#descriptionObject (readonly)

Returns the value of attribute description.



193
194
195
# File 'lib/grassgis/cookbook.rb', line 193

def description
  @description
end

#generated_filesObject (readonly)

Returns the value of attribute generated_files.



196
197
198
# File 'lib/grassgis/cookbook.rb', line 196

def generated_files
  @generated_files
end

#generated_parametersObject (readonly)

Returns the value of attribute generated_parameters.



197
198
199
# File 'lib/grassgis/cookbook.rb', line 197

def generated_parameters
  @generated_parameters
end

#generated_raster_mapsObject (readonly)

Returns the value of attribute generated_raster_maps.



196
197
198
# File 'lib/grassgis/cookbook.rb', line 196

def generated_raster_maps
  @generated_raster_maps
end

#generated_vector_mapsObject (readonly)

Returns the value of attribute generated_vector_maps.



196
197
198
# File 'lib/grassgis/cookbook.rb', line 196

def generated_vector_maps
  @generated_vector_maps
end

#idObject (readonly)

Returns the value of attribute id.



193
194
195
# File 'lib/grassgis/cookbook.rb', line 193

def id
  @id
end

#required_filesObject (readonly)

Returns the value of attribute required_files.



194
195
196
# File 'lib/grassgis/cookbook.rb', line 194

def required_files
  @required_files
end

#required_parametersObject (readonly)

Returns the value of attribute required_parameters.



195
196
197
# File 'lib/grassgis/cookbook.rb', line 195

def required_parameters
  @required_parameters
end

#required_raster_mapsObject (readonly)

Returns the value of attribute required_raster_maps.



194
195
196
# File 'lib/grassgis/cookbook.rb', line 194

def required_raster_maps
  @required_raster_maps
end

#required_vector_mapsObject (readonly)

Returns the value of attribute required_vector_maps.



194
195
196
# File 'lib/grassgis/cookbook.rb', line 194

def required_vector_maps
  @required_vector_maps
end

Instance Method Details

#==(other) ⇒ Object



265
266
267
# File 'lib/grassgis/cookbook.rb', line 265

def ==(other)
  eql? other
end

#cook(grass, parameters = {}) ⇒ Object

Execute the recipe with given parameters # TODO: mapset PATH



231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
# 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) ⇒ Boolean

Can the recipe be done given provided input?

Returns:

  • (Boolean)


220
221
222
223
# File 'lib/grassgis/cookbook.rb', line 220

def doable?(input)
  # input.missing(requirements).empty?
  (requirements - input).empty?
end

#done?(existing) ⇒ Boolean

Is the recipe unnecessary given existing data?

Returns:

  • (Boolean)


226
227
228
# File 'lib/grassgis/cookbook.rb', line 226

def done?(existing)
  (products - existing).empty?
end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


261
262
263
# File 'lib/grassgis/cookbook.rb', line 261

def eql?(other)
  @id == other.id
end

#generated_mapsObject



214
215
216
217
# 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

#hashObject



269
270
271
# File 'lib/grassgis/cookbook.rb', line 269

def hash
  @id.hash
end

#inspectObject



257
258
259
# File 'lib/grassgis/cookbook.rb', line 257

def inspect
  "<GrassCookbook::Recipe #{@id.inspect}>"
end

#productsObject

outputs



205
206
207
# File 'lib/grassgis/cookbook.rb', line 205

def products
  Data[parameters: generated_parameters, files: generated_files, maps: generated_maps]
end

#required_mapsObject



209
210
211
212
# 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

#requirementsObject

inputs



200
201
202
# File 'lib/grassgis/cookbook.rb', line 200

def requirements
  Data[parameters: required_parameters, files: required_files, maps: required_maps]
end

#to_sObject



253
254
255
# File 'lib/grassgis/cookbook.rb', line 253

def to_s
  @description
end