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.
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/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
@@ -0,0 +1,6 @@
1
+ #!/bin/sh
2
+
3
+ pushd ../../opensource_projects/rawline/
4
+ gem build *.gemspec
5
+ popd
6
+ gem install ../../opensource_projects/rawline/*.gem
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.1.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 "chronic", "~> 0.10"
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.1.1
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: 2015-03-14 00:00:00.000000000 Z
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.1.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.1.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: chronic
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: '0.10'
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: '0.10'
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
- description: The Lagniappe "Yap" shell.
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.rb
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.3
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: