gemsmith 19.8.0 → 20.0.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 +28 -52
- data/gemsmith.gemspec +12 -9
- data/lib/gemsmith/builders/cli.rb +6 -25
- data/lib/gemsmith/builders/rspec/helper.rb +3 -16
- data/lib/gemsmith/cli/actions/cli.rb +22 -0
- data/lib/gemsmith/cli/actions/edit.rb +9 -4
- data/lib/gemsmith/cli/actions/install.rb +17 -6
- data/lib/gemsmith/cli/actions/publish.rb +17 -6
- data/lib/gemsmith/cli/actions/view.rb +9 -4
- data/lib/gemsmith/cli/commands/build.rb +106 -0
- data/lib/gemsmith/cli/shell.rb +28 -32
- data/lib/gemsmith/container.rb +29 -5
- data/lib/gemsmith/templates/%project_name%/%project_name%.gemspec.erb +13 -7
- data/lib/gemsmith/templates/%project_name%/lib/%project_path%/cli/shell.rb.erb +18 -15
- data/lib/gemsmith/templates/%project_name%/lib/%project_path%/configuration/contract.rb.erb +9 -0
- data/lib/gemsmith/templates/%project_name%/lib/%project_path%/configuration/model.rb.erb +6 -0
- data/lib/gemsmith/templates/%project_name%/lib/%project_path%/container.rb.erb +14 -1
- data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/cli/shell_spec.rb.erb +8 -23
- data/lib/gemsmith/templates/%project_name%/spec/support/shared_contexts/application_dependencies.rb.erb +5 -7
- data/lib/gemsmith/tools/versioner.rb +8 -8
- data.tar.gz.sig +0 -0
- metadata +65 -40
- metadata.gz.sig +0 -0
- data/lib/gemsmith/cli/actions/build.rb +0 -68
- data/lib/gemsmith/cli/actions/config.rb +0 -33
- data/lib/gemsmith/cli/actions/container.rb +0 -23
- data/lib/gemsmith/cli/actions/import.rb +0 -11
- data/lib/gemsmith/cli/parser.rb +0 -37
- data/lib/gemsmith/cli/parsers/build.rb +0 -53
- data/lib/gemsmith/cli/parsers/core.rb +0 -93
- data/lib/gemsmith/configuration/loader.rb +0 -27
- data/lib/gemsmith/templates/%project_name%/lib/%project_path%/cli/actions/config.rb.erb +0 -31
- data/lib/gemsmith/templates/%project_name%/lib/%project_path%/cli/actions/container.rb.erb +0 -16
- data/lib/gemsmith/templates/%project_name%/lib/%project_path%/cli/actions/import.rb.erb +0 -9
- data/lib/gemsmith/templates/%project_name%/lib/%project_path%/cli/parser.rb.erb +0 -35
- data/lib/gemsmith/templates/%project_name%/lib/%project_path%/cli/parsers/core.rb.erb +0 -58
- data/lib/gemsmith/templates/%project_name%/lib/%project_path%/configuration/content.rb.erb +0 -18
- data/lib/gemsmith/templates/%project_name%/lib/%project_path%/configuration/loader.rb.erb +0 -33
- data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/cli/actions/config_spec.rb.erb +0 -24
- data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/cli/parser_spec.rb.erb +0 -25
- data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/cli/parsers/core_spec.rb.erb +0 -53
- data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/configuration/content_spec.rb.erb +0 -15
- data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/configuration/loader_spec.rb.erb +0 -29
- data/lib/gemsmith/templates/%project_name%/spec/support/shared_examples/a_parser.rb.erb +0 -7
@@ -1,68 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Gemsmith
|
4
|
-
module CLI
|
5
|
-
module Actions
|
6
|
-
# Handles the build action.
|
7
|
-
class Build
|
8
|
-
include Gemsmith::Import[:logger]
|
9
|
-
|
10
|
-
# Order is important.
|
11
|
-
# rubocop:todo Metrics/CollectionLiteralLength
|
12
|
-
BUILDERS = [
|
13
|
-
Rubysmith::Builders::Core,
|
14
|
-
Rubysmith::Builders::Version,
|
15
|
-
Builders::Specification,
|
16
|
-
Rubysmith::Builders::Documentation::Readme,
|
17
|
-
Builders::Documentation::Readme,
|
18
|
-
Rubysmith::Builders::Documentation::Citation,
|
19
|
-
Rubysmith::Builders::Documentation::License,
|
20
|
-
Rubysmith::Builders::Documentation::Version,
|
21
|
-
Rubysmith::Builders::Git::Setup,
|
22
|
-
Rubysmith::Builders::Git::Ignore,
|
23
|
-
Rubysmith::Builders::Git::Safe,
|
24
|
-
Builders::Git::Ignore,
|
25
|
-
Rubysmith::Builders::Bundler,
|
26
|
-
Builders::Bundler,
|
27
|
-
Builders::CLI,
|
28
|
-
Rubysmith::Builders::Rake,
|
29
|
-
Rubysmith::Builders::Console,
|
30
|
-
Rubysmith::Builders::CircleCI,
|
31
|
-
Builders::CircleCI,
|
32
|
-
Rubysmith::Builders::Setup,
|
33
|
-
Rubysmith::Builders::GitHub,
|
34
|
-
Rubysmith::Builders::Guard,
|
35
|
-
Rubysmith::Builders::Reek,
|
36
|
-
Rubysmith::Builders::RSpec::Binstub,
|
37
|
-
Rubysmith::Builders::RSpec::Context,
|
38
|
-
Rubysmith::Builders::RSpec::Helper,
|
39
|
-
Builders::RSpec::Helper,
|
40
|
-
Rubysmith::Builders::Caliber,
|
41
|
-
Rubysmith::Extensions::Bundler,
|
42
|
-
Rubysmith::Extensions::Pragmater,
|
43
|
-
Rubysmith::Extensions::Tocer,
|
44
|
-
Rubysmith::Extensions::Rubocop,
|
45
|
-
Builders::Git::Commit
|
46
|
-
].freeze
|
47
|
-
# rubocop:enable Metrics/CollectionLiteralLength
|
48
|
-
|
49
|
-
def initialize(builders: BUILDERS, **)
|
50
|
-
super(**)
|
51
|
-
@builders = builders
|
52
|
-
end
|
53
|
-
|
54
|
-
def call configuration
|
55
|
-
log_info "Building project skeleton: #{configuration.project_name}..."
|
56
|
-
builders.each { |builder| builder.call configuration }
|
57
|
-
log_info "Project skeleton complete!"
|
58
|
-
end
|
59
|
-
|
60
|
-
private
|
61
|
-
|
62
|
-
attr_reader :builders
|
63
|
-
|
64
|
-
def log_info(message) = logger.info { message }
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Gemsmith
|
4
|
-
module CLI
|
5
|
-
module Actions
|
6
|
-
# Handles the config action.
|
7
|
-
class Config
|
8
|
-
include Gemsmith::Import[:kernel, :logger]
|
9
|
-
|
10
|
-
def initialize(client: Configuration::Loader::CLIENT, **)
|
11
|
-
super(**)
|
12
|
-
@client = client
|
13
|
-
end
|
14
|
-
|
15
|
-
def call selection
|
16
|
-
case selection
|
17
|
-
when :edit then edit
|
18
|
-
when :view then view
|
19
|
-
else logger.error { "Invalid configuration selection: #{selection}." }
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
attr_reader :client
|
26
|
-
|
27
|
-
def edit = kernel.system("$EDITOR #{client.current}")
|
28
|
-
|
29
|
-
def view = kernel.system("cat #{client.current}")
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "dry/container"
|
4
|
-
|
5
|
-
module Gemsmith
|
6
|
-
module CLI
|
7
|
-
module Actions
|
8
|
-
# Provides a single container with application and action specific dependencies.
|
9
|
-
module Container
|
10
|
-
extend Dry::Container::Mixin
|
11
|
-
|
12
|
-
merge Gemsmith::Container
|
13
|
-
|
14
|
-
register(:config) { Config.new }
|
15
|
-
register(:build) { Build.new }
|
16
|
-
register(:install) { Install.new }
|
17
|
-
register(:publish) { Publish.new }
|
18
|
-
register(:edit) { Edit.new }
|
19
|
-
register(:view) { View.new }
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/lib/gemsmith/cli/parser.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "core"
|
4
|
-
require "optparse"
|
5
|
-
|
6
|
-
module Gemsmith
|
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, Parsers::Build].freeze
|
16
|
-
|
17
|
-
def initialize(sections: SECTIONS, client: CLIENT, **)
|
18
|
-
super(**)
|
19
|
-
@sections = sections
|
20
|
-
@client = client
|
21
|
-
@configuration_duplicate = configuration.dup
|
22
|
-
end
|
23
|
-
|
24
|
-
def call arguments = Core::EMPTY_ARRAY
|
25
|
-
sections.each { |section| section.call configuration_duplicate, client: }
|
26
|
-
client.parse arguments
|
27
|
-
configuration_duplicate.freeze
|
28
|
-
end
|
29
|
-
|
30
|
-
def to_s = client.to_s
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
attr_reader :sections, :client, :configuration_duplicate
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "core"
|
4
|
-
require "refinements/structs"
|
5
|
-
|
6
|
-
module Gemsmith
|
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
|
-
add_cli
|
25
|
-
client.parse arguments
|
26
|
-
configuration
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
attr_reader :configuration, :client
|
32
|
-
|
33
|
-
def add_cli
|
34
|
-
client.on(
|
35
|
-
"--[no-]cli",
|
36
|
-
"Add command line interface. #{default __method__}."
|
37
|
-
) do |value|
|
38
|
-
configuration.merge! build_refinements: value, build_zeitwerk: value if value
|
39
|
-
configuration.merge! build_cli: value
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def default option
|
44
|
-
option.to_s
|
45
|
-
.sub("add_", "build_")
|
46
|
-
.then { |attribute| configuration.public_send attribute }
|
47
|
-
.then { |boolean| boolean ? color[boolean, :green] : color[boolean, :red] }
|
48
|
-
.then { |colored_boolean| "Default: #{colored_boolean}" }
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,93 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "core"
|
4
|
-
require "pathname"
|
5
|
-
require "refinements/structs"
|
6
|
-
|
7
|
-
module Gemsmith
|
8
|
-
module CLI
|
9
|
-
module Parsers
|
10
|
-
# Handles parsing of Command Line Interface (CLI) core options.
|
11
|
-
class Core
|
12
|
-
include Import[:specification]
|
13
|
-
|
14
|
-
using Refinements::Structs
|
15
|
-
|
16
|
-
def self.call(...) = new(...).call
|
17
|
-
|
18
|
-
def initialize(configuration = Container[:configuration], client: Parser::CLIENT, **)
|
19
|
-
super(**)
|
20
|
-
@configuration = configuration
|
21
|
-
@client = client
|
22
|
-
end
|
23
|
-
|
24
|
-
def call arguments = ::Core::EMPTY_ARRAY
|
25
|
-
client.banner = specification.labeled_summary
|
26
|
-
client.separator "\nUSAGE:\n"
|
27
|
-
collate
|
28
|
-
client.parse arguments
|
29
|
-
configuration
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
attr_reader :configuration, :client
|
35
|
-
|
36
|
-
def collate = private_methods.sort.grep(/add_/).each { |method| __send__ method }
|
37
|
-
|
38
|
-
def add_config
|
39
|
-
client.on "-c",
|
40
|
-
"--config ACTION",
|
41
|
-
%i[edit view],
|
42
|
-
"Manage gem configuration: edit or view." do |action|
|
43
|
-
configuration.merge! action_config: action
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def add_build
|
48
|
-
client.on "-b", "--build NAME [options]", "Build new project." do |name|
|
49
|
-
configuration.merge! action_build: true, project_name: name
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def add_edit
|
54
|
-
client.on "--edit GEM", "Edit installed gem in default editor." do |gem_name|
|
55
|
-
configuration.merge! action_edit: gem_name
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def add_install
|
60
|
-
client.on "-i", "--install [NAME]", "Install gem for local development." do |name|
|
61
|
-
configuration.merge! action_install: true,
|
62
|
-
project_name: name || Pathname.pwd.basename.to_s
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def add_publish
|
67
|
-
client.on "-p", "--publish [NAME]", "Publish gem to remote gem server." do |name|
|
68
|
-
configuration.merge! action_publish: true,
|
69
|
-
project_name: name || Pathname.pwd.basename.to_s
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def add_view
|
74
|
-
client.on "--view GEM", "View installed gem in default browser." do |gem_name|
|
75
|
-
configuration.merge! action_view: gem_name
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def add_version
|
80
|
-
client.on "-v", "--version", "Show gem version." do
|
81
|
-
configuration.merge! action_version: true
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def add_help
|
86
|
-
client.on "-h", "--help", "Show this message." do
|
87
|
-
configuration.merge! action_help: true
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "runcom"
|
4
|
-
|
5
|
-
module Gemsmith
|
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 "gemsmith/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
|
@@ -1,31 +0,0 @@
|
|
1
|
-
<% namespace do %>
|
2
|
-
module CLI
|
3
|
-
module Actions
|
4
|
-
# Handles the config action.
|
5
|
-
class Config
|
6
|
-
include <%= configuration.project_class %>::Import[:kernel, :logger]
|
7
|
-
|
8
|
-
def initialize(client: Configuration::Loader::CLIENT, **)
|
9
|
-
super(**)
|
10
|
-
@client = client
|
11
|
-
end
|
12
|
-
|
13
|
-
def call selection
|
14
|
-
case selection
|
15
|
-
when :edit then edit
|
16
|
-
when :view then view
|
17
|
-
else logger.error { "Invalid configuration selection: #{selection}." }
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
attr_reader :client
|
24
|
-
|
25
|
-
def edit = kernel.system("$EDITOR #{client.current}")
|
26
|
-
|
27
|
-
def view = kernel.system("cat #{client.current}")
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
<% end %>
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require "dry/container"
|
2
|
-
|
3
|
-
<% namespace do %>
|
4
|
-
module CLI
|
5
|
-
module Actions
|
6
|
-
# Provides a single container of application and action specific dependencies.
|
7
|
-
module Container
|
8
|
-
extend Dry::Container::Mixin
|
9
|
-
|
10
|
-
merge <%= configuration.project_namespaced_class %>::Container
|
11
|
-
|
12
|
-
register(:config) { Config.new }
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
<% end %>
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require "core"
|
2
|
-
require "optparse"
|
3
|
-
|
4
|
-
<% namespace do %>
|
5
|
-
module CLI
|
6
|
-
# Assembles and parses all Command Line Interface (CLI) options.
|
7
|
-
class Parser
|
8
|
-
include Import[:configuration]
|
9
|
-
|
10
|
-
CLIENT = OptionParser.new nil, 40, " "
|
11
|
-
|
12
|
-
# Order is important.
|
13
|
-
SECTIONS = [Parsers::Core].freeze
|
14
|
-
|
15
|
-
def initialize(sections: SECTIONS, client: CLIENT, **)
|
16
|
-
super(**)
|
17
|
-
@sections = sections
|
18
|
-
@client = client
|
19
|
-
@configuration_duplicate = configuration.dup
|
20
|
-
end
|
21
|
-
|
22
|
-
def call arguments = Core::EMPTY_ARRAY
|
23
|
-
sections.each { |section| section.call configuration_duplicate, client: }
|
24
|
-
client.parse arguments
|
25
|
-
configuration_duplicate.freeze
|
26
|
-
end
|
27
|
-
|
28
|
-
def to_s = client.to_s
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
attr_reader :sections, :client, :configuration_duplicate
|
33
|
-
end
|
34
|
-
end
|
35
|
-
<% end %>
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require "core"
|
2
|
-
require "refinements/structs"
|
3
|
-
|
4
|
-
<% namespace do %>
|
5
|
-
module CLI
|
6
|
-
module Parsers
|
7
|
-
# Handles parsing of Command Line Interface (CLI) core options.
|
8
|
-
class Core
|
9
|
-
include Import[:specification]
|
10
|
-
|
11
|
-
using Refinements::Structs
|
12
|
-
|
13
|
-
def self.call(...) = new(...).call
|
14
|
-
|
15
|
-
def initialize(configuration = Container[:configuration], client: Parser::CLIENT, **)
|
16
|
-
super(**)
|
17
|
-
@configuration = configuration
|
18
|
-
@client = client
|
19
|
-
end
|
20
|
-
|
21
|
-
def call arguments = ::Core::EMPTY_ARRAY
|
22
|
-
client.banner = specification.labeled_summary
|
23
|
-
client.separator "\nUSAGE:\n"
|
24
|
-
collate
|
25
|
-
client.parse arguments
|
26
|
-
configuration
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
attr_reader :configuration, :client
|
32
|
-
|
33
|
-
def collate = private_methods.sort.grep(/add_/).each { |method| __send__ method }
|
34
|
-
|
35
|
-
def add_config
|
36
|
-
client.on "-c",
|
37
|
-
"--config ACTION",
|
38
|
-
%i[edit view],
|
39
|
-
"Manage gem configuration: edit or view." do |action|
|
40
|
-
configuration.merge! action_config: action
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def add_version
|
45
|
-
client.on "-v", "--version", "Show gem version." do
|
46
|
-
configuration.merge! action_version: true
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def add_help
|
51
|
-
client.on "-h", "--help", "Show this message." do
|
52
|
-
configuration.merge! action_help: true
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
<% end %>
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
<% namespace do %>
|
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 %>
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require "pathname"
|
2
|
-
require "refinements/hashes"
|
3
|
-
require "refinements/structs"
|
4
|
-
require "runcom"
|
5
|
-
require "yaml"
|
6
|
-
|
7
|
-
<% namespace do %>
|
8
|
-
module Configuration
|
9
|
-
# Represents the fully assembled Command Line Interface (CLI) configuration.
|
10
|
-
class Loader
|
11
|
-
using Refinements::Hashes
|
12
|
-
using Refinements::Structs
|
13
|
-
|
14
|
-
DEFAULTS = (YAML.load_file(Pathname(__dir__).join("defaults.yml")) || {}).freeze
|
15
|
-
CLIENT = Runcom::Config.new "<%= configuration.project_name %>/configuration.yml", defaults: DEFAULTS
|
16
|
-
|
17
|
-
def self.call = new.call
|
18
|
-
|
19
|
-
def self.with_defaults = new client: DEFAULTS
|
20
|
-
|
21
|
-
def initialize content: Content.new, client: CLIENT
|
22
|
-
@content = content
|
23
|
-
@client = client
|
24
|
-
end
|
25
|
-
|
26
|
-
def call = content.merge(**client.to_h.flatten_keys).freeze
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
attr_reader :content, :client
|
31
|
-
end
|
32
|
-
end
|
33
|
-
<% end %>
|
data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/cli/actions/config_spec.rb.erb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe <%= configuration.project_namespaced_class %>::CLI::Actions::Config do
|
4
|
-
subject(:action) { described_class.new }
|
5
|
-
|
6
|
-
include_context "with application dependencies"
|
7
|
-
|
8
|
-
describe "#call" do
|
9
|
-
it "edits configuration" do
|
10
|
-
action.call :edit
|
11
|
-
expect(kernel).to have_received(:system).with(include("EDITOR"))
|
12
|
-
end
|
13
|
-
|
14
|
-
it "views configuration" do
|
15
|
-
action.call :view
|
16
|
-
expect(kernel).to have_received(:system).with(include("cat"))
|
17
|
-
end
|
18
|
-
|
19
|
-
it "logs invalid configuration" do
|
20
|
-
action.call :bogus
|
21
|
-
expect(logger.reread).to match(/🛑.+Invalid configuration selection: bogus./)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe <%= configuration.project_namespaced_class %>::CLI::Parser do
|
4
|
-
subject(:parser) { described_class.new }
|
5
|
-
|
6
|
-
include_context "with application dependencies"
|
7
|
-
|
8
|
-
describe "#call" do
|
9
|
-
it "answers hash with valid option" do
|
10
|
-
expect(parser.call(%w[--help])).to have_attributes(action_help: true)
|
11
|
-
end
|
12
|
-
|
13
|
-
it "fails with invalid option" do
|
14
|
-
expectation = proc { parser.call %w[--bogus] }
|
15
|
-
expect(&expectation).to raise_error(OptionParser::InvalidOption, /--bogus/)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe "#to_s" do
|
20
|
-
it "answers usage" do
|
21
|
-
parser.call
|
22
|
-
expect(parser.to_s).to match(/.+USAGE.+/m)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/cli/parsers/core_spec.rb.erb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe <%= configuration.project_namespaced_class %>::CLI::Parsers::Core do
|
4
|
-
subject(:parser) { described_class.new configuration.dup }
|
5
|
-
|
6
|
-
include_context "with application dependencies"
|
7
|
-
|
8
|
-
it_behaves_like "a parser"
|
9
|
-
|
10
|
-
describe "#call" do
|
11
|
-
it "answers config edit (short)" do
|
12
|
-
expect(parser.call(%w[-c edit])).to have_attributes(action_config: :edit)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "answers config edit (long)" do
|
16
|
-
expect(parser.call(%w[--config edit])).to have_attributes(action_config: :edit)
|
17
|
-
end
|
18
|
-
|
19
|
-
it "answers config view (short)" do
|
20
|
-
expect(parser.call(%w[-c view])).to have_attributes(action_config: :view)
|
21
|
-
end
|
22
|
-
|
23
|
-
it "answers config view (long)" do
|
24
|
-
expect(parser.call(%w[--config view])).to have_attributes(action_config: :view)
|
25
|
-
end
|
26
|
-
|
27
|
-
it "fails with missing config action" do
|
28
|
-
expectation = proc { parser.call %w[--config] }
|
29
|
-
expect(&expectation).to raise_error(OptionParser::MissingArgument, /--config/)
|
30
|
-
end
|
31
|
-
|
32
|
-
it "fails with invalid config action" do
|
33
|
-
expectation = proc { parser.call %w[--config bogus] }
|
34
|
-
expect(&expectation).to raise_error(OptionParser::InvalidArgument, /bogus/)
|
35
|
-
end
|
36
|
-
|
37
|
-
it "answers version (short)" do
|
38
|
-
expect(parser.call(%w[-v])).to have_attributes(action_version: true)
|
39
|
-
end
|
40
|
-
|
41
|
-
it "answers version (long)" do
|
42
|
-
expect(parser.call(%w[--version])).to have_attributes(action_version: true)
|
43
|
-
end
|
44
|
-
|
45
|
-
it "enables help (short)" do
|
46
|
-
expect(parser.call(%w[-h])).to have_attributes(action_help: true)
|
47
|
-
end
|
48
|
-
|
49
|
-
it "enables help (long)" do
|
50
|
-
expect(parser.call(%w[--help])).to have_attributes(action_help: true)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
data/lib/gemsmith/templates/%project_name%/spec/lib/%project_path%/configuration/content_spec.rb.erb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe <%= configuration.project_namespaced_class %>::Configuration::Content do
|
4
|
-
subject(:content) { described_class.new }
|
5
|
-
|
6
|
-
describe "#initialize" do
|
7
|
-
it "answers default hash" do
|
8
|
-
expect(content).to have_attributes(
|
9
|
-
action_config: nil,
|
10
|
-
action_help: nil,
|
11
|
-
action_version: nil
|
12
|
-
)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|