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.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.rspec +5 -0
  4. data/.travis.yml +5 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/DOCKER_INFO.md +3 -0
  7. data/Gemfile +5 -0
  8. data/Guardfile +47 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +138 -0
  11. data/Rakefile +6 -0
  12. data/bin/console +14 -0
  13. data/bin/picobox +5 -0
  14. data/bin/picobox_dev +10 -0
  15. data/bin/rake +17 -0
  16. data/bin/setup +8 -0
  17. data/docs/demo_script.md +27 -0
  18. data/docs/testdrive +5658 -0
  19. data/docs/testdrive.gif +0 -0
  20. data/lib/picobox.rb +79 -0
  21. data/lib/picobox/box.rb +37 -0
  22. data/lib/picobox/boxes/manifest.rb +59 -0
  23. data/lib/picobox/boxes/packages/elixir/Dockerfile +47 -0
  24. data/lib/picobox/boxes/packages/elixir/docker-compose.yml +26 -0
  25. data/lib/picobox/boxes/packages/elixir/info +18 -0
  26. data/lib/picobox/boxes/packages/elixir/start +3 -0
  27. data/lib/picobox/boxes/packages/python/Dockerfile +33 -0
  28. data/lib/picobox/boxes/packages/python/docker-compose.yml +14 -0
  29. data/lib/picobox/boxes/packages/python/start +3 -0
  30. data/lib/picobox/boxes/packages/rails/Dockerfile +57 -0
  31. data/lib/picobox/boxes/packages/rails/docker-compose.yml +50 -0
  32. data/lib/picobox/boxes/packages/rails/start +9 -0
  33. data/lib/picobox/boxes/packages/ruby/Dockerfile +5 -0
  34. data/lib/picobox/boxes/packages/ruby/docker-compose.yml +22 -0
  35. data/lib/picobox/boxes/packages/ruby/start +3 -0
  36. data/lib/picobox/boxes/unpacker.rb +55 -0
  37. data/lib/picobox/cli.rb +163 -0
  38. data/lib/picobox/commands/add_box.rb +23 -0
  39. data/lib/picobox/commands/add_service.rb +25 -0
  40. data/lib/picobox/commands/build_service.rb +16 -0
  41. data/lib/picobox/commands/download_docker.rb +17 -0
  42. data/lib/picobox/commands/finish_install.rb +10 -0
  43. data/lib/picobox/commands/finish_uninstall.rb +9 -0
  44. data/lib/picobox/commands/initialize_project.rb +35 -0
  45. data/lib/picobox/commands/install_docker.rb +27 -0
  46. data/lib/picobox/commands/list_boxes.rb +16 -0
  47. data/lib/picobox/commands/list_services.rb +16 -0
  48. data/lib/picobox/commands/open_shell.rb +26 -0
  49. data/lib/picobox/commands/remove_service.rb +25 -0
  50. data/lib/picobox/commands/remove_setup_shell.rb +28 -0
  51. data/lib/picobox/commands/restart.rb +21 -0
  52. data/lib/picobox/commands/setup_shell.rb +19 -0
  53. data/lib/picobox/commands/start.rb +22 -0
  54. data/lib/picobox/commands/start_install.rb +9 -0
  55. data/lib/picobox/commands/start_uninstall.rb +20 -0
  56. data/lib/picobox/commands/stop.rb +24 -0
  57. data/lib/picobox/constants.rb +14 -0
  58. data/lib/picobox/dns.rb +8 -0
  59. data/lib/picobox/docker_compose/config.rb +59 -0
  60. data/lib/picobox/errors/picobox_error.rb +15 -0
  61. data/lib/picobox/handlers/stdout_handler.rb +142 -0
  62. data/lib/picobox/os/abstract.rb +29 -0
  63. data/lib/picobox/os/current_os.rb +14 -0
  64. data/lib/picobox/os/darwin.rb +15 -0
  65. data/lib/picobox/os/linux.rb +9 -0
  66. data/lib/picobox/os/unsupported_os.rb +9 -0
  67. data/lib/picobox/project.rb +19 -0
  68. data/lib/picobox/service.rb +64 -0
  69. data/lib/picobox/services/installer.rb +41 -0
  70. data/lib/picobox/services/manifest.rb +50 -0
  71. data/lib/picobox/services/packages/elasticsearch/config.yml +14 -0
  72. data/lib/picobox/services/packages/memcached/config.yml +9 -0
  73. data/lib/picobox/services/packages/mongodb/config.yml +13 -0
  74. data/lib/picobox/services/packages/mysql/config.yml +17 -0
  75. data/lib/picobox/services/packages/postgres/config.yml +16 -0
  76. data/lib/picobox/services/packages/redis/config.yml +7 -0
  77. data/lib/picobox/shell/dot_profile.rb +42 -0
  78. data/lib/picobox/shell/dot_zshrc.rb +42 -0
  79. data/lib/picobox/shell/startup_script.rb +18 -0
  80. data/lib/picobox/system.rb +83 -0
  81. data/lib/picobox/templates/shell_extensions.bash +125 -0
  82. data/lib/picobox/utils/domain_event_publisher.rb +11 -0
  83. data/lib/picobox/utils/output.rb +69 -0
  84. data/lib/picobox/utils/progress_bar.rb +31 -0
  85. data/lib/picobox/utils/project.rb +55 -0
  86. data/lib/picobox/utils/shell.rb +18 -0
  87. data/lib/picobox/utils/visitable.rb +9 -0
  88. data/lib/picobox/utils/visitor_by_os.rb +29 -0
  89. data/lib/runner.rb +51 -0
  90. data/picobox.gemspec +49 -0
  91. 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,11 @@
1
+ module Picobox
2
+ module Utils
3
+ module DomainEventPublisher
4
+ include Wisper::Publisher
5
+
6
+ def publish_event(event_name, *event_params)
7
+ broadcast(event_name, *event_params)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -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,18 @@
1
+ module Picobox
2
+ module Utils
3
+ class Shell
4
+ def initialize(os)
5
+ @os = os
6
+ end
7
+
8
+
9
+ def reload
10
+ # hack to load newly set aliases into shell
11
+ os.reload_shell
12
+ end
13
+
14
+ private
15
+ attr_reader :os
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ module Picobox
2
+ module Utils
3
+ module Visitable
4
+ def accept visitor
5
+ visitor.visit(self)
6
+ end
7
+ end
8
+ end
9
+ 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
@@ -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