hanami 1.3.5 → 2.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -41
  3. data/FEATURES.md +2 -12
  4. data/LICENSE.md +1 -1
  5. data/README.md +5 -8
  6. data/bin/hanami +6 -4
  7. data/hanami.gemspec +24 -28
  8. data/lib/hanami/application.rb +44 -176
  9. data/lib/hanami/boot.rb +6 -0
  10. data/lib/hanami/cli/commands/command.rb +21 -29
  11. data/lib/hanami/cli/commands/server.rb +63 -14
  12. data/lib/hanami/cli/commands.rb +5 -42
  13. data/lib/hanami/configuration/cookies.rb +24 -0
  14. data/lib/hanami/configuration/middleware.rb +8 -28
  15. data/lib/hanami/configuration/security.rb +141 -0
  16. data/lib/hanami/configuration/sessions.rb +50 -0
  17. data/lib/hanami/configuration.rb +181 -191
  18. data/lib/hanami/container.rb +107 -0
  19. data/lib/hanami/frameworks.rb +24 -18
  20. data/lib/hanami/routes.rb +17 -205
  21. data/lib/hanami/server.rb +5 -69
  22. data/lib/hanami/version.rb +3 -1
  23. data/lib/hanami.rb +39 -243
  24. metadata +36 -233
  25. data/lib/hanami/action/csrf_protection.rb +0 -211
  26. data/lib/hanami/action/routing_helpers.rb +0 -40
  27. data/lib/hanami/app.rb +0 -96
  28. data/lib/hanami/application_configuration.rb +0 -1495
  29. data/lib/hanami/application_name.rb +0 -108
  30. data/lib/hanami/application_namespace.rb +0 -14
  31. data/lib/hanami/assets/asset.rb +0 -72
  32. data/lib/hanami/assets/static.rb +0 -102
  33. data/lib/hanami/cli/commands/assets/precompile.rb +0 -42
  34. data/lib/hanami/cli/commands/assets.rb +0 -16
  35. data/lib/hanami/cli/commands/console.rb +0 -95
  36. data/lib/hanami/cli/commands/db/apply.rb +0 -32
  37. data/lib/hanami/cli/commands/db/console.rb +0 -44
  38. data/lib/hanami/cli/commands/db/create.rb +0 -32
  39. data/lib/hanami/cli/commands/db/drop.rb +0 -32
  40. data/lib/hanami/cli/commands/db/migrate.rb +0 -39
  41. data/lib/hanami/cli/commands/db/prepare.rb +0 -32
  42. data/lib/hanami/cli/commands/db/rollback.rb +0 -59
  43. data/lib/hanami/cli/commands/db/version.rb +0 -32
  44. data/lib/hanami/cli/commands/db.rb +0 -32
  45. data/lib/hanami/cli/commands/destroy/action.rb +0 -137
  46. data/lib/hanami/cli/commands/destroy/app.rb +0 -159
  47. data/lib/hanami/cli/commands/destroy/mailer.rb +0 -74
  48. data/lib/hanami/cli/commands/destroy/migration.rb +0 -51
  49. data/lib/hanami/cli/commands/destroy/model.rb +0 -84
  50. data/lib/hanami/cli/commands/destroy.rb +0 -26
  51. data/lib/hanami/cli/commands/generate/action/action.erb +0 -7
  52. data/lib/hanami/cli/commands/generate/action/action_spec.minitest.erb +0 -11
  53. data/lib/hanami/cli/commands/generate/action/action_spec.rspec.erb +0 -9
  54. data/lib/hanami/cli/commands/generate/action/action_without_view.erb +0 -7
  55. data/lib/hanami/cli/commands/generate/action/view.erb +0 -7
  56. data/lib/hanami/cli/commands/generate/action/view_spec.minitest.erb +0 -12
  57. data/lib/hanami/cli/commands/generate/action/view_spec.rspec.erb +0 -10
  58. data/lib/hanami/cli/commands/generate/action.rb +0 -321
  59. data/lib/hanami/cli/commands/generate/app/application.erb +0 -313
  60. data/lib/hanami/cli/commands/generate/app/favicon.ico +0 -0
  61. data/lib/hanami/cli/commands/generate/app/gitkeep.erb +0 -0
  62. data/lib/hanami/cli/commands/generate/app/layout.erb +0 -7
  63. data/lib/hanami/cli/commands/generate/app/layout_spec.minitest.erb +0 -10
  64. data/lib/hanami/cli/commands/generate/app/layout_spec.rspec.erb +0 -10
  65. data/lib/hanami/cli/commands/generate/app/routes.erb +0 -5
  66. data/lib/hanami/cli/commands/generate/app/template.erb.erb +0 -10
  67. data/lib/hanami/cli/commands/generate/app/template.haml.erb +0 -7
  68. data/lib/hanami/cli/commands/generate/app/template.slim.erb +0 -8
  69. data/lib/hanami/cli/commands/generate/app.rb +0 -243
  70. data/lib/hanami/cli/commands/generate/mailer/mailer.erb +0 -9
  71. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.minitest.erb +0 -7
  72. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.rspec.erb +0 -5
  73. data/lib/hanami/cli/commands/generate/mailer.rb +0 -104
  74. data/lib/hanami/cli/commands/generate/migration/migration.erb +0 -4
  75. data/lib/hanami/cli/commands/generate/migration.rb +0 -41
  76. data/lib/hanami/cli/commands/generate/model/entity.erb +0 -2
  77. data/lib/hanami/cli/commands/generate/model/entity_spec.minitest.erb +0 -5
  78. data/lib/hanami/cli/commands/generate/model/entity_spec.rspec.erb +0 -3
  79. data/lib/hanami/cli/commands/generate/model/migration.erb +0 -10
  80. data/lib/hanami/cli/commands/generate/model/repository.erb +0 -5
  81. data/lib/hanami/cli/commands/generate/model/repository_spec.minitest.erb +0 -5
  82. data/lib/hanami/cli/commands/generate/model/repository_spec.rspec.erb +0 -3
  83. data/lib/hanami/cli/commands/generate/model.rb +0 -125
  84. data/lib/hanami/cli/commands/generate/secret.rb +0 -48
  85. data/lib/hanami/cli/commands/generate.rb +0 -28
  86. data/lib/hanami/cli/commands/new/.env.development.erb +0 -3
  87. data/lib/hanami/cli/commands/new/.env.test.erb +0 -3
  88. data/lib/hanami/cli/commands/new/.gitkeep.erb +0 -0
  89. data/lib/hanami/cli/commands/new/Gemfile.erb +0 -57
  90. data/lib/hanami/cli/commands/new/README.md.erb +0 -33
  91. data/lib/hanami/cli/commands/new/config/boot.erb +0 -2
  92. data/lib/hanami/cli/commands/new/config/environment.erb +0 -49
  93. data/lib/hanami/cli/commands/new/config.ru.erb +0 -3
  94. data/lib/hanami/cli/commands/new/gitignore.erb +0 -4
  95. data/lib/hanami/cli/commands/new/gitignore_with_sqlite.erb +0 -5
  96. data/lib/hanami/cli/commands/new/hanamirc.erb +0 -3
  97. data/lib/hanami/cli/commands/new/lib/project.erb +0 -2
  98. data/lib/hanami/cli/commands/new/minitest/Rakefile.erb +0 -12
  99. data/lib/hanami/cli/commands/new/minitest/features_helper.erb +0 -11
  100. data/lib/hanami/cli/commands/new/minitest/spec_helper.erb +0 -7
  101. data/lib/hanami/cli/commands/new/rspec/Rakefile.erb +0 -9
  102. data/lib/hanami/cli/commands/new/rspec/capybara.erb +0 -8
  103. data/lib/hanami/cli/commands/new/rspec/features_helper.erb +0 -12
  104. data/lib/hanami/cli/commands/new/rspec/rspec.erb +0 -2
  105. data/lib/hanami/cli/commands/new/rspec/spec_helper.erb +0 -103
  106. data/lib/hanami/cli/commands/new/schema.sql.erb +0 -0
  107. data/lib/hanami/cli/commands/new.rb +0 -578
  108. data/lib/hanami/cli/commands/project.rb +0 -421
  109. data/lib/hanami/cli/commands/routes.rb +0 -21
  110. data/lib/hanami/cli/commands/templates.rb +0 -31
  111. data/lib/hanami/cli/commands/version.rb +0 -19
  112. data/lib/hanami/common_logger.rb +0 -109
  113. data/lib/hanami/components/app/assets.rb +0 -59
  114. data/lib/hanami/components/app/controller.rb +0 -74
  115. data/lib/hanami/components/app/routes.rb +0 -59
  116. data/lib/hanami/components/app/view.rb +0 -44
  117. data/lib/hanami/components/component.rb +0 -182
  118. data/lib/hanami/components/components.rb +0 -479
  119. data/lib/hanami/components/routes_inspector.rb +0 -72
  120. data/lib/hanami/components.rb +0 -156
  121. data/lib/hanami/config/cookies.rb +0 -69
  122. data/lib/hanami/config/framework_configuration.rb +0 -43
  123. data/lib/hanami/config/load_paths.rb +0 -46
  124. data/lib/hanami/config/mapper.rb +0 -47
  125. data/lib/hanami/config/routes.rb +0 -20
  126. data/lib/hanami/config/security.rb +0 -110
  127. data/lib/hanami/config/sessions.rb +0 -119
  128. data/lib/hanami/configuration/app.rb +0 -21
  129. data/lib/hanami/early_hints.rb +0 -129
  130. data/lib/hanami/env.rb +0 -69
  131. data/lib/hanami/environment.rb +0 -541
  132. data/lib/hanami/environment_application_configurations.rb +0 -37
  133. data/lib/hanami/hanamirc.rb +0 -169
  134. data/lib/hanami/mailer/glue.rb +0 -27
  135. data/lib/hanami/middleware_stack.rb +0 -172
  136. data/lib/hanami/rake_helper.rb +0 -78
  137. data/lib/hanami/rake_tasks.rb +0 -3
  138. data/lib/hanami/rendering_policy.rb +0 -94
  139. data/lib/hanami/routing/default.rb +0 -32
  140. data/lib/hanami/setup.rb +0 -3
  141. data/lib/hanami/static.rb +0 -63
  142. data/lib/hanami/templates/default.html.erb +0 -30
  143. data/lib/hanami/templates/welcome.html.erb +0 -52
  144. data/lib/hanami/views/default.rb +0 -37
  145. data/lib/hanami/views/default_template_finder.rb +0 -22
  146. data/lib/hanami/views/null_view.rb +0 -15
  147. data/lib/hanami/welcome.rb +0 -41
@@ -1,59 +0,0 @@
1
- require "hanami/utils/kernel"
2
-
3
- module Hanami
4
- class CLI
5
- module Commands
6
- module Db
7
- # @since 1.1.0
8
- # @api private
9
- class Rollback < Command
10
- requires "model.sql"
11
-
12
- desc "Rollback migrations"
13
-
14
- argument :steps, desc: "Number of steps to rollback the database", default: 1
15
-
16
- example [
17
- " # Rollbacks latest migration",
18
- "2 # Rollbacks last two migrations"
19
- ]
20
-
21
- # @since 1.1.0
22
- # @api private
23
- def call(steps:, **)
24
- context = Context.new(steps: steps)
25
- context = assert_valid_steps!(context)
26
-
27
- rollback_database(context)
28
- end
29
-
30
- private
31
-
32
- # @since 1.1.0
33
- # @api private
34
- def assert_valid_steps!(context)
35
- context = context.with(steps: Utils::Kernel.Integer(context.steps.to_s))
36
- handle_error(context) unless context.steps.positive?
37
- context
38
- rescue TypeError
39
- handle_error(context)
40
- end
41
-
42
- # @since 1.1.0
43
- # @api private
44
- def rollback_database(context)
45
- require "hanami/model/migrator"
46
- Hanami::Model::Migrator.rollback(steps: context.steps)
47
- end
48
-
49
- # @since 1.1.0
50
- # @api private
51
- def handle_error(context)
52
- warn "the number of steps must be a positive integer (you entered `#{context.steps}')."
53
- exit(1)
54
- end
55
- end
56
- end
57
- end
58
- end
59
- end
@@ -1,32 +0,0 @@
1
- module Hanami
2
- class CLI
3
- module Commands
4
- module Db
5
- # @since 1.1.0
6
- # @api private
7
- class Version < Command
8
- requires "model.configuration.no_logger"
9
-
10
- desc "Print the current migrated version"
11
-
12
- # @since 1.1.0
13
- # @api private
14
- def call(**options)
15
- context = Context.new(options: options)
16
-
17
- print_database_version(context)
18
- end
19
-
20
- private
21
-
22
- # @since 1.1.0
23
- # @api private
24
- def print_database_version(*)
25
- require "hanami/model/migrator"
26
- puts Hanami::Model::Migrator.version
27
- end
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,32 +0,0 @@
1
- module Hanami
2
- # Hanami CLI
3
- #
4
- # @since 1.1.0
5
- class CLI
6
- module Commands
7
- # @since 1.1.0
8
- # @api private
9
- module Db
10
- require "hanami/cli/commands/db/version"
11
- require "hanami/cli/commands/db/create"
12
- require "hanami/cli/commands/db/drop"
13
- require "hanami/cli/commands/db/migrate"
14
- require "hanami/cli/commands/db/rollback"
15
- require "hanami/cli/commands/db/prepare"
16
- require "hanami/cli/commands/db/apply"
17
- require "hanami/cli/commands/db/console"
18
- end
19
- end
20
-
21
- register "db" do |prefix|
22
- prefix.register "version", Commands::Db::Version
23
- prefix.register "create", Commands::Db::Create
24
- prefix.register "drop", Commands::Db::Drop
25
- prefix.register "migrate", Commands::Db::Migrate
26
- prefix.register "rollback", Commands::Db::Rollback
27
- prefix.register "prepare", Commands::Db::Prepare
28
- prefix.register "apply", Commands::Db::Apply
29
- prefix.register "console", Commands::Db::Console
30
- end
31
- end
32
- end
@@ -1,137 +0,0 @@
1
- module Hanami
2
- class CLI
3
- module Commands
4
- module Destroy
5
- # @since 1.1.0
6
- # @api private
7
- class Action < Command
8
- desc "Destroy an action from app"
9
-
10
- example [
11
- "web home#index # Basic usage",
12
- "admin users#index # Destroy from `admin` app"
13
- ]
14
-
15
- argument :app, required: true, desc: "The application name (eg. `web`)"
16
- argument :action, required: true, desc: "The action name (eg. `home#index`)"
17
-
18
- # @since 1.1.0
19
- # @api private
20
- def call(app:, action:, **options)
21
- app = Utils::String.underscore(app)
22
- *controller, action = controller_and_action(action)
23
- action_name = controller_and_action_name(controller, action)
24
-
25
- context = Context.new(app: app, controller: controller, action: action, action_name: action_name, options: options)
26
-
27
- assert_valid_app!(context)
28
-
29
- remove_route(context)
30
- destroy_view_spec(context)
31
- destroy_action_spec(context)
32
- destroy_templates(context)
33
- destroy_view(context)
34
- destroy_action(context)
35
- end
36
-
37
- private
38
-
39
- # @since 1.1.0
40
- # @api private
41
- def assert_valid_app!(context)
42
- return if project.app?(context)
43
-
44
- existing_apps = project.apps.map { |name| "`#{name}'" }.join(' ')
45
- warn "`#{context.app}' is not a valid APP. Please specify one of: #{existing_apps}"
46
- exit(1)
47
- end
48
-
49
- # @since 1.1.0
50
- # @api private
51
- def controller_and_action(name)
52
- # FIXME: extract this regexp
53
- name.split(/#|\//)
54
- end
55
-
56
- # @since 1.1.0
57
- # @api private
58
- def controller_and_action_name(controller, action)
59
- # FIXME: extract this separator
60
- [namespaced_controller(controller), action].join("#")
61
- end
62
-
63
- # @since 1.1.0
64
- # #api private
65
- def namespaced_controller(controller)
66
- controller.join("/")
67
- end
68
-
69
- # @since 1.1.0
70
- # @api private
71
- def remove_route(context)
72
- content = %r{#{context.action_name}}
73
- destination = project.app_routes(context)
74
-
75
- begin
76
- files.remove_line(destination, content)
77
- rescue ArgumentError
78
- warn "cannot find `#{context.action_name}' in `#{context.app}' application."
79
- warn "please run `hanami routes' to know the existing actions."
80
- exit(1)
81
- end
82
-
83
- say(:subtract, destination)
84
- end
85
-
86
- # @since 1.1.0
87
- # @api private
88
- def destroy_view_spec(context)
89
- destination = project.view_spec(context)
90
- return unless files.exist?(destination)
91
-
92
- files.delete(destination)
93
- say(:remove, destination)
94
- end
95
-
96
- # @since 1.1.0
97
- # @api private
98
- def destroy_action_spec(context)
99
- destination = project.action_spec(context)
100
-
101
- files.delete(destination)
102
- say(:remove, destination)
103
- end
104
-
105
- # @since 1.1.0
106
- # @api private
107
- def destroy_templates(context)
108
- destinations = project.templates(context)
109
- destinations.each do |destination|
110
- files.delete(destination)
111
- say(:remove, destination)
112
- end
113
- end
114
-
115
- # @since 1.1.0
116
- # @api private
117
- def destroy_view(context)
118
- destination = project.view(context)
119
- return unless files.exist?(destination)
120
-
121
- files.delete(destination)
122
- say(:remove, destination)
123
- end
124
-
125
- # @since 1.1.0
126
- # @api private
127
- def destroy_action(context)
128
- destination = project.action(context)
129
-
130
- files.delete(destination)
131
- say(:remove, destination)
132
- end
133
- end
134
- end
135
- end
136
- end
137
- end
@@ -1,159 +0,0 @@
1
- module Hanami
2
- class CLI
3
- module Commands
4
- module Destroy
5
- # @since 1.1.0
6
- # @api private
7
- class App < Command
8
- desc "Destroy an app"
9
-
10
- argument :app, required: true, desc: "The application name (eg. `web`)"
11
-
12
- example [
13
- "admin # Destroy `admin` app"
14
- ]
15
-
16
- # @since 1.1.0
17
- # @api private
18
- def call(app:, **options) # rubocop:disable Metrics/MethodLength
19
- app = Utils::String.underscore(app)
20
- context = Context.new(app: app, options: options)
21
-
22
- assert_valid_app!(context)
23
- context = context.with(base_url: base_url(context))
24
-
25
- remove_test_http_session_secret(context)
26
- remove_development_http_session_secret(context)
27
-
28
- remove_mount_app(context)
29
- remove_require_app(context)
30
-
31
- recursively_destroy_precompiled_assets(context)
32
- destroy_assets_manifest(context)
33
-
34
- recursively_destroy_specs(context)
35
- recursively_destroy_app(context)
36
- end
37
-
38
- private
39
-
40
- # @since 1.1.0
41
- # @api private
42
- def assert_valid_app!(context)
43
- return if project.app?(context)
44
-
45
- existing_apps = project.apps.map { |name| "`#{name}'" }.join(' ')
46
- warn "`#{context.app}' is not a valid APP. Please specify one of: #{existing_apps}"
47
- exit(1)
48
- end
49
-
50
- # @since 1.1.0
51
- # @api private
52
- def remove_test_http_session_secret(context)
53
- content = "#{context.app.upcase}_SESSIONS_SECRET"
54
- destination = project.env(context, "test")
55
-
56
- files.remove_line(destination, content)
57
- say(:subtract, destination)
58
- end
59
-
60
- # @since 1.1.0
61
- # @api private
62
- def remove_development_http_session_secret(context)
63
- content = "#{context.app.upcase}_SESSIONS_SECRET"
64
- destination = project.env(context, "development")
65
-
66
- files.remove_line(destination, content)
67
- say(:subtract, destination)
68
- end
69
-
70
- # @since 1.1.0
71
- # @api private
72
- def remove_mount_app(context)
73
- content = "mount #{context.app.classify}::Application"
74
- destination = project.environment(context)
75
-
76
- files.remove_line(destination, content)
77
- say(:subtract, destination)
78
- end
79
-
80
- # @since 1.1.0
81
- # @api private
82
- def remove_require_app(context)
83
- content = "require_relative '../apps/#{context.app}/application'"
84
- destination = project.environment(context)
85
-
86
- files.remove_line(destination, content)
87
- say(:subtract, destination)
88
- end
89
-
90
- # @since 1.1.0
91
- # @api private
92
- def recursively_destroy_precompiled_assets(context)
93
- destination = project.public_app_assets(context)
94
- return unless files.directory?(destination)
95
-
96
- files.delete_directory(destination)
97
- say(:remove, destination)
98
- end
99
-
100
- # @since 1.1.0
101
- # @api private
102
- def destroy_assets_manifest(context)
103
- destination = project.assets_manifest(context)
104
- return unless files.exist?(destination)
105
-
106
- files.delete(destination)
107
- say(:remove, destination)
108
- end
109
-
110
- # @since 1.1.0
111
- # @api private
112
- def recursively_destroy_specs(context)
113
- destination = project.app_spec(context)
114
-
115
- files.delete_directory(destination)
116
- say(:remove, destination)
117
- end
118
-
119
- # @since 1.1.0
120
- # @api private
121
- def recursively_destroy_app(context)
122
- destination = project.app(context)
123
-
124
- files.delete_directory(destination)
125
- say(:remove, destination)
126
- end
127
-
128
- # @since 1.1.0
129
- # @api private
130
- def base_url(context)
131
- content = "mount #{context.app.classify}::Application"
132
- destination = project.environment(context)
133
-
134
- line = read_matching_line(destination, content)
135
- *, at = line.split(/at\:[[:space:]]*/)
136
-
137
- at.strip.gsub(/["']*/, "")
138
- end
139
-
140
- # @since 1.1.0
141
- # @api private
142
- def read_matching_line(path, target)
143
- content = ::File.readlines(path)
144
- line = content.find do |l|
145
- case target
146
- when String
147
- l.include?(target)
148
- when Regexp
149
- l =~ target
150
- end
151
- end
152
-
153
- line or raise ArgumentError.new("Cannot find `#{target}' inside `#{path}'.")
154
- end
155
- end
156
- end
157
- end
158
- end
159
- end
@@ -1,74 +0,0 @@
1
- module Hanami
2
- class CLI
3
- module Commands
4
- module Destroy
5
- # @since 1.1.0
6
- # @api private
7
- class Mailer < Command
8
- requires "environment"
9
- desc "Destroy a mailer"
10
-
11
- argument :mailer, required: true, desc: "The mailer name (eg. `welcome`)"
12
-
13
- example [
14
- "welcome # Destroy `WelcomeMailer` mailer"
15
- ]
16
-
17
- # @since 1.1.0
18
- # @api private
19
- def call(mailer:, **options)
20
- mailer = Utils::String.transform(mailer, :underscore, :singularize)
21
- context = Context.new(mailer: mailer, options: options)
22
-
23
- assert_valid_mailer!(context)
24
-
25
- destroy_mailer_spec(context)
26
- destroy_templates(context)
27
- destroy_mailer(context)
28
- end
29
-
30
- private
31
-
32
- # @since 1.1.0
33
- # @api private
34
- def assert_valid_mailer!(context)
35
- destination = project.mailer(context)
36
- return if files.exist?(destination)
37
-
38
- destination = project.mailers(context)
39
- warn "cannot find `#{context.mailer}' mailer. Please have a look at `#{destination}' directory to find an existing mailer."
40
- exit(1)
41
- end
42
-
43
- # @since 1.1.0
44
- # @api private
45
- def destroy_mailer_spec(context)
46
- destination = project.mailer_spec(context)
47
-
48
- files.delete(destination)
49
- say(:remove, destination)
50
- end
51
-
52
- # @since 1.1.0
53
- # @api private
54
- def destroy_templates(context)
55
- destinations = project.mailer_templates(context)
56
- destinations.each do |destination|
57
- files.delete(destination)
58
- say(:remove, destination)
59
- end
60
- end
61
-
62
- # @since 1.1.0
63
- # @api private
64
- def destroy_mailer(context)
65
- destination = project.mailer(context)
66
-
67
- files.delete(destination)
68
- say(:remove, destination)
69
- end
70
- end
71
- end
72
- end
73
- end
74
- end
@@ -1,51 +0,0 @@
1
- module Hanami
2
- class CLI
3
- module Commands
4
- module Destroy
5
- # @since 1.1.0
6
- # @api private
7
- class Migration < Command
8
- desc "Destroy a migration"
9
-
10
- argument :migration, required: true, desc: "The migration name (eg. `create_users`)"
11
-
12
- example [
13
- "create_users # Destroy `db/migrations/#{Project.migration_timestamp}_create_users.rb`"
14
- ]
15
-
16
- # @since 1.1.0
17
- # @api private
18
- def call(migration:, **options)
19
- migration = Utils::String.underscore(migration)
20
- context = Context.new(migration: migration, options: options)
21
- context = context.with(destination: project.find_migration(context))
22
-
23
- assert_valid_migration!(context)
24
-
25
- destroy_migration(context)
26
- true
27
- end
28
-
29
- private
30
-
31
- # @since 1.1.0
32
- # @api private
33
- def assert_valid_migration!(context)
34
- return if !context.destination.nil? && files.exist?(context.destination)
35
-
36
- destination = project.migrations(context)
37
- warn "cannot find `#{context.migration}'. Please have a look at `#{destination}' directory to find an existing migration"
38
- exit(1)
39
- end
40
-
41
- # @since 1.1.0
42
- # @api private
43
- def destroy_migration(context)
44
- files.delete(context.destination)
45
- say(:remove, context.destination)
46
- end
47
- end
48
- end
49
- end
50
- end
51
- end
@@ -1,84 +0,0 @@
1
- module Hanami
2
- class CLI
3
- module Commands
4
- module Destroy
5
- # @since 1.1.0
6
- # @api private
7
- class Model < Command
8
- requires "environment"
9
-
10
- desc "Destroy a model"
11
-
12
- argument :model, required: true, desc: "The model name (eg. `user`)"
13
-
14
- example [
15
- "user # Destroy `User` entity and `UserRepository` repository"
16
- ]
17
-
18
- # @since 1.1.0
19
- # @api private
20
- def call(model:, **options)
21
- model = Utils::String.transform(model, :underscore, :singularize)
22
- context = Context.new(model: model, options: options)
23
-
24
- assert_valid_model!(context)
25
-
26
- destroy_repository_spec(context)
27
- destroy_entity_spec(context)
28
- destroy_repository(context)
29
- destroy_entity(context)
30
- end
31
-
32
- private
33
-
34
- # @since 1.1.0
35
- # @api private
36
- def assert_valid_model!(context)
37
- destination = project.entity(context)
38
- return if files.exist?(destination)
39
-
40
- destination = project.entities(context)
41
- warn "cannot find `#{context.model}' model. Please have a look at `#{destination}' directory to find an existing model."
42
- exit(1)
43
- end
44
-
45
- # @since 1.1.0
46
- # @api private
47
- def destroy_repository_spec(context)
48
- destination = project.repository_spec(context)
49
-
50
- files.delete(destination)
51
- say(:remove, destination)
52
- end
53
-
54
- # @since 1.1.0
55
- # @api private
56
- def destroy_entity_spec(context)
57
- destination = project.entity_spec(context)
58
-
59
- files.delete(destination)
60
- say(:remove, destination)
61
- end
62
-
63
- # @since 1.1.0
64
- # @api private
65
- def destroy_repository(context)
66
- destination = project.repository(context)
67
-
68
- files.delete(destination)
69
- say(:remove, destination)
70
- end
71
-
72
- # @since 1.1.0
73
- # @api private
74
- def destroy_entity(context)
75
- destination = project.entity(context)
76
-
77
- files.delete(destination)
78
- say(:remove, destination)
79
- end
80
- end
81
- end
82
- end
83
- end
84
- end
@@ -1,26 +0,0 @@
1
- module Hanami
2
- # Hanami CLI
3
- #
4
- # @since 1.1.0
5
- class CLI
6
- module Commands
7
- # @since 1.1.0
8
- # @api private
9
- module Destroy
10
- require "hanami/cli/commands/destroy/app"
11
- require "hanami/cli/commands/destroy/action"
12
- require "hanami/cli/commands/destroy/model"
13
- require "hanami/cli/commands/destroy/mailer"
14
- require "hanami/cli/commands/destroy/migration"
15
- end
16
- end
17
-
18
- register "destroy", aliases: ["d"] do |prefix|
19
- prefix.register "app", Commands::Destroy::App
20
- prefix.register "action", Commands::Destroy::Action
21
- prefix.register "model", Commands::Destroy::Model
22
- prefix.register "mailer", Commands::Destroy::Mailer
23
- prefix.register "migration", Commands::Destroy::Migration
24
- end
25
- end
26
- end
@@ -1,7 +0,0 @@
1
- module <%= app.classify %>
2
- module Controllers
3
- <%= beginning_module_definition %>
4
- <%= action_class_definition %>
5
- <%= ending_module_definition %>
6
- end
7
- end
@@ -1,11 +0,0 @@
1
- require_relative '../../../spec_helper'
2
-
3
- describe <%= app.classify %>::Controllers::<%= classified_controller_name %>::<%= action.classify %> do
4
- let(:action) { <%= app.classify %>::Controllers::<%= classified_controller_name %>::<%= action.classify %>.new }
5
- let(:params) { Hash[] }
6
-
7
- it 'is successful' do
8
- response = action.call(params)
9
- _(response[0]).must_equal 200
10
- end
11
- end
@@ -1,9 +0,0 @@
1
- RSpec.describe <%= app.classify %>::Controllers::<%= classified_controller_name %>::<%= action.classify %>, type: :action do
2
- let(:action) { described_class.new }
3
- let(:params) { Hash[] }
4
-
5
- it 'is successful' do
6
- response = action.call(params)
7
- expect(response[0]).to eq 200
8
- end
9
- end
@@ -1,7 +0,0 @@
1
- module <%= app.classify %>
2
- module Controllers
3
- <%= beginning_module_definition %>
4
- <%= action_class_definition %>
5
- <%= ending_module_definition %>
6
- end
7
- end