hanami 0.0.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +214 -0
  3. data/FEATURES.md +156 -0
  4. data/LICENSE.md +22 -0
  5. data/README.md +80 -15
  6. data/bin/hanami +5 -0
  7. data/hanami.gemspec +27 -12
  8. data/lib/hanami.rb +78 -2
  9. data/lib/hanami/action/csrf_protection.rb +167 -0
  10. data/lib/hanami/action/routing_helpers.rb +40 -0
  11. data/lib/hanami/application.rb +244 -0
  12. data/lib/hanami/application_name.rb +101 -0
  13. data/lib/hanami/cli.rb +119 -0
  14. data/lib/hanami/cli_sub_commands/assets.rb +29 -0
  15. data/lib/hanami/cli_sub_commands/db.rb +124 -0
  16. data/lib/hanami/cli_sub_commands/destroy.rb +102 -0
  17. data/lib/hanami/cli_sub_commands/generate.rb +127 -0
  18. data/lib/hanami/commands/assets/precompile.rb +35 -0
  19. data/lib/hanami/commands/console.rb +90 -0
  20. data/lib/hanami/commands/db/abstract.rb +19 -0
  21. data/lib/hanami/commands/db/apply.rb +14 -0
  22. data/lib/hanami/commands/db/console.rb +50 -0
  23. data/lib/hanami/commands/db/create.rb +14 -0
  24. data/lib/hanami/commands/db/drop.rb +14 -0
  25. data/lib/hanami/commands/db/migrate.rb +19 -0
  26. data/lib/hanami/commands/db/prepare.rb +14 -0
  27. data/lib/hanami/commands/db/version.rb +14 -0
  28. data/lib/hanami/commands/generate/abstract.rb +63 -0
  29. data/lib/hanami/commands/generate/action.rb +262 -0
  30. data/lib/hanami/commands/generate/app.rb +116 -0
  31. data/lib/hanami/commands/generate/mailer.rb +118 -0
  32. data/lib/hanami/commands/generate/migration.rb +63 -0
  33. data/lib/hanami/commands/generate/model.rb +96 -0
  34. data/lib/hanami/commands/new/abstract.rb +128 -0
  35. data/lib/hanami/commands/new/app.rb +116 -0
  36. data/lib/hanami/commands/new/container.rb +102 -0
  37. data/lib/hanami/commands/routes.rb +41 -0
  38. data/lib/hanami/commands/server.rb +79 -0
  39. data/lib/hanami/config/configure.rb +17 -0
  40. data/lib/hanami/config/cookies.rb +68 -0
  41. data/lib/hanami/config/framework_configuration.rb +42 -0
  42. data/lib/hanami/config/load_paths.rb +27 -0
  43. data/lib/hanami/config/mapper.rb +36 -0
  44. data/lib/hanami/config/mapping.rb +12 -0
  45. data/lib/hanami/config/routes.rb +16 -0
  46. data/lib/hanami/config/security.rb +58 -0
  47. data/lib/hanami/config/sessions.rb +97 -0
  48. data/lib/hanami/configuration.rb +1728 -0
  49. data/lib/hanami/container.rb +59 -0
  50. data/lib/hanami/environment.rb +485 -0
  51. data/lib/hanami/frameworks.rb +14 -0
  52. data/lib/hanami/generators/action/action.rb.tt +8 -0
  53. data/lib/hanami/generators/action/action_spec.minitest.tt +12 -0
  54. data/lib/hanami/generators/action/action_spec.rspec.tt +11 -0
  55. data/lib/hanami/generators/action/action_without_view.rb.tt +9 -0
  56. data/lib/hanami/generators/action/template.tt +0 -0
  57. data/lib/hanami/generators/action/view.rb.tt +5 -0
  58. data/lib/hanami/generators/action/view_spec.minitest.tt +13 -0
  59. data/lib/hanami/generators/action/view_spec.rspec.tt +12 -0
  60. data/lib/hanami/generators/app/.gitkeep.tt +1 -0
  61. data/lib/hanami/generators/app/application.rb.tt +273 -0
  62. data/lib/hanami/generators/app/config/initializers/.gitkeep +0 -0
  63. data/lib/hanami/generators/app/config/routes.rb.tt +2 -0
  64. data/lib/hanami/generators/app/favicon.ico +0 -0
  65. data/lib/hanami/generators/app/templates/application.html.erb.tt +10 -0
  66. data/lib/hanami/generators/app/views/application_layout.rb.tt +7 -0
  67. data/lib/hanami/generators/application/app/.env.development.tt +4 -0
  68. data/lib/hanami/generators/application/app/.env.test.tt +4 -0
  69. data/lib/hanami/generators/application/app/.env.tt +1 -0
  70. data/lib/hanami/generators/application/app/.gitignore +0 -0
  71. data/lib/hanami/generators/application/app/.gitkeep +1 -0
  72. data/lib/hanami/generators/application/app/Gemfile.tt +37 -0
  73. data/lib/hanami/generators/application/app/Rakefile.minitest.tt +11 -0
  74. data/lib/hanami/generators/application/app/Rakefile.rspec.tt +6 -0
  75. data/lib/hanami/generators/application/app/apps/.gitkeep.tt +1 -0
  76. data/lib/hanami/generators/application/app/capybara.rb.rspec.tt +8 -0
  77. data/lib/hanami/generators/application/app/config.ru.tt +3 -0
  78. data/lib/hanami/generators/application/app/config/application.rb.tt +270 -0
  79. data/lib/hanami/generators/application/app/config/environment.rb.tt +5 -0
  80. data/lib/hanami/generators/application/app/config/initializers/.gitkeep +0 -0
  81. data/lib/hanami/generators/application/app/config/routes.rb.tt +2 -0
  82. data/lib/hanami/generators/application/app/db/.gitkeep +1 -0
  83. data/lib/hanami/generators/application/app/favicon.ico +0 -0
  84. data/lib/hanami/generators/application/app/features_helper.rb.minitest.tt +11 -0
  85. data/lib/hanami/generators/application/app/features_helper.rb.rspec.tt +12 -0
  86. data/lib/hanami/generators/application/app/gitignore.tt +2 -0
  87. data/lib/hanami/generators/application/app/gitignore_with_db.tt +4 -0
  88. data/lib/hanami/generators/application/app/hanamirc.tt +3 -0
  89. data/lib/hanami/generators/application/app/lib/app_name.rb.tt +59 -0
  90. data/lib/hanami/generators/application/app/lib/chirp/entities/.gitkeep +1 -0
  91. data/lib/hanami/generators/application/app/lib/chirp/repositories/.gitkeep +1 -0
  92. data/lib/hanami/generators/application/app/lib/config/mapping.rb.tt +7 -0
  93. data/lib/hanami/generators/application/app/rspec.rspec.tt +2 -0
  94. data/lib/hanami/generators/application/app/schema.sql.tt +0 -0
  95. data/lib/hanami/generators/application/app/spec_helper.rb.minitest.tt +7 -0
  96. data/lib/hanami/generators/application/app/spec_helper.rb.rspec.tt +104 -0
  97. data/lib/hanami/generators/application/app/templates/application.html.erb.tt +10 -0
  98. data/lib/hanami/generators/application/app/views/application_layout.rb.tt +7 -0
  99. data/lib/hanami/generators/application/container/.env.development.tt +3 -0
  100. data/lib/hanami/generators/application/container/.env.test.tt +3 -0
  101. data/lib/hanami/generators/application/container/.env.tt +1 -0
  102. data/lib/hanami/generators/application/container/.gitignore +0 -0
  103. data/lib/hanami/generators/application/container/.gitkeep +1 -0
  104. data/lib/hanami/generators/application/container/Gemfile.tt +36 -0
  105. data/lib/hanami/generators/application/container/Rakefile.minitest.tt +11 -0
  106. data/lib/hanami/generators/application/container/Rakefile.rspec.tt +6 -0
  107. data/lib/hanami/generators/application/container/capybara.rb.rspec.tt +8 -0
  108. data/lib/hanami/generators/application/container/config.ru.tt +3 -0
  109. data/lib/hanami/generators/application/container/config/environment.rb.tt +7 -0
  110. data/lib/hanami/generators/application/container/config/initializers/.gitkeep +0 -0
  111. data/lib/hanami/generators/application/container/db/.gitkeep +1 -0
  112. data/lib/hanami/generators/application/container/features_helper.rb.minitest.tt +11 -0
  113. data/lib/hanami/generators/application/container/features_helper.rb.rspec.tt +12 -0
  114. data/lib/hanami/generators/application/container/gitignore.tt +2 -0
  115. data/lib/hanami/generators/application/container/gitignore_with_db.tt +4 -0
  116. data/lib/hanami/generators/application/container/hanamirc.tt +3 -0
  117. data/lib/hanami/generators/application/container/lib/app_name.rb.tt +60 -0
  118. data/lib/hanami/generators/application/container/lib/chirp/entities/.gitkeep +1 -0
  119. data/lib/hanami/generators/application/container/lib/chirp/mailers/.gitkeep +0 -0
  120. data/lib/hanami/generators/application/container/lib/chirp/mailers/templates/.gitkeep +0 -0
  121. data/lib/hanami/generators/application/container/lib/chirp/repositories/.gitkeep +1 -0
  122. data/lib/hanami/generators/application/container/lib/config/mapping.rb.tt +7 -0
  123. data/lib/hanami/generators/application/container/rspec.rspec.tt +2 -0
  124. data/lib/hanami/generators/application/container/schema.sql.tt +0 -0
  125. data/lib/hanami/generators/application/container/spec_helper.rb.minitest.tt +7 -0
  126. data/lib/hanami/generators/application/container/spec_helper.rb.rspec.tt +104 -0
  127. data/lib/hanami/generators/database_config.rb +99 -0
  128. data/lib/hanami/generators/generatable.rb +51 -0
  129. data/lib/hanami/generators/generator.rb +35 -0
  130. data/lib/hanami/generators/mailer/mailer.rb.tt +7 -0
  131. data/lib/hanami/generators/mailer/mailer_spec.rb.tt +7 -0
  132. data/lib/hanami/generators/mailer/template.html.tt +0 -0
  133. data/lib/hanami/generators/mailer/template.txt.tt +0 -0
  134. data/lib/hanami/generators/migration/migration.rb.tt +4 -0
  135. data/lib/hanami/generators/model/entity.rb.tt +3 -0
  136. data/lib/hanami/generators/model/entity_spec.minitest.tt +5 -0
  137. data/lib/hanami/generators/model/entity_spec.rspec.tt +3 -0
  138. data/lib/hanami/generators/model/repository.rb.tt +3 -0
  139. data/lib/hanami/generators/model/repository_spec.minitest.tt +5 -0
  140. data/lib/hanami/generators/model/repository_spec.rspec.tt +3 -0
  141. data/lib/hanami/generators/test_framework.rb +42 -0
  142. data/lib/hanami/hanamirc.rb +152 -0
  143. data/lib/hanami/loader.rb +258 -0
  144. data/lib/hanami/mailer/glue.rb +68 -0
  145. data/lib/hanami/middleware.rb +143 -0
  146. data/lib/hanami/rake_helper.rb +68 -0
  147. data/lib/hanami/rake_tasks.rb +2 -0
  148. data/lib/hanami/rendering_policy.rb +77 -0
  149. data/lib/hanami/repositories/car_repository.rb +3 -0
  150. data/lib/hanami/repositories/name_repository.rb +3 -0
  151. data/lib/hanami/root.rb +7 -0
  152. data/lib/hanami/routes.rb +151 -0
  153. data/lib/hanami/routing/default.rb +25 -0
  154. data/lib/hanami/setup.rb +3 -0
  155. data/lib/hanami/static.rb +77 -0
  156. data/lib/hanami/templates/default.html.erb +9 -0
  157. data/lib/hanami/templates/welcome.html.erb +52 -0
  158. data/lib/hanami/version.rb +4 -1
  159. data/lib/hanami/views/default.rb +34 -0
  160. data/lib/hanami/views/default_template_finder.rb +20 -0
  161. data/lib/hanami/views/null_view.rb +17 -0
  162. data/lib/hanami/welcome.rb +40 -0
  163. metadata +357 -16
  164. data/.gitignore +0 -9
  165. data/Gemfile +0 -4
  166. data/Rakefile +0 -2
  167. data/bin/console +0 -14
  168. data/bin/setup +0 -8
@@ -0,0 +1,101 @@
1
+ module Hanami
2
+ # An application name.
3
+ #
4
+ # @since 0.2.1
5
+ class ApplicationName
6
+
7
+ # A list of words that are prohibited from forming the application name
8
+ #
9
+ # @since 0.2.1
10
+ RESERVED_WORDS = %w(hanami).freeze
11
+
12
+ # Initialize and check against reserved words
13
+ #
14
+ # An application name needs to be translated in quite a few ways:
15
+ # First, it must be checked against a list of reserved words and rejected
16
+ # if it is invalid. Secondly, assuming it is not invalid, it must be able
17
+ # to be output roughly as given, but with the following changes:
18
+ #
19
+ # 1. downcased,
20
+ # 2. with surrounding spaces removed,
21
+ # 3. with internal whitespace rendered as underscores
22
+ # 4. with underscores de-duplicated
23
+ #
24
+ # which is the default output. It must also be transformable into an
25
+ # environment variable.
26
+ #
27
+ # @return [Hanami::ApplicationName] a new instance of the application name
28
+ #
29
+ # @since 0.2.1
30
+ def initialize(name)
31
+ @name = sanitize(name)
32
+ ensure_validity!
33
+ end
34
+
35
+ # Returns the cleaned application name.
36
+ #
37
+ # @return [String] the santized name
38
+ #
39
+ # @example
40
+ # ApplicationName.new("my-App ").to_s # => "my-app"
41
+ #
42
+ # @since 0.2.1
43
+ def to_s
44
+ @name
45
+ end
46
+
47
+ # Returns the application name uppercased with non-alphanumeric characters
48
+ # as underscores.
49
+ #
50
+ # @return [String] the upcased name
51
+ #
52
+ # @example
53
+ # ApplicationName.new("my-app").to_env_s => "MY_APP"
54
+ #
55
+ # @since 0.2.1
56
+ def to_env_s
57
+ @name.upcase.gsub(/\W/, '_')
58
+ end
59
+
60
+ # Returns true if a potential application name matches one of the reserved
61
+ # words.
62
+ #
63
+ # @param name [String] the application name
64
+ # @return [TrueClass, FalseClass] the result of the check
65
+ #
66
+ # @example
67
+ # Hanami::ApplicationName.invalid?("hanami") # => true
68
+ #
69
+ # @since 0.2.1
70
+ def self.invalid?(name)
71
+ RESERVED_WORDS.include?(name)
72
+ end
73
+
74
+ private
75
+
76
+ # Raises RuntimeError with explanation if the provided name is invalid.
77
+ #
78
+ # @api private
79
+ # @since 0.2.1
80
+ def ensure_validity!
81
+ if self.class.invalid?(@name)
82
+ raise RuntimeError,
83
+ "application name must not be any one of the following: " +
84
+ RESERVED_WORDS.join(", ")
85
+ end
86
+ end
87
+
88
+ # Cleans a string to be a functioning application name.
89
+ #
90
+ # @api private
91
+ # @since 0.2.1
92
+ def sanitize(name)
93
+ name
94
+ .downcase
95
+ .strip
96
+ .gsub(/\s/, '_')
97
+ .gsub(/_{2,}/, '_')
98
+ .gsub(/-/, '_')
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,119 @@
1
+ require 'thor'
2
+ require 'hanami/commands/console'
3
+ require 'hanami/commands/new/app'
4
+ require 'hanami/commands/new/container'
5
+
6
+ module Hanami
7
+ class Cli < Thor
8
+ # include Thor::Actions
9
+
10
+ desc 'version', 'prints Hanami version'
11
+ long_desc <<-EOS
12
+ `hanami version` prints the version of the bundled hanami gem.
13
+ EOS
14
+ def version
15
+ require 'hanami/version'
16
+ puts "v#{ Hanami::VERSION }"
17
+ end
18
+
19
+ desc 'server', 'starts a hanami server'
20
+ long_desc <<-EOS
21
+ `hanami server` starts a server for the current hanami project.
22
+
23
+ $ > hanami server
24
+
25
+ $ > hanami server -p 4500
26
+ EOS
27
+ method_option :port, aliases: '-p', desc: 'The port to run the server on, '
28
+ method_option :server, desc: 'choose a specific Rack::Handler, e.g. webrick, thin etc'
29
+ method_option :rackup, desc: 'a rackup configuration file path to load (config.ru)'
30
+ method_option :host, desc: 'the host address to bind to'
31
+ method_option :debug, desc: 'turn on debug output'
32
+ method_option :warn, desc: 'turn on warnings'
33
+ method_option :daemonize, desc: 'if true, the server will daemonize itself (fork, detach, etc)'
34
+ method_option :pid, desc: 'path to write a pid file after daemonize'
35
+ method_option :environment, desc: 'path to environment configuration (config/environment.rb)'
36
+ method_option :code_reloading, desc: 'code reloading', type: :boolean, default: true
37
+ method_option :help, desc: 'displays the usage message'
38
+ def server
39
+ if options[:help]
40
+ invoke :help, ['server']
41
+ else
42
+ require 'hanami/commands/server'
43
+ Hanami::Commands::Server.new(options).start
44
+ end
45
+ end
46
+
47
+ desc 'console', 'starts a hanami console'
48
+ long_desc <<-EOS
49
+ `hanami console` starts the interactive hanami console.
50
+
51
+ $ > hanami console --engine=pry
52
+ EOS
53
+ method_option :environment, desc: 'path to environment configuration (config/environment.rb)'
54
+ method_option :engine, desc: "choose a specific console engine: (#{Hanami::Commands::Console::ENGINES.keys.join('/')})"
55
+ method_option :help, desc: 'displays the usage method'
56
+ def console
57
+ if options[:help]
58
+ invoke :help, ['console']
59
+ else
60
+ Hanami::Commands::Console.new(options).start
61
+ end
62
+ end
63
+
64
+ desc 'new APPLICATION_NAME', 'generate a new hanami project'
65
+ long_desc <<-EOS
66
+ `hanami new` creates a new hanami project.
67
+ You can specify various options such as the database to be used as well as the path and architecture.
68
+
69
+ $ > hanami new fancy_app --application_name=admin
70
+
71
+ $ > hanami new fancy_app --arch=app
72
+
73
+ $ > hanami new fancy_app --hanami-head=true
74
+ EOS
75
+ method_option :database, aliases: ['-d', '--db'], desc: "application database (#{Hanami::Generators::DatabaseConfig::SUPPORTED_ENGINES.keys.join('/')})", default: Hanami::Generators::DatabaseConfig::DEFAULT_ENGINE
76
+ method_option :architecture, aliases: ['-a', '--arch'], desc: 'project architecture (container/app)', default: Hanami::Commands::New::Abstract::DEFAULT_ARCHITECTURE
77
+ method_option :application_name, desc: 'application name, only for container', default: Hanami::Commands::New::Container::DEFAULT_APPLICATION_NAME
78
+ method_option :application_base_url, desc: 'application base url', default: Hanami::Commands::New::Abstract::DEFAULT_APPLICATION_BASE_URL
79
+ method_option :test, desc: "project test framework (#{Hanami::Generators::TestFramework::VALID_FRAMEWORKS.join('/')})", default: Hanami::Hanamirc::DEFAULT_TEST_SUITE
80
+ method_option :hanami_head, desc: 'use Hanami HEAD (true/false)', type: :boolean, default: false
81
+ method_option :help, desc: 'displays the usage method'
82
+ def new(application_name)
83
+ if options[:help]
84
+ invoke :help, ['new']
85
+ elsif options[:architecture] == 'app'
86
+ Hanami::Commands::New::App.new(options, application_name).start
87
+ else
88
+ Hanami::Commands::New::Container.new(options, application_name).start
89
+ end
90
+ end
91
+
92
+ desc 'routes', 'prints the routes'
93
+ long_desc <<-EOS
94
+ `hanami routes` outputs all the registered routes to the console.
95
+ EOS
96
+ method_option :environment, desc: 'path to environment configuration (config/environment.rb)'
97
+ method_option :help, desc: 'displays the usage method'
98
+ def routes
99
+ if options[:help]
100
+ invoke :help, ['routes']
101
+ else
102
+ require 'hanami/commands/routes'
103
+ Hanami::Commands::Routes.new(options).start
104
+ end
105
+ end
106
+
107
+ require 'hanami/cli_sub_commands/db'
108
+ register Hanami::CliSubCommands::DB, 'db', 'db [SUBCOMMAND]', 'manage set of DB operations'
109
+
110
+ require 'hanami/cli_sub_commands/generate'
111
+ register Hanami::CliSubCommands::Generate, 'generate', 'generate [SUBCOMMAND]', 'generate hanami classes'
112
+
113
+ require 'hanami/cli_sub_commands/destroy'
114
+ register Hanami::CliSubCommands::Destroy, 'destroy', 'destroy [SUBCOMMAND]', 'destroy hanami classes'
115
+
116
+ require 'hanami/cli_sub_commands/assets'
117
+ register Hanami::CliSubCommands::Assets, 'assets', 'assets [SUBCOMMAND]', 'manage assets'
118
+ end
119
+ end
@@ -0,0 +1,29 @@
1
+ module Hanami
2
+ class CliSubCommands
3
+ # A set of subcommands related to assets
4
+ #
5
+ # It is run with:
6
+ #
7
+ # `bundle exec hanami assets`
8
+ #
9
+ # @since 0.6.0
10
+ # @api private
11
+ class Assets < Thor
12
+ namespace :assets
13
+
14
+ desc 'precompile', 'precompile assets for deployment'
15
+ def precompile
16
+ require 'hanami/commands/assets/precompile'
17
+ Hanami::Commands::Assets::Precompile.new(options, environment).start
18
+ end
19
+
20
+ private
21
+
22
+ # @since 0.6.0
23
+ # @api private
24
+ def environment
25
+ Hanami::Environment.new(options)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,124 @@
1
+ module Hanami
2
+ class CliSubCommands
3
+ # A set of subcommands related to DB
4
+ #
5
+ # It is run with:
6
+ #
7
+ # `bundle exec hanami db`
8
+ #
9
+ # @since 0.6.0
10
+ # @api private
11
+ class DB < Thor
12
+ namespace :db
13
+
14
+ desc 'console', 'start DB console'
15
+ method_option :environment, desc: 'path to environment configuration (config/environment.rb)'
16
+ def console(name = nil)
17
+ if options[:help]
18
+ invoke :help, ['console']
19
+ else
20
+ require 'hanami/commands/db/console'
21
+ Hanami::Commands::DB::Console.new(options, name).start
22
+ end
23
+ end
24
+
25
+ desc 'create', 'create database for current environment'
26
+ method_option :environment, desc: 'path to environment configuration (config/environment.rb)'
27
+ def create
28
+ if options[:help]
29
+ invoke :help, ['create']
30
+ else
31
+ assert_allowed_environment!
32
+ require 'hanami/commands/db/create'
33
+ Hanami::Commands::DB::Create.new(options).start
34
+ end
35
+ end
36
+
37
+ desc 'drop', 'drop database for current environment'
38
+ method_option :environment, desc: 'path to environment configuration (config/environment.rb)'
39
+ def drop
40
+ if options[:help]
41
+ invoke :help, ['drop']
42
+ else
43
+ assert_allowed_environment!
44
+ require 'hanami/commands/db/drop'
45
+ Hanami::Commands::DB::Drop.new(options).start
46
+ end
47
+ end
48
+
49
+ desc 'migrate', 'migrate database for current environment'
50
+ method_option :environment, desc: 'path to environment configuration (config/environment.rb)'
51
+ def migrate(version = nil)
52
+ if options[:help]
53
+ invoke :help, ['migrate']
54
+ else
55
+ require 'hanami/commands/db/migrate'
56
+ Hanami::Commands::DB::Migrate.new(options, version).start
57
+ end
58
+ end
59
+
60
+ desc 'apply', 'migrate, dump schema, delete migrations (experimental)'
61
+ method_option :environment, desc: 'path to environment configuration (config/environment.rb)'
62
+ def apply
63
+ if options[:help]
64
+ invoke :help, ['apply']
65
+ else
66
+ assert_development_environment!
67
+ require 'hanami/commands/db/apply'
68
+ Hanami::Commands::DB::Apply.new(options).start
69
+ end
70
+ end
71
+
72
+ desc 'prepare', 'create and migrate database'
73
+ method_option :environment, desc: 'path to environment configuration (config/environment.rb)'
74
+ def prepare
75
+ if options[:help]
76
+ invoke :help, ['prepare']
77
+ else
78
+ assert_allowed_environment!
79
+ require 'hanami/commands/db/prepare'
80
+ Hanami::Commands::DB::Prepare.new(options).start
81
+ end
82
+ end
83
+
84
+ # @since 0.6.0
85
+ # @api private
86
+ desc 'version', 'current database version'
87
+ method_option :environment, desc: 'path to environment configuration (config/environment.rb)'
88
+ def version
89
+ if options[:help]
90
+ invoke :help, ['version']
91
+ else
92
+ require 'hanami/commands/db/version'
93
+ Hanami::Commands::DB::Version.new(options).start
94
+ end
95
+ end
96
+
97
+ private
98
+
99
+ # @since 0.6.0
100
+ # @api private
101
+ def environment
102
+ Hanami::Environment.new(options)
103
+ end
104
+
105
+ # @since 0.6.0
106
+ # @api private
107
+ def assert_allowed_environment!
108
+ if environment.environment?(:production)
109
+ puts "Can't run this command in production mode"
110
+ exit 1
111
+ end
112
+ end
113
+
114
+ # @since 0.6.0
115
+ # @api private
116
+ def assert_development_environment!
117
+ unless environment.environment?(:development)
118
+ puts "This command can be ran only in development mode"
119
+ exit 1
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,102 @@
1
+ require 'hanami/routing/route'
2
+ require 'hanami/commands/generate/action'
3
+
4
+ module Hanami
5
+ class CliSubCommands
6
+ class Destroy < Thor
7
+ include Thor::Actions
8
+ namespace :destroy
9
+
10
+ desc 'action APPLICATION_NAME CONTROLLER_NAME#ACTION_NAME', 'destroy a hanami action'
11
+ long_desc <<-EOS
12
+ `hanami destroy action` will destroy an an action, view and template along with specs and a route.
13
+
14
+ For Application architecture the application name is 'app'. For Container architecture the default application is called 'web'.
15
+
16
+ > $ hanami destroy action app cars#index
17
+
18
+ > $ hanami destroy action other-app cars#index
19
+
20
+ > $ hanami destroy action web cars#create --method=post
21
+ EOS
22
+
23
+ method_option :method, desc: "The HTTP method used when the route was generated. Must be one of (#{Hanami::Routing::Route::VALID_HTTP_VERBS.join('/')})", default: Hanami::Commands::Generate::Action::DEFAULT_HTTP_METHOD
24
+ method_option :url, desc: 'Relative URL for action, will be used for the route', default: nil
25
+ method_option :template, desc: 'Extension used when the template was generated. Default is defined through your .hanamirc file.'
26
+
27
+ def actions(application_name, controller_and_action_name)
28
+ if options[:help]
29
+ invoke :help, ['action']
30
+ else
31
+ Hanami::Commands::Generate::Action.new(options, application_name, controller_and_action_name).destroy.start
32
+ end
33
+ end
34
+
35
+ desc 'migration NAME', 'destroy a migration'
36
+ long_desc <<-EOS
37
+ `hanami destroy migration` will destroy a migration file.
38
+
39
+ > $ hanami destroy migration create_books
40
+ EOS
41
+
42
+ def migration(name)
43
+ if options[:help]
44
+ invoke :help, ['migration']
45
+ else
46
+ require 'hanami/commands/generate/migration'
47
+ Hanami::Commands::Generate::Migration.new(options, name).destroy.start
48
+ end
49
+ end
50
+
51
+ desc 'model NAME', 'destroy an entity'
52
+ long_desc <<-EOS
53
+ `hanami destroy model` will destroy an entity along with repository
54
+ and corresponding tests
55
+
56
+ > $ hanami generate model car
57
+ EOS
58
+
59
+ def model(name)
60
+ if options[:help]
61
+ invoke :help, ['model']
62
+ else
63
+ require 'hanami/commands/generate/model'
64
+ Hanami::Commands::Generate::Model.new(options, name).destroy.start
65
+ end
66
+ end
67
+
68
+ desc 'application NAME', 'destroy an application'
69
+ long_desc <<-EOS
70
+ `hanami destroy application` will destroy an application, along with templates and specs.
71
+
72
+ > $ hanami destroy application api
73
+ EOS
74
+ def application(name)
75
+ if options[:help]
76
+ invoke :help, ['app']
77
+ else
78
+ require 'hanami/commands/generate/app'
79
+ Hanami::Commands::Generate::App.new(options, name).destroy.start
80
+ end
81
+ end
82
+
83
+ desc 'mailer NAME', 'destroy a mailer'
84
+ long_desc <<-EOS
85
+ `hanami destroy mailer` will destroy a mailer, along with templates and specs.
86
+
87
+ > $ hanami destroy mailer forgot_password
88
+ EOS
89
+
90
+ def mailer(name)
91
+ if options[:help]
92
+ invoke :help, ['mailer']
93
+ else
94
+ require 'hanami/commands/generate/mailer'
95
+
96
+ options[:behavior] = :revoke
97
+ Hanami::Commands::Generate::Mailer.new(options, name).destroy.start
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end