rubysmith 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.adoc +21 -9
- data/lib/rubysmith/builder.rb +6 -12
- data/lib/rubysmith/builders/core.rb +3 -1
- data/lib/rubysmith/cli/actions/build.rb +42 -0
- data/lib/rubysmith/cli/actions/config.rb +33 -0
- data/lib/rubysmith/cli/configuration/content.rb +24 -17
- data/lib/rubysmith/cli/configuration/defaults.yml +1 -1
- data/lib/rubysmith/cli/configuration/loader.rb +7 -4
- data/lib/rubysmith/cli/parsers/assembler.rb +7 -9
- data/lib/rubysmith/cli/parsers/build.rb +29 -27
- data/lib/rubysmith/cli/parsers/core.rb +13 -8
- data/lib/rubysmith/cli/shell.rb +13 -26
- data/lib/rubysmith/container.rb +37 -0
- data/lib/rubysmith/identity.rb +1 -1
- data/lib/rubysmith/templates/%project_name%/Gemfile.erb +46 -49
- data/lib/rubysmith/templates/%project_name%/lib/%project_path%.rb.erb +4 -5
- data/lib/rubysmith.rb +4 -3
- data.tar.gz.sig +0 -0
- metadata +33 -4
- metadata.gz.sig +0 -0
- data/lib/rubysmith/cli/processors/build.rb +0 -56
- data/lib/rubysmith/cli/processors/config.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa3e01ddcd6743f57757311a125d1e8ab39c44e09c1f1186a53b4a0ca6388d7d
|
4
|
+
data.tar.gz: d0725b76c5829d64fbd5e648506ae2e57adbb9882e992b84bfddaa879f166a0b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e14344b8a18601ef9e05ab3463491977eb81a62027dad1658a7cb1012f94f982296fe1981eea3bd90f35aa88668d3b553d3ef4bed5e77c7dddd060a8a2e444a
|
7
|
+
data.tar.gz: 7b1d999af3527fdd1a182dc2405d19b852cfb93ab8d8c70fa2f1b1e5c3261daa8548d13966d062e266911817e53e394f20442c778c59aad4f89fe4b33402380a
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/README.adoc
CHANGED
@@ -30,10 +30,10 @@ toc::[]
|
|
30
30
|
* Uses link:https://www.alchemists.io/projects/pragmater[Pragmater] for Ruby source pragma directives.
|
31
31
|
* Supports link:https://github.com/amazing-print/amazing_print[Amazing Print].
|
32
32
|
* Supports link:https://github.com/rubymem/bundler-leak[Bundler Leak].
|
33
|
+
* Supports link:https://github.com/ruby/debug[Debug].
|
33
34
|
* Supports link:https://git-scm.com[Git].
|
34
35
|
* Supports link:https://www.alchemists.io/projects/git-lint[Git Lint].
|
35
36
|
* Supports link:https://github.com/guard/guard[Guard].
|
36
|
-
* Supports link:http://pryrepl.org[Pry].
|
37
37
|
* Supports link:https://github.com/ruby/rake[Rake].
|
38
38
|
* Supports link:https://github.com/troessner/reek[Reek].
|
39
39
|
* Supports link:https://www.alchemists.io/projects/refinements[Refinements].
|
@@ -43,6 +43,7 @@ toc::[]
|
|
43
43
|
* Supports link:https://github.com/rubocop-hq/rubocop-rake[Rubocop Rake].
|
44
44
|
* Supports link:https://github.com/rubocop-hq/rubocop-rspec[Rubocop RSpec].
|
45
45
|
* Supports link:https://github.com/simplecov-ruby/simplecov[SimpleCov].
|
46
|
+
* Supports link:https://github.com/fxn/zeitwerk[Zeitwerk].
|
46
47
|
* Supports common settings and a structured layout for building projects.
|
47
48
|
* Provides common documentation:
|
48
49
|
** README
|
@@ -89,12 +90,12 @@ BUILD OPTIONS:
|
|
89
90
|
--[no-]amazing_print Add Amazing Print.
|
90
91
|
--[no-]bundler-leak Add Bundler Leak.
|
91
92
|
--[no-]console Add console script.
|
93
|
+
--[no-]debug Add Debug.
|
92
94
|
--[no-]documentation Add documentation.
|
93
95
|
--[no-]git Add Git.
|
94
96
|
--[no-]git-lint Add Git Lint.
|
95
97
|
--[no-]guard Add Guard.
|
96
98
|
--min Use minimum/no options.
|
97
|
-
--[no-]pry Add Pry.
|
98
99
|
--[no-]rake Add Rake.
|
99
100
|
--[no-]reek Add Reek.
|
100
101
|
--[no-]refinements Add Refinements.
|
@@ -120,12 +121,12 @@ to disable specific options, you can use the `--no-*` prefix. Example:
|
|
120
121
|
|
121
122
|
[source,bash]
|
122
123
|
----
|
123
|
-
rubysmith --build demo --no-
|
124
|
+
rubysmith --build demo --no-debug --no-guard
|
124
125
|
----
|
125
126
|
|
126
|
-
With the above example, both
|
127
|
-
project. Taking this a step further, you can also use the `--min` option to generate a
|
128
|
-
bare minimum of options. Example:
|
127
|
+
With the above example, both Debug and Guard support would have been disabled when building the
|
128
|
+
`demo` project. Taking this a step further, you can also use the `--min` option to generate a
|
129
|
+
project with bare minimum of options. Example:
|
129
130
|
|
130
131
|
[source,bash]
|
131
132
|
----
|
@@ -136,8 +137,19 @@ The above is essentially the same as building with _all_ options disabled. This
|
|
136
137
|
situations where you need to quickly script something up for sharing with others yet still want to
|
137
138
|
avoid using a Bundler Inline script so gem dependencies are not installed each time the code is run.
|
138
139
|
|
139
|
-
|
140
|
-
|
140
|
+
As shown earlier, you can combine options but the order options can be handy in certain situations
|
141
|
+
especially when used with the minimum build option. Example:
|
142
|
+
|
143
|
+
[source,bash]
|
144
|
+
----
|
145
|
+
rubysmith --build demo --min --zeitwerk
|
146
|
+
----
|
147
|
+
|
148
|
+
The above will disable _all_ options except for Zeitwerk which will be enabled in this situation.
|
149
|
+
This can be a handy way to build a new project with all options disabled with only a few select
|
150
|
+
options enabled. To have specific options enabled/disabled _every time_ you build a new Ruby
|
151
|
+
project, you can edit your global configuration for making these settings permanent (see below for
|
152
|
+
details).
|
141
153
|
|
142
154
|
=== Configuration
|
143
155
|
|
@@ -165,12 +177,12 @@ The default configuration is as follows:
|
|
165
177
|
:amazing_print: true
|
166
178
|
:bundler_leak: true
|
167
179
|
:console: true
|
180
|
+
:debug: true
|
168
181
|
:documentation: true
|
169
182
|
:git: true
|
170
183
|
:git_lint: true
|
171
184
|
:guard: true
|
172
185
|
:minimum: false
|
173
|
-
:pry: true
|
174
186
|
:rake: true
|
175
187
|
:reek: true
|
176
188
|
:refinements: true
|
data/lib/rubysmith/builder.rb
CHANGED
@@ -10,20 +10,14 @@ module Rubysmith
|
|
10
10
|
class Builder
|
11
11
|
using Refinements::Pathnames
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
HELPERS = {
|
16
|
-
inserter: Text::Inserter,
|
17
|
-
renderer: Renderers::ERB,
|
18
|
-
kernel: Open3,
|
19
|
-
logger: LOGGER
|
20
|
-
}.freeze
|
13
|
+
HELPERS = {inserter: Text::Inserter, renderer: Renderers::ERB, kernel: Open3}.freeze
|
21
14
|
|
22
15
|
def self.call(...) = new(...)
|
23
16
|
|
24
|
-
def initialize configuration, helpers: HELPERS
|
17
|
+
def initialize configuration, helpers: HELPERS, container: Container
|
25
18
|
@configuration = configuration
|
26
19
|
@helpers = helpers
|
20
|
+
@container = container
|
27
21
|
end
|
28
22
|
|
29
23
|
def append content
|
@@ -100,7 +94,7 @@ module Rubysmith
|
|
100
94
|
|
101
95
|
private
|
102
96
|
|
103
|
-
attr_reader :configuration, :helpers
|
97
|
+
attr_reader :configuration, :helpers, :container
|
104
98
|
|
105
99
|
def execute *command
|
106
100
|
kernel.capture2e(*command).then do |result, status|
|
@@ -114,9 +108,9 @@ module Rubysmith
|
|
114
108
|
|
115
109
|
def kernel = helpers.fetch(__method__)
|
116
110
|
|
117
|
-
def logger =
|
111
|
+
def logger = container[__method__]
|
118
112
|
|
119
|
-
def relative_build_path = build_path.relative_path_from(configuration.
|
113
|
+
def relative_build_path = build_path.relative_path_from(configuration.target_root)
|
120
114
|
|
121
115
|
def build_path
|
122
116
|
pathway.end_path
|
@@ -14,7 +14,9 @@ module Rubysmith
|
|
14
14
|
def call
|
15
15
|
builder.call(configuration.with(template_path: "%project_name%/lib/%project_path%.rb.erb"))
|
16
16
|
.render
|
17
|
-
.replace(
|
17
|
+
.replace(" require", "require")
|
18
|
+
.replace(/ (?=(Zeit|\.tap|\.setup))/, "")
|
19
|
+
.replace("\n \n", "\n\n")
|
18
20
|
|
19
21
|
builder.call(configuration.with(template_path: "%project_name%/.ruby-version.erb")).render
|
20
22
|
nil
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Rubysmith
|
4
|
+
module CLI
|
5
|
+
module Actions
|
6
|
+
# Handles the build action.
|
7
|
+
class Build
|
8
|
+
# Order is important.
|
9
|
+
BUILDERS = [
|
10
|
+
Builders::Core,
|
11
|
+
Builders::Documentation,
|
12
|
+
Builders::Git::Setup,
|
13
|
+
Builders::Bundler,
|
14
|
+
Builders::Rake,
|
15
|
+
Builders::Console,
|
16
|
+
Builders::Setup,
|
17
|
+
Builders::Guard,
|
18
|
+
Builders::Reek,
|
19
|
+
Builders::RSpec::Context,
|
20
|
+
Builders::RSpec::Helper,
|
21
|
+
Builders::Pragma,
|
22
|
+
Builders::Rubocop::Setup,
|
23
|
+
Builders::Rubocop::Formatter,
|
24
|
+
Builders::Git::Commit
|
25
|
+
].freeze
|
26
|
+
|
27
|
+
def initialize builders: BUILDERS, container: Container
|
28
|
+
@builders = builders
|
29
|
+
@container = container
|
30
|
+
end
|
31
|
+
|
32
|
+
def call = builders.each { |builder| builder.call configuration }
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
attr_reader :builders, :container
|
37
|
+
|
38
|
+
def configuration = container[__method__]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Rubysmith
|
4
|
+
module CLI
|
5
|
+
module Actions
|
6
|
+
# Handles the config action.
|
7
|
+
class Config
|
8
|
+
def initialize client: CLI::Configuration::Loader::CLIENT, container: Container
|
9
|
+
@client = client
|
10
|
+
@container = container
|
11
|
+
end
|
12
|
+
|
13
|
+
def call selection
|
14
|
+
case selection
|
15
|
+
when :edit then edit
|
16
|
+
when :view then view
|
17
|
+
else fail StandardError, "Invalid configuration selection: #{selection}."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
attr_reader :client, :container
|
24
|
+
|
25
|
+
def edit = kernel.system("$EDITOR #{client.current}")
|
26
|
+
|
27
|
+
def view = kernel.system("cat #{client.current}")
|
28
|
+
|
29
|
+
def kernel = container[__method__]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -8,26 +8,22 @@ module Rubysmith
|
|
8
8
|
module Configuration
|
9
9
|
# Defines the common configuration content for use throughout the gem.
|
10
10
|
Content = Struct.new(
|
11
|
-
:
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:project_name,
|
16
|
-
:author_name,
|
11
|
+
:action_build,
|
12
|
+
:action_config,
|
13
|
+
:action_help,
|
14
|
+
:action_version,
|
17
15
|
:author_email,
|
16
|
+
:author_name,
|
18
17
|
:author_url,
|
19
|
-
:now,
|
20
|
-
:documentation_format,
|
21
|
-
:documentation_license,
|
22
|
-
:build_minimum,
|
23
18
|
:build_amazing_print,
|
24
19
|
:build_bundler_leak,
|
25
20
|
:build_console,
|
21
|
+
:build_debug,
|
26
22
|
:build_documentation,
|
27
23
|
:build_git,
|
28
24
|
:build_git_lint,
|
29
25
|
:build_guard,
|
30
|
-
:
|
26
|
+
:build_minimum,
|
31
27
|
:build_rake,
|
32
28
|
:build_reek,
|
33
29
|
:build_refinements,
|
@@ -38,8 +34,13 @@ module Rubysmith
|
|
38
34
|
:build_zeitwerk,
|
39
35
|
:builders_pragmater_comments,
|
40
36
|
:builders_pragmater_includes,
|
41
|
-
:
|
42
|
-
:
|
37
|
+
:documentation_format,
|
38
|
+
:documentation_license,
|
39
|
+
:now,
|
40
|
+
:project_name,
|
41
|
+
:target_root,
|
42
|
+
:template_path,
|
43
|
+
:template_root,
|
43
44
|
keyword_init: true
|
44
45
|
) do
|
45
46
|
using Refinements::Strings
|
@@ -48,22 +49,28 @@ module Rubysmith
|
|
48
49
|
super
|
49
50
|
|
50
51
|
self[:template_root] ||= Pathname(__dir__).join("../../templates").expand_path
|
51
|
-
self[:
|
52
|
-
freeze
|
52
|
+
self[:target_root] ||= Pathname.pwd
|
53
53
|
end
|
54
54
|
|
55
55
|
def with(attributes) = self.class.new(to_h.merge(attributes))
|
56
56
|
|
57
|
+
def minimize
|
58
|
+
to_h.except(:build_minimum)
|
59
|
+
.select { |key, _value| key.start_with? "build_" }
|
60
|
+
.each { |key, _value| self[key] = false }
|
61
|
+
.then { self }
|
62
|
+
end
|
63
|
+
|
57
64
|
def project_label = project_name.titleize
|
58
65
|
|
59
66
|
def project_class = project_name.camelcase
|
60
67
|
|
61
|
-
def project_root =
|
68
|
+
def project_root = target_root.join(project_name)
|
62
69
|
|
63
70
|
def project_path = project_name.snakecase
|
64
71
|
|
65
72
|
def to_pathway
|
66
|
-
Pathway[start_root: template_root, start_path: template_path, end_root:
|
73
|
+
Pathway[start_root: template_root, start_path: template_path, end_root: target_root]
|
67
74
|
end
|
68
75
|
end
|
69
76
|
end
|
@@ -17,18 +17,21 @@ module Rubysmith
|
|
17
17
|
DEFAULTS = YAML.load_file(Pathname(__dir__).join("defaults.yml")).freeze
|
18
18
|
CLIENT = Runcom::Config.new "#{Identity::NAME}/configuration.yml", defaults: DEFAULTS
|
19
19
|
|
20
|
-
def self.call = new.call
|
20
|
+
def self.call(...) = new(...).call
|
21
21
|
|
22
|
-
def
|
22
|
+
def self.with_defaults(now: Time.now) = new(now: now, client: DEFAULTS)
|
23
|
+
|
24
|
+
def initialize now: Time.now, content: Content.new, client: CLIENT
|
25
|
+
@now = now
|
23
26
|
@content = content
|
24
27
|
@client = client
|
25
28
|
end
|
26
29
|
|
27
|
-
def call = content.merge(**client.to_h.flatten_keys)
|
30
|
+
def call = content.merge(**client.to_h.flatten_keys, now: now)
|
28
31
|
|
29
32
|
private
|
30
33
|
|
31
|
-
attr_reader :content, :client
|
34
|
+
attr_reader :now, :content, :client
|
32
35
|
end
|
33
36
|
end
|
34
37
|
end
|
@@ -7,27 +7,25 @@ module Rubysmith
|
|
7
7
|
class Assembler
|
8
8
|
SECTIONS = [Core, Build].freeze # Order is important.
|
9
9
|
|
10
|
-
def initialize
|
11
|
-
sections: SECTIONS,
|
12
|
-
client: CLIENT
|
13
|
-
@options = configuration.to_h
|
10
|
+
def initialize sections: SECTIONS, client: CLIENT, container: Container
|
14
11
|
@sections = sections
|
15
12
|
@client = client
|
13
|
+
@container = container
|
16
14
|
end
|
17
15
|
|
18
16
|
def call arguments = []
|
19
|
-
sections.each { |parser| parser.call client: client
|
17
|
+
sections.each { |parser| parser.call client: client }
|
20
18
|
client.parse! arguments
|
21
|
-
|
19
|
+
configuration
|
22
20
|
end
|
23
21
|
|
24
|
-
def to_h = options
|
25
|
-
|
26
22
|
def to_s = client.to_s
|
27
23
|
|
28
24
|
private
|
29
25
|
|
30
|
-
attr_reader :
|
26
|
+
attr_reader :sections, :client, :container
|
27
|
+
|
28
|
+
def configuration = container[__method__]
|
31
29
|
end
|
32
30
|
end
|
33
31
|
end
|
@@ -7,9 +7,9 @@ module Rubysmith
|
|
7
7
|
class Build
|
8
8
|
def self.call(...) = new(...).call
|
9
9
|
|
10
|
-
def initialize
|
11
|
-
@options = options
|
10
|
+
def initialize client: CLIENT, container: Container
|
12
11
|
@client = client
|
12
|
+
@container = container
|
13
13
|
end
|
14
14
|
|
15
15
|
def call arguments = []
|
@@ -20,109 +20,111 @@ module Rubysmith
|
|
20
20
|
|
21
21
|
private
|
22
22
|
|
23
|
-
attr_reader :
|
24
|
-
|
25
|
-
def add_minimum
|
26
|
-
client.on "--min", "Use minimum/no options." do |value|
|
27
|
-
options[:build_minimum] = value
|
28
|
-
end
|
29
|
-
end
|
23
|
+
attr_reader :client, :container
|
30
24
|
|
31
25
|
def add_amazing_print
|
32
26
|
client.on "--[no-]amazing_print", "Add Amazing Print." do |value|
|
33
|
-
|
27
|
+
configuration.build_amazing_print = value
|
34
28
|
end
|
35
29
|
end
|
36
30
|
|
37
31
|
def add_bundler_leak
|
38
32
|
client.on "--[no-]bundler-leak", "Add Bundler Leak." do |value|
|
39
|
-
|
33
|
+
configuration.build_bundler_leak = value
|
40
34
|
end
|
41
35
|
end
|
42
36
|
|
43
37
|
def add_console
|
44
38
|
client.on "--[no-]console", "Add console script." do |value|
|
45
|
-
|
39
|
+
configuration.build_console = value
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def add_debug
|
44
|
+
client.on "--[no-]debug", "Add Debug." do |value|
|
45
|
+
configuration.build_debug = value
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
49
|
def add_documentation
|
50
50
|
client.on "--[no-]documentation", "Add documentation." do |value|
|
51
|
-
|
51
|
+
configuration.build_documentation = value
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
55
|
def add_git
|
56
56
|
client.on "--[no-]git", "Add Git." do |value|
|
57
|
-
|
57
|
+
configuration.build_git = value
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
61
|
def add_git_lint
|
62
62
|
client.on "--[no-]git-lint", "Add Git Lint." do |value|
|
63
|
-
|
63
|
+
configuration.build_git_lint = value
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
67
|
def add_guard
|
68
68
|
client.on "--[no-]guard", "Add Guard." do |value|
|
69
|
-
|
69
|
+
configuration.build_guard = value
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
def
|
74
|
-
client.on "--
|
75
|
-
|
73
|
+
def add_minimum
|
74
|
+
client.on "--min", "Use minimum/no options." do |value|
|
75
|
+
configuration.minimize.build_minimum = value
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
79
|
def add_rake
|
80
80
|
client.on "--[no-]rake", "Add Rake." do |value|
|
81
|
-
|
81
|
+
configuration.build_rake = value
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
85
|
def add_reek
|
86
86
|
client.on "--[no-]reek", "Add Reek." do |value|
|
87
|
-
|
87
|
+
configuration.build_reek = value
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
91
|
def add_refinements
|
92
92
|
client.on "--[no-]refinements", "Add Refinements." do |value|
|
93
|
-
|
93
|
+
configuration.build_refinements = value
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
97
|
def add_rspec
|
98
98
|
client.on "--[no-]rspec", "Add RSpec." do |value|
|
99
|
-
|
99
|
+
configuration.build_rspec = value
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
103
103
|
def add_rubocop
|
104
104
|
client.on "--[no-]rubocop", "Add Rubocop." do |value|
|
105
|
-
|
105
|
+
configuration.build_rubocop = value
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
109
|
def add_setup
|
110
110
|
client.on "--[no-]setup", "Add setup script." do |value|
|
111
|
-
|
111
|
+
configuration.build_setup = value
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
115
|
def add_simple_cov
|
116
116
|
client.on "--[no-]simple_cov", "Add SimpleCov." do |value|
|
117
|
-
|
117
|
+
configuration.build_simple_cov = value
|
118
118
|
end
|
119
119
|
end
|
120
120
|
|
121
121
|
def add_zeitwerk
|
122
122
|
client.on "--[no-]zeitwerk", "Add Zeitwerk." do |value|
|
123
|
-
|
123
|
+
configuration.build_zeitwerk = value
|
124
124
|
end
|
125
125
|
end
|
126
|
+
|
127
|
+
def configuration = container[__method__]
|
126
128
|
end
|
127
129
|
end
|
128
130
|
end
|
@@ -1,17 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "rubysmith/identity"
|
4
|
+
require "refinements/structs"
|
4
5
|
|
5
6
|
module Rubysmith
|
6
7
|
module CLI
|
7
8
|
module Parsers
|
8
9
|
# Handles parsing of Command Line Interface (CLI) core options.
|
9
10
|
class Core
|
11
|
+
using Refinements::Structs
|
12
|
+
|
10
13
|
def self.call(...) = new(...).call
|
11
14
|
|
12
|
-
def initialize
|
13
|
-
@options = options
|
15
|
+
def initialize client: CLIENT, container: Container
|
14
16
|
@client = client
|
17
|
+
@container = container
|
15
18
|
end
|
16
19
|
|
17
20
|
def call arguments = []
|
@@ -23,7 +26,7 @@ module Rubysmith
|
|
23
26
|
|
24
27
|
private
|
25
28
|
|
26
|
-
attr_reader :
|
29
|
+
attr_reader :client, :container
|
27
30
|
|
28
31
|
def collate = private_methods.sort.grep(/add_/).each { |method| __send__ method }
|
29
32
|
|
@@ -32,27 +35,29 @@ module Rubysmith
|
|
32
35
|
"--config ACTION",
|
33
36
|
%i[edit view],
|
34
37
|
"Manage gem configuration: edit or view." do |action|
|
35
|
-
|
38
|
+
configuration.action_config = action
|
36
39
|
end
|
37
40
|
end
|
38
41
|
|
39
42
|
def add_build
|
40
|
-
client.on "-b", "--build NAME [options]", "Build new project." do |
|
41
|
-
|
43
|
+
client.on "-b", "--build NAME [options]", "Build new project." do |name|
|
44
|
+
configuration.merge! action_build: true, project_name: name
|
42
45
|
end
|
43
46
|
end
|
44
47
|
|
45
48
|
def add_version
|
46
49
|
client.on "-v", "--version", "Show gem version." do
|
47
|
-
|
50
|
+
configuration.action_version = Identity::VERSION_LABEL
|
48
51
|
end
|
49
52
|
end
|
50
53
|
|
51
54
|
def add_help
|
52
55
|
client.on "-h", "--help", "Show this message." do
|
53
|
-
|
56
|
+
configuration.action_help = true
|
54
57
|
end
|
55
58
|
end
|
59
|
+
|
60
|
+
def configuration = container[__method__]
|
56
61
|
end
|
57
62
|
end
|
58
63
|
end
|
data/lib/rubysmith/cli/shell.rb
CHANGED
@@ -1,39 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "refinements/hashes"
|
4
|
-
|
5
3
|
module Rubysmith
|
6
4
|
module CLI
|
7
5
|
# The main Command Line Interface (CLI) object.
|
8
6
|
class Shell
|
9
|
-
|
10
|
-
|
11
|
-
PROCESSORS = {
|
12
|
-
config: Processors::Config.new,
|
13
|
-
build_minimum: Processors::Build.with_minimum,
|
14
|
-
build_maximum: Processors::Build.new
|
15
|
-
}.freeze
|
7
|
+
ACTIONS = {config: Actions::Config.new, build: Actions::Build.new}.freeze
|
16
8
|
|
17
|
-
def initialize parser: Parsers::Assembler.new,
|
9
|
+
def initialize parser: Parsers::Assembler.new, actions: ACTIONS, container: Container
|
18
10
|
@parser = parser
|
19
|
-
@
|
11
|
+
@actions = actions
|
12
|
+
@container = container
|
20
13
|
end
|
21
14
|
|
22
15
|
def call arguments = []
|
23
|
-
parse arguments
|
24
|
-
|
25
|
-
|
26
|
-
in
|
27
|
-
in build_minimum: true then process_build :build_minimum, options
|
28
|
-
in build: then process_build :build_maximum, options
|
29
|
-
in version: String => version then puts version
|
16
|
+
case parse arguments
|
17
|
+
in action_config: Symbol => action then config action
|
18
|
+
in action_build: true then build
|
19
|
+
in action_version: String => version then puts version
|
30
20
|
else usage
|
31
21
|
end
|
32
22
|
end
|
33
23
|
|
34
24
|
private
|
35
25
|
|
36
|
-
attr_reader :parser, :
|
26
|
+
attr_reader :parser, :actions, :container
|
37
27
|
|
38
28
|
def parse arguments = []
|
39
29
|
parser.call arguments
|
@@ -41,16 +31,13 @@ module Rubysmith
|
|
41
31
|
puts error.message
|
42
32
|
end
|
43
33
|
|
44
|
-
def
|
34
|
+
def config(action) = actions.fetch(__method__).call(action)
|
45
35
|
|
46
|
-
def
|
47
|
-
processors.fetch(kind).call settings.transform_keys(build: :project_name)
|
48
|
-
.merge(now: Time.now)
|
49
|
-
end
|
36
|
+
def build = actions.fetch(__method__).call
|
50
37
|
|
51
|
-
def
|
38
|
+
def usage = logger.unknown(parser.to_s)
|
52
39
|
|
53
|
-
def
|
40
|
+
def logger = container[__method__]
|
54
41
|
end
|
55
42
|
end
|
56
43
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry-container"
|
4
|
+
require "logger"
|
5
|
+
require "pastel"
|
6
|
+
|
7
|
+
module Rubysmith
|
8
|
+
# Provides a global gem container for injection into other objects.
|
9
|
+
module Container
|
10
|
+
extend Dry::Container::Mixin
|
11
|
+
|
12
|
+
register(:configuration, memoize: true) { CLI::Configuration::Loader.call }
|
13
|
+
register(:colorizer) { Pastel.new enabled: $stdout.tty? }
|
14
|
+
register(:kernel) { Kernel }
|
15
|
+
|
16
|
+
register :log_colors do
|
17
|
+
{
|
18
|
+
"DEBUG" => self[:colorizer].white.detach,
|
19
|
+
"INFO" => self[:colorizer].green.detach,
|
20
|
+
"WARN" => self[:colorizer].yellow.detach,
|
21
|
+
"ERROR" => self[:colorizer].red.detach,
|
22
|
+
"FATAL" => self[:colorizer].white.bold.on_red.detach,
|
23
|
+
"ANY" => self[:colorizer].white.bold.detach
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
register :logger do
|
28
|
+
Logger.new $stdout,
|
29
|
+
level: Logger.const_get(ENV.fetch("LOG_LEVEL", "INFO")),
|
30
|
+
formatter: (
|
31
|
+
lambda do |severity, _at, _name, message|
|
32
|
+
self[:log_colors][severity].call "#{message}\n"
|
33
|
+
end
|
34
|
+
)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/rubysmith/identity.rb
CHANGED
@@ -2,59 +2,56 @@ ruby File.read(".ruby-version").strip
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
<%
|
6
|
-
|
7
|
-
|
5
|
+
<% if configuration.build_refinements %>
|
6
|
+
gem "refinements", "~> 8.0"
|
7
|
+
<% end %>
|
8
|
+
<% if configuration.build_zeitwerk %>
|
9
|
+
gem "zeitwerk", "~> 2.4"
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
group :code_quality do
|
13
|
+
<% if configuration.build_bundler_leak %>
|
14
|
+
gem "bundler-leak", "~> 0.2"
|
15
|
+
<% end %>
|
16
|
+
<% if configuration.build_git && configuration.build_git_lint %>
|
17
|
+
gem "git-lint", "~> 2.0"
|
8
18
|
<% end %>
|
9
|
-
<% if configuration.
|
10
|
-
gem "
|
19
|
+
<% if configuration.build_reek %>
|
20
|
+
gem "reek", "~> 6.0"
|
11
21
|
<% end %>
|
22
|
+
<% if configuration.build_rubocop %>
|
23
|
+
gem "rubocop", "~> 1.20"
|
24
|
+
gem "rubocop-performance", "~> 1.11"
|
25
|
+
gem "rubocop-rake", "~> 0.6"
|
26
|
+
<% end %>
|
27
|
+
<% if configuration.build_rspec && configuration.build_rubocop %>
|
28
|
+
gem "rubocop-rspec", "~> 2.4"
|
29
|
+
<% end %>
|
30
|
+
<% if configuration.build_simple_cov %>
|
31
|
+
gem "simplecov", "~> 0.20"
|
32
|
+
<% end %>
|
33
|
+
end
|
12
34
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
<% end %>
|
17
|
-
<% if configuration.build_git && configuration.build_git_lint %>
|
18
|
-
gem "git-lint", "~> 2.0"
|
19
|
-
<% end %>
|
20
|
-
<% if configuration.build_reek %>
|
21
|
-
gem "reek", "~> 6.0"
|
22
|
-
<% end %>
|
23
|
-
<% if configuration.build_rubocop %>
|
24
|
-
gem "rubocop", "~> 1.20"
|
25
|
-
gem "rubocop-performance", "~> 1.11"
|
26
|
-
gem "rubocop-rake", "~> 0.6"
|
27
|
-
<% end %>
|
28
|
-
<% if configuration.build_rspec && configuration.build_rubocop %>
|
29
|
-
gem "rubocop-rspec", "~> 2.4"
|
30
|
-
<% end %>
|
31
|
-
<% if configuration.build_simple_cov %>
|
32
|
-
gem "simplecov", "~> 0.20"
|
33
|
-
<% end %>
|
35
|
+
<% if configuration.build_rake %>
|
36
|
+
group :development do
|
37
|
+
gem "rake", "~> 13.0"
|
34
38
|
end
|
39
|
+
<% end %>
|
35
40
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
41
|
+
group :test do
|
42
|
+
<% if configuration.build_guard %>
|
43
|
+
gem "guard-rspec", "~> 4.7", require: false
|
40
44
|
<% end %>
|
45
|
+
<% if configuration.build_rspec %>
|
46
|
+
gem "rspec", "~> 3.10"
|
47
|
+
<% end %>
|
48
|
+
end
|
41
49
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
group :tools do
|
52
|
-
<% if configuration.build_amazing_print %>
|
53
|
-
gem "amazing_print", "~> 1.3"
|
54
|
-
<% end %>
|
55
|
-
<% if configuration.build_pry %>
|
56
|
-
gem "pry", "~> 0.13"
|
57
|
-
gem "pry-byebug", "~> 3.9"
|
58
|
-
<% end %>
|
59
|
-
end
|
60
|
-
<% end %>
|
50
|
+
group :tools do
|
51
|
+
<% if configuration.build_amazing_print %>
|
52
|
+
gem "amazing_print", "~> 1.3"
|
53
|
+
<% end %>
|
54
|
+
<% if configuration.build_debug %>
|
55
|
+
gem "debug", "~> 1.1"
|
56
|
+
<% end %>
|
57
|
+
end
|
@@ -1,12 +1,11 @@
|
|
1
1
|
<% if configuration.build_zeitwerk %>
|
2
2
|
require "zeitwerk"
|
3
3
|
<% if configuration.project_path.include? "/" %>
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
Zeitwerk::Loader.new
|
5
|
+
.tap { |loader| loader.push_dir "#{__dir__}/.." }
|
6
|
+
.setup
|
7
7
|
<% else %>
|
8
|
-
|
9
|
-
loader.setup
|
8
|
+
Zeitwerk::Loader.for_gem.setup
|
10
9
|
<% end %>
|
11
10
|
<% end %>
|
12
11
|
# Main namespace.
|
data/lib/rubysmith.rb
CHANGED
@@ -2,9 +2,10 @@
|
|
2
2
|
|
3
3
|
require "zeitwerk"
|
4
4
|
|
5
|
-
|
6
|
-
loader.inflector.inflect "cli" => "CLI", "erb" => "ERB", "rspec" => "RSpec"
|
7
|
-
loader.setup
|
5
|
+
Zeitwerk::Loader.for_gem.then do |loader|
|
6
|
+
loader.inflector.inflect "cli" => "CLI", "erb" => "ERB", "rspec" => "RSpec"
|
7
|
+
loader.setup
|
8
|
+
end
|
8
9
|
|
9
10
|
# Main namespace.
|
10
11
|
module Rubysmith
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubysmith
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brooke Kuhlmann
|
@@ -28,8 +28,36 @@ cert_chain:
|
|
28
28
|
lkHilIrX69jq8wMPpBhlaw2mRmeSL50Wv5u6xVBvOHhXFSP1crXM95vfLhLyRYod
|
29
29
|
W2A=
|
30
30
|
-----END CERTIFICATE-----
|
31
|
-
date: 2021-09-
|
31
|
+
date: 2021-09-16 00:00:00.000000000 Z
|
32
32
|
dependencies:
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: dry-container
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0.9'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0.9'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: pastel
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0.8'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0.8'
|
33
61
|
- !ruby/object:Gem::Dependency
|
34
62
|
name: pragmater
|
35
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -130,6 +158,8 @@ files:
|
|
130
158
|
- lib/rubysmith/builders/rubocop/formatter.rb
|
131
159
|
- lib/rubysmith/builders/rubocop/setup.rb
|
132
160
|
- lib/rubysmith/builders/setup.rb
|
161
|
+
- lib/rubysmith/cli/actions/build.rb
|
162
|
+
- lib/rubysmith/cli/actions/config.rb
|
133
163
|
- lib/rubysmith/cli/configuration/content.rb
|
134
164
|
- lib/rubysmith/cli/configuration/defaults.yml
|
135
165
|
- lib/rubysmith/cli/configuration/loader.rb
|
@@ -137,9 +167,8 @@ files:
|
|
137
167
|
- lib/rubysmith/cli/parsers/assembler.rb
|
138
168
|
- lib/rubysmith/cli/parsers/build.rb
|
139
169
|
- lib/rubysmith/cli/parsers/core.rb
|
140
|
-
- lib/rubysmith/cli/processors/build.rb
|
141
|
-
- lib/rubysmith/cli/processors/config.rb
|
142
170
|
- lib/rubysmith/cli/shell.rb
|
171
|
+
- lib/rubysmith/container.rb
|
143
172
|
- lib/rubysmith/identity.rb
|
144
173
|
- lib/rubysmith/pathway.rb
|
145
174
|
- lib/rubysmith/renderers/erb.rb
|
metadata.gz.sig
CHANGED
Binary file
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "refinements/structs"
|
4
|
-
|
5
|
-
module Rubysmith
|
6
|
-
module CLI
|
7
|
-
module Processors
|
8
|
-
# Handles the Command Line Interface (CLI) for building of a project skeleton.
|
9
|
-
class Build
|
10
|
-
using Refinements::Structs
|
11
|
-
|
12
|
-
# Order is important.
|
13
|
-
MINIMUM = [
|
14
|
-
Builders::Core,
|
15
|
-
Builders::Bundler,
|
16
|
-
Builders::Pragma,
|
17
|
-
Builders::Rubocop::Formatter
|
18
|
-
].freeze
|
19
|
-
|
20
|
-
# Order is important.
|
21
|
-
MAXIMUM = [
|
22
|
-
Builders::Core,
|
23
|
-
Builders::Documentation,
|
24
|
-
Builders::Git::Setup,
|
25
|
-
Builders::Bundler,
|
26
|
-
Builders::Rake,
|
27
|
-
Builders::Console,
|
28
|
-
Builders::Setup,
|
29
|
-
Builders::Guard,
|
30
|
-
Builders::Reek,
|
31
|
-
Builders::RSpec::Context,
|
32
|
-
Builders::RSpec::Helper,
|
33
|
-
Builders::Pragma,
|
34
|
-
Builders::Rubocop::Setup,
|
35
|
-
Builders::Rubocop::Formatter,
|
36
|
-
Builders::Git::Commit
|
37
|
-
].freeze
|
38
|
-
|
39
|
-
def self.with_minimum = new(builders: MINIMUM)
|
40
|
-
|
41
|
-
def initialize configuration: Configuration::Loader.call, builders: MAXIMUM
|
42
|
-
@configuration = configuration
|
43
|
-
@builders = builders
|
44
|
-
end
|
45
|
-
|
46
|
-
def call(options) = configuration.merge(**options).then { |config| process config }
|
47
|
-
|
48
|
-
private
|
49
|
-
|
50
|
-
attr_reader :configuration, :builders
|
51
|
-
|
52
|
-
def process(config) = builders.each { |builder| builder.call config }
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Rubysmith
|
4
|
-
module CLI
|
5
|
-
module Processors
|
6
|
-
# Handles the Command Line Interface (CLI) configuration processing.
|
7
|
-
class Config
|
8
|
-
def initialize configuration: CLI::Configuration::Loader::CLIENT, kernel: Kernel
|
9
|
-
@configuration = configuration
|
10
|
-
@kernel = kernel
|
11
|
-
end
|
12
|
-
|
13
|
-
def call action
|
14
|
-
case action
|
15
|
-
when :edit then edit
|
16
|
-
when :view then view
|
17
|
-
else fail StandardError, "Invalid configuration action: #{action}."
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
attr_reader :configuration, :kernel
|
24
|
-
|
25
|
-
def edit = kernel.system("$EDITOR #{configuration.current}")
|
26
|
-
|
27
|
-
def view = kernel.system("cat #{configuration.current}")
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|