picobox 0.1.7
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 +7 -0
- data/.gitignore +16 -0
- data/.rspec +5 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/DOCKER_INFO.md +3 -0
- data/Gemfile +5 -0
- data/Guardfile +47 -0
- data/LICENSE.txt +21 -0
- data/README.md +138 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/picobox +5 -0
- data/bin/picobox_dev +10 -0
- data/bin/rake +17 -0
- data/bin/setup +8 -0
- data/docs/demo_script.md +27 -0
- data/docs/testdrive +5658 -0
- data/docs/testdrive.gif +0 -0
- data/lib/picobox.rb +79 -0
- data/lib/picobox/box.rb +37 -0
- data/lib/picobox/boxes/manifest.rb +59 -0
- data/lib/picobox/boxes/packages/elixir/Dockerfile +47 -0
- data/lib/picobox/boxes/packages/elixir/docker-compose.yml +26 -0
- data/lib/picobox/boxes/packages/elixir/info +18 -0
- data/lib/picobox/boxes/packages/elixir/start +3 -0
- data/lib/picobox/boxes/packages/python/Dockerfile +33 -0
- data/lib/picobox/boxes/packages/python/docker-compose.yml +14 -0
- data/lib/picobox/boxes/packages/python/start +3 -0
- data/lib/picobox/boxes/packages/rails/Dockerfile +57 -0
- data/lib/picobox/boxes/packages/rails/docker-compose.yml +50 -0
- data/lib/picobox/boxes/packages/rails/start +9 -0
- data/lib/picobox/boxes/packages/ruby/Dockerfile +5 -0
- data/lib/picobox/boxes/packages/ruby/docker-compose.yml +22 -0
- data/lib/picobox/boxes/packages/ruby/start +3 -0
- data/lib/picobox/boxes/unpacker.rb +55 -0
- data/lib/picobox/cli.rb +163 -0
- data/lib/picobox/commands/add_box.rb +23 -0
- data/lib/picobox/commands/add_service.rb +25 -0
- data/lib/picobox/commands/build_service.rb +16 -0
- data/lib/picobox/commands/download_docker.rb +17 -0
- data/lib/picobox/commands/finish_install.rb +10 -0
- data/lib/picobox/commands/finish_uninstall.rb +9 -0
- data/lib/picobox/commands/initialize_project.rb +35 -0
- data/lib/picobox/commands/install_docker.rb +27 -0
- data/lib/picobox/commands/list_boxes.rb +16 -0
- data/lib/picobox/commands/list_services.rb +16 -0
- data/lib/picobox/commands/open_shell.rb +26 -0
- data/lib/picobox/commands/remove_service.rb +25 -0
- data/lib/picobox/commands/remove_setup_shell.rb +28 -0
- data/lib/picobox/commands/restart.rb +21 -0
- data/lib/picobox/commands/setup_shell.rb +19 -0
- data/lib/picobox/commands/start.rb +22 -0
- data/lib/picobox/commands/start_install.rb +9 -0
- data/lib/picobox/commands/start_uninstall.rb +20 -0
- data/lib/picobox/commands/stop.rb +24 -0
- data/lib/picobox/constants.rb +14 -0
- data/lib/picobox/dns.rb +8 -0
- data/lib/picobox/docker_compose/config.rb +59 -0
- data/lib/picobox/errors/picobox_error.rb +15 -0
- data/lib/picobox/handlers/stdout_handler.rb +142 -0
- data/lib/picobox/os/abstract.rb +29 -0
- data/lib/picobox/os/current_os.rb +14 -0
- data/lib/picobox/os/darwin.rb +15 -0
- data/lib/picobox/os/linux.rb +9 -0
- data/lib/picobox/os/unsupported_os.rb +9 -0
- data/lib/picobox/project.rb +19 -0
- data/lib/picobox/service.rb +64 -0
- data/lib/picobox/services/installer.rb +41 -0
- data/lib/picobox/services/manifest.rb +50 -0
- data/lib/picobox/services/packages/elasticsearch/config.yml +14 -0
- data/lib/picobox/services/packages/memcached/config.yml +9 -0
- data/lib/picobox/services/packages/mongodb/config.yml +13 -0
- data/lib/picobox/services/packages/mysql/config.yml +17 -0
- data/lib/picobox/services/packages/postgres/config.yml +16 -0
- data/lib/picobox/services/packages/redis/config.yml +7 -0
- data/lib/picobox/shell/dot_profile.rb +42 -0
- data/lib/picobox/shell/dot_zshrc.rb +42 -0
- data/lib/picobox/shell/startup_script.rb +18 -0
- data/lib/picobox/system.rb +83 -0
- data/lib/picobox/templates/shell_extensions.bash +125 -0
- data/lib/picobox/utils/domain_event_publisher.rb +11 -0
- data/lib/picobox/utils/output.rb +69 -0
- data/lib/picobox/utils/progress_bar.rb +31 -0
- data/lib/picobox/utils/project.rb +55 -0
- data/lib/picobox/utils/shell.rb +18 -0
- data/lib/picobox/utils/visitable.rb +9 -0
- data/lib/picobox/utils/visitor_by_os.rb +29 -0
- data/lib/runner.rb +51 -0
- data/picobox.gemspec +49 -0
- metadata +386 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
class System
|
|
3
|
+
include Utils::Visitable
|
|
4
|
+
include Utils::Output
|
|
5
|
+
|
|
6
|
+
attr_reader :os
|
|
7
|
+
|
|
8
|
+
def initialize(os)
|
|
9
|
+
@os = os
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def install
|
|
13
|
+
accept(Commands::StartInstall.new)
|
|
14
|
+
accept(Commands::DownloadDocker.new)
|
|
15
|
+
accept(Commands::InstallDocker.new)
|
|
16
|
+
accept(Commands::SetupShell.new)
|
|
17
|
+
accept(Commands::FinishInstall.new)
|
|
18
|
+
rescue Errors::ShellNotSupported => e
|
|
19
|
+
display_shell_not_supported e.message
|
|
20
|
+
exit 1
|
|
21
|
+
rescue Exception => e
|
|
22
|
+
display_info(e, :red)
|
|
23
|
+
exit 1
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def uninstall
|
|
28
|
+
accept(Commands::StartUninstall.new)
|
|
29
|
+
accept(Commands::RemoveSetupShell.new)
|
|
30
|
+
accept(Commands::FinishUninstall.new)
|
|
31
|
+
rescue Errors::PicoboxNotInstalled
|
|
32
|
+
display_picobox_not_installed
|
|
33
|
+
exit 1
|
|
34
|
+
rescue Exception => e
|
|
35
|
+
display_info(e, :red)
|
|
36
|
+
exit 1
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def start
|
|
41
|
+
accept(Commands::Start.new)
|
|
42
|
+
rescue Errors::ProjectNotInitialized
|
|
43
|
+
display_project_not_initialized
|
|
44
|
+
exit 1
|
|
45
|
+
rescue Exception => e
|
|
46
|
+
display_info(e, :red)
|
|
47
|
+
exit 1
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def stop
|
|
52
|
+
accept(Commands::Stop.new)
|
|
53
|
+
rescue Errors::ProjectNotInitialized
|
|
54
|
+
display_project_not_initialized
|
|
55
|
+
exit 1
|
|
56
|
+
rescue Exception => e
|
|
57
|
+
display_info(e, :red)
|
|
58
|
+
exit 1
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def restart
|
|
63
|
+
accept(Commands::Restart.new)
|
|
64
|
+
rescue Exception => e
|
|
65
|
+
display_info(e, :red)
|
|
66
|
+
exit 1
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def open_shell(service)
|
|
71
|
+
accept(Commands::OpenShell.new(service))
|
|
72
|
+
rescue Errors::SystemDownError
|
|
73
|
+
display_system_down
|
|
74
|
+
exit 1
|
|
75
|
+
rescue Errors::ProjectNotInitialized
|
|
76
|
+
display_project_not_initialized
|
|
77
|
+
exit 1
|
|
78
|
+
rescue Exception => e
|
|
79
|
+
display_info(e, :red)
|
|
80
|
+
exit 1
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# setup picobox proxies
|
|
4
|
+
#
|
|
5
|
+
|
|
6
|
+
###
|
|
7
|
+
### settings
|
|
8
|
+
###
|
|
9
|
+
DEV="dev"
|
|
10
|
+
TEST="test"
|
|
11
|
+
##
|
|
12
|
+
## functions
|
|
13
|
+
##
|
|
14
|
+
project_root() {
|
|
15
|
+
slashes=${PWD//[^\/]/}
|
|
16
|
+
directory="$PWD"
|
|
17
|
+
for (( n=${#slashes}; n>0; --n ))
|
|
18
|
+
do
|
|
19
|
+
test -e "$directory/.picobox" && echo "$directory/.picobox" && return
|
|
20
|
+
directory="$directory/.."
|
|
21
|
+
done
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
can_execute () {
|
|
25
|
+
if [ -e "$(project_root)/project.ini" ]; then
|
|
26
|
+
true
|
|
27
|
+
else
|
|
28
|
+
false
|
|
29
|
+
fi
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
picobox_proxy () {
|
|
33
|
+
if can_execute; then
|
|
34
|
+
docker-compose exec $1 $2 "${@:3}"
|
|
35
|
+
else
|
|
36
|
+
if [ "$ZSH_NAME" ]; then
|
|
37
|
+
`whence -p $2` "${@:3}"
|
|
38
|
+
else
|
|
39
|
+
`type -P $2` "${@:3}"
|
|
40
|
+
fi
|
|
41
|
+
fi
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
##
|
|
45
|
+
## ruby proxies
|
|
46
|
+
##
|
|
47
|
+
picobox_gem () { picobox_proxy $DEV "gem" "$@" ; }
|
|
48
|
+
picobox_rake () { picobox_proxy $DEV "rake" "$@" ; }
|
|
49
|
+
picobox_bundle () { picobox_proxy $DEV "bundle" "$@" ; }
|
|
50
|
+
picobox_irb() { picobox_proxy $DEV "irb" "$@" ;}
|
|
51
|
+
picobox_ruby() { picobox_proxy $DEV "ruby" "$@" ;}
|
|
52
|
+
|
|
53
|
+
alias gem=picobox_gem
|
|
54
|
+
alias rake=picobox_rake
|
|
55
|
+
alias bundle=picobox_bundle
|
|
56
|
+
alias irb=picobox_irb
|
|
57
|
+
alias ruby=picobox_ruby
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
###
|
|
61
|
+
## rails proxies
|
|
62
|
+
##
|
|
63
|
+
picobox_rails () { picobox_proxy $DEV "bundle exec rails" "$@" ; }
|
|
64
|
+
picobox_spring () { picobox_proxy $DEV "bundle exec spring" "$@" ; }
|
|
65
|
+
picobox_yarn () { picobox_proxy $DEV "bundle exec yarn" "$@" ; }
|
|
66
|
+
picobox_webpack () { picobox_proxy $DEV "bundle exec webpack" "$@" ; }
|
|
67
|
+
picobox_guard () { picobox_proxy $TEST "bundle exec guard" "$@" ; }
|
|
68
|
+
picobox_rspec () { picobox_proxy $TEST "bundle exec rspec" "$@" ; }
|
|
69
|
+
picobox_webpack_dev_server() { picobox_proxy "webpack" "bundle exec webpack-dev-server" "$@"; }
|
|
70
|
+
picobox_webpack_watcher () { picobox_proxy "webpack" "bundle exec webpack-watcher" "$@" ; }
|
|
71
|
+
|
|
72
|
+
alias rails=picobox_rails
|
|
73
|
+
alias rspec=picobox_rspec
|
|
74
|
+
alias spring=picobox_spring
|
|
75
|
+
alias yarn=picobox_yarn
|
|
76
|
+
alias webpack=picobox_webpack
|
|
77
|
+
alias webpack-dev-server=picobox_webpack_dev_server
|
|
78
|
+
alias webpack-watcher=picobox_webpack_watcher
|
|
79
|
+
alias guard=picobox_guard
|
|
80
|
+
|
|
81
|
+
##
|
|
82
|
+
## redis proxies
|
|
83
|
+
##
|
|
84
|
+
picobox_redis_cli () { picobox_proxy "redis" "redis-cli" "$@" ; }
|
|
85
|
+
|
|
86
|
+
alias redis-cli=picobox_redis_cli
|
|
87
|
+
|
|
88
|
+
##
|
|
89
|
+
## postgres proxies
|
|
90
|
+
##
|
|
91
|
+
picobox_psql () { picobox_proxy "postgres" "psql" "$@" ; }
|
|
92
|
+
|
|
93
|
+
alias psql=picobox_psql
|
|
94
|
+
|
|
95
|
+
##
|
|
96
|
+
## mysql proxies
|
|
97
|
+
##
|
|
98
|
+
picobox_mysql () { picobox_proxy "mysql" "mysql" "$@" ; }
|
|
99
|
+
|
|
100
|
+
alias psql=picobox_mysql
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
##
|
|
104
|
+
## elixir proxies
|
|
105
|
+
##
|
|
106
|
+
picobox_elixir() { picobox_proxy $DEV "elixir" "$@" ; }
|
|
107
|
+
picobox_mix() { picobox_proxy $DEV "mix" "$@" ; }
|
|
108
|
+
picobox_iex() { picobox_proxy $DEV "iex" "$@" ; }
|
|
109
|
+
picobox_erl() { picobox_proxy $DEV "erl" "$@" ; }
|
|
110
|
+
|
|
111
|
+
alias elixir=picobox_elixir
|
|
112
|
+
alias mix=picobox_mix
|
|
113
|
+
alias iex=picobox_iex
|
|
114
|
+
alias erl=picobox_erl
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
##
|
|
118
|
+
## python proxies
|
|
119
|
+
##
|
|
120
|
+
picobox_python() { picobox_proxy $DEV "python" "$@" ; }
|
|
121
|
+
picobox_pip() { picobox_proxy $DEV "pip" "$@" ; }
|
|
122
|
+
|
|
123
|
+
alias python=picobox_python
|
|
124
|
+
alias pip=picobox_pip
|
|
125
|
+
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Utils
|
|
3
|
+
module Output
|
|
4
|
+
def display_line(line)
|
|
5
|
+
thor.say line
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def display_info(info, color=nil)
|
|
10
|
+
thor.say " #{info}", color
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def display_status(status, line, log_status=true)
|
|
15
|
+
return if line.nil? || line.strip == ""
|
|
16
|
+
thor.say_status status, line, log_status
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def display_project_not_initialized
|
|
21
|
+
display_status('error', 'no project found', :red)
|
|
22
|
+
display_info("Run command in a project directory or create new project with 'picobox init [BOX]'", :green)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def display_box_not_available(type)
|
|
27
|
+
display_status('error', "#{type.capitalize} boxes are not available...yet", :red)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def display_service_not_available(type)
|
|
32
|
+
display_status('error', "#{type} service is not available...yet", :red)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def display_file_not_found(message)
|
|
37
|
+
display_status('error', message, :red)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def display_system_down
|
|
42
|
+
display_info("Picobox is not running!", :red)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def display_service_not_installed(type)
|
|
47
|
+
display_status('info', "#{type} not installed", :yellow)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def display_shell_not_supported(type)
|
|
51
|
+
display_status('error', "shell not supported #{type}", :red)
|
|
52
|
+
display_line ''
|
|
53
|
+
|
|
54
|
+
display_line "You can file a request at: #{Picobox::HOMEPAGE}"
|
|
55
|
+
display_line "and we'll get right on it!"
|
|
56
|
+
display_line ''
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def display_picobox_not_installed
|
|
60
|
+
display_info "Picobox not installed!", :red
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
private
|
|
64
|
+
def thor
|
|
65
|
+
@thor ||= Thor::Shell::Color.new
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Utils
|
|
3
|
+
class ProgressBar
|
|
4
|
+
class << self
|
|
5
|
+
def new(size)
|
|
6
|
+
@progress_bar = ::ProgressBar.create(
|
|
7
|
+
format: "%b\u{15E7}%i %p%% %t",
|
|
8
|
+
progress_mark: ' ',
|
|
9
|
+
remainder_mark: "\u{FF65}",
|
|
10
|
+
total: size
|
|
11
|
+
)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def step(step)
|
|
15
|
+
@progress_bar.progress = step
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def increment
|
|
20
|
+
@progress_bar.progress += 1
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def reset()
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
attr_accessor :progress_bar
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Utils
|
|
3
|
+
class Project
|
|
4
|
+
def initialize(os)
|
|
5
|
+
@os = os
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def project_initialized?
|
|
10
|
+
return false if os.project_root.nil?
|
|
11
|
+
root = os.project_root
|
|
12
|
+
target = os.current_dir
|
|
13
|
+
|
|
14
|
+
target[0...root.size] == root &&
|
|
15
|
+
(target.size == root.size || target[root.size] == ?/)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def root
|
|
20
|
+
find_root_from Pathname.new(os.current_dir)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def running?
|
|
25
|
+
result = %x[docker-compose ps]
|
|
26
|
+
|
|
27
|
+
result = result.split("\n")
|
|
28
|
+
result = result.select { |line| line.match /_dev|_test/ }
|
|
29
|
+
result = result.map { |line| line.split(' ')[2] }
|
|
30
|
+
|
|
31
|
+
result.uniq!
|
|
32
|
+
|
|
33
|
+
# There are no container stopped or started (all removed or first run)
|
|
34
|
+
return false if result.empty?
|
|
35
|
+
|
|
36
|
+
# Get the status and return the correct value
|
|
37
|
+
(result.include? 'Exit') ? false : true
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
attr_reader :os
|
|
42
|
+
|
|
43
|
+
def find_root_from(dir)
|
|
44
|
+
return nil if dir.root?
|
|
45
|
+
|
|
46
|
+
if Pathname.new("#{dir}/#{Picobox::CONFIG_DIR}/#{Picobox::PROJECT_INI}").exist?
|
|
47
|
+
return dir.to_s
|
|
48
|
+
else
|
|
49
|
+
dir, base = dir.split
|
|
50
|
+
find_root_from dir
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Utils
|
|
3
|
+
class VisitorByOs
|
|
4
|
+
include Utils::DomainEventPublisher
|
|
5
|
+
|
|
6
|
+
def visit subject
|
|
7
|
+
method_name = "visit_#{subject.os.to_s}".intern
|
|
8
|
+
send(method_name, subject )
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def visit_darwin subject
|
|
12
|
+
raise ::NotImplementedError, 'mac not supported'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def visit_linux subject
|
|
16
|
+
raise ::NotImplementedError, 'linux not supported'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def visit_windows subject
|
|
20
|
+
raise ::NotImplementedError, 'windows not supported'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def visit_unsupported subject
|
|
24
|
+
os = TTY::Platform.new.os
|
|
25
|
+
raise Errors::UnsupportedOsError, "#{os} is not yet supported :("
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
data/lib/runner.rb
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
require 'picobox'
|
|
3
|
+
|
|
4
|
+
class Runner
|
|
5
|
+
# Allow everything fun to be injected from the outside while defaulting to normal implementations.
|
|
6
|
+
def initialize(argv, stdin = STDIN, stdout = STDOUT, stderr = STDERR, kernel = Kernel)
|
|
7
|
+
@argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def execute!
|
|
11
|
+
exit_code = begin
|
|
12
|
+
# Thor accesses these streams directly rather than letting them be injected, so we replace them...
|
|
13
|
+
$stderr = @stderr
|
|
14
|
+
$stdin = @stdin
|
|
15
|
+
$stdout = @stdout
|
|
16
|
+
|
|
17
|
+
# Let TTY::File know about the stdout switch
|
|
18
|
+
TTY::File.instance_variable_set :"@output", $stdout
|
|
19
|
+
|
|
20
|
+
# Run our normal Thor app the way we know and love.
|
|
21
|
+
Picobox::CLI.start(@argv)
|
|
22
|
+
# Thor::Base#start does not have a return value, assume success if no exception is raised.
|
|
23
|
+
0
|
|
24
|
+
rescue StandardError => e
|
|
25
|
+
# The ruby interpreter would pipe this to STDERR and exit 1 in the case of an unhandled exception
|
|
26
|
+
b = e.backtrace
|
|
27
|
+
@stderr.puts("#{b.shift}: #{e.message} (#{e.class})")
|
|
28
|
+
@stderr.puts(b.map{|s| "\tfrom #{s}"}.join("\n"))
|
|
29
|
+
1
|
|
30
|
+
rescue SystemExit => e
|
|
31
|
+
e.status
|
|
32
|
+
ensure
|
|
33
|
+
# TODO: reset your app here, free up resources, etc.
|
|
34
|
+
# Examples:
|
|
35
|
+
# MyApp.logger.flush
|
|
36
|
+
# MyApp.logger.close
|
|
37
|
+
# MyApp.logger = nil
|
|
38
|
+
#
|
|
39
|
+
# MyApp.reset_singleton_instance_variables
|
|
40
|
+
|
|
41
|
+
# ...then we put the streams back.
|
|
42
|
+
$stderr = STDERR
|
|
43
|
+
$stdin = STDIN
|
|
44
|
+
$stdout = STDOUT
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Proxy our exit code back to the injected kernel.
|
|
48
|
+
@kernel.exit(exit_code)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|