hanami 1.0.0 → 1.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/FEATURES.md +12 -0
  4. data/README.md +3 -0
  5. data/bin/hanami +3 -3
  6. data/hanami.gemspec +9 -9
  7. data/lib/hanami.rb +27 -0
  8. data/lib/hanami/action/routing_helpers.rb +1 -1
  9. data/lib/hanami/application_configuration.rb +0 -8
  10. data/lib/hanami/application_name.rb +1 -3
  11. data/lib/hanami/application_namespace.rb +1 -1
  12. data/lib/hanami/cli/commands.rb +101 -0
  13. data/lib/hanami/cli/commands/assets.rb +16 -0
  14. data/lib/hanami/cli/commands/assets/precompile.rb +42 -0
  15. data/lib/hanami/cli/commands/command.rb +180 -0
  16. data/lib/hanami/cli/commands/console.rb +95 -0
  17. data/lib/hanami/cli/commands/db.rb +30 -0
  18. data/lib/hanami/cli/commands/db/apply.rb +32 -0
  19. data/lib/hanami/cli/commands/db/console.rb +44 -0
  20. data/lib/hanami/cli/commands/db/create.rb +32 -0
  21. data/lib/hanami/cli/commands/db/drop.rb +32 -0
  22. data/lib/hanami/cli/commands/db/migrate.rb +39 -0
  23. data/lib/hanami/cli/commands/db/prepare.rb +32 -0
  24. data/lib/hanami/cli/commands/db/version.rb +32 -0
  25. data/lib/hanami/cli/commands/destroy.rb +26 -0
  26. data/lib/hanami/cli/commands/destroy/action.rb +131 -0
  27. data/lib/hanami/cli/commands/destroy/app.rb +159 -0
  28. data/lib/hanami/cli/commands/destroy/mailer.rb +74 -0
  29. data/lib/hanami/cli/commands/destroy/migration.rb +51 -0
  30. data/lib/hanami/cli/commands/destroy/model.rb +84 -0
  31. data/lib/hanami/cli/commands/generate.rb +28 -0
  32. data/lib/hanami/cli/commands/generate/action.rb +224 -0
  33. data/lib/hanami/cli/commands/generate/action/action.erb +8 -0
  34. data/lib/hanami/cli/commands/generate/action/action_spec.minitest.erb +11 -0
  35. data/lib/hanami/{generators/action/action_spec.rspec.tt → cli/commands/generate/action/action_spec.rspec.erb} +1 -3
  36. data/lib/hanami/cli/commands/generate/action/action_without_view.erb +9 -0
  37. data/lib/hanami/cli/commands/generate/action/view.erb +5 -0
  38. data/lib/hanami/cli/commands/generate/action/view_spec.minitest.erb +15 -0
  39. data/lib/hanami/{generators/action/view_spec.rspec.tt → cli/commands/generate/action/view_spec.rspec.erb} +2 -4
  40. data/lib/hanami/cli/commands/generate/app.rb +231 -0
  41. data/lib/hanami/{generators/app/application.rb.tt → cli/commands/generate/app/application.erb} +6 -6
  42. data/lib/hanami/{generators → cli/commands/generate}/app/favicon.ico +0 -0
  43. data/lib/hanami/{generators/action/template.tt → cli/commands/generate/app/gitkeep.erb} +0 -0
  44. data/lib/hanami/cli/commands/generate/app/layout.erb +7 -0
  45. data/lib/hanami/cli/commands/generate/app/layout_spec.minitest.erb +11 -0
  46. data/lib/hanami/cli/commands/generate/app/layout_spec.rspec.erb +11 -0
  47. data/lib/hanami/{generators/app/config/routes.rb.tt → cli/commands/generate/app/routes.erb} +0 -0
  48. data/lib/hanami/{generators/app/templates/application.html.erb.tt → cli/commands/generate/app/template.erb.erb} +1 -1
  49. data/lib/hanami/{generators/app/templates/application.html.haml.tt → cli/commands/generate/app/template.haml.erb} +1 -1
  50. data/lib/hanami/{generators/app/templates/application.html.slim.tt → cli/commands/generate/app/template.slim.erb} +1 -1
  51. data/lib/hanami/cli/commands/generate/mailer.rb +94 -0
  52. data/lib/hanami/cli/commands/generate/mailer/mailer.erb +7 -0
  53. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.minitest.erb +7 -0
  54. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.rspec.erb +5 -0
  55. data/lib/hanami/cli/commands/generate/migration.rb +41 -0
  56. data/lib/hanami/{generators/migration/migration.rb.tt → cli/commands/generate/migration/migration.erb} +0 -0
  57. data/lib/hanami/cli/commands/generate/model.rb +98 -0
  58. data/lib/hanami/cli/commands/generate/model/entity.erb +2 -0
  59. data/lib/hanami/cli/commands/generate/model/entity_spec.minitest.erb +5 -0
  60. data/lib/hanami/cli/commands/generate/model/entity_spec.rspec.erb +3 -0
  61. data/lib/hanami/{generators/model/migration.rb.tt → cli/commands/generate/model/migration.erb} +1 -1
  62. data/lib/hanami/cli/commands/generate/model/repository.erb +2 -0
  63. data/lib/hanami/cli/commands/generate/model/repository_spec.minitest.erb +5 -0
  64. data/lib/hanami/cli/commands/generate/model/repository_spec.rspec.erb +3 -0
  65. data/lib/hanami/cli/commands/generate/secret.rb +48 -0
  66. data/lib/hanami/cli/commands/new.rb +575 -0
  67. data/lib/hanami/{generators/application/container/.env.development.tt → cli/commands/new/.env.development.erb} +1 -1
  68. data/lib/hanami/{generators/application/container/.env.test.tt → cli/commands/new/.env.test.erb} +1 -1
  69. data/lib/hanami/{generators/app/config/initializers/.gitkeep → cli/commands/new/.gitkeep.erb} +0 -0
  70. data/lib/hanami/cli/commands/new/Gemfile.erb +57 -0
  71. data/lib/hanami/cli/commands/new/README.md.erb +35 -0
  72. data/lib/hanami/{generators/application/container/config.ru.tt → cli/commands/new/config.ru.erb} +0 -0
  73. data/lib/hanami/{generators/application/container/config/boot.rb.tt → cli/commands/new/config/boot.erb} +0 -0
  74. data/lib/hanami/{generators/application/container/config/environment.rb.tt → cli/commands/new/config/environment.erb} +8 -8
  75. data/lib/hanami/{generators/application/container/gitignore.tt → cli/commands/new/gitignore.erb} +0 -0
  76. data/lib/hanami/{generators/application/container/gitignore_with_sqlite.tt → cli/commands/new/gitignore_with_sqlite.erb} +0 -0
  77. data/lib/hanami/cli/commands/new/hanamirc.erb +3 -0
  78. data/lib/hanami/cli/commands/new/lib/project.erb +2 -0
  79. data/lib/hanami/{generators/application/container/Rakefile.minitest.tt → cli/commands/new/minitest/Rakefile.erb} +0 -0
  80. data/lib/hanami/{generators/application/container/features_helper.rb.minitest.tt → cli/commands/new/minitest/features_helper.erb} +0 -0
  81. data/lib/hanami/{generators/application/container/spec_helper.rb.minitest.tt → cli/commands/new/minitest/spec_helper.erb} +0 -0
  82. data/lib/hanami/{generators/application/container/Rakefile.rspec.tt → cli/commands/new/rspec/Rakefile.erb} +0 -0
  83. data/lib/hanami/{generators/application/container/capybara.rb.rspec.tt → cli/commands/new/rspec/capybara.erb} +0 -0
  84. data/lib/hanami/{generators/application/container/features_helper.rb.rspec.tt → cli/commands/new/rspec/features_helper.erb} +0 -0
  85. data/lib/hanami/{generators/application/container/rspec.rspec.tt → cli/commands/new/rspec/rspec.erb} +0 -0
  86. data/lib/hanami/{generators/application/container/spec_helper.rb.rspec.tt → cli/commands/new/rspec/spec_helper.erb} +0 -0
  87. data/lib/hanami/{generators/application/container/.gitignore → cli/commands/new/schema.sql.erb} +0 -0
  88. data/lib/hanami/cli/commands/project.rb +421 -0
  89. data/lib/hanami/cli/commands/routes.rb +21 -0
  90. data/lib/hanami/cli/commands/server.rb +39 -0
  91. data/lib/hanami/cli/commands/templates.rb +31 -0
  92. data/lib/hanami/cli/commands/version.rb +19 -0
  93. data/lib/hanami/common_logger.rb +14 -4
  94. data/lib/hanami/components.rb +39 -1
  95. data/lib/hanami/components/components.rb +36 -1
  96. data/lib/hanami/config/sessions.rb +1 -1
  97. data/lib/hanami/environment.rb +20 -50
  98. data/lib/hanami/hanamirc.rb +7 -30
  99. data/lib/hanami/middleware.rb +0 -26
  100. data/lib/hanami/static.rb +1 -1
  101. data/lib/hanami/templates/welcome.html.erb +1 -1
  102. data/lib/hanami/version.rb +1 -1
  103. data/lib/hanami/welcome.rb +1 -11
  104. metadata +125 -135
  105. data/lib/hanami/cli.rb +0 -154
  106. data/lib/hanami/cli_base.rb +0 -49
  107. data/lib/hanami/cli_sub_commands/assets.rb +0 -24
  108. data/lib/hanami/cli_sub_commands/db.rb +0 -138
  109. data/lib/hanami/cli_sub_commands/destroy.rb +0 -115
  110. data/lib/hanami/cli_sub_commands/generate.rb +0 -150
  111. data/lib/hanami/commands/apps.rb +0 -4
  112. data/lib/hanami/commands/assets/precompile.rb +0 -26
  113. data/lib/hanami/commands/command.rb +0 -77
  114. data/lib/hanami/commands/console.rb +0 -107
  115. data/lib/hanami/commands/db/apply.rb +0 -19
  116. data/lib/hanami/commands/db/console.rb +0 -41
  117. data/lib/hanami/commands/db/create.rb +0 -19
  118. data/lib/hanami/commands/db/drop.rb +0 -19
  119. data/lib/hanami/commands/db/migrate.rb +0 -30
  120. data/lib/hanami/commands/db/prepare.rb +0 -19
  121. data/lib/hanami/commands/db/version.rb +0 -19
  122. data/lib/hanami/commands/generate/abstract.rb +0 -76
  123. data/lib/hanami/commands/generate/action.rb +0 -322
  124. data/lib/hanami/commands/generate/app.rb +0 -154
  125. data/lib/hanami/commands/generate/mailer.rb +0 -131
  126. data/lib/hanami/commands/generate/migration.rb +0 -75
  127. data/lib/hanami/commands/generate/model.rb +0 -132
  128. data/lib/hanami/commands/generate/secret_token.rb +0 -37
  129. data/lib/hanami/commands/new/abstract.rb +0 -178
  130. data/lib/hanami/commands/new/app.rb +0 -129
  131. data/lib/hanami/commands/new/container.rb +0 -119
  132. data/lib/hanami/commands/routes.rb +0 -26
  133. data/lib/hanami/commands/server.rb +0 -32
  134. data/lib/hanami/generators/action/action.rb.tt +0 -8
  135. data/lib/hanami/generators/action/action_spec.minitest.tt +0 -12
  136. data/lib/hanami/generators/action/action_without_view.rb.tt +0 -9
  137. data/lib/hanami/generators/action/view.rb.tt +0 -5
  138. data/lib/hanami/generators/action/view_spec.minitest.tt +0 -16
  139. data/lib/hanami/generators/app/.gitkeep.tt +0 -1
  140. data/lib/hanami/generators/app/views/application_layout.rb.tt +0 -7
  141. data/lib/hanami/generators/application/container/.gitkeep +0 -1
  142. data/lib/hanami/generators/application/container/Gemfile.tt +0 -56
  143. data/lib/hanami/generators/application/container/config/initializers/.gitkeep +0 -0
  144. data/lib/hanami/generators/application/container/db/.gitkeep +0 -1
  145. data/lib/hanami/generators/application/container/hanamirc.tt +0 -4
  146. data/lib/hanami/generators/application/container/lib/chirp/entities/.gitkeep +0 -1
  147. data/lib/hanami/generators/application/container/lib/chirp/mailers/.gitkeep +0 -0
  148. data/lib/hanami/generators/application/container/lib/chirp/mailers/templates/.gitkeep +0 -0
  149. data/lib/hanami/generators/application/container/lib/chirp/repositories/.gitkeep +0 -1
  150. data/lib/hanami/generators/application/container/lib/project.rb.tt +0 -2
  151. data/lib/hanami/generators/application/container/schema.sql.tt +0 -0
  152. data/lib/hanami/generators/database_config.rb +0 -114
  153. data/lib/hanami/generators/generatable.rb +0 -69
  154. data/lib/hanami/generators/generator.rb +0 -52
  155. data/lib/hanami/generators/mailer/mailer.rb.tt +0 -7
  156. data/lib/hanami/generators/mailer/mailer_spec.rb.minitest.tt +0 -7
  157. data/lib/hanami/generators/mailer/mailer_spec.rb.rspec.tt +0 -5
  158. data/lib/hanami/generators/mailer/template.html.tt +0 -0
  159. data/lib/hanami/generators/mailer/template.txt.tt +0 -0
  160. data/lib/hanami/generators/model/entity.rb.tt +0 -2
  161. data/lib/hanami/generators/model/entity_spec.minitest.tt +0 -5
  162. data/lib/hanami/generators/model/entity_spec.rspec.tt +0 -3
  163. data/lib/hanami/generators/model/repository.rb.tt +0 -2
  164. data/lib/hanami/generators/model/repository_spec.minitest.tt +0 -5
  165. data/lib/hanami/generators/model/repository_spec.rspec.tt +0 -3
  166. data/lib/hanami/generators/template_engine.rb +0 -44
  167. data/lib/hanami/generators/test_framework.rb +0 -55
@@ -1,19 +0,0 @@
1
- require 'hanami/commands/command'
2
-
3
- module Hanami
4
- module Commands
5
- # @api private
6
- class DB
7
- # @api private
8
- class Drop < Command
9
- requires 'model.configuration'
10
-
11
- # @api private
12
- def start
13
- require 'hanami/model/migrator'
14
- Hanami::Model::Migrator.drop
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,30 +0,0 @@
1
- require 'hanami/commands/command'
2
-
3
- module Hanami
4
- module Commands
5
- # @api private
6
- class DB
7
- # @api private
8
- class Migrate < Command
9
- requires 'model.sql'
10
-
11
- # @api private
12
- def initialize(options, version)
13
- super(options)
14
- @version = version
15
- end
16
-
17
- # @api private
18
- def start
19
- require 'hanami/model/migrator'
20
- Hanami::Model::Migrator.migrate(version: version)
21
- end
22
-
23
- private
24
-
25
- # @api private
26
- attr_reader :version
27
- end
28
- end
29
- end
30
- end
@@ -1,19 +0,0 @@
1
- require 'hanami/commands/command'
2
-
3
- module Hanami
4
- module Commands
5
- # @api private
6
- class DB
7
- # @api private
8
- class Prepare < Command
9
- requires 'model.sql'
10
-
11
- # @api private
12
- def start
13
- require 'hanami/model/migrator'
14
- Hanami::Model::Migrator.prepare
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,19 +0,0 @@
1
- require 'hanami/commands/command'
2
-
3
- module Hanami
4
- module Commands
5
- # @api private
6
- class DB
7
- # @api private
8
- class Version < Command
9
- requires 'model.configuration'
10
-
11
- # @api private
12
- def start
13
- require 'hanami/model/migrator'
14
- puts Hanami::Model::Migrator.version
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,76 +0,0 @@
1
- require 'hanami/environment'
2
- require 'hanami/commands/command'
3
- require 'hanami/generators/generatable'
4
- require 'hanami/generators/test_framework'
5
- require 'hanami/generators/template_engine'
6
- require 'hanami/version'
7
- require 'hanami/utils/string'
8
-
9
- module Hanami
10
- module Commands
11
- # @api private
12
- class Generate
13
- # @api private
14
- class Abstract < Commands::Command
15
-
16
- include Hanami::Generators::Generatable
17
-
18
- # @api private
19
- attr_reader :options
20
- # @api private
21
- attr_reader :target_path
22
-
23
- # @api private
24
- def initialize(options)
25
- super
26
-
27
- @options = Hanami::Utils::Hash.new(options).symbolize!
28
- assert_options!
29
-
30
- @target_path = Hanami.root
31
- end
32
-
33
- # @api private
34
- def template_source_path
35
- generator = self.class.name.split('::').last.downcase
36
- Pathname.new(::File.dirname(__FILE__) + "/../../generators/#{generator}/").realpath
37
- end
38
-
39
- private
40
-
41
- # @api private
42
- def test_framework
43
- @test_framework ||= Hanami::Generators::TestFramework.new(hanamirc, options[:test])
44
- end
45
-
46
- # @api private
47
- def hanamirc_options
48
- hanamirc.options
49
- end
50
-
51
- # @api private
52
- def hanamirc
53
- @hanamirc ||= Hanamirc.new(target_path)
54
- end
55
-
56
- # @api private
57
- def template_engine
58
- @template_engine ||= Hanami::Generators::TemplateEngine.new(hanamirc, options[:template])
59
- end
60
-
61
- # @api private
62
- def assert_options!
63
- if options.nil?
64
- raise ArgumentError.new('options must not be nil')
65
- end
66
- end
67
-
68
- # @since 1.0.0
69
- # @api private
70
- def project_name
71
- Utils::String.new(Hanami::Environment.new.project_name).underscore
72
- end
73
- end
74
- end
75
- end
76
- end
@@ -1,322 +0,0 @@
1
- require 'hanami/commands/generate/abstract'
2
- require 'hanami/routing/route'
3
- require 'hanami/utils/blank'
4
-
5
- module Hanami
6
- module Commands
7
- # @api private
8
- class Generate
9
- # @api private
10
- class Action < Abstract
11
-
12
- # @since 0.8.0
13
- # @api private
14
- ACTION_SEPARATOR_MATCHER = /[\/,#]/
15
-
16
- # @since 0.8.0
17
- # @api private
18
- CONTROLLER_SEPARATOR = Utils::String::UNDERSCORE_SEPARATOR
19
-
20
- # @since 0.5.0
21
- # @api private
22
- ROUTE_ENDPOINT_SEPARATOR = '#'.freeze
23
-
24
- # @since 0.5.0
25
- # @api private
26
- QUOTED_NAME = /(\"|\'|\\)/
27
-
28
- # @since 0.8.0
29
- # @api private
30
- UP_DIRECTORY = '..'.freeze
31
-
32
- # @since 0.8.0
33
- # @api private
34
- DIRECTORY_TEST_NESTING_LEVELS = 3
35
-
36
- # Default HTTP method used when generating an action.
37
- #
38
- # @since 0.5.0
39
- # @api private
40
- DEFAULT_HTTP_METHOD = 'GET'.freeze
41
-
42
- # HTTP methods used when generating resourceful actions.
43
- #
44
- # @since 0.6.0
45
- # @api private
46
- RESOURCEFUL_HTTP_METHODS = {
47
- 'Create' => 'POST',
48
- 'Update' => 'PATCH',
49
- 'Destroy' => 'DELETE'
50
- }.freeze
51
-
52
- # For resourceful actions, what to add to the end of the base URL
53
- #
54
- # @since 0.6.0
55
- # @api private
56
- RESOURCEFUL_ROUTE_URL_SUFFIXES = {
57
- 'Show' => '/:id',
58
- 'Update' => '/:id',
59
- 'Destroy' => '/:id',
60
- 'New' => '/new',
61
- 'Edit' => '/:id/edit',
62
- }.freeze
63
-
64
- # @api private
65
- def initialize(options, application_name, controller_and_action_name)
66
- super(options)
67
- if !environment.container?
68
- application_name = File.basename(Dir.pwd)
69
- end
70
-
71
- @controller_and_action_name = Utils::String.new(controller_and_action_name).underscore.gsub(QUOTED_NAME, '')
72
-
73
- *controller_name, @action_name = @controller_and_action_name.split(ACTION_SEPARATOR_MATCHER)
74
-
75
- @application_name = Utils::String.new(application_name).classify
76
-
77
- @controller_directory = controller_name
78
- @controller_name = controller_name.join(CONTROLLER_SEPARATOR)
79
-
80
- @controller_class_name = Utils::String.new(@controller_name).classify
81
- @action_class_name = Utils::String.new(@action_name).classify
82
-
83
- @controller_url = @controller_name # FIXME Extract a new class: Utils::Url to handle conversion from paths or this naming
84
-
85
- assert_application_name!
86
- assert_controller_class_name!
87
- assert_action_name!
88
- assert_url!
89
- assert_http_method!
90
- end
91
-
92
- # @api private
93
- def map_templates
94
- add_mapping("action_spec.#{test_framework.framework}.tt", action_spec_path)
95
-
96
- if skip_view?
97
- add_mapping('action_without_view.rb.tt', action_path)
98
- else
99
- add_mapping('action.rb.tt', action_path)
100
- add_mapping('view.rb.tt', view_path)
101
- add_mapping('template.tt', template_path)
102
- add_mapping("view_spec.#{test_framework.framework}.tt", view_spec_path)
103
- end
104
- end
105
-
106
- # @api private
107
- def post_process_templates
108
- generate_route
109
- end
110
-
111
- # @since 0.5.0
112
- # @api private
113
- def template_options
114
- {
115
- app: @application_name,
116
- controller: @controller_class_name,
117
- action: @action_class_name,
118
- relative_action_path: relative_action_path,
119
- relative_view_path: relative_view_path,
120
- template_path: template_path,
121
- }
122
- end
123
-
124
- # @api private
125
- def destroy
126
- generator.gsub_file(routes_path, /^.*#{@controller_and_action_name}.*\n/, '', verbose: false)
127
- super
128
- end
129
-
130
- private
131
-
132
- # @since 0.5.0
133
- # @api private
134
- def generate_route
135
- routes_path.dirname.mkpath
136
- FileUtils.touch(routes_path)
137
-
138
- generator.prepend_after_leading_comments(routes_path, "#{ http_method } '#{ route_url }', to: '#{ route_endpoint }'\n")
139
- end
140
-
141
- # @api private
142
- def skip_view?
143
- options.fetch(:skip_view, false)
144
- end
145
-
146
- # @since 0.5.0
147
- # @api private
148
- def http_method
149
- options.fetch(:method, resourceful_http_method).downcase
150
- end
151
-
152
- # @since 0.6.0
153
- # @api private
154
- def resourceful_http_method
155
- RESOURCEFUL_HTTP_METHODS.fetch(@action_class_name, DEFAULT_HTTP_METHOD)
156
- end
157
-
158
- # @since 0.5.0
159
- # @api private
160
- def route_url
161
- options.fetch(:url, "/#{ @controller_url }#{ resourceful_route_url_suffix }")
162
- end
163
-
164
- # @since 0.6.0
165
- # @api private
166
- def resourceful_route_url_suffix
167
- RESOURCEFUL_ROUTE_URL_SUFFIXES.fetch(@action_class_name, "")
168
- end
169
-
170
- # @since 0.5.0
171
- # @api private
172
- def route_endpoint
173
- "#{ @controller_url }#{ ROUTE_ENDPOINT_SEPARATOR }#{ @action_class_name }".downcase
174
- end
175
-
176
- # @since 0.5.0
177
- # @api private
178
- def known_application_names
179
- applications_path.children.map do |app|
180
- ::File.basename(app)
181
- end
182
- end
183
-
184
- # @since 0.5.0
185
- # @api private
186
- def assert_controller_class_name!
187
- if argument_blank?(@controller_class_name)
188
- raise ArgumentError.new("Unknown controller, please add controllers name with this syntax controller_name#action_name")
189
- end
190
- end
191
-
192
- # @since 0.5.0
193
- # @api private
194
- def assert_action_name!
195
- if argument_blank?(@action_class_name)
196
- raise ArgumentError.new("Unknown action, please add actions name with this syntax controller_name#action_name")
197
- end
198
- end
199
-
200
- # @since 0.5.0
201
- # @api private
202
- def assert_application_name!
203
- return unless environment.container?
204
- if argument_blank?(@application_name) || !application_path.exist?
205
- existing_apps = known_application_names.map { |name| "`#{name}'" }.join(' ')
206
- warn "`#{@application_name.downcase}' is not a valid APPLICATION_NAME. Please specify one of: #{existing_apps}"
207
- exit(1)
208
- end
209
- end
210
-
211
- # @since 0.9.0
212
- # @api private
213
- def assert_url!
214
- if options.key?(:url) && Hanami::Utils::Blank.blank?(options[:url])
215
- warn "`#{options[:url]}' is not a valid URL"
216
- exit(1)
217
- end
218
- end
219
-
220
- # @since 0.5.0
221
- # @api private
222
- def assert_http_method!
223
- if !Hanami::Routing::Route::VALID_HTTP_VERBS.include?(http_method.upcase)
224
- warn "`#{http_method.upcase}' is not a valid HTTP method. Please use one of: #{Hanami::Routing::Route::VALID_HTTP_VERBS.map { |verb| "`#{verb}'" }.join(" ")}"
225
- exit(1)
226
- end
227
- end
228
-
229
- # @api private
230
- def routes_path
231
- if environment.container?
232
- application_path.join('config', 'routes.rb')
233
- else
234
- application_path.join(UP_DIRECTORY, 'config', 'routes.rb')
235
- end
236
- end
237
-
238
- # The directory of the application
239
- # ./app for 'app' architecture
240
- # ./apps/APPLICATION_NAME for 'container'
241
- # @api private
242
- def application_path
243
- if environment.container?
244
- applications_path.join(application_name_as_snake_case)
245
- else
246
- Pathname.new('app')
247
- end
248
- end
249
-
250
- # The parent dir of the application directory.
251
- # @api private
252
- def applications_path
253
- Pathname.new('apps')
254
- end
255
-
256
- # @api private
257
- def view_path
258
- application_path.join('views', *@controller_directory, "#{@action_name}.rb")
259
- end
260
-
261
- # @api private
262
- def view_spec_path
263
- spec_root.join('views', *@controller_directory, "#{@action_name}_spec.rb")
264
- end
265
-
266
- # @api private
267
- def template_path
268
- application_path.join('templates', *@controller_directory, "#{@action_name}.html.#{template_engine.name}")
269
- end
270
-
271
- # @api private
272
- def action_path
273
- application_path.join('controllers', *@controller_directory, "#{@action_name}.rb")
274
- end
275
-
276
- # @api private
277
- def action_spec_path
278
- spec_root.join('controllers', *@controller_directory, "#{@action_name}_spec.rb")
279
- end
280
-
281
- # @api private
282
- def spec_root
283
- Pathname.new('spec').join(app_base_dir)
284
- end
285
-
286
- # @api private
287
- def relative_action_path
288
- relative_base_path.join(application_path, 'controllers', *@controller_directory, @action_name)
289
- end
290
-
291
- # @api private
292
- def relative_view_path
293
- relative_base_path.join(application_path, 'views', *@controller_directory, @action_name)
294
- end
295
-
296
- # @api private
297
- def relative_base_path
298
- nestings = [UP_DIRECTORY] * @controller_name.count(CONTROLLER_SEPARATOR)
299
- nestings << UP_DIRECTORY if environment.container?
300
-
301
- Pathname.new('.').join(
302
- *([UP_DIRECTORY] * DIRECTORY_TEST_NESTING_LEVELS), *nestings
303
- )
304
- end
305
-
306
- # @api private
307
- def app_base_dir
308
- if environment.container?
309
- application_name_as_snake_case
310
- else
311
- ''
312
- end
313
- end
314
-
315
- # @api private
316
- def application_name_as_snake_case
317
- @application_name.gsub(/(.)([A-Z])/,'\1_\2').downcase
318
- end
319
- end
320
- end
321
- end
322
- end