rfix 1.4.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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