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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/Gemfile +5 -0
  4. data/WISHLIST.md +14 -0
  5. data/addons/history/Gemfile +2 -0
  6. data/addons/history/history.rb +101 -0
  7. data/addons/history/lib/history/buffer.rb +204 -0
  8. data/addons/history/lib/history/events.rb +13 -0
  9. data/addons/keyboard_macros/keyboard_macros.rb +295 -0
  10. data/addons/prompt/Gemfile +1 -0
  11. data/addons/prompt/right_prompt.rb +17 -0
  12. data/addons/prompt_updates/prompt_updates.rb +28 -0
  13. data/addons/tab_completion/Gemfile +0 -0
  14. data/addons/tab_completion/lib/tab_completion/completer.rb +62 -0
  15. data/addons/tab_completion/lib/tab_completion/custom_completion.rb +33 -0
  16. data/addons/tab_completion/lib/tab_completion/dsl_methods.rb +7 -0
  17. data/addons/tab_completion/lib/tab_completion/file_completion.rb +75 -0
  18. data/addons/tab_completion/tab_completion.rb +157 -0
  19. data/bin/yap +13 -4
  20. data/lib/tasks/addons.rake +51 -0
  21. data/lib/yap.rb +4 -55
  22. data/lib/yap/shell.rb +51 -10
  23. data/lib/yap/shell/builtins.rb +2 -2
  24. data/lib/yap/shell/builtins/alias.rb +2 -2
  25. data/lib/yap/shell/builtins/cd.rb +9 -11
  26. data/lib/yap/shell/builtins/env.rb +11 -0
  27. data/lib/yap/shell/commands.rb +29 -18
  28. data/lib/yap/shell/evaluation.rb +185 -68
  29. data/lib/yap/shell/evaluation/shell_expansions.rb +85 -0
  30. data/lib/yap/shell/event_emitter.rb +18 -0
  31. data/lib/yap/shell/execution/builtin_command_execution.rb +1 -1
  32. data/lib/yap/shell/execution/command_execution.rb +3 -3
  33. data/lib/yap/shell/execution/context.rb +32 -9
  34. data/lib/yap/shell/execution/file_system_command_execution.rb +12 -7
  35. data/lib/yap/shell/execution/ruby_command_execution.rb +6 -6
  36. data/lib/yap/shell/execution/shell_command_execution.rb +17 -2
  37. data/lib/yap/shell/prompt.rb +21 -0
  38. data/lib/yap/shell/repl.rb +179 -18
  39. data/lib/yap/shell/version.rb +1 -1
  40. data/lib/yap/world.rb +149 -15
  41. data/lib/yap/world/addons.rb +135 -0
  42. data/rcfiles/.yaprc +240 -10
  43. data/test.rb +206 -0
  44. data/update-rawline.sh +6 -0
  45. data/yap-shell.gemspec +11 -3
  46. metadata +101 -10
  47. 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