tomo 1.1.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +47 -29
  3. data/lib/tomo/cli.rb +1 -3
  4. data/lib/tomo/cli/common_options.rb +4 -12
  5. data/lib/tomo/cli/deploy_options.rb +2 -7
  6. data/lib/tomo/cli/parser.rb +1 -6
  7. data/lib/tomo/cli/project_options.rb +1 -3
  8. data/lib/tomo/cli/rules.rb +4 -22
  9. data/lib/tomo/cli/rules/argument.rb +2 -2
  10. data/lib/tomo/cli/rules/switch.rb +1 -5
  11. data/lib/tomo/cli/rules/value_switch.rb +2 -3
  12. data/lib/tomo/cli/rules_evaluator.rb +3 -13
  13. data/lib/tomo/cli/usage.rb +1 -3
  14. data/lib/tomo/commands/default.rb +1 -3
  15. data/lib/tomo/commands/init.rb +28 -1
  16. data/lib/tomo/commands/run.rb +1 -3
  17. data/lib/tomo/configuration.rb +6 -12
  18. data/lib/tomo/configuration/dsl/error_formatter.rb +1 -1
  19. data/lib/tomo/configuration/dsl/hosts_and_settings.rb +1 -2
  20. data/lib/tomo/configuration/plugins_registry.rb +1 -2
  21. data/lib/tomo/configuration/plugins_registry/gem_resolver.rb +1 -1
  22. data/lib/tomo/configuration/unknown_environment_error.rb +1 -4
  23. data/lib/tomo/console.rb +6 -11
  24. data/lib/tomo/console/menu.rb +1 -2
  25. data/lib/tomo/host.rb +1 -2
  26. data/lib/tomo/paths.rb +1 -1
  27. data/lib/tomo/plugin/bundler/tasks.rb +2 -7
  28. data/lib/tomo/plugin/core/helpers.rb +1 -1
  29. data/lib/tomo/plugin/core/tasks.rb +3 -12
  30. data/lib/tomo/plugin/env/tasks.rb +31 -9
  31. data/lib/tomo/plugin/git.rb +1 -4
  32. data/lib/tomo/plugin/git/tasks.rb +4 -14
  33. data/lib/tomo/plugin/nodenv/tasks.rb +1 -3
  34. data/lib/tomo/plugin/puma.rb +0 -3
  35. data/lib/tomo/plugin/puma/tasks.rb +6 -15
  36. data/lib/tomo/plugin/rails/tasks.rb +6 -4
  37. data/lib/tomo/plugin/rbenv/tasks.rb +16 -2
  38. data/lib/tomo/plugin/testing.rb +1 -3
  39. data/lib/tomo/remote.rb +1 -3
  40. data/lib/tomo/runtime.rb +3 -6
  41. data/lib/tomo/runtime/concurrent_ruby_thread_pool.rb +1 -4
  42. data/lib/tomo/runtime/execution_plan.rb +1 -4
  43. data/lib/tomo/runtime/explanation.rb +1 -7
  44. data/lib/tomo/runtime/settings_required_error.rb +1 -3
  45. data/lib/tomo/runtime/task_runner.rb +1 -5
  46. data/lib/tomo/runtime/unknown_task_error.rb +1 -4
  47. data/lib/tomo/script.rb +1 -5
  48. data/lib/tomo/shell_builder.rb +5 -10
  49. data/lib/tomo/ssh/child_process.rb +2 -7
  50. data/lib/tomo/ssh/connection.rb +5 -18
  51. data/lib/tomo/ssh/connection_validator.rb +5 -8
  52. data/lib/tomo/ssh/executable_error.rb +1 -2
  53. data/lib/tomo/ssh/options.rb +2 -5
  54. data/lib/tomo/task_api.rb +4 -15
  55. data/lib/tomo/templates/config.rb.erb +9 -1
  56. data/lib/tomo/testing/cli_extensions.rb +1 -1
  57. data/lib/tomo/testing/connection.rb +1 -6
  58. data/lib/tomo/testing/docker_image.rb +5 -11
  59. data/lib/tomo/testing/local.rb +1 -3
  60. data/lib/tomo/testing/ubuntu_setup.sh +1 -2
  61. data/lib/tomo/version.rb +1 -1
  62. metadata +8 -135
  63. data/lib/tomo/configuration/plugin_resolver.rb +0 -63
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '083da9eb981a0e551ee6411af3548a6faa92251c5365d2d0b13fbd316775d098'
4
- data.tar.gz: 519e8bb883a768681162b460657925b398f1da3e86fde40470b808d1cd3dffe2
3
+ metadata.gz: 4e70a81efc32a7a80b37b26edc668de8daa510e7954884a3711d71ced6ef1bf8
4
+ data.tar.gz: eef6788e4b36c1cdad66170b6b616af8a08f890bc089a6c70e6a12132a061911
5
5
  SHA512:
6
- metadata.gz: 74081358dbca4a6e9e5fbaefd4051c46a82d078433c36d1a31061699a1559930a8700e8206984742d1f91968f8c226d78e6012bbbccce29198b1faec8c9f3364
7
- data.tar.gz: c06ad89b83b04d71314b6ea78afd460bbf3ad0ea3b24cb21312dcf6c6d78b41ff7cbb4886d147837a09e1149f2a4684c03225b30dfa834c828ddec160315e4d8
6
+ metadata.gz: 4425384a896b364775994859d7ea4307cac1abcbd507514d6f7289d6a684f6263cd7b17d250d280f6f2ccd596ed47f5d8f0871337dd5b69895aa74a0ea9c718e
7
+ data.tar.gz: 57a0929d3e1be161c7830449226327ee1c4f0e20f4949658ec02287c436c4fbb12e8a7f819a4525266beb29a8abd6381285aae27e21b6e753ac27028783dca1f
data/README.md CHANGED
@@ -2,25 +2,25 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/tomo.svg)](https://rubygems.org/gems/tomo)
4
4
  [![Travis](https://img.shields.io/travis/mattbrictson/tomo.svg?label=travis)](https://travis-ci.org/mattbrictson/tomo)
5
- [![Circle](https://circleci.com/gh/mattbrictson/tomo.svg?style=shield)](https://app.circleci.com/pipelines/github/mattbrictson/tomo?branch=master)
5
+ [![Circle](https://circleci.com/gh/mattbrictson/tomo/tree/main.svg?style=shield)](https://app.circleci.com/pipelines/github/mattbrictson/tomo?branch=main)
6
6
  [![Code Climate](https://codeclimate.com/github/mattbrictson/tomo/badges/gpa.svg)](https://codeclimate.com/github/mattbrictson/tomo)
7
7
 
8
- Tomo is a friendly command-line tool for deploying Rails apps. It is a new alternative to Capistrano, Mina, and Shipit that aims for simplicity and developer happiness.
8
+ Tomo is a friendly command-line tool for deploying Rails apps.
9
9
 
10
10
  💻 Rich command-line interface with built-in bash completions<br/>
11
11
  ☁️ Multi-environment and role-based multi-host support<br/>
12
12
  💎 Everything you need to deploy a basic Rails app out of the box<br/>
13
13
  🔌 Easily extensible for polyglot projects (not just Rails!)<br/>
14
- 💡 Concise, helpful error messages<br/>
15
14
  📚 Quality documentation<br/>
16
15
  🔬 Minimal dependencies<br/>
17
16
 
18
- See [how tomo compares](https://tomo-deploy.com/comparisons/) to other Ruby deployment tools.
17
+ [→ See how tomo compares to other Ruby deployment tools like Capistrano and Mina.](https://tomo-deploy.com/comparisons/)
19
18
 
20
19
  ---
21
20
 
22
21
  - [Quick start](#quick-start)
23
22
  - [Usage](#usage)
23
+ - [Extending tomo](#extending-tomo)
24
24
  - [Tutorials](#tutorials)
25
25
  - [Reference documentation](#reference-documentation)
26
26
  - [FAQ](#faq)
@@ -31,21 +31,19 @@ See [how tomo compares](https://tomo-deploy.com/comparisons/) to other Ruby depl
31
31
 
32
32
  ## Quick start
33
33
 
34
+ #### Installation
35
+
34
36
  Tomo is distributed as a ruby gem. To install:
35
37
 
36
38
  ```
37
39
  $ gem install tomo
38
40
  ```
39
41
 
40
- For instructions on setting up bash completions, run:
41
-
42
- ```
43
- $ tomo completion-script
44
- ```
42
+ > 💡 **Protip:** run `tomo completion-script` for instructions on setting up bash completions.
45
43
 
46
44
  #### Configuring a project
47
45
 
48
- Tomo is configured via a `.tomo/config.rb` file in your project. To get started, you can use `tomo init` to generate a configuration that works for a basic Rails app.
46
+ Tomo is configured via a `.tomo/config.rb` file in your project. To get started, run `tomo init` to generate a configuration that works for a basic Rails app.
49
47
 
50
48
  ![$ tomo init](./readme_images/tomo-init.png)
51
49
 
@@ -64,7 +62,7 @@ host "user@hostname.or.ip.address"
64
62
  set application: "my-rails-app"
65
63
  set deploy_to: "/var/www/%{application}"
66
64
  set git_url: "git@github.com:my-username/my-rails-app.git"
67
- set git_branch: "master"
65
+ set git_branch: "main"
68
66
  # ...
69
67
 
70
68
  setup do
@@ -87,20 +85,25 @@ deploy do
87
85
  end
88
86
  ```
89
87
 
90
- Check out the [configuration docs](https://tomo-deploy.com/configuration/) for a complete reference.
88
+ #### Next steps
89
+
90
+ [→ The reference docs have a complete guide to tomo configuration.](https://tomo-deploy.com/configuration/)<br>
91
+ [→ Check out the **Deploying Rails From Scratch** tutorial for a step-by-step guide to using tomo with a real app.](https://tomo-deploy.com/tutorials/deploying-rails-from-scratch/)
91
92
 
92
93
  ## Usage
93
94
 
94
- Tomo gives you easy-to-use commands for three common use cases:
95
+ Once your project is configured, you can:
96
+
97
+ 1. Run `tomo setup` to prepare the remote host for its first deploy.
98
+ 2. Run `tomo deploy` to deploy your app.
99
+ 3. Use `tomo run` to invoke one-off tasks, like launching a Rails console.
95
100
 
96
- 1. `tomo setup` prepares a remote host for its first deploy
97
- 2. `tomo deploy` performs a deployment
98
- 3. `tomo run` lets you invoke one-off tasks
101
+ > 💡 **Protip:** add `-h` or `--help` when running any of these commands to see detailed docs and examples.
99
102
 
100
- ### Setup
103
+ ### `tomo setup`
101
104
 
102
105
  `tomo setup` prepares the remote host for its first deploy by sequentially running the
103
- [setup](https://tomo-deploy.com/configuration#setupblock) list of tasks specified in `.tomo/config.rb`. These tasks typically create directories, initialize data stores, install prerequisite tools, and perform other one-time actions that are necessary before a deploy can take place.
106
+ `setup` list of tasks specified in `.tomo/config.rb`. These tasks typically create directories, initialize data stores, install prerequisite tools, and perform other one-time actions that are necessary before a deploy can take place.
104
107
 
105
108
  Out of the box, tomo will:
106
109
 
@@ -109,9 +112,12 @@ Out of the box, tomo will:
109
112
  - Create all necessary deployment directories
110
113
  - Create the Rails database, load the schema, and insert seed data
111
114
 
112
- ### Deploy
115
+ [→ Here is the default list of tasks invoked by the setup command.](https://tomo-deploy.com/configuration#setupblock)<br>
116
+ [→ The `tomo setup` section of the reference docs explains supported command-line options.](https://tomo-deploy.com/commands/setup/)
113
117
 
114
- Whereas `tomo setup` is typically run once, you can use `tomo deploy` every time you want to deploy a new version of your app. The deploy command will sequentially run the [deploy](https://tomo-deploy.com/configuration#deployblock) list of tasks specified in `.tomo/config.rb`. You can customize this list to meet the needs of your app. By default, tomo runs these tasks:
118
+ ### `tomo deploy`
119
+
120
+ Whereas `tomo setup` is typically run once, you can use `tomo deploy` every time you want to deploy a new version of your app. The deploy command will sequentially run the `deploy` list of tasks specified in `.tomo/config.rb`. You can customize this list to meet the needs of your app. By default, tomo runs these tasks:
115
121
 
116
122
  1. Create a release (using the [git:create_release](https://tomo-deploy.com/plugins/git#gitcreate_release) task)
117
123
  2. Build the project (e.g. [bundler:install](https://tomo-deploy.com/plugins/bundler#bundlerinstall), [rails:assets_precompile](https://tomo-deploy.com/plugins/rails#railsassets_precompile))
@@ -120,7 +126,13 @@ Whereas `tomo setup` is typically run once, you can use `tomo deploy` every time
120
126
  5. Restart the app to use the new current release (e.g. [puma:restart](https://tomo-deploy.com/plugins/puma#pumarestart))
121
127
  6. Perform any cleanup (e.g. [bundler:clean](https://tomo-deploy.com/plugins/bundler#bundlerclean))
122
128
 
123
- ### Run
129
+ > 💡 **Protip:** you can abbreviate tomo commands, like `tomo d` for `tomo deploy` or `tomo s` for `tomo setup`.
130
+
131
+ [→ Here is the default list of tasks invoked by the deploy command.](https://tomo-deploy.com/configuration#deployblock)<br>
132
+ [→ The `tomo deploy` section of the reference docs explains supported command-line options, like `--dry-run`.](https://tomo-deploy.com/commands/deploy/)
133
+
134
+
135
+ ### `tomo run [TASK]`
124
136
 
125
137
  Tomo can also `run` individual remote tasks on demand. You can use the `tasks` command to see the list of tasks tomo knows about.
126
138
 
@@ -130,9 +142,15 @@ One of the built-in Rails tasks is `rails:console`, which brings up a fully-inte
130
142
 
131
143
  ![$ tomo run rails:console](./readme_images/tomo-run-rails-console.png)
132
144
 
133
- ### Extending tomo
145
+ > 💡 **Protip:** you can shorten this as `tomo rails:console` (the `run` command is implied).
146
+
147
+ [→ The `tomo run` section of the reference docs explains supported command-line options and has more examples.](https://tomo-deploy.com/commands/run/)
148
+
134
149
 
135
- Tomo has many plugins built-in, but you can easily add your own to extend tomo with custom tasks. By convention, custom plugins are stored in `.tomo/plugins/`. These plugins can define tasks as plain ruby methods. For example:
150
+
151
+ ## Extending tomo
152
+
153
+ Tomo has a powerful plugin system that lets you extend tomo by installing Ruby gems (e.g. [tomo-plugin-sidekiq](https://github.com/mattbrictson/tomo-plugin-sidekiq)). You can also define plugins on the fly within your project by adding simple `.rb` files to `.tomo/plugins/`. These plugins can define tasks as plain ruby methods. For example:
136
154
 
137
155
  ```ruby
138
156
  # .tomo/plugins/my-plugin.rb
@@ -142,8 +160,6 @@ def hello
142
160
  end
143
161
  ```
144
162
 
145
- Use `remote.run` to execute shell scripts on the remote host, similar to how you would use Ruby's `system`. Project settings are accessible via `settings`, which is a plain Ruby hash.
146
-
147
163
  Load your plugin in `config.rb` like this:
148
164
 
149
165
  ```ruby
@@ -156,7 +172,9 @@ And run it!
156
172
 
157
173
  ![$ tomo run my-plugin:hello](./readme_images/tomo-run-hello.png)
158
174
 
159
- Read the [Writing Custom Tasks](https://tomo-deploy.com/tutorials/writing-custom-tasks/) tutorial for an in-depth guide to extending tomo.
175
+ [→ The **Writing Custom Tasks** tutorial has an in-depth explanation of how plugins work.](https://tomo-deploy.com/tutorials/writing-custom-tasks/)<br>
176
+ [→ The **TaskLibrary** API is tomo's DSL for building tasks.](https://tomo-deploy.com/api/TaskLibrary/)<br>
177
+ [→ The **Publishing a Plugin** tutorial explains how to package your plugin as a Ruby gem to share it with the community.](https://tomo-deploy.com/tutorials/publishing-a-plugin/)
160
178
 
161
179
  ## Tutorials
162
180
 
@@ -225,7 +243,7 @@ Next run `tomo setup` for _both_ apps; this will set everything up for both user
225
243
 
226
244
  ## Support
227
245
 
228
- This project is a labor of love and I can only spend a few hours a week maintaining it, at most. If you'd like to help by submitting a pull request, or if you've discovered a bug that needs my attention, please let me know. Check out [CONTRIBUTING.md](https://github.com/mattbrictson/tomo/blob/master/CONTRIBUTING.md) to get started. Happy hacking! —Matt
246
+ This project is a labor of love and I can only spend a few hours a week maintaining it, at most. If you'd like to help by submitting a pull request, or if you've discovered a bug that needs my attention, please let me know. Check out [CONTRIBUTING.md](https://github.com/mattbrictson/tomo/blob/main/CONTRIBUTING.md) to get started. Happy hacking! —Matt
229
247
 
230
248
  ## License
231
249
 
@@ -233,8 +251,8 @@ The gem is available as open source under the terms of the [MIT License](https:/
233
251
 
234
252
  ## Code of conduct
235
253
 
236
- Everyone interacting in the Tomo project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/mattbrictson/tomo/blob/master/CODE_OF_CONDUCT.md).
254
+ Everyone interacting in the Tomo project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/mattbrictson/tomo/blob/main/CODE_OF_CONDUCT.md).
237
255
 
238
256
  ## Contribution guide
239
257
 
240
- Interested in filing a bug report, feature request, or opening a PR? Excellent! Please read the short [CONTRIBUTING.md](https://github.com/mattbrictson/tomo/blob/master/CONTRIBUTING.md) guidelines before you dive in.
258
+ Interested in filing a bug report, feature request, or opening a PR? Excellent! Please read the short [CONTRIBUTING.md](https://github.com/mattbrictson/tomo/blob/main/CONTRIBUTING.md) guidelines before you dive in.
@@ -20,7 +20,7 @@ module Tomo
20
20
  class << self
21
21
  attr_accessor :show_backtrace
22
22
 
23
- def exit(status=true)
23
+ def exit(status=true) # rubocop:disable Style/OptionalBooleanParameter
24
24
  Process.exit(status)
25
25
  end
26
26
  end
@@ -55,7 +55,6 @@ module Tomo
55
55
  argv << "" if argv.shift == "--complete"
56
56
  end
57
57
 
58
- # rubocop:disable Metrics/CyclomaticComplexity
59
58
  def lookup_command(argv)
60
59
  command_name = argv.first unless Completions.active? && argv.length == 1
61
60
  command_name = Abbrev.abbrev(COMMANDS.keys)[command_name]
@@ -65,7 +64,6 @@ module Tomo
65
64
  command = COMMANDS[command_name] || Tomo::Commands::Default
66
65
  [command, command_name]
67
66
  end
68
- # rubocop:enable Metrics/CyclomaticComplexity
69
67
 
70
68
  def task_format?(arg)
71
69
  arg.to_s.match?(/\A\S+:\S*\z/)
@@ -1,22 +1,15 @@
1
1
  module Tomo
2
2
  class CLI
3
3
  module CommonOptions
4
- # rubocop:disable Metrics/MethodLength
5
- def self.included(mod)
4
+ def self.included(mod) # rubocop:disable Metrics/MethodLength
6
5
  mod.class_eval do
7
- option :color,
8
- "--[no-]color",
9
- "Enable/disable color output" do |color|
6
+ option :color, "--[no-]color", "Enable/disable color output" do |color|
10
7
  Colors.enabled = color
11
8
  end
12
- option :debug,
13
- "--[no-]debug",
14
- "Enable/disable verbose debug logging" do |debug|
9
+ option :debug, "--[no-]debug", "Enable/disable verbose debug logging" do |debug|
15
10
  Tomo.debug = debug
16
11
  end
17
- option :trace,
18
- "--[no-]trace",
19
- "Display full backtrace on error" do |trace|
12
+ option :trace, "--[no-]trace", "Display full backtrace on error" do |trace|
20
13
  CLI.show_backtrace = trace
21
14
  end
22
15
  option :help, "-h, --help", "Print this documentation" do |_help|
@@ -27,7 +20,6 @@ module Tomo
27
20
  after_parse :dump_runtime_info
28
21
  end
29
22
  end
30
- # rubocop:enable Metrics/MethodLength
31
23
 
32
24
  private
33
25
 
@@ -1,8 +1,7 @@
1
1
  module Tomo
2
2
  class CLI
3
3
  module DeployOptions
4
- # rubocop:disable Metrics/MethodLength
5
- def self.included(mod)
4
+ def self.included(mod) # rubocop:disable Metrics/MethodLength
6
5
  mod.class_eval do
7
6
  option :environment,
8
7
  "-e, --environment ENVIRONMENT",
@@ -23,7 +22,6 @@ module Tomo
23
22
  after_parse :prompt_for_environment
24
23
  end
25
24
  end
26
- # rubocop:enable Metrics/MethodLength
27
25
 
28
26
  private
29
27
 
@@ -49,10 +47,7 @@ module Tomo
49
47
  return if envs.empty?
50
48
  return unless Console.interactive?
51
49
 
52
- options[:environment] = Console.menu(
53
- "Choose an environment:",
54
- choices: envs
55
- )
50
+ options[:environment] = Console.menu("Choose an environment:", choices: envs)
56
51
  end
57
52
  end
58
53
  end
@@ -46,12 +46,7 @@ module Tomo
46
46
  attr_reader :rules, :usage, :after_parse_methods
47
47
 
48
48
  def evaluate(argv, state, literal:)
49
- RulesEvaluator.evaluate(
50
- rules: rules.to_a,
51
- argv: argv,
52
- state: state,
53
- literal: literal
54
- )
49
+ RulesEvaluator.evaluate(rules: rules.to_a, argv: argv, state: state, literal: literal)
55
50
  end
56
51
 
57
52
  def check_required_rules(state)
@@ -3,9 +3,7 @@ module Tomo
3
3
  module ProjectOptions
4
4
  def self.included(mod)
5
5
  mod.class_eval do
6
- option :project,
7
- "-c, --config PATH",
8
- "Location of project config (default: #{DEFAULT_CONFIG_PATH})"
6
+ option :project, "-c, --config PATH", "Location of project config (default: #{DEFAULT_CONFIG_PATH})"
9
7
  end
10
8
  end
11
9
 
@@ -51,21 +51,11 @@ module Tomo
51
51
  attr_reader :rules
52
52
 
53
53
  def optional_arg_rule(spec, values_proc)
54
- Rules::Argument.new(
55
- spec,
56
- values_proc: values_proc,
57
- required: false,
58
- multiple: false
59
- )
54
+ Rules::Argument.new(spec, values_proc: values_proc, required: false, multiple: false)
60
55
  end
61
56
 
62
57
  def required_arg_rule(spec, values_proc)
63
- Rules::Argument.new(
64
- spec,
65
- values_proc: values_proc,
66
- required: true,
67
- multiple: false
68
- )
58
+ Rules::Argument.new(spec, values_proc: values_proc, required: true, multiple: false)
69
59
  end
70
60
 
71
61
  def mutiple_optional_args_rule(spec, values_proc)
@@ -73,10 +63,7 @@ module Tomo
73
63
  end
74
64
 
75
65
  def on_off_switch_rule(key, name, _values_proc, callback_proc)
76
- Rules::Switch.new(key,
77
- "--#{name}",
78
- "--no-#{name}",
79
- callback_proc: callback_proc) do |arg|
66
+ Rules::Switch.new(key, "--#{name}", "--no-#{name}", callback_proc: callback_proc) do |arg|
80
67
  arg == "--#{name}"
81
68
  end
82
69
  end
@@ -86,12 +73,7 @@ module Tomo
86
73
  end
87
74
 
88
75
  def value_switch_rule(key, *switches, values_proc, callback_proc)
89
- Rules::ValueSwitch.new(
90
- key,
91
- *switches,
92
- values_proc: values_proc,
93
- callback_proc: callback_proc
94
- )
76
+ Rules::ValueSwitch.new(key, *switches, values_proc: values_proc, callback_proc: callback_proc)
95
77
  end
96
78
  end
97
79
  end
@@ -1,6 +1,6 @@
1
1
  class Tomo::CLI::Rules
2
2
  class Argument
3
- def initialize(label, multiple: false, required: false, values_proc:)
3
+ def initialize(label, values_proc:, multiple: false, required: false)
4
4
  @label = label
5
5
  @multiple = multiple
6
6
  @required = required
@@ -15,7 +15,7 @@ class Tomo::CLI::Rules
15
15
  state.parsed_arg(arg)
16
16
  end
17
17
 
18
- def candidates(literal: false, state:)
18
+ def candidates(state:, literal: false)
19
19
  values(state).reject { |val| literal && val.start_with?("-") }
20
20
  end
21
21
 
@@ -1,10 +1,6 @@
1
1
  class Tomo::CLI::Rules
2
2
  class Switch
3
- def initialize(key,
4
- *switches,
5
- required: false,
6
- callback_proc:,
7
- &convert_proc)
3
+ def initialize(key, *switches, callback_proc:, required: false, &convert_proc)
8
4
  @key = key
9
5
  @switches = switches
10
6
  @callback_proc = callback_proc
@@ -28,7 +28,7 @@ class Tomo::CLI::Rules
28
28
  state.parsed_option(key, value)
29
29
  end
30
30
 
31
- def candidates(switch=nil, literal: false, state:)
31
+ def candidates(switch=nil, state:, literal: false)
32
32
  return [] if literal
33
33
 
34
34
  vals = values(state)
@@ -51,8 +51,7 @@ class Tomo::CLI::Rules
51
51
  end
52
52
 
53
53
  def raise_missing_value(switch)
54
- raise Tomo::CLI::Error,
55
- "Please specify a value for the #{yellow(switch)} option."
54
+ raise Tomo::CLI::Error, "Please specify a value for the #{yellow(switch)} option."
56
55
  end
57
56
  end
58
57
  end
@@ -41,11 +41,7 @@ module Tomo
41
41
  def complete_if_needed(matched_rules, *matched_args)
42
42
  return unless Completions.active?
43
43
 
44
- completions.print_completions_and_exit(
45
- matched_rules,
46
- *matched_args,
47
- state: state
48
- )
44
+ completions.print_completions_and_exit(matched_rules, *matched_args, state: state)
49
45
  end
50
46
 
51
47
  def remaining_rules
@@ -56,15 +52,9 @@ module Tomo
56
52
 
57
53
  def raise_unrecognized_args
58
54
  problem_arg = argv.first
59
- type = if literal || !problem_arg.start_with?("-")
60
- "arg"
61
- else
62
- "option"
63
- end
55
+ type = literal || !problem_arg.start_with?("-") ? "arg" : "option"
64
56
 
65
- raise CLI::Error,
66
- "#{Colors.yellow(problem_arg)} is not a recognized #{type} "\
67
- "for this tomo command."
57
+ raise CLI::Error, "#{Colors.yellow(problem_arg)} is not a recognized #{type} for this tomo command."
68
58
  end
69
59
  end
70
60
  end
@@ -18,9 +18,7 @@ module Tomo
18
18
  end
19
19
 
20
20
  def to_s
21
- indent([
22
- "", banner_proc.call, "Options:", "", indent(options_help), "\n"
23
- ].join("\n"))
21
+ indent(["", banner_proc.call, "Options:", "", indent(options_help), "\n"].join("\n"))
24
22
  end
25
23
 
26
24
  private