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