hanami 1.0.0.beta2 → 1.0.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
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