hanami-cli 0.3.0 → 2.0.0.alpha3
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
- data/.github/workflows/ci.yml +42 -0
- data/.gitignore +4 -2
- data/.rspec +1 -0
- data/.rubocop.yml +25 -1
- data/CHANGELOG.md +30 -1
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +13 -6
- data/LICENSE.txt +21 -0
- data/README.md +12 -605
- data/Rakefile +9 -12
- data/bin/console +1 -0
- data/exe/hanami +10 -0
- data/hanami-cli.gemspec +25 -18
- data/lib/hanami/cli/bundler.rb +73 -0
- data/lib/hanami/cli/command.rb +16 -355
- data/lib/hanami/cli/command_line.rb +17 -0
- data/lib/hanami/cli/commands/application.rb +63 -0
- data/lib/hanami/cli/commands/db/utils/database.rb +122 -0
- data/lib/hanami/cli/commands/db/utils/database_config.rb +48 -0
- data/lib/hanami/cli/commands/db/utils/mysql.rb +27 -0
- data/lib/hanami/cli/commands/db/utils/postgres.rb +49 -0
- data/lib/hanami/cli/commands/db/utils/sqlite.rb +37 -0
- data/lib/hanami/cli/commands/gem/new.rb +77 -0
- data/lib/hanami/cli/commands/gem/version.rb +18 -0
- data/lib/hanami/cli/commands/gem.rb +21 -0
- data/lib/hanami/cli/commands/monolith/console.rb +50 -0
- data/lib/hanami/cli/commands/monolith/db/create.rb +25 -0
- data/lib/hanami/cli/commands/monolith/db/create_migration.rb +29 -0
- data/lib/hanami/cli/commands/monolith/db/drop.rb +25 -0
- data/lib/hanami/cli/commands/monolith/db/migrate.rb +40 -0
- data/lib/hanami/cli/commands/monolith/db/reset.rb +26 -0
- data/lib/hanami/cli/commands/monolith/db/rollback.rb +55 -0
- data/lib/hanami/cli/commands/monolith/db/sample_data.rb +40 -0
- data/lib/hanami/cli/commands/monolith/db/seed.rb +40 -0
- data/lib/hanami/cli/commands/monolith/db/setup.rb +24 -0
- data/lib/hanami/cli/commands/monolith/db/structure/dump.rb +25 -0
- data/lib/hanami/cli/commands/monolith/db/version.rb +26 -0
- data/lib/hanami/cli/commands/monolith/generate/action.rb +62 -0
- data/lib/hanami/cli/commands/monolith/generate/slice.rb +62 -0
- data/lib/hanami/cli/commands/monolith/generate.rb +14 -0
- data/lib/hanami/cli/commands/monolith/install.rb +16 -0
- data/lib/hanami/cli/commands/monolith/version.rb +18 -0
- data/lib/hanami/cli/commands/monolith.rb +55 -0
- data/lib/hanami/cli/commands.rb +26 -0
- data/lib/hanami/cli/error.rb +8 -0
- data/lib/hanami/cli/generators/context.rb +38 -0
- data/lib/hanami/cli/generators/gem/application/monolith/action.erb +21 -0
- data/lib/hanami/cli/generators/gem/application/monolith/application.erb +8 -0
- data/lib/hanami/cli/generators/gem/application/monolith/config_ru.erb +5 -0
- data/lib/hanami/cli/generators/gem/application/monolith/entities.erb +9 -0
- data/lib/hanami/cli/generators/gem/application/monolith/env.erb +0 -0
- data/lib/hanami/cli/generators/gem/application/monolith/functions.erb +13 -0
- data/lib/hanami/cli/generators/gem/application/monolith/gemfile.erb +19 -0
- data/lib/hanami/cli/generators/gem/application/monolith/keep.erb +0 -0
- data/lib/hanami/cli/generators/gem/application/monolith/operation.erb +18 -0
- data/lib/hanami/cli/generators/gem/application/monolith/rakefile.erb +3 -0
- data/lib/hanami/cli/generators/gem/application/monolith/readme.erb +1 -0
- data/lib/hanami/cli/generators/gem/application/monolith/repository.erb +13 -0
- data/lib/hanami/cli/generators/gem/application/monolith/routes.erb +4 -0
- data/lib/hanami/cli/generators/gem/application/monolith/settings.erb +6 -0
- data/lib/hanami/cli/generators/gem/application/monolith/types.erb +10 -0
- data/lib/hanami/cli/generators/gem/application/monolith/validation_contract.erb +14 -0
- data/lib/hanami/cli/generators/gem/application/monolith/view_context.erb +15 -0
- data/lib/hanami/cli/generators/gem/application/monolith.rb +83 -0
- data/lib/hanami/cli/generators/gem/application.rb +21 -0
- data/lib/hanami/cli/generators/monolith/action/action.erb +13 -0
- data/lib/hanami/cli/generators/monolith/action/template.erb +0 -0
- data/lib/hanami/cli/generators/monolith/action/template.html.erb +2 -0
- data/lib/hanami/cli/generators/monolith/action/view.erb +13 -0
- data/lib/hanami/cli/generators/monolith/action.rb +123 -0
- data/lib/hanami/cli/generators/monolith/action_context.rb +76 -0
- data/lib/hanami/cli/generators/monolith/slice/action.erb +9 -0
- data/lib/hanami/cli/generators/monolith/slice/entities.erb +9 -0
- data/lib/hanami/cli/generators/monolith/slice/keep.erb +0 -0
- data/lib/hanami/cli/generators/monolith/slice/repository.erb +10 -0
- data/lib/hanami/cli/generators/monolith/slice/routes.erb +2 -0
- data/lib/hanami/cli/generators/monolith/slice/view.erb +9 -0
- data/lib/hanami/cli/generators/monolith/slice.rb +56 -0
- data/lib/hanami/cli/generators/monolith/slice_context.rb +33 -0
- data/lib/hanami/cli/repl/core.rb +55 -0
- data/lib/hanami/cli/repl/irb.rb +41 -0
- data/lib/hanami/cli/repl/pry.rb +29 -0
- data/lib/hanami/cli/system_call.rb +51 -0
- data/lib/hanami/cli/url.rb +34 -0
- data/lib/hanami/cli/version.rb +4 -3
- data/lib/hanami/cli.rb +10 -121
- data/lib/hanami/console/context.rb +39 -0
- data/lib/hanami/console/plugins/slice_readers.rb +42 -0
- data/lib/hanami/rake_tasks.rb +52 -0
- metadata +138 -42
- data/.circleci/config.yml +0 -141
- data/.travis.yml +0 -26
- data/lib/hanami/cli/banner.rb +0 -127
- data/lib/hanami/cli/command_registry.rb +0 -213
- data/lib/hanami/cli/errors.rb +0 -44
- data/lib/hanami/cli/option.rb +0 -132
- data/lib/hanami/cli/parser.rb +0 -142
- data/lib/hanami/cli/program_name.rb +0 -19
- data/lib/hanami/cli/registry.rb +0 -328
- data/lib/hanami/cli/usage.rb +0 -89
- data/script/ci +0 -61
data/.circleci/config.yml
DELETED
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
# Ruby CircleCI 2.0 configuration file
|
|
2
|
-
#
|
|
3
|
-
# Check https://circleci.com/docs/2.0/language-ruby/ for more details
|
|
4
|
-
#
|
|
5
|
-
version: 2
|
|
6
|
-
jobs:
|
|
7
|
-
"ruby-2.3":
|
|
8
|
-
docker:
|
|
9
|
-
- image: hanami/ruby-2.3
|
|
10
|
-
working_directory: ~/hanami-utils
|
|
11
|
-
steps:
|
|
12
|
-
- checkout
|
|
13
|
-
# Download and cache dependencies
|
|
14
|
-
- restore_cache:
|
|
15
|
-
keys:
|
|
16
|
-
- v1-dependencies-{{ checksum "Gemfile.lock" }}
|
|
17
|
-
# fallback to using the latest cache if no exact match is found
|
|
18
|
-
- v1-dependencies-
|
|
19
|
-
- run:
|
|
20
|
-
name: install dependencies
|
|
21
|
-
command: |
|
|
22
|
-
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
|
23
|
-
- save_cache:
|
|
24
|
-
paths:
|
|
25
|
-
- ./vendor/bundle
|
|
26
|
-
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
|
|
27
|
-
# run tests!
|
|
28
|
-
- run:
|
|
29
|
-
name: run tests
|
|
30
|
-
command: |
|
|
31
|
-
./script/ci
|
|
32
|
-
"ruby-2.4":
|
|
33
|
-
docker:
|
|
34
|
-
- image: hanami/ruby-2.4
|
|
35
|
-
working_directory: ~/hanami-utils
|
|
36
|
-
steps:
|
|
37
|
-
- checkout
|
|
38
|
-
# Download and cache dependencies
|
|
39
|
-
- restore_cache:
|
|
40
|
-
keys:
|
|
41
|
-
- v1-dependencies-{{ checksum "Gemfile.lock" }}
|
|
42
|
-
# fallback to using the latest cache if no exact match is found
|
|
43
|
-
- v1-dependencies-
|
|
44
|
-
- run:
|
|
45
|
-
name: install dependencies
|
|
46
|
-
command: |
|
|
47
|
-
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
|
48
|
-
- save_cache:
|
|
49
|
-
paths:
|
|
50
|
-
- ./vendor/bundle
|
|
51
|
-
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
|
|
52
|
-
# run tests!
|
|
53
|
-
- run:
|
|
54
|
-
name: run tests
|
|
55
|
-
command: |
|
|
56
|
-
./script/ci
|
|
57
|
-
"ruby-2.5":
|
|
58
|
-
docker:
|
|
59
|
-
- image: hanami/ruby-2.5
|
|
60
|
-
working_directory: ~/hanami-utils
|
|
61
|
-
steps:
|
|
62
|
-
- checkout
|
|
63
|
-
# Download and cache dependencies
|
|
64
|
-
- restore_cache:
|
|
65
|
-
keys:
|
|
66
|
-
- v1-dependencies-{{ checksum "Gemfile.lock" }}
|
|
67
|
-
# fallback to using the latest cache if no exact match is found
|
|
68
|
-
- v1-dependencies-
|
|
69
|
-
- run:
|
|
70
|
-
name: install dependencies
|
|
71
|
-
command: |
|
|
72
|
-
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
|
73
|
-
- save_cache:
|
|
74
|
-
paths:
|
|
75
|
-
- ./vendor/bundle
|
|
76
|
-
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
|
|
77
|
-
# run tests!
|
|
78
|
-
- run:
|
|
79
|
-
name: run tests
|
|
80
|
-
command: |
|
|
81
|
-
./script/ci
|
|
82
|
-
"jruby-9.1":
|
|
83
|
-
docker:
|
|
84
|
-
- image: hanami/jruby-9.1
|
|
85
|
-
working_directory: ~/hanami-utils
|
|
86
|
-
steps:
|
|
87
|
-
- checkout
|
|
88
|
-
# Download and cache dependencies
|
|
89
|
-
- restore_cache:
|
|
90
|
-
keys:
|
|
91
|
-
- v1-dependencies-{{ checksum "Gemfile.lock" }}
|
|
92
|
-
# fallback to using the latest cache if no exact match is found
|
|
93
|
-
- v1-dependencies-
|
|
94
|
-
- run:
|
|
95
|
-
name: install dependencies
|
|
96
|
-
command: |
|
|
97
|
-
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
|
98
|
-
- save_cache:
|
|
99
|
-
paths:
|
|
100
|
-
- ./vendor/bundle
|
|
101
|
-
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
|
|
102
|
-
# run tests!
|
|
103
|
-
- run:
|
|
104
|
-
name: run tests
|
|
105
|
-
command: |
|
|
106
|
-
./script/ci
|
|
107
|
-
"jruby-9.2":
|
|
108
|
-
docker:
|
|
109
|
-
- image: hanami/jruby-9.2
|
|
110
|
-
working_directory: ~/hanami-utils
|
|
111
|
-
steps:
|
|
112
|
-
- checkout
|
|
113
|
-
# Download and cache dependencies
|
|
114
|
-
- restore_cache:
|
|
115
|
-
keys:
|
|
116
|
-
- v1-dependencies-{{ checksum "Gemfile.lock" }}
|
|
117
|
-
# fallback to using the latest cache if no exact match is found
|
|
118
|
-
- v1-dependencies-
|
|
119
|
-
- run:
|
|
120
|
-
name: install dependencies
|
|
121
|
-
command: |
|
|
122
|
-
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
|
123
|
-
- save_cache:
|
|
124
|
-
paths:
|
|
125
|
-
- ./vendor/bundle
|
|
126
|
-
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
|
|
127
|
-
# run tests!
|
|
128
|
-
- run:
|
|
129
|
-
name: run tests
|
|
130
|
-
command: |
|
|
131
|
-
./script/ci
|
|
132
|
-
|
|
133
|
-
workflows:
|
|
134
|
-
version: 2
|
|
135
|
-
build:
|
|
136
|
-
jobs:
|
|
137
|
-
- "ruby-2.3"
|
|
138
|
-
- "ruby-2.4"
|
|
139
|
-
- "ruby-2.5"
|
|
140
|
-
- "jruby-9.1"
|
|
141
|
-
- "jruby-9.2"
|
data/.travis.yml
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
language: ruby
|
|
2
|
-
sudo: false
|
|
3
|
-
cache: bundler
|
|
4
|
-
before_script:
|
|
5
|
-
- gem update --system
|
|
6
|
-
script: ./script/ci
|
|
7
|
-
rvm:
|
|
8
|
-
- 2.4.4
|
|
9
|
-
- 2.3.7
|
|
10
|
-
- 2.5.1
|
|
11
|
-
- jruby-9.1.9.0
|
|
12
|
-
- ruby-head
|
|
13
|
-
- jruby-head
|
|
14
|
-
|
|
15
|
-
matrix:
|
|
16
|
-
allow_failures:
|
|
17
|
-
- rvm: ruby-head
|
|
18
|
-
- rvm: jruby-head
|
|
19
|
-
|
|
20
|
-
notifications:
|
|
21
|
-
webhooks:
|
|
22
|
-
urls:
|
|
23
|
-
- https://webhooks.gitter.im/e/fde2367248d53de4fe70
|
|
24
|
-
on_success: change # options: [always|never|change] default: always
|
|
25
|
-
on_failure: always # options: [always|never|change] default: always
|
|
26
|
-
on_start: never # options: [always|never|change] default: always
|
data/lib/hanami/cli/banner.rb
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
require "hanami/cli/program_name"
|
|
2
|
-
|
|
3
|
-
module Hanami
|
|
4
|
-
class CLI
|
|
5
|
-
# Command banner
|
|
6
|
-
#
|
|
7
|
-
# @since 0.1.0
|
|
8
|
-
# @api private
|
|
9
|
-
module Banner
|
|
10
|
-
# Prints command banner
|
|
11
|
-
#
|
|
12
|
-
# @param command [Hanami::CLI::Command] the command
|
|
13
|
-
# @param out [IO] standard output
|
|
14
|
-
#
|
|
15
|
-
# @since 0.1.0
|
|
16
|
-
# @api private
|
|
17
|
-
def self.call(command, out)
|
|
18
|
-
output = [
|
|
19
|
-
command_name(command),
|
|
20
|
-
command_name_and_arguments(command),
|
|
21
|
-
command_description(command),
|
|
22
|
-
command_arguments(command),
|
|
23
|
-
command_options(command),
|
|
24
|
-
command_examples(command)
|
|
25
|
-
].compact.join("\n")
|
|
26
|
-
|
|
27
|
-
out.puts output
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# @since 0.1.0
|
|
31
|
-
# @api private
|
|
32
|
-
def self.command_name(command)
|
|
33
|
-
"Command:\n #{full_command_name(command)}"
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# @since 0.1.0
|
|
37
|
-
# @api private
|
|
38
|
-
def self.command_name_and_arguments(command)
|
|
39
|
-
"\nUsage:\n #{full_command_name(command)}#{arguments(command)}"
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
# @since 0.1.0
|
|
43
|
-
# @api private
|
|
44
|
-
def self.command_examples(command)
|
|
45
|
-
return if command.examples.empty?
|
|
46
|
-
|
|
47
|
-
"\nExamples:\n#{command.examples.map { |example| " #{full_command_name(command)} #{example}" }.join("\n")}"
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# @since 0.1.0
|
|
51
|
-
# @api private
|
|
52
|
-
def self.command_description(command)
|
|
53
|
-
return if command.description.nil?
|
|
54
|
-
|
|
55
|
-
"\nDescription:\n #{command.description}"
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# @since 0.1.0
|
|
59
|
-
# @api private
|
|
60
|
-
def self.command_arguments(command)
|
|
61
|
-
return if command.arguments.empty?
|
|
62
|
-
|
|
63
|
-
"\nArguments:\n#{extended_command_arguments(command)}"
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# @since 0.1.0
|
|
67
|
-
# @api private
|
|
68
|
-
def self.command_options(command)
|
|
69
|
-
"\nOptions:\n#{extended_command_options(command)}"
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
# @since 0.1.0
|
|
73
|
-
# @api private
|
|
74
|
-
def self.full_command_name(command)
|
|
75
|
-
ProgramName.call(command.command_name)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# @since 0.1.0
|
|
79
|
-
# @api private
|
|
80
|
-
def self.arguments(command) # rubocop:disable Metrics/AbcSize
|
|
81
|
-
required_arguments = command.required_arguments
|
|
82
|
-
optional_arguments = command.optional_arguments
|
|
83
|
-
|
|
84
|
-
required = required_arguments.map { |arg| arg.name.upcase }.join(' ') if required_arguments.any?
|
|
85
|
-
optional = optional_arguments.map { |arg| "[#{arg.name.upcase}]" }.join(' ') if optional_arguments.any?
|
|
86
|
-
result = [required, optional].compact
|
|
87
|
-
|
|
88
|
-
" #{result.join(' ')}" unless result.empty?
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
# @since 0.1.0
|
|
92
|
-
# @api private
|
|
93
|
-
def self.extended_command_arguments(command)
|
|
94
|
-
command.arguments.map do |argument|
|
|
95
|
-
" #{argument.name.to_s.upcase.ljust(20)}\t# #{'REQUIRED ' if argument.required?}#{argument.desc}"
|
|
96
|
-
end.join("\n")
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
# @since 0.1.0
|
|
100
|
-
# @api private
|
|
101
|
-
#
|
|
102
|
-
# rubocop:disable Metrics/AbcSize
|
|
103
|
-
# rubocop:disable Metrics/MethodLength
|
|
104
|
-
def self.extended_command_options(command)
|
|
105
|
-
result = command.options.map do |option|
|
|
106
|
-
name = Utils::String.dasherize(option.name)
|
|
107
|
-
name = if option.boolean?
|
|
108
|
-
"[no-]#{name}"
|
|
109
|
-
else
|
|
110
|
-
"#{name}=VALUE"
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
name = "#{name}, #{option.aliases.map { |a| a.start_with?('--') ? "#{a}=VALUE" : "#{a} VALUE" }.join(', ')}" unless option.aliases.empty?
|
|
114
|
-
name = " --#{name.ljust(30)}"
|
|
115
|
-
name = "#{name}\t# #{option.desc}"
|
|
116
|
-
name = "#{name}, default: #{option.default.inspect}" unless option.default.nil?
|
|
117
|
-
name
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
result << " --#{'help, -h'.ljust(30)}\t# Print this help"
|
|
121
|
-
result.join("\n")
|
|
122
|
-
end
|
|
123
|
-
# rubocop:enable Metrics/MethodLength
|
|
124
|
-
# rubocop:enable Metrics/AbcSize
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
end
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
require "concurrent/hash"
|
|
2
|
-
require 'hanami/utils/callbacks'
|
|
3
|
-
|
|
4
|
-
module Hanami
|
|
5
|
-
class CLI
|
|
6
|
-
# Command registry
|
|
7
|
-
#
|
|
8
|
-
# @since 0.1.0
|
|
9
|
-
# @api private
|
|
10
|
-
class CommandRegistry
|
|
11
|
-
# @since 0.1.0
|
|
12
|
-
# @api private
|
|
13
|
-
def initialize
|
|
14
|
-
@root = Node.new
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# @since 0.1.0
|
|
18
|
-
# @api private
|
|
19
|
-
def set(name, command, aliases, **options)
|
|
20
|
-
node = @root
|
|
21
|
-
command = command_for(name, command, **options)
|
|
22
|
-
name.split(/[[:space:]]/).each do |token|
|
|
23
|
-
node = node.put(node, token)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
node.aliases!(aliases)
|
|
27
|
-
node.leaf!(command) unless command.nil?
|
|
28
|
-
|
|
29
|
-
nil
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# @since 0.1.0
|
|
33
|
-
# @api private
|
|
34
|
-
#
|
|
35
|
-
# rubocop:disable Metrics/AbcSize
|
|
36
|
-
# rubocop:disable Metrics/MethodLength
|
|
37
|
-
def get(arguments)
|
|
38
|
-
node = @root
|
|
39
|
-
args = []
|
|
40
|
-
names = []
|
|
41
|
-
result = LookupResult.new(node, args, names, node.leaf?)
|
|
42
|
-
|
|
43
|
-
arguments.each_with_index do |token, i|
|
|
44
|
-
tmp = node.lookup(token)
|
|
45
|
-
|
|
46
|
-
if tmp.nil?
|
|
47
|
-
result = LookupResult.new(node, args, names, false)
|
|
48
|
-
break
|
|
49
|
-
elsif tmp.leaf?
|
|
50
|
-
args = arguments[i + 1..-1]
|
|
51
|
-
names = arguments[0..i]
|
|
52
|
-
node = tmp
|
|
53
|
-
result = LookupResult.new(node, args, names, true)
|
|
54
|
-
break
|
|
55
|
-
else
|
|
56
|
-
names = arguments[0..i]
|
|
57
|
-
node = tmp
|
|
58
|
-
result = LookupResult.new(node, args, names, node.leaf?)
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
result
|
|
63
|
-
end
|
|
64
|
-
# rubocop:enable Metrics/MethodLength
|
|
65
|
-
# rubocop:enable Metrics/AbcSize
|
|
66
|
-
|
|
67
|
-
private
|
|
68
|
-
|
|
69
|
-
# @since 0.1.0
|
|
70
|
-
# @api private
|
|
71
|
-
def command_for(name, command, **options)
|
|
72
|
-
if command.nil?
|
|
73
|
-
command
|
|
74
|
-
else
|
|
75
|
-
command.new(command_name: name, **options)
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# Node of the registry
|
|
80
|
-
#
|
|
81
|
-
# @since 0.1.0
|
|
82
|
-
# @api private
|
|
83
|
-
class Node
|
|
84
|
-
# @since 0.1.0
|
|
85
|
-
# @api private
|
|
86
|
-
attr_reader :parent
|
|
87
|
-
|
|
88
|
-
# @since 0.1.0
|
|
89
|
-
# @api private
|
|
90
|
-
attr_reader :children
|
|
91
|
-
|
|
92
|
-
# @since 0.1.0
|
|
93
|
-
# @api private
|
|
94
|
-
attr_reader :aliases
|
|
95
|
-
|
|
96
|
-
# @since 0.1.0
|
|
97
|
-
# @api private
|
|
98
|
-
attr_reader :command
|
|
99
|
-
|
|
100
|
-
# @since 0.1.0
|
|
101
|
-
# @api private
|
|
102
|
-
attr_reader :before_callbacks
|
|
103
|
-
|
|
104
|
-
# @since 0.1.0
|
|
105
|
-
# @api private
|
|
106
|
-
attr_reader :after_callbacks
|
|
107
|
-
|
|
108
|
-
# @since 0.1.0
|
|
109
|
-
# @api private
|
|
110
|
-
def initialize(parent = nil)
|
|
111
|
-
@parent = parent
|
|
112
|
-
@children = Concurrent::Hash.new
|
|
113
|
-
@aliases = Concurrent::Hash.new
|
|
114
|
-
@command = nil
|
|
115
|
-
|
|
116
|
-
@before_callbacks = Utils::Callbacks::Chain.new
|
|
117
|
-
@after_callbacks = Utils::Callbacks::Chain.new
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
# @since 0.1.0
|
|
121
|
-
# @api private
|
|
122
|
-
def put(parent, key)
|
|
123
|
-
children[key] ||= self.class.new(parent)
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# @since 0.1.0
|
|
127
|
-
# @api private
|
|
128
|
-
def lookup(token)
|
|
129
|
-
children[token] || aliases[token]
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
# @since 0.1.0
|
|
133
|
-
# @api private
|
|
134
|
-
def leaf!(command)
|
|
135
|
-
@command = command
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# @since 0.1.0
|
|
139
|
-
# @api private
|
|
140
|
-
def alias!(key, child)
|
|
141
|
-
@aliases[key] = child
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
# @since 0.1.0
|
|
145
|
-
# @api private
|
|
146
|
-
def aliases!(aliases)
|
|
147
|
-
aliases.each do |a|
|
|
148
|
-
parent.alias!(a, self)
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
# @since 0.1.0
|
|
153
|
-
# @api private
|
|
154
|
-
def leaf?
|
|
155
|
-
!command.nil?
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
# Result of a registry lookup
|
|
160
|
-
#
|
|
161
|
-
# @since 0.1.0
|
|
162
|
-
# @api private
|
|
163
|
-
class LookupResult
|
|
164
|
-
# @since 0.1.0
|
|
165
|
-
# @api private
|
|
166
|
-
attr_reader :names
|
|
167
|
-
|
|
168
|
-
# @since 0.1.0
|
|
169
|
-
# @api private
|
|
170
|
-
attr_reader :arguments
|
|
171
|
-
|
|
172
|
-
# @since 0.1.0
|
|
173
|
-
# @api private
|
|
174
|
-
def initialize(node, arguments, names, found)
|
|
175
|
-
@node = node
|
|
176
|
-
@arguments = arguments
|
|
177
|
-
@names = names
|
|
178
|
-
@found = found
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
# @since 0.1.0
|
|
182
|
-
# @api private
|
|
183
|
-
def found?
|
|
184
|
-
@found
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
# @since 0.1.0
|
|
188
|
-
# @api private
|
|
189
|
-
def children
|
|
190
|
-
@node.children
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
# @since 0.1.0
|
|
194
|
-
# @api private
|
|
195
|
-
def command
|
|
196
|
-
@node.command
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
# @since 0.2.0
|
|
200
|
-
# @api private
|
|
201
|
-
def before_callbacks
|
|
202
|
-
@node.before_callbacks
|
|
203
|
-
end
|
|
204
|
-
|
|
205
|
-
# @since 0.2.0
|
|
206
|
-
# @api private
|
|
207
|
-
def after_callbacks
|
|
208
|
-
@node.after_callbacks
|
|
209
|
-
end
|
|
210
|
-
end
|
|
211
|
-
end
|
|
212
|
-
end
|
|
213
|
-
end
|
data/lib/hanami/cli/errors.rb
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
require "hanami/utils/deprecation"
|
|
2
|
-
|
|
3
|
-
module Hanami
|
|
4
|
-
# General purpose Command Line Interface (CLI) framework for Ruby
|
|
5
|
-
#
|
|
6
|
-
# @since 0.1.0
|
|
7
|
-
class CLI
|
|
8
|
-
# @since 0.2.0
|
|
9
|
-
class Error < StandardError
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
# @since 0.2.1
|
|
13
|
-
class UnknownCommandError < Error
|
|
14
|
-
# @since 0.2.1
|
|
15
|
-
# @api private
|
|
16
|
-
def initialize(command_name)
|
|
17
|
-
super("unknown command: `#{command_name}'")
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# @since 0.2.0
|
|
22
|
-
class InvalidCallbackError < Error
|
|
23
|
-
# @since 0.2.0
|
|
24
|
-
# @api private
|
|
25
|
-
def initialize(callback)
|
|
26
|
-
message = case callback
|
|
27
|
-
when Class
|
|
28
|
-
"expected `#{callback.inspect}' to respond to `#initialize' with arity 0"
|
|
29
|
-
else
|
|
30
|
-
"expected `#{callback.inspect}' to respond to `#call'"
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
super(message)
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# @since 0.2.1
|
|
38
|
-
def self.const_missing(name)
|
|
39
|
-
super unless name == :UnkwnownCommandError
|
|
40
|
-
Hanami::Utils::Deprecation.new('UnkwnownCommandError is deprecated, please use UnknownCommandError')
|
|
41
|
-
UnknownCommandError
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
data/lib/hanami/cli/option.rb
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
require "hanami/utils/string"
|
|
2
|
-
|
|
3
|
-
module Hanami
|
|
4
|
-
class CLI
|
|
5
|
-
# Command line option
|
|
6
|
-
#
|
|
7
|
-
# @since 0.1.0
|
|
8
|
-
# @api private
|
|
9
|
-
class Option
|
|
10
|
-
# @since 0.1.0
|
|
11
|
-
# @api private
|
|
12
|
-
attr_reader :name
|
|
13
|
-
|
|
14
|
-
# @since 0.1.0
|
|
15
|
-
# @api private
|
|
16
|
-
attr_reader :options
|
|
17
|
-
|
|
18
|
-
# @since 0.1.0
|
|
19
|
-
# @api private
|
|
20
|
-
def initialize(name, options = {})
|
|
21
|
-
@name = name
|
|
22
|
-
@options = options
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# @since 0.1.0
|
|
26
|
-
# @api private
|
|
27
|
-
def aliases
|
|
28
|
-
options[:aliases] || []
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# @since 0.1.0
|
|
32
|
-
# @api private
|
|
33
|
-
def desc
|
|
34
|
-
desc = options[:desc]
|
|
35
|
-
values ? "#{desc}: (#{values.join('/')})" : desc
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# @since 0.1.0
|
|
39
|
-
# @api private
|
|
40
|
-
def required?
|
|
41
|
-
options[:required]
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# @since 0.1.0
|
|
45
|
-
# @api private
|
|
46
|
-
def type
|
|
47
|
-
options[:type]
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# @since 0.1.0
|
|
51
|
-
# @api private
|
|
52
|
-
def values
|
|
53
|
-
options[:values]
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# @since 0.1.0
|
|
57
|
-
# @api private
|
|
58
|
-
def boolean?
|
|
59
|
-
type == :boolean
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# @since 0.3.0
|
|
63
|
-
# @api private
|
|
64
|
-
def array?
|
|
65
|
-
type == :array
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# @since 0.1.0
|
|
69
|
-
# @api private
|
|
70
|
-
def default
|
|
71
|
-
options[:default]
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# @since 0.1.0
|
|
75
|
-
# @api private
|
|
76
|
-
def description_name
|
|
77
|
-
options[:label] || name.upcase
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
# @since 0.1.0
|
|
81
|
-
# @api private
|
|
82
|
-
def argument?
|
|
83
|
-
false
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# @since 0.1.0
|
|
87
|
-
# @api private
|
|
88
|
-
#
|
|
89
|
-
# rubocop:disable Metrics/AbcSize
|
|
90
|
-
# rubocop:disable Metrics/MethodLength
|
|
91
|
-
def parser_options
|
|
92
|
-
dasherized_name = Hanami::Utils::String.dasherize(name)
|
|
93
|
-
parser_options = []
|
|
94
|
-
|
|
95
|
-
if boolean?
|
|
96
|
-
parser_options << "--[no-]#{dasherized_name}"
|
|
97
|
-
else
|
|
98
|
-
parser_options << "--#{dasherized_name}=#{name}"
|
|
99
|
-
parser_options << "--#{dasherized_name} #{name}"
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
parser_options << Array if array?
|
|
103
|
-
parser_options << values if values
|
|
104
|
-
parser_options.unshift(alias_name) unless alias_name.nil?
|
|
105
|
-
parser_options << desc if desc
|
|
106
|
-
parser_options
|
|
107
|
-
end
|
|
108
|
-
# rubocop:enable Metrics/MethodLength
|
|
109
|
-
# rubocop:enable Metrics/AbcSize
|
|
110
|
-
|
|
111
|
-
private
|
|
112
|
-
|
|
113
|
-
# @since 0.1.0
|
|
114
|
-
# @api private
|
|
115
|
-
def alias_name
|
|
116
|
-
aliases.join(" ") if aliases.any?
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
# Command line argument
|
|
121
|
-
#
|
|
122
|
-
# @since 0.1.0
|
|
123
|
-
# @api private
|
|
124
|
-
class Argument < Option
|
|
125
|
-
# @since 0.1.0
|
|
126
|
-
# @api private
|
|
127
|
-
def argument?
|
|
128
|
-
true
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
end
|