Skip to content

Commit bc34f40

Browse files
committed
wip: added overwrite prevention and action specs
1 parent a76a653 commit bc34f40

File tree

18 files changed

+371
-388
lines changed

18 files changed

+371
-388
lines changed

lib/hanami/cli/commands/app/db/migrate.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class Migrate < DB::Command
1212
option :gateway, required: false, desc: "Use database for gateway"
1313
option :target, desc: "Target migration number", aliases: ["-t"]
1414
option :dump, required: false, type: :boolean, default: true,
15-
desc: "Dump the database structure after migrating"
15+
desc: "Dump the database structure after migrating"
1616

1717
def call(target: nil, app: false, slice: nil, gateway: nil, dump: true, command_exit: method(:exit), **)
1818
databases(app: app, slice: slice, gateway: gateway).each do |database|

lib/hanami/cli/commands/app/db/utils/postgres.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ def exec_load_command
5757
def schema_migrations_sql_dump
5858
migrations_sql = super
5959
return unless migrations_sql
60-
60+
6161
search_path = gateway.connection
6262
.fetch("SHOW search_path").to_a.first
6363
.fetch(:search_path)
6464

65-
+"SET search_path TO #{search_path};\n\n" << migrations_sql
65+
"SET search_path TO #{search_path};\n\n" << migrations_sql
6666
end
6767

6868
private

lib/hanami/cli/commands/app/db/utils/sqlite.rb

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def exec_create_command
3838
def exec_drop_command
3939
begin
4040
File.unlink(file_path) if exists?
41-
rescue => e
41+
rescue StandardError => e
4242
# Mimic a system_call result
4343
return Failure.new(e.message)
4444
end
@@ -76,13 +76,11 @@ def name
7676
private
7777

7878
def file_path
79-
@file_path ||= begin
80-
if File.absolute_path?(name)
81-
name
82-
else
83-
slice.app.root.join(name).to_s
84-
end
85-
end
79+
@file_path ||= if File.absolute_path?(name)
80+
name
81+
else
82+
slice.app.root.join(name).to_s
83+
end
8684
end
8785
end
8886
end

lib/hanami/cli/commands/app/generate/action.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ def call(
106106
raise InvalidActionNameError.new(name)
107107
end
108108

109-
generator.call(app.namespace, controller, action, url, http, format, skip_view, skip_route, slice, context: context)
109+
generator.call(app.namespace, controller, action, url, http, format, skip_view, skip_route, slice,
110+
context: context)
110111
end
111112

112113
# rubocop:enable Metrics/ParameterLists

lib/hanami/cli/commands/app/generate/slice.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,17 @@ class Slice < App::Command
2929
# @since 2.2.0
3030
# @api private
3131
option :skip_db,
32-
type: :flag,
33-
required: false,
34-
default: SKIP_DB_DEFAULT,
35-
desc: "Skip database"
32+
type: :flag,
33+
required: false,
34+
default: SKIP_DB_DEFAULT,
35+
desc: "Skip database"
3636
# @since 2.2.0
3737
# @api private
3838
option :skip_route,
39-
type: :flag,
40-
required: false,
41-
default: DEFAULT_SKIP_ROUTE,
42-
desc: "Skip route generation"
39+
type: :flag,
40+
required: false,
41+
default: DEFAULT_SKIP_ROUTE,
42+
desc: "Skip route generation"
4343

4444
example [
4545
"admin # Admin slice (/admin URL prefix)",

lib/hanami/cli/commands/app/install.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class Install < Command
3939
def initialize(
4040
fs:,
4141
bundler: CLI::Bundler.new(fs: fs),
42-
**opts
42+
**_opts
4343
)
4444
@bundler = bundler
4545
end

lib/hanami/cli/commands/gem/new.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def initialize(
110110
@system_call = system_call
111111
end
112112

113-
# rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
113+
# rubocop:disable Metrics/AbcSize
114114

115115
# @since 2.0.0
116116
# @api private
@@ -162,7 +162,7 @@ def call(
162162
end
163163
end
164164
end
165-
# rubocop:enable Metrics/AbcSize, Metrics/PerceivedComplexity
165+
# rubocop:enable Metrics/AbcSize
166166

167167
private
168168

lib/hanami/cli/errors.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ def initialize(path)
4444
end
4545
end
4646

47+
# @since 2.3.0
48+
# @api public
49+
class FileAlreadyExistsError < Error
50+
def initialize(path)
51+
super("Cannot overwrite existing file: `#{path}`")
52+
end
53+
end
54+
4755
# @since 2.0.0
4856
# @api public
4957
class MissingSliceError < Error

lib/hanami/cli/files.rb

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ def initialize(out: $stdout, **args)
1414
@out = out
1515
end
1616

17+
# @since 2.3.0
18+
# @api private
19+
def create(path, *content)
20+
raise FileAlreadyExistsError.new(path) if exist?(path)
21+
22+
write(path, *content)
23+
end
24+
1725
# @since 2.0.0
1826
# @api private
1927
def write(path, *content)
@@ -33,10 +41,10 @@ def write(path, *content)
3341
# @since 2.0.0
3442
# @api private
3543
def mkdir(path)
36-
unless exist?(path)
37-
super
38-
created(_path(path))
39-
end
44+
return if exist?(path)
45+
46+
super
47+
created(_path(path))
4048
end
4149

4250
# @since 2.0.0

lib/hanami/cli/generators/app/action.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,15 @@ def generate_for_slice(controller, action, url, http, format, skip_view, skip_ro
8585
end
8686

8787
fs.mkdir(directory = fs.join(slice_directory, "actions", controller))
88-
fs.write(fs.join(directory, "#{action}.rb"), t("slice_action.erb", context))
88+
fs.create(fs.join(directory, "#{action}.rb"), t("slice_action.erb", context))
8989

9090
if generate_view?(skip_view, action, directory)
9191
fs.mkdir(directory = fs.join(slice_directory, "views", controller))
92-
fs.write(fs.join(directory, "#{action}.rb"), t("slice_view.erb", context))
92+
fs.create(fs.join(directory, "#{action}.rb"), t("slice_view.erb", context))
9393

9494
fs.mkdir(directory = fs.join(slice_directory, "templates", controller))
95-
fs.write(fs.join(directory, "#{action}.#{format}.erb"),
96-
t(template_with_format_ext("slice_template", format), context))
95+
fs.create(fs.join(directory, "#{action}.#{format}.erb"),
96+
t(template_with_format_ext("slice_template", format), context))
9797
end
9898
end
9999

@@ -107,18 +107,18 @@ def generate_for_app(controller, action, url, http, format, skip_view, skip_rout
107107
end
108108

109109
fs.mkdir(directory = fs.join("app", "actions", controller))
110-
fs.write(fs.join(directory, "#{action}.rb"), t("action.erb", context))
110+
fs.create(fs.join(directory, "#{action}.rb"), t("action.erb", context))
111111

112112
view = action
113113
view_directory = fs.join("app", "views", controller)
114114

115115
if generate_view?(skip_view, view, view_directory)
116116
fs.mkdir(view_directory)
117-
fs.write(fs.join(view_directory, "#{view}.rb"), t("view.erb", context))
117+
fs.create(fs.join(view_directory, "#{view}.rb"), t("view.erb", context))
118118

119119
fs.mkdir(template_directory = fs.join("app", "templates", controller))
120-
fs.write(fs.join(template_directory, "#{view}.#{format}.erb"),
121-
t(template_with_format_ext("template", format), context))
120+
fs.create(fs.join(template_directory, "#{view}.#{format}.erb"),
121+
t(template_with_format_ext("template", format), context))
122122
end
123123
end
124124
# rubocop:enable Metrics/AbcSize

lib/hanami/cli/generators/app/component.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ def generate_for_slice(context, slice)
4040
raise MissingSliceError.new(slice) unless fs.directory?(slice_directory)
4141

4242
fs.mkdir(directory = fs.join(slice_directory, context.namespaces))
43-
fs.write(fs.join(directory, "#{context.underscored_name}.rb"), t("slice_component.erb", context))
43+
fs.create(fs.join(directory, "#{context.underscored_name}.rb"), t("slice_component.erb", context))
4444
end
4545

4646
def generate_for_app(context)
4747
fs.mkdir(directory = fs.join("app", context.namespaces))
48-
fs.write(fs.join(directory, "#{context.underscored_name}.rb"), t("component.erb", context))
48+
fs.create(fs.join(directory, "#{context.underscored_name}.rb"), t("component.erb", context))
4949
end
5050

5151
def template(path, context)

lib/hanami/cli/generators/app/migration.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def call(key:, base_path:, gateway: nil, **_opts)
2626

2727
path = fs.join(*[base_path, "config", "db", migrate_dir, file_name(name)].compact)
2828

29-
fs.write(path, FILE_CONTENTS)
29+
fs.create(path, FILE_CONTENTS)
3030
end
3131

3232
private

lib/hanami/cli/generators/app/part.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def generate_for_slice(context, slice)
5050
generate_base_part_for_slice(context, slice)
5151

5252
fs.mkdir(directory = fs.join(slice_directory, "views", "parts", *context.underscored_namespace))
53-
fs.write(fs.join(directory, "#{context.underscored_name}.rb"), t("slice_part.erb", context))
53+
fs.create(fs.join(directory, "#{context.underscored_name}.rb"), t("slice_part.erb", context))
5454
end
5555

5656
# @since 2.1.0
@@ -59,7 +59,7 @@ def generate_for_app(context)
5959
generate_base_part_for_app(context)
6060

6161
fs.mkdir(directory = fs.join("app", "views", "parts", *context.underscored_namespace))
62-
fs.write(fs.join(directory, "#{context.underscored_name}.rb"), t("app_part.erb", context))
62+
fs.create(fs.join(directory, "#{context.underscored_name}.rb"), t("app_part.erb", context))
6363
end
6464

6565
# @since 2.1.0

lib/hanami/cli/generators/app/slice.rb

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,33 +30,33 @@ def call(app, slice, url, context: nil, **opts)
3030

3131
fs.mkdir(directory = "slices/#{slice}")
3232

33-
fs.write(fs.join(directory, "action.rb"), t("action.erb", context))
34-
fs.write(fs.join(directory, "view.rb"), t("view.erb", context))
35-
fs.write(fs.join(directory, "views", "helpers.rb"), t("helpers.erb", context))
36-
fs.write(fs.join(directory, "templates", "layouts", "app.html.erb"), t("app_layout.erb", context))
37-
fs.write(fs.join(directory, "operation.rb"), t("operation.erb", context))
33+
fs.create(fs.join(directory, "action.rb"), t("action.erb", context))
34+
fs.create(fs.join(directory, "view.rb"), t("view.erb", context))
35+
fs.create(fs.join(directory, "views", "helpers.rb"), t("helpers.erb", context))
36+
fs.create(fs.join(directory, "templates", "layouts", "app.html.erb"), t("app_layout.erb", context))
37+
fs.create(fs.join(directory, "operation.rb"), t("operation.erb", context))
3838

3939
if context.bundled_assets?
40-
fs.write(fs.join(directory, "assets", "js", "app.js"), t("app_js.erb", context))
41-
fs.write(fs.join(directory, "assets", "css", "app.css"), t("app_css.erb", context))
42-
fs.write(fs.join(directory, "assets", "images", "favicon.ico"), file("favicon.ico"))
40+
fs.create(fs.join(directory, "assets", "js", "app.js"), t("app_js.erb", context))
41+
fs.create(fs.join(directory, "assets", "css", "app.css"), t("app_css.erb", context))
42+
fs.create(fs.join(directory, "assets", "images", "favicon.ico"), file("favicon.ico"))
4343
end
4444

4545
if context.generate_db?
46-
fs.write(fs.join(directory, "db", "relation.rb"), t("relation.erb", context))
47-
fs.write(fs.join(directory, "relations", ".keep"), t("keep.erb", context))
46+
fs.create(fs.join(directory, "db", "relation.rb"), t("relation.erb", context))
47+
fs.create(fs.join(directory, "relations", ".keep"), t("keep.erb", context))
4848

49-
fs.write(fs.join(directory, "db", "repo.rb"), t("repo.erb", context))
50-
fs.write(fs.join(directory, "repos", ".keep"), t("keep.erb", context))
49+
fs.create(fs.join(directory, "db", "repo.rb"), t("repo.erb", context))
50+
fs.create(fs.join(directory, "repos", ".keep"), t("keep.erb", context))
5151

52-
fs.write(fs.join(directory, "db", "struct.rb"), t("struct.erb", context))
53-
fs.write(fs.join(directory, "structs", ".keep"), t("keep.erb", context))
52+
fs.create(fs.join(directory, "db", "struct.rb"), t("struct.erb", context))
53+
fs.create(fs.join(directory, "structs", ".keep"), t("keep.erb", context))
5454
end
5555

56-
fs.write(fs.join(directory, "actions/.keep"), t("keep.erb", context))
57-
fs.write(fs.join(directory, "views/.keep"), t("keep.erb", context))
58-
fs.write(fs.join(directory, "templates/.keep"), t("keep.erb", context))
59-
fs.write(fs.join(directory, "templates/layouts/.keep"), t("keep.erb", context))
56+
fs.create(fs.join(directory, "actions/.keep"), t("keep.erb", context))
57+
fs.create(fs.join(directory, "views/.keep"), t("keep.erb", context))
58+
fs.create(fs.join(directory, "templates/.keep"), t("keep.erb", context))
59+
fs.create(fs.join(directory, "templates/layouts/.keep"), t("keep.erb", context))
6060
end
6161

6262
private

lib/hanami/cli/generators/app/view.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,20 @@ def generate_for_slice(context, format, slice)
4343
raise MissingSliceError.new(slice) unless fs.directory?(slice_directory)
4444

4545
fs.mkdir(directory = fs.join(slice_directory, "views", context.namespaces))
46-
fs.write(fs.join(directory, "#{context.name}.rb"), t("slice_view.erb", context))
46+
fs.create(fs.join(directory, "#{context.name}.rb"), t("slice_view.erb", context))
4747

4848
fs.mkdir(directory = fs.join(slice_directory, "templates", context.namespaces))
49-
fs.write(fs.join(directory, "#{context.name}.#{format}.erb"),
50-
t(template_with_format_ext("slice_template", format), context))
49+
fs.create(fs.join(directory, "#{context.name}.#{format}.erb"),
50+
t(template_with_format_ext("slice_template", format), context))
5151
end
5252

5353
def generate_for_app(context, format, _slice)
5454
fs.mkdir(directory = fs.join("app", "views", context.namespaces))
55-
fs.write(fs.join(directory, "#{context.name}.rb"), t("app_view.erb", context))
55+
fs.create(fs.join(directory, "#{context.name}.rb"), t("app_view.erb", context))
5656

5757
fs.mkdir(directory = fs.join("app", "templates", context.namespaces))
58-
fs.write(fs.join(directory, "#{context.name}.#{format}.erb"),
59-
t(template_with_format_ext("app_template", format), context))
58+
fs.create(fs.join(directory, "#{context.name}.#{format}.erb"),
59+
t(template_with_format_ext("app_template", format), context))
6060
end
6161

6262
# rubocop:enable Metrics/AbcSize

0 commit comments

Comments
 (0)