Class: Yap::Shell::Impl
- Inherits:
-
Object
- Object
- Yap::Shell::Impl
- Defined in:
- lib/yap/shell.rb
Instance Method Summary collapse
-
#initialize(addons:) ⇒ Impl
constructor
A new instance of Impl.
- #repl ⇒ Object
-
#with_original_file_descriptor_flags(&block) ⇒ Object
Yields to the passed in block after restoring the file descriptor flags that Yap started in.
Constructor Details
#initialize(addons:) ⇒ Impl
Returns a new instance of Impl.
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/yap/shell.rb', line 26 def initialize(addons:) @original_file_descriptor_flags = { stdin: $stdin.fcntl(Fcntl::F_GETFL, 0), stdout: $stdout.fcntl(Fcntl::F_GETFL, 0), stderr: $stderr.fcntl(Fcntl::F_GETFL, 0) } @stdin = $stdin @stdout = $stdout @stderr = $stderr @stdout.sync = true @stderr.sync = true addons_str = "\n - " + addons.map(&:class).map(&:name).join("\n - ") Treefell['shell'].puts "Constructing world instance with addons: #{addons_str}" @world = Yap::World.instance(addons:addons) end |
Instance Method Details
#repl ⇒ Object
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/yap/shell.rb', line 66 def repl context = Yap::Shell::Execution::Context.new( stdin: @stdin, stdout: @stdout, stderr: @stderr ) @world.repl.on_input do |input| Treefell['shell'].puts "repl received input: #{input.inspect}" evaluation = Yap::Shell::Evaluation.new(stdin:@stdin, stdout:@stdout, stderr:@stderr, world:@world) evaluation.evaluate(input) do |command, stdin, stdout, stderr, wait| Treefell['shell'].puts <<-DEBUG.gsub(/^\s*\|/, '') |adding #{command} to run in context of: | stdin: #{stdin.inspect} | stdout: #{stdout.inspect} | stderr: #{stderr.inspect} | wait for child process to complete? #{wait.inspect} DEBUG context.clear_commands context.add_command_to_run command, stdin:stdin, stdout:stdout, stderr:stderr, wait:wait with_original_file_descriptor_flags do context.execute(world:@world) end end end begin Treefell['shell'].puts "enter interactive mode" @world.interactive! # rescue Errno::EIO => ex # # This happens when yap is no longer the foreground process # # but it tries to receive input/output from the tty. I believe it # # is a race condition when launching a child process. rescue Interrupt Treefell['shell'].puts "^C" @world.editor.puts "^C" retry rescue Exception => ex require 'pry' binding.pry unless ex.is_a?(SystemExit) end end |
#with_original_file_descriptor_flags(&block) ⇒ Object
Yields to the passed in block after restoring the file descriptor flags that Yap started in. This ensures that any changes Yap has made to run the shell don’t interfere with child processes.
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/yap/shell.rb', line 48 def with_original_file_descriptor_flags(&block) current_file_descriptor_flags = { stdin: $stdin.fcntl(Fcntl::F_GETFL, 0), stdout: $stdout.fcntl(Fcntl::F_GETFL, 0), stderr: $stderr.fcntl(Fcntl::F_GETFL, 0) } $stdin.fcntl(Fcntl::F_SETFL, @original_file_descriptor_flags[:stdin]) $stdout.fcntl(Fcntl::F_SETFL, @original_file_descriptor_flags[:stdout]) $stderr.fcntl(Fcntl::F_SETFL, @original_file_descriptor_flags[:stderr]) yield ensure $stdin.fcntl(Fcntl::F_SETFL, current_file_descriptor_flags[:stdin]) $stdout.fcntl(Fcntl::F_SETFL, current_file_descriptor_flags[:stdout]) $stderr.fcntl(Fcntl::F_SETFL, current_file_descriptor_flags[:stderr]) end |