gemsmith 19.8.0 → 20.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.adoc +28 -52
  4. data/gemsmith.gemspec +12 -9
  5. data/lib/gemsmith/builders/cli.rb +6 -25
  6. data/lib/gemsmith/builders/rspec/helper.rb +3 -16
  7. data/lib/gemsmith/cli/actions/cli.rb +22 -0
  8. data/lib/gemsmith/cli/actions/edit.rb +9 -4
  9. data/lib/gemsmith/cli/actions/install.rb +17 -6
  10. data/lib/gemsmith/cli/actions/publish.rb +17 -6
  11. data/lib/gemsmith/cli/actions/view.rb +9 -4
  12. data/lib/gemsmith/cli/commands/build.rb +106 -0
  13. data/lib/gemsmith/cli/shell.rb +28 -32
  14. data/lib/gemsmith/container.rb +29 -5
  15. data/lib/gemsmith/templates/%project_name%/%project_name%.gemspec.erb +13 -7
  16. data/lib/gemsmith/templates/%project_name%/lib/%project_path%/cli/shell.rb.erb +18 -15
  17. data/lib/gemsmith/templates/%project_name%/lib/%project_path%/configuration/contract.rb.erb +9 -0
  18. data/lib/gemsmith/templates/%project_name%/lib/%project_path%/configuration/model.rb.erb +6 -0
  19. data/lib/gemsmith/templates/%project_name%/lib/%project_path%/container.rb.erb +14 -1
  20. data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/cli/shell_spec.rb.erb +8 -23
  21. data/lib/gemsmith/templates/%project_name%/spec/support/shared_contexts/application_dependencies.rb.erb +5 -7
  22. data/lib/gemsmith/tools/versioner.rb +8 -8
  23. data.tar.gz.sig +0 -0
  24. metadata +65 -40
  25. metadata.gz.sig +0 -0
  26. data/lib/gemsmith/cli/actions/build.rb +0 -68
  27. data/lib/gemsmith/cli/actions/config.rb +0 -33
  28. data/lib/gemsmith/cli/actions/container.rb +0 -23
  29. data/lib/gemsmith/cli/actions/import.rb +0 -11
  30. data/lib/gemsmith/cli/parser.rb +0 -37
  31. data/lib/gemsmith/cli/parsers/build.rb +0 -53
  32. data/lib/gemsmith/cli/parsers/core.rb +0 -93
  33. data/lib/gemsmith/configuration/loader.rb +0 -27
  34. data/lib/gemsmith/templates/%project_name%/lib/%project_path%/cli/actions/config.rb.erb +0 -31
  35. data/lib/gemsmith/templates/%project_name%/lib/%project_path%/cli/actions/container.rb.erb +0 -16
  36. data/lib/gemsmith/templates/%project_name%/lib/%project_path%/cli/actions/import.rb.erb +0 -9
  37. data/lib/gemsmith/templates/%project_name%/lib/%project_path%/cli/parser.rb.erb +0 -35
  38. data/lib/gemsmith/templates/%project_name%/lib/%project_path%/cli/parsers/core.rb.erb +0 -58
  39. data/lib/gemsmith/templates/%project_name%/lib/%project_path%/configuration/content.rb.erb +0 -18
  40. data/lib/gemsmith/templates/%project_name%/lib/%project_path%/configuration/loader.rb.erb +0 -33
  41. data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/cli/actions/config_spec.rb.erb +0 -24
  42. data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/cli/parser_spec.rb.erb +0 -25
  43. data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/cli/parsers/core_spec.rb.erb +0 -53
  44. data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/configuration/content_spec.rb.erb +0 -15
  45. data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/configuration/loader_spec.rb.erb +0 -29
  46. data/lib/gemsmith/templates/%project_name%/spec/support/shared_examples/a_parser.rb.erb +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 63e7b251454d69b9c36b44095d48d86e5dbe86dd8246e0775fbdcf58f2f06221
4
- data.tar.gz: '094d44ce73d8c44cc238299a393250fe2fa4c2ccf4de8494e69779e3d13e4c00'
3
+ metadata.gz: 1e0b2d89efd43adce74b6fbed669777763f954f2b0b6f0f0c5832f12d2f8d883
4
+ data.tar.gz: a17145a647271cd6286b72b5c52574c34ab613e012a35b147223cb12109554b1
5
5
  SHA512:
6
- metadata.gz: ee953574be4c32f6a014382a95f4e9192db46e6e20bb81f25acd33f7d843a72bea6838276b1b8f1b4b28ef996d9eed854be7940e4f6a09f5e25d09c48fc88260
7
- data.tar.gz: 4ec6e2fea53134d4a1f499d98368dc0d1bbb929dfd313daf50a9dbf11e9df9f194b7a6577f0078d0c32fd0cc7c196a6c147795b31461d019f29f79086160a862
6
+ metadata.gz: 46aa1cc207d47fe6c768d8b4f581992536166126df49944b2de2b249bb56923e22e28fd969c799e5c3e2e7e58c8ad7a2dbf858af4a59652377c0c106de8085da
7
+ data.tar.gz: d074cba35efa1a8b40c6c58225a4ffbc8ad317d05838e906e4ffc6d94cb9395973800bea861ef1c85be2f9074fba1e0ec6804152c8a1be148b8beb45178613d5
checksums.yaml.gz.sig CHANGED
Binary file
data/README.adoc CHANGED
@@ -3,6 +3,7 @@
3
3
  :figure-caption!:
4
4
 
5
5
  :ruby_gems_link: link:https://rubygems.org[RubyGems]
6
+ :sod_link: link:https://alchemists.io/projects/sod[Sod]
6
7
 
7
8
  = Gemsmith
8
9
 
@@ -17,7 +18,7 @@ toc::[]
17
18
  == Features
18
19
 
19
20
  * Supports all link:https://alchemists.io/projects/rubysmith[Rubysmith] features.
20
- * Supports basic gem skeletons or more advanced Command Line Interface (CLI) skeletons.
21
+ * Supports basic gem or more advanced {sod_link}-based Command Line Interface (CLI) skeletons.
21
22
  * Supports gem building, installing for local development, and publishing.
22
23
  * Supports the editing and viewing of installed gems.
23
24
 
@@ -52,52 +53,30 @@ gem install gemsmith
52
53
  From the command line, type: `gemsmith --help`
53
54
 
54
55
  ....
55
- USAGE:
56
- -b, --build NAME [options] Build new project.
57
- -c, --config ACTION Manage gem configuration: edit or view.
58
- --edit GEM Edit installed gem in default editor.
59
- -h, --help Show this message.
60
- -i, --install [NAME] Install gem for local development.
61
- -p, --publish [NAME] Publish gem to remote gem server.
62
- -v, --version Show gem version.
63
- --view GEM View installed gem in default browser.
64
-
65
- BUILD OPTIONS:
66
- --[no-]amazing_print Add Amazing Print gem. Default: true.
67
- --[no-]caliber Add Caliber gem. Default: true.
68
- --[no-]circle_ci Add Circle CI configuration and badge. Default: false.
69
- --[no-]citation Add citation documentation. Default: true.
70
- --[no-]community Add community documentation. Default: false.
71
- --[no-]conduct Add code of conduct documentation. Default: true.
72
- --[no-]console Add console script. Default: true.
73
- --[no-]contributions Add contributions documentation. Default: true.
74
- --[no-]debug Add Debug gem. Default: true.
75
- --[no-]funding Add GitHub funding configuration. Default: false.
76
- --[no-]git Add Git. Default: true.
77
- --[no-]git_hub Add GitHub templates. Default: false.
78
- --[no-]git_hub_ci Add GitHub templates. Default: false.
79
- --[no-]git-lint Add Git Lint gem. Default: true.
80
- --[no-]guard Add Guard gem. Default: true.
81
- --[no-]license Add license documentation. Default: true.
82
- --max Use maximum/enabled options. Default: false.
83
- --min Use minimum/disabled options. Default: false.
84
- --[no-]rake Add Rake gem. Default: true.
85
- --[no-]readme Add readme documentation. Default: true.
86
- --[no-]reek Add Reek gem. Default: true.
87
- --[no-]refinements Add Refinements gem. Default: true.
88
- --[no-]rspec Add RSpec gem. Default: true.
89
- --[no-]security Add security. Default: true.
90
- --[no-]setup Add setup script. Default: true.
91
- --[no-]simple_cov Add SimpleCov gem. Default: true.
92
- --[no-]versions Add version history. Default: true.
93
- --[no-]yard Add Yard gem. Default: false.
94
- --[no-]zeitwerk Add Zeitwerk gem. Default: true.
95
- --[no-]cli Add command line interface. Default: false.
56
+ USAGE
57
+ gemsmith [OPTIONS]
58
+ gemsmith COMMAND [OPTIONS]
59
+
60
+ OPTIONS
61
+ -i, --install [GEM] Install gem for local development.
62
+ Optionally computes gem package based on current directory.
63
+ -p, --publish [GEM] Publish gem to remote gem server.
64
+ Optionally computes gem package based on current directory.
65
+ Default: gemsmith.
66
+ -e, --edit GEM Edit installed gem in default editor.
67
+ -V, --view GEM View installed gem in default browser.
68
+ -v, --version Show version.
69
+ -h, --help [COMMAND] Show this message.
70
+
71
+ COMMANDS
72
+ config Manage configuration.
73
+ Path is dynamic per current directory.
74
+ build Build new project.
96
75
  ....
97
76
 
98
77
  ==== Build
99
78
 
100
- The core functionality of this gem centers around the `--build` command and associated flags. The
79
+ The core functionality of this gem centers around the `build` command and associated flags. The
101
80
  build options allow you to further customize the kind of gem you want to build. Most build options
102
81
  are enabled by default. For detailed documentation on all supported flags, see the
103
82
  link:https://alchemists.io/projects/rubysmith/#_build[Rubysmith] documentation.
@@ -111,7 +90,7 @@ simple as running:
111
90
 
112
91
  [source,bash]
113
92
  ----
114
- gemsmith --build demo --cli
93
+ gemsmith build --name demo --cli
115
94
  ----
116
95
 
117
96
  The above will give you a new gem with CLI support which includes working specs. It's the same
@@ -120,9 +99,9 @@ configuring your gem and adding additional CLI support. Out of the box, the CLI
120
99
  you supports the following options:
121
100
 
122
101
  ....
123
- -c, --config ACTION Manage gem configuration: edit or view.
124
- -h, --help Show this message.
125
- -v, --version Show gem version.
102
+ -v, --version Show version.
103
+ -h, --help Show this message.
104
+ config Manage configuration.
126
105
  ....
127
106
 
128
107
  From here you can add whatever you wish to make an awesome CLI gem for others to enjoy.
@@ -221,9 +200,6 @@ the following:
221
200
  :cli: false
222
201
  ----
223
202
 
224
- Feel free to take the combined Rubysmith + Gemsmith configuration, modify, and save as your own
225
- custom `configuration.yml`.
226
-
227
203
  It is recommended that you provide URLs for your project which would be all keys found in this
228
204
  section:
229
205
 
@@ -245,7 +221,7 @@ When building/testing your gem locally, a typical workflow is:
245
221
  [source,bash]
246
222
  ----
247
223
  # Build
248
- gemsmith --build demo
224
+ gemsmith build --name demo
249
225
 
250
226
  # Design, Implement and Test.
251
227
  cd demo
@@ -303,7 +279,7 @@ To create a certificate for your gems, run the following:
303
279
  [source,bash]
304
280
  ----
305
281
  cd ~/.gem
306
- gem cert --build you@example.com --days 730
282
+ gem cert build you@example.com --days 730
307
283
  gem cert --add gem-public_cert.pem
308
284
  cp gem-public_cert.pem <path/to/server/public/folder>/gems.pem
309
285
  ----
data/gemsmith.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "gemsmith"
5
- spec.version = "19.8.0"
5
+ spec.version = "20.0.0"
6
6
  spec.authors = ["Brooke Kuhlmann"]
7
7
  spec.email = ["brooke@alchemists.io"]
8
8
  spec.homepage = "https://alchemists.io/projects/gemsmith"
@@ -23,17 +23,20 @@ Gem::Specification.new do |spec|
23
23
  spec.cert_chain = [Gem.default_cert_path]
24
24
 
25
25
  spec.required_ruby_version = "~> 3.2"
26
- spec.add_dependency "cogger", "~> 0.8"
26
+ spec.add_dependency "cogger", "~> 0.10"
27
27
  spec.add_dependency "core", "~> 0.1"
28
28
  spec.add_dependency "dry-container", "~> 0.11"
29
29
  spec.add_dependency "dry-monads", "~> 1.6"
30
- spec.add_dependency "infusible", "~> 1.0"
31
- spec.add_dependency "milestoner", "~> 15.3"
32
- spec.add_dependency "refinements", "~> 10.0"
33
- spec.add_dependency "rubysmith", "~> 4.9"
34
- spec.add_dependency "runcom", "~> 9.0"
35
- spec.add_dependency "spek", "~> 1.1"
36
- spec.add_dependency "versionaire", "~> 11.0"
30
+ spec.add_dependency "dry-schema", "~> 1.13"
31
+ spec.add_dependency "etcher", "~> 0.2"
32
+ spec.add_dependency "infusible", "~> 2.0"
33
+ spec.add_dependency "milestoner", "~> 16.0"
34
+ spec.add_dependency "refinements", "~> 11.0"
35
+ spec.add_dependency "rubysmith", "~> 5.1"
36
+ spec.add_dependency "runcom", "~> 10.0"
37
+ spec.add_dependency "sod", "~> 0.0"
38
+ spec.add_dependency "spek", "~> 2.0"
39
+ spec.add_dependency "versionaire", "~> 12.0"
37
40
  spec.add_dependency "zeitwerk", "~> 2.6"
38
41
 
39
42
  spec.bindir = "exe"
@@ -49,44 +49,25 @@ module Gemsmith
49
49
 
50
50
  def render_configuration
51
51
  [
52
- "%project_name%/lib/%project_path%/configuration/content.rb.erb",
52
+ "%project_name%/lib/%project_path%/configuration/contract.rb.erb",
53
+ "%project_name%/lib/%project_path%/configuration/model.rb.erb",
53
54
  "%project_name%/lib/%project_path%/configuration/defaults.yml.erb",
54
- "%project_name%/lib/%project_path%/configuration/loader.rb.erb",
55
55
  "%project_name%/lib/%project_path%/container.rb.erb",
56
56
  "%project_name%/lib/%project_path%/import.rb.erb"
57
57
  ].each { |path| builder.call(configuration.merge(template_path: path)).render }
58
58
  end
59
59
 
60
- def render_cli
61
- [
62
- "%project_name%/lib/%project_path%/cli/actions/config.rb.erb",
63
- "%project_name%/lib/%project_path%/cli/actions/container.rb.erb",
64
- "%project_name%/lib/%project_path%/cli/actions/import.rb.erb",
65
- "%project_name%/lib/%project_path%/cli/parser.rb.erb",
66
- "%project_name%/lib/%project_path%/cli/parsers/core.rb.erb",
67
- "%project_name%/lib/%project_path%/cli/shell.rb.erb"
68
- ].each { |path| builder.call(configuration.merge(template_path: path)).render }
60
+ def render_shell
61
+ path = "%project_name%/lib/%project_path%/cli/shell.rb.erb"
62
+ builder.call(configuration.merge(template_path: path)).render
69
63
  end
70
64
 
71
65
  def render_specs
72
66
  return unless configuration.build_rspec
73
67
 
74
68
  [
75
- "%project_name%/spec/lib/%project_path%/cli/actions/config_spec.rb.erb",
76
- "%project_name%/spec/lib/%project_path%/cli/parser_spec.rb.erb",
77
- "%project_name%/spec/lib/%project_path%/cli/parsers/core_spec.rb.erb",
78
69
  "%project_name%/spec/lib/%project_path%/cli/shell_spec.rb.erb",
79
- "%project_name%/spec/lib/%project_path%/configuration/content_spec.rb.erb",
80
- "%project_name%/spec/lib/%project_path%/configuration/loader_spec.rb.erb"
81
- ].each { |path| builder.call(configuration.merge(template_path: path)).render }
82
- end
83
-
84
- def render_rspec_support
85
- return unless configuration.build_rspec
86
-
87
- [
88
- "%project_name%/spec/support/shared_contexts/application_dependencies.rb.erb",
89
- "%project_name%/spec/support/shared_examples/a_parser.rb.erb"
70
+ "%project_name%/spec/support/shared_contexts/application_dependencies.rb.erb"
90
71
  ].each { |path| builder.call(configuration.merge(template_path: path)).render }
91
72
  end
92
73
  end
@@ -19,28 +19,15 @@ module Gemsmith
19
19
  def call
20
20
  return configuration unless configuration.build_rspec && configuration.build_cli
21
21
 
22
- update_spec_helper
23
- render_shared_example
22
+ builder.call(configuration.merge(template_path: "%project_name%/spec/spec_helper.rb.erb"))
23
+ .touch
24
+ .replace("%r(^/spec/)", "%r((.+/container\\.rb|^/spec/))")
24
25
  configuration
25
26
  end
26
27
 
27
28
  private
28
29
 
29
30
  attr_reader :configuration, :builder
30
-
31
- def update_spec_helper
32
- builder.call(configuration.merge(template_path: "%project_name%/spec/spec_helper.rb.erb"))
33
- .touch
34
- .insert_after(
35
- %r(support/shared_contexts),
36
- %(Pathname.require_tree SPEC_ROOT.join("support/shared_examples")\n)
37
- )
38
- end
39
-
40
- def render_shared_example
41
- path = "%project_name%/spec/support/shared_examples/a_parser.rb.erb"
42
- builder.call(configuration.merge(template_path: path)).render
43
- end
44
31
  end
45
32
  end
46
33
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sod"
4
+
5
+ module Gemsmith
6
+ module CLI
7
+ module Actions
8
+ # Stores CLI flag.
9
+ class CLI < Sod::Action
10
+ include Import[:input]
11
+
12
+ description "Add command line interface."
13
+
14
+ on "--[no-]cli"
15
+
16
+ default { Container[:configuration].build_cli }
17
+
18
+ def call(value = default) = input.build_cli = value
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,16 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/monads"
4
+ require "sod"
4
5
  require "spek"
5
6
 
6
7
  module Gemsmith
7
8
  module CLI
8
9
  module Actions
9
10
  # Handles the edit action for editing an installed gem.
10
- class Edit
11
+ class Edit < Sod::Action
11
12
  include Gemsmith::Import[:kernel, :logger]
12
13
  include Dry::Monads[:result]
13
14
 
15
+ description "Edit installed gem in default editor."
16
+
17
+ on %w[-e --edit], argument: "GEM"
18
+
14
19
  def initialize(picker: Spek::Picker, editor: Tools::Editor.new, **)
15
20
  super(**)
16
21
  @picker = picker
@@ -20,8 +25,8 @@ module Gemsmith
20
25
  def call gem_name
21
26
  case picker.call(gem_name).bind { |spec| editor.call spec }
22
27
  in Success(spec) then logger.info { "Editing: #{spec.named_version}." }
23
- in Failure(message) then error { message }
24
- else error { "Unable to handle edit action." }
28
+ in Failure(message) then log_error { message }
29
+ else log_error { "Unable to handle edit action." }
25
30
  end
26
31
  end
27
32
 
@@ -29,7 +34,7 @@ module Gemsmith
29
34
 
30
35
  attr_reader :picker, :editor
31
36
 
32
- def error(&) = logger.error(&)
37
+ def log_error(&) = logger.error(&)
33
38
  end
34
39
  end
35
40
  end
@@ -1,27 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/monads"
4
+ require "pathname"
5
+ require "sod"
4
6
  require "spek"
5
7
 
6
8
  module Gemsmith
7
9
  module CLI
8
10
  module Actions
9
11
  # Handles the install action.
10
- class Install
12
+ class Install < Sod::Action
11
13
  include Gemsmith::Import[:logger]
12
14
  include Dry::Monads[:result]
13
15
 
16
+ description "Install gem for local development."
17
+
18
+ ancillary "Optionally computes gem package based on current directory."
19
+
20
+ on %w[-i --install], argument: "[GEM]"
21
+
22
+ default { Pathname.pwd.basename }
23
+
14
24
  def initialize(installer: Tools::Installer.new, loader: Spek::Loader, **)
15
25
  super(**)
16
26
  @installer = installer
17
27
  @loader = loader
18
28
  end
19
29
 
20
- def call configuration
21
- case installer.call loader.call("#{configuration.project_name}.gemspec")
30
+ # :reek:ControlParameter
31
+ def call name = nil
32
+ case installer.call loader.call("#{name || default}.gemspec")
22
33
  in Success(spec) then logger.info { "Installed: #{spec.package_name}." }
23
- in Failure(message) then error { message }
24
- else error { "Unable to handle install action." }
34
+ in Failure(message) then log_error { message }
35
+ else log_error { "Unable to handle install action." }
25
36
  end
26
37
  end
27
38
 
@@ -29,7 +40,7 @@ module Gemsmith
29
40
 
30
41
  attr_reader :installer, :loader
31
42
 
32
- def error(&) = logger.error(&)
43
+ def log_error(&) = logger.error(&)
33
44
  end
34
45
  end
35
46
  end
@@ -1,27 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/monads"
4
+ require "pathname"
5
+ require "sod"
4
6
  require "spek"
5
7
 
6
8
  module Gemsmith
7
9
  module CLI
8
10
  module Actions
9
11
  # Handles the publish action.
10
- class Publish
12
+ class Publish < Sod::Action
11
13
  include Gemsmith::Import[:logger]
12
14
  include Dry::Monads[:result]
13
15
 
16
+ description "Publish gem to remote gem server."
17
+
18
+ ancillary "Optionally computes gem package based on current directory."
19
+
20
+ on %w[-p --publish], argument: "[GEM]"
21
+
22
+ default { Pathname.pwd.basename }
23
+
14
24
  def initialize(publisher: Tools::Publisher.new, loader: Spek::Loader, **)
15
25
  super(**)
16
26
  @publisher = publisher
17
27
  @loader = loader
18
28
  end
19
29
 
20
- def call configuration
21
- case publisher.call loader.call("#{configuration.project_name}.gemspec")
30
+ # :reek:ControlParameter
31
+ def call name = nil
32
+ case publisher.call loader.call("#{name || default}.gemspec")
22
33
  in Success(spec) then logger.info { "Published: #{spec.package_name}." }
23
- in Failure(message) then error { message }
24
- else error { "Unable to handle publish action." }
34
+ in Failure(message) then log_error { message }
35
+ else log_error { "Unable to handle publish action." }
25
36
  end
26
37
  end
27
38
 
@@ -29,7 +40,7 @@ module Gemsmith
29
40
 
30
41
  attr_reader :publisher, :loader
31
42
 
32
- def error(&) = logger.error(&)
43
+ def log_error(&) = logger.error(&)
33
44
  end
34
45
  end
35
46
  end
@@ -1,16 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/monads"
4
+ require "sod"
4
5
  require "spek"
5
6
 
6
7
  module Gemsmith
7
8
  module CLI
8
9
  module Actions
9
10
  # Handles the view action for viewing an installed gem in default browser.
10
- class View
11
+ class View < Sod::Action
11
12
  include Gemsmith::Import[:kernel, :logger]
12
13
  include Dry::Monads[:result]
13
14
 
15
+ description "View installed gem in default browser."
16
+
17
+ on %w[-V --view], argument: "GEM"
18
+
14
19
  def initialize(picker: Spek::Picker, viewer: Tools::Viewer.new, **)
15
20
  super(**)
16
21
  @picker = picker
@@ -20,8 +25,8 @@ module Gemsmith
20
25
  def call gem_name
21
26
  case picker.call(gem_name).bind { |spec| viewer.call spec }
22
27
  in Success(spec) then logger.info { "Viewing: #{spec.named_version}." }
23
- in Failure(message) then error { message }
24
- else error { "Unable to handle view action." }
28
+ in Failure(message) then log_error { message }
29
+ else log_error { "Unable to handle view action." }
25
30
  end
26
31
  end
27
32
 
@@ -29,7 +34,7 @@ module Gemsmith
29
34
 
30
35
  attr_reader :picker, :viewer
31
36
 
32
- def error(&) = logger.error(&)
37
+ def log_error(&) = logger.error(&)
33
38
  end
34
39
  end
35
40
  end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sod"
4
+
5
+ module Gemsmith
6
+ module CLI
7
+ module Commands
8
+ # Handles the build action.
9
+ class Build < Sod::Command
10
+ include Gemsmith::Import[:input, :logger]
11
+
12
+ # Order is important.
13
+ # rubocop:todo Metrics/CollectionLiteralLength
14
+ BUILDERS = [
15
+ Rubysmith::Builders::Core,
16
+ Rubysmith::Builders::Version,
17
+ Builders::Specification,
18
+ Rubysmith::Builders::Documentation::Readme,
19
+ Builders::Documentation::Readme,
20
+ Rubysmith::Builders::Documentation::Citation,
21
+ Rubysmith::Builders::Documentation::License,
22
+ Rubysmith::Builders::Documentation::Version,
23
+ Rubysmith::Builders::Git::Setup,
24
+ Rubysmith::Builders::Git::Ignore,
25
+ Rubysmith::Builders::Git::Safe,
26
+ Builders::Git::Ignore,
27
+ Rubysmith::Builders::Bundler,
28
+ Builders::Bundler,
29
+ Builders::CLI,
30
+ Rubysmith::Builders::Rake,
31
+ Rubysmith::Builders::Console,
32
+ Rubysmith::Builders::CircleCI,
33
+ Builders::CircleCI,
34
+ Rubysmith::Builders::Setup,
35
+ Rubysmith::Builders::GitHub,
36
+ Rubysmith::Builders::Guard,
37
+ Rubysmith::Builders::Reek,
38
+ Rubysmith::Builders::RSpec::Binstub,
39
+ Rubysmith::Builders::RSpec::Context,
40
+ Rubysmith::Builders::RSpec::Helper,
41
+ Builders::RSpec::Helper,
42
+ Rubysmith::Builders::Caliber,
43
+ Rubysmith::Extensions::Bundler,
44
+ Rubysmith::Extensions::Pragmater,
45
+ Rubysmith::Extensions::Tocer,
46
+ Rubysmith::Extensions::Rubocop,
47
+ Builders::Git::Commit
48
+ ].freeze
49
+ # rubocop:enable Metrics/CollectionLiteralLength
50
+
51
+ handle "build"
52
+
53
+ description "Build new project."
54
+
55
+ on Rubysmith::CLI::Actions::Name, input: Container[:input]
56
+ on Rubysmith::CLI::Actions::AmazingPrint, input: Container[:input]
57
+ on Rubysmith::CLI::Actions::Caliber, input: Container[:input]
58
+ on Rubysmith::CLI::Actions::CircleCI, input: Container[:input]
59
+ on Rubysmith::CLI::Actions::Citation, input: Container[:input]
60
+ on Actions::CLI, input: Container[:input]
61
+ on Rubysmith::CLI::Actions::Community, input: Container[:input]
62
+ on Rubysmith::CLI::Actions::Conduct, input: Container[:input]
63
+ on Rubysmith::CLI::Actions::Console, input: Container[:input]
64
+ on Rubysmith::CLI::Actions::Contributions, input: Container[:input]
65
+ on Rubysmith::CLI::Actions::Debug, input: Container[:input]
66
+ on Rubysmith::CLI::Actions::Funding, input: Container[:input]
67
+ on Rubysmith::CLI::Actions::Git, input: Container[:input]
68
+ on Rubysmith::CLI::Actions::GitHub, input: Container[:input]
69
+ on Rubysmith::CLI::Actions::GitHubCI, input: Container[:input]
70
+ on Rubysmith::CLI::Actions::GitLint, input: Container[:input]
71
+ on Rubysmith::CLI::Actions::Guard, input: Container[:input]
72
+ on Rubysmith::CLI::Actions::License, input: Container[:input]
73
+ on Rubysmith::CLI::Actions::Maximum, input: Container[:input]
74
+ on Rubysmith::CLI::Actions::Minimum, input: Container[:input]
75
+ on Rubysmith::CLI::Actions::Rake, input: Container[:input]
76
+ on Rubysmith::CLI::Actions::Readme, input: Container[:input]
77
+ on Rubysmith::CLI::Actions::Reek, input: Container[:input]
78
+ on Rubysmith::CLI::Actions::Refinements, input: Container[:input]
79
+ on Rubysmith::CLI::Actions::RSpec, input: Container[:input]
80
+ on Rubysmith::CLI::Actions::Security, input: Container[:input]
81
+ on Rubysmith::CLI::Actions::Setup, input: Container[:input]
82
+ on Rubysmith::CLI::Actions::SimpleCov, input: Container[:input]
83
+ on Rubysmith::CLI::Actions::Versions, input: Container[:input]
84
+ on Rubysmith::CLI::Actions::Yard, input: Container[:input]
85
+ on Rubysmith::CLI::Actions::Zeitwerk, input: Container[:input]
86
+
87
+ def initialize(builders: BUILDERS, **)
88
+ super(**)
89
+ @builders = builders
90
+ end
91
+
92
+ def call
93
+ log_info "Building project skeleton: #{input.project_name}..."
94
+ builders.each { |builder| builder.call input }
95
+ log_info "Project skeleton complete!"
96
+ end
97
+
98
+ private
99
+
100
+ attr_reader :builders
101
+
102
+ def log_info(message) = logger.info { message }
103
+ end
104
+ end
105
+ end
106
+ end