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/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:
|