make_menu 0.0.3 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6709a0676bcc3bca7afa26690fb7efd8048006c48bf96edd1697941e685762dd
4
- data.tar.gz: 213d207ec9167cd91fcfcfeb0fce94772109ed3cad93a778280c9607d5f30b6a
3
+ metadata.gz: 032edeb7018b672422a335bdcda50129603efe7f9fd6fda7ec2411d12c029e4c
4
+ data.tar.gz: 0c2481bfc18b982e5d834d81ebb7c1a1388ef2e6086121044badcf01be38c4b8
5
5
  SHA512:
6
- metadata.gz: e3e6ce5aa039336be1d51a98e305075b4fc41747063f77f07bd3d73199f5d929b854c2b26057429962a4a12b0b5ff65a5f2fd0105e0680fe8e887a2173bb1e6d
7
- data.tar.gz: 5826d84e6da06b2fcae5e53206d6e7a1056899ad060b8ad64b559e6d770914aa332d08bf53170c1e80953f747404acc6c66bf6cc73c4b4e3166cb9e34fd77686
6
+ metadata.gz: 870f6926e1c56c1731a3cf5de5814aeb8885aaeb82446359f9405522230c42395da5c9e61d11f5f776349b0e42453e6b4df7981e1c48d1284d0301292ef747bf
7
+ data.tar.gz: 52c3cb4ab593115ff1274cdb4996a3c7ab2ebfab89db344d4be7922a0cc3de6efb255d18695cac180037bee994e3668e766aafb5ccd99c708023260d700b73ff
data/Gemfile CHANGED
@@ -3,3 +3,7 @@
3
3
  source 'http://rubygems.org'
4
4
 
5
5
  gemspec
6
+
7
+ group :development do
8
+ gem 'bump'
9
+ end
data/Gemfile.lock CHANGED
@@ -1,16 +1,20 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- make_menu (0.0.1)
4
+ make_menu (0.1.0)
5
+ tty-screen (~> 0.8.2)
5
6
 
6
7
  GEM
7
8
  remote: http://rubygems.org/
8
9
  specs:
10
+ bump (0.10.0)
11
+ tty-screen (0.8.2)
9
12
 
10
13
  PLATFORMS
11
14
  arm64-darwin-21
12
15
 
13
16
  DEPENDENCIES
17
+ bump
14
18
  make_menu!
15
19
 
16
20
  BUNDLED WITH
@@ -12,12 +12,10 @@ module MakeMenu
12
12
  def initialize(makefile)
13
13
  @groups = []
14
14
  @items = []
15
- @status_present = false
16
15
  build makefile
17
16
  end
18
17
 
19
18
  attr_reader :groups, :items
20
- attr_accessor :status_present
21
19
 
22
20
  # Display menu and prompt for command
23
21
  # rubocop:disable Metrics/MethodLength
@@ -48,7 +46,6 @@ module MakeMenu
48
46
  # Display the company logo and the status bar (if set)
49
47
  def display_header
50
48
  puts formatted_logo if logo
51
- puts `make status` if status_present
52
49
  end
53
50
 
54
51
  private
@@ -76,14 +73,8 @@ module MakeMenu
76
73
  # Target 'menu' should not appear
77
74
  next if target == 'menu'
78
75
 
79
- # Target 'status' should not appear, but is run automatically when the menu is rendered
80
- if target == 'status'
81
- self.status_present = true
82
- next
83
- end
84
-
85
76
  unless current_group
86
- current_group = MenuItemGroup.new
77
+ current_group = MenuItemGroup.new('Commands'.color(group_title_color))
87
78
  groups << current_group
88
79
  end
89
80
 
@@ -94,7 +85,25 @@ module MakeMenu
94
85
  option_number += 1
95
86
  end
96
87
  end
88
+
89
+ if option_number == 1
90
+ puts
91
+ puts 'No annotated targets found!'.red.bold
92
+ puts
93
+ puts 'Expecting something like this....'
94
+ puts " #{'my_target:'.cyan} #{'## Do some things'.yellow}"
95
+ puts
96
+ exit 1
97
+ end
97
98
  end
99
+
100
+ rescue Errno::ENOENT => _e
101
+ puts
102
+ puts 'No Makefile!'.red.bold
103
+ puts
104
+ puts "File '#{makefile}' could not be found.".yellow
105
+ puts
106
+ exit 1
98
107
  end
99
108
 
100
109
  # rubocop:enable Metrics/MethodLength
@@ -144,21 +153,19 @@ module MakeMenu
144
153
 
145
154
  # Get the menu logo from the LOGO constant
146
155
  def logo
147
- return "\n#{' make '.black_bg.light_yellow}#{' menu '.light_yellow_bg.black}\n".bold unless Object.const_defined?("#{self.class.name}::LOGO")
156
+ return "\n#{" #{Dir.pwd.split('/').last} ".light_yellow_bg.black.bold}\n \n" unless Object.const_defined?("#{self.class.name}::LOGO")
148
157
 
149
158
  Object.const_get("#{self.class.name}::LOGO")
150
159
  end
151
160
 
152
161
  protected
153
162
 
154
- # Override the following methods to customise the menu display
155
-
156
- # @return [Symbol] Color for group title
163
+ # @return [Symbol,Array[Symbol]] Color for group title
157
164
  def group_title_color
158
- :light_green
165
+ %i[yellow bold]
159
166
  end
160
167
 
161
- # Clean screen before and after each command
168
+ # Clear screen before and after each command
162
169
  def clear_screen?
163
170
  true
164
171
  end
@@ -1,3 +1,3 @@
1
1
  module MakeMenu
2
- VERSION = '0.0.3'
2
+ VERSION = '0.1.0'
3
3
  end
data/lib/make_menu.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require_relative 'make_menu/color_string'
2
2
  require_relative 'make_menu/menu'
3
- require_relative 'make_menu/status_panel'
4
3
 
5
4
  require 'tty-screen'
6
5
 
@@ -19,18 +18,17 @@ module MakeMenu
19
18
  else
20
19
  MakeMenu::Menu.new(makefile).run
21
20
  end
22
- rescue LoadError => _e
23
- puts "ERROR! Expected file ./#{menu_name.downcase}_menu.rb to define class #{menu_name.capitalize}Menu < MakeMenu::Menu"
24
- end
25
21
 
26
- def self.status
27
- if (menu_name = ENV.fetch('MENU', nil))
28
- require "./#{menu_name.downcase}_status_panel.rb"
29
- Object.const_get("#{menu_name.capitalize}StatusPanel").new.display
30
- else
31
- MakeMenu::StatusPanel.new.display
32
- end
33
- rescue LoadError => _e
34
- puts "ERROR! Expected file ./#{menu_name.downcase}_status_panel.rb to define class #{menu_name.capitalize}StatusPanel < MakeMenu::StatusPanel"
22
+ rescue LoadError, NameError => _e
23
+ puts
24
+ puts 'No customisation class found!'.red.bold
25
+ puts
26
+ puts 'Expected file:'
27
+ puts " ./#{menu_name.downcase}_menu.rb".cyan
28
+ puts
29
+ puts 'To define class:'
30
+ puts " #{menu_name.capitalize}Menu < MakeMenu::Menu".yellow
31
+ puts
32
+ exit 1
35
33
  end
36
34
  end
data/make_menu.gemspec CHANGED
@@ -16,44 +16,5 @@ Gem::Specification.new do |s|
16
16
  "https://rubygems.org/gems/make_menu"
17
17
  s.license = "MIT"
18
18
  s.add_dependency 'tty-screen', '~> 0.8.2'
19
- s.description = %(
20
- Creates a number-selection menu from a Makefile. The menu will attempt to fill the width of the terminal window.
21
-
22
- - Any targets in the Makefile with a double-hash comment will be displayed, e.g.:
23
- serve: ## Start Rails server in background
24
- This will display a line such as '1. Start Rails server in background' which runs the command `make serve`.
25
-
26
- - A line that starts with a triple-hash will create a new menu group, e.g.:
27
- ### Docker Commands
28
- This will begin a new group with the header 'Docker Commands'
29
-
30
- - The environment variable MENU can be used to specify a custom menu class, e.g.:
31
- export MENU=Accounts
32
- This assumes that a class `AccountsMenu` is defined in the file `accounts_menu.rb`
33
-
34
- You can define two constants in your custom class:
35
- LOGO (String) text or ASCII art to display above the menu
36
- HIGHLIGHTS (Hash{String=>[Symbol,Array<Symbol>]}) Add coloring to specific words or phrases
37
-
38
- - The environment variable MAKEFILE can specify a Makefile. The default is './Makefile'.
39
-
40
- The menu will not display any targets called 'menu' or 'status'. The latter, if present, is called each
41
- time the menu displays.
42
-
43
- -----------------------------
44
- Docker Container Status Panel
45
- -----------------------------
46
-
47
- Displays a color-coded panel indicating whether or not a Docker container is running.
48
-
49
- You must define a custom class inheriting from `MakeMenu::StatusPanel` and indicate this using
50
- the environment variable MENU, e.g.:
51
- export MENU=Accounts
52
- This assumes that a class `AccountsStatusPanel` is defined in the file `accounts_status_panel.rb`
53
-
54
- You can define a constant CONTAINERS {String=>String} in this custom class to map the displayed
55
- label to the container name, e.g.:
56
- CONTAINERS = { 'Backend' => 'myapp-backend-1' }
57
-
58
- )
19
+ s.description = ""
59
20
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: make_menu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Barri Mason
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-20 00:00:00.000000000 Z
11
+ date: 2023-12-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tty-screen
@@ -24,46 +24,7 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.8.2
27
- description: |2+
28
-
29
- Creates a number-selection menu from a Makefile. The menu will attempt to fill the width of the terminal window.
30
-
31
- - Any targets in the Makefile with a double-hash comment will be displayed, e.g.:
32
- serve: ## Start Rails server in background
33
- This will display a line such as '1. Start Rails server in background' which runs the command `make serve`.
34
-
35
- - A line that starts with a triple-hash will create a new menu group, e.g.:
36
- ### Docker Commands
37
- This will begin a new group with the header 'Docker Commands'
38
-
39
- - The environment variable MENU can be used to specify a custom menu class, e.g.:
40
- export MENU=Accounts
41
- This assumes that a class `AccountsMenu` is defined in the file `accounts_menu.rb`
42
-
43
- You can define two constants in your custom class:
44
- LOGO (String) text or ASCII art to display above the menu
45
- HIGHLIGHTS (Hash{String=>[Symbol,Array<Symbol>]}) Add coloring to specific words or phrases
46
-
47
- - The environment variable MAKEFILE can specify a Makefile. The default is './Makefile'.
48
-
49
- The menu will not display any targets called 'menu' or 'status'. The latter, if present, is called each
50
- time the menu displays.
51
-
52
- -----------------------------
53
- Docker Container Status Panel
54
- -----------------------------
55
-
56
- Displays a color-coded panel indicating whether or not a Docker container is running.
57
-
58
- You must define a custom class inheriting from `MakeMenu::StatusPanel` and indicate this using
59
- the environment variable MENU, e.g.:
60
- export MENU=Accounts
61
- This assumes that a class `AccountsStatusPanel` is defined in the file `accounts_status_panel.rb`
62
-
63
- You can define a constant CONTAINERS {String=>String} in this custom class to map the displayed
64
- label to the container name, e.g.:
65
- CONTAINERS = { 'Backend' => 'myapp-backend-1' }
66
-
27
+ description: ''
67
28
  email: loki@amarantha.net
68
29
  executables: []
69
30
  extensions: []
@@ -76,7 +37,6 @@ files:
76
37
  - lib/make_menu/menu.rb
77
38
  - lib/make_menu/menu_item.rb
78
39
  - lib/make_menu/menu_item_group.rb
79
- - lib/make_menu/status_panel.rb
80
40
  - lib/make_menu/text_column.rb
81
41
  - lib/make_menu/text_table.rb
82
42
  - lib/make_menu/version.rb
@@ -105,4 +65,3 @@ signing_key:
105
65
  specification_version: 4
106
66
  summary: Generates an interactive menu from a Makefile
107
67
  test_files: []
108
- ...
@@ -1,113 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'color_string'
4
- require 'readline'
5
-
6
- module MakeMenu
7
- # A panel above the menu displaying the status of Docker containers.
8
- # The mapping of TextLabel => ContainerName must be defined in a constant called CONTAINERS
9
- class StatusPanel
10
- String.include(ColorString)
11
-
12
- # Print panel
13
- def display
14
- return if containers.empty?
15
-
16
- puts "\n#{panel}"
17
- end
18
-
19
- protected
20
-
21
- # Return a hash mapping label to container name
22
- # This is assumed to be provided as a constant called CONTAINERS
23
- # @return [Hash{String=>String}]
24
- def containers
25
- Object.const_get "#{self.class.name}::CONTAINERS"
26
- rescue NameError
27
- {}
28
- end
29
-
30
- # Override this to change the colors for running / not running
31
- def colors_if_running
32
- {
33
- true => %i[green_bg bold white],
34
- false => %i[red_bg bold dark]
35
- }.freeze
36
- end
37
-
38
- # Override this to limit each row to a maximum number of labels
39
- def max_labels_per_line
40
- containers.size
41
- end
42
-
43
- private
44
-
45
- # @return [String] Text representation of the panel
46
- # rubocop:disable Metrics/MethodLength
47
- def panel
48
- return @panel if @panel
49
-
50
- return "- Docker offline -\n".grey.dark.align(:center) unless docker_online?
51
-
52
- @panel = ''
53
- labels_on_this_line = 0
54
- line_buffer = ''
55
-
56
- containers.each do |label, container|
57
- if (labels_on_this_line + 1) > labels_per_line
58
- @panel += "#{left_indent(labels_on_this_line)}#{line_buffer}\n\n"
59
- labels_on_this_line = 0
60
- line_buffer = ''
61
- end
62
-
63
- text = label.align(:center, width: max_label_width, pad_right: true)
64
- .color(colors_if_running[running?(container)])
65
-
66
- line_buffer += " #{text} "
67
-
68
- labels_on_this_line += 1
69
- end
70
-
71
- @panel += "#{left_indent(labels_on_this_line)}#{line_buffer}\n\n"
72
- end
73
- # rubocop:enable Metrics/MethodLength
74
-
75
- def docker_online?
76
- system 'docker', 'compose', 'ps', out: File::NULL, err: File::NULL
77
- end
78
-
79
- # @return [String] List of Docker containers and information
80
- def docker_ps
81
- @docker_ps ||= `docker compose ps`
82
- end
83
-
84
- # @return [Boolean] whether specified container is running
85
- def running?(container)
86
- docker_ps.include? container
87
- end
88
-
89
- # Return the left indent for this line of labels
90
- # @param [Integer] number_of_labels Number of labels on this line
91
- # @return [String]
92
- def left_indent(number_of_labels)
93
- spaces = (::TTY::Screen.cols - (number_of_labels * (max_label_width + 2))) / 2
94
- spaces = [spaces, 0].max
95
- ' ' * spaces
96
- end
97
-
98
- # @return [Integer] Maximum label width, with padding
99
- def max_label_width
100
- @max_label_width ||= containers.map do |label, _container|
101
- label.length
102
- end.max + 2
103
- end
104
-
105
- # @return [Integer] Number of labels that can fit on one line
106
- def labels_per_line
107
- @labels_per_line ||= [
108
- (::TTY::Screen.cols / max_label_width) - 1,
109
- max_labels_per_line
110
- ].min
111
- end
112
- end
113
- end