Sha256: 651adb8c2a87d3cf7672ed2d020e057ad99d1625b1e750ed6b2bb4e46e053d48

Contents?: true

Size: 1.63 KB

Versions: 1

Compression:

Stored size: 1.63 KB

Contents

#!/usr/bin/env ruby

autoload :Pru, 'pru'
require 'optparse'

usage = <<-EOS
Pipeable Ruby

Use ruby in your pipes, forget about grep/sed/awk/wc...

Map works on each line as String.
Reduce works on all lines as Array (optional or via -e/-f).

Usage:
    something | pru 'map' ['reduce']
    something | pru -e 'reduce'
EOS

options = {}

OptionParser.new { |opts|
  opts.banner = usage

  opts.separator ''
  opts.separator 'Options:'

  opts.on('-m', '--map-file FILE', 'Map via FILE') { |file|
    options[:map] = Pru::Helper.load_file(file, :map)
  }

  opts.separator ''

  opts.on('-e', '--execute CODE', 'Reduce via CODE') { |code|
    options[:reduce] = code
  }

  opts.on('-f', '--reduce-file FILE', 'Reduce via FILE') { |file|
    options[:reduce] = Pru::Helper.load_file(file, :reduce)
  }

  opts.separator ''
  opts.separator 'Load options:'

  opts.on('-I', '--libdir LIBDIR', 'Include LIBDIR in the search path for required modules') { |dir|
    $LOAD_PATH << dir
  }

  opts.on('-r', '--require MODULE', 'Require MODULE before executing any code') { |mod|
    require mod
  }

  opts.separator ''
  opts.separator 'Generic options:'

  opts.on('-h', '--help', 'Print this help message and exit') {
    puts opts
    exit
  }

  opts.on('--version', 'Print program version and exit') {
    puts "#{File.basename($0)} v#{Pru::VERSION}"
    exit
  }
}.parse!

abort usage if ARGV.size > 2
map, reduce = ARGV

map    ||= options[:map]
reduce ||= options[:reduce]

map = 'true' if map.nil? || map.strip.empty?

if reduce
  results = []
  Pru.map($stdin, map) { |x| results << x }
  puts Pru.reduce(results, reduce)
else
  Pru.map($stdin, map) { |x| puts x }
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
blackwinter-pru-0.1.4 bin/pru