Class: Ned::Command

Inherits:
Object
  • Object
show all
Defined in:
lib/ned/command.rb

Direct Known Subclasses

Append, Backward, Cut, Eval, Grep, Head, Index, Join, Prepend, Print, Quote, Read, Sort, Tail, Uniq

Defined Under Namespace

Classes: ParseError

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(input) ⇒ Command

Returns a new instance of Command.



54
55
56
57
58
# File 'lib/ned/command.rb', line 54

def initialize(input)
  @input = input
  @require_all = true if self.class.require_all?
  @first = true
end

Class Method Details

.config(name, args) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
# File 'lib/ned/command.rb', line 6

def config(name, args)
  @config ||= { }

  if args.empty?
    @config[name]
  elsif args.size == 1
    @config[name] = args[0]
    nil
  else
    raise "invalid args: #{args}"
  end
end

.description(*args) ⇒ Object



27
28
29
# File 'lib/ned/command.rb', line 27

def description(*args)
  config(:description, args)
end

.helpObject



47
48
49
50
51
# File 'lib/ned/command.rb', line 47

def help
  OptionParser.new do |opts|
    option_parser.call(opts)
  end.help
end

.long_name(*args) ⇒ Object



19
20
21
# File 'lib/ned/command.rb', line 19

def long_name(*args)
  config(:long_name, args)
end

.option_parser(&block) ⇒ Object



39
40
41
42
43
44
45
# File 'lib/ned/command.rb', line 39

def option_parser(&block)
  if block_given?
    @option_parser = block
  else
    @option_parser
  end
end

.require_allObject



31
32
33
# File 'lib/ned/command.rb', line 31

def require_all
  @require_all = true
end

.require_all?Boolean

Returns:



35
36
37
# File 'lib/ned/command.rb', line 35

def require_all?
  @require_all
end

.short_name(*args) ⇒ Object



23
24
25
# File 'lib/ned/command.rb', line 23

def short_name(*args)
  config(:short_name, args)
end

Instance Method Details

#executeObject



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/ned/command.rb', line 78

def execute
  if @require_all
    load_lines.empty? ? nil : load_lines.shift
  else
    return nil if @next.nil? && !@first

    if @first
      @first = false
      current = @input.execute
      @next = @input.execute
    else
      current = @next
      @next = @input.execute
    end

    if current.is_a? Array
      current.flat_map do |line|
        result = execute_internal(line)
        result.is_a?(Array) ? result : [result]
      end
    else
      execute_internal(current)
    end
  end
end

#execute_allObject



104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/ned/command.rb', line 104

def execute_all
  if @require_all
    load_lines
    @lines.shift(@lines.size)
  else
    lines = @input.execute_all
    lines = lines.each_with_index.flat_map do |line, i|
      @next = lines[i + 1]
      result = execute_internal(line)
      result.is_a?(Array) ? result : [result]
    end
    lines
  end
end

#execute_internal(line) ⇒ Object



119
120
121
# File 'lib/ned/command.rb', line 119

def execute_internal(line)
  line
end

#load_linesObject



131
132
133
134
135
136
137
# File 'lib/ned/command.rb', line 131

def load_lines
  unless @lines
    @lines = @input.execute_all
    @lines = execute_internal(@lines)
  end
  @lines
end

#optionsObject



60
61
62
# File 'lib/ned/command.rb', line 60

def options
  @options ||= {}
end

#parse(args) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/ned/command.rb', line 64

def parse(args)
  OptionParser.new do |opts|
    opts.on('-h', '--help', 'Print this help.') do |help|
      help
    end

    opts.on('-v', '--version', 'Print Ned version.') do |version|
      version
    end

    instance_exec(opts, &self.class.option_parser)
  end.parse!(args, into: options)
end

#peekObject



139
140
141
# File 'lib/ned/command.rb', line 139

def peek
  require_all? ? @lines[0] : @next
end

#require_allObject



123
124
125
# File 'lib/ned/command.rb', line 123

def require_all
  @require_all = true
end

#require_all?Boolean

Returns:



127
128
129
# File 'lib/ned/command.rb', line 127

def require_all?
  @require_all
end