charyf 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +6 -0
  3. data/Gemfile.lock +154 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +18 -0
  6. data/Rakefile +6 -0
  7. data/bin/charyf-debug +7 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +8 -0
  10. data/charyf.gemspec +48 -0
  11. data/exe/charyf +4 -0
  12. data/lib/charyf/deps.rb +9 -0
  13. data/lib/charyf/engine/all.rb +22 -0
  14. data/lib/charyf/engine/charyf.rb +5 -0
  15. data/lib/charyf/engine/context.rb +61 -0
  16. data/lib/charyf/engine/controller/actions.rb +29 -0
  17. data/lib/charyf/engine/controller/controller.rb +62 -0
  18. data/lib/charyf/engine/controller/conversation.rb +58 -0
  19. data/lib/charyf/engine/controller/helpers.rb +38 -0
  20. data/lib/charyf/engine/controller/renderers.rb +103 -0
  21. data/lib/charyf/engine/dispatcher/base.rb +121 -0
  22. data/lib/charyf/engine/dispatcher/default.rb +60 -0
  23. data/lib/charyf/engine/intent/intent.rb +54 -0
  24. data/lib/charyf/engine/intent/processors/dummy.rb +30 -0
  25. data/lib/charyf/engine/intent/processors/helpers.rb +32 -0
  26. data/lib/charyf/engine/intent/processors/processor.rb +56 -0
  27. data/lib/charyf/engine/interface/interface.rb +35 -0
  28. data/lib/charyf/engine/interface/program.rb +59 -0
  29. data/lib/charyf/engine/request.rb +32 -0
  30. data/lib/charyf/engine/response.rb +41 -0
  31. data/lib/charyf/engine/session/processors/default.rb +42 -0
  32. data/lib/charyf/engine/session/processors/processor.rb +39 -0
  33. data/lib/charyf/engine/session/session.rb +68 -0
  34. data/lib/charyf/engine/skill/info.rb +24 -0
  35. data/lib/charyf/engine/skill/routing.rb +57 -0
  36. data/lib/charyf/engine/skill/skill.rb +40 -0
  37. data/lib/charyf/engine.rb +3 -0
  38. data/lib/charyf/support/all.rb +4 -0
  39. data/lib/charyf/support/hash.rb +43 -0
  40. data/lib/charyf/support/object.rb +7 -0
  41. data/lib/charyf/support/string.rb +94 -0
  42. data/lib/charyf/support/string_inquirer.rb +17 -0
  43. data/lib/charyf/support.rb +1 -0
  44. data/lib/charyf/utils/all.rb +13 -0
  45. data/lib/charyf/utils/app_engine/extensions.rb +21 -0
  46. data/lib/charyf/utils/app_engine.rb +24 -0
  47. data/lib/charyf/utils/app_loader.rb +38 -0
  48. data/lib/charyf/utils/application/bootstrap.rb +176 -0
  49. data/lib/charyf/utils/application/configuration.rb +51 -0
  50. data/lib/charyf/utils/application.rb +131 -0
  51. data/lib/charyf/utils/charyf.rb +44 -0
  52. data/lib/charyf/utils/cli.rb +14 -0
  53. data/lib/charyf/utils/command/actions.rb +24 -0
  54. data/lib/charyf/utils/command/base.rb +138 -0
  55. data/lib/charyf/utils/command/behavior.rb +81 -0
  56. data/lib/charyf/utils/command/environment_argument.rb +40 -0
  57. data/lib/charyf/utils/command.rb +106 -0
  58. data/lib/charyf/utils/commands/all.rb +6 -0
  59. data/lib/charyf/utils/commands/application/application_command.rb +21 -0
  60. data/lib/charyf/utils/commands/cli/cli_command.rb +115 -0
  61. data/lib/charyf/utils/commands/console/console_command.rb +77 -0
  62. data/lib/charyf/utils/commands/destroy/destroy_command.rb +26 -0
  63. data/lib/charyf/utils/commands/generate/generate_command.rb +31 -0
  64. data/lib/charyf/utils/commands/help/USAGE +9 -0
  65. data/lib/charyf/utils/commands/help/help.rb +20 -0
  66. data/lib/charyf/utils/commands.rb +15 -0
  67. data/lib/charyf/utils/configuration.rb +36 -0
  68. data/lib/charyf/utils/error_handler.rb +26 -0
  69. data/lib/charyf/utils/extension/configurable.rb +41 -0
  70. data/lib/charyf/utils/extension/configuration.rb +63 -0
  71. data/lib/charyf/utils/extension.rb +129 -0
  72. data/lib/charyf/utils/generator/actions.rb +281 -0
  73. data/lib/charyf/utils/generator/base.rb +288 -0
  74. data/lib/charyf/utils/generators/app/USAGE +8 -0
  75. data/lib/charyf/utils/generators/app/app_generator.rb +274 -0
  76. data/lib/charyf/utils/generators/app/templates/Gemfile.erb +20 -0
  77. data/lib/charyf/utils/generators/app/templates/README.md +24 -0
  78. data/lib/charyf/utils/generators/app/templates/app/skill_controller.rb.tt +8 -0
  79. data/lib/charyf/utils/generators/app/templates/bin/charyf +5 -0
  80. data/lib/charyf/utils/generators/app/templates/config/application.rb.tt +32 -0
  81. data/lib/charyf/utils/generators/app/templates/config/boot.rb.tt +4 -0
  82. data/lib/charyf/utils/generators/app/templates/config/chapp.rb.tt +5 -0
  83. data/lib/charyf/utils/generators/app/templates/config/environments/development.rb.tt +2 -0
  84. data/lib/charyf/utils/generators/app/templates/config/environments/production.rb.tt +2 -0
  85. data/lib/charyf/utils/generators/app/templates/config/environments/test.rb.tt +2 -0
  86. data/lib/charyf/utils/generators/app/templates/config/load.rb.tt +17 -0
  87. data/lib/charyf/utils/generators/app/templates/gitignore +18 -0
  88. data/lib/charyf/utils/generators/app_base.rb +277 -0
  89. data/lib/charyf/utils/generators/defaults.rb +75 -0
  90. data/lib/charyf/utils/generators/intents/intents_generator.rb +41 -0
  91. data/lib/charyf/utils/generators/named_base.rb +73 -0
  92. data/lib/charyf/utils/generators/skill/skill_generator.rb +47 -0
  93. data/lib/charyf/utils/generators/skill/templates/controllers/skill_controller.rb.tt +10 -0
  94. data/lib/charyf/utils/generators/skill/templates/module.rb.tt +6 -0
  95. data/lib/charyf/utils/generators/skill/templates/skill.rb.tt +3 -0
  96. data/lib/charyf/utils/generators.rb +187 -0
  97. data/lib/charyf/utils/initializable.rb +95 -0
  98. data/lib/charyf/utils/logger.rb +26 -0
  99. data/lib/charyf/utils/machine.rb +129 -0
  100. data/lib/charyf/utils/parser/en_parser.rb +97 -0
  101. data/lib/charyf/utils/parser/parser.rb +37 -0
  102. data/lib/charyf/utils/ruby_version_check.rb +15 -0
  103. data/lib/charyf/utils/storage/provider.rb +44 -0
  104. data/lib/charyf/utils/strategy.rb +44 -0
  105. data/lib/charyf/utils/utils.rb +64 -0
  106. data/lib/charyf/utils.rb +2 -0
  107. data/lib/charyf/version.rb +19 -0
  108. data/lib/charyf.rb +18 -0
  109. data/lib/locale/en.yml +206 -0
  110. data/todo.md +3 -0
  111. metadata +272 -0
@@ -0,0 +1,131 @@
1
+ require_relative 'configuration'
2
+
3
+ require_relative 'application/configuration'
4
+ require_relative 'application/bootstrap'
5
+
6
+ require_relative 'app_engine'
7
+ require_relative 'utils'
8
+
9
+ require_relative '../support'
10
+
11
+ module Charyf
12
+ class Application < AppEngine
13
+
14
+ include Charyf::Initializable
15
+
16
+ class << self
17
+ attr_accessor :called_from
18
+
19
+ def inherited(base)
20
+ super
21
+ Charyf.app_class = base
22
+
23
+ base.called_from = begin
24
+ call_stack = caller_locations.map { |l| l.absolute_path || l.path }
25
+
26
+ File.dirname(call_stack.detect { |p| p !~ %r[charyf[\w.-]*/lib/utils] })
27
+ end
28
+ end
29
+
30
+ def instance
31
+ super.run_load_hooks!
32
+ end
33
+
34
+ def find_root(from)
35
+ Charyf::Utils.find_root_with_flag 'config/chapp.rb', from
36
+ end
37
+
38
+ def config
39
+ instance.config
40
+ end
41
+
42
+ end
43
+
44
+ def initialize!(group: :default)
45
+ return self if @initialized
46
+ @initialized = true
47
+
48
+ run_initializers(group, self)
49
+ end
50
+
51
+ def run_load_hooks!
52
+ return self if @ran_load_hooks
53
+ @ran_load_hooks = true
54
+
55
+ # Todo LOAD Hooks should be here
56
+ self
57
+ end
58
+
59
+ def config
60
+ @config ||= Application::Configuration.new(self.class.find_root(self.class.called_from))
61
+ end
62
+
63
+ def configure(&block)
64
+ instance_eval(&block)
65
+ end
66
+
67
+ # TODO sig, nullable
68
+ def session_processor
69
+ # TODO resolve dependency on engine - maybe move the base classes to utils?
70
+ klass = Charyf::Engine::Session::Processor.list[config.session_processor]
71
+ raise Charyf::Utils::InvalidConfiguration.new("No storage processor strategy with name '#{config.session_processor}' found") unless klass
72
+
73
+ klass
74
+ end
75
+
76
+ def intent_processors
77
+ # TODO resolve dependency on engine - maybe move the base classes to utils?
78
+ klasses = config.enabled_intent_processors.map do |processor_name|
79
+ klass = Charyf::Engine::Intent::Processor.list[processor_name]
80
+ raise Charyf::Utils::InvalidConfiguration.new("No intent processor strategy with name '#{processor_name}' found") unless klass
81
+
82
+ klass
83
+ end
84
+
85
+ raise Charyf::Utils::InvalidConfiguration.new('No intent processor strategies specified') if klasses.empty?
86
+
87
+ klasses
88
+ end
89
+
90
+ def dispatcher
91
+ # TODO resolve dependency on engine - maybe move the base classes to utils?
92
+ klass = Charyf::Engine::Dispatcher.list[config.dispatcher]
93
+ raise Charyf::Utils::InvalidConfiguration.new("No dispatcher with name '#{config.dispatcher}' found") unless klass
94
+
95
+ klass
96
+ end
97
+
98
+ # TODO sig, nullable
99
+ def storage_provider
100
+ klass = Charyf::Utils::StorageProvider.list[config.storage_provider]
101
+ raise Charyf::Utils::InvalidConfiguration.new("No storage provider with name '#{config.storage_provider}' found") unless klass
102
+
103
+ klass
104
+ end
105
+
106
+ def parser
107
+ klass = Charyf::Utils::Parser.get(config.i18n.locale)
108
+ raise Charyf::Utils::InvalidConfiguration.new("No parser for locale '#{config.i18n.locale}' found") unless klass
109
+
110
+ klass
111
+ end
112
+
113
+ protected
114
+
115
+ def run_generators_blocks(app) #:nodoc:
116
+ extensions.each { |r| r.run_generators_blocks(app) }
117
+ super
118
+ end
119
+
120
+ def initializers
121
+ Bootstrap.initializers_for(self)
122
+ end
123
+
124
+ private
125
+
126
+ def extensions
127
+ @extensions ||= Extensions.new
128
+ end
129
+
130
+ end
131
+ end
@@ -0,0 +1,44 @@
1
+ require 'fileutils'
2
+
3
+ module Charyf
4
+
5
+ class << self
6
+ @application = @app_class = nil
7
+
8
+ attr_accessor :app_class
9
+
10
+ def application
11
+ @application ||= (@app_class.instance if app_class)
12
+ end
13
+
14
+ def configuration
15
+ application.config
16
+ end
17
+
18
+ def root
19
+ application && application.config.root
20
+ end
21
+
22
+ def env
23
+ @_env ||= Charyf::StringInquirer.new(ENV["CHARYF_ENV"] || "development")
24
+ end
25
+
26
+ def env=(environment)
27
+ @_env = Charyf::StringInquirer.new(environment)
28
+ end
29
+
30
+ def logger
31
+ return @logger if @logger
32
+
33
+ FileUtils.mkdir_p root.join('log')
34
+ @logger = Charyf::Logger.new(Charyf.root.join('log', "#{env}.log"))
35
+ end
36
+
37
+ def groups(*groups)
38
+ # TODO
39
+ [:default, env]
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'app_loader'
4
+
5
+ # If we are inside a Charyf application this method performs an exec and thus
6
+ # the rest of this script is not run.
7
+ Charyf::AppLoader.exec_app
8
+
9
+ require_relative 'ruby_version_check'
10
+ Signal.trap("INT") { puts; exit(1) }
11
+
12
+ require_relative 'command'
13
+
14
+ Charyf::Command.invoke :application, ARGV
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Charyf
4
+ module Command
5
+ module Actions
6
+
7
+ # def set_application_directory!
8
+ # Dir.chdir(File.expand_path("../..", APP_PATH)) unless File.exist?(File.expand_path("config.ru"))
9
+ # end
10
+
11
+ def require_application_and_environment!
12
+ if defined?(APP_PATH)
13
+ require APP_PATH
14
+ Charyf.application.initialize!
15
+ end
16
+ end
17
+
18
+ def load_generators
19
+ Charyf.application.load_generators
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor'
4
+ require 'erb'
5
+
6
+ require_relative 'actions'
7
+
8
+ module Charyf
9
+ module Command
10
+ class Base < Thor
11
+ class Error < Thor::Error # :nodoc:
12
+ end
13
+
14
+ include Actions
15
+
16
+ class << self
17
+
18
+ # Tries to get the description from a USAGE file one folder above the command
19
+ # root.
20
+ def desc(usage = nil, description = nil, options = {})
21
+ if usage
22
+ super
23
+ else
24
+ @desc ||= ERB.new(File.read(desc_file)).result(binding) if desc_file
25
+ end
26
+ end
27
+
28
+ def desc_file(desc_file = nil)
29
+ @desc_file = desc_file if desc_file
30
+
31
+ @desc_file if @desc_file && File.exist?(@desc_file)
32
+ end
33
+
34
+ # Convenience method to get the namespace from the class name. It's the
35
+ # same as Thor default except that the Command at the end of the class
36
+ # is removed.
37
+ def namespace(name = nil)
38
+ if name
39
+ super
40
+ else
41
+ @namespace ||= super.chomp("_command").sub(/:command:/, ":")
42
+ end
43
+ end
44
+
45
+ # Convenience method to hide this command from the available ones when
46
+ # running charyf help command.
47
+ def hide_command!
48
+ Charyf::Command.hidden_commands << self
49
+ end
50
+
51
+ def inherited(base) #:nodoc:
52
+ super
53
+
54
+ if base.name && base.name !~ /Base$/
55
+ Charyf::Command.subclasses << base
56
+ end
57
+ end
58
+
59
+ def perform(command, args, config) # :nodoc:
60
+ if Charyf::Command::HELP_MAPPINGS.include?(args.first)
61
+ command, args = "help", []
62
+ end
63
+
64
+ dispatch(command, args.dup, nil, config)
65
+ end
66
+
67
+ def printing_commands
68
+ namespaced_commands
69
+ end
70
+
71
+ def executable
72
+ "bin/charyf #{command_name}"
73
+ end
74
+
75
+ def banner(*)
76
+ "#{executable} #{arguments.map(&:usage).join(' ')} [options]".squish
77
+ end
78
+
79
+ # Sets the base_name taking into account the current class namespace.
80
+ #
81
+ # Charyf::Command::TestCommand.base_name # => 'charyf'
82
+ def base_name
83
+ @base_name ||= begin
84
+ if base = name.to_s.split("::").first
85
+ base.underscore
86
+ end
87
+ end
88
+ end
89
+
90
+ # Return command name without namespaces.
91
+ #
92
+ # Charyf::Command::TestCommand.command_name # => 'test'
93
+ def command_name
94
+ @command_name ||= begin
95
+ if command = name.to_s.split("::").last
96
+ command.chomp!("Command")
97
+ command.underscore
98
+ end
99
+ end
100
+ end
101
+
102
+ private
103
+ # Allow the command method to be called perform.
104
+ def create_command(meth)
105
+ if meth == "perform"
106
+ alias_method command_name, meth
107
+ else
108
+ # Prevent exception about command without usage.
109
+ # Some commands define their documentation differently.
110
+ @usage ||= ""
111
+ @desc ||= ""
112
+
113
+ super
114
+ end
115
+ end
116
+
117
+ def command_root_namespace
118
+ (namespace.split(":") - %w( charyf )).first
119
+ end
120
+
121
+ def namespaced_commands
122
+ commands.keys.map do |key|
123
+ key == command_root_namespace ? key : "#{command_root_namespace}:#{key}"
124
+ end
125
+ end
126
+ end
127
+
128
+ def help
129
+ if command_name = self.class.command_name
130
+ self.class.command_help(shell, command_name)
131
+ else
132
+ super
133
+ end
134
+ end
135
+
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+ require_relative '../../support'
3
+
4
+ module Charyf
5
+ module Command
6
+ module Behavior #:nodoc:
7
+
8
+ def self.included(base)
9
+ base.extend(ClassMethods)
10
+ end
11
+
12
+ module ClassMethods
13
+
14
+ # Track all subclasses.
15
+ def subclasses
16
+ @subclasses ||= []
17
+ end
18
+
19
+ # Remove the color from output.
20
+ def no_color!
21
+ Thor::Base.shell = Thor::Shell::Basic
22
+ end
23
+
24
+ private
25
+
26
+ # This code is based dir
27
+ # Prints a list of generators.
28
+ def print_list(base, namespaces)
29
+ return if namespaces.nil? ||namespaces.empty?
30
+ puts "#{base.camelize}:"
31
+
32
+ namespaces.each do |namespace|
33
+ puts(" #{namespace}")
34
+ end
35
+
36
+ puts
37
+ end
38
+
39
+ # This code is based directly on the Text gem implementation.
40
+ # Copyright (c) 2006-2013 Paul Battley, Michael Neumann, Tim Fletcher.
41
+ #
42
+ # Returns a value representing the "cost" of transforming str1 into str2.
43
+ def levenshtein_distance(str1, str2) # :doc:
44
+ s = str1
45
+ t = str2
46
+ n = s.length
47
+ m = t.length
48
+
49
+ return m if (0 == n)
50
+ return n if (0 == m)
51
+
52
+ d = (0..m).to_a
53
+ x = nil
54
+
55
+ # avoid duplicating an enumerable object in the loop
56
+ str2_codepoint_enumerable = str2.each_codepoint
57
+
58
+ str1.each_codepoint.with_index do |char1, i|
59
+ e = i + 1
60
+
61
+ str2_codepoint_enumerable.with_index do |char2, j|
62
+ cost = (char1 == char2) ? 0 : 1
63
+ x = [
64
+ d[j + 1] + 1, # insertion
65
+ e + 1, # deletion
66
+ d[j] + cost # substitution
67
+ ].min
68
+ d[j] = e
69
+ e = x
70
+ end
71
+
72
+ d[m] = x
73
+ end
74
+
75
+ x
76
+ end
77
+
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Charyf
4
+ module Command
5
+ module EnvironmentArgument #:nodoc:
6
+
7
+
8
+ def self.included(base)
9
+ base.class_option :environment, aliases: "-e", type: :string,
10
+ desc: "Specifies the environment to run this console under (test/development/production)."
11
+ end
12
+
13
+ private
14
+ def extract_environment_option
15
+ if options[:environment]
16
+ self.options = options.merge(environment: acceptable_environment(options[:environment]))
17
+ else
18
+ self.options = options.merge(environment: Charyf::Command.environment)
19
+ end
20
+ end
21
+
22
+ def acceptable_environment(env = nil)
23
+ if available_environments.include? env
24
+ env
25
+ else
26
+ %w( production development test ).detect { |e| e =~ /^#{env}/ } || env
27
+ end
28
+ end
29
+
30
+ def available_environments
31
+ if Object.const_defined? 'APP_PATH'
32
+ app_path = File.expand_path("..", APP_PATH)
33
+ return Dir[app_path + "/environments/*.rb"].map { |fname| File.basename(fname, ".*") }
34
+ end
35
+
36
+ []
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,106 @@
1
+ require_relative '../support/object'
2
+ require_relative 'command/base'
3
+ require_relative 'command/behavior'
4
+
5
+ module Charyf
6
+ module Command
7
+
8
+ HELP_MAPPINGS = %w(-h -? --help)
9
+
10
+ include Behavior
11
+
12
+ class << self
13
+
14
+ def environment # :nodoc:
15
+ ENV['CHARYF_ENV'] ? ENV['CHARYF_ENV'] : 'development'
16
+ end
17
+
18
+ def hidden_commands # :nodoc:
19
+ @hidden_commands ||= []
20
+ end
21
+
22
+ def load_commands!
23
+ require_relative 'commands/all'
24
+ end
25
+
26
+ # Receives a namespace, arguments and the behavior to invoke the command.
27
+ def invoke(full_namespace, args = [], **config)
28
+ load_commands!
29
+
30
+ namespace = full_namespace = full_namespace.to_s
31
+
32
+ if char = namespace =~ /:(\w+)$/
33
+ command_name, namespace = $1, namespace.slice(0, char)
34
+ else
35
+ command_name = namespace
36
+ end
37
+
38
+ command_name, namespace = "help", "help" if command_name.blank? || HELP_MAPPINGS.include?(command_name)
39
+ command_name, namespace = "version", "version" if %w( -v --version ).include?(command_name)
40
+
41
+ command = find_by_namespace(namespace, command_name)
42
+
43
+ # if command && command.all_commands[command_name]
44
+ if command
45
+ command.perform(command_name, args, config)
46
+ else
47
+ $stderr.puts "Unknown command #{full_namespace}\n\n"
48
+ command_name, namespace = "help", "help"
49
+ command = find_by_namespace(namespace, command_name)
50
+ command.perform(command_name, args, config)
51
+ end
52
+
53
+ # else
54
+ # find_by_namespace("rake").perform(full_namespace, args, config)
55
+ # end
56
+ end
57
+
58
+ def find_by_namespace(namespace, command_name = nil) # :nodoc:
59
+ lookups = [namespace]
60
+ lookups << "#{namespace}:#{command_name}" if command_name
61
+ lookups.concat lookups.map {|lookup| "charyf:#{lookup}"}
62
+
63
+ namespaces = subclasses.inject(Hash.new) {|h, n| h[n.namespace] = n; h}
64
+ namespaces[(lookups & namespaces.keys).first]
65
+ end
66
+
67
+ def print_commands # :nodoc:
68
+ sorted_groups.each {|b, n| print_list(b, n)}
69
+ end
70
+
71
+ def sorted_groups # :nodoc:
72
+ groups = (subclasses - hidden_commands).group_by {|c| c.namespace.split(":").first}
73
+
74
+ groups.keys.each do |key|
75
+ groups[key] = groups[key].flat_map(&:printing_commands).sort
76
+ end
77
+
78
+ charyf = groups.delete('charyf')
79
+ [['charyf', charyf]] + groups.sort.to_a
80
+ end
81
+
82
+ # Returns the root of the Charyf engine or app running the command.
83
+ def root
84
+ if defined?(APP_PATH)
85
+ Pathname.new(File.expand_path("../..", APP_PATH))
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ def command_type # :doc:
92
+ @command_type ||= "command"
93
+ end
94
+
95
+ def lookup_paths # :doc:
96
+ @lookup_paths ||= %w( charyf/commands commands charyf/commands )
97
+ end
98
+
99
+ def file_lookup_paths # :doc:
100
+ @file_lookup_paths ||= ["{#{lookup_paths.join(',')}}", "**", "*_command.rb"]
101
+ end
102
+
103
+ end # End of self
104
+
105
+ end
106
+ end
@@ -0,0 +1,6 @@
1
+ require_relative 'application/application_command'
2
+ require_relative 'cli/cli_command'
3
+ require_relative 'console/console_command'
4
+ require_relative 'generate/generate_command'
5
+ require_relative 'destroy/destroy_command'
6
+ require_relative 'help/help'
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../generators'
4
+ require_relative '../../generators/app/app_generator'
5
+
6
+ module Charyf
7
+ module Command
8
+ class ApplicationCommand < Base # :nodoc:
9
+ hide_command!
10
+
11
+ def help
12
+ perform # Punt help output to the generator.
13
+ end
14
+
15
+ def perform(*args)
16
+ Charyf::Generators::AppGenerator.start \
17
+ Charyf::Generators::ARGVScrubber.new(args).prepare!
18
+ end
19
+ end
20
+ end
21
+ end