picobox 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
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,16 @@
1
+ module Picobox
2
+ module Commands
3
+ class ListServices < Picobox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ @os = subject.os
6
+
7
+ services = Services::Manifest.new(os).list
8
+
9
+ publish_event :list_services, services
10
+ end
11
+
12
+ private
13
+ attr_reader :os
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,26 @@
1
+ module Picobox
2
+ module Commands
3
+ class OpenShell < Picobox::Utils::VisitorByOs
4
+ def initialize(service)
5
+ @service = service
6
+ end
7
+
8
+ def visit_darwin subject
9
+ @os = subject.os
10
+
11
+ publish_event :opening_shell, service
12
+
13
+ raise Errors::ProjectNotInitialized unless project_initialized?
14
+ raise Errors::SystemDownError unless project_running?
15
+
16
+ system "bash", "-c", "docker-compose exec #{service} bash"
17
+ end
18
+
19
+ private
20
+ attr_reader :service, :os
21
+
22
+ def project_initialized?() Utils::Project.new(os).project_initialized? end
23
+ def project_running?() Utils::Project.new(os).running? end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ module Picobox
2
+ module Commands
3
+ class RemoveService < Picobox::Utils::VisitorByOs
4
+ def initialize(type)
5
+ @type = type
6
+ end
7
+
8
+ def visit_darwin subject
9
+ @os = subject.os
10
+ publish_event :remove_service_start, type
11
+
12
+ raise Errors::ProjectNotInitialized unless project_initialized?
13
+
14
+ Services::Installer.new(os).uninstall(type)
15
+
16
+ publish_event :remove_service_completed, type
17
+ end
18
+
19
+ private
20
+ attr_reader :os, :type
21
+
22
+ def project_initialized?() Utils::Project.new(os).project_initialized? end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,28 @@
1
+ module Picobox
2
+ module Commands
3
+ class RemoveSetupShell < Picobox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ @os = subject.os
6
+
7
+ publish_event :remove_shell_setup_start
8
+
9
+ delete_config_directory
10
+ uninstall_shell_extensions
11
+
12
+ publish_event :remove_shell_setup_complete
13
+ end
14
+
15
+ private
16
+ attr_reader :os
17
+
18
+ def delete_config_directory
19
+ TTY::File.remove_file os.config_dir, force: true
20
+ end
21
+
22
+ def uninstall_shell_extensions
23
+ script = Shell::StartupScript.get(os)
24
+ script.uninstall_extensions
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,21 @@
1
+ module Picobox
2
+ module Commands
3
+ class Restart < Picobox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ @os = subject.os
6
+
7
+ if project_running?
8
+ Picobox::CLI.new.stop
9
+ Picobox::CLI.new.start
10
+ else
11
+ Picobox::CLI.new.start
12
+ end
13
+ end
14
+
15
+ private
16
+ attr_reader :os
17
+
18
+ def project_running?() Utils::Project.new(os).running? end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module Picobox
2
+ module Commands
3
+ class SetupShell < Picobox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ @os = subject.os
6
+
7
+ publish_event :shell_setup_start
8
+
9
+ start_up_script = Shell::StartupScript.get(@os)
10
+
11
+ TTY::File.create_dir @os.config_dir
12
+
13
+ start_up_script.install_extensions
14
+
15
+ publish_event :shell_setup_complete
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ module Picobox
2
+ module Commands
3
+ class Start < Picobox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ @os = subject.os
6
+
7
+ publish_event :starting
8
+
9
+ raise Errors::ProjectNotInitialized unless project_initialized?
10
+
11
+ system('docker-compose up -d 2>/dev/null') unless project_running?
12
+ publish_event :started
13
+ end
14
+
15
+ private
16
+ attr_reader :os
17
+
18
+ def project_initialized?() Utils::Project.new(os).project_initialized? end
19
+ def project_running?() Utils::Project.new(os).running? end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,9 @@
1
+ module Picobox
2
+ module Commands
3
+ class StartInstall < Picobox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ publish_event :install_started
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ module Picobox
2
+ module Commands
3
+ class StartUninstall < Picobox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ @os = subject.os
6
+
7
+ raise Errors::PicoboxNotInstalled unless picobox_installed?
8
+
9
+ publish_event :uninstall_started
10
+ end
11
+
12
+ private
13
+ attr_reader :os
14
+
15
+ def picobox_installed?
16
+ File.exist? os.config_dir
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ module Picobox
2
+ module Commands
3
+ class Stop < Picobox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ @os = subject.os
6
+
7
+ publish_event :stopping
8
+
9
+ raise Errors::ProjectNotInitialized unless project_initialized?
10
+
11
+ system('docker-compose down 2>/dev/null') if project_running?
12
+
13
+
14
+ publish_event :stopped
15
+ end
16
+
17
+ private
18
+ attr_reader :os
19
+
20
+ def project_initialized?() Utils::Project.new(os).project_initialized? end
21
+ def project_running?() Utils::Project.new(os).running? end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ module Picobox
2
+ # names for files / directories
3
+ VERSION = '0.1.7'
4
+ HOMEPAGE = 'https://github.com/surzycki/picobox'
5
+ CONFIG_DIR = '.picobox'
6
+ PROJECT_INI = 'project.ini'
7
+ SHELL_EXTENSIONS = 'shell_extensions'
8
+
9
+ module_function
10
+ def root() File.expand_path('../../..', __FILE__) end
11
+ def template_dir() "#{Picobox.root}/lib/picobox/templates" end
12
+ def box_packages_dir() "#{Picobox.root}/lib/picobox/boxes/packages" end
13
+ def service_packages_dir() "#{Picobox.root}/lib/picobox/services/packages" end
14
+ end
@@ -0,0 +1,8 @@
1
+ module Picobox
2
+ #class Dns < Thor
3
+ # desc "command", "an example task"
4
+ # def command
5
+ # puts "I'm a thor task!"
6
+ # end
7
+ #end
8
+ end
@@ -0,0 +1,59 @@
1
+ module Picobox
2
+ module DockerCompose
3
+ class Config
4
+ def initialize(filename)
5
+ @config = YAML.load_file(filename)
6
+ @filename = filename
7
+ rescue SystemCallError
8
+ raise Picobox::Errors::FileNotFoundError, "could not open #{filename}"
9
+ end
10
+
11
+
12
+ def check!(type)
13
+ unless config['services'].keys.include? type
14
+ raise Picobox::Errors::ServiceNotInstalled
15
+ end
16
+ end
17
+
18
+
19
+ def add_service(service, links)
20
+ service_name = service.keys.first
21
+
22
+ services = config['services'].merge! service
23
+
24
+ links.each do |link|
25
+ existing_service = services[link]
26
+ if existing_service
27
+ existing_service['links'] = (existing_service['links'] || Array.new).push service_name
28
+ existing_service['links'].uniq!
29
+ end
30
+ end
31
+ end
32
+
33
+
34
+ def remove_service(service)
35
+ service_name = service.keys.first
36
+ services = config['services']
37
+
38
+ services.delete(service_name)
39
+
40
+ services.each_value do |service|
41
+ if service['links']
42
+ service['links'].delete(service_name)
43
+ service.delete('links') if service['links'].empty?
44
+ end
45
+ end
46
+ end
47
+
48
+
49
+ def save
50
+ File.open(filename,'w') do |h|
51
+ h.write config.to_yaml
52
+ end
53
+ end
54
+
55
+ private
56
+ attr_accessor :config, :filename, :package
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,15 @@
1
+ module Picobox
2
+ module Errors
3
+ class PicoboxError < StandardError; end
4
+ class UnknownError < PicoboxError; end
5
+ class BoxNotImplemented < PicoboxError; end
6
+ class ServiceNotImplemented < PicoboxError; end
7
+ class ServiceNotInstalled < PicoboxError; end
8
+ class ShellNotSupported < PicoboxError; end
9
+ class ProjectNotInitialized < PicoboxError; end
10
+ class SystemDownError < PicoboxError; end
11
+ class UnsupportedOsError < PicoboxError; end
12
+ class FileNotFoundError < PicoboxError; end
13
+ class PicoboxNotInstalled < PicoboxError; end
14
+ end
15
+ end
@@ -0,0 +1,142 @@
1
+ module Picobox
2
+ module Handlers
3
+ class StdoutHandler
4
+ include Utils::Output
5
+
6
+ def install_started
7
+ display_line ''
8
+ display_line 'INSTALL PICOBOX'
9
+ display_line '-------------------------------'
10
+ end
11
+
12
+ def install_complete
13
+ display_info 'Install Complete', :green
14
+ display_line '-------------------------------'
15
+ end
16
+
17
+ def post_install_messages
18
+ display_line ''
19
+ display_line 'You should reload open shells to pick up shell changes'
20
+ display_line ''
21
+ display_status 'opening', 'new shell'
22
+ display_line ''
23
+ end
24
+
25
+
26
+ def docker_present(version)
27
+ display_info("#{version.strip} present", :green)
28
+ end
29
+
30
+ def download_docker_start(size)
31
+ display_info('Downloading Docker', :green)
32
+ Utils::ProgressBar.new(size)
33
+ end
34
+
35
+ def download_docker_progress(progress)
36
+ Utils::ProgressBar.step(progress)
37
+ end
38
+
39
+ def download_docker_complete()
40
+ display_info('[green]Preparing to install Docker[/]')
41
+ end
42
+
43
+ def install_docker_start(size)
44
+ display_info('Installing Docker', :green)
45
+ Utils::ProgressBar.new(size)
46
+ end
47
+
48
+ def install_docker_progress
49
+ Utils::ProgressBar.increment
50
+ end
51
+
52
+ def install_docker_complete()
53
+ display_info('Installed Docker', :green)
54
+ end
55
+
56
+ def shell_setup_start
57
+ display_info('Setting up Shell', :green)
58
+ end
59
+
60
+ def remove_shell_setup_start
61
+ display_info('Removing shell extentions', :green)
62
+ end
63
+
64
+ def uninstall_started
65
+ display_line ''
66
+ display_line 'UNINSTALL PICOBOX'
67
+ display_line '-------------------------------'
68
+ end
69
+
70
+ def uninstall_complete
71
+ display_info('Uninstall Complete', :green)
72
+ display_line '-------------------------------'
73
+ end
74
+
75
+ def project_initialize_start
76
+ display_info('Initializing Project', :green)
77
+ end
78
+
79
+ def project_initialize_complete
80
+ display_info('Project Initialized', :green)
81
+ end
82
+
83
+ def add_box_start(type)
84
+ display_info("Adding #{type} box", :green)
85
+ end
86
+
87
+ def list_boxes(boxes)
88
+ display_info("Available boxes:", :green)
89
+
90
+ boxes.each do |box|
91
+ display_info(" #{box}")
92
+ end
93
+ end
94
+
95
+ def list_services(services)
96
+ display_info("Available services:", :green)
97
+
98
+ services.each do |service|
99
+ display_info(" #{service}")
100
+ end
101
+ end
102
+
103
+ def add_service_start(type)
104
+ display_info("Adding #{type} service", :green)
105
+ end
106
+
107
+ def add_service_completed(type)
108
+ display_info("Service #{type} added", :green)
109
+ end
110
+
111
+
112
+ def remove_service_start(type)
113
+ display_info("Removing #{type} service", :green)
114
+ end
115
+
116
+ def remove_service_completed(type)
117
+ display_info("Service #{type} removed", :green)
118
+ end
119
+
120
+ def stopping
121
+ display_info("Picobox stopping...", :green)
122
+ end
123
+
124
+ def stopped
125
+ display_info("Picobox stopped!", :green)
126
+ end
127
+
128
+ def starting
129
+ display_info("Picobox starting...", :green)
130
+ end
131
+
132
+ def started
133
+ display_info("Picobox started!", :green)
134
+ end
135
+
136
+ def opening_shell(service)
137
+ display_info("Getting shell", :green)
138
+ display_status('open', "Running \e[33m#{service}\e[0m shell", :green)
139
+ end
140
+ end
141
+ end
142
+ end