voltos 0.3.0.rc13 → 0.3.0.rc14

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