yap-shell 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/Gemfile +5 -0
- data/WISHLIST.md +14 -0
- data/addons/history/Gemfile +2 -0
- data/addons/history/history.rb +101 -0
- data/addons/history/lib/history/buffer.rb +204 -0
- data/addons/history/lib/history/events.rb +13 -0
- data/addons/keyboard_macros/keyboard_macros.rb +295 -0
- data/addons/prompt/Gemfile +1 -0
- data/addons/prompt/right_prompt.rb +17 -0
- data/addons/prompt_updates/prompt_updates.rb +28 -0
- data/addons/tab_completion/Gemfile +0 -0
- data/addons/tab_completion/lib/tab_completion/completer.rb +62 -0
- data/addons/tab_completion/lib/tab_completion/custom_completion.rb +33 -0
- data/addons/tab_completion/lib/tab_completion/dsl_methods.rb +7 -0
- data/addons/tab_completion/lib/tab_completion/file_completion.rb +75 -0
- data/addons/tab_completion/tab_completion.rb +157 -0
- data/bin/yap +13 -4
- data/lib/tasks/addons.rake +51 -0
- data/lib/yap.rb +4 -55
- data/lib/yap/shell.rb +51 -10
- data/lib/yap/shell/builtins.rb +2 -2
- data/lib/yap/shell/builtins/alias.rb +2 -2
- data/lib/yap/shell/builtins/cd.rb +9 -11
- data/lib/yap/shell/builtins/env.rb +11 -0
- data/lib/yap/shell/commands.rb +29 -18
- data/lib/yap/shell/evaluation.rb +185 -68
- data/lib/yap/shell/evaluation/shell_expansions.rb +85 -0
- data/lib/yap/shell/event_emitter.rb +18 -0
- data/lib/yap/shell/execution/builtin_command_execution.rb +1 -1
- data/lib/yap/shell/execution/command_execution.rb +3 -3
- data/lib/yap/shell/execution/context.rb +32 -9
- data/lib/yap/shell/execution/file_system_command_execution.rb +12 -7
- data/lib/yap/shell/execution/ruby_command_execution.rb +6 -6
- data/lib/yap/shell/execution/shell_command_execution.rb +17 -2
- data/lib/yap/shell/prompt.rb +21 -0
- data/lib/yap/shell/repl.rb +179 -18
- data/lib/yap/shell/version.rb +1 -1
- data/lib/yap/world.rb +149 -15
- data/lib/yap/world/addons.rb +135 -0
- data/rcfiles/.yaprc +240 -10
- data/test.rb +206 -0
- data/update-rawline.sh +6 -0
- data/yap-shell.gemspec +11 -3
- metadata +101 -10
- data/addons/history.rb +0 -171
data/addons/history.rb
DELETED
@@ -1,171 +0,0 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
module Yap
|
3
|
-
module WorldAddons
|
4
|
-
class History
|
5
|
-
def self.load
|
6
|
-
instance
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.instance
|
10
|
-
@history ||= History.new
|
11
|
-
end
|
12
|
-
|
13
|
-
def initialize
|
14
|
-
@history = []
|
15
|
-
end
|
16
|
-
|
17
|
-
def initialize_world(world)
|
18
|
-
load_history
|
19
|
-
|
20
|
-
world.func(:howmuch) do |args:, stdin:, stdout:, stderr:|
|
21
|
-
case args.first
|
22
|
-
when "time"
|
23
|
-
if history_item=self.last_executed_item
|
24
|
-
stdout.puts history_item.total_time_s
|
25
|
-
else
|
26
|
-
stdout.puts "Can't report on something you haven't done."
|
27
|
-
end
|
28
|
-
else
|
29
|
-
stdout.puts "How much what?"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def executing(command:, started_at:)
|
35
|
-
raise "Cannot acknowledge execution beginning of a command when no group has been started!" unless @history.last
|
36
|
-
@history.last.executing command:command, started_at:started_at
|
37
|
-
end
|
38
|
-
|
39
|
-
def executed(command:, stopped_at:)
|
40
|
-
raise "Cannot complete execution of a command when no group has been started!" unless @history.last
|
41
|
-
@history.last.executed command:command, stopped_at:stopped_at
|
42
|
-
end
|
43
|
-
|
44
|
-
def last_executed_item
|
45
|
-
@history.reverse.each do |group|
|
46
|
-
last_run = group.last_executed_item
|
47
|
-
break last_run if last_run
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def start_group(started_at)
|
52
|
-
@history.push Group.new(started_at:started_at)
|
53
|
-
end
|
54
|
-
|
55
|
-
def stop_group(stopped_at)
|
56
|
-
@history.last.stopped_at(stopped_at)
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def history_file
|
62
|
-
@history_file ||= File.expand_path('~') + '/.yap-history'
|
63
|
-
end
|
64
|
-
|
65
|
-
def load_history
|
66
|
-
return unless File.exists?(history_file) && File.readable?(history_file)
|
67
|
-
(YAML.load_file(history_file) || []).each do |item|
|
68
|
-
::Readline::HISTORY.push item
|
69
|
-
end
|
70
|
-
|
71
|
-
at_exit do
|
72
|
-
File.write history_file, ::Readline::HISTORY.to_a.to_yaml
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
class Group
|
77
|
-
extend Forwardable
|
78
|
-
|
79
|
-
def initialize(started_at:Time.now)
|
80
|
-
@started_at = started_at
|
81
|
-
@stopped_at = nil
|
82
|
-
@items = []
|
83
|
-
end
|
84
|
-
|
85
|
-
def_delegators :@items, :push, :<<, :pop, :first, :last
|
86
|
-
|
87
|
-
def duration
|
88
|
-
return nil unless @stopped_at
|
89
|
-
@stopped_at - @started_at
|
90
|
-
end
|
91
|
-
|
92
|
-
def executing(command:, started_at:)
|
93
|
-
@items.push Item.new(command:command, started_at:started_at)
|
94
|
-
end
|
95
|
-
|
96
|
-
def executed(command:, stopped_at:)
|
97
|
-
raise "2:Cannot complete execution of a command when no group has been started!" unless @items.last
|
98
|
-
item = @items.reverse.detect do |item|
|
99
|
-
command == item.command && !item.finished?
|
100
|
-
end
|
101
|
-
item.finished!(stopped_at)
|
102
|
-
end
|
103
|
-
|
104
|
-
def last_executed_item
|
105
|
-
@items.reverse.detect{ |item| item.finished? }
|
106
|
-
end
|
107
|
-
|
108
|
-
def stopped_at(time)
|
109
|
-
@stopped_at ||= time
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
class Item
|
114
|
-
attr_reader :command
|
115
|
-
|
116
|
-
def initialize(command:command, started_at:Time.now)
|
117
|
-
@command = command
|
118
|
-
@started_at = started_at
|
119
|
-
@ended_at = nil
|
120
|
-
end
|
121
|
-
|
122
|
-
def finished!(at)
|
123
|
-
@ended_at = at
|
124
|
-
end
|
125
|
-
|
126
|
-
def finished?
|
127
|
-
!!@ended_at
|
128
|
-
end
|
129
|
-
|
130
|
-
def total_time_s
|
131
|
-
humanize(@ended_at - @started_at) if @ended_at && @started_at
|
132
|
-
end
|
133
|
-
|
134
|
-
private
|
135
|
-
|
136
|
-
def humanize secs
|
137
|
-
[[60, :seconds], [60, :minutes], [24, :hours], [1000, :days]].inject([]){ |s, (count, name)|
|
138
|
-
if secs > 0
|
139
|
-
secs, n = secs.divmod(count)
|
140
|
-
s.unshift "#{n} #{name}"
|
141
|
-
end
|
142
|
-
s
|
143
|
-
}.join(' ')
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
Yap::Shell::Execution::Context.on(:before_statements_execute) do |context|
|
148
|
-
puts "Before group: #{context.to_s}" if ENV["DEBUG"]
|
149
|
-
History.instance.start_group(Time.now)
|
150
|
-
end
|
151
|
-
|
152
|
-
Yap::Shell::Execution::Context.on(:after_statements_execute) do |context|
|
153
|
-
History.instance.stop_group(Time.now)
|
154
|
-
puts "After group: #{context.to_s}" if ENV["DEBUG"]
|
155
|
-
end
|
156
|
-
|
157
|
-
Yap::Shell::Execution::Context.on(:after_process_finished) do |context, *args|
|
158
|
-
# puts "After process: #{context.to_s}, args: #{args.inspect}"
|
159
|
-
end
|
160
|
-
|
161
|
-
Yap::Shell::Execution::Context.on(:before_execute) do |context, command:|
|
162
|
-
History.instance.executing command:command.str, started_at:Time.now
|
163
|
-
end
|
164
|
-
|
165
|
-
Yap::Shell::Execution::Context.on(:after_execute) do |context, command:, result:|
|
166
|
-
History.instance.executed command:command.str, stopped_at:Time.now
|
167
|
-
end
|
168
|
-
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|