neptuno 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/gem-push.yml +33 -0
  3. data/.github/workflows/main.yml +16 -0
  4. data/.gitignore +9 -0
  5. data/AUTHORS +8 -0
  6. data/CHANGELOG.md +5 -0
  7. data/CODE_OF_CONDUCT.md +84 -0
  8. data/Gemfile +12 -0
  9. data/Gemfile.lock +108 -0
  10. data/LICENSE +201 -0
  11. data/README.md +70 -0
  12. data/Rakefile +13 -0
  13. data/bin/console +15 -0
  14. data/bin/setup +8 -0
  15. data/docs/bg.png +0 -0
  16. data/docs/docs.css +22 -0
  17. data/docs/gh.png +0 -0
  18. data/docs/index.html +84 -0
  19. data/docs/logo.svg +1 -0
  20. data/docs/logo_shadow.svg +1 -0
  21. data/docs/rg.svg +7 -0
  22. data/docs/splash.png +0 -0
  23. data/exe/neptuno +8 -0
  24. data/lib/neptuno/cli/activate.rb +73 -0
  25. data/lib/neptuno/cli/base.rb +37 -0
  26. data/lib/neptuno/cli/configure.rb +19 -0
  27. data/lib/neptuno/cli/execute.rb +26 -0
  28. data/lib/neptuno/cli/init.rb +27 -0
  29. data/lib/neptuno/cli/install.rb +35 -0
  30. data/lib/neptuno/cli/list.rb +76 -0
  31. data/lib/neptuno/cli/version.rb +14 -0
  32. data/lib/neptuno/cli.rb +38 -0
  33. data/lib/neptuno/docker/attach.rb +20 -0
  34. data/lib/neptuno/docker/build.rb +19 -0
  35. data/lib/neptuno/docker/down.rb +23 -0
  36. data/lib/neptuno/docker/log.rb +17 -0
  37. data/lib/neptuno/docker/restart.rb +22 -0
  38. data/lib/neptuno/docker/services.rb +24 -0
  39. data/lib/neptuno/docker/up.rb +22 -0
  40. data/lib/neptuno/environment/config.rb +20 -0
  41. data/lib/neptuno/environment/update.rb +24 -0
  42. data/lib/neptuno/git/pull.rb +14 -0
  43. data/lib/neptuno/git/stash.rb +14 -0
  44. data/lib/neptuno/k8s/attach.rb +29 -0
  45. data/lib/neptuno/overmind/connect.rb +103 -0
  46. data/lib/neptuno/overmind/start.rb +74 -0
  47. data/lib/neptuno/overmind/stop.rb +22 -0
  48. data/lib/neptuno/services/add.rb +88 -0
  49. data/lib/neptuno/services/destroy.rb +14 -0
  50. data/lib/neptuno/services/list.rb +12 -0
  51. data/lib/neptuno/services/update.rb +38 -0
  52. data/lib/neptuno/templates/Dockerfile +0 -0
  53. data/lib/neptuno/templates/Procfile +0 -0
  54. data/lib/neptuno/templates/docker-compose.yml +7 -0
  55. data/lib/neptuno/templates/tmuxinator.yml +0 -0
  56. data/lib/neptuno/templates/ude.yml +0 -0
  57. data/lib/neptuno/tty/command.rb +24 -0
  58. data/lib/neptuno/tty/config.rb +27 -0
  59. data/lib/neptuno/tty/file.rb +40 -0
  60. data/lib/neptuno/tty/prompt.rb +14 -0
  61. data/lib/neptuno/tty/which.rb +14 -0
  62. data/lib/neptuno/version.rb +5 -0
  63. data/lib/neptuno.rb +19 -0
  64. data/neptuno.gemspec +46 -0
  65. metadata +278 -0
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Docker
5
+ # Build docker container for Neptuno project
6
+ class Up < Neptuno::CLI::Base
7
+ desc 'Docker: bring up docker containers for current project'
8
+
9
+ option :all, type: :boolean, default: false, desc: 'Run on all services'
10
+ option :log, type: :boolean, default: false, desc: 'Show service log (only first service)'
11
+ argument :services, type: :array, required: false, desc: 'Optional list of services'
12
+
13
+ def call(services: [], **options)
14
+ dd = config.fetch('docker_delimiter') || '-'
15
+ command_services_to('come up', all: options.fetch(:all), services_as_args: services) do |services, project|
16
+ system("cd #{neptuno_path} && docker compose up -d #{services.join(' ')}")
17
+ system("cd #{neptuno_path} && docker logs -f #{project}#{dd}#{services.first}#{dd}1") if options.fetch(:log)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Environment
5
+ # Build docker container for Neptuno project
6
+ class Config < Neptuno::CLI::Base
7
+ desc 'Environment: Configure local or remote'
8
+
9
+ argument :services, type: :array, required: false, desc: 'Optional list of services'
10
+
11
+ def call(services: [], **_options)
12
+ command_services_to('print', services_as_args: services) do |services|
13
+ services.each do |service|
14
+ puts service
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Environment
5
+ # Build docker container for Neptuno project
6
+ class Update < Neptuno::CLI::Base
7
+ desc 'Environment: Update all environment files'
8
+
9
+ def call
10
+ env_path = "#{neptuno_path}/environments/"
11
+ services.each do |service|
12
+ service_env_path = env_path + service
13
+ if File.exist?("#{service_env_path}/key") && File.exist?("#{service_env_path}/secrets.gpg")
14
+ system("cd #{service_env_path} && gpg --pinentry-mode loopback --passphrase-file key secrets.gpg")
15
+ system("cd #{service_env_path} && cat default secrets > local_env")
16
+ system("cd #{service_env_path} && rm secrets")
17
+ else
18
+ system("cd #{service_env_path} && ln -sf default local_env")
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Git
5
+ # Pull all submodule changes
6
+ class Pull < Neptuno::CLI::Base
7
+ desc 'Git: pull all submodule changes'
8
+
9
+ def call(services: [], **_options)
10
+ system('git submodule foreach git pull')
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Git
5
+ # Stash all submodule changes
6
+ class Stash < Neptuno::CLI::Base
7
+ desc 'Git: stash all submodule changes'
8
+
9
+ def call(services: [], **_options)
10
+ system('git submodule foreach git stash')
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module K8s
5
+ class Attach < Neptuno::CLI::Base
6
+ include ::Neptuno::TTY::Config
7
+ desc 'K8s: Attach to a container with k8s'
8
+
9
+ option :context, type: :string, default: 'int', desc: 'K8s context to run in'
10
+ option :namespace, type: :string, default: 'thrillshare', desc: 'K8s namespace to run in'
11
+ option :dependent, type: :string, desc: 'Dependent service'
12
+ option :pr, type: :integer, desc: "PR's Github ID"
13
+
14
+ def call(**options)
15
+ command_service_to('attach with k8s', service_as_args: options[:args]&.first) do |service, _project|
16
+ deployment = "deploy/#{options[:dependent] || service}"
17
+ deployment += "-#{service}-#{options[:pr]}" unless options[:pr].nil?
18
+
19
+ context = options[:context]
20
+ context = 'qa' unless options[:pr].nil?
21
+
22
+ system("kubectl config use-context #{context} > /dev/null 2>&1")
23
+ puts "Attaching to #{deployment} in the #{options[:namespace]} namespace using the #{context} context"
24
+ system("kubectl exec #{deployment} -n #{options[:namespace]} --stdin --tty -- /bin/sh")
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Overmind
5
+ # Build docker container for Neptuno project
6
+ class Connect < Neptuno::CLI::Base
7
+ include ::Neptuno::TTY::Config
8
+ desc 'Overmind: Connect to processes inside docker containers'
9
+
10
+ option :force, type: :boolean, default: false, desc: 'Try to connect disrigarding container status'
11
+ option :all, type: :boolean, default: false, desc: 'Run on all services'
12
+ option :up, type: :boolean, default: false, desc: 'Try to start containers before connecting'
13
+ option :tmux, type: :boolean, default: false, desc: 'Connect to services using Tmux'
14
+ option :tmux_sessions, type: :boolean, default: false, desc: 'Connect to services using Tmux'
15
+ argument :services, type: :array, required: false, desc: 'Optional list of services'
16
+
17
+ def call(services: [], **options)
18
+ dd = config.fetch('docker_delimiter') || '-'
19
+ multi_spinner = ::TTY::Spinner::Multi.new('[:spinner] Services')
20
+ spinners = {}
21
+ count = 0
22
+ command_services_to('connect to procs', all: options.fetch(:all), services_as_args: services) do |services|
23
+ system("cd #{neptuno_path} && docker-compose up -d #{services.join(' ')}") if options.fetch(:up)
24
+ running_services = ::Neptuno::CLI::List.new.running_services.first.keys
25
+ running_services.sort.each do |service|
26
+ spinners[service] ||= multi_spinner.register("[:spinner] :state #{service}")
27
+ spinners[service].update(state: '- ')
28
+ spinners[service].auto_spin
29
+ end
30
+ loop do
31
+ ps = `cd #{neptuno_path} && docker-compose ps`.split("\n").compact.select { |x| x.match(/^\s*#{project}/) }
32
+
33
+ running_services.sort.each do |service|
34
+ service_ps = ps.find { |s| s.include?(project.to_s) && s.include?("#{dd}#{service}#{dd}") }
35
+
36
+ status = :dead if service_ps.to_s.include?('exited')
37
+ status = :starting if service_ps.to_s.include?('starting')
38
+ status = :unhealthy if service_ps.to_s.include?('(unhealthy')
39
+ status = :healthy if service_ps.to_s.include?('(healthy')
40
+ status = :force if options.fetch(:force)
41
+
42
+ case status
43
+ when :force
44
+ spinners[service].success
45
+ `cd #{neptuno_path}/procfiles/#{service} && overmind start -D -N > /dev/null 2>&`
46
+ when :dead
47
+ spinners[service].update(state: 'dead ')
48
+ spinners[service].error
49
+ when :starting
50
+ spinners[service].update(state: 'starting ')
51
+ when :unhealthy
52
+ spinners[service].update(state: 'unhealthy ')
53
+ spinners[service].error if spinners[service].instance_variable_get(:@state) == :spinning && count > 50
54
+ when :healthy
55
+ spinners[service].update(state: 'ready ')
56
+ spinners[service].success
57
+ else
58
+ spinners[service].update(state: 'down ')
59
+ spinners[service].error
60
+ end
61
+ end
62
+ break if spinners.values.map { |s| s.instance_variable_get(:@state) }.uniq.all?(:stopped)
63
+
64
+ count += 1
65
+ sleep(5)
66
+ end
67
+ spinner = ::TTY::Spinner.new('Neptuno: Connecting[:spinner]', format: :dots)
68
+ spinner.auto_spin
69
+
70
+ healthy_services = spinners.select { |_k, v| v.instance_variable_get(:@succeeded) == :success }.keys
71
+ spinner.stop
72
+ if config.fetch('procfile_manager') == 'tmux'
73
+ healthy_services.each do |service|
74
+ pid = spawn("cd #{neptuno_path} && tmuxinator start neptuno_#{service} #{service} -n #{service}",
75
+ 3 => '/dev/null')
76
+ Process.detach(pid)
77
+ puts "Neptuno started tmux session for: #{service}"
78
+ end
79
+ else
80
+ spinners.select { |_k, v| v.instance_variable_get(:@succeeded) == :success }.each_key do |service|
81
+ system("cd #{neptuno_path}/procfiles/#{service} && overmind start -D -N > /dev/null 2>&1")
82
+ end
83
+ sleep(5)
84
+ spinner.stop
85
+ if options.fetch(:tmux)
86
+ system("cd #{neptuno_path} && tmuxinator start neptuno #{healthy_services.join(' ')}")
87
+ else
88
+ begin
89
+ system("cd #{neptuno_path}/procfiles/#{services.first} && overmind connect shell", exception: true)
90
+ rescue RuntimeError
91
+ puts 'sry'
92
+ system("cd #{neptuno_path} && docker compose exec #{service} kill -9 -1")
93
+ system("cd #{neptuno_path}/procfiles/#{service} && rm .overmind.sock > /dev/null 2>&1")
94
+ system("cd #{neptuno_path}/procfiles/#{service} && overmind start -D -N > /dev/null 2>&1")
95
+ retry
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Overmind
5
+ # Build docker container for Neptuno project
6
+ class Start < Neptuno::CLI::Base
7
+ include ::Neptuno::TTY::Config
8
+ desc 'Overmind: Start processes inside docker containers'
9
+
10
+ option :force, type: :boolean, default: false, desc: 'Try to start disrigarding container status'
11
+ option :all, type: :boolean, default: false, desc: 'Run on all services'
12
+ option :up, type: :boolean, default: false, desc: 'Try to start containers before connecting'
13
+ argument :services, type: :array, required: false, desc: 'Optional list of services'
14
+
15
+ def call(services: [], **options)
16
+ dd = config.fetch('docker_delimiter') || '-'
17
+ multi_spinner = ::TTY::Spinner::Multi.new('[:spinner] Services')
18
+ spinners = {}
19
+ count = 0
20
+ command_services_to('connect to procs', all: options.fetch(:all), services_as_args: services) do |services|
21
+ system("cd #{neptuno_path} && docker compose up -d #{services.join(' ')}") if options.fetch(:up)
22
+ running_services = ::Neptuno::CLI::List.new.running_services.first.keys
23
+ running_services.sort.each do |service|
24
+ spinners[service] ||= multi_spinner.register("[:spinner] :state #{service}")
25
+ spinners[service].update(state: '- ')
26
+ spinners[service].auto_spin
27
+ end
28
+ loop do
29
+ ps = `cd #{neptuno_path} && docker compose ps`.split("\n").compact.select { |x| x.match(/^\s*#{project}/) }
30
+
31
+ running_services.sort.each do |service|
32
+ service_ps = ps.find { |s| s.include?(project.to_s) && s.include?("#{dd}#{service}#{dd}") }
33
+
34
+ status = :dead if service_ps.to_s.include?('exited')
35
+ status = :starting if service_ps.to_s.include?('starting')
36
+ status = :unhealthy if service_ps.to_s.include?('(unhealthy')
37
+ status = :healthy if service_ps.to_s.include?('(healthy')
38
+ status = :force if options.fetch(:force)
39
+
40
+ case status
41
+ when :force
42
+ spinners[service].success
43
+ `cd #{neptuno_path}/procfiles/#{service} && overmind start -D -N > /dev/null 2>&1`
44
+ when :dead
45
+ spinners[service].update(state: 'dead ')
46
+ spinners[service].error
47
+ when :starting
48
+ spinners[service].update(state: 'starting ')
49
+ when :unhealthy
50
+ spinners[service].update(state: 'unhealthy ')
51
+ spinners[service].error if spinners[service].instance_variable_get(:@state) == :spinning && count > 50
52
+ when :healthy
53
+ spinners[service].update(state: 'ready ')
54
+ spinners[service].success
55
+ `cd #{neptuno_path}/procfiles/#{service} && overmind start -D -N > /dev/null 2>&1`
56
+ else
57
+ spinners[service].update(state: 'down ')
58
+ spinners[service].error
59
+ end
60
+ end
61
+ break if spinners.values.map { |s| s.instance_variable_get(:@state) }.uniq.all?(:stopped)
62
+
63
+ count += 1
64
+ sleep(5)
65
+ end
66
+ spinner = ::TTY::Spinner.new('Neptuno: Starting[:spinner]', format: :dots)
67
+ spinner.auto_spin
68
+
69
+ spinner.stop
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Overmind
5
+ # Build docker container for Neptuno project
6
+ class Stop < Neptuno::CLI::Base
7
+ desc 'Overmind: Stop processes inside docker containers'
8
+
9
+ option :all, type: :boolean, default: false, desc: 'Run on all services'
10
+ argument :services, type: :array, required: false, desc: 'Optional list of services'
11
+
12
+ def call(services: [], **options)
13
+ command_services_to('stop procs', all: options.fetch(:all), services_as_args: services) do |services|
14
+ services.each do |service|
15
+ system("cd #{neptuno_path} && docker compose exec #{service} kill -9 -1")
16
+ system("cd #{neptuno_path}/procfiles/#{service} && rm .overmind.sock > /dev/null 2>&1")
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Services
5
+ # Add project to neptuno
6
+ class Add < Neptuno::CLI::Base
7
+ include TTY::Prompt
8
+ include TTY::Config
9
+ include TTY::File
10
+
11
+ desc 'Add a Neptuno service with Git'
12
+
13
+ def call(**)
14
+ name = prompt.ask('? Service name:')
15
+ add_name_to_config(name)
16
+ repo = prompt.ask('? Git repo:')
17
+ clone_into_folder(repo, name)
18
+ add_dockerfile(name)
19
+ add_procfile(name)
20
+ add_environment(name)
21
+ add_service_to_dc(name)
22
+ end
23
+
24
+ def add_name_to_config(name)
25
+ config.append(name, to: :services) unless config.fetch(:services).include? name
26
+ config.write(force: true)
27
+ end
28
+
29
+ def clone_into_folder(repo, name)
30
+ if repo.nil?
31
+ command.run("mkdir #{neptuno_path}/services/#{name}")
32
+ else
33
+ command.run("cd #{neptuno_path} && git submodule add #{repo} ./services/#{name}")
34
+ end
35
+ end
36
+
37
+ def add_dockerfile(name)
38
+ file.create_file("#{neptuno_path}/dockerfiles/#{name}/Dockerfile")
39
+ file.create_file("#{neptuno_path}/dockerfiles/#{name}/entrypoint.sh")
40
+ end
41
+
42
+ def add_procfile(name)
43
+ file.create_file("#{neptuno_path}/procfiles/#{name}/Procfile")
44
+ end
45
+
46
+ def add_environment(name)
47
+ file.create_file("#{neptuno_path}/environments/#{name}/default")
48
+ end
49
+
50
+ def add_service_to_dc(name)
51
+ puts(<<~EOT)
52
+ #---------------------------------------------------------------
53
+ # Registered #{name} as a service. You can now add it to the docker-compose.yml:
54
+ #---------------------------------------------------------------
55
+
56
+ version: '3'
57
+ services:
58
+ ##########################
59
+ # #{name}
60
+ ##########################
61
+ #{name}:
62
+ stdin_open: true
63
+ tty: true
64
+ command: ash
65
+ build:#{' '}
66
+ context: .
67
+ dockerfile: ./dockerfiles/#{name}/Dockerfile
68
+ env_file:#{' '}
69
+ - ./environments/#{name}/default
70
+ # volumes:#{' '}
71
+ # -
72
+ # ports:#{' '}
73
+ # -
74
+ # depends_on:#{' '}
75
+ # -
76
+
77
+ #---------------------------------------------------------------
78
+ # Next steps
79
+ #---------------------------------------------------------------
80
+
81
+ Add the service's Dockerfile at ./dockerfiles/#{name}/Dockerfile
82
+ Add the service's Environments at ./environments/#{name}/default
83
+ Add the service's Procfile at ./procfiles/#{name}/Procfile
84
+ EOT
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Services
5
+ # Add project to neptuno
6
+ class Destroy < Neptuno::CLI::Base
7
+ desc 'Remove a Neptuno service'
8
+
9
+ def call(**)
10
+ puts destroy
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Services
5
+ # Add project to neptuno
6
+ class List < Neptuno::CLI::Base
7
+ desc 'List Neptuno projects'
8
+
9
+ def call(**); end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Services
5
+ # Update project to to latest GH master/main
6
+ class Update < Neptuno::CLI::Base
7
+ desc 'Stashes changes and pulls latest from main/master'
8
+
9
+ option :all, type: :boolean, default: false, desc: 'Run on all services'
10
+ option :main, type: :boolean, default: false,
11
+ desc: "Keep service on main/master after pull. Uncommited changes are stashed as 'neptuno_stash'"
12
+ argument :services, type: :array, required: false, desc: 'Optional list of services'
13
+
14
+ def call(services: [], **options)
15
+ command_services_to('update', all: options.fetch(:all), services_as_args: services) do |services|
16
+ services.each do |service|
17
+ puts "---Updating #{service}---"
18
+ current_branch = `git branch --show-current`
19
+ puts current_branch
20
+ system("cd #{neptuno_path}/services/#{service} 2>/dev/null && git stash save -u -q neptuno_stash")
21
+ `cd #{neptuno_path}/services/#{service} 2>/dev/null && git checkout main 2>/dev/null`
22
+ `cd #{neptuno_path}/services/#{service} 2>/dev/null && git checkout master 2>/dev/null`
23
+ system("cd #{neptuno_path}/services/#{service} 2>/dev/null && git pull")
24
+ unless options.fetch(:main)
25
+ stash_id = `git stash list`.lines.find { |str| str =~ /neptuno_stash/ }&.split(':')&.first
26
+ `cd #{neptuno_path}/services/#{service} 2>/dev/null && git checkout #{current_branch} 2>/dev/null`
27
+ if stash_id
28
+ puts 'Applying stashed changes'
29
+ system("cd #{neptuno_path}/services/#{service} 2>/dev/null && git stash pop -q #{stash_id}")
30
+ end
31
+ end
32
+ puts ''
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
File without changes
File without changes
@@ -0,0 +1,7 @@
1
+ version: '3'
2
+ services:
3
+ alpine:
4
+ image: alpine
5
+ tty: true
6
+ stdin_open: true
7
+ command: ash
File without changes
File without changes
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module TTY
5
+ # Wrapper class for TTY gem
6
+ module Command
7
+ include TTY::Config
8
+ TTY = ::TTY::Command.new(printer: :null)
9
+ TTYP = ::TTY::Command.new(printer: :pretty)
10
+
11
+ def command
12
+ TTY
13
+ end
14
+
15
+ def command_p
16
+ TTYP
17
+ end
18
+
19
+ def neptuno_command(command)
20
+ `cd #{neptuno_path} && #{command}`
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module TTY
5
+ # Wrapper class for TTY gem
6
+ module Config
7
+ TTY = ::TTY::Config.new
8
+ TTY.filename = 'neptuno'
9
+
10
+ ABORT_MESSAGE = 'fatal: there are no registered services. Add one with: neptuno services add'
11
+
12
+ def config
13
+ TTY
14
+ end
15
+
16
+ def services
17
+ s = config.fetch('services')
18
+ abort ABORT_MESSAGE if s.count.zero?
19
+ s.sort
20
+ end
21
+
22
+ def configured_services
23
+ config.fetch('configured_services')
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module TTY
5
+ # Wrapper class for TTY gem
6
+ module File
7
+ TTY = ::TTY::File
8
+ ABORT_MESSAGE = 'fatal: not a Neptuno repository (or any of the parent directories)'
9
+
10
+ def file
11
+ TTY
12
+ end
13
+
14
+ # define path helpers
15
+ def project
16
+ neptuno_path.split('/').last
17
+ end
18
+
19
+ def in_service?
20
+ Dir.pwd.include?("#{neptuno_path}/services/")
21
+ end
22
+
23
+ def service
24
+ ENV['PWD'].match(%r{services/([^/]*)})&.captures&.first
25
+ end
26
+
27
+ def neptuno_path
28
+ return @base_path if @base_path
29
+
30
+ pwd = Dir.pwd
31
+ loop do
32
+ return pwd if pwd == ''
33
+ return @base_path = pwd if Dir.children(pwd).include?('neptuno.yml')
34
+
35
+ pwd = pwd.split('/')[0..-2].join('/')
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module TTY
5
+ # Wrapper class for TTY gem
6
+ module Prompt
7
+ TTY = ::TTY::Prompt.new
8
+
9
+ def prompt
10
+ TTY
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module TTY
5
+ # Wrapper class for TTY gem
6
+ module Which
7
+ TTY = ::TTY::Which
8
+
9
+ def which(args)
10
+ TTY.which(args)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ VERSION = '1.0.0'
5
+ end
data/lib/neptuno.rb ADDED
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'zeitwerk'
4
+ require 'tty-config'
5
+ require 'tty-command'
6
+ require 'tty-which'
7
+ require 'tty-file'
8
+ require 'tty-spinner'
9
+ require 'hirb'
10
+ require 'dotiw'
11
+
12
+ loader = Zeitwerk::Loader.for_gem
13
+ loader.inflector.inflect('neptuno' => 'Neptuno')
14
+ loader.inflector.inflect('cli' => 'CLI')
15
+ loader.inflector.inflect('tty' => 'TTY')
16
+ loader.setup
17
+
18
+ module Neptuno
19
+ end