hanami 1.3.5 → 2.0.0.alpha1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +51 -41
- data/FEATURES.md +2 -12
- data/LICENSE.md +1 -1
- data/README.md +5 -8
- data/bin/hanami +6 -4
- data/hanami.gemspec +24 -28
- data/lib/hanami/application.rb +44 -176
- data/lib/hanami/boot.rb +6 -0
- data/lib/hanami/cli/commands/command.rb +21 -29
- data/lib/hanami/cli/commands/server.rb +63 -14
- data/lib/hanami/cli/commands.rb +5 -42
- data/lib/hanami/configuration/cookies.rb +24 -0
- data/lib/hanami/configuration/middleware.rb +8 -28
- data/lib/hanami/configuration/security.rb +141 -0
- data/lib/hanami/configuration/sessions.rb +50 -0
- data/lib/hanami/configuration.rb +181 -191
- data/lib/hanami/container.rb +107 -0
- data/lib/hanami/frameworks.rb +24 -18
- data/lib/hanami/routes.rb +17 -205
- data/lib/hanami/server.rb +5 -69
- data/lib/hanami/version.rb +3 -1
- data/lib/hanami.rb +39 -243
- metadata +36 -233
- data/lib/hanami/action/csrf_protection.rb +0 -211
- data/lib/hanami/action/routing_helpers.rb +0 -40
- data/lib/hanami/app.rb +0 -96
- data/lib/hanami/application_configuration.rb +0 -1495
- data/lib/hanami/application_name.rb +0 -108
- data/lib/hanami/application_namespace.rb +0 -14
- data/lib/hanami/assets/asset.rb +0 -72
- data/lib/hanami/assets/static.rb +0 -102
- data/lib/hanami/cli/commands/assets/precompile.rb +0 -42
- data/lib/hanami/cli/commands/assets.rb +0 -16
- data/lib/hanami/cli/commands/console.rb +0 -95
- data/lib/hanami/cli/commands/db/apply.rb +0 -32
- data/lib/hanami/cli/commands/db/console.rb +0 -44
- data/lib/hanami/cli/commands/db/create.rb +0 -32
- data/lib/hanami/cli/commands/db/drop.rb +0 -32
- data/lib/hanami/cli/commands/db/migrate.rb +0 -39
- data/lib/hanami/cli/commands/db/prepare.rb +0 -32
- data/lib/hanami/cli/commands/db/rollback.rb +0 -59
- data/lib/hanami/cli/commands/db/version.rb +0 -32
- data/lib/hanami/cli/commands/db.rb +0 -32
- data/lib/hanami/cli/commands/destroy/action.rb +0 -137
- data/lib/hanami/cli/commands/destroy/app.rb +0 -159
- data/lib/hanami/cli/commands/destroy/mailer.rb +0 -74
- data/lib/hanami/cli/commands/destroy/migration.rb +0 -51
- data/lib/hanami/cli/commands/destroy/model.rb +0 -84
- data/lib/hanami/cli/commands/destroy.rb +0 -26
- data/lib/hanami/cli/commands/generate/action/action.erb +0 -7
- data/lib/hanami/cli/commands/generate/action/action_spec.minitest.erb +0 -11
- data/lib/hanami/cli/commands/generate/action/action_spec.rspec.erb +0 -9
- data/lib/hanami/cli/commands/generate/action/action_without_view.erb +0 -7
- data/lib/hanami/cli/commands/generate/action/view.erb +0 -7
- data/lib/hanami/cli/commands/generate/action/view_spec.minitest.erb +0 -12
- data/lib/hanami/cli/commands/generate/action/view_spec.rspec.erb +0 -10
- data/lib/hanami/cli/commands/generate/action.rb +0 -321
- data/lib/hanami/cli/commands/generate/app/application.erb +0 -313
- data/lib/hanami/cli/commands/generate/app/favicon.ico +0 -0
- data/lib/hanami/cli/commands/generate/app/gitkeep.erb +0 -0
- data/lib/hanami/cli/commands/generate/app/layout.erb +0 -7
- data/lib/hanami/cli/commands/generate/app/layout_spec.minitest.erb +0 -10
- data/lib/hanami/cli/commands/generate/app/layout_spec.rspec.erb +0 -10
- data/lib/hanami/cli/commands/generate/app/routes.erb +0 -5
- data/lib/hanami/cli/commands/generate/app/template.erb.erb +0 -10
- data/lib/hanami/cli/commands/generate/app/template.haml.erb +0 -7
- data/lib/hanami/cli/commands/generate/app/template.slim.erb +0 -8
- data/lib/hanami/cli/commands/generate/app.rb +0 -243
- data/lib/hanami/cli/commands/generate/mailer/mailer.erb +0 -9
- data/lib/hanami/cli/commands/generate/mailer/mailer_spec.minitest.erb +0 -7
- data/lib/hanami/cli/commands/generate/mailer/mailer_spec.rspec.erb +0 -5
- data/lib/hanami/cli/commands/generate/mailer.rb +0 -104
- data/lib/hanami/cli/commands/generate/migration/migration.erb +0 -4
- data/lib/hanami/cli/commands/generate/migration.rb +0 -41
- data/lib/hanami/cli/commands/generate/model/entity.erb +0 -2
- data/lib/hanami/cli/commands/generate/model/entity_spec.minitest.erb +0 -5
- data/lib/hanami/cli/commands/generate/model/entity_spec.rspec.erb +0 -3
- data/lib/hanami/cli/commands/generate/model/migration.erb +0 -10
- data/lib/hanami/cli/commands/generate/model/repository.erb +0 -5
- data/lib/hanami/cli/commands/generate/model/repository_spec.minitest.erb +0 -5
- data/lib/hanami/cli/commands/generate/model/repository_spec.rspec.erb +0 -3
- data/lib/hanami/cli/commands/generate/model.rb +0 -125
- data/lib/hanami/cli/commands/generate/secret.rb +0 -48
- data/lib/hanami/cli/commands/generate.rb +0 -28
- data/lib/hanami/cli/commands/new/.env.development.erb +0 -3
- data/lib/hanami/cli/commands/new/.env.test.erb +0 -3
- data/lib/hanami/cli/commands/new/.gitkeep.erb +0 -0
- data/lib/hanami/cli/commands/new/Gemfile.erb +0 -57
- data/lib/hanami/cli/commands/new/README.md.erb +0 -33
- data/lib/hanami/cli/commands/new/config/boot.erb +0 -2
- data/lib/hanami/cli/commands/new/config/environment.erb +0 -49
- data/lib/hanami/cli/commands/new/config.ru.erb +0 -3
- data/lib/hanami/cli/commands/new/gitignore.erb +0 -4
- data/lib/hanami/cli/commands/new/gitignore_with_sqlite.erb +0 -5
- data/lib/hanami/cli/commands/new/hanamirc.erb +0 -3
- data/lib/hanami/cli/commands/new/lib/project.erb +0 -2
- data/lib/hanami/cli/commands/new/minitest/Rakefile.erb +0 -12
- data/lib/hanami/cli/commands/new/minitest/features_helper.erb +0 -11
- data/lib/hanami/cli/commands/new/minitest/spec_helper.erb +0 -7
- data/lib/hanami/cli/commands/new/rspec/Rakefile.erb +0 -9
- data/lib/hanami/cli/commands/new/rspec/capybara.erb +0 -8
- data/lib/hanami/cli/commands/new/rspec/features_helper.erb +0 -12
- data/lib/hanami/cli/commands/new/rspec/rspec.erb +0 -2
- data/lib/hanami/cli/commands/new/rspec/spec_helper.erb +0 -103
- data/lib/hanami/cli/commands/new/schema.sql.erb +0 -0
- data/lib/hanami/cli/commands/new.rb +0 -578
- data/lib/hanami/cli/commands/project.rb +0 -421
- data/lib/hanami/cli/commands/routes.rb +0 -21
- data/lib/hanami/cli/commands/templates.rb +0 -31
- data/lib/hanami/cli/commands/version.rb +0 -19
- data/lib/hanami/common_logger.rb +0 -109
- data/lib/hanami/components/app/assets.rb +0 -59
- data/lib/hanami/components/app/controller.rb +0 -74
- data/lib/hanami/components/app/routes.rb +0 -59
- data/lib/hanami/components/app/view.rb +0 -44
- data/lib/hanami/components/component.rb +0 -182
- data/lib/hanami/components/components.rb +0 -479
- data/lib/hanami/components/routes_inspector.rb +0 -72
- data/lib/hanami/components.rb +0 -156
- data/lib/hanami/config/cookies.rb +0 -69
- data/lib/hanami/config/framework_configuration.rb +0 -43
- data/lib/hanami/config/load_paths.rb +0 -46
- data/lib/hanami/config/mapper.rb +0 -47
- data/lib/hanami/config/routes.rb +0 -20
- data/lib/hanami/config/security.rb +0 -110
- data/lib/hanami/config/sessions.rb +0 -119
- data/lib/hanami/configuration/app.rb +0 -21
- data/lib/hanami/early_hints.rb +0 -129
- data/lib/hanami/env.rb +0 -69
- data/lib/hanami/environment.rb +0 -541
- data/lib/hanami/environment_application_configurations.rb +0 -37
- data/lib/hanami/hanamirc.rb +0 -169
- data/lib/hanami/mailer/glue.rb +0 -27
- data/lib/hanami/middleware_stack.rb +0 -172
- data/lib/hanami/rake_helper.rb +0 -78
- data/lib/hanami/rake_tasks.rb +0 -3
- data/lib/hanami/rendering_policy.rb +0 -94
- data/lib/hanami/routing/default.rb +0 -32
- data/lib/hanami/setup.rb +0 -3
- data/lib/hanami/static.rb +0 -63
- data/lib/hanami/templates/default.html.erb +0 -30
- data/lib/hanami/templates/welcome.html.erb +0 -52
- data/lib/hanami/views/default.rb +0 -37
- data/lib/hanami/views/default_template_finder.rb +0 -22
- data/lib/hanami/views/null_view.rb +0 -15
- data/lib/hanami/welcome.rb +0 -41
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
require "spec_helper"
|
|
2
|
-
|
|
3
|
-
RSpec.describe <%= app.classify %>::Views::ApplicationLayout, type: :view do
|
|
4
|
-
let(:layout) { <%= app.classify %>::Views::ApplicationLayout.new({ format: :html }, "contents") }
|
|
5
|
-
let(:rendered) { layout.render }
|
|
6
|
-
|
|
7
|
-
it 'contains application name' do
|
|
8
|
-
expect(rendered).to include('<%= app.classify %>')
|
|
9
|
-
end
|
|
10
|
-
end
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
module Hanami
|
|
2
|
-
class CLI
|
|
3
|
-
module Commands
|
|
4
|
-
module Generate
|
|
5
|
-
# @since 1.1.0
|
|
6
|
-
# @api private
|
|
7
|
-
class App < Command # rubocop:disable Metrics/ClassLength
|
|
8
|
-
requires "environment"
|
|
9
|
-
|
|
10
|
-
desc "Generate an app"
|
|
11
|
-
|
|
12
|
-
argument :app, required: true, desc: "The application name (eg. `web`)"
|
|
13
|
-
option :application_base_url, desc: "The app base URL (eg. `/api/v1`)"
|
|
14
|
-
|
|
15
|
-
example [
|
|
16
|
-
"admin # Generate `admin` app",
|
|
17
|
-
"api --application-base-url=/api/v1 # Generate `api` app and mount at `/api/v1`"
|
|
18
|
-
]
|
|
19
|
-
|
|
20
|
-
# @since 1.1.0
|
|
21
|
-
# @api private
|
|
22
|
-
#
|
|
23
|
-
# rubocop:disable Metrics/AbcSize
|
|
24
|
-
# rubocop:disable Metrics/MethodLength
|
|
25
|
-
def call(app:, application_base_url: nil, **options)
|
|
26
|
-
app = Utils::String.underscore(app)
|
|
27
|
-
template = options.fetch(:template)
|
|
28
|
-
base_url = application_base_url || "/#{app}"
|
|
29
|
-
context = Context.new(app: app, base_url: base_url, test: options.fetch(:test), template: template, options: options)
|
|
30
|
-
|
|
31
|
-
assert_valid_base_url!(context)
|
|
32
|
-
|
|
33
|
-
generate_app(context)
|
|
34
|
-
generate_routes(context)
|
|
35
|
-
generate_layout(context)
|
|
36
|
-
generate_template(context)
|
|
37
|
-
generate_favicon(context)
|
|
38
|
-
|
|
39
|
-
create_controllers_directory(context)
|
|
40
|
-
create_assets_images_directory(context)
|
|
41
|
-
create_assets_javascripts_directory(context)
|
|
42
|
-
create_assets_stylesheets_directory(context)
|
|
43
|
-
|
|
44
|
-
create_spec_features_directory(context)
|
|
45
|
-
create_spec_controllers_directory(context)
|
|
46
|
-
generate_layout_spec(context)
|
|
47
|
-
|
|
48
|
-
inject_require_app(context)
|
|
49
|
-
inject_mount_app(context)
|
|
50
|
-
|
|
51
|
-
append_development_http_session_secret(context)
|
|
52
|
-
append_test_http_session_secret(context)
|
|
53
|
-
end
|
|
54
|
-
# rubocop:enable Metrics/MethodLength
|
|
55
|
-
# rubocop:enable Metrics/AbcSize
|
|
56
|
-
|
|
57
|
-
private
|
|
58
|
-
|
|
59
|
-
# @since 1.1.0
|
|
60
|
-
# @api private
|
|
61
|
-
def assert_valid_base_url!(context)
|
|
62
|
-
if Utils::Blank.blank?(context.base_url) # rubocop:disable Style/GuardClause
|
|
63
|
-
warn "`' is not a valid URL"
|
|
64
|
-
exit(1)
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# @since 1.1.0
|
|
69
|
-
# @api private
|
|
70
|
-
def generate_app(context)
|
|
71
|
-
source = templates.find("application.erb")
|
|
72
|
-
destination = project.app_application(context)
|
|
73
|
-
|
|
74
|
-
generate_file(source, destination, context)
|
|
75
|
-
say(:create, destination)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# @since 1.1.0
|
|
79
|
-
# @api private
|
|
80
|
-
def generate_routes(context)
|
|
81
|
-
source = templates.find("routes.erb")
|
|
82
|
-
destination = project.app_routes(context)
|
|
83
|
-
|
|
84
|
-
generate_file(source, destination, context)
|
|
85
|
-
say(:create, destination)
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
# @since 1.1.0
|
|
89
|
-
# @api private
|
|
90
|
-
def generate_layout(context)
|
|
91
|
-
source = templates.find("layout.erb")
|
|
92
|
-
destination = project.app_layout(context)
|
|
93
|
-
|
|
94
|
-
generate_file(source, destination, context)
|
|
95
|
-
say(:create, destination)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
# @since 1.1.0
|
|
99
|
-
# @api private
|
|
100
|
-
def generate_template(context)
|
|
101
|
-
source = templates.find("template.#{context.template}.erb")
|
|
102
|
-
destination = project.app_template(context)
|
|
103
|
-
|
|
104
|
-
generate_file(source, destination, context)
|
|
105
|
-
say(:create, destination)
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# @since 1.1.0
|
|
109
|
-
# @api private
|
|
110
|
-
def generate_favicon(context)
|
|
111
|
-
source = templates.find("favicon.ico")
|
|
112
|
-
destination = project.app_favicon(context)
|
|
113
|
-
|
|
114
|
-
files.cp(source, destination)
|
|
115
|
-
say(:create, destination)
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
# @since 1.1.0
|
|
119
|
-
# @api private
|
|
120
|
-
def create_controllers_directory(context)
|
|
121
|
-
source = templates.find("gitkeep.erb")
|
|
122
|
-
destination = project.keep(project.controllers(context))
|
|
123
|
-
|
|
124
|
-
generate_file(source, destination, context)
|
|
125
|
-
say(:create, destination)
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
# @since 1.1.0
|
|
129
|
-
# @api private
|
|
130
|
-
def create_assets_images_directory(context)
|
|
131
|
-
source = templates.find("gitkeep.erb")
|
|
132
|
-
destination = project.keep(project.images(context))
|
|
133
|
-
|
|
134
|
-
generate_file(source, destination, context)
|
|
135
|
-
say(:create, destination)
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# @since 1.1.0
|
|
139
|
-
# @api private
|
|
140
|
-
def create_assets_javascripts_directory(context)
|
|
141
|
-
source = templates.find("gitkeep.erb")
|
|
142
|
-
destination = project.keep(project.javascripts(context))
|
|
143
|
-
|
|
144
|
-
generate_file(source, destination, context)
|
|
145
|
-
say(:create, destination)
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
# @since 1.1.0
|
|
149
|
-
# @api private
|
|
150
|
-
def create_assets_stylesheets_directory(context)
|
|
151
|
-
source = templates.find("gitkeep.erb")
|
|
152
|
-
destination = project.keep(project.stylesheets(context))
|
|
153
|
-
|
|
154
|
-
generate_file(source, destination, context)
|
|
155
|
-
say(:create, destination)
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
# @since 1.1.0
|
|
159
|
-
# @api private
|
|
160
|
-
def create_spec_features_directory(context)
|
|
161
|
-
source = templates.find("gitkeep.erb")
|
|
162
|
-
destination = project.keep(project.features_spec(context))
|
|
163
|
-
|
|
164
|
-
generate_file(source, destination, context)
|
|
165
|
-
say(:create, destination)
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
# @since 1.1.0
|
|
169
|
-
# @api private
|
|
170
|
-
def create_spec_controllers_directory(context)
|
|
171
|
-
source = templates.find("gitkeep.erb")
|
|
172
|
-
destination = project.keep(project.controllers_spec(context))
|
|
173
|
-
|
|
174
|
-
generate_file(source, destination, context)
|
|
175
|
-
say(:create, destination)
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
# @since 1.1.0
|
|
179
|
-
# @api private
|
|
180
|
-
def generate_layout_spec(context)
|
|
181
|
-
source = templates.find("layout_spec.#{context.options.fetch(:test)}.erb")
|
|
182
|
-
destination = project.app_layout_spec(context)
|
|
183
|
-
|
|
184
|
-
generate_file(source, destination, context)
|
|
185
|
-
say(:create, destination)
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
# @since 1.1.0
|
|
189
|
-
# @api private
|
|
190
|
-
def inject_require_app(context)
|
|
191
|
-
content = "require_relative '../apps/#{context.app}/application'"
|
|
192
|
-
destination = project.environment(context)
|
|
193
|
-
|
|
194
|
-
req_regex = /^\s*require .*$/
|
|
195
|
-
rel_regex = /^\s*require_relative .*$/
|
|
196
|
-
|
|
197
|
-
case File.read(destination)
|
|
198
|
-
when rel_regex
|
|
199
|
-
files.inject_line_after_last(destination, rel_regex, content)
|
|
200
|
-
when req_regex
|
|
201
|
-
files.inject_line_after_last(destination, req_regex, content)
|
|
202
|
-
else
|
|
203
|
-
raise "No require found"
|
|
204
|
-
end
|
|
205
|
-
say(:insert, destination)
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
# @since 1.1.0
|
|
209
|
-
# @api private
|
|
210
|
-
def inject_mount_app(context)
|
|
211
|
-
content = " mount #{context.app.classify}::Application, at: '#{context.base_url}'"
|
|
212
|
-
destination = project.environment(context)
|
|
213
|
-
|
|
214
|
-
files.inject_line_after(destination, /Hanami.configure do/, content)
|
|
215
|
-
say(:insert, destination)
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
# @since 1.1.0
|
|
219
|
-
# @api private
|
|
220
|
-
def append_development_http_session_secret(context)
|
|
221
|
-
append_env_to_http_session_secret(context, "development")
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
# @since 1.1.0
|
|
225
|
-
# @api private
|
|
226
|
-
def append_test_http_session_secret(context)
|
|
227
|
-
append_env_to_http_session_secret(context, "test")
|
|
228
|
-
end
|
|
229
|
-
|
|
230
|
-
private
|
|
231
|
-
|
|
232
|
-
def append_env_to_http_session_secret(context, env)
|
|
233
|
-
content = %(#{context.app.upcase}_SESSIONS_SECRET="#{project.app_sessions_secret}")
|
|
234
|
-
destination = project.env(context, env)
|
|
235
|
-
|
|
236
|
-
files.append(destination, content)
|
|
237
|
-
say(:append, destination)
|
|
238
|
-
end
|
|
239
|
-
end
|
|
240
|
-
end
|
|
241
|
-
end
|
|
242
|
-
end
|
|
243
|
-
end
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
module Hanami
|
|
2
|
-
class CLI
|
|
3
|
-
module Commands
|
|
4
|
-
module Generate
|
|
5
|
-
# @since 1.1.0
|
|
6
|
-
# @api private
|
|
7
|
-
class Mailer < Command
|
|
8
|
-
requires "environment"
|
|
9
|
-
|
|
10
|
-
desc "Generate a mailer"
|
|
11
|
-
|
|
12
|
-
argument :mailer, required: true, desc: "The mailer name (eg. `welcome`)"
|
|
13
|
-
|
|
14
|
-
option :from, desc: "The default `from` field of the mail"
|
|
15
|
-
option :to, desc: "The default `to` field of the mail"
|
|
16
|
-
option :subject, desc: "The mail subject"
|
|
17
|
-
|
|
18
|
-
example [
|
|
19
|
-
"welcome # Basic usage",
|
|
20
|
-
'welcome --from="noreply@example.com" # Generate with default `from` value',
|
|
21
|
-
'announcement --to="users@example.com" # Generate with default `to` value',
|
|
22
|
-
'forgot_password --subject="Your password reset" # Generate with default `subject`'
|
|
23
|
-
]
|
|
24
|
-
|
|
25
|
-
# @since 1.1.0
|
|
26
|
-
# @api private
|
|
27
|
-
def call(mailer:, **options)
|
|
28
|
-
from = clean_option(options.fetch(:from, DEFAULT_FROM))
|
|
29
|
-
to = clean_option(options.fetch(:to, DEFAULT_TO))
|
|
30
|
-
subject = clean_option(options.fetch(:subject, DEFAULT_SUBJECT))
|
|
31
|
-
context = Context.new(mailer: mailer, test: options.fetch(:test), from: from, to: to, subject: subject, options: options)
|
|
32
|
-
|
|
33
|
-
generate_mailer(context)
|
|
34
|
-
generate_mailer_spec(context)
|
|
35
|
-
generate_text_template(context)
|
|
36
|
-
generate_html_template(context)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
private
|
|
40
|
-
|
|
41
|
-
# @since 1.1.0
|
|
42
|
-
# @api private
|
|
43
|
-
DEFAULT_FROM = "<from>".freeze
|
|
44
|
-
|
|
45
|
-
# @since 1.1.0
|
|
46
|
-
# @api private
|
|
47
|
-
DEFAULT_TO = "<to>".freeze
|
|
48
|
-
|
|
49
|
-
# @since 1.1.0
|
|
50
|
-
# @api private
|
|
51
|
-
DEFAULT_SUBJECT = "Hello".freeze
|
|
52
|
-
|
|
53
|
-
# @since 1.1.1
|
|
54
|
-
# @api private
|
|
55
|
-
QUOTES_REGEX = /^("|')|("|')$/
|
|
56
|
-
|
|
57
|
-
# @since 1.1.0
|
|
58
|
-
# @api private
|
|
59
|
-
def generate_mailer(context)
|
|
60
|
-
source = templates.find("mailer.erb")
|
|
61
|
-
destination = project.mailer(context)
|
|
62
|
-
|
|
63
|
-
generate_file(source, destination, context)
|
|
64
|
-
say(:create, destination)
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# @since 1.1.0
|
|
68
|
-
# @api private
|
|
69
|
-
def generate_mailer_spec(context)
|
|
70
|
-
source = templates.find("mailer_spec.#{context.test}.erb")
|
|
71
|
-
destination = project.mailer_spec(context)
|
|
72
|
-
|
|
73
|
-
generate_file(source, destination, context)
|
|
74
|
-
say(:create, destination)
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
# @since 1.1.0
|
|
78
|
-
# @api private
|
|
79
|
-
def generate_text_template(context)
|
|
80
|
-
destination = project.mailer_template(context, "txt")
|
|
81
|
-
|
|
82
|
-
files.touch(destination)
|
|
83
|
-
say(:create, destination)
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# @since 1.1.0
|
|
87
|
-
# @api private
|
|
88
|
-
def generate_html_template(context)
|
|
89
|
-
destination = project.mailer_template(context, "html")
|
|
90
|
-
|
|
91
|
-
files.touch(destination)
|
|
92
|
-
say(:create, destination)
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# @since 1.1.1
|
|
96
|
-
# @api private
|
|
97
|
-
def clean_option(option)
|
|
98
|
-
option.gsub(QUOTES_REGEX, '')
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
module Hanami
|
|
2
|
-
class CLI
|
|
3
|
-
module Commands
|
|
4
|
-
module Generate
|
|
5
|
-
# @since 1.1.0
|
|
6
|
-
# @api private
|
|
7
|
-
class Migration < Command
|
|
8
|
-
requires "environment"
|
|
9
|
-
desc "Generate a migration"
|
|
10
|
-
|
|
11
|
-
argument :migration, required: true, desc: "The migration name (eg. `create_users`)"
|
|
12
|
-
|
|
13
|
-
example [
|
|
14
|
-
"create_users # Generate `db/migrations/#{Project.migration_timestamp}_create_users.rb`"
|
|
15
|
-
]
|
|
16
|
-
|
|
17
|
-
# @since 1.1.0
|
|
18
|
-
# @api private
|
|
19
|
-
def call(migration:, **options)
|
|
20
|
-
migration = Utils::String.underscore(migration)
|
|
21
|
-
context = Context.new(migration: migration, options: options)
|
|
22
|
-
|
|
23
|
-
generate_migration(context)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
private
|
|
27
|
-
|
|
28
|
-
# @since 1.1.0
|
|
29
|
-
# @api private
|
|
30
|
-
def generate_migration(context)
|
|
31
|
-
source = templates.find("migration.erb")
|
|
32
|
-
destination = project.migration(context)
|
|
33
|
-
|
|
34
|
-
generate_file(source, destination, context)
|
|
35
|
-
say(:create, destination)
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
module Hanami
|
|
2
|
-
class CLI
|
|
3
|
-
module Commands
|
|
4
|
-
module Generate
|
|
5
|
-
# @since 1.1.0
|
|
6
|
-
# @api private
|
|
7
|
-
class Model < Command
|
|
8
|
-
requires "environment"
|
|
9
|
-
|
|
10
|
-
desc "Generate a model"
|
|
11
|
-
|
|
12
|
-
argument :model, required: true, desc: "Model name (eg. `user`)"
|
|
13
|
-
option :skip_migration, type: :boolean, default: false, desc: "Skip migration"
|
|
14
|
-
option :relation, type: :string, desc: "Name of the database relation, default: pluralized model name"
|
|
15
|
-
|
|
16
|
-
example [
|
|
17
|
-
"user # Generate `User` entity, `UserRepository` repository, and the migration",
|
|
18
|
-
"user --skip-migration # Generate `User` entity and `UserRepository` repository",
|
|
19
|
-
"user --relation=accounts # Generate `User` entity, `UserRepository` and migration to create `accounts` table"
|
|
20
|
-
]
|
|
21
|
-
|
|
22
|
-
# @since 1.1.0
|
|
23
|
-
# @api private
|
|
24
|
-
def call(model:, **options)
|
|
25
|
-
model = Utils::String.underscore(model)
|
|
26
|
-
relation = relation_name(options, model)
|
|
27
|
-
migration = "create_#{relation}"
|
|
28
|
-
context = Context.new(model: model, relation: relation, migration: migration, test: options.fetch(:test), override_relation_name: override_relation_name?(options), options: options)
|
|
29
|
-
|
|
30
|
-
assert_valid_relation!(context)
|
|
31
|
-
|
|
32
|
-
generate_entity(context)
|
|
33
|
-
generate_repository(context)
|
|
34
|
-
generate_migration(context)
|
|
35
|
-
generate_entity_spec(context)
|
|
36
|
-
generate_repository_spec(context)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
private
|
|
40
|
-
|
|
41
|
-
def assert_valid_relation!(context)
|
|
42
|
-
if Utils::Blank.blank?(context.relation)
|
|
43
|
-
warn "`#{context.relation}' is not a valid relation name"
|
|
44
|
-
exit(1)
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# @since 1.1.0
|
|
49
|
-
# @api private
|
|
50
|
-
def generate_entity(context)
|
|
51
|
-
source = templates.find("entity.erb")
|
|
52
|
-
destination = project.entity(context)
|
|
53
|
-
|
|
54
|
-
generate_file(source, destination, context)
|
|
55
|
-
say(:create, destination)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# @since 1.1.0
|
|
59
|
-
# @api private
|
|
60
|
-
def generate_repository(context)
|
|
61
|
-
source = templates.find("repository.erb")
|
|
62
|
-
destination = project.repository(context)
|
|
63
|
-
|
|
64
|
-
generate_file(source, destination, context)
|
|
65
|
-
say(:create, destination)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# @since 1.1.0
|
|
69
|
-
# @api private
|
|
70
|
-
def generate_migration(context)
|
|
71
|
-
return if skip_migration?(context)
|
|
72
|
-
|
|
73
|
-
source = templates.find("migration.erb")
|
|
74
|
-
destination = project.migration(context)
|
|
75
|
-
|
|
76
|
-
generate_file(source, destination, context)
|
|
77
|
-
say(:create, destination)
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
# @since 1.1.0
|
|
81
|
-
# @api private
|
|
82
|
-
def generate_entity_spec(context)
|
|
83
|
-
source = templates.find("entity_spec.#{context.test}.erb")
|
|
84
|
-
destination = project.entity_spec(context)
|
|
85
|
-
|
|
86
|
-
generate_file(source, destination, context)
|
|
87
|
-
say(:create, destination)
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
# @since 1.1.0
|
|
91
|
-
# @api private
|
|
92
|
-
def generate_repository_spec(context)
|
|
93
|
-
source = templates.find("repository_spec.#{context.test}.erb")
|
|
94
|
-
destination = project.repository_spec(context)
|
|
95
|
-
|
|
96
|
-
generate_file(source, destination, context)
|
|
97
|
-
say(:create, destination)
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
# @since 1.1.0
|
|
101
|
-
# @api private
|
|
102
|
-
def skip_migration?(context)
|
|
103
|
-
context.options.fetch(:skip_migration, false)
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
# @since 1.1.0
|
|
107
|
-
# @api private
|
|
108
|
-
def relation_name(options, model)
|
|
109
|
-
if override_relation_name?(options)
|
|
110
|
-
Utils::String.underscore(options[:relation])
|
|
111
|
-
else
|
|
112
|
-
Utils::String.pluralize(model)
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
# @since 1.1.0
|
|
117
|
-
# @api private
|
|
118
|
-
def override_relation_name?(options)
|
|
119
|
-
!options.fetch(:relation, nil).nil?
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
end
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
require "hanami/utils/blank"
|
|
2
|
-
require "securerandom"
|
|
3
|
-
|
|
4
|
-
module Hanami
|
|
5
|
-
class CLI
|
|
6
|
-
module Commands
|
|
7
|
-
module Generate
|
|
8
|
-
# @since 1.1.0
|
|
9
|
-
# @api private
|
|
10
|
-
class Secret < Command
|
|
11
|
-
requires "environment"
|
|
12
|
-
|
|
13
|
-
desc "Generate session secret"
|
|
14
|
-
|
|
15
|
-
argument :app, desc: "The application name (eg. `web`)"
|
|
16
|
-
|
|
17
|
-
example [
|
|
18
|
-
" # Prints secret (eg. `#{Project.app_sessions_secret}`)",
|
|
19
|
-
"web # Prints session secret (eg. `WEB_SESSIONS_SECRET=#{Project.app_sessions_secret}`)"
|
|
20
|
-
]
|
|
21
|
-
|
|
22
|
-
# @since 1.1.0
|
|
23
|
-
# @api private
|
|
24
|
-
def call(app: nil, **options)
|
|
25
|
-
context = Context.new(app: app, options: options)
|
|
26
|
-
|
|
27
|
-
generate_secret(context)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
private
|
|
31
|
-
|
|
32
|
-
# @since 1.1.0
|
|
33
|
-
# @api private
|
|
34
|
-
def generate_secret(context)
|
|
35
|
-
secret = project.app_sessions_secret
|
|
36
|
-
|
|
37
|
-
if Hanami::Utils::Blank.blank?(context.app)
|
|
38
|
-
puts secret
|
|
39
|
-
else
|
|
40
|
-
puts "Set the following environment variable to provide the secret token:"
|
|
41
|
-
puts %(#{context.app.upcase}_SESSIONS_SECRET="#{secret}")
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|