hanami 0.0.0 → 0.7.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.
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