hanami 1.0.0.beta2 → 1.0.0.beta3

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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/FEATURES.md +2 -0
  4. data/LICENSE.md +1 -1
  5. data/README.md +1 -1
  6. data/hanami.gemspec +8 -8
  7. data/lib/hanami.rb +0 -5
  8. data/lib/hanami/action/csrf_protection.rb +35 -0
  9. data/lib/hanami/app.rb +1 -1
  10. data/lib/hanami/application.rb +2 -0
  11. data/lib/hanami/application_configuration.rb +1 -12
  12. data/lib/hanami/application_name.rb +8 -2
  13. data/lib/hanami/application_namespace.rb +2 -0
  14. data/lib/hanami/assets/asset.rb +1 -0
  15. data/lib/hanami/cli.rb +7 -0
  16. data/lib/hanami/cli_base.rb +3 -0
  17. data/lib/hanami/cli_sub_commands/assets.rb +2 -0
  18. data/lib/hanami/cli_sub_commands/db.rb +15 -2
  19. data/lib/hanami/cli_sub_commands/destroy.rb +6 -0
  20. data/lib/hanami/cli_sub_commands/generate.rb +7 -2
  21. data/lib/hanami/commands/assets/precompile.rb +4 -0
  22. data/lib/hanami/commands/command.rb +13 -0
  23. data/lib/hanami/commands/console.rb +6 -0
  24. data/lib/hanami/commands/db/apply.rb +3 -0
  25. data/lib/hanami/commands/db/console.rb +7 -0
  26. data/lib/hanami/commands/db/create.rb +3 -0
  27. data/lib/hanami/commands/db/drop.rb +3 -0
  28. data/lib/hanami/commands/db/migrate.rb +5 -0
  29. data/lib/hanami/commands/db/prepare.rb +3 -0
  30. data/lib/hanami/commands/db/version.rb +3 -0
  31. data/lib/hanami/commands/generate/abstract.rb +13 -1
  32. data/lib/hanami/commands/generate/action.rb +21 -0
  33. data/lib/hanami/commands/generate/app.rb +21 -0
  34. data/lib/hanami/commands/generate/mailer.rb +16 -3
  35. data/lib/hanami/commands/generate/migration.rb +13 -2
  36. data/lib/hanami/commands/generate/model.rb +14 -1
  37. data/lib/hanami/commands/generate/secret_token.rb +6 -0
  38. data/lib/hanami/commands/new/abstract.rb +39 -4
  39. data/lib/hanami/commands/new/app.rb +15 -0
  40. data/lib/hanami/commands/new/container.rb +14 -0
  41. data/lib/hanami/commands/routes.rb +2 -0
  42. data/lib/hanami/commands/server.rb +4 -0
  43. data/lib/hanami/components/app/assets.rb +4 -0
  44. data/lib/hanami/components/app/controller.rb +4 -0
  45. data/lib/hanami/components/app/routes.rb +6 -0
  46. data/lib/hanami/components/app/view.rb +4 -0
  47. data/lib/hanami/components/component.rb +2 -0
  48. data/lib/hanami/components/components.rb +12 -5
  49. data/lib/hanami/components/routes_inspector.rb +2 -0
  50. data/lib/hanami/config/cookies.rb +1 -0
  51. data/lib/hanami/config/framework_configuration.rb +1 -0
  52. data/lib/hanami/config/load_paths.rb +4 -0
  53. data/lib/hanami/config/mapper.rb +11 -0
  54. data/lib/hanami/config/routes.rb +4 -0
  55. data/lib/hanami/config/security.rb +2 -0
  56. data/lib/hanami/config/sessions.rb +6 -0
  57. data/lib/hanami/configuration.rb +102 -0
  58. data/lib/hanami/environment.rb +13 -0
  59. data/lib/hanami/environment_application_configurations.rb +7 -0
  60. data/lib/hanami/generators/app/application.rb.tt +31 -23
  61. data/lib/hanami/generators/app/favicon.ico +0 -0
  62. data/lib/hanami/generators/database_config.rb +19 -1
  63. data/lib/hanami/generators/generatable.rb +13 -0
  64. data/lib/hanami/generators/generator.rb +8 -0
  65. data/lib/hanami/generators/template_engine.rb +9 -0
  66. data/lib/hanami/generators/test_framework.rb +12 -0
  67. data/lib/hanami/hanamirc.rb +2 -0
  68. data/lib/hanami/mailer/glue.rb +1 -0
  69. data/lib/hanami/middleware.rb +24 -0
  70. data/lib/hanami/rendering_policy.rb +15 -0
  71. data/lib/hanami/routes.rb +14 -12
  72. data/lib/hanami/routing/default.rb +7 -0
  73. data/lib/hanami/server.rb +6 -0
  74. data/lib/hanami/version.rb +1 -1
  75. data/lib/hanami/views/default.rb +3 -0
  76. data/lib/hanami/views/default_template_finder.rb +2 -0
  77. data/lib/hanami/views/null_view.rb +2 -0
  78. data/lib/hanami/welcome.rb +7 -0
  79. metadata +18 -19
  80. data/lib/hanami/root.rb +0 -7
@@ -3,6 +3,7 @@ require 'hanami/commands/generate/action'
3
3
 
4
4
  module Hanami
5
5
  class CliSubCommands
6
+ # @api private
6
7
  class Destroy < Thor
7
8
  extend CliBase
8
9
  include Thor::Actions
@@ -25,6 +26,7 @@ module Hanami
25
26
  method_option :url, desc: 'Relative URL for action, will be used for the route', default: nil
26
27
  method_option :template, desc: 'Extension used when the template was generated. Default is defined through your .hanamirc file.'
27
28
 
29
+ # @api private
28
30
  def actions(application_name = nil, controller_and_action_name)
29
31
  if Hanami::Environment.new(options).container? && application_name.nil?
30
32
  msg = "ERROR: \"hanami destroy action\" was called with arguments [\"#{controller_and_action_name}\"]\n" \
@@ -46,6 +48,7 @@ module Hanami
46
48
  > $ hanami destroy migration create_books
47
49
  EOS
48
50
 
51
+ # @api private
49
52
  def migration(name)
50
53
  if options[:help]
51
54
  invoke :help, ['migration']
@@ -63,6 +66,7 @@ module Hanami
63
66
  > $ hanami destroy model car
64
67
  EOS
65
68
 
69
+ # @api private
66
70
  def model(name)
67
71
  if options[:help]
68
72
  invoke :help, ['model']
@@ -78,6 +82,7 @@ module Hanami
78
82
 
79
83
  > $ hanami destroy application api
80
84
  EOS
85
+ # @api private
81
86
  def application(name)
82
87
  if options[:help]
83
88
  invoke :help, ['app']
@@ -94,6 +99,7 @@ module Hanami
94
99
  > $ hanami destroy mailer forgot_password
95
100
  EOS
96
101
 
102
+ # @api private
97
103
  def mailer(name)
98
104
  if options[:help]
99
105
  invoke :help, ['mailer']
@@ -18,8 +18,6 @@ module Hanami
18
18
 
19
19
  namespace :generate
20
20
 
21
- # @since 0.6.0
22
- # @api private
23
21
  desc 'action APPLICATION_NAME CONTROLLER_NAME#ACTION_NAME', 'Generate a hanami action'
24
22
  long_desc <<-EOS
25
23
  `hanami generate action` generates an an action, view and template along with specs and a route.
@@ -37,6 +35,8 @@ module Hanami
37
35
  method_option :test, desc: 'Defines the testing Framework to be used. Default is defined through your .hanamirc file.'
38
36
  method_option :skip_view, desc: 'Skip the generation of the view. Also skips template generation.', default: false, type: :boolean
39
37
  method_option :template, desc: 'Extension to be used for the generated template. Default is defined through your .hanamirc file.'
38
+ # @since 0.6.0
39
+ # @api private
40
40
  def actions(application_name = nil, controller_and_action_name)
41
41
  if Hanami::Environment.new(options).container? && application_name.nil?
42
42
  msg = "ERROR: \"hanami generate action\" was called with arguments [\"#{controller_and_action_name}\"]\n" \
@@ -57,6 +57,7 @@ module Hanami
57
57
 
58
58
  > $ hanami generate migration do_something
59
59
  EOS
60
+ # @api private
60
61
  def migration(name)
61
62
  if options[:help]
62
63
  invoke :help, ['migration']
@@ -78,6 +79,7 @@ module Hanami
78
79
  EOS
79
80
  method_option :test, desc: 'Defines the testing Framework to be used. Default is defined through your .hanamirc file.'
80
81
  method_option :skip_migration, desc: 'Skips the generation of a migration to create the model\'s table', default: false, type: :boolean
82
+ # @api private
81
83
  def model(name)
82
84
  if options[:help]
83
85
  invoke :help, ['model']
@@ -97,6 +99,7 @@ module Hanami
97
99
  method_option :to, desc: 'Sender email', default: Hanami::Commands::Generate::Mailer::DEFAULT_TO
98
100
  method_option :from, desc: 'Sendee email', default: Hanami::Commands::Generate::Mailer::DEFAULT_FROM
99
101
  method_option :subject, desc: 'Email subject', default: Hanami::Commands::Generate::Mailer::DEFAULT_SUBJECT
102
+ # @api private
100
103
  def mailer(name)
101
104
  if options[:help]
102
105
  invoke :help, ['mailer']
@@ -116,6 +119,7 @@ module Hanami
116
119
  > $ hanami generate app reporting --application_base_url=/reports
117
120
  EOS
118
121
  method_option :application_base_url, desc: 'Base URL for the new app. If missing, then it is inferred from APPLICATION_NAME'
122
+ # @api private
119
123
  def app(application_name)
120
124
  if options[:help]
121
125
  invoke :help, ['app']
@@ -132,6 +136,7 @@ module Hanami
132
136
  > $ hanami generate secret web
133
137
 
134
138
  EOS
139
+ # @api private
135
140
  def secret(application_name = nil)
136
141
  if options[:help]
137
142
  invoke :help, ['secret']
@@ -3,16 +3,20 @@ require 'hanami/commands/command'
3
3
 
4
4
  module Hanami
5
5
  module Commands
6
+ # @api private
6
7
  class Assets
8
+ # @api private
7
9
  class Precompile < Command
8
10
  requires 'apps.assets.configurations'
9
11
 
12
+ # @api private
10
13
  def start
11
14
  Hanami::Assets.precompile(configurations)
12
15
  end
13
16
 
14
17
  private
15
18
 
19
+ # @api private
16
20
  def configurations
17
21
  requirements['apps.assets.configurations']
18
22
  end
@@ -9,6 +9,8 @@ module Hanami
9
9
  #
10
10
  # @since 0.9.0
11
11
  class Command
12
+ # @since 0.9.0
13
+ # @api private
12
14
  def self.inherited(component)
13
15
  super
14
16
 
@@ -21,15 +23,22 @@ module Hanami
21
23
  # Class level interface
22
24
  #
23
25
  # @since 0.9.0
26
+ # @api private
24
27
  module ClassMethods
28
+ # @since 0.9.0
29
+ # @api private
25
30
  def register_as(name)
26
31
  Hanami::Components.register(name, self)
27
32
  end
28
33
 
34
+ # @since 0.9.0
35
+ # @api private
29
36
  def requires(*names)
30
37
  requirements.concat(names)
31
38
  end
32
39
 
40
+ # @since 0.9.0
41
+ # @api private
33
42
  def requirements
34
43
  @_requirements
35
44
  end
@@ -38,6 +47,7 @@ module Hanami
38
47
  # @param options [Hash] Environment's options
39
48
  #
40
49
  # @since 0.9.0
50
+ # @api private
41
51
  def initialize(options)
42
52
  @environment = Hanami::Environment.new(options)
43
53
  @environment.require_project_environment
@@ -50,12 +60,15 @@ module Hanami
50
60
  private
51
61
 
52
62
  # @since 0.9.0
63
+ # @api private
53
64
  attr_reader :environment
54
65
 
55
66
  # @since 0.9.0
67
+ # @api private
56
68
  attr_reader :configuration
57
69
 
58
70
  # @since 0.9.0
71
+ # @api private
59
72
  def requirements
60
73
  Hanami::Components
61
74
  end
@@ -1,6 +1,7 @@
1
1
  require 'hanami/commands/command'
2
2
 
3
3
  module Hanami
4
+ # @api private
4
5
  module Commands
5
6
  # REPL that supports different engines.
6
7
  #
@@ -34,14 +35,18 @@ module Hanami
34
35
  'irb' => 'IRB'
35
36
  }.freeze
36
37
 
38
+ # @api private
37
39
  DEFAULT_ENGINE = ['irb'].freeze
38
40
 
39
41
  # @since 0.1.0
42
+ # @api private
40
43
  attr_reader :options
41
44
 
42
45
  # @param options [Hash] Environment's options
43
46
  #
44
47
  # @since 0.1.0
48
+ # @api private
49
+ #
45
50
  # @see Hanami::Environment#initialize
46
51
  def initialize(options)
47
52
  super(options)
@@ -50,6 +55,7 @@ module Hanami
50
55
  end
51
56
 
52
57
  # @since 0.1.0
58
+ # @api private
53
59
  def start
54
60
  prepare
55
61
  engine.start
@@ -2,10 +2,13 @@ require 'hanami/commands/command'
2
2
 
3
3
  module Hanami
4
4
  module Commands
5
+ # @api private
5
6
  class DB
7
+ # @api private
6
8
  class Apply < Command
7
9
  requires 'model.sql'
8
10
 
11
+ # @api private
9
12
  def start
10
13
  require 'hanami/model/migrator'
11
14
  Hanami::Model::Migrator.apply
@@ -3,27 +3,34 @@ require 'hanami/commands/command'
3
3
 
4
4
  module Hanami
5
5
  module Commands
6
+ # @api private
6
7
  class DB
8
+ # @api private
7
9
  class Console < Command
8
10
  requires 'model.sql'
9
11
 
12
+ # @api private
10
13
  def initialize(options, name)
11
14
  super(options)
12
15
  @name = name
13
16
  end
14
17
 
18
+ # @api private
15
19
  def start
16
20
  exec console.connection_string
17
21
  end
18
22
 
19
23
  private
20
24
 
25
+ # @api private
21
26
  attr_reader :name
22
27
 
28
+ # @api private
23
29
  def configuration
24
30
  Hanami::Components['model.configuration']
25
31
  end
26
32
 
33
+ # @api private
27
34
  def console
28
35
  require 'hanami/model/sql/console'
29
36
  Hanami::Model::Sql::Console.new(configuration.url)
@@ -2,10 +2,13 @@ require 'hanami/commands/command'
2
2
 
3
3
  module Hanami
4
4
  module Commands
5
+ # @api private
5
6
  class DB
7
+ # @api private
6
8
  class Create < Command
7
9
  requires 'model.configuration'
8
10
 
11
+ # @api private
9
12
  def start
10
13
  require 'hanami/model/migrator'
11
14
  Hanami::Model::Migrator.create
@@ -2,10 +2,13 @@ require 'hanami/commands/command'
2
2
 
3
3
  module Hanami
4
4
  module Commands
5
+ # @api private
5
6
  class DB
7
+ # @api private
6
8
  class Drop < Command
7
9
  requires 'model.configuration'
8
10
 
11
+ # @api private
9
12
  def start
10
13
  require 'hanami/model/migrator'
11
14
  Hanami::Model::Migrator.drop
@@ -2,15 +2,19 @@ require 'hanami/commands/command'
2
2
 
3
3
  module Hanami
4
4
  module Commands
5
+ # @api private
5
6
  class DB
7
+ # @api private
6
8
  class Migrate < Command
7
9
  requires 'model.sql'
8
10
 
11
+ # @api private
9
12
  def initialize(options, version)
10
13
  super(options)
11
14
  @version = version
12
15
  end
13
16
 
17
+ # @api private
14
18
  def start
15
19
  require 'hanami/model/migrator'
16
20
  Hanami::Model::Migrator.migrate(version: version)
@@ -18,6 +22,7 @@ module Hanami
18
22
 
19
23
  private
20
24
 
25
+ # @api private
21
26
  attr_reader :version
22
27
  end
23
28
  end
@@ -2,10 +2,13 @@ require 'hanami/commands/command'
2
2
 
3
3
  module Hanami
4
4
  module Commands
5
+ # @api private
5
6
  class DB
7
+ # @api private
6
8
  class Prepare < Command
7
9
  requires 'model.sql'
8
10
 
11
+ # @api private
9
12
  def start
10
13
  require 'hanami/model/migrator'
11
14
  Hanami::Model::Migrator.prepare
@@ -2,10 +2,13 @@ require 'hanami/commands/command'
2
2
 
3
3
  module Hanami
4
4
  module Commands
5
+ # @api private
5
6
  class DB
7
+ # @api private
6
8
  class Version < Command
7
9
  requires 'model.configuration'
8
10
 
11
+ # @api private
9
12
  def start
10
13
  require 'hanami/model/migrator'
11
14
  puts Hanami::Model::Migrator.version
@@ -8,13 +8,19 @@ require 'hanami/utils/string'
8
8
 
9
9
  module Hanami
10
10
  module Commands
11
+ # @api private
11
12
  class Generate
13
+ # @api private
12
14
  class Abstract < Commands::Command
13
15
 
14
16
  include Hanami::Generators::Generatable
15
17
 
16
- attr_reader :options, :target_path
18
+ # @api private
19
+ attr_reader :options
20
+ # @api private
21
+ attr_reader :target_path
17
22
 
23
+ # @api private
18
24
  def initialize(options)
19
25
  super
20
26
 
@@ -24,6 +30,7 @@ module Hanami
24
30
  @target_path = Hanami.root
25
31
  end
26
32
 
33
+ # @api private
27
34
  def template_source_path
28
35
  generator = self.class.name.split('::').last.downcase
29
36
  Pathname.new(::File.dirname(__FILE__) + "/../../generators/#{generator}/").realpath
@@ -31,22 +38,27 @@ module Hanami
31
38
 
32
39
  private
33
40
 
41
+ # @api private
34
42
  def test_framework
35
43
  @test_framework ||= Hanami::Generators::TestFramework.new(hanamirc, options[:test])
36
44
  end
37
45
 
46
+ # @api private
38
47
  def hanamirc_options
39
48
  hanamirc.options
40
49
  end
41
50
 
51
+ # @api private
42
52
  def hanamirc
43
53
  @hanamirc ||= Hanamirc.new(target_path)
44
54
  end
45
55
 
56
+ # @api private
46
57
  def template_engine
47
58
  @template_engine ||= Hanami::Generators::TemplateEngine.new(hanamirc, options[:template])
48
59
  end
49
60
 
61
+ # @api private
50
62
  def assert_options!
51
63
  if options.nil?
52
64
  raise ArgumentError.new('options must not be nil')
@@ -4,7 +4,9 @@ require 'hanami/utils/blank'
4
4
 
5
5
  module Hanami
6
6
  module Commands
7
+ # @api private
7
8
  class Generate
9
+ # @api private
8
10
  class Action < Abstract
9
11
 
10
12
  # @since 0.8.0
@@ -59,6 +61,7 @@ module Hanami
59
61
  'Edit' => '/:id/edit',
60
62
  }.freeze
61
63
 
64
+ # @api private
62
65
  def initialize(options, application_name, controller_and_action_name)
63
66
  super(options)
64
67
  if !environment.container?
@@ -86,6 +89,7 @@ module Hanami
86
89
  assert_http_method!
87
90
  end
88
91
 
92
+ # @api private
89
93
  def map_templates
90
94
  add_mapping("action_spec.#{test_framework.framework}.tt", action_spec_path)
91
95
 
@@ -99,6 +103,7 @@ module Hanami
99
103
  end
100
104
  end
101
105
 
106
+ # @api private
102
107
  def post_process_templates
103
108
  generate_route
104
109
  end
@@ -116,6 +121,7 @@ module Hanami
116
121
  }
117
122
  end
118
123
 
124
+ # @api private
119
125
  def destroy
120
126
  generator.gsub_file(routes_path, /^.*#{@controller_and_action_name}.*\n/, '', verbose: false)
121
127
  super
@@ -132,6 +138,7 @@ module Hanami
132
138
  generator.prepend_after_leading_comments(routes_path, "#{ http_method } '#{ route_url }', to: '#{ route_endpoint }'\n")
133
139
  end
134
140
 
141
+ # @api private
135
142
  def skip_view?
136
143
  options.fetch(:skip_view, false)
137
144
  end
@@ -219,6 +226,7 @@ module Hanami
219
226
  end
220
227
  end
221
228
 
229
+ # @api private
222
230
  def routes_path
223
231
  if environment.container?
224
232
  application_path.join('config', 'routes.rb')
@@ -230,6 +238,7 @@ module Hanami
230
238
  # The directory of the application
231
239
  # ./app for 'app' architecture
232
240
  # ./apps/APPLICATION_NAME for 'container'
241
+ # @api private
233
242
  def application_path
234
243
  if environment.container?
235
244
  applications_path.join(application_name_as_snake_case)
@@ -239,42 +248,52 @@ module Hanami
239
248
  end
240
249
 
241
250
  # The parent dir of the application directory.
251
+ # @api private
242
252
  def applications_path
243
253
  Pathname.new('apps')
244
254
  end
245
255
 
256
+ # @api private
246
257
  def view_path
247
258
  application_path.join('views', *@controller_directory, "#{@action_name}.rb")
248
259
  end
249
260
 
261
+ # @api private
250
262
  def view_spec_path
251
263
  spec_root.join('views', *@controller_directory, "#{@action_name}_spec.rb")
252
264
  end
253
265
 
266
+ # @api private
254
267
  def template_path
255
268
  application_path.join('templates', *@controller_directory, "#{@action_name}.html.#{template_engine.name}")
256
269
  end
257
270
 
271
+ # @api private
258
272
  def action_path
259
273
  application_path.join('controllers', *@controller_directory, "#{@action_name}.rb")
260
274
  end
261
275
 
276
+ # @api private
262
277
  def action_spec_path
263
278
  spec_root.join('controllers', *@controller_directory, "#{@action_name}_spec.rb")
264
279
  end
265
280
 
281
+ # @api private
266
282
  def spec_root
267
283
  Pathname.new('spec').join(app_base_dir)
268
284
  end
269
285
 
286
+ # @api private
270
287
  def relative_action_path
271
288
  relative_base_path.join(application_path, 'controllers', *@controller_directory, @action_name)
272
289
  end
273
290
 
291
+ # @api private
274
292
  def relative_view_path
275
293
  relative_base_path.join(application_path, 'views', *@controller_directory, @action_name)
276
294
  end
277
295
 
296
+ # @api private
278
297
  def relative_base_path
279
298
  nestings = [UP_DIRECTORY] * @controller_name.count(CONTROLLER_SEPARATOR)
280
299
  nestings << UP_DIRECTORY if environment.container?
@@ -284,6 +303,7 @@ module Hanami
284
303
  )
285
304
  end
286
305
 
306
+ # @api private
287
307
  def app_base_dir
288
308
  if environment.container?
289
309
  application_name_as_snake_case
@@ -292,6 +312,7 @@ module Hanami
292
312
  end
293
313
  end
294
314
 
315
+ # @api private
295
316
  def application_name_as_snake_case
296
317
  @application_name.gsub(/(.)([A-Z])/,'\1_\2').downcase
297
318
  end