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,127 @@
1
+ require 'hanami/routing/route'
2
+ require 'hanami/commands/generate/action'
3
+ require 'hanami/commands/generate/mailer'
4
+
5
+ module Hanami
6
+ class CliSubCommands
7
+ # A set of generator subcommands
8
+ #
9
+ # It is run with:
10
+ #
11
+ # `bundle exec hanami generate`
12
+ #
13
+ # @since 0.6.0
14
+ # @api private
15
+ class Generate < Thor
16
+ include Thor::Actions
17
+
18
+ namespace :generate
19
+
20
+ # @since 0.6.0
21
+ # @api private
22
+ desc 'action APPLICATION_NAME CONTROLLER_NAME#ACTION_NAME', 'generate a hanami action'
23
+ long_desc <<-EOS
24
+ `hanami generate action` generates an an action, view and template along with specs and a route.
25
+
26
+ For Application architecture the application name is 'app'. For Container architecture the default application is called 'web'.
27
+
28
+ > $ hanami generate action app cars#index
29
+
30
+ > $ hanami generate action other-app cars#index
31
+
32
+ > $ hanami generate action web cars#create --method=post
33
+ EOS
34
+ method_option :method, desc: "The HTTP method to be used for the generated route. Must be one of (#{Hanami::Routing::Route::VALID_HTTP_VERBS.join('/')})", default: Hanami::Commands::Generate::Action::DEFAULT_HTTP_METHOD
35
+ method_option :url, desc: 'Relative URL for action, will be used for the route', default: nil
36
+ method_option :test, desc: 'Defines the testing Framework to be used. Default is defined through your .hanamirc file.'
37
+ method_option :skip_view, desc: 'Skip the generation of the view. Also skips template generation.', default: false, type: :boolean
38
+ method_option :template, desc: 'Extension to be used for the generated template. Default is defined through your .hanamirc file.'
39
+ def actions(application_name = nil, controller_and_action_name)
40
+ if Hanami::Environment.new(options).container? && application_name.nil?
41
+ msg = "ERROR: \"hanami generate action\" was called with arguments [\"#{controller_and_action_name}\"]\n" \
42
+ "Usage: \"hanami action APPLICATION_NAME CONTROLLER_NAME#ACTION_NAME\""
43
+ fail Error, msg
44
+ end
45
+
46
+ if options[:help]
47
+ invoke :help, ['action']
48
+ else
49
+ Hanami::Commands::Generate::Action.new(options, application_name, controller_and_action_name).start
50
+ end
51
+ end
52
+
53
+ desc 'migration NAME', 'generate a migration'
54
+ long_desc <<-EOS
55
+ `hanami generate migration` will generate an empty migration file.
56
+
57
+ > $ hanami generate migration do_something
58
+ EOS
59
+ def migration(name)
60
+ if options[:help]
61
+ invoke :help, ['migration']
62
+ else
63
+ require 'hanami/commands/generate/migration'
64
+ Hanami::Commands::Generate::Migration.new(options, name).start
65
+ end
66
+ end
67
+
68
+ desc 'model NAME', 'generate an entity'
69
+ long_desc <<-EOS
70
+ `hanami generate model` will generate an entity along with repository
71
+ and corresponding tests. The name of the model can contain slashes to
72
+ indicate module names.
73
+
74
+ > $ hanami generate model car
75
+
76
+ > $ hanami generate model vehicles/car
77
+ EOS
78
+ method_option :test, desc: 'Defines the testing Framework to be used. Default is defined through your .hanamirc file.'
79
+ def model(name)
80
+ if options[:help]
81
+ invoke :help, ['model']
82
+ else
83
+ require 'hanami/commands/generate/model'
84
+ Hanami::Commands::Generate::Model.new(options, name).start
85
+ end
86
+ end
87
+
88
+ desc 'mailer NAME', 'generate a mailer'
89
+ long_desc <<-EOS
90
+ `hanami generate mailer` will generate an empty mailer, along with templates and specs.
91
+
92
+ > $ hanami generate mailer forgot_password
93
+ > $ hanami generate mailer forgot_password --to "'log@bookshelf.com'" --from "'support@bookshelf.com'" --subject "'New Password'"
94
+ EOS
95
+ method_option :to, desc: 'sender email', default: Hanami::Commands::Generate::Mailer::DEFAULT_TO
96
+ method_option :from, desc: 'sendee email', default: Hanami::Commands::Generate::Mailer::DEFAULT_FROM
97
+ method_option :subject, desc: 'email subject', default: Hanami::Commands::Generate::Mailer::DEFAULT_SUBJECT
98
+ def mailer(name)
99
+ if options[:help]
100
+ invoke :help, ['mailer']
101
+ else
102
+ Hanami::Commands::Generate::Mailer.new(options, name).start
103
+ end
104
+ end
105
+
106
+ desc 'app APPLICATION_NAME', 'generate an app'
107
+ long_desc <<-EOS
108
+ `hanami generate app` creates a new app inside the 'apps' directory.
109
+
110
+ It can only be called for hanami applications with container architecture.
111
+
112
+ > $ hanami generate app admin
113
+
114
+ > $ hanami generate app reporting --application_base_url=/reports
115
+ EOS
116
+ method_option :application_base_url, desc: 'Base URL for the new app. If missing, then it is inferred from APPLICATION_NAME'
117
+ def app(application_name)
118
+ if options[:help]
119
+ invoke :help, ['app']
120
+ else
121
+ require 'hanami/commands/generate/app'
122
+ Hanami::Commands::Generate::App.new(options, application_name).start
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,35 @@
1
+ require 'hanami/assets'
2
+
3
+ module Hanami
4
+ module Commands
5
+ class Assets
6
+ class Precompile
7
+ def initialize(options, environment)
8
+ @options = options
9
+ @environment = environment
10
+ end
11
+
12
+ def start
13
+ preload_applications
14
+ precompile
15
+ end
16
+
17
+ private
18
+
19
+ def preload_applications
20
+ @environment.require_application_environment
21
+
22
+ if @environment.container?
23
+ Hanami::Container.new
24
+ else
25
+ Hanami::Application.preload!
26
+ end
27
+ end
28
+
29
+ def precompile
30
+ Hanami::Assets.deploy
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,90 @@
1
+ module Hanami
2
+ module Commands
3
+ # REPL that supports different engines.
4
+ #
5
+ # It is run with:
6
+ #
7
+ # `bundle exec hanami console`
8
+ #
9
+ # @since 0.1.0
10
+ # @api private
11
+ class Console
12
+ module Methods
13
+ def reload!
14
+ puts 'Reloading...'
15
+ Kernel.exec "#{$0} console"
16
+ end
17
+ end
18
+
19
+ ENGINES = {
20
+ 'pry' => 'Pry',
21
+ 'ripl' => 'Ripl',
22
+ 'irb' => 'IRB'
23
+ }.freeze
24
+
25
+ DEFAULT_ENGINE = 'irb'.freeze
26
+
27
+ # @since 0.1.0
28
+ attr_reader :options
29
+
30
+ # @param options [Hash] Environment's options
31
+ #
32
+ # @since 0.1.0
33
+ # @see Hanami::Environment#initialize
34
+ def initialize(options)
35
+ @environment = Hanami::Environment.new(options)
36
+ @options = @environment.to_options
37
+ end
38
+
39
+ # @since 0.1.0
40
+ def start
41
+ # Clear out ARGV so Pry/IRB don't attempt to parse the rest
42
+ ARGV.shift until ARGV.empty?
43
+ @environment.require_application_environment
44
+
45
+ # Add convenience methods to the main:Object binding
46
+ TOPLEVEL_BINDING.eval('self').send(:include, Methods)
47
+
48
+ load_application
49
+ engine.start
50
+ end
51
+
52
+ # @since 0.1.0
53
+ # @api private
54
+ def engine
55
+ load_engine options.fetch(:engine) { engine_lookup }
56
+ end
57
+
58
+ private
59
+
60
+ # @since 0.1.0
61
+ # @api private
62
+ def engine_lookup
63
+ (ENGINES.find { |_, klass| Object.const_defined?(klass) } || DEFAULT_ENGINE).first
64
+ end
65
+
66
+ # @since 0.1.0
67
+ # @api private
68
+ def load_engine(engine)
69
+ require engine
70
+ rescue LoadError
71
+ ensure
72
+ return Object.const_get(
73
+ ENGINES.fetch(engine) {
74
+ raise ArgumentError.new("Unknown console engine: #{ engine }")
75
+ }
76
+ )
77
+ end
78
+
79
+ # @since 0.1.0
80
+ # @api private
81
+ def load_application
82
+ if @environment.container?
83
+ Hanami::Container.new
84
+ else
85
+ Hanami::Application.preload_applications!
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,19 @@
1
+ module Hanami
2
+ module Commands
3
+ class DB
4
+ class Abstract
5
+ attr_reader :environment
6
+
7
+ def initialize(options)
8
+ @options = options
9
+ @environment = Hanami::Environment.new(options)
10
+ @environment.require_application_environment
11
+ end
12
+
13
+ def start
14
+ raise NotImplementedError
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ require 'hanami/commands/db/abstract'
2
+
3
+ module Hanami
4
+ module Commands
5
+ class DB
6
+ class Apply < Abstract
7
+ def start
8
+ require 'hanami/model/migrator'
9
+ Hanami::Model::Migrator.apply
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,50 @@
1
+ require 'hanami/utils/class'
2
+ require 'hanami/commands/db/abstract'
3
+
4
+ module Hanami
5
+ module Commands
6
+ class DB
7
+ class Console < Abstract
8
+ attr_reader :name, :env_options
9
+
10
+ def initialize(options, name)
11
+ super(options)
12
+ @name = name
13
+ @env_options = environment.to_options
14
+ end
15
+
16
+ def start
17
+ exec connection_string
18
+ end
19
+
20
+ private
21
+
22
+ def config
23
+ if name
24
+ app_constant = Hanami::Utils::Class.load_from_pattern!(Hanami::Utils::String.new(name).classify)
25
+ Hanami::Utils::Class.load_from_pattern!("#{app_constant}::Application").load!
26
+ Hanami::Utils::Class.load_from_pattern!("#{app_constant}::Model").configuration
27
+ else
28
+ Hanami::Model.configuration
29
+ end
30
+ end
31
+
32
+ def adapter_config
33
+ config.adapter_config
34
+ end
35
+
36
+ def mapper
37
+ config.mapper
38
+ end
39
+
40
+ def adapter_class
41
+ Hanami::Utils::Class.load_from_pattern!(adapter_config.class_name, Hanami::Model::Adapters)
42
+ end
43
+
44
+ def connection_string
45
+ adapter_class.new(mapper, adapter_config.uri).connection_string
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,14 @@
1
+ require 'hanami/commands/db/abstract'
2
+
3
+ module Hanami
4
+ module Commands
5
+ class DB
6
+ class Create < Abstract
7
+ def start
8
+ require 'hanami/model/migrator'
9
+ Hanami::Model::Migrator.create
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'hanami/commands/db/abstract'
2
+
3
+ module Hanami
4
+ module Commands
5
+ class DB
6
+ class Drop < Abstract
7
+ def start
8
+ require 'hanami/model/migrator'
9
+ Hanami::Model::Migrator.drop
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ require 'hanami/commands/db/abstract'
2
+
3
+ module Hanami
4
+ module Commands
5
+ class DB
6
+ class Migrate < Abstract
7
+ def initialize(environment, version)
8
+ super(environment)
9
+ @version = version
10
+ end
11
+
12
+ def start
13
+ require 'hanami/model/migrator'
14
+ Hanami::Model::Migrator.migrate(version: @version)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ require 'hanami/commands/db/abstract'
2
+
3
+ module Hanami
4
+ module Commands
5
+ class DB
6
+ class Prepare < Abstract
7
+ def start
8
+ require 'hanami/model/migrator'
9
+ Hanami::Model::Migrator.prepare
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'hanami/commands/db/abstract'
2
+
3
+ module Hanami
4
+ module Commands
5
+ class DB
6
+ class Version < Abstract
7
+ def start
8
+ require 'hanami/model/migrator'
9
+ puts Hanami::Model::Migrator.version
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,63 @@
1
+ require 'hanami/environment'
2
+ require 'hanami/generators/generatable'
3
+ require 'hanami/generators/test_framework'
4
+ require 'hanami/version'
5
+ require 'hanami/utils/string'
6
+
7
+ module Hanami
8
+ module Commands
9
+ class Generate
10
+ class Abstract
11
+
12
+ include Hanami::Generators::Generatable
13
+
14
+ attr_reader :options, :target_path
15
+
16
+ def initialize(options)
17
+ @options = Hanami::Utils::Hash.new(options).symbolize!
18
+ assert_options!
19
+
20
+ @target_path = Pathname.pwd
21
+ end
22
+
23
+ def template_source_path
24
+ generator = self.class.name.split('::').last.downcase
25
+ Pathname.new(::File.dirname(__FILE__) + "/../../generators/#{generator}/").realpath
26
+ end
27
+
28
+ private
29
+
30
+ def test_framework
31
+ @test_framework ||= Hanami::Generators::TestFramework.new(hanamirc, options[:test])
32
+ end
33
+
34
+ def hanamirc_options
35
+ hanamirc.options
36
+ end
37
+
38
+ def hanamirc
39
+ @hanamirc ||= Hanamirc.new(target_path)
40
+ end
41
+
42
+ def environment
43
+ @environment ||= Hanami::Environment.new(options)
44
+ end
45
+
46
+ def template_engine
47
+ options.fetch(:template, default_template_engine)
48
+ end
49
+
50
+ def default_template_engine
51
+ hanamirc_options.fetch(:template)
52
+ end
53
+
54
+ def assert_options!
55
+ if options.nil?
56
+ raise ArgumentError.new('options must not be nil')
57
+ end
58
+ end
59
+
60
+ end
61
+ end
62
+ end
63
+ end