rubysmith 4.9.0 → 5.0.1

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 (69) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.adoc +91 -117
  4. data/lib/rubysmith/builders/core.rb +0 -1
  5. data/lib/rubysmith/cli/actions/amazing_print.rb +25 -0
  6. data/lib/rubysmith/cli/actions/caliber.rb +25 -0
  7. data/lib/rubysmith/cli/actions/circle_ci.rb +25 -0
  8. data/lib/rubysmith/cli/actions/citation.rb +25 -0
  9. data/lib/rubysmith/cli/actions/community.rb +25 -0
  10. data/lib/rubysmith/cli/actions/conduct.rb +25 -0
  11. data/lib/rubysmith/cli/actions/console.rb +25 -0
  12. data/lib/rubysmith/cli/actions/contributions.rb +25 -0
  13. data/lib/rubysmith/cli/actions/debug.rb +25 -0
  14. data/lib/rubysmith/cli/actions/funding.rb +25 -0
  15. data/lib/rubysmith/cli/actions/git.rb +25 -0
  16. data/lib/rubysmith/cli/actions/git_hub.rb +25 -0
  17. data/lib/rubysmith/cli/actions/git_hub_ci.rb +25 -0
  18. data/lib/rubysmith/cli/actions/git_lint.rb +25 -0
  19. data/lib/rubysmith/cli/actions/guard.rb +25 -0
  20. data/lib/rubysmith/cli/actions/license.rb +25 -0
  21. data/lib/rubysmith/cli/actions/maximum.rb +25 -0
  22. data/lib/rubysmith/cli/actions/minimum.rb +25 -0
  23. data/lib/rubysmith/cli/actions/name.rb +23 -0
  24. data/lib/rubysmith/cli/actions/publish.rb +16 -4
  25. data/lib/rubysmith/cli/actions/rake.rb +25 -0
  26. data/lib/rubysmith/cli/actions/readme.rb +25 -0
  27. data/lib/rubysmith/cli/actions/reek.rb +25 -0
  28. data/lib/rubysmith/cli/actions/refinements.rb +25 -0
  29. data/lib/rubysmith/cli/actions/rspec.rb +25 -0
  30. data/lib/rubysmith/cli/actions/security.rb +25 -0
  31. data/lib/rubysmith/cli/actions/setup.rb +25 -0
  32. data/lib/rubysmith/cli/actions/simple_cov.rb +25 -0
  33. data/lib/rubysmith/cli/actions/versions.rb +25 -0
  34. data/lib/rubysmith/cli/actions/yard.rb +25 -0
  35. data/lib/rubysmith/cli/actions/zeitwerk.rb +25 -0
  36. data/lib/rubysmith/cli/{actions → commands}/build.rb +45 -7
  37. data/lib/rubysmith/cli/shell.rb +20 -18
  38. data/lib/rubysmith/configuration/contract.rb +78 -0
  39. data/lib/rubysmith/configuration/defaults.yml +52 -73
  40. data/lib/rubysmith/configuration/{content.rb → model.rb} +8 -22
  41. data/lib/rubysmith/configuration/transformers/current_time.rb +18 -0
  42. data/lib/rubysmith/configuration/transformers/git_email.rb +19 -0
  43. data/lib/rubysmith/configuration/transformers/git_hub_user.rb +19 -0
  44. data/lib/rubysmith/configuration/transformers/git_user.rb +24 -0
  45. data/lib/rubysmith/configuration/transformers/target_root.rb +18 -0
  46. data/lib/rubysmith/configuration/transformers/template_root.rb +22 -0
  47. data/lib/rubysmith/container.rb +21 -3
  48. data/lib/rubysmith/extensions/milestoner.rb +1 -1
  49. data/lib/rubysmith/extensions/pragmater.rb +8 -8
  50. data/lib/rubysmith/extensions/tocer.rb +8 -8
  51. data/lib/rubysmith/pathway.rb +1 -0
  52. data/lib/rubysmith/templates/%project_name%/Gemfile.erb +4 -4
  53. data/rubysmith.gemspec +16 -13
  54. data.tar.gz.sig +0 -0
  55. metadata +112 -46
  56. metadata.gz.sig +0 -0
  57. data/lib/rubysmith/cli/actions/config.rb +0 -33
  58. data/lib/rubysmith/cli/actions/container.rb +0 -20
  59. data/lib/rubysmith/cli/actions/import.rb +0 -11
  60. data/lib/rubysmith/cli/parser.rb +0 -35
  61. data/lib/rubysmith/cli/parsers/build.rb +0 -307
  62. data/lib/rubysmith/cli/parsers/core.rb +0 -72
  63. data/lib/rubysmith/configuration/enhancers/container.rb +0 -20
  64. data/lib/rubysmith/configuration/enhancers/current_time.rb +0 -14
  65. data/lib/rubysmith/configuration/enhancers/git_email.rb +0 -21
  66. data/lib/rubysmith/configuration/enhancers/git_hub_user.rb +0 -21
  67. data/lib/rubysmith/configuration/enhancers/git_user.rb +0 -25
  68. data/lib/rubysmith/configuration/enhancers/template_root.rb +0 -12
  69. data/lib/rubysmith/configuration/loader.rb +0 -44
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Stores Guard flag.
10
+ class Guard < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Add Guard gem."
16
+
17
+ on "--[no-]guard"
18
+
19
+ default { Container[:configuration].build_guard }
20
+
21
+ def call(value = default) = input.merge!(build_guard: value)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Stores license flag.
10
+ class License < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Add license documentation."
16
+
17
+ on "--[no-]license"
18
+
19
+ default { Container[:configuration].build_license }
20
+
21
+ def call(value = default) = input.merge!(build_license: value)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Forces maximum configuration.
10
+ class Maximum < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Use maximum options."
16
+
17
+ on "--max"
18
+
19
+ default { Container[:configuration].build_maximum }
20
+
21
+ def call(*) = input.merge!(input.maximize)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Forces minimum configuration.
10
+ class Minimum < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Use minimum options."
16
+
17
+ on "--min"
18
+
19
+ default { Container[:configuration].build_minimum }
20
+
21
+ def call(*) = input.merge!(input.minimize)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Stores project (build) name.
10
+ class Name < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Set project name."
16
+
17
+ on %w[-n --name], argument: "NAME"
18
+
19
+ def call(name) = input.merge!(project_name: name)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,15 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "refinements/structs"
4
+ require "sod"
5
+
3
6
  module Rubysmith
4
7
  module CLI
5
8
  module Actions
6
- # Handles parsing of Command Line Interface (CLI) publish options.
7
- class Publish
8
- def initialize extension: Extensions::Milestoner
9
+ # Publishes project.
10
+ class Publish < Sod::Action
11
+ include Import[:configuration]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Publish project."
16
+
17
+ on %w[-p --publish], argument: "VERSION"
18
+
19
+ def initialize(extension: Extensions::Milestoner, **)
20
+ super(**)
9
21
  @extension = extension
10
22
  end
11
23
 
12
- def call(configuration) = extension.call(configuration)
24
+ def call(version) = extension.call configuration.merge(project_version: version)
13
25
 
14
26
  private
15
27
 
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Stores Rake flag.
10
+ class Rake < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Add Rake gem."
16
+
17
+ on "--[no-]rake"
18
+
19
+ default { Container[:configuration].build_rake }
20
+
21
+ def call(value = default) = input.merge!(build_rake: value)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Stores readme flag.
10
+ class Readme < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Add readme documentation."
16
+
17
+ on "--[no-]readme"
18
+
19
+ default { Container[:configuration].build_readme }
20
+
21
+ def call(value = default) = input.merge!(build_readme: value)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Stores Reek flag.
10
+ class Reek < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Add Reek gem."
16
+
17
+ on "--[no-]reek"
18
+
19
+ default { Container[:configuration].build_reek }
20
+
21
+ def call(value = default) = input.merge!(build_reek: value)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Stores Refinements flag.
10
+ class Refinements < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Add Refinements gem."
16
+
17
+ on "--[no-]refinements"
18
+
19
+ default { Container[:configuration].build_refinements }
20
+
21
+ def call(value = default) = input.merge!(build_refinements: value)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Stores RSpec flag.
10
+ class RSpec < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Add RSpec gem."
16
+
17
+ on "--[no-]rspec"
18
+
19
+ default { Container[:configuration].build_rspec }
20
+
21
+ def call(value = default) = input.merge!(build_rspec: value)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Stores security flag.
10
+ class Security < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Add security."
16
+
17
+ on "--[no-]security"
18
+
19
+ default { Container[:configuration].build_security }
20
+
21
+ def call(value = default) = input.merge!(build_security: value)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Stores setup flag.
10
+ class Setup < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Add setup script."
16
+
17
+ on "--[no-]setup"
18
+
19
+ default { Container[:configuration].build_setup }
20
+
21
+ def call(value = default) = input.merge!(build_setup: value)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Stores SimpleCov flag.
10
+ class SimpleCov < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Add SimpleCov gem."
16
+
17
+ on "--[no-]simple_cov"
18
+
19
+ default { Container[:configuration].build_simple_cov }
20
+
21
+ def call(value = default) = input.merge!(build_simple_cov: value)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Stores versions flag.
10
+ class Versions < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Add version history."
16
+
17
+ on "--[no-]versions"
18
+
19
+ default { Container[:configuration].build_versions }
20
+
21
+ def call(value = default) = input.merge!(build_versions: value)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Stores Yard flag.
10
+ class Yard < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Add Yard gem."
16
+
17
+ on "--[no-]yard"
18
+
19
+ default { Container[:configuration].build_yard }
20
+
21
+ def call(value = default) = input.merge!(build_yard: value)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+ require "sod"
5
+
6
+ module Rubysmith
7
+ module CLI
8
+ module Actions
9
+ # Stores Zeitwerk flag.
10
+ class Zeitwerk < Sod::Action
11
+ include Import[:input]
12
+
13
+ using ::Refinements::Structs
14
+
15
+ description "Add Zeitwerk gem."
16
+
17
+ on "--[no-]zeitwerk"
18
+
19
+ default { Container[:configuration].build_zeitwerk }
20
+
21
+ def call(value = default) = input.merge!(build_zeitwerk: value)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "refinements/structs"
4
+ require "sod"
5
+
3
6
  module Rubysmith
4
7
  module CLI
5
- module Actions
6
- # Handles the build action.
7
- class Build
8
- include Rubysmith::Import[:logger]
8
+ module Commands
9
+ # Stores table of contents root path.
10
+ class Build < Sod::Command
11
+ include Import[:input, :kernel, :logger]
9
12
 
10
13
  # Order is important.
11
14
  # rubocop:todo Metrics/CollectionLiteralLength
@@ -40,14 +43,49 @@ module Rubysmith
40
43
  ].freeze
41
44
  # rubocop:enable Metrics/CollectionLiteralLength
42
45
 
46
+ handle "build"
47
+
48
+ description "Build new project."
49
+
50
+ on Actions::Name
51
+ on Actions::AmazingPrint
52
+ on Actions::Caliber
53
+ on Actions::Console
54
+ on Actions::Contributions
55
+ on Actions::CircleCI
56
+ on Actions::Citation
57
+ on Actions::Community
58
+ on Actions::Conduct
59
+ on Actions::Debug
60
+ on Actions::Funding
61
+ on Actions::Git
62
+ on Actions::GitHub
63
+ on Actions::GitHubCI
64
+ on Actions::GitLint
65
+ on Actions::Guard
66
+ on Actions::License
67
+ on Actions::Maximum
68
+ on Actions::Minimum
69
+ on Actions::Rake
70
+ on Actions::Readme
71
+ on Actions::Reek
72
+ on Actions::Refinements
73
+ on Actions::RSpec
74
+ on Actions::Security
75
+ on Actions::Setup
76
+ on Actions::SimpleCov
77
+ on Actions::Versions
78
+ on Actions::Yard
79
+ on Actions::Zeitwerk
80
+
43
81
  def initialize(builders: BUILDERS, **)
44
82
  super(**)
45
83
  @builders = builders
46
84
  end
47
85
 
48
- def call configuration
49
- log_info "Building project skeleton: #{configuration.project_name}..."
50
- builders.each { |builder| builder.call configuration }
86
+ def call
87
+ log_info "Building project skeleton: #{input.project_name}..."
88
+ builders.each { |builder| builder.call input }
51
89
  log_info "Project skeleton complete!"
52
90
  end
53
91
 
@@ -1,38 +1,40 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "core"
4
- require "milestoner"
3
+ require "sod"
5
4
 
6
5
  module Rubysmith
7
6
  module CLI
8
7
  # The main Command Line Interface (CLI) object.
9
8
  class Shell
10
- include Actions::Import[:config, :build, :kernel, :logger, :publish, :specification]
9
+ include Import[:defaults_path, :xdg_config, :specification]
11
10
 
12
- def initialize(parser: Parser.new, **)
11
+ def initialize(context: Sod::Context, dsl: Sod, **)
13
12
  super(**)
14
- @parser = parser
13
+ @context = context
14
+ @dsl = dsl
15
15
  end
16
16
 
17
- def call arguments = Core::EMPTY_ARRAY
18
- act_on parser.call(arguments)
19
- rescue OptionParser::ParseError, Milestoner::Error => error
20
- logger.error { error.message }
21
- end
17
+ def call(...) = cli.call(...)
22
18
 
23
19
  private
24
20
 
25
- attr_reader :parser
21
+ attr_reader :context, :dsl
22
+
23
+ def cli
24
+ context = build_context
26
25
 
27
- def act_on configuration
28
- case configuration
29
- in action_config: Symbol => action then config.call action
30
- in action_build: true then build.call configuration
31
- in action_publish: true then publish.call configuration
32
- in action_version: true then kernel.puts specification.labeled_version
33
- else kernel.puts parser.to_s
26
+ dsl.new :rubysmith, banner: specification.banner do
27
+ on(Sod::Prefabs::Commands::Config, context:)
28
+ on Commands::Build
29
+ on Actions::Publish
30
+ on(Sod::Prefabs::Actions::Version, context:)
31
+ on Sod::Prefabs::Actions::Help, self
34
32
  end
35
33
  end
34
+
35
+ def build_context
36
+ context[defaults_path:, xdg_config:, version_label: specification.labeled_version]
37
+ end
36
38
  end
37
39
  end
38
40
  end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/schema"
4
+ require "etcher"
5
+
6
+ Dry::Schema.load_extensions :monads
7
+
8
+ module Rubysmith
9
+ module Configuration
10
+ Contract = Dry::Schema.Params do
11
+ optional(:author_email).filled :string
12
+ optional(:author_family_name).filled :string
13
+ optional(:author_given_name).filled :string
14
+ optional(:author_url).filled :string
15
+ required(:build_amazing_print).filled :bool
16
+ required(:build_caliber).filled :bool
17
+ required(:build_circle_ci).filled :bool
18
+ required(:build_citation).filled :bool
19
+ required(:build_cli).filled :bool
20
+ required(:build_community).filled :bool
21
+ required(:build_conduct).filled :bool
22
+ required(:build_console).filled :bool
23
+ required(:build_contributions).filled :bool
24
+ required(:build_debug).filled :bool
25
+ required(:build_funding).filled :bool
26
+ required(:build_git).filled :bool
27
+ required(:build_git_hub).filled :bool
28
+ required(:build_git_hub_ci).filled :bool
29
+ required(:build_git_lint).filled :bool
30
+ required(:build_guard).filled :bool
31
+ required(:build_license).filled :bool
32
+ required(:build_maximum).filled :bool
33
+ required(:build_minimum).filled :bool
34
+ required(:build_rake).filled :bool
35
+ required(:build_readme).filled :bool
36
+ required(:build_reek).filled :bool
37
+ required(:build_refinements).filled :bool
38
+ required(:build_rspec).filled :bool
39
+ required(:build_security).filled :bool
40
+ required(:build_setup).filled :bool
41
+ required(:build_simple_cov).filled :bool
42
+ required(:build_versions).filled :bool
43
+ required(:build_yard).filled :bool
44
+ required(:build_zeitwerk).filled :bool
45
+ optional(:citation_affiliation).filled :string
46
+ optional(:citation_message).filled :string
47
+ optional(:citation_orcid).filled :string
48
+ required(:documentation_format).filled :string
49
+ required(:extensions_milestoner_documentation_format).filled :string
50
+ required(:extensions_milestoner_prefixes).array :string
51
+ required(:extensions_pragmater_comments).array :string
52
+ required(:extensions_pragmater_patterns).array :string
53
+ required(:extensions_tocer_label).filled :string
54
+ required(:extensions_tocer_patterns).array :string
55
+ optional(:git_hub_user).filled :string
56
+ required(:license_label).filled :string
57
+ required(:license_name).filled :string
58
+ required(:license_version).filled :string
59
+ optional(:now).filled :time
60
+ optional(:project_name).filled :string
61
+ optional(:project_url_community).filled :string
62
+ optional(:project_url_conduct).filled :string
63
+ optional(:project_url_contributions).filled :string
64
+ optional(:project_url_download).filled :string
65
+ optional(:project_url_funding).filled :string
66
+ optional(:project_url_home).filled :string
67
+ optional(:project_url_issues).filled :string
68
+ optional(:project_url_license).filled :string
69
+ optional(:project_url_security).filled :string
70
+ optional(:project_url_source).filled :string
71
+ optional(:project_url_versions).filled :string
72
+ required(:project_version).filled :string
73
+ required(:target_root).filled Etcher::Types::Pathname
74
+ optional(:template_path).filled Etcher::Types::Pathname
75
+ required(:template_roots).array Etcher::Types::Pathname
76
+ end
77
+ end
78
+ end