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,86 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.unshift __dir__ + "/../../lib"
5
+ require "dry/cli"
6
+ require_relative "shared_commands"
7
+
8
+ WithBlock = Dry::CLI.new do |cli|
9
+ cli.register "assets precompile", Commands::Assets::Precompile
10
+ cli.register "console", Commands::Console
11
+
12
+ cli.register "new", Commands::New
13
+ cli.register "routes", Commands::Routes
14
+ cli.register "server", Commands::Server, aliases: ["s"]
15
+ cli.register "version", Commands::Version, aliases: ["v", "-v", "--version"]
16
+ cli.register "exec", Commands::Exec
17
+
18
+ cli.register "hello", Commands::Hello
19
+ cli.register "greeting", Commands::Greeting
20
+ cli.register "sub command", Commands::Sub::Command
21
+ cli.register "with-initializer", Commands::InitializedCommand.new(prop: "prop_val")
22
+ cli.register "root-command", Commands::RootCommand do |prefix|
23
+ prefix.register "sub-command", Commands::RootCommands::SubCommand
24
+ end
25
+
26
+ cli.register "options-with-aliases", Commands::OptionsWithAliases
27
+ cli.register "variadic default", Commands::VariadicArguments
28
+ cli.register "variadic with-mandatory", Commands::MandatoryAndVariadicArguments
29
+ cli.register "variadic with-mandatory-and-options", Commands::MandatoryOptionsAndVariadicArguments
30
+
31
+ cli.register "generate webpack", Webpack::CLI::Generate
32
+ cli.register "hello", Webpack::CLI::Hello
33
+ cli.register "sub command", Webpack::CLI::SubCommand
34
+ cli.register "callbacks", Webpack::CLI::CallbacksCommand
35
+
36
+ cli.register "db" do |prefix|
37
+ prefix.register "apply", Commands::DB::Apply
38
+ prefix.register "console", Commands::DB::Console
39
+ prefix.register "create", Commands::DB::Create
40
+ prefix.register "drop", Commands::DB::Drop
41
+ prefix.register "migrate", Commands::DB::Migrate
42
+ prefix.register "prepare", Commands::DB::Prepare
43
+ prefix.register "version", Commands::DB::Version
44
+ prefix.register "rollback", Commands::DB::Rollback
45
+ end
46
+
47
+ cli.register "destroy", aliases: ["d"] do |prefix|
48
+ prefix.register "action", Commands::Destroy::Action
49
+ prefix.register "app", Commands::Destroy::App
50
+ prefix.register "mailer", Commands::Destroy::Mailer
51
+ prefix.register "migration", Commands::Destroy::Migration
52
+ prefix.register "model", Commands::Destroy::Model
53
+ end
54
+
55
+ cli.register "generate", aliases: ["g"] do |prefix|
56
+ prefix.register "action", Commands::Generate::Action
57
+ prefix.register "app", Commands::Generate::App
58
+ prefix.register "mailer", Commands::Generate::Mailer
59
+ prefix.register "migration", Commands::Generate::Migration
60
+ prefix.register "model", Commands::Generate::Model
61
+ prefix.register "secret", Commands::Generate::Secret
62
+ end
63
+
64
+ # we need to be sure that command will not override with nil command
65
+ cli.register "generate webpack", nil
66
+
67
+ cli.before("callbacks") do |args|
68
+ puts "before command callback #{self.class.name} #{args.inspect}"
69
+ end
70
+
71
+ cli.after("callbacks") do |args|
72
+ puts "after command callback #{self.class.name} #{args.inspect}"
73
+ end
74
+
75
+ cli.register "inherited", aliases: ["i"] do |prefix|
76
+ prefix.register "run", InheritedCommands::Run
77
+ prefix.register "subrun", InheritedCommands::SubRun
78
+ prefix.register "logs", InheritedCommands::Logs
79
+ prefix.register "addons", InheritedCommands::Addons
80
+ end
81
+
82
+ cli.before "callbacks", Callbacks::BeforeClass
83
+ cli.after "callbacks", Callbacks::AfterClass
84
+ cli.before "callbacks", Callbacks::Before.new
85
+ cli.after "callbacks", Callbacks::After.new
86
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift __dir__ + "/../../lib"
4
+ require "dry/cli"
5
+ require_relative "shared_commands"
6
+
7
+ module Foo
8
+ module CLI
9
+ module Commands
10
+ extend Dry::CLI::Registry
11
+
12
+ register "assets precompile", ::Commands::Assets::Precompile
13
+ register "console", ::Commands::Console
14
+ register "db" do |prefix|
15
+ prefix.register "apply", ::Commands::DB::Apply
16
+ prefix.register "console", ::Commands::DB::Console
17
+ prefix.register "create", ::Commands::DB::Create
18
+ prefix.register "drop", ::Commands::DB::Drop
19
+ prefix.register "migrate", ::Commands::DB::Migrate
20
+ prefix.register "prepare", ::Commands::DB::Prepare
21
+ prefix.register "version", ::Commands::DB::Version
22
+ prefix.register "rollback", ::Commands::DB::Rollback
23
+ end
24
+
25
+ register "destroy", aliases: ["d"] do |prefix|
26
+ prefix.register "action", ::Commands::Destroy::Action
27
+ prefix.register "app", ::Commands::Destroy::App
28
+ prefix.register "mailer", ::Commands::Destroy::Mailer
29
+ prefix.register "migration", ::Commands::Destroy::Migration
30
+ prefix.register "model", ::Commands::Destroy::Model
31
+ end
32
+
33
+ register "generate", aliases: ["g"] do |prefix|
34
+ prefix.register "action", ::Commands::Generate::Action
35
+ prefix.register "app", ::Commands::Generate::App
36
+ prefix.register "mailer", ::Commands::Generate::Mailer
37
+ prefix.register "migration", ::Commands::Generate::Migration
38
+ prefix.register "model", ::Commands::Generate::Model
39
+ prefix.register "secret", ::Commands::Generate::Secret
40
+ end
41
+
42
+ register "inherited", aliases: ["i"] do |prefix|
43
+ prefix.register "run", ::InheritedCommands::Run
44
+ prefix.register "subrun", ::InheritedCommands::SubRun
45
+ prefix.register "logs", ::InheritedCommands::Logs
46
+ prefix.register "addons", ::InheritedCommands::Addons
47
+ end
48
+
49
+ register "new", ::Commands::New
50
+ register "routes", ::Commands::Routes
51
+ register "server", ::Commands::Server, aliases: ["s"]
52
+ register "version", ::Commands::Version, aliases: ["v", "-v", "--version"]
53
+ register "exec", ::Commands::Exec
54
+
55
+ register "hello", ::Commands::Hello
56
+ register "greeting", ::Commands::Greeting
57
+ register "sub command", ::Commands::Sub::Command
58
+ register "with-initializer", ::Commands::InitializedCommand.new(prop: "prop_val")
59
+ register "root-command", ::Commands::RootCommand
60
+ register "root-command sub-command", ::Commands::RootCommands::SubCommand
61
+
62
+ register "options-with-aliases", ::Commands::OptionsWithAliases
63
+ register "variadic default", ::Commands::VariadicArguments
64
+ register "variadic with-mandatory", ::Commands::MandatoryAndVariadicArguments
65
+ register "variadic with-mandatory-and-options", ::Commands::MandatoryOptionsAndVariadicArguments # rubocop:disable Metrics/LineLength
66
+
67
+ register "generate webpack", ::Webpack::CLI::Generate
68
+ register "hello", ::Webpack::CLI::Hello
69
+ register "sub command", ::Webpack::CLI::SubCommand
70
+ register "callbacks", ::Webpack::CLI::CallbacksCommand
71
+
72
+ register "generate webpack", nil
73
+
74
+ before("callbacks") do |args|
75
+ puts "before command callback #{self.class.name} #{args.inspect}"
76
+ end
77
+
78
+ after("callbacks") do |args|
79
+ puts "after command callback #{self.class.name} #{args.inspect}"
80
+ end
81
+
82
+ before("callbacks", ::Callbacks::BeforeClass)
83
+ after("callbacks", ::Callbacks::AfterClass)
84
+ before("callbacks", ::Callbacks::Before.new)
85
+ after("callbacks", ::Callbacks::After.new)
86
+ end
87
+ end
88
+ end
89
+
90
+ WithRegistry = Dry::CLI.new(Foo::CLI::Commands)
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.unshift __dir__ + "/../../lib"
5
+ require "dry/cli"
6
+ require_relative "shared_commands"
7
+
8
+ WithZeroArityBlock = Dry.CLI do
9
+ register "assets precompile", Commands::Assets::Precompile
10
+ register "console", Commands::Console
11
+
12
+ register "new", Commands::New
13
+ register "routes", Commands::Routes
14
+ register "server", Commands::Server, aliases: ["s"]
15
+ register "version", Commands::Version, aliases: ["v", "-v", "--version"]
16
+ register "exec", Commands::Exec
17
+
18
+ register "hello", Commands::Hello
19
+ register "greeting", Commands::Greeting
20
+ register "sub command", Commands::Sub::Command
21
+ register "with-initializer", Commands::InitializedCommand.new(prop: "prop_val")
22
+ register "root-command", Commands::RootCommand
23
+ register "root-command" do
24
+ register "sub-command", Commands::RootCommands::SubCommand
25
+ end
26
+
27
+ register "options-with-aliases", Commands::OptionsWithAliases
28
+ register "variadic default", Commands::VariadicArguments
29
+ register "variadic with-mandatory", Commands::MandatoryAndVariadicArguments
30
+ register "variadic with-mandatory-and-options", Commands::MandatoryOptionsAndVariadicArguments
31
+
32
+ register "generate webpack", Webpack::CLI::Generate
33
+ register "hello", Webpack::CLI::Hello
34
+ register "sub command", Webpack::CLI::SubCommand
35
+ register "callbacks", Webpack::CLI::CallbacksCommand
36
+
37
+ register "db" do
38
+ register "apply", Commands::DB::Apply
39
+ register "console", Commands::DB::Console
40
+ register "create", Commands::DB::Create
41
+ register "drop", Commands::DB::Drop
42
+ register "migrate", Commands::DB::Migrate
43
+ register "prepare", Commands::DB::Prepare
44
+ register "version", Commands::DB::Version
45
+ register "rollback", Commands::DB::Rollback
46
+ end
47
+
48
+ register "destroy", aliases: ["d"] do
49
+ register "action", Commands::Destroy::Action
50
+ register "app", Commands::Destroy::App
51
+ register "mailer", Commands::Destroy::Mailer
52
+ register "migration", Commands::Destroy::Migration
53
+ register "model", Commands::Destroy::Model
54
+ end
55
+
56
+ register "generate", aliases: ["g"] do
57
+ register "action", Commands::Generate::Action
58
+ register "app", Commands::Generate::App
59
+ register "mailer", Commands::Generate::Mailer
60
+ register "migration", Commands::Generate::Migration
61
+ register "model", Commands::Generate::Model
62
+ register "secret", Commands::Generate::Secret
63
+ end
64
+
65
+ register "inherited", aliases: ["i"] do
66
+ register "run", InheritedCommands::Run
67
+ register "subrun", InheritedCommands::SubRun
68
+ register "logs", InheritedCommands::Logs
69
+ register "addons", InheritedCommands::Addons
70
+ end
71
+
72
+ # we need to be sure that command will not override with nil command
73
+ register "generate webpack", nil
74
+
75
+ before("callbacks") do |args|
76
+ puts "before command callback #{self.class.name} #{args.inspect}"
77
+ end
78
+
79
+ after("callbacks") do |args|
80
+ puts "after command callback #{self.class.name} #{args.inspect}"
81
+ end
82
+
83
+ before "callbacks", Callbacks::BeforeClass
84
+ after "callbacks", Callbacks::AfterClass
85
+ before "callbacks", Callbacks::Before.new
86
+ after "callbacks", Callbacks::After.new
87
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpec
4
+ module Support
5
+ module Helpers
6
+ def capture_output
7
+ require "stringio"
8
+ output = StringIO.new
9
+ original_stdout = $stdout
10
+ $stdout = output
11
+ yield
12
+ output.string
13
+ rescue SystemExit
14
+ output.string
15
+ ensure
16
+ $stdout = original_stdout
17
+ end
18
+
19
+ def capture_error
20
+ require "stringio"
21
+ error = StringIO.new
22
+ original_stderr = $stderr
23
+ $stderr = error
24
+ yield
25
+ error.string
26
+ rescue SystemExit
27
+ error.string
28
+ ensure
29
+ $stderr = original_stderr
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ RSpec.configure do |config|
36
+ config.include(RSpec::Support::Helpers)
37
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpec
4
+ module Support
5
+ module Path
6
+ def self.included(base)
7
+ base.class_eval do
8
+ before do
9
+ @original_path = ENV["PATH"]
10
+ ENV["PATH"] = __dir__ + "/fixtures:" + ENV["PATH"]
11
+ end
12
+
13
+ after do
14
+ ENV["PATH"] = @original_path
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ RSpec.configure do |config|
23
+ config.include(RSpec::Support::Path)
24
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.configure do |config|
4
+ config.expect_with :rspec do |expectations|
5
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
6
+ end
7
+
8
+ config.mock_with :rspec do |mocks|
9
+ mocks.verify_partial_doubles = true
10
+ end
11
+
12
+ config.shared_context_metadata_behavior = :apply_to_host_groups
13
+
14
+ config.filter_run_when_matching :focus
15
+
16
+ config.disable_monkey_patching!
17
+
18
+ config.warnings = true
19
+
20
+ config.default_formatter = "doc" if config.files_to_run.one?
21
+ config.profile_examples = 10
22
+
23
+ config.order = :random
24
+
25
+ Kernel.srand config.seed
26
+ end
@@ -0,0 +1,16 @@
1
+ RSpec.configure do |config|
2
+ # When no filter given, search and run focused tests
3
+ config.filter_run_when_matching :focus
4
+
5
+ # Disables rspec monkey patches (no reason for their existence tbh)
6
+ config.disable_monkey_patching!
7
+
8
+ # Run ruby in verbose mode
9
+ config.warnings = true
10
+
11
+ # Collect all failing expectations automatically,
12
+ # without calling aggregate_failures everywhere
13
+ config.define_derived_metadata do |meta|
14
+ meta[:aggregate_failures] = true
15
+ end
16
+ end
@@ -0,0 +1,300 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Metrics/LineLength
4
+ RSpec.shared_examples "Commands" do |cli|
5
+ let(:cli) { cli }
6
+
7
+ let(:cmd) { File.basename($PROGRAM_NAME, File.extname($PROGRAM_NAME)) }
8
+
9
+ it "calls basic command" do
10
+ output = capture_output { cli.call(arguments: ["version"]) }
11
+ expect(output).to eq("v1.0.0\n")
12
+ end
13
+
14
+ it "calls basic command with alias" do
15
+ output = capture_output { cli.call(arguments: ["v"]) }
16
+ expect(output).to eq("v1.0.0\n")
17
+
18
+ output = capture_output { cli.call(arguments: ["-v"]) }
19
+ expect(output).to eq("v1.0.0\n")
20
+
21
+ output = capture_output { cli.call(arguments: ["--version"]) }
22
+ expect(output).to eq("v1.0.0\n")
23
+ end
24
+
25
+ it "calls subcommand via intermediate alias" do
26
+ output = capture_output { cli.call(arguments: %w[g secret web]) }
27
+ expect(output).to eq("generate secret - app: web\n")
28
+ end
29
+
30
+ context "works with params" do
31
+ it "without params" do
32
+ output = capture_output { cli.call(arguments: ["server"]) }
33
+ expect(output).to eq("server - {:code_reloading=>true, :deps=>[\"dep1\", \"dep2\"]}\n")
34
+ end
35
+
36
+ it "a param using space" do
37
+ output = capture_output { cli.call(arguments: %w[server --server thin]) }
38
+ expect(output).to eq("server - {:code_reloading=>true, :deps=>[\"dep1\", \"dep2\"], :server=>\"thin\"}\n")
39
+ end
40
+
41
+ it "a param using equal sign" do
42
+ output = capture_output { cli.call(arguments: %w[server --host=localhost]) }
43
+ expect(output).to eq("server - {:code_reloading=>true, :deps=>[\"dep1\", \"dep2\"], :host=>\"localhost\"}\n")
44
+ end
45
+
46
+ it "a param using alias" do
47
+ output = capture_output { cli.call(arguments: %w[options-with-aliases -u test]) }
48
+ expect(output).to eq("options with aliases - {:opt=>false, :url=>\"test\"}\n")
49
+
50
+ output = capture_output { cli.call(arguments: %w[options-with-aliases -utest]) }
51
+ expect(output).to eq("options with aliases - {:opt=>false, :url=>\"test\"}\n")
52
+
53
+ output = capture_output { cli.call(arguments: %w[options-with-aliases -f -u test]) }
54
+ expect(output).to eq("options with aliases - {:opt=>false, :flag=>true, :url=>\"test\"}\n")
55
+
56
+ output = capture_output { cli.call(arguments: %w[options-with-aliases -o]) }
57
+ expect(output).to eq("options with aliases - {:opt=>true}\n")
58
+
59
+ output = capture_output { cli.call(arguments: %w[options-with-aliases -of]) }
60
+ expect(output).to eq("options with aliases - {:opt=>true, :flag=>true}\n")
61
+ end
62
+
63
+ it "a param with unknown param" do
64
+ error = capture_error { cli.call(arguments: %w[server --unknown 1234]) }
65
+ expect(error).to eq("ERROR: \"rspec server\" was called with arguments \"--unknown 1234\"\n")
66
+ end
67
+
68
+ it "with boolean param" do
69
+ output = capture_output { cli.call(arguments: ["server"]) }
70
+ expect(output).to eq("server - {:code_reloading=>true, :deps=>[\"dep1\", \"dep2\"]}\n")
71
+
72
+ output = capture_output { cli.call(arguments: %w[server --no-code-reloading]) }
73
+ expect(output).to eq("server - {:code_reloading=>false, :deps=>[\"dep1\", \"dep2\"]}\n")
74
+ end
75
+
76
+ context "with array param" do
77
+ it "allows to omit optional array argument" do
78
+ output = capture_output { cli.call(arguments: %w[exec test]) }
79
+ expect(output).to eq("exec - Task: test - Directories: []\n")
80
+ end
81
+
82
+ it "capture all the remaining arguments" do
83
+ output = capture_output { cli.call(arguments: %w[exec test api admin]) }
84
+ expect(output).to eq("exec - Task: test - Directories: [\"api\", \"admin\"]\n")
85
+ end
86
+ end
87
+
88
+ context "with supported values" do
89
+ context "and with supported value passed" do
90
+ it "call the command with the option" do
91
+ output = capture_output { cli.call(arguments: %w[console --engine=pry]) }
92
+ expect(output).to eq("console - engine: pry\n")
93
+ end
94
+ end
95
+
96
+ context "and with an unknown value passed" do
97
+ it "prints error" do
98
+ error = capture_error { cli.call(arguments: %w[console --engine=unknown]) }
99
+ expect(error).to eq("ERROR: \"rspec console\" was called with arguments \"--engine=unknown\"\n") # rubocop:disable Metrics/LineLength
100
+ end
101
+ end
102
+ end
103
+
104
+ it "with help param" do
105
+ output = capture_output { cli.call(arguments: %w[server --help]) }
106
+
107
+ expected = <<~DESC
108
+ Command:
109
+ #{cmd} server
110
+
111
+ Usage:
112
+ #{cmd} server
113
+
114
+ Description:
115
+ Start Foo server (only for development)
116
+
117
+ Options:
118
+ --server=VALUE # Force a server engine (eg, webrick, puma, thin, etc..)
119
+ --host=VALUE # The host address to bind to
120
+ --port=VALUE, -p VALUE # The port to run the server on
121
+ --debug=VALUE # Turn on debug output
122
+ --warn=VALUE # Turn on warnings
123
+ --daemonize=VALUE # Daemonize the server
124
+ --pid=VALUE # Path to write a pid file after daemonize
125
+ --[no-]code-reloading # Code reloading, default: true
126
+ --deps=VALUE1,VALUE2,.. # List of extra dependencies, default: ["dep1", "dep2"]
127
+ --help, -h # Print this help
128
+
129
+ Examples:
130
+ #{cmd} server # Basic usage (it uses the bundled server engine)
131
+ #{cmd} server --server=webrick # Force `webrick` server engine
132
+ #{cmd} server --host=0.0.0.0 # Bind to a host
133
+ #{cmd} server --port=2306 # Bind to a port
134
+ #{cmd} server --no-code-reloading # Disable code reloading
135
+ DESC
136
+
137
+ expect(output).to eq(expected)
138
+ end
139
+
140
+ context "with required params" do
141
+ it "can be used" do
142
+ output = capture_output { cli.call(arguments: %w[new bookshelf]) }
143
+ expect(output).to eq("new - project: bookshelf\n")
144
+ end
145
+
146
+ it "with unknown param" do
147
+ error = capture_error { cli.call(arguments: %w[new bookshelf --unknown 1234]) }
148
+ expect(error).to eq("ERROR: \"rspec new\" was called with arguments \"bookshelf --unknown 1234\"\n") # rubocop:disable Metrics/LineLength
149
+ end
150
+
151
+ it "no required" do
152
+ output = capture_output { cli.call(arguments: %w[generate secret web]) }
153
+ expect(output).to eq("generate secret - app: web\n")
154
+
155
+ output = capture_output { cli.call(arguments: %w[generate secret]) }
156
+ expect(output).to eq("generate secret - app: \n")
157
+ end
158
+
159
+ it "an error is displayed if there aren't required params" do
160
+ error = capture_error { cli.call(arguments: ["new"]) }
161
+ expected_error = <<~DESC
162
+ ERROR: "#{cmd} new" was called with no arguments
163
+ Usage: "#{cmd} new PROJECT"
164
+ DESC
165
+ expect(error).to eq(expected_error)
166
+ end
167
+
168
+ it "with default value and using options" do
169
+ output = capture_output { cli.call(arguments: %w[greeting --person=Alfonso]) }
170
+ expect(output).to eq("response: Hello World, person: Alfonso\n")
171
+
172
+ output = capture_output { cli.call(arguments: %w[greeting bye --person=Alfonso]) }
173
+ expect(output).to eq("response: bye, person: Alfonso\n")
174
+ end
175
+ end
176
+
177
+ context "with extra params" do
178
+ it "is accessible via options[:args]" do
179
+ output = capture_output { cli.call(arguments: %w[variadic default bar baz]) }
180
+ expect(output).to eq("Unused Arguments: bar, baz\n")
181
+ end
182
+
183
+ context "when there is a required argument" do
184
+ it "parses both separately" do
185
+ output = capture_output { cli.call(arguments: ["variadic", "with-mandatory", cmd, "bar", "baz"]) }
186
+ expect(output).to eq("first: #{cmd}\nUnused Arguments: bar, baz\n")
187
+ end
188
+
189
+ context "and there are options" do
190
+ it "parses both separately" do
191
+ output = capture_output { cli.call(arguments: ["variadic", "with-mandatory-and-options", cmd, "bar", "baz"]) }
192
+ expect(output).to eq("first: #{cmd}\nurl: \nmethod: \nUnused Arguments: bar, baz\n")
193
+
194
+ output = capture_output { cli.call(arguments: ["variadic", "with-mandatory-and-options", "--url=root", "--method=index", cmd, "bar", "baz"]) }
195
+ expect(output).to eq("first: #{cmd}\nurl: root\nmethod: index\nUnused Arguments: bar, baz\n")
196
+
197
+ output = capture_output { cli.call(arguments: %w[variadic with-mandatory-and-options uno -- due tre --blah]) }
198
+ expect(output).to eq("first: uno\nurl: \nmethod: \nUnused Arguments: due, tre, --blah\n")
199
+ end
200
+ end
201
+ end
202
+ end
203
+ end
204
+
205
+ context "works with command with arguments and subcommands" do
206
+ it "shows help" do
207
+ output = capture_output { cli.call(arguments: %w[root-command -h]) }
208
+ expected = <<~DESC
209
+ Command:
210
+ #{cmd} root-command
211
+
212
+ Usage:
213
+ #{cmd} root-command ROOT_COMMAND_ARGUMENT | #{cmd} root-command SUBCOMMAND
214
+
215
+ Description:
216
+ Root command with arguments and subcommands
217
+
218
+ Subcommands:
219
+ sub-command # Root command sub command
220
+
221
+ Arguments:
222
+ ROOT_COMMAND_ARGUMENT # REQUIRED Root command argument
223
+
224
+ Options:
225
+ --root-command-option=VALUE # Root command option
226
+ --help, -h # Print this help
227
+ DESC
228
+
229
+ expect(output).to eq(expected)
230
+
231
+ output = capture_output { cli.call(arguments: %w[root-command --help]) }
232
+ expect(output).to eq(expected)
233
+ end
234
+
235
+ context "works with params" do
236
+ it "without params" do
237
+ error = capture_error { cli.call(arguments: %w[root-command]) }
238
+ expected = <<~DESC
239
+ ERROR: "rspec root-command" was called with no arguments
240
+ Usage: "rspec root-command ROOT_COMMAND_ARGUMENT | rspec root-command SUBCOMMAND"
241
+ DESC
242
+
243
+ expect(error).to eq(expected)
244
+ end
245
+
246
+ it "with params" do
247
+ output = capture_output {
248
+ cli.call(arguments: ["root-command", '"hello world"'])
249
+ }
250
+ expected = <<~DESC
251
+ I'm a root-command argument:"hello world"
252
+ I'm a root-command option:
253
+ DESC
254
+
255
+ expect(output).to eq(expected)
256
+ end
257
+
258
+ it "with option using space" do
259
+ output = capture_output {
260
+ cli.call(arguments: [
261
+ "root-command",
262
+ '"hello world"',
263
+ "--root-command-option",
264
+ '"bye world"'
265
+ ])
266
+ }
267
+ expected = <<~DESC
268
+ I'm a root-command argument:"hello world"
269
+ I'm a root-command option:"bye world"
270
+ DESC
271
+
272
+ expect(output).to eq(expected)
273
+ end
274
+
275
+ it "with option using equal sign" do
276
+ output = capture_output {
277
+ cli.call(arguments: [
278
+ "root-command",
279
+ '"hello world"',
280
+ '--root-command-option="bye world"'
281
+ ])
282
+ }
283
+ expected = <<~DESC
284
+ I'm a root-command argument:"hello world"
285
+ I'm a root-command option:"bye world"
286
+ DESC
287
+
288
+ expect(output).to eq(expected)
289
+ end
290
+ end
291
+ end
292
+
293
+ context "works with instances of commands" do
294
+ it "executes instance" do
295
+ output = capture_output { cli.call(arguments: %w[with-initializer]) }
296
+ expect(output).to eq("The value of prop is prop_val\n")
297
+ end
298
+ end
299
+ end
300
+ # rubocop:enable Metrics/LineLength