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