yap-shell 0.1.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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/test.rb
ADDED
@@ -0,0 +1,206 @@
|
|
1
|
+
require 'terminfo'
|
2
|
+
require 'io/console'
|
3
|
+
require 'term/ansicolor'
|
4
|
+
|
5
|
+
$z = File.open("/tmp/z.log", "w+")
|
6
|
+
$z.sync = true
|
7
|
+
|
8
|
+
module EventEmitter
|
9
|
+
def _callbacks
|
10
|
+
@_callbacks ||= Hash.new { |h, k| h[k] = [] }
|
11
|
+
end
|
12
|
+
|
13
|
+
def on(type, *args, &blk)
|
14
|
+
_callbacks[type] << blk
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def emit(type, *args)
|
19
|
+
_callbacks[type].each do |blk|
|
20
|
+
blk.call(*args)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class TerminalRenderer
|
26
|
+
def initialize(layout_manager)
|
27
|
+
@output = $stdout
|
28
|
+
@terminfo = TermInfo.new ENV["TERM"], @output
|
29
|
+
@layout_manager = layout_manager
|
30
|
+
@layout_manager.on(:laid_out_content) do |content|
|
31
|
+
display(content)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def display(content)
|
36
|
+
@output.print(
|
37
|
+
@terminfo.control_string("clear"), # clear screen
|
38
|
+
@terminfo.control_string("hpa", 0), # go to column 0 (assuming we're on row 0)
|
39
|
+
@terminfo.control_string("sc"), # save cursor
|
40
|
+
content,
|
41
|
+
@terminfo.control_string("rc") # restore cursor
|
42
|
+
)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class LayoutManager
|
47
|
+
include EventEmitter
|
48
|
+
|
49
|
+
def initialize
|
50
|
+
@renderers = []
|
51
|
+
@mutex = Mutex.new
|
52
|
+
end
|
53
|
+
|
54
|
+
def add(renderer)
|
55
|
+
@renderers << renderer
|
56
|
+
renderer.on(:content_changed) do
|
57
|
+
layout
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def layout(width:nil, height:nil)
|
62
|
+
@mutex.synchronize { _layout(width, height) }
|
63
|
+
end
|
64
|
+
|
65
|
+
def _layout(width, height)
|
66
|
+
width ||= $stdout.winsize.last
|
67
|
+
height ||= $stdout.winsize.first
|
68
|
+
results_arr = []
|
69
|
+
column = 0
|
70
|
+
row = 0
|
71
|
+
@renderers.each do |renderer|
|
72
|
+
$z.puts "", "rendering #{renderer.id}"
|
73
|
+
$z.puts "Column: #{column} at row: #{row}"
|
74
|
+
$z.puts "Term width: #{width} height: #{height}"
|
75
|
+
$z.flush
|
76
|
+
text = renderer.render(width)
|
77
|
+
|
78
|
+
if renderer.anchor == :right
|
79
|
+
start_column = width - text.length
|
80
|
+
if start_column <= column || row > 0 # don't render the right prompt anywhere but the first line
|
81
|
+
next # we've already rendered content here, so skip
|
82
|
+
else
|
83
|
+
column = start_column
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
text.each_char do |ch|
|
88
|
+
queued_text = results_arr.fetch(row){ " " * width }
|
89
|
+
queued_text[column] = ch
|
90
|
+
column += 1
|
91
|
+
|
92
|
+
results_arr[row] = queued_text
|
93
|
+
|
94
|
+
if queued_text.length > width
|
95
|
+
row += 1
|
96
|
+
column = 0
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
# puts "-"*40
|
103
|
+
# puts results_arr.length
|
104
|
+
# puts results_arr.inspect
|
105
|
+
# puts results_arr#.join("\n")
|
106
|
+
emit :laid_out_content, results_arr.join("\n")
|
107
|
+
results_arr#.join("\n")
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
class ContentRenderer
|
112
|
+
include EventEmitter
|
113
|
+
|
114
|
+
attr_reader :display, :anchor
|
115
|
+
|
116
|
+
def id
|
117
|
+
@content.id
|
118
|
+
end
|
119
|
+
|
120
|
+
def initialize(content, display:nil, anchor:nil)
|
121
|
+
@display = display
|
122
|
+
@anchor = anchor
|
123
|
+
@last_width_rendered = nil
|
124
|
+
@content = content
|
125
|
+
@content.on(:content_changed) do |content, from:, to:|
|
126
|
+
@dirty = true
|
127
|
+
emit :content_changed
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def render(width)
|
132
|
+
@content.text
|
133
|
+
# @content.text.split(//).each_slice(width).map do |chars|
|
134
|
+
# chars.join
|
135
|
+
# end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
class Content
|
140
|
+
include EventEmitter
|
141
|
+
|
142
|
+
attr_accessor :id, :text
|
143
|
+
|
144
|
+
def initialize(id:, text:"")
|
145
|
+
@id = id
|
146
|
+
@text = text
|
147
|
+
end
|
148
|
+
|
149
|
+
def text=(str)
|
150
|
+
old_str = @text
|
151
|
+
@text = str
|
152
|
+
emit :content_changed, self, from:old_str, to:@text
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
anchor_left = Content.new id:"anchor-left", text:""
|
157
|
+
prompt = Content.new id:"prompt", text:"> "
|
158
|
+
input = Content.new id:"input"
|
159
|
+
right_prompt = Content.new id:"right-prompt"
|
160
|
+
|
161
|
+
anchor_left_renderer = ContentRenderer.new anchor_left
|
162
|
+
prompt_renderer = ContentRenderer.new(prompt, display: :inline)
|
163
|
+
input_renderer = ContentRenderer.new(input)
|
164
|
+
right_prompt_renderer = ContentRenderer.new(right_prompt, anchor: :right)
|
165
|
+
|
166
|
+
layout_manager = LayoutManager.new
|
167
|
+
layout_manager.add anchor_left_renderer
|
168
|
+
layout_manager.add prompt_renderer
|
169
|
+
layout_manager.add input_renderer
|
170
|
+
layout_manager.add right_prompt_renderer
|
171
|
+
|
172
|
+
terminal = TerminalRenderer.new(layout_manager)
|
173
|
+
|
174
|
+
prompt.text = "> "
|
175
|
+
sleep 1
|
176
|
+
input.text = "ls a b c d e f g h i j k l m"
|
177
|
+
# sleep 1
|
178
|
+
# prompt.text = "abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890> "
|
179
|
+
# sleep 1
|
180
|
+
anchor_left.text = "£ "
|
181
|
+
sleep 1
|
182
|
+
prompt.text = "#{Dir.pwd}> "
|
183
|
+
sleep 1
|
184
|
+
|
185
|
+
Thread.new do
|
186
|
+
loop do
|
187
|
+
["ls a b c", "echo hello world, goodbye world", "cat foo"].each do |str|
|
188
|
+
input.text = str
|
189
|
+
sleep 0.75
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
Thread.new do
|
195
|
+
loop do
|
196
|
+
%w(apples oranges bananas grapefruits pears cherries).each do |fruit|
|
197
|
+
anchor_left.text = "(#{fruit}) "
|
198
|
+
sleep 0.5
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
loop do
|
204
|
+
right_prompt.text = "#{Time.now.to_s}"
|
205
|
+
sleep 1
|
206
|
+
end
|
data/update-rawline.sh
ADDED
data/yap-shell.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Zach Dennis"]
|
10
10
|
spec.email = ["zach.dennis@gmail.com"]
|
11
11
|
spec.summary = %q{The Lagniappe "Yap" shell.}
|
12
|
-
spec.description = %q{The Lagniappe "Yap" shell.}
|
12
|
+
spec.description = %q{The Lagniappe "Yap" shell description.}
|
13
13
|
spec.homepage = "https://github.com/zdennis/yap-shell"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -18,11 +18,19 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency "yap-shell-parser", "~> 0.
|
21
|
+
spec.add_dependency "yap-shell-parser", "~> 0.4.0"
|
22
22
|
spec.add_dependency "term-ansicolor", "~> 1.3"
|
23
23
|
spec.add_dependency "ruby-termios", "~> 0.9.6"
|
24
|
-
spec.add_dependency "
|
24
|
+
spec.add_dependency "ruby-terminfo", "~> 0.1.1"
|
25
|
+
spec.add_runtime_dependency 'activesupport', '~> 4.2', '>= 4.2.4'
|
26
|
+
spec.add_dependency "yap-rawline", "~> 0.2.0"
|
25
27
|
|
26
28
|
spec.add_development_dependency "bundler", "~> 1.6"
|
27
29
|
spec.add_development_dependency "rake", "~> 10"
|
30
|
+
spec.add_development_dependency 'pry-byebug', '~> 3.3', '>= 3.3.0'
|
31
|
+
|
32
|
+
#--BEGIN_ADDON_GEM_DEPENDENCIES--#
|
33
|
+
spec.add_dependency "chronic", "~> 0.10.2"
|
34
|
+
# spec.add_dependency "term-ansicolor", "~> 1.3.2"
|
35
|
+
#--END_ADDON_GEM_DEPENDENCIES--#
|
28
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yap-shell
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zach Dennis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yap-shell-parser
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.4.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.4.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: term-ansicolor
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,19 +53,53 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.9.6
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: ruby-terminfo
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.1.1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.1.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: activesupport
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '4.2'
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: 4.2.4
|
79
|
+
type: :runtime
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - "~>"
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '4.2'
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 4.2.4
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: yap-rawline
|
57
91
|
requirement: !ruby/object:Gem::Requirement
|
58
92
|
requirements:
|
59
93
|
- - "~>"
|
60
94
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
95
|
+
version: 0.2.0
|
62
96
|
type: :runtime
|
63
97
|
prerelease: false
|
64
98
|
version_requirements: !ruby/object:Gem::Requirement
|
65
99
|
requirements:
|
66
100
|
- - "~>"
|
67
101
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
102
|
+
version: 0.2.0
|
69
103
|
- !ruby/object:Gem::Dependency
|
70
104
|
name: bundler
|
71
105
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,7 +128,41 @@ dependencies:
|
|
94
128
|
- - "~>"
|
95
129
|
- !ruby/object:Gem::Version
|
96
130
|
version: '10'
|
97
|
-
|
131
|
+
- !ruby/object:Gem::Dependency
|
132
|
+
name: pry-byebug
|
133
|
+
requirement: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - "~>"
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '3.3'
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: 3.3.0
|
141
|
+
type: :development
|
142
|
+
prerelease: false
|
143
|
+
version_requirements: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - "~>"
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '3.3'
|
148
|
+
- - ">="
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: 3.3.0
|
151
|
+
- !ruby/object:Gem::Dependency
|
152
|
+
name: chronic
|
153
|
+
requirement: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - "~>"
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 0.10.2
|
158
|
+
type: :runtime
|
159
|
+
prerelease: false
|
160
|
+
version_requirements: !ruby/object:Gem::Requirement
|
161
|
+
requirements:
|
162
|
+
- - "~>"
|
163
|
+
- !ruby/object:Gem::Version
|
164
|
+
version: 0.10.2
|
165
|
+
description: The Lagniappe "Yap" shell description.
|
98
166
|
email:
|
99
167
|
- zach.dennis@gmail.com
|
100
168
|
executables:
|
@@ -103,14 +171,29 @@ extensions: []
|
|
103
171
|
extra_rdoc_files: []
|
104
172
|
files:
|
105
173
|
- ".gitignore"
|
174
|
+
- ".ruby-version"
|
106
175
|
- DESIGN.md
|
107
176
|
- Gemfile
|
108
177
|
- LICENSE.txt
|
109
178
|
- README.md
|
110
179
|
- Rakefile
|
111
180
|
- WISHLIST.md
|
112
|
-
- addons/history
|
181
|
+
- addons/history/Gemfile
|
182
|
+
- addons/history/history.rb
|
183
|
+
- addons/history/lib/history/buffer.rb
|
184
|
+
- addons/history/lib/history/events.rb
|
185
|
+
- addons/keyboard_macros/keyboard_macros.rb
|
186
|
+
- addons/prompt/Gemfile
|
187
|
+
- addons/prompt/right_prompt.rb
|
188
|
+
- addons/prompt_updates/prompt_updates.rb
|
189
|
+
- addons/tab_completion/Gemfile
|
190
|
+
- addons/tab_completion/lib/tab_completion/completer.rb
|
191
|
+
- addons/tab_completion/lib/tab_completion/custom_completion.rb
|
192
|
+
- addons/tab_completion/lib/tab_completion/dsl_methods.rb
|
193
|
+
- addons/tab_completion/lib/tab_completion/file_completion.rb
|
194
|
+
- addons/tab_completion/tab_completion.rb
|
113
195
|
- bin/yap
|
196
|
+
- lib/tasks/addons.rake
|
114
197
|
- lib/tasks/gem.rake
|
115
198
|
- lib/yap.rb
|
116
199
|
- lib/yap/shell.rb
|
@@ -118,8 +201,11 @@ files:
|
|
118
201
|
- lib/yap/shell/builtins.rb
|
119
202
|
- lib/yap/shell/builtins/alias.rb
|
120
203
|
- lib/yap/shell/builtins/cd.rb
|
204
|
+
- lib/yap/shell/builtins/env.rb
|
121
205
|
- lib/yap/shell/commands.rb
|
122
206
|
- lib/yap/shell/evaluation.rb
|
207
|
+
- lib/yap/shell/evaluation/shell_expansions.rb
|
208
|
+
- lib/yap/shell/event_emitter.rb
|
123
209
|
- lib/yap/shell/execution.rb
|
124
210
|
- lib/yap/shell/execution/builtin_command_execution.rb
|
125
211
|
- lib/yap/shell/execution/command_execution.rb
|
@@ -128,9 +214,11 @@ files:
|
|
128
214
|
- lib/yap/shell/execution/result.rb
|
129
215
|
- lib/yap/shell/execution/ruby_command_execution.rb
|
130
216
|
- lib/yap/shell/execution/shell_command_execution.rb
|
217
|
+
- lib/yap/shell/prompt.rb
|
131
218
|
- lib/yap/shell/repl.rb
|
132
219
|
- lib/yap/shell/version.rb
|
133
220
|
- lib/yap/world.rb
|
221
|
+
- lib/yap/world/addons.rb
|
134
222
|
- rcfiles/.yaprc
|
135
223
|
- scripts/4
|
136
224
|
- scripts/bg-vim
|
@@ -141,6 +229,8 @@ files:
|
|
141
229
|
- scripts/simulate-long-running
|
142
230
|
- scripts/write-to-stderr.rb
|
143
231
|
- scripts/write-to-stdout.rb
|
232
|
+
- test.rb
|
233
|
+
- update-rawline.sh
|
144
234
|
- yap-shell.gemspec
|
145
235
|
homepage: https://github.com/zdennis/yap-shell
|
146
236
|
licenses:
|
@@ -162,8 +252,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
162
252
|
version: '0'
|
163
253
|
requirements: []
|
164
254
|
rubyforge_project:
|
165
|
-
rubygems_version: 2.4.
|
255
|
+
rubygems_version: 2.4.5.1
|
166
256
|
signing_key:
|
167
257
|
specification_version: 4
|
168
258
|
summary: The Lagniappe "Yap" shell.
|
169
259
|
test_files: []
|
260
|
+
has_rdoc:
|