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
@@ -1,307 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "core"
4
- require "refinements/structs"
5
-
6
- module Rubysmith
7
- module CLI
8
- module Parsers
9
- # Handles parsing of Command Line Interface (CLI) build options.
10
- class Build
11
- include Import[:color]
12
-
13
- using Refinements::Structs
14
-
15
- def self.call(...) = new(...).call
16
-
17
- def initialize(configuration = Container[:configuration], client: Parser::CLIENT, **)
18
- super(**)
19
- @configuration = configuration
20
- @client = client
21
- end
22
-
23
- def call arguments = ::Core::EMPTY_ARRAY
24
- client.separator "\nBUILD OPTIONS:\n"
25
- collate
26
- client.parse arguments
27
- configuration
28
- end
29
-
30
- private
31
-
32
- attr_reader :configuration, :client
33
-
34
- def collate = private_methods.sort.grep(/add_/).each { |method| __send__ method }
35
-
36
- def add_amazing_print
37
- client.on(
38
- "--[no-]amazing_print",
39
- "Add Amazing Print gem. #{default __method__}."
40
- ) do |value|
41
- configuration.merge! build_amazing_print: value
42
- end
43
- end
44
-
45
- def add_caliber
46
- client.on(
47
- "--[no-]caliber",
48
- "Add Caliber gem. #{default __method__}."
49
- ) do |value|
50
- configuration.merge! build_caliber: value
51
- end
52
- end
53
-
54
- def add_console
55
- client.on(
56
- "--[no-]console",
57
- "Add console script. #{default __method__}."
58
- ) do |value|
59
- configuration.merge! build_console: value
60
- end
61
- end
62
-
63
- def add_contributions
64
- client.on(
65
- "--[no-]contributions",
66
- "Add contributions documentation. #{default __method__}."
67
- ) do |value|
68
- configuration.merge! build_contributions: value
69
- end
70
- end
71
-
72
- def add_circle_ci
73
- client.on(
74
- "--[no-]circle_ci",
75
- "Add Circle CI configuration and badge. #{default __method__}."
76
- ) do |value|
77
- configuration.merge! build_circle_ci: value
78
- end
79
- end
80
-
81
- def add_citation
82
- client.on(
83
- "--[no-]citation",
84
- "Add citation documentation. #{default __method__}."
85
- ) do |value|
86
- configuration.merge! build_citation: value
87
- end
88
- end
89
-
90
- def add_community
91
- client.on(
92
- "--[no-]community",
93
- "Add community documentation. #{default __method__}."
94
- ) do |value|
95
- configuration.merge! build_community: value
96
- end
97
- end
98
-
99
- def add_conduct
100
- client.on(
101
- "--[no-]conduct",
102
- "Add code of conduct documentation. #{default __method__}."
103
- ) do |value|
104
- configuration.merge! build_conduct: value
105
- end
106
- end
107
-
108
- def add_debug
109
- client.on(
110
- "--[no-]debug",
111
- "Add Debug gem. #{default __method__}."
112
- ) do |value|
113
- configuration.merge! build_debug: value
114
- end
115
- end
116
-
117
- def add_funding
118
- client.on(
119
- "--[no-]funding",
120
- "Add GitHub funding configuration. #{default __method__}."
121
- ) do |value|
122
- configuration.merge! build_funding: value
123
- end
124
- end
125
-
126
- def add_git
127
- client.on(
128
- "--[no-]git",
129
- "Add Git. #{default __method__}."
130
- ) do |value|
131
- configuration.merge! build_git: value
132
- end
133
- end
134
-
135
- def add_git_hub
136
- client.on(
137
- "--[no-]git_hub",
138
- "Add GitHub templates. #{default __method__}."
139
- ) do |value|
140
- configuration.merge! build_git_hub: value
141
- end
142
- end
143
-
144
- def add_git_hub_ci
145
- client.on(
146
- "--[no-]git_hub_ci",
147
- "Add GitHub templates. #{default __method__}."
148
- ) do |value|
149
- configuration.merge! build_git_hub_ci: value
150
- end
151
- end
152
-
153
- def add_git_lint
154
- client.on(
155
- "--[no-]git-lint",
156
- "Add Git Lint gem. #{default __method__}."
157
- ) do |value|
158
- configuration.merge! build_git_lint: value
159
- end
160
- end
161
-
162
- def add_guard
163
- client.on(
164
- "--[no-]guard",
165
- "Add Guard gem. #{default __method__}."
166
- ) do |value|
167
- configuration.merge! build_guard: value
168
- end
169
- end
170
-
171
- def add_license
172
- client.on(
173
- "--[no-]license",
174
- "Add license documentation. #{default __method__}."
175
- ) do |value|
176
- configuration.merge! build_license: value
177
- end
178
- end
179
-
180
- def add_maximum
181
- client.on(
182
- "--max",
183
- "Use maximum/enabled options. #{default __method__}."
184
- ) do
185
- configuration.merge!(**configuration.maximize.to_h)
186
- end
187
- end
188
-
189
- def add_minimum
190
- client.on(
191
- "--min",
192
- "Use minimum/disabled options. #{default __method__}."
193
- ) do
194
- configuration.merge!(**configuration.minimize.to_h)
195
- end
196
- end
197
-
198
- def add_rake
199
- client.on(
200
- "--[no-]rake",
201
- "Add Rake gem. #{default __method__}."
202
- ) do |value|
203
- configuration.merge! build_rake: value
204
- end
205
- end
206
-
207
- def add_readme
208
- client.on(
209
- "--[no-]readme",
210
- "Add readme documentation. #{default __method__}."
211
- ) do |value|
212
- configuration.merge! build_readme: value
213
- end
214
- end
215
-
216
- def add_reek
217
- client.on(
218
- "--[no-]reek",
219
- "Add Reek gem. #{default __method__}."
220
- ) do |value|
221
- configuration.merge! build_reek: value
222
- end
223
- end
224
-
225
- def add_refinements
226
- client.on(
227
- "--[no-]refinements",
228
- "Add Refinements gem. #{default __method__}."
229
- ) do |value|
230
- configuration.merge! build_refinements: value
231
- end
232
- end
233
-
234
- def add_rspec
235
- client.on(
236
- "--[no-]rspec",
237
- "Add RSpec gem. #{default __method__}."
238
- ) do |value|
239
- configuration.merge! build_rspec: value
240
- end
241
- end
242
-
243
- def add_security
244
- client.on(
245
- "--[no-]security",
246
- "Add security. #{default __method__}."
247
- ) do |value|
248
- configuration.merge! build_security: value
249
- end
250
- end
251
-
252
- def add_setup
253
- client.on(
254
- "--[no-]setup",
255
- "Add setup script. #{default __method__}."
256
- ) do |value|
257
- configuration.merge! build_setup: value
258
- end
259
- end
260
-
261
- def add_simple_cov
262
- client.on(
263
- "--[no-]simple_cov",
264
- "Add SimpleCov gem. #{default __method__}."
265
- ) do |value|
266
- configuration.merge! build_simple_cov: value
267
- end
268
- end
269
-
270
- def add_versions
271
- client.on(
272
- "--[no-]versions",
273
- "Add version history. #{default __method__}."
274
- ) do |value|
275
- configuration.merge! build_versions: value
276
- end
277
- end
278
-
279
- def add_yard
280
- client.on(
281
- "--[no-]yard",
282
- "Add Yard gem. #{default __method__}."
283
- ) do |value|
284
- configuration.merge! build_yard: value
285
- end
286
- end
287
-
288
- def add_zeitwerk
289
- client.on(
290
- "--[no-]zeitwerk",
291
- "Add Zeitwerk gem. #{default __method__}."
292
- ) do |value|
293
- configuration.merge! build_zeitwerk: value
294
- end
295
- end
296
-
297
- def default option
298
- option.to_s
299
- .sub("add_", "build_")
300
- .then { |attribute| configuration.public_send attribute }
301
- .then { |bool| bool ? color[bool, :green] : color[bool, :red] }
302
- .then { |colored_boolean| "Default: #{colored_boolean}" }
303
- end
304
- end
305
- end
306
- end
307
- end
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "core"
4
- require "refinements/structs"
5
-
6
- module Rubysmith
7
- module CLI
8
- module Parsers
9
- # Handles parsing of Command Line Interface (CLI) core options.
10
- class Core
11
- include Import[:specification]
12
-
13
- using Refinements::Structs
14
-
15
- def self.call(...) = new(...).call
16
-
17
- def initialize(configuration = Container[:configuration], client: Parser::CLIENT, **)
18
- super(**)
19
- @configuration = configuration
20
- @client = client
21
- end
22
-
23
- def call arguments = ::Core::EMPTY_ARRAY
24
- client.banner = specification.labeled_summary
25
- client.separator "\nUSAGE:\n"
26
- collate
27
- client.parse arguments
28
- configuration
29
- end
30
-
31
- private
32
-
33
- attr_reader :configuration, :client
34
-
35
- def collate = private_methods.sort.grep(/add_/).each { |method| __send__ method }
36
-
37
- def add_config
38
- client.on "-c",
39
- "--config ACTION",
40
- %i[edit view],
41
- "Manage gem configuration: edit or view." do |action|
42
- configuration.merge! action_config: action
43
- end
44
- end
45
-
46
- def add_build
47
- client.on "-b", "--build NAME [options]", "Build new project." do |name|
48
- configuration.merge! action_build: true, project_name: name
49
- end
50
- end
51
-
52
- def add_publish
53
- client.on "-p", "--publish VERSION", "Publish project." do |version|
54
- configuration.merge! action_publish: true, project_version: version
55
- end
56
- end
57
-
58
- def add_version
59
- client.on "-v", "--version", "Show gem version." do
60
- configuration.merge! action_version: true
61
- end
62
- end
63
-
64
- def add_help
65
- client.on "-h", "--help", "Show this message." do
66
- configuration.merge! action_help: true
67
- end
68
- end
69
- end
70
- end
71
- end
72
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "dry/container"
4
-
5
- module Rubysmith
6
- module Configuration
7
- module Enhancers
8
- # Provides a container of enhancers for injection into other objects.
9
- module Container
10
- extend Dry::Container::Mixin
11
-
12
- register(:current_time) { Enhancers::CurrentTime }
13
- register(:git_hub_user) { Enhancers::GitHubUser }
14
- register(:git_email) { Enhancers::GitEmail }
15
- register(:git_user) { Enhancers::GitUser }
16
- register(:template_root) { Enhancers::TemplateRoot }
17
- end
18
- end
19
- end
20
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "refinements/structs"
4
-
5
- module Rubysmith
6
- module Configuration
7
- # Adds current time to content.
8
- module Enhancers
9
- using Refinements::Structs
10
-
11
- CurrentTime = -> content, at: Time.now { content.merge(now: at) }
12
- end
13
- end
14
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gitt"
4
- require "refinements/strings"
5
- require "refinements/structs"
6
-
7
- module Rubysmith
8
- module Configuration
9
- # Dynamically adds Git email if defined.
10
- module Enhancers
11
- using Refinements::Strings
12
- using Refinements::Structs
13
-
14
- GitEmail = lambda do |content, git: Gitt::Repository.new|
15
- return content unless String(content.author_email).blank?
16
-
17
- content.merge author_email: git.get("user.email").value_or("")
18
- end
19
- end
20
- end
21
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gitt"
4
- require "refinements/strings"
5
- require "refinements/structs"
6
-
7
- module Rubysmith
8
- module Configuration
9
- # Dynamically adds GitHub user if user is defined.
10
- module Enhancers
11
- using Refinements::Strings
12
- using Refinements::Structs
13
-
14
- GitHubUser = lambda do |content, git: Gitt::Repository.new|
15
- return content unless String(content.git_hub_user).blank?
16
-
17
- content.merge git_hub_user: git.get("github.user").value_or("default")
18
- end
19
- end
20
- end
21
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gitt"
4
- require "refinements/strings"
5
- require "refinements/structs"
6
-
7
- module Rubysmith
8
- module Configuration
9
- # Dynamically adds Git user if defined.
10
- module Enhancers
11
- using Refinements::Strings
12
- using Refinements::Structs
13
-
14
- GitUser = lambda do |content, git: Gitt::Repository.new|
15
- return content unless String(content.author_name).blank?
16
-
17
- git.get("user.name")
18
- .value_or("")
19
- .then { |name| String(name).split }
20
- .then { |first, last| {author_given_name: first, author_family_name: last} }
21
- .then { |user| content.merge(**user) }
22
- end
23
- end
24
- end
25
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Rubysmith
4
- module Configuration
5
- module Enhancers
6
- # Prepends template roots to existing content.
7
- TemplateRoot = lambda do |content, overrides: Pathname(__dir__).join("../../templates")|
8
- content.add_template_roots(*Array(overrides))
9
- end
10
- end
11
- end
12
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "pathname"
4
- require "refinements/hashes"
5
- require "refinements/structs"
6
- require "runcom"
7
- require "yaml"
8
-
9
- module Rubysmith
10
- module Configuration
11
- # Represents the fully assembled Command Line Interface (CLI) configuration.
12
- class Loader
13
- using Refinements::Hashes
14
- using Refinements::Structs
15
-
16
- DEFAULTS = YAML.load_file(Pathname(__dir__).join("defaults.yml")).freeze
17
- CLIENT = Runcom::Config.new "rubysmith/configuration.yml", defaults: DEFAULTS
18
-
19
- def self.call(...) = new(...).call
20
-
21
- def self.with_defaults = new(client: DEFAULTS, enhancers: {})
22
-
23
- def initialize content: Content.new, client: CLIENT, enhancers: Enhancers::Container
24
- @content = content
25
- @client = client
26
- @enhancers = enhancers
27
- end
28
-
29
- def call
30
- enhancers.each
31
- .reduce(preload_content) { |preload, (_key, enhancer)| enhancer.call preload }
32
- .freeze
33
- end
34
-
35
- protected
36
-
37
- attr_reader :content, :client, :enhancers
38
-
39
- private
40
-
41
- def preload_content = content.merge(**client.to_h.flatten_keys)
42
- end
43
- end
44
- end