voltos 0.3.0.rc13 → 0.3.0.rc14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5e594103ccbf29608d37923e3141e336bf582a18
4
- data.tar.gz: f720443f9faed4fef87c4d4ba5b4c90d08e52c77
3
+ metadata.gz: 8f69a0b9facf15ca91edcc3aacdb778fc2a1d8f2
4
+ data.tar.gz: fd98f3520fc48862d4c46e8679c9eb8c9ce781d7
5
5
  SHA512:
6
- metadata.gz: b5d7a8d20db529f7b7da561fa8757c401dda70997a52404507a4d01ac65ac6b6eb62d320516f008ba21a4104fc3c0fdcd55f13e1333b23dc741fb17fdc37fb69
7
- data.tar.gz: cd30de76a9c925a67db2ddbd96b7fdff237d3731fcfd058e82f0223a70e3cc4d390c61fe28a7b25d32e8055d86a403c006077c7bbb6336da035ac5222f05b3ab
6
+ metadata.gz: dfb16c318abf9d9776d71a3898de74f1fe3700b1dcbbd0e16997e0774cc28bbd4f9be5650d9aa239ee7f98f5bc6dfbeaf157f1ba44a5e23803a75f9e38ec35d6
7
+ data.tar.gz: 6946992dfd179d36970d063b4096f8cb614a3e0b309f6f46008a2ece34506ee2df787aa8845191e3372f3d992c8a073ee14281925431373de9ac6da2963a7142
data/exe/voltos CHANGED
@@ -1,79 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
- require 'pty'
3
- require 'open3'
4
- require 'readline'
5
-
6
- def run_as_tty(bin, args)
7
- STDOUT.sync = true
8
- status = PTY.spawn(bin, *args) do |stdout, stdin, pid|
9
- stdout.sync = true
10
- Thread.new do
11
- loop do
12
- STDOUT.print stdout.getc
13
- end
14
- end
15
- Thread.new do
16
- loop do
17
- input = Readline.readline("", true)
18
- if input.nil?
19
- stdout.flush
20
- stdout.close
21
- stdin.close
22
- end
23
- stdin.puts input.strip
24
- end
25
- end
26
- begin
27
- Process::waitpid(pid) rescue nil
28
- rescue SystemExit, Interrupt
29
- Process.kill('INT', pid)
30
- Process::waitpid(pid) rescue nil
31
- retry
32
- rescue EOFError
33
- rescue IOError, Errno::EIO
34
- end
35
- end
36
- status
37
- end
38
-
39
- def run_as_daemon(bin, args)
40
- process = nil
41
- Open3.popen3(bin, *ARGV) do |stdin, stdout, stderr, thread|
42
- Thread.new do
43
- while !stdin.closed? do
44
- input = Readline.readline("", true).strip
45
- stdin.puts input
46
- end
47
- end
48
-
49
- errThread = Thread.new do
50
- while !stderr.eof? do
51
- putc stderr.readchar
52
- end
53
- end
54
-
55
- outThread = Thread.new do
56
- while !stdout.eof? do
57
- putc stdout.readchar
58
- end
59
- end
60
-
61
- begin
62
- Process::waitpid(thread.pid) rescue nil
63
- errThread.join
64
- outThread.join
65
- process = thread.value
66
- rescue SystemExit, Interrupt
67
- retry
68
- end
69
- end
70
- return process.exitstatus if process
71
- end
2
+ $:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'voltos/exe'
72
4
 
73
5
  bin = "#{Gem.bin_path('voltos', 'voltos')}-cli"
74
- if STDIN.tty?
75
- status = run_as_tty(bin, ARGV)
76
- else
77
- status = run_as_daemon(bin, ARGV)
78
- end
6
+ process = Voltos::Process.new
7
+ status = process.run(bin, *ARGV)
79
8
  exit(status.to_i)
data/exe/voltos-cli ADDED
Binary file
data/lib/voltos/exe.rb ADDED
@@ -0,0 +1,146 @@
1
+ require 'voltos/logger'
2
+ require 'pty'
3
+ require 'open3'
4
+ require 'readline'
5
+
6
+ module Voltos
7
+ class Process
8
+ def initialize(input = STDIN, output = STDOUT, err = STDOUT)
9
+ Readline.input = input
10
+ @in = input
11
+ @out = output
12
+ @err = err
13
+ end
14
+
15
+ def tty?
16
+ STDIN.tty?
17
+ end
18
+
19
+ def pid=(pid)
20
+ logger.debug "Storing spawned process pid: #{pid}"
21
+ @pid = pid
22
+ end
23
+
24
+ def pid
25
+ @pid
26
+ end
27
+
28
+ def run(command, *args)
29
+ logger.debug "Running: #{command} #{args.join(' ')}"
30
+ Signal.trap('INT') do
31
+ ctrl_c!
32
+ end
33
+ Signal.trap('TERM') do
34
+ ctrl_c!
35
+ end
36
+ if tty?
37
+ run_as_tty(command, *args)
38
+ else
39
+ run_as_daemon(command, *args)
40
+ end
41
+ end
42
+
43
+ def ctrl_c!
44
+ pid_to_kill = pid || ::Process.pid
45
+ logger.debug "Sending ^C to: #{pid_to_kill}"
46
+ ::Process.kill('TERM', pid_to_kill)
47
+ ::Process.waitall
48
+ end
49
+
50
+ def ctrl_d!
51
+ logger.debug "Sending ^D"
52
+ @process_stdin.close if @process_stdin
53
+ @process_stdout.close if @process_stdout
54
+ logger.debug "Sent."
55
+ end
56
+
57
+ private
58
+ def logger
59
+ return @logger if @logger
60
+ @logger = Voltos::Logger
61
+ end
62
+
63
+ def run_as_tty(bin, *args)
64
+ @out.sync = true
65
+ status = PTY.spawn(bin, *args) do |stdout, stdin, pid|
66
+ self.pid = pid
67
+ @process_stdin = stdin
68
+ @process_stdout = stdout
69
+ stdout.sync = true
70
+ Thread.new do
71
+ loop do
72
+ @out.print stdout.getc
73
+ end
74
+ end
75
+ Thread.new do
76
+ loop do
77
+ input = Readline.readline('', true)
78
+ if input.nil?
79
+ logger.debug "Cleaning up STDIN & STDOUT..."
80
+ stdout.flush
81
+ stdout.close
82
+ stdin.close
83
+ end
84
+ stdin.puts input.strip
85
+ end
86
+ end
87
+ begin
88
+ logger.debug "Waiting for process to finish: #{pid}"
89
+ ::Process::waitpid(pid) rescue nil
90
+ ::Process.waitall
91
+ logger.debug "Process finished."
92
+ while out = stdout.getc do
93
+ @out.print out
94
+ end
95
+ rescue SystemExit, Interrupt
96
+ logger.debug "Rescued interrupt."
97
+ ctrl_c!
98
+ retry
99
+ rescue EOFError
100
+ logger.debug "Rescued EOF."
101
+ rescue IOError, Errno::EIO
102
+ logger.debug "Rescued IOError."
103
+ end
104
+ end
105
+ status
106
+ end
107
+
108
+ def run_as_daemon(bin, *args)
109
+ process = nil
110
+ Open3.popen3(bin, *args) do |stdin, stdout, stderr, thread|
111
+ self.pid = thread.pid
112
+ Thread.new do
113
+ while !stdin.closed? do
114
+ input = Readline.readline('', true).strip
115
+ stdin.puts input
116
+ end
117
+ end
118
+
119
+ errThread = Thread.new do
120
+ while !stderr.eof? do
121
+ @err.putc stderr.readchar
122
+ end
123
+ end
124
+
125
+ outThread = Thread.new do
126
+ while !stdout.eof? do
127
+ putc stdout.readchar
128
+ end
129
+ end
130
+
131
+ begin
132
+ logger.debug "Waiting for process to finish #{thread.pid}."
133
+ Process::waitpid(thread.pid) rescue nil
134
+ errThread.join
135
+ outThread.join
136
+ logger.debug "Process finished."
137
+ process = thread.value
138
+ rescue SystemExit, Interrupt
139
+ logger.debug "Rescued interrupt."
140
+ retry
141
+ end
142
+ end
143
+ return process.exitstatus if process
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,26 @@
1
+ require 'logger'
2
+ module Voltos
3
+ module Logger
4
+ @@levels = ["FATAL", "ERROR", "WARN", "INFO", "DEBUG"]
5
+ @@levels.each do |level|
6
+ define_singleton_method level.downcase.to_sym do |msg|
7
+ logger.send(level.downcase.to_sym, 'Voltos Process - ' + msg)
8
+ end
9
+ end
10
+
11
+ def self.logger
12
+ return @logger if @logger
13
+ @logger = ::Logger.new(STDOUT)
14
+ @logger.level = ::Logger::WARN
15
+ if level = ENV["LOG_LEVEL"]
16
+ if @@levels.include? level.upcase
17
+ @logger.level = ::Logger.const_get(level.upcase.to_sym)
18
+ else
19
+ @logger.warn "Log level '#{level.upcase}' is unknown. Supported levels are: #{levels.join(", ")}."
20
+ end
21
+ end
22
+ @logger
23
+ end
24
+ end
25
+ end
26
+
@@ -1,3 +1,3 @@
1
1
  module Voltos
2
- VERSION = "0.3.0.rc13"
2
+ VERSION = "0.3.0.rc14"
3
3
  end
data/voltos.gemspec CHANGED
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
33
33
  # spec.add_development_dependency "curb", '~> 0'
34
34
  # spec.add_development_dependency "json", '~> 1.8.3'
35
35
  spec.add_development_dependency 'json', '~> 1.8', '>= 1.8.3'
36
+ spec.add_development_dependency 'byebug', '> 0'
36
37
 
37
38
  # spec.add_development_dependency "bundler"
38
39
  # spec.add_development_dependency "rake"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: voltos
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0.rc13
4
+ version: 0.3.0.rc14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel May
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-07-25 00:00:00.000000000 Z
11
+ date: 2016-08-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -72,6 +72,20 @@ dependencies:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
74
  version: 1.8.3
75
+ - !ruby/object:Gem::Dependency
76
+ name: byebug
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">"
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">"
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
75
89
  - !ruby/object:Gem::Dependency
76
90
  name: curb
77
91
  requirement: !ruby/object:Gem::Requirement
@@ -118,9 +132,12 @@ files:
118
132
  - bin/console
119
133
  - bin/setup
120
134
  - exe/voltos
135
+ - exe/voltos-cli
121
136
  - ext/Makefile
122
137
  - ext/extconf.rb
123
138
  - lib/voltos.rb
139
+ - lib/voltos/exe.rb
140
+ - lib/voltos/logger.rb
124
141
  - lib/voltos/rails.rb
125
142
  - lib/voltos/version.rb
126
143
  - voltos.gemspec