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
data/docs/index.html ADDED
@@ -0,0 +1,84 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
7
+ <link rel="stylesheet" href="docs.css">
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link href="https://fonts.googleapis.com/css2?family=Audiowide&display=swap" rel="stylesheet">
11
+ </head>
12
+ <body>
13
+
14
+ <!-- This example requires Tailwind CSS v2.0+ -->
15
+ <nav>
16
+ <div class="max-w-7xl mx-auto px-2 sm:px-6 lg:px-8">
17
+ <div class="relative flex items-center justify-between h-16">
18
+ <div class="absolute inset-y-0 left-0 flex items-center sm:hidden">
19
+ <!-- Mobile menu button-->
20
+ <button type="button" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white" aria-controls="mobile-menu" aria-expanded="false">
21
+ <span class="sr-only">Open main menu</span>
22
+ <svg class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
23
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
24
+ </svg>
25
+ </button>
26
+ </div>
27
+ <div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start">
28
+ <div class="flex-shrink-0 items-center hidden md:flex">
29
+ <img class="lg:block h-9 w-auto" src="./logo.svg" alt="Neptuno">
30
+ <span id="logo" class="text-white py-2 text-sm font-thin text-blue-300">Neptuno</span>
31
+ </div>
32
+ <div class="hidden sm:block sm:ml-6">
33
+ <div class="flex space-x-4">
34
+ <a href="#" class="bg-gray-900 text-white px-3 py-2 rounded-md text-sm font-medium" aria-current="page">Home</a>
35
+ <a href="#" class="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Features</a>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ <div class="flex">
40
+ <button type="button" class="bg-gray-800 rounded-full mr-2">
41
+ <span class="sr-only">Ruby Gems</span>
42
+ <img class="h-6 w-8" src="./rg.svg" alt="Ruby Gems">
43
+ </button>
44
+
45
+ <button type="button" class="bg-gray-800 flex text-sm rounded-full">
46
+ <span class="sr-only">Open user menu</span>
47
+ <img class="h-8 w-8" src="./gh.png" alt="Github">
48
+ </button>
49
+ </div>
50
+ </div>
51
+ </div>
52
+
53
+ <!-- Mobile menu, show/hide based on menu state. -->
54
+ <div class="sm:hidden" id="mobile-menu">
55
+ <div class="px-2 pt-2 pb-3 space-y-1"> </div>
56
+ </div>
57
+ </nav>
58
+
59
+
60
+ <main class="sm:mt-24">
61
+ <div class="mx-auto max-w-7xl">
62
+ <div class="lg:grid lg:grid-cols-12 lg:gap-8">
63
+ <div class="px-4 sm:px-6 sm:text-center md:max-w-2xl md:mx-auto lg:col-span-6 lg:text-left lg:flex lg:items-center">
64
+ <div>
65
+ <h1 class="mb-10 sm:mb-0 text-center lg:text-left text-4xl tracking-tight font-extrabold text-white sm:mt-5 sm:leading-none lg:mt-6 lg:text-5xl xl:text-5xl">
66
+ <div class="flex items-center justify-center lg:justify-start">
67
+ <img class="lg:block h-20 w-auto" src="./logo.svg" alt="Neptuno">
68
+ <span class="md:block text-blue-300 logo font-thin"> Neptuno </span>
69
+ </div>
70
+ <span class="md:block">environment as code</span>
71
+ </h1>
72
+ <p class="mt-3 text-base text-white sm:mt-5 sm:text-xl lg:text-lg xl:text-xl">
73
+ Neptuno is an "environment as code" framework; which aims to be opinionated enough to get you going fast, and customizable enough to run just the way you work.
74
+ </p>
75
+ </div>
76
+ </div>
77
+ <div class="hidden lg:block mt-16 sm:mt-24 lg:mt-0 lg:col-span-6">
78
+ <img class="object-contain" src="./splash.png" />
79
+ </div>
80
+ </div>
81
+ </div>
82
+ </main>
83
+ </body>
84
+ </html>
data/docs/logo.svg ADDED
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" width="375pt" zoomAndPan="magnify" contentStyleType="text/css" viewBox="115 112 150 150" height="374.999991pt" preserveAspectRatio="xMidYMid meet" version="1.2"><defs><clipPath xml:id="clip1" id="clip1"><path d="M 127.59375 112.726562 L 189.09375 112.726562 L 189.09375 262.289062 L 127.59375 262.289062 Z M 127.59375 112.726562 "/></clipPath><clipPath xml:id="clip2" id="clip2"><path d="M 188.285156 112.726562 L 247.535156 112.726562 L 247.535156 262.289062 L 188.285156 262.289062 Z M 188.285156 112.726562 "/></clipPath></defs><g xml:id="surface1" id="surface1" ><g clip-rule="nonzero" clip-path="url(#clip1)"><path style=" stroke:none;fill-rule:evenodd;fill:rgb(255,255,255);fill-opacity:1;" d="M 191.261719 262.289062 L 191.511719 261.765625 L 191.152344 261.765625 Z M 201.570312 240.71875 L 217.582031 231.492188 C 225.292969 227.046875 233 222.605469 240.710938 218.15625 C 244.6875 215.867188 247.578125 210.738281 247.578125 206.167969 L 247.578125 179.617188 C 247.578125 170.726562 247.578125 161.839844 247.578125 152.953125 C 247.578125 148.367188 244.574219 143.304688 240.609375 141.015625 L 217.582031 127.742188 C 209.871094 123.300781 202.164062 118.855469 194.453125 114.410156 C 190.472656 112.117188 184.582031 112.183594 180.617188 114.46875 L 157.589844 127.742188 C 149.878906 132.1875 142.171875 136.628906 134.460938 141.078125 C 130.484375 143.367188 127.59375 148.496094 127.59375 153.070312 L 127.59375 179.617188 C 127.59375 188.507812 127.59375 197.394531 127.59375 206.28125 C 127.59375 210.867188 130.59375 215.929688 134.5625 218.21875 L 157.589844 231.492188 C 165.300781 235.933594 173.007812 240.378906 180.71875 244.824219 C 181.371094 245.199219 182.078125 245.515625 182.820312 245.761719 C 182.992188 241.523438 183.164062 237.363281 183.324219 233.78125 C 183.457031 230.75 183.902344 230.164062 180.746094 229.085938 C 179.621094 228.703125 178.796875 227.714844 178.796875 226.476562 C 178.796875 224.949219 180.046875 223.703125 181.574219 223.703125 C 185.582031 223.703125 189.585938 223.703125 193.59375 223.703125 C 195.125 223.703125 196.375 224.949219 196.375 226.476562 C 196.375 227.714844 195.546875 228.703125 194.421875 229.085938 C 191.269531 230.164062 191.710938 230.75 191.847656 233.78125 C 191.929688 235.574219 192.011719 237.511719 192.097656 239.53125 L 192.105469 239.707031 L 192.109375 239.824219 L 192.128906 240.277344 L 192.132812 240.417969 L 192.15625 241.015625 L 192.160156 241.042969 L 192.207031 242.207031 L 192.207031 242.222656 L 192.238281 242.984375 L 192.246094 243.132812 L 192.246094 243.183594 L 192.296875 244.355469 L 192.296875 244.363281 L 192.328125 245.15625 L 192.332031 245.28125 L 192.335938 245.351562 L 192.34375 245.550781 L 192.347656 245.589844 L 192.351562 245.746094 C 192.535156 250.226562 192.71875 254.792969 192.902344 258.859375 Z M 193.199219 221.769531 C 193.25 213.421875 204.167969 214.371094 210.507812 209.269531 C 214.917969 205.71875 215.527344 199.933594 215.089844 194.664062 C 214.796875 191.175781 213.875 187.066406 212.246094 181.839844 C 209.984375 174.578125 211.457031 171.40625 211.457031 171.40625 C 212.394531 176.78125 218.386719 178.667969 218.386719 178.667969 C 213.863281 170.371094 216.617188 154.734375 216.617188 154.734375 C 207.21875 162.140625 205.621094 171.917969 207.992188 182.84375 C 209.40625 189.398438 211.40625 196.21875 208.753906 200.585938 C 204.167969 208.128906 189.773438 211.707031 189.773438 194.59375 L 189.773438 171.914062 C 189.773438 165.714844 190.199219 162.027344 197.289062 165.777344 L 187.585938 148.441406 L 177.882812 165.777344 C 184.972656 162.027344 185.398438 165.714844 185.394531 171.914062 L 185.394531 194.59375 C 185.394531 211.707031 171.003906 208.128906 166.417969 200.585938 C 163.765625 196.21875 165.761719 189.398438 167.183594 182.84375 C 169.550781 171.917969 167.949219 162.140625 158.550781 154.734375 C 158.550781 154.734375 161.304688 170.371094 156.785156 178.667969 C 156.785156 178.667969 162.777344 176.78125 163.714844 171.40625 C 163.714844 171.40625 165.1875 174.578125 162.921875 181.839844 C 161.296875 187.066406 160.375 191.175781 160.082031 194.664062 C 159.644531 199.933594 160.253906 205.71875 164.664062 209.269531 C 171.003906 214.371094 181.921875 213.421875 181.972656 221.769531 L 193.199219 221.769531 "/></g><g clip-rule="nonzero" clip-path="url(#clip2)"><path style=" stroke:none;fill-rule:evenodd;fill:rgb(255,255,255);fill-opacity:1;" d="M 191.261719 262.289062 L 191.511719 261.765625 L 191.152344 261.765625 Z M 201.570312 240.71875 L 217.582031 231.492188 C 225.292969 227.046875 233 222.605469 240.710938 218.15625 C 244.6875 215.867188 247.578125 210.738281 247.578125 206.167969 L 247.578125 179.617188 C 247.578125 170.726562 247.578125 161.839844 247.578125 152.953125 C 247.578125 148.367188 244.574219 143.304688 240.609375 141.015625 L 217.582031 127.742188 C 209.871094 123.300781 202.164062 118.855469 194.453125 114.410156 C 190.472656 112.117188 184.582031 112.183594 180.617188 114.46875 L 157.589844 127.742188 C 149.878906 132.1875 142.171875 136.628906 134.460938 141.078125 C 130.484375 143.367188 127.59375 148.496094 127.59375 153.070312 L 127.59375 179.617188 C 127.59375 188.507812 127.59375 197.394531 127.59375 206.28125 C 127.59375 210.867188 130.59375 215.929688 134.5625 218.21875 L 157.589844 231.492188 C 165.300781 235.933594 173.007812 240.378906 180.71875 244.824219 C 181.371094 245.199219 182.078125 245.515625 182.820312 245.761719 C 182.992188 241.523438 183.164062 237.363281 183.324219 233.78125 C 183.457031 230.75 183.902344 230.164062 180.746094 229.085938 C 179.621094 228.703125 178.796875 227.714844 178.796875 226.476562 C 178.796875 224.949219 180.046875 223.703125 181.574219 223.703125 C 185.582031 223.703125 189.585938 223.703125 193.59375 223.703125 C 195.125 223.703125 196.375 224.949219 196.375 226.476562 C 196.375 227.714844 195.546875 228.703125 194.421875 229.085938 C 191.269531 230.164062 191.710938 230.75 191.847656 233.78125 C 191.929688 235.574219 192.011719 237.511719 192.097656 239.53125 L 192.105469 239.707031 L 192.109375 239.824219 L 192.128906 240.277344 L 192.132812 240.417969 L 192.15625 241.015625 L 192.160156 241.042969 L 192.207031 242.207031 L 192.207031 242.222656 L 192.238281 242.984375 L 192.246094 243.132812 L 192.246094 243.183594 L 192.296875 244.355469 L 192.296875 244.363281 L 192.328125 245.15625 L 192.332031 245.28125 L 192.335938 245.351562 L 192.34375 245.550781 L 192.347656 245.589844 L 192.351562 245.746094 C 192.535156 250.226562 192.71875 254.792969 192.902344 258.859375 Z M 193.199219 221.769531 C 193.25 213.421875 204.167969 214.371094 210.507812 209.269531 C 214.917969 205.71875 215.527344 199.933594 215.089844 194.664062 C 214.796875 191.175781 213.875 187.066406 212.246094 181.839844 C 209.984375 174.578125 211.457031 171.40625 211.457031 171.40625 C 212.394531 176.78125 218.386719 178.667969 218.386719 178.667969 C 213.863281 170.371094 216.617188 154.734375 216.617188 154.734375 C 207.21875 162.140625 205.621094 171.917969 207.992188 182.84375 C 209.40625 189.398438 211.40625 196.21875 208.753906 200.585938 C 204.167969 208.128906 189.773438 211.707031 189.773438 194.59375 L 189.773438 171.914062 C 189.773438 165.714844 190.199219 162.027344 197.289062 165.777344 L 187.585938 148.441406 L 177.882812 165.777344 C 184.972656 162.027344 185.398438 165.714844 185.394531 171.914062 L 185.394531 194.59375 C 185.394531 211.707031 171.003906 208.128906 166.417969 200.585938 C 163.765625 196.21875 165.761719 189.398438 167.183594 182.84375 C 169.550781 171.917969 167.949219 162.140625 158.550781 154.734375 C 158.550781 154.734375 161.304688 170.371094 156.785156 178.667969 C 156.785156 178.667969 162.777344 176.78125 163.714844 171.40625 C 163.714844 171.40625 165.1875 174.578125 162.921875 181.839844 C 161.296875 187.066406 160.375 191.175781 160.082031 194.664062 C 159.644531 199.933594 160.253906 205.71875 164.664062 209.269531 C 171.003906 214.371094 181.921875 213.421875 181.972656 221.769531 L 193.199219 221.769531 "/></g></g></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" width="375pt" zoomAndPan="magnify" contentStyleType="text/css" viewBox="115 112 150 150" height="374.999991pt" preserveAspectRatio="xMidYMid meet" version="1.2"><defs><clipPath xml:id="clip1" id="clip1" ><path d="M 127.59375 112.726562 L 189.09375 112.726562 L 189.09375 262.289062 L 127.59375 262.289062 Z M 127.59375 112.726562 "/></clipPath><clipPath xml:id="clip2" id="clip2"><path d="M 188.285156 112.726562 L 247.535156 112.726562 L 247.535156 262.289062 L 188.285156 262.289062 Z M 188.285156 112.726562 "/></clipPath></defs><g xml:id="surface1" id="surface1" style="filter: drop-shadow(1px 1px 0px black) drop-shadow(2px 2px 2px black);"><g clip-rule="nonzero" clip-path="url(#clip1)"><path style=" stroke:none;fill-rule:evenodd;fill:rgb(255,255,255);fill-opacity:1;" d="M 191.261719 262.289062 L 191.511719 261.765625 L 191.152344 261.765625 Z M 201.570312 240.71875 L 217.582031 231.492188 C 225.292969 227.046875 233 222.605469 240.710938 218.15625 C 244.6875 215.867188 247.578125 210.738281 247.578125 206.167969 L 247.578125 179.617188 C 247.578125 170.726562 247.578125 161.839844 247.578125 152.953125 C 247.578125 148.367188 244.574219 143.304688 240.609375 141.015625 L 217.582031 127.742188 C 209.871094 123.300781 202.164062 118.855469 194.453125 114.410156 C 190.472656 112.117188 184.582031 112.183594 180.617188 114.46875 L 157.589844 127.742188 C 149.878906 132.1875 142.171875 136.628906 134.460938 141.078125 C 130.484375 143.367188 127.59375 148.496094 127.59375 153.070312 L 127.59375 179.617188 C 127.59375 188.507812 127.59375 197.394531 127.59375 206.28125 C 127.59375 210.867188 130.59375 215.929688 134.5625 218.21875 L 157.589844 231.492188 C 165.300781 235.933594 173.007812 240.378906 180.71875 244.824219 C 181.371094 245.199219 182.078125 245.515625 182.820312 245.761719 C 182.992188 241.523438 183.164062 237.363281 183.324219 233.78125 C 183.457031 230.75 183.902344 230.164062 180.746094 229.085938 C 179.621094 228.703125 178.796875 227.714844 178.796875 226.476562 C 178.796875 224.949219 180.046875 223.703125 181.574219 223.703125 C 185.582031 223.703125 189.585938 223.703125 193.59375 223.703125 C 195.125 223.703125 196.375 224.949219 196.375 226.476562 C 196.375 227.714844 195.546875 228.703125 194.421875 229.085938 C 191.269531 230.164062 191.710938 230.75 191.847656 233.78125 C 191.929688 235.574219 192.011719 237.511719 192.097656 239.53125 L 192.105469 239.707031 L 192.109375 239.824219 L 192.128906 240.277344 L 192.132812 240.417969 L 192.15625 241.015625 L 192.160156 241.042969 L 192.207031 242.207031 L 192.207031 242.222656 L 192.238281 242.984375 L 192.246094 243.132812 L 192.246094 243.183594 L 192.296875 244.355469 L 192.296875 244.363281 L 192.328125 245.15625 L 192.332031 245.28125 L 192.335938 245.351562 L 192.34375 245.550781 L 192.347656 245.589844 L 192.351562 245.746094 C 192.535156 250.226562 192.71875 254.792969 192.902344 258.859375 Z M 193.199219 221.769531 C 193.25 213.421875 204.167969 214.371094 210.507812 209.269531 C 214.917969 205.71875 215.527344 199.933594 215.089844 194.664062 C 214.796875 191.175781 213.875 187.066406 212.246094 181.839844 C 209.984375 174.578125 211.457031 171.40625 211.457031 171.40625 C 212.394531 176.78125 218.386719 178.667969 218.386719 178.667969 C 213.863281 170.371094 216.617188 154.734375 216.617188 154.734375 C 207.21875 162.140625 205.621094 171.917969 207.992188 182.84375 C 209.40625 189.398438 211.40625 196.21875 208.753906 200.585938 C 204.167969 208.128906 189.773438 211.707031 189.773438 194.59375 L 189.773438 171.914062 C 189.773438 165.714844 190.199219 162.027344 197.289062 165.777344 L 187.585938 148.441406 L 177.882812 165.777344 C 184.972656 162.027344 185.398438 165.714844 185.394531 171.914062 L 185.394531 194.59375 C 185.394531 211.707031 171.003906 208.128906 166.417969 200.585938 C 163.765625 196.21875 165.761719 189.398438 167.183594 182.84375 C 169.550781 171.917969 167.949219 162.140625 158.550781 154.734375 C 158.550781 154.734375 161.304688 170.371094 156.785156 178.667969 C 156.785156 178.667969 162.777344 176.78125 163.714844 171.40625 C 163.714844 171.40625 165.1875 174.578125 162.921875 181.839844 C 161.296875 187.066406 160.375 191.175781 160.082031 194.664062 C 159.644531 199.933594 160.253906 205.71875 164.664062 209.269531 C 171.003906 214.371094 181.921875 213.421875 181.972656 221.769531 L 193.199219 221.769531 "/></g><g clip-rule="nonzero" clip-path="url(#clip2)"><path style=" stroke:none;fill-rule:evenodd;fill:rgb(255,255,255);fill-opacity:1;" d="M 191.261719 262.289062 L 191.511719 261.765625 L 191.152344 261.765625 Z M 201.570312 240.71875 L 217.582031 231.492188 C 225.292969 227.046875 233 222.605469 240.710938 218.15625 C 244.6875 215.867188 247.578125 210.738281 247.578125 206.167969 L 247.578125 179.617188 C 247.578125 170.726562 247.578125 161.839844 247.578125 152.953125 C 247.578125 148.367188 244.574219 143.304688 240.609375 141.015625 L 217.582031 127.742188 C 209.871094 123.300781 202.164062 118.855469 194.453125 114.410156 C 190.472656 112.117188 184.582031 112.183594 180.617188 114.46875 L 157.589844 127.742188 C 149.878906 132.1875 142.171875 136.628906 134.460938 141.078125 C 130.484375 143.367188 127.59375 148.496094 127.59375 153.070312 L 127.59375 179.617188 C 127.59375 188.507812 127.59375 197.394531 127.59375 206.28125 C 127.59375 210.867188 130.59375 215.929688 134.5625 218.21875 L 157.589844 231.492188 C 165.300781 235.933594 173.007812 240.378906 180.71875 244.824219 C 181.371094 245.199219 182.078125 245.515625 182.820312 245.761719 C 182.992188 241.523438 183.164062 237.363281 183.324219 233.78125 C 183.457031 230.75 183.902344 230.164062 180.746094 229.085938 C 179.621094 228.703125 178.796875 227.714844 178.796875 226.476562 C 178.796875 224.949219 180.046875 223.703125 181.574219 223.703125 C 185.582031 223.703125 189.585938 223.703125 193.59375 223.703125 C 195.125 223.703125 196.375 224.949219 196.375 226.476562 C 196.375 227.714844 195.546875 228.703125 194.421875 229.085938 C 191.269531 230.164062 191.710938 230.75 191.847656 233.78125 C 191.929688 235.574219 192.011719 237.511719 192.097656 239.53125 L 192.105469 239.707031 L 192.109375 239.824219 L 192.128906 240.277344 L 192.132812 240.417969 L 192.15625 241.015625 L 192.160156 241.042969 L 192.207031 242.207031 L 192.207031 242.222656 L 192.238281 242.984375 L 192.246094 243.132812 L 192.246094 243.183594 L 192.296875 244.355469 L 192.296875 244.363281 L 192.328125 245.15625 L 192.332031 245.28125 L 192.335938 245.351562 L 192.34375 245.550781 L 192.347656 245.589844 L 192.351562 245.746094 C 192.535156 250.226562 192.71875 254.792969 192.902344 258.859375 Z M 193.199219 221.769531 C 193.25 213.421875 204.167969 214.371094 210.507812 209.269531 C 214.917969 205.71875 215.527344 199.933594 215.089844 194.664062 C 214.796875 191.175781 213.875 187.066406 212.246094 181.839844 C 209.984375 174.578125 211.457031 171.40625 211.457031 171.40625 C 212.394531 176.78125 218.386719 178.667969 218.386719 178.667969 C 213.863281 170.371094 216.617188 154.734375 216.617188 154.734375 C 207.21875 162.140625 205.621094 171.917969 207.992188 182.84375 C 209.40625 189.398438 211.40625 196.21875 208.753906 200.585938 C 204.167969 208.128906 189.773438 211.707031 189.773438 194.59375 L 189.773438 171.914062 C 189.773438 165.714844 190.199219 162.027344 197.289062 165.777344 L 187.585938 148.441406 L 177.882812 165.777344 C 184.972656 162.027344 185.398438 165.714844 185.394531 171.914062 L 185.394531 194.59375 C 185.394531 211.707031 171.003906 208.128906 166.417969 200.585938 C 163.765625 196.21875 165.761719 189.398438 167.183594 182.84375 C 169.550781 171.917969 167.949219 162.140625 158.550781 154.734375 C 158.550781 154.734375 161.304688 170.371094 156.785156 178.667969 C 156.785156 178.667969 162.777344 176.78125 163.714844 171.40625 C 163.714844 171.40625 165.1875 174.578125 162.921875 181.839844 C 161.296875 187.066406 160.375 191.175781 160.082031 194.664062 C 159.644531 199.933594 160.253906 205.71875 164.664062 209.269531 C 171.003906 214.371094 181.921875 213.421875 181.972656 221.769531 L 193.199219 221.769531 "/></g></g></svg>
data/docs/rg.svg ADDED
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <svg width="256px" height="293px" viewBox="0 0 256 293" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
3
+ <g fill="#D34231">
4
+ <path d="M76.7478977,97.4337652 L76.585237,97.2711045 L40.4745594,133.381782 L128.148682,220.893244 L164.25936,184.945227 L215.822805,133.381782 L179.712127,97.2711045 L179.712127,97.1084438 L76.585237,97.1084438 L76.7478977,97.4337652 Z"></path>
5
+ <path d="M127.823361,0.975964259 L0.1347034,74.1732837 L0.1347034,220.567923 L127.823361,293.765242 L255.512018,220.567923 L255.512018,74.1732837 L127.823361,0.975964259 L127.823361,0.975964259 Z M231.112911,206.579102 L127.823361,266.112921 L24.5338099,206.579102 L24.5338099,87.8367833 L127.823361,28.3029635 L231.112911,87.8367833 L231.112911,206.579102 L231.112911,206.579102 Z"></path>
6
+ </g>
7
+ </svg>
data/docs/splash.png ADDED
Binary file
data/exe/neptuno ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # require "bundler/setup"
5
+ require 'neptuno'
6
+
7
+ cli = Neptuno::CLI
8
+ Dry::CLI.new(cli).call
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module CLI
5
+ # Init Neptuno files
6
+ class Activate < Neptuno::CLI::Base
7
+ include ::Neptuno::TTY::Config
8
+ desc 'Bring services containers up and start their processes'
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
+ argument :services, type: :array, required: false, desc: 'Optional list of services'
13
+
14
+ def call(services: [], **options)
15
+ dd = config.fetch('docker_delimiter') || '-'
16
+ multi_spinner = ::TTY::Spinner::Multi.new('[:spinner] Services')
17
+ spinners = {}
18
+ count = 0
19
+ command_services_to('activate to services', all: options.fetch(:all), services_as_args: services) do |services|
20
+ system("cd #{neptuno_path} && docker compose up -d #{services.join(' ')}")
21
+ running_services = ::Neptuno::CLI::List.new.running_services.first.keys
22
+ running_services.sort.each do |service|
23
+ spinners[service] ||= multi_spinner.register("[:spinner] :state #{service}")
24
+ spinners[service].update(state: '- ')
25
+ spinners[service].auto_spin
26
+ end
27
+ loop do
28
+ ps = `cd #{neptuno_path} && docker compose ps`.split("\n").compact.select { |x| x.match(/^\s*#{project}/) }
29
+
30
+ running_services.sort.each do |service|
31
+ service_ps = ps.find { |s| s.include?(project.to_s) && s.include?("#{dd}#{service}#{dd}") }
32
+
33
+ status = :dead if service_ps.to_s.include?('exited')
34
+ status = :starting if service_ps.to_s.include?('starting')
35
+ status = :unhealthy if service_ps.to_s.include?('(unhealthy')
36
+ status = :healthy if service_ps.to_s.include?('(healthy')
37
+ status = :force if options.fetch(:force)
38
+
39
+ case status
40
+ when :force
41
+ spinners[service].success
42
+ `cd #{neptuno_path}/procfiles/#{service} && overmind start -D -N > /dev/null 2>&1`
43
+ when :dead
44
+ spinners[service].update(state: 'dead ')
45
+ spinners[service].error
46
+ when :starting
47
+ spinners[service].update(state: 'starting ')
48
+ when :unhealthy
49
+ spinners[service].update(state: 'unhealthy ')
50
+ spinners[service].error if spinners[service].instance_variable_get(:@state) == :spinning && count > 50
51
+ when :healthy
52
+ spinners[service].update(state: 'ready ')
53
+ spinners[service].success
54
+ `cd #{neptuno_path}/procfiles/#{service} && overmind start -D -N > /dev/null 2>&1`
55
+ else
56
+ spinners[service].update(state: 'down ')
57
+ spinners[service].error
58
+ end
59
+ end
60
+ break if spinners.values.map { |s| s.instance_variable_get(:@state) }.uniq.all?(:stopped)
61
+
62
+ count += 1
63
+ sleep(5)
64
+ end
65
+ spinner = ::TTY::Spinner.new('Neptuno: Starting[:spinner]', format: :dots)
66
+ spinner.auto_spin
67
+
68
+ spinner.stop
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module CLI
5
+ # Base cli class for Neptuno
6
+ class Base < Dry::CLI::Command
7
+ include Neptuno::TTY::Config
8
+ include TTY::Prompt
9
+ include TTY::File
10
+ include Neptuno::TTY::Command
11
+
12
+ ABORT_MESSAGE = 'fatal: not a Neptuno repository (or any of the parent directories)'
13
+
14
+ def initialize
15
+ abort ABORT_MESSAGE if neptuno_path == ''
16
+ config.append_path(neptuno_path)
17
+ config.read
18
+ end
19
+
20
+ def command_service_to(request, service_as_args: '')
21
+ chosen_service ||= service_as_args&.empty? ? nil : service_as_args
22
+ chosen_service ||= service if in_service?
23
+ chosen_service ||= prompt.select("Command service to #{request}:", services)
24
+ yield chosen_service, project
25
+ end
26
+
27
+ def command_services_to(request, all: nil, services_as_args: [])
28
+ chosen_services = services if all
29
+ chosen_services ||= services_as_args&.empty? ? nil : services_as_args
30
+ chosen_services ||= [service] if in_service?
31
+ chosen_services ||= configured_services.empty? ? nil : configured_services
32
+ chosen_services ||= prompt.multi_select("Command services to #{request}:", services)
33
+ yield chosen_services, project
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module CLI
5
+ # Configure Neptuno defaults
6
+ class Configure < Neptuno::CLI::Base
7
+ desc 'Configure which services to start by default'
8
+
9
+ def call(**)
10
+ configured_services = config.fetch('configured_services')
11
+ configured_services = prompt.multi_select('Active services: ', config.fetch('services')) do |menu|
12
+ menu.default(*configured_services)
13
+ end
14
+ config.set(:configured_services, value: configured_services)
15
+ config.write(force: true)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module CLI
5
+ # Init Neptuno files
6
+ class Execute < Neptuno::CLI::Base
7
+ include TTY::File
8
+ include TTY::Config
9
+
10
+ desc 'Execute service script'
11
+
12
+ def call(**options)
13
+ command_service_to('execute', service_as_args: options[:args]&.first) do |service, _project|
14
+ commands = Dir.glob("#{neptuno_path}/scripts/#{service}/*").map { |x| x.split('/') }.map(&:last)
15
+ command = options[:args].last if commands.include?(options[:args]&.last)
16
+ puts "#{neptuno_path}/scripts/#{service}/*"
17
+ puts service
18
+ puts commands.to_s
19
+ puts Dir.glob("#{neptuno_path}/scripts/#{service}/*").to_s
20
+ command ||= prompt.select('execute', commands || [])
21
+ `cd #{neptuno_path}/scripts/#{service} && ./#{command}`
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module CLI
5
+ # Init Neptuno files
6
+ class Init < Dry::CLI::Command
7
+ include TTY::File
8
+ include TTY::Config
9
+ include TTY::Which
10
+
11
+ desc 'Initializes a Neptuno project folder structure'
12
+
13
+ WORK_TREE = { '.' => ['docker-compose.yml', '.tmuxinator.yml',
14
+ { 'services' => [], 'dockerfiles' => [], 'procfiles' => [], 'environments' => [] }] }.freeze
15
+
16
+ CONFIG = nil
17
+
18
+ def call(**)
19
+ abort 'Neptuno projects can not be nested.' if neptuno_path != ''
20
+ ::TTY::File.create_dir(WORK_TREE, Dir.pwd)
21
+ config.set(:configured_services, value: '')
22
+ config.set(:services, value: [])
23
+ config.write(create: true, force: true)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module CLI
5
+ # Init Neptuno files
6
+ class Install < Dry::CLI::Command
7
+ include TTY::Command
8
+ include TTY::Prompt
9
+ include TTY::File
10
+ include TTY::Config
11
+ include TTY::Which
12
+
13
+ desc 'Installs git, docker, tmux, tmuxinator and overmind'
14
+
15
+ CONFIG = nil
16
+
17
+ def call(**)
18
+ install 'git'
19
+ install 'docker'
20
+ install 'tmux'
21
+ install 'overmind'
22
+ install 'tmuxinator'
23
+ end
24
+
25
+ def install(package)
26
+ if ::TTY::Which.exist?(package)
27
+ puts "#{package} is already installed"
28
+ else
29
+ puts "Installing #{package}"
30
+ system("brew install #{package}")
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module CLI
5
+ # Init Neptuno files
6
+
7
+ class List < Neptuno::CLI::Base
8
+ include TTY::File
9
+ include TTY::Config
10
+ include DOTIW::Methods
11
+
12
+ desc 'List containers and their processes'
13
+ option :relative, aliases: ['r'], type: :boolean, default: true,
14
+ desc: "Use relative time in 'last commit date' field"
15
+
16
+ STATE_ORDER = %w[on dead off].freeze
17
+
18
+ def running_services
19
+ proc_files = Dir.glob('procfiles/**/Procfile', base: neptuno_path)
20
+ neptuno_procs = proc_files.map do |f|
21
+ [f.split("\/")[1], File.read("#{neptuno_path}/#{f}").split("\n").map do |s|
22
+ s.split(':').first
23
+ end]
24
+ end.to_h
25
+
26
+ begin
27
+ docker_containers = system('docker compose ps', exception: true).lines[1..]
28
+ rescue RuntimeError
29
+ exit
30
+ end
31
+ docker_procs = docker_containers.map { |service| service.split(/\s\s+/).slice(2, 2) }.to_h
32
+
33
+ [neptuno_procs, docker_procs]
34
+ end
35
+
36
+ def service_current_branches
37
+ branches = `cd #{neptuno_path} && git submodule foreach 'git branch --show-current'`
38
+ branches.lines.each_slice(2).map do |service, branch|
39
+ [service.match(%r{services/(.*)'}).to_a.last, branch.to_s.strip]
40
+ end.to_h
41
+ end
42
+
43
+ def last_commit_date
44
+ dates = `cd #{neptuno_path} && git submodule foreach 'git log -1 --format=%cd'`
45
+ dates.lines.each_slice(2).map do |service, date|
46
+ [service.match(%r{services/(.*)'}).to_a.last, date.to_s.strip]
47
+ end.to_h
48
+ end
49
+
50
+ def get_display_date(date, relative)
51
+ if date
52
+ return date unless relative
53
+
54
+ distance_of_time_in_words(Time.now, Time.parse(date), false, highest_measures: 1).concat(' ago')
55
+ end
56
+ end
57
+
58
+ def call(**options)
59
+ neptuno_procs, docker_procs = running_services
60
+ branches = service_current_branches
61
+ dates = last_commit_date
62
+
63
+ procs = neptuno_procs.map do |name, *processes|
64
+ display_date = get_display_date(dates[name], options.fetch(:relative))
65
+ state = docker_procs[name]&.match?(/running/) ? 'on' : nil
66
+ state ||= docker_procs[name]&.match?(/exited/) ? 'dead' : 'off'
67
+ { state: state, name: name, branch: branches[name], last_commit: display_date, processes: processes }
68
+ end
69
+
70
+ puts Hirb::Helpers::AutoTable.render(procs.sort do |a, b|
71
+ [STATE_ORDER.index(b[:state]), a[:name]] <=> [STATE_ORDER.index(a[:state]), b[:name]]
72
+ end.reverse, fields: %i[state name branch last_commit processes])
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module CLI
5
+ # Print Neptuno CLI version
6
+ class Version < Dry::CLI::Command
7
+ desc 'Print version'
8
+
9
+ def call(**)
10
+ puts ::Neptuno::VERSION
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/cli'
4
+
5
+ # Public: Command line interface that allows to install the library, and run
6
+ # simple commands.
7
+ module Neptuno
8
+ module CLI
9
+ extend Dry::CLI::Registry
10
+
11
+ register 'version', Version, aliases: ['v', '-v', '--version', 'info']
12
+ register 'init', Init
13
+ register 'ls', List, aliases: ['ps']
14
+ register 'activate', Activate, aliases: ['a']
15
+ register 'config', Configure, aliases: %w[configure conf cc]
16
+ register 'execute', Execute, aliases: ['e']
17
+ register 'build', ::Neptuno::Docker::Build, aliases: ['b']
18
+ register 'up', Docker::Up, aliases: ['u']
19
+ register 'down', Docker::Down, aliases: ['d']
20
+ register 'restart', Docker::Restart, aliases: ['r']
21
+ register 'attach', Docker::Attach, aliases: ['at']
22
+ register 'k8s', K8s::Attach, aliases: ['k']
23
+ register 'log', Docker::Log, aliases: ['l']
24
+ register 'start', Overmind::Start, aliases: ['s']
25
+ register 'stop', Overmind::Stop, aliases: ['x']
26
+ register 'update', Services::Update, aliases: ['su']
27
+ register 'connect', Overmind::Connect, aliases: ['c']
28
+ register 'services list', Services::List, aliases: ['ls']
29
+ register 'services add', Services::Add
30
+ register 'services destroy', Services::Destroy, aliases: ['rm']
31
+ register 'services update', Services::Update, aliases: ['su']
32
+ register 'git stash', ::Neptuno::Git::Stash
33
+ register 'git pull', ::Neptuno::Git::Pull
34
+ register 'install', ::Neptuno::CLI::Install
35
+ register 'environment update', Environment::Update
36
+ register 'environment config', Environment::Config
37
+ end
38
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Docker
5
+ class Attach < Neptuno::CLI::Base
6
+ include ::Neptuno::TTY::Config
7
+ desc "Docker: Attach to a container's command"
8
+
9
+ option :up, type: :boolean, default: false, desc: 'Try to start containers before connecting'
10
+
11
+ def call(**options)
12
+ dd = config.fetch('docker_delimiter') || '-'
13
+ command_service_to('attach', service_as_args: options[:args].first) do |service, project|
14
+ system("cd #{neptuno_path} && docker compose up -d #{service}") if options.fetch(:up)
15
+ system("cd #{neptuno_path} && docker attach #{project}#{dd}#{service}#{dd}1")
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Docker
5
+ # Build docker container for Neptuno project
6
+ class Build < Neptuno::CLI::Base
7
+ desc 'Docker: Build docker containers for project'
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('build', all: options.fetch(:all), services_as_args: services) do |services|
14
+ system("cd #{neptuno_path} && docker compose build #{services.join(' ')}")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Docker
5
+ # Stop docker containers for Neptuno project
6
+ class Down < Neptuno::CLI::Base
7
+ desc 'Docker: Stop docker containers for current project'
8
+
9
+ option :tmux, type: :boolean, default: false, desc: 'Kill tmux session'
10
+ option :all, type: :boolean, default: false, desc: 'Run on all services'
11
+ argument :services, type: :array, required: false, desc: 'Optional list of services'
12
+
13
+ def call(services: [], **options)
14
+ command_services_to('go down', all: options.fetch(:all), services_as_args: services) do |services|
15
+ system("cd #{neptuno_path} && docker compose stop -t 0 #{services.join(' ')}")
16
+ system("cd #{neptuno_path} && docker compose rm -f #{services.join(' ')}")
17
+ system("cd #{neptuno_path} && tmux kill-session -t neptuno") if options.fetch(:tmux)
18
+ system("cd #{neptuno_path}/procfiles/#{service} && rm .overmind.sock > /dev/null 2>&1")
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Docker
5
+ class Log < Neptuno::CLI::Base
6
+ include ::Neptuno::TTY::Config
7
+ desc "Docker: Show a container's log"
8
+
9
+ def call(**options)
10
+ dd = config.fetch('docker_delimiter') || '-'
11
+ command_service_to('log', service_as_args: options[:args].first) do |service, project|
12
+ system("cd #{neptuno_path} && docker logs -f #{project}#{dd}#{service}#{dd}1")
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Docker
5
+ # Restart docker containers for Neptuno project
6
+ class Restart < Neptuno::CLI::Base
7
+ desc 'Docker: Rebuild and restart docker containers for current project'
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('restart', all: options.fetch(:all), services_as_args: services) do |services|
14
+ system("cd #{neptuno_path} && docker compose stop -t 0 #{services.join(' ')}")
15
+ system("cd #{neptuno_path} && docker compose rm -f #{services.join(' ')}")
16
+ system("cd #{neptuno_path} && docker compose build #{services.join(' ')}")
17
+ system("cd #{neptuno_path} && docker compose up -d #{services.join(' ')}")
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neptuno
4
+ module Docker
5
+ module Services
6
+ include Neptuno::TTY::Config
7
+ require 'yaml'
8
+
9
+ def running_services
10
+ running_services = `cd ~/.neptuno/projects/#{current_project} && docker compose ps | awk '{ print $3 }' | awk 'NR>1'`
11
+ running_services.split("\n").map(&:strip)
12
+ end
13
+
14
+ def registered_services
15
+ dc = YAML.load_file("#{neptuno_path}/docker-compose.yml")
16
+ dc['services'].keys
17
+ end
18
+
19
+ def stopped_services
20
+ registered_services - running_services
21
+ end
22
+ end
23
+ end
24
+ end