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,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