Sha256: f618b914c0ee6a0e58db1002dabb21e39fa553b8a930aedd2dbb177b869a6a6a

Contents?: true

Size: 1.32 KB

Versions: 31

Compression:

Stored size: 1.32 KB

Contents

#
# A generic mapping class for "collections"
# bm = BlockMapper.new
# bm.before_each {|rec,index| # do something here like: rec.extend(MyMethods) }
# bm.map :indexer, 'Matt'
# bm.map :id do |rec,index|
#   rec[:id]
# end
# 
# mapped_data = bm.run(my_collection_of_somethings)
#
class BlockMapper
  
  attr :mappings
  attr :before_each_source_item_blk
  attr :after_each_mapped_value_blk
  
  def initialize
    @mappings = []
  end
  
  def map(output_field_name, value=nil, &blk)
    raise 'Can provide a value (second arg) or a block, not both' if value and block_given?
    @mappings << {:field_name=>output_field_name, :value=>value, :blk=>blk}
  end
  
  def before_each_source_item(&blk)
    @before_each_source_item_blk = blk
  end
  
  def after_each_mapped_value(&blk)
    @after_each_mapped_value_blk=blk
  end
  
  def run(collection, &blk)
    docs=[]
    collection.each_with_index do |rec,index|
      @before_each_source_item_blk.call(rec,index) if @before_each_source_item_blk
      doc={}
      @mappings.each do |m|
        field = m[:field_name]
        value = m[:blk] ? m[:blk].call(rec, index) : m[:value].to_s
        value = @after_each_mapped_value_blk.call(field, value) if @after_each_mapped_value_blk
        doc[field] = value
      end
      yield(doc, index) if block_given?
      docs << doc
    end
    docs
  end
  
end

Version data entries

31 entries across 31 versions & 1 rubygems

Version Path
hydra-head-4.0.0 lib/block_mapper.rb
hydra-head-4.0.0.rc6 lib/block_mapper.rb
hydra-head-4.0.0.rc5 lib/block_mapper.rb
hydra-head-4.0.0.rc4 lib/block_mapper.rb
hydra-head-4.0.0.rc3 lib/block_mapper.rb
hydra-head-4.0.0.rc2 lib/block_mapper.rb
hydra-head-3.3.0 lib/block_mapper.rb
hydra-head-3.2.2 lib/block_mapper.rb
hydra-head-3.2.1 lib/block_mapper.rb
hydra-head-3.2.0 lib/block_mapper.rb
hydra-head-3.2.0.pre3 lib/block_mapper.rb
hydra-head-3.2.0.pre2 lib/block_mapper.rb
hydra-head-3.2.0.pre1 lib/block_mapper.rb
hydra-head-3.1.5 lib/block_mapper.rb
hydra-head-3.1.4 lib/block_mapper.rb
hydra-head-3.1.3 lib/block_mapper.rb
hydra-head-3.1.2 lib/block_mapper.rb
hydra-head-3.1.1 lib/block_mapper.rb
hydra-head-3.1.0 lib/block_mapper.rb
hydra-head-3.1.0.rc2 lib/block_mapper.rb