neptuno 1.0.0

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