hanamismith 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +2 -0
- data/LICENSE.adoc +134 -0
- data/README.adoc +206 -0
- data/exe/hanamismith +6 -0
- data/hanamismith.gemspec +42 -0
- data/lib/hanamismith/builders/binstub.rb +31 -0
- data/lib/hanamismith/builders/bundler.rb +95 -0
- data/lib/hanamismith/builders/caliber.rb +26 -0
- data/lib/hanamismith/builders/console.rb +22 -0
- data/lib/hanamismith/builders/core.rb +64 -0
- data/lib/hanamismith/builders/documentation/readme.rb +31 -0
- data/lib/hanamismith/builders/environment.rb +31 -0
- data/lib/hanamismith/builders/git/commit.rb +12 -0
- data/lib/hanamismith/builders/guard.rb +20 -0
- data/lib/hanamismith/builders/puma/configuration.rb +32 -0
- data/lib/hanamismith/builders/puma/procfile.rb +31 -0
- data/lib/hanamismith/builders/rack.rb +28 -0
- data/lib/hanamismith/builders/rake.rb +27 -0
- data/lib/hanamismith/builders/rspec/hanami.rb +34 -0
- data/lib/hanamismith/builders/rspec/helper.rb +24 -0
- data/lib/hanamismith/builders/slices/main.rb +67 -0
- data/lib/hanamismith/cli/actions/build.rb +66 -0
- data/lib/hanamismith/cli/actions/config.rb +34 -0
- data/lib/hanamismith/cli/actions/container.rb +19 -0
- data/lib/hanamismith/cli/actions/import.rb +11 -0
- data/lib/hanamismith/cli/parser.rb +38 -0
- data/lib/hanamismith/cli/parsers/core.rb +69 -0
- data/lib/hanamismith/cli/shell.rb +36 -0
- data/lib/hanamismith/configuration/content.rb +18 -0
- data/lib/hanamismith/configuration/defaults.yml +0 -0
- data/lib/hanamismith/configuration/loader.rb +27 -0
- data/lib/hanamismith/container.rb +17 -0
- data/lib/hanamismith/import.rb +7 -0
- data/lib/hanamismith/templates/%project_name%/Guardfile.erb +19 -0
- data/lib/hanamismith/templates/%project_name%/Procfile.dev.erb +1 -0
- data/lib/hanamismith/templates/%project_name%/Procfile.erb +1 -0
- data/lib/hanamismith/templates/%project_name%/app/action.rb.erb +9 -0
- data/lib/hanamismith/templates/%project_name%/app/repo.rb.erb +10 -0
- data/lib/hanamismith/templates/%project_name%/app/view.rb.erb +10 -0
- data/lib/hanamismith/templates/%project_name%/bin/hanami.erb +20 -0
- data/lib/hanamismith/templates/%project_name%/config/app.rb.erb +8 -0
- data/lib/hanamismith/templates/%project_name%/config/providers/persistence.rb.erb +28 -0
- data/lib/hanamismith/templates/%project_name%/config/puma.rb.erb +20 -0
- data/lib/hanamismith/templates/%project_name%/config/routes.rb.erb +8 -0
- data/lib/hanamismith/templates/%project_name%/config/settings.rb.erb +6 -0
- data/lib/hanamismith/templates/%project_name%/config.ru.erb +4 -0
- data/lib/hanamismith/templates/%project_name%/envrc.erb +1 -0
- data/lib/hanamismith/templates/%project_name%/lib/%project_path%/types.rb.erb +10 -0
- data/lib/hanamismith/templates/%project_name%/slices/main/action.rb.erb +7 -0
- data/lib/hanamismith/templates/%project_name%/slices/main/actions/home/show.rb.erb +10 -0
- data/lib/hanamismith/templates/%project_name%/slices/main/repo.rb.erb +7 -0
- data/lib/hanamismith/templates/%project_name%/slices/main/templates/home/show.html.erb.erb +3 -0
- data/lib/hanamismith/templates/%project_name%/slices/main/templates/layouts/app.html.erb.erb +32 -0
- data/lib/hanamismith/templates/%project_name%/slices/main/view.rb.erb +8 -0
- data/lib/hanamismith/templates/%project_name%/slices/main/views/home/show.rb.erb +9 -0
- data/lib/hanamismith/templates/%project_name%/spec/hanami_helper.rb.erb +22 -0
- data/lib/hanamismith.rb +13 -0
- data.tar.gz.sig +0 -0
- metadata +283 -0
- metadata.gz.sig +2 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "refinements/structs"
|
4
|
+
|
5
|
+
module Hanamismith
|
6
|
+
module Builders
|
7
|
+
# Builds project environment skeleton.
|
8
|
+
class Environment
|
9
|
+
using Refinements::Structs
|
10
|
+
|
11
|
+
def self.call(...) = new(...).call
|
12
|
+
|
13
|
+
def initialize configuration, builder: Rubysmith::Builder
|
14
|
+
@configuration = configuration
|
15
|
+
@builder = builder
|
16
|
+
end
|
17
|
+
|
18
|
+
def call
|
19
|
+
builder.call(configuration.merge(template_path: "%project_name%/envrc.erb"))
|
20
|
+
.render
|
21
|
+
.rename(".envrc")
|
22
|
+
|
23
|
+
configuration
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
attr_reader :configuration, :builder
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "refinements/structs"
|
4
|
+
|
5
|
+
module Hanamismith
|
6
|
+
module Builders
|
7
|
+
# Builds project skeleton Guard support for a red, green, refactor loop.
|
8
|
+
class Guard < Rubysmith::Builders::Guard
|
9
|
+
using Refinements::Structs
|
10
|
+
|
11
|
+
def call
|
12
|
+
return configuration unless configuration.build_guard
|
13
|
+
|
14
|
+
super
|
15
|
+
builder.call(configuration.merge(template_path: "%project_name%/Guardfile.erb")).render
|
16
|
+
configuration
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "refinements/structs"
|
4
|
+
|
5
|
+
module Hanamismith
|
6
|
+
module Builders
|
7
|
+
module Puma
|
8
|
+
# Builds project skeleton Puma configuration.
|
9
|
+
class Configuration
|
10
|
+
using Refinements::Structs
|
11
|
+
|
12
|
+
def self.call(...) = new(...).call
|
13
|
+
|
14
|
+
def initialize configuration, builder: Rubysmith::Builder
|
15
|
+
@configuration = configuration
|
16
|
+
@builder = builder
|
17
|
+
end
|
18
|
+
|
19
|
+
def call
|
20
|
+
builder.call(configuration.merge(template_path: "%project_name%/config/puma.rb.erb"))
|
21
|
+
.render
|
22
|
+
|
23
|
+
configuration
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
attr_reader :configuration, :builder
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "refinements/structs"
|
4
|
+
|
5
|
+
module Hanamismith
|
6
|
+
module Builders
|
7
|
+
module Puma
|
8
|
+
# Builds project skeleton Puma Procfile for production and development environments.
|
9
|
+
class Procfile
|
10
|
+
using Refinements::Structs
|
11
|
+
|
12
|
+
def self.call(...) = new(...).call
|
13
|
+
|
14
|
+
def initialize configuration, builder: Rubysmith::Builder
|
15
|
+
@configuration = configuration
|
16
|
+
@builder = builder
|
17
|
+
end
|
18
|
+
|
19
|
+
def call
|
20
|
+
builder.call(configuration.merge(template_path: "%project_name%/Procfile.erb")).render
|
21
|
+
builder.call(configuration.merge(template_path: "%project_name%/Procfile.dev.erb")).render
|
22
|
+
configuration
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :configuration, :builder
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "refinements/structs"
|
4
|
+
|
5
|
+
module Hanamismith
|
6
|
+
module Builders
|
7
|
+
# Builds project skeleton Rack support.
|
8
|
+
class Rack
|
9
|
+
using Refinements::Structs
|
10
|
+
|
11
|
+
def self.call(...) = new(...).call
|
12
|
+
|
13
|
+
def initialize configuration, builder: Rubysmith::Builder
|
14
|
+
@configuration = configuration
|
15
|
+
@builder = builder
|
16
|
+
end
|
17
|
+
|
18
|
+
def call
|
19
|
+
builder.call(configuration.merge(template_path: "%project_name%/config.ru.erb")).render
|
20
|
+
configuration
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
attr_reader :configuration, :builder
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "refinements/structs"
|
4
|
+
|
5
|
+
module Hanamismith
|
6
|
+
module Builders
|
7
|
+
# Builds project skeleton Rake support.
|
8
|
+
class Rake < Rubysmith::Builders::Rake
|
9
|
+
using Refinements::Structs
|
10
|
+
|
11
|
+
def call
|
12
|
+
return configuration unless configuration.build_rake
|
13
|
+
|
14
|
+
super
|
15
|
+
builder.call(configuration.merge(template_path: "%project_name%/Rakefile.erb"))
|
16
|
+
.render
|
17
|
+
.insert_after(%r(bundler/setup), %(require "hanami/rake_tasks"))
|
18
|
+
|
19
|
+
configuration
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_reader :configuration, :builder
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "refinements/structs"
|
4
|
+
|
5
|
+
module Hanamismith
|
6
|
+
module Builders
|
7
|
+
module RSpec
|
8
|
+
# Builds project skeleton RSpec helper.
|
9
|
+
class Hanami
|
10
|
+
using Refinements::Structs
|
11
|
+
|
12
|
+
def self.call(...) = new(...).call
|
13
|
+
|
14
|
+
def initialize configuration, builder: Rubysmith::Builder
|
15
|
+
@configuration = configuration
|
16
|
+
@builder = builder
|
17
|
+
end
|
18
|
+
|
19
|
+
def call
|
20
|
+
return configuration unless configuration.build_rspec
|
21
|
+
|
22
|
+
path = "%project_name%/spec/hanami_helper.rb.erb"
|
23
|
+
builder.call(configuration.merge(template_path: path)).render
|
24
|
+
|
25
|
+
configuration
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
attr_reader :configuration, :builder
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "refinements/structs"
|
4
|
+
|
5
|
+
module Hanamismith
|
6
|
+
module Builders
|
7
|
+
module RSpec
|
8
|
+
# Builds project skeleton RSpec helper.
|
9
|
+
class Helper < Rubysmith::Builders::RSpec::Helper
|
10
|
+
using Refinements::Structs
|
11
|
+
|
12
|
+
def call
|
13
|
+
return configuration unless configuration.build_rspec
|
14
|
+
|
15
|
+
super
|
16
|
+
path = "%project_name%/spec/spec_helper.rb.erb"
|
17
|
+
builder.call(configuration.merge(template_path: path))
|
18
|
+
.replace(/require.+#{configuration.project_name}.+\n/, "")
|
19
|
+
configuration
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "refinements/structs"
|
4
|
+
|
5
|
+
module Hanamismith
|
6
|
+
module Builders
|
7
|
+
module Slices
|
8
|
+
# Builds project skeleton foundation.
|
9
|
+
class Main
|
10
|
+
using Refinements::Structs
|
11
|
+
|
12
|
+
def self.call(...) = new(...).call
|
13
|
+
|
14
|
+
def initialize configuration, builder: Rubysmith::Builder
|
15
|
+
@configuration = configuration
|
16
|
+
@builder = builder
|
17
|
+
end
|
18
|
+
|
19
|
+
def call
|
20
|
+
private_methods.grep(/\Aadd_/).sort.each { |method| __send__ method }
|
21
|
+
configuration
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_reader :configuration, :builder
|
27
|
+
|
28
|
+
def add_action
|
29
|
+
path = "%project_name%/slices/main/action.rb.erb"
|
30
|
+
builder.call(configuration.merge(template_path: path)).render
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_repository
|
34
|
+
path = "%project_name%/slices/main/repo.rb.erb"
|
35
|
+
builder.call(configuration.merge(template_path: path)).render
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_view
|
39
|
+
path = "%project_name%/slices/main/view.rb.erb"
|
40
|
+
builder.call(configuration.merge(template_path: path)).render
|
41
|
+
end
|
42
|
+
|
43
|
+
def add_layout_template
|
44
|
+
path = "%project_name%/slices/main/templates/layouts/app.html.erb.erb"
|
45
|
+
builder.call(configuration.merge(template_path: path))
|
46
|
+
.render
|
47
|
+
.replace("<!-- yield -->", "<%= yield %>")
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_show_template
|
51
|
+
path = "%project_name%/slices/main/templates/home/show.html.erb.erb"
|
52
|
+
builder.call(configuration.merge(template_path: path)).render
|
53
|
+
end
|
54
|
+
|
55
|
+
def add_show_view
|
56
|
+
path = "%project_name%/slices/main/views/home/show.rb.erb"
|
57
|
+
builder.call(configuration.merge(template_path: path)).render
|
58
|
+
end
|
59
|
+
|
60
|
+
def add_show_action
|
61
|
+
path = "%project_name%/slices/main/actions/home/show.rb.erb"
|
62
|
+
builder.call(configuration.merge(template_path: path)).render
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hanamismith
|
4
|
+
module CLI
|
5
|
+
module Actions
|
6
|
+
# Handles the build action.
|
7
|
+
class Build
|
8
|
+
include Hanamismith::Import[:logger]
|
9
|
+
|
10
|
+
# Order is important.
|
11
|
+
BUILDERS = [
|
12
|
+
Builders::Core,
|
13
|
+
Builders::Slices::Main,
|
14
|
+
Rubysmith::Builders::Version,
|
15
|
+
Builders::Documentation::Readme,
|
16
|
+
Rubysmith::Builders::Documentation::Citation,
|
17
|
+
Rubysmith::Builders::Documentation::License,
|
18
|
+
Rubysmith::Builders::Documentation::Version,
|
19
|
+
Rubysmith::Builders::Git::Setup,
|
20
|
+
Rubysmith::Builders::Git::Ignore,
|
21
|
+
Builders::Bundler,
|
22
|
+
Builders::Rake,
|
23
|
+
Builders::Binstub,
|
24
|
+
Builders::Console,
|
25
|
+
Rubysmith::Builders::CircleCI,
|
26
|
+
Rubysmith::Builders::Setup,
|
27
|
+
Rubysmith::Builders::GitHub,
|
28
|
+
Rubysmith::Builders::GitHubCI,
|
29
|
+
Builders::Guard,
|
30
|
+
Rubysmith::Builders::Reek,
|
31
|
+
Rubysmith::Builders::RSpec::Binstub,
|
32
|
+
Rubysmith::Builders::RSpec::Context,
|
33
|
+
Builders::RSpec::Helper,
|
34
|
+
Builders::RSpec::Hanami,
|
35
|
+
Builders::Rack,
|
36
|
+
Builders::Puma::Configuration,
|
37
|
+
Builders::Puma::Procfile,
|
38
|
+
Builders::Caliber,
|
39
|
+
Rubysmith::Extensions::Bundler,
|
40
|
+
Rubysmith::Extensions::Pragmater,
|
41
|
+
Rubysmith::Extensions::Tocer,
|
42
|
+
Rubysmith::Extensions::Rubocop,
|
43
|
+
Builders::Environment,
|
44
|
+
Builders::Git::Commit
|
45
|
+
].freeze
|
46
|
+
|
47
|
+
def initialize builders: BUILDERS, **dependencies
|
48
|
+
super(**dependencies)
|
49
|
+
@builders = builders
|
50
|
+
end
|
51
|
+
|
52
|
+
def call configuration
|
53
|
+
log_info "Building project skeleton: #{configuration.project_name}..."
|
54
|
+
builders.each { |builder| builder.call configuration }
|
55
|
+
log_info "Project skeleton complete!"
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
attr_reader :builders
|
61
|
+
|
62
|
+
def log_info(message) = logger.info { message }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hanamismith
|
4
|
+
module CLI
|
5
|
+
module Actions
|
6
|
+
# Handles the config action.
|
7
|
+
class Config
|
8
|
+
include Hanamismith::Import[:kernel, :logger]
|
9
|
+
|
10
|
+
def initialize client: Configuration::Loader::CLIENT, **dependencies
|
11
|
+
super(**dependencies)
|
12
|
+
|
13
|
+
@client = client
|
14
|
+
end
|
15
|
+
|
16
|
+
def call selection
|
17
|
+
case selection
|
18
|
+
when :edit then edit
|
19
|
+
when :view then view
|
20
|
+
else logger.error { "Invalid configuration selection: #{selection}." }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_reader :client
|
27
|
+
|
28
|
+
def edit = kernel.system("$EDITOR #{client.current}")
|
29
|
+
|
30
|
+
def view = kernel.system("cat #{client.current}")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/container"
|
4
|
+
|
5
|
+
module Hanamismith
|
6
|
+
module CLI
|
7
|
+
module Actions
|
8
|
+
# Provides a single container of application and action specific dependencies.
|
9
|
+
module Container
|
10
|
+
extend Dry::Container::Mixin
|
11
|
+
|
12
|
+
merge Hanamismith::Container
|
13
|
+
|
14
|
+
register(:build) { Build.new }
|
15
|
+
register(:config) { Config.new }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "core"
|
4
|
+
require "optparse"
|
5
|
+
|
6
|
+
module Hanamismith
|
7
|
+
module CLI
|
8
|
+
# Assembles and parses all Command Line Interface (CLI) options.
|
9
|
+
class Parser
|
10
|
+
include Import[:configuration]
|
11
|
+
|
12
|
+
CLIENT = OptionParser.new nil, 40, " "
|
13
|
+
|
14
|
+
# Order is important.
|
15
|
+
SECTIONS = [Parsers::Core, Rubysmith::CLI::Parsers::Build].freeze
|
16
|
+
|
17
|
+
def initialize sections: SECTIONS, client: CLIENT, **dependencies
|
18
|
+
super(**dependencies)
|
19
|
+
|
20
|
+
@sections = sections
|
21
|
+
@client = client
|
22
|
+
@configuration_duplicate = configuration.dup
|
23
|
+
end
|
24
|
+
|
25
|
+
def call arguments = Core::EMPTY_ARRAY
|
26
|
+
sections.each { |section| section.call configuration_duplicate, client: }
|
27
|
+
client.parse arguments
|
28
|
+
configuration_duplicate.freeze
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_s = client.to_s
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
attr_reader :sections, :client, :configuration_duplicate
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "core"
|
4
|
+
require "refinements/structs"
|
5
|
+
|
6
|
+
module Hanamismith
|
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],
|
18
|
+
client: Parser::CLIENT,
|
19
|
+
**dependencies
|
20
|
+
|
21
|
+
super(**dependencies)
|
22
|
+
@configuration = configuration
|
23
|
+
@client = client
|
24
|
+
end
|
25
|
+
|
26
|
+
def call arguments = ::Core::EMPTY_ARRAY
|
27
|
+
client.banner = specification.labeled_summary
|
28
|
+
client.separator "\nUSAGE:\n"
|
29
|
+
collate
|
30
|
+
client.parse arguments
|
31
|
+
configuration
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
attr_reader :configuration, :client
|
37
|
+
|
38
|
+
def collate = private_methods.sort.grep(/add_/).each { |method| __send__ method }
|
39
|
+
|
40
|
+
def add_build
|
41
|
+
client.on "-b", "--build NAME [options]", "Build new project." do |name|
|
42
|
+
configuration.merge! action_build: true, project_name: name
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_config
|
47
|
+
client.on "-c",
|
48
|
+
"--config ACTION",
|
49
|
+
%i[edit view],
|
50
|
+
"Manage gem configuration: edit or view." do |action|
|
51
|
+
configuration.merge! action_config: action
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def add_version
|
56
|
+
client.on "-v", "--version", "Show gem version." do
|
57
|
+
configuration.merge! action_version: true
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def add_help
|
62
|
+
client.on "-h", "--help", "Show this message." do
|
63
|
+
configuration.merge! action_help: true
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "core"
|
4
|
+
|
5
|
+
module Hanamismith
|
6
|
+
module CLI
|
7
|
+
# The main Command Line Interface (CLI) object.
|
8
|
+
class Shell
|
9
|
+
include Actions::Import[:config, :build, :specification, :logger]
|
10
|
+
|
11
|
+
def initialize parser: Parser.new, **dependencies
|
12
|
+
super(**dependencies)
|
13
|
+
@parser = parser
|
14
|
+
end
|
15
|
+
|
16
|
+
def call arguments = Core::EMPTY_ARRAY
|
17
|
+
perform parser.call(arguments)
|
18
|
+
rescue OptionParser::ParseError => error
|
19
|
+
logger.error { error.message }
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_reader :parser
|
25
|
+
|
26
|
+
def perform configuration
|
27
|
+
case configuration
|
28
|
+
in action_build: true then build.call configuration
|
29
|
+
in action_config: Symbol => action then config.call action
|
30
|
+
in action_version: true then logger.info { specification.labeled_version }
|
31
|
+
else logger.any { parser.to_s }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hanamismith
|
4
|
+
module Configuration
|
5
|
+
# Defines the content of the configuration for use throughout the gem.
|
6
|
+
Content = Struct.new(
|
7
|
+
:action_config,
|
8
|
+
:action_help,
|
9
|
+
:action_version,
|
10
|
+
keyword_init: true
|
11
|
+
) do
|
12
|
+
def initialize *arguments
|
13
|
+
super
|
14
|
+
freeze
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
File without changes
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "runcom"
|
4
|
+
|
5
|
+
module Hanamismith
|
6
|
+
module Configuration
|
7
|
+
# Represents the fully assembled Command Line Interface (CLI) configuration.
|
8
|
+
class Loader < Rubysmith::Configuration::Loader
|
9
|
+
DEFAULTS = Rubysmith::Configuration::Loader::DEFAULTS
|
10
|
+
CLIENT = Runcom::Config.new "hanamismith/configuration.yml", defaults: DEFAULTS
|
11
|
+
|
12
|
+
def self.with_overrides
|
13
|
+
new client: DEFAULTS,
|
14
|
+
enhancers: {template_root: Rubysmith::Configuration::Enhancers::TemplateRoot}
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(client: CLIENT, **) = super
|
18
|
+
|
19
|
+
def call
|
20
|
+
return super unless enhancers.key? :template_root
|
21
|
+
|
22
|
+
enhancers[:template_root].call(super, overrides: Pathname(__dir__).join("../templates"))
|
23
|
+
.freeze
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cogger"
|
4
|
+
require "dry/container"
|
5
|
+
require "spek"
|
6
|
+
|
7
|
+
module Hanamismith
|
8
|
+
# Provides a global gem container for injection into other objects.
|
9
|
+
module Container
|
10
|
+
extend Dry::Container::Mixin
|
11
|
+
|
12
|
+
register(:configuration) { Configuration::Loader.call }
|
13
|
+
register(:specification) { Spek::Loader.call "#{__dir__}/../../hanamismith.gemspec" }
|
14
|
+
register(:kernel) { Kernel }
|
15
|
+
register(:logger) { Cogger::Client.new }
|
16
|
+
end
|
17
|
+
end
|