rfix 1.4.1 → 2.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 (219) hide show
  1. checksums.yaml +4 -4
  2. data/exe/rfix +78 -34
  3. data/lib/rfix.rb +17 -28
  4. data/lib/rfix/branch.rb +3 -25
  5. data/lib/rfix/branch/base.rb +27 -0
  6. data/lib/rfix/branch/head.rb +15 -0
  7. data/lib/rfix/branch/main.rb +33 -0
  8. data/lib/rfix/branch/name.rb +21 -0
  9. data/lib/rfix/branch/reference.rb +15 -0
  10. data/lib/rfix/branch/upstream.rb +17 -0
  11. data/lib/rfix/cli/command.rb +19 -0
  12. data/lib/rfix/cli/command/base.rb +61 -0
  13. data/lib/rfix/cli/command/branch.rb +13 -0
  14. data/lib/rfix/cli/command/config.rb +22 -0
  15. data/lib/rfix/cli/command/extension.rb +25 -0
  16. data/lib/rfix/cli/command/help.rb +11 -0
  17. data/lib/rfix/cli/command/info.rb +11 -0
  18. data/lib/rfix/cli/command/lint.rb +17 -0
  19. data/lib/rfix/cli/command/local.rb +11 -0
  20. data/lib/rfix/cli/command/origin.rb +11 -0
  21. data/lib/rfix/cli/command/setup.rb +11 -0
  22. data/lib/rfix/error.rb +5 -1
  23. data/lib/rfix/extension/offense.rb +79 -0
  24. data/lib/rfix/extension/pastel.rb +11 -0
  25. data/lib/rfix/extension/string.rb +12 -0
  26. data/lib/rfix/extension/strings.rb +9 -0
  27. data/lib/rfix/file.rb +6 -41
  28. data/lib/rfix/file/base.rb +73 -0
  29. data/lib/rfix/file/deleted.rb +17 -0
  30. data/lib/rfix/file/ignored.rb +17 -0
  31. data/lib/rfix/file/tracked.rb +42 -0
  32. data/lib/rfix/file/untracked.rb +20 -0
  33. data/lib/rfix/formatter.rb +125 -86
  34. data/lib/rfix/highlighter.rb +118 -0
  35. data/lib/rfix/indicator.rb +19 -0
  36. data/lib/rfix/log.rb +12 -121
  37. data/lib/rfix/rake/gemfile.rb +111 -0
  38. data/lib/rfix/rake/paths.rb +25 -23
  39. data/lib/rfix/rake/support.rb +72 -57
  40. data/lib/rfix/repository.rb +114 -164
  41. data/lib/rfix/types.rb +52 -0
  42. data/lib/rfix/version.rb +1 -1
  43. data/rfix.gemspec +28 -38
  44. data/vendor/dry-cli/CHANGELOG.md +191 -0
  45. data/vendor/dry-cli/CODEOWNERS +1 -0
  46. data/vendor/dry-cli/CODE_OF_CONDUCT.md +13 -0
  47. data/vendor/dry-cli/CONTRIBUTING.md +29 -0
  48. data/vendor/dry-cli/Gemfile +14 -0
  49. data/vendor/dry-cli/Gemfile.devtools +18 -0
  50. data/vendor/dry-cli/LICENSE +20 -0
  51. data/vendor/dry-cli/README.md +29 -0
  52. data/vendor/dry-cli/Rakefile +13 -0
  53. data/vendor/dry-cli/bin/console +15 -0
  54. data/vendor/dry-cli/bin/setup +8 -0
  55. data/vendor/dry-cli/changelog.yml +97 -0
  56. data/vendor/dry-cli/docsite/source/arguments.html.md +57 -0
  57. data/vendor/dry-cli/docsite/source/callbacks.html.md +51 -0
  58. data/vendor/dry-cli/docsite/source/commands-with-subcommands-and-params.md +86 -0
  59. data/vendor/dry-cli/docsite/source/commands.html.md +41 -0
  60. data/vendor/dry-cli/docsite/source/index.html.md +302 -0
  61. data/vendor/dry-cli/docsite/source/options.html.md +51 -0
  62. data/vendor/dry-cli/docsite/source/subcommands.html.md +38 -0
  63. data/vendor/dry-cli/docsite/source/variadic-arguments.html.md +45 -0
  64. data/vendor/dry-cli/dry-cli.gemspec +36 -0
  65. data/vendor/dry-cli/lib/dry/cli.rb +224 -0
  66. data/vendor/dry-cli/lib/dry/cli/banner.rb +135 -0
  67. data/vendor/dry-cli/lib/dry/cli/command.rb +387 -0
  68. data/vendor/dry-cli/lib/dry/cli/command_registry.rb +253 -0
  69. data/vendor/dry-cli/lib/dry/cli/errors.rb +37 -0
  70. data/vendor/dry-cli/lib/dry/cli/inflector.rb +17 -0
  71. data/vendor/dry-cli/lib/dry/cli/inline.rb +75 -0
  72. data/vendor/dry-cli/lib/dry/cli/option.rb +131 -0
  73. data/vendor/dry-cli/lib/dry/cli/parser.rb +138 -0
  74. data/vendor/dry-cli/lib/dry/cli/program_name.rb +21 -0
  75. data/vendor/dry-cli/lib/dry/cli/registry.rb +338 -0
  76. data/vendor/dry-cli/lib/dry/cli/usage.rb +94 -0
  77. data/vendor/dry-cli/lib/dry/cli/version.rb +8 -0
  78. data/vendor/dry-cli/project.yml +13 -0
  79. data/vendor/dry-cli/spec/integration/commands_spec.rb +14 -0
  80. data/vendor/dry-cli/spec/integration/inherited_commands_spec.rb +24 -0
  81. data/vendor/dry-cli/spec/integration/inline_spec.rb +43 -0
  82. data/vendor/dry-cli/spec/integration/processes_errors_spec.rb +29 -0
  83. data/vendor/dry-cli/spec/integration/rendering_spec.rb +31 -0
  84. data/vendor/dry-cli/spec/integration/single_command_spec.rb +81 -0
  85. data/vendor/dry-cli/spec/integration/subcommands_spec.rb +60 -0
  86. data/vendor/dry-cli/spec/integration/third_party_gems_spec.rb +18 -0
  87. data/vendor/dry-cli/spec/spec_helper.rb +15 -0
  88. data/vendor/dry-cli/spec/support/coverage.rb +15 -0
  89. data/vendor/dry-cli/spec/support/files.rb +13 -0
  90. data/vendor/dry-cli/spec/support/fixtures/based +65 -0
  91. data/vendor/dry-cli/spec/support/fixtures/baz +9 -0
  92. data/vendor/dry-cli/spec/support/fixtures/baz_command.rb +19 -0
  93. data/vendor/dry-cli/spec/support/fixtures/foo +588 -0
  94. data/vendor/dry-cli/spec/support/fixtures/infinites +31 -0
  95. data/vendor/dry-cli/spec/support/fixtures/inline +20 -0
  96. data/vendor/dry-cli/spec/support/fixtures/registry.rb +15 -0
  97. data/vendor/dry-cli/spec/support/fixtures/shared_commands.rb +596 -0
  98. data/vendor/dry-cli/spec/support/fixtures/with_block.rb +86 -0
  99. data/vendor/dry-cli/spec/support/fixtures/with_registry.rb +90 -0
  100. data/vendor/dry-cli/spec/support/fixtures/with_zero_arity_block.rb +87 -0
  101. data/vendor/dry-cli/spec/support/helpers.rb +37 -0
  102. data/vendor/dry-cli/spec/support/path.rb +24 -0
  103. data/vendor/dry-cli/spec/support/rspec.rb +26 -0
  104. data/vendor/dry-cli/spec/support/rspec_options.rb +16 -0
  105. data/vendor/dry-cli/spec/support/shared_examples/commands.rb +300 -0
  106. data/vendor/dry-cli/spec/support/shared_examples/inherited_commands.rb +197 -0
  107. data/vendor/dry-cli/spec/support/shared_examples/rendering.rb +181 -0
  108. data/vendor/dry-cli/spec/support/shared_examples/subcommands.rb +226 -0
  109. data/vendor/dry-cli/spec/support/shared_examples/third_party_gems.rb +49 -0
  110. data/vendor/dry-cli/spec/support/warnings.rb +10 -0
  111. data/vendor/dry-cli/spec/unit/dry/cli/cli_spec.rb +123 -0
  112. data/vendor/dry-cli/spec/unit/dry/cli/inflector_spec.rb +26 -0
  113. data/vendor/dry-cli/spec/unit/dry/cli/registry_spec.rb +78 -0
  114. data/vendor/dry-cli/spec/unit/dry/cli/version_spec.rb +7 -0
  115. data/vendor/strings-ansi/CHANGELOG.md +24 -0
  116. data/vendor/strings-ansi/CODE_OF_CONDUCT.md +74 -0
  117. data/vendor/strings-ansi/Gemfile +11 -0
  118. data/{LICENSE.txt → vendor/strings-ansi/LICENSE.txt} +1 -1
  119. data/vendor/strings-ansi/README.md +155 -0
  120. data/vendor/strings-ansi/Rakefile +8 -0
  121. data/vendor/strings-ansi/appveyor.yml +32 -0
  122. data/vendor/strings-ansi/bin/console +14 -0
  123. data/vendor/strings-ansi/bin/setup +8 -0
  124. data/vendor/strings-ansi/lib/strings-ansi.rb +1 -0
  125. data/vendor/strings-ansi/lib/strings/ansi.rb +84 -0
  126. data/vendor/strings-ansi/lib/strings/ansi/extensions.rb +23 -0
  127. data/vendor/strings-ansi/lib/strings/ansi/version.rb +7 -0
  128. data/vendor/strings-ansi/spec/fixtures/ansi_codes.yaml +194 -0
  129. data/vendor/strings-ansi/spec/spec_helper.rb +51 -0
  130. data/vendor/strings-ansi/spec/unit/ansi_spec.rb +15 -0
  131. data/vendor/strings-ansi/spec/unit/extensions_spec.rb +19 -0
  132. data/vendor/strings-ansi/spec/unit/only_ansi_spec.rb +36 -0
  133. data/vendor/strings-ansi/spec/unit/sanitize_spec.rb +53 -0
  134. data/vendor/strings-ansi/strings-ansi.gemspec +34 -0
  135. data/vendor/strings-ansi/tasks/console.rake +11 -0
  136. data/vendor/strings-ansi/tasks/coverage.rake +11 -0
  137. data/vendor/strings-ansi/tasks/spec.rake +29 -0
  138. metadata +274 -188
  139. data/.github/workflows/main.yml +0 -26
  140. data/.gitignore +0 -43
  141. data/.rspec +0 -2
  142. data/.rubocop.yml +0 -87
  143. data/.travis.yml +0 -35
  144. data/Gemfile +0 -2
  145. data/Gemfile.base +0 -14
  146. data/Gemfile.base.lock +0 -172
  147. data/Gemfile.lock +0 -188
  148. data/Guardfile +0 -16
  149. data/Makefile +0 -12
  150. data/README.md +0 -85
  151. data/Rakefile +0 -31
  152. data/bin/bundle +0 -114
  153. data/bin/console +0 -29
  154. data/bin/guard +0 -29
  155. data/bin/rake +0 -29
  156. data/bin/rfix +0 -29
  157. data/bin/rspec +0 -29
  158. data/bin/setup +0 -29
  159. data/ci/Gemfile.rubocop-0.80 +0 -2
  160. data/ci/Gemfile.rubocop-0.80.lock +0 -170
  161. data/ci/Gemfile.rubocop-0.81 +0 -2
  162. data/ci/Gemfile.rubocop-0.81.lock +0 -170
  163. data/ci/Gemfile.rubocop-0.82 +0 -2
  164. data/ci/Gemfile.rubocop-0.82.lock +0 -170
  165. data/ci/Gemfile.rubocop-0.83 +0 -2
  166. data/ci/Gemfile.rubocop-0.83.lock +0 -168
  167. data/ci/Gemfile.rubocop-0.84 +0 -2
  168. data/ci/Gemfile.rubocop-0.84.lock +0 -171
  169. data/ci/Gemfile.rubocop-0.85 +0 -2
  170. data/ci/Gemfile.rubocop-0.85.1 +0 -2
  171. data/ci/Gemfile.rubocop-0.85.1.lock +0 -173
  172. data/ci/Gemfile.rubocop-0.85.lock +0 -173
  173. data/lib/rfix/box.rb +0 -112
  174. data/lib/rfix/branches/base.rb +0 -15
  175. data/lib/rfix/branches/head.rb +0 -13
  176. data/lib/rfix/branches/main.rb +0 -28
  177. data/lib/rfix/branches/name.rb +0 -23
  178. data/lib/rfix/branches/reference.rb +0 -21
  179. data/lib/rfix/branches/upstream.rb +0 -13
  180. data/lib/rfix/cmd.rb +0 -39
  181. data/lib/rfix/commands/branch.rb +0 -15
  182. data/lib/rfix/commands/extensions/options.rb +0 -8
  183. data/lib/rfix/commands/help.rb +0 -7
  184. data/lib/rfix/commands/helper/args.rb +0 -141
  185. data/lib/rfix/commands/helper/help.rb +0 -6
  186. data/lib/rfix/commands/helper/loader.rb +0 -6
  187. data/lib/rfix/commands/helper/option.rb +0 -0
  188. data/lib/rfix/commands/helper/params.rb +0 -0
  189. data/lib/rfix/commands/helper/rubocop.rb +0 -17
  190. data/lib/rfix/commands/info.rb +0 -30
  191. data/lib/rfix/commands/lint.rb +0 -22
  192. data/lib/rfix/commands/local.rb +0 -12
  193. data/lib/rfix/commands/origin.rb +0 -19
  194. data/lib/rfix/commands/setup.rb +0 -29
  195. data/lib/rfix/commands/welcome.rb +0 -24
  196. data/lib/rfix/deleted.rb +0 -13
  197. data/lib/rfix/extensions/extensions.rb +0 -18
  198. data/lib/rfix/extensions/offense.rb +0 -78
  199. data/lib/rfix/extensions/string.rb +0 -8
  200. data/lib/rfix/file_cache.rb +0 -59
  201. data/lib/rfix/git_helper.rb +0 -59
  202. data/lib/rfix/indentation.rb +0 -39
  203. data/lib/rfix/loader/bundler.rb +0 -37
  204. data/lib/rfix/loader/env.rb +0 -33
  205. data/lib/rfix/loader/spec.rb +0 -41
  206. data/lib/rfix/no_file.rb +0 -13
  207. data/lib/rfix/rfix.rb +0 -34
  208. data/lib/rfix/tracked.rb +0 -72
  209. data/lib/rfix/tracked_file.rb +0 -16
  210. data/lib/rfix/untracked.rb +0 -13
  211. data/resources/ps.png +0 -0
  212. data/tasks/bump.rake +0 -11
  213. data/tasks/bundle.rake +0 -17
  214. data/tasks/complex.rake +0 -54
  215. data/tasks/execute.rake +0 -38
  216. data/tasks/libgit2.rake +0 -33
  217. data/tasks/simple.rake +0 -62
  218. data/tasks/travis.rake +0 -74
  219. data/tasks/vendor.rake +0 -34
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/cli/program_name"
4
+
5
+ module Dry
6
+ class CLI
7
+ # Command(s) usage
8
+ #
9
+ # @since 0.1.0
10
+ # @api private
11
+ module Usage
12
+ # @since 0.1.0
13
+ # @api private
14
+ SUBCOMMAND_BANNER = " [SUBCOMMAND]"
15
+ ROOT_COMMAND_WITH_SUBCOMMANDS_BANNER = " [ARGUMENT|SUBCOMMAND]"
16
+
17
+ # @since 0.1.0
18
+ # @api private
19
+ def self.call(result)
20
+ header = "Commands:"
21
+ max_length, commands = commands_and_arguments(result)
22
+
23
+ commands.map do |banner, node|
24
+ usage = description(node.command) if node.leaf?
25
+ "#{justify(banner, max_length, usage)}#{usage}"
26
+ end.unshift(header).join("\n")
27
+ end
28
+
29
+ # @since 0.1.0
30
+ # @api private
31
+ def self.commands_and_arguments(result)
32
+ max_length = 0
33
+ ret = commands(result).each_with_object({}) do |(name, node), memo|
34
+ args = if node.command && node.leaf? && node.children?
35
+ ROOT_COMMAND_WITH_SUBCOMMANDS_BANNER
36
+ elsif node.leaf?
37
+ arguments(node.command)
38
+ else
39
+ SUBCOMMAND_BANNER
40
+ end
41
+
42
+ partial = " #{command_name(result, name)}#{args}"
43
+ max_length = partial.bytesize if max_length < partial.bytesize
44
+ memo[partial] = node
45
+ end
46
+
47
+ [max_length, ret]
48
+ end
49
+
50
+ # @since 0.1.0
51
+ # @api private
52
+ def self.arguments(command)
53
+ return unless CLI.command?(command)
54
+
55
+ required_arguments = command.required_arguments
56
+ optional_arguments = command.optional_arguments
57
+
58
+ required = required_arguments.map { |arg| arg.name.upcase }.join(" ") if required_arguments.any? # rubocop:disable Metrics/LineLength
59
+ optional = optional_arguments.map { |arg| "[#{arg.name.upcase}]" }.join(" ") if optional_arguments.any? # rubocop:disable Metrics/LineLength
60
+ result = [required, optional].compact
61
+
62
+ " #{result.join(" ")}" unless result.empty?
63
+ end
64
+
65
+ # @since 0.1.0
66
+ # @api private
67
+ def self.description(command)
68
+ return unless CLI.command?(command)
69
+
70
+ " # #{command.description}" unless command.description.nil?
71
+ end
72
+
73
+ # @since 0.1.0
74
+ # @api private
75
+ def self.justify(string, padding, usage)
76
+ return string.chomp(" ") if usage.nil?
77
+
78
+ string.ljust(padding + padding / 2)
79
+ end
80
+
81
+ # @since 0.1.0
82
+ # @api private
83
+ def self.commands(result)
84
+ result.children.sort_by { |name, _| name }
85
+ end
86
+
87
+ # @since 0.1.0
88
+ # @api private
89
+ def self.command_name(result, name)
90
+ ProgramName.call([result.names, name])
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dry
4
+ class CLI
5
+ # @since 0.1.0
6
+ VERSION = "0.6.0"
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ name: dry-cli
2
+ codacy_id: 61dd5d070fc74f0cacf575b19d4930e1
3
+ gemspec:
4
+ authors: ["Luca Guidi"]
5
+ email: ["me@lucaguidi.com"]
6
+ summary: "Common framework to build command line interfaces with Ruby"
7
+ required_ruby_version: ">= 2.4.0"
8
+ development_dependencies:
9
+ - [bundler, ">= 1.6", "< 3"]
10
+ - [rake, "~> 13.0"]
11
+ - [rspec, "~> 3.7"]
12
+ - [simplecov, "~> 0.17.1"]
13
+ - [rubocop, "~> 0.82"]
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe "Commands" do
4
+ context "with extra params" do
5
+ context "when there is a required argument" do
6
+ context "and there are options" do
7
+ it "parses both separately" do
8
+ output = `foo variadic with-mandatory-and-options uno -- due tre --blah`
9
+ expect(output).to eq("first: uno\nurl: \nmethod: \nUnused Arguments: due, tre, --blah\n")
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe "Inherited commands" do
4
+ context "when --help flag" do
5
+ it "subclass do not" do
6
+ output = `based --help 2>&1`
7
+ expected = <<~OUT
8
+ Commands:
9
+ based addons APP # Lists your add-ons and attachments
10
+ based logs APP # Display recent log output
11
+ based run APP CMD # Run a one-off process inside your app
12
+ based subrun APP CMD
13
+ OUT
14
+ expect(output).to eq(expected)
15
+ end
16
+ end
17
+
18
+ it "works for subclasses" do
19
+ output = `based subrun application_name command_to_run`
20
+ expect(output).to eq(
21
+ "Run - App: application_name - Command: command_to_run - Options: {:verbosity=>\"INFO\"}\n"
22
+ )
23
+ end
24
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+
5
+ RSpec.describe "Inline" do
6
+ context "with command" do
7
+ let(:cmd) { "inline" }
8
+
9
+ it "shows help" do
10
+ output = `inline -h`
11
+ expected_output = <<~OUTPUT
12
+ Command:
13
+ inline
14
+
15
+ Usage:
16
+ inline MANDATORY_ARG [OPTIONAL_ARG]
17
+
18
+ Description:
19
+ Baz command line interface
20
+
21
+ Arguments:
22
+ MANDATORY_ARG # REQUIRED Mandatory argument
23
+ OPTIONAL_ARG # Optional argument (has to have default value in call method)
24
+
25
+ Options:
26
+ --option-one=VALUE, -1 VALUE # Option one
27
+ --[no-]boolean-option, -b # Option boolean
28
+ --option-with-default=VALUE, -d VALUE # Option default, default: "test"
29
+ --help, -h # Print this help
30
+ OUTPUT
31
+ expect(output).to eq(expected_output)
32
+ end
33
+
34
+ it "with underscored option_one" do
35
+ output = `inline first_arg -1 test2 -bd test3`
36
+ expect(output).to eq(
37
+ "mandatory_arg: first_arg. optional_arg: optional_arg. " \
38
+ 'Options: {:option_with_default=>"test3", :option_one=>"test2", :boolean_option=>true}' \
39
+ "\n"
40
+ )
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe "Processes Errors" do
4
+ context "when SignalException" do
5
+ it "returns correct statuscode" do
6
+ pid1, pid2, pid15 = Array.new(3).map { Process.spawn("foo generate app SomeAppName") }
7
+ sleep 0.5 # time to start app
8
+
9
+ Process.kill("HUP", pid1)
10
+ Process.kill("INT", pid2)
11
+ Process.kill("TERM", pid15)
12
+
13
+ _, status1 = Process.wait2(pid1)
14
+ _, status2 = Process.wait2(pid2)
15
+ _, status15 = Process.wait2(pid15)
16
+
17
+ expect(status1.exitstatus).to eq(129)
18
+ expect(status2.exitstatus).to eq(130)
19
+ expect(status15.exitstatus).to eq(143)
20
+ end
21
+ end
22
+
23
+ context "when Pipe Exception" do
24
+ it "handles EPIPE without stacktrace" do
25
+ output = `infinites writer | head -n 3`
26
+ expect(output).to eq("0\n1\n2\n")
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+
5
+ RSpec.describe "Rendering" do
6
+ it "prints available commands for unknown command" do
7
+ _, stderr, = Open3.capture3("foo unknown")
8
+
9
+ expected = <<~DESC
10
+ Commands:
11
+ foo assets [SUBCOMMAND]
12
+ foo callbacks DIR # Command with callbacks
13
+ foo console # Starts Foo console
14
+ foo db [SUBCOMMAND]
15
+ foo destroy [SUBCOMMAND]
16
+ foo exec TASK [DIRS] # Execute a task
17
+ foo generate [SUBCOMMAND]
18
+ foo greeting [RESPONSE]
19
+ foo hello # Print a greeting
20
+ foo new PROJECT # Generate a new Foo project
21
+ foo root-command [ARGUMENT|SUBCOMMAND] # Root command with arguments and subcommands
22
+ foo routes # Print routes
23
+ foo server # Start Foo server (only for development)
24
+ foo sub [SUBCOMMAND]
25
+ foo variadic [SUBCOMMAND]
26
+ foo version # Print Foo version
27
+ DESC
28
+
29
+ expect(stderr).to eq(expected)
30
+ end
31
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+
5
+ RSpec.describe "Single command" do
6
+ context "with command" do
7
+ let(:cmd) { "baz" }
8
+
9
+ it "shows usage" do
10
+ _, stderr, = Open3.capture3("baz")
11
+ expect(stderr).to eq(
12
+ "ERROR: \"#{cmd}\" was called with no arguments\nUsage: \"#{cmd} MANDATORY_ARG\"\n"
13
+ )
14
+ end
15
+
16
+ it "shows help" do
17
+ output = `baz -h`
18
+ expected_output = <<~OUTPUT
19
+ Command:
20
+ #{cmd}
21
+
22
+ Usage:
23
+ #{cmd} MANDATORY_ARG [OPTIONAL_ARG]
24
+
25
+ Description:
26
+ Baz command line interface
27
+
28
+ Arguments:
29
+ MANDATORY_ARG # REQUIRED Mandatory argument
30
+ OPTIONAL_ARG # Optional argument (has to have default value in call method)
31
+
32
+ Options:
33
+ --option-one=VALUE, -1 VALUE # Option one
34
+ --[no-]boolean-option, -b # Option boolean
35
+ --option-with-default=VALUE, -d VALUE # Option default, default: "test"
36
+ --help, -h # Print this help
37
+ OUTPUT
38
+ expect(output).to eq(expected_output)
39
+ end
40
+
41
+ it "with option_one" do
42
+ output = `baz first_arg --option-one=test2`
43
+ expect(output).to eq(
44
+ "mandatory_arg: first_arg. optional_arg: optional_arg. " \
45
+ "Options: {:option_with_default=>\"test\", :option_one=>\"test2\"}\n"
46
+ )
47
+ end
48
+
49
+ it "with combination of aliases" do
50
+ output = `baz first_arg -bd test3`
51
+ expect(output).to eq(
52
+ "mandatory_arg: first_arg. optional_arg: optional_arg. " \
53
+ "Options: {:option_with_default=>\"test3\", :boolean_option=>true}\n"
54
+ )
55
+ end
56
+ end
57
+
58
+ context "root command with arguments and subcommands" do
59
+ it "with arguments" do
60
+ output = `foo root-command "hello world"`
61
+
62
+ expected = <<~DESC
63
+ I'm a root-command argument:hello world
64
+ I'm a root-command option:
65
+ DESC
66
+
67
+ expect(output).to eq(expected)
68
+ end
69
+
70
+ it "with options" do
71
+ output = `foo root-command "hello world" --root-command-option="bye world"`
72
+
73
+ expected = <<~DESC
74
+ I'm a root-command argument:hello world
75
+ I'm a root-command option:bye world
76
+ DESC
77
+
78
+ expect(output).to eq(expected)
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+
5
+ RSpec.describe "Subcommands" do
6
+ context "works with params" do
7
+ it "with help param" do
8
+ output = `foo generate model --help`
9
+
10
+ expected = <<~DESC
11
+ Command:
12
+ foo generate model
13
+
14
+ Usage:
15
+ foo generate model MODEL
16
+
17
+ Description:
18
+ Generate a model
19
+
20
+ Arguments:
21
+ MODEL # REQUIRED Model name (eg. `user`)
22
+
23
+ Options:
24
+ --[no-]skip-migration # Skip migration, default: false
25
+ --help, -h # Print this help
26
+
27
+ Examples:
28
+ foo generate model user # Generate `User` entity, `UserRepository` repository, and the migration
29
+ foo generate model user --skip-migration # Generate `User` entity and `UserRepository` repository
30
+ DESC
31
+
32
+ expect(output).to eq(expected)
33
+ end
34
+ end
35
+
36
+ context "works with root command subcommands" do
37
+ it "with params" do
38
+ output = `foo root-command sub-command "hello world"`
39
+
40
+ expected = <<~DESC
41
+ I'm a root-command sub-command argument:hello world
42
+ I'm a root-command sub-command option:
43
+ DESC
44
+
45
+ expect(output).to eq(expected)
46
+ end
47
+
48
+ it "with options" do
49
+ option = '--root-command-sub-command-option="bye world"'
50
+ output = `foo root-command sub-command "hello world" #{option}`
51
+
52
+ expected = <<~DESC
53
+ I'm a root-command sub-command argument:hello world
54
+ I'm a root-command sub-command option:bye world
55
+ DESC
56
+
57
+ expect(output).to eq(expected)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe "Third-party gems" do
4
+ it "allows to add callbacks as a block" do
5
+ output = `foo callbacks . --url=https://hanamirb.test`
6
+
7
+ expected = <<~OUTPUT
8
+ before command callback Foo::Webpack::CLI::CallbacksCommand {:url=>"https://hanamirb.test", :dir=>"."}
9
+ before callback (class), 2 arg(s): {:url=>"https://hanamirb.test", :dir=>"."}
10
+ before callback (object), 2 arg(s): {:url=>"https://hanamirb.test", :dir=>"."}
11
+ dir: ., url: "https://hanamirb.test"
12
+ after command callback Foo::Webpack::CLI::CallbacksCommand {:url=>"https://hanamirb.test", :dir=>"."}
13
+ after callback (class), 2 arg(s): {:url=>"https://hanamirb.test", :dir=>"."}
14
+ after callback (object), 2 arg(s): {:url=>"https://hanamirb.test", :dir=>"."}
15
+ OUTPUT
16
+ expect(output).to eq(expected)
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "support/coverage"
4
+
5
+ $LOAD_PATH.unshift "lib"
6
+ require "dry/cli"
7
+ require_relative "./support/rspec"
8
+
9
+ %w[support].each do |dir|
10
+ Dir[File.join(Dir.pwd, "spec", dir, "**", "*.rb")].each do |file|
11
+ unless file["support/warnings.rb"]
12
+ require_relative file
13
+ end
14
+ end
15
+ end