hanami-cli 2.1.0 → 2.2.0.beta1
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/.github/workflows/ci.yml +18 -13
- data/CHANGELOG.md +21 -0
- data/Gemfile +4 -2
- data/README.md +11 -7
- data/docker-compose.yml +9 -0
- data/hanami-cli.gemspec +2 -2
- data/lib/hanami/cli/command.rb +1 -1
- data/lib/hanami/cli/commands/app/assets/command.rb +1 -1
- data/lib/hanami/cli/commands/app/command.rb +2 -16
- data/lib/hanami/cli/commands/app/db/command.rb +116 -0
- data/lib/hanami/cli/commands/app/db/create.rb +19 -11
- data/lib/hanami/cli/commands/app/db/drop.rb +19 -10
- data/lib/hanami/cli/commands/app/db/migrate.rb +19 -13
- data/lib/hanami/cli/commands/app/db/prepare.rb +42 -0
- data/lib/hanami/cli/commands/app/db/seed.rb +11 -22
- data/lib/hanami/cli/commands/app/db/structure/dump.rb +30 -7
- data/lib/hanami/cli/commands/app/db/structure/load.rb +52 -0
- data/lib/hanami/cli/commands/app/db/utils/database.rb +68 -73
- data/lib/hanami/cli/commands/app/db/utils/mysql.rb +2 -2
- data/lib/hanami/cli/commands/app/db/utils/postgres.rb +38 -19
- data/lib/hanami/cli/commands/app/db/utils/sqlite.rb +58 -10
- data/lib/hanami/cli/commands/app/db/version.rb +12 -9
- data/lib/hanami/cli/commands/app/generate/action.rb +4 -3
- data/lib/hanami/cli/commands/app/generate/command.rb +49 -0
- data/lib/hanami/cli/commands/app/generate/component.rb +49 -0
- data/lib/hanami/cli/commands/app/generate/migration.rb +27 -0
- data/lib/hanami/cli/commands/app/generate/operation.rb +26 -0
- data/lib/hanami/cli/commands/app/generate/part.rb +1 -1
- data/lib/hanami/cli/commands/app/generate/relation.rb +35 -0
- data/lib/hanami/cli/commands/app/generate/repo.rb +46 -0
- data/lib/hanami/cli/commands/app/generate/slice.rb +20 -3
- data/lib/hanami/cli/commands/app/generate/struct.rb +27 -0
- data/lib/hanami/cli/commands/app/install.rb +1 -1
- data/lib/hanami/cli/commands/app/middleware.rb +1 -1
- data/lib/hanami/cli/commands/app/server.rb +2 -2
- data/lib/hanami/cli/commands/app.rb +21 -2
- data/lib/hanami/cli/commands/gem/new.rb +78 -14
- data/lib/hanami/cli/errors.rb +28 -0
- data/lib/hanami/cli/generators/app/action/slice_action.erb +1 -1
- data/lib/hanami/cli/generators/app/action_context.rb +5 -13
- data/lib/hanami/cli/generators/app/component/component.erb +8 -0
- data/lib/hanami/cli/generators/app/component/slice_component.erb +8 -0
- data/lib/hanami/cli/generators/app/component.rb +61 -0
- data/lib/hanami/cli/generators/app/component_context.rb +82 -0
- data/lib/hanami/cli/generators/app/migration.rb +69 -0
- data/lib/hanami/cli/generators/app/operation.rb +48 -0
- data/lib/hanami/cli/generators/app/part_context.rb +5 -21
- data/lib/hanami/cli/generators/app/relation.rb +44 -0
- data/lib/hanami/cli/generators/app/repo.rb +40 -0
- data/lib/hanami/cli/generators/app/ruby_file_writer.rb +149 -0
- data/lib/hanami/cli/generators/app/slice/operation.erb +7 -0
- data/lib/hanami/cli/generators/app/slice/relation.erb +8 -0
- data/lib/hanami/cli/generators/app/slice/{slice.erb → repo.erb} +3 -1
- data/lib/hanami/cli/generators/app/slice/struct.erb +8 -0
- data/lib/hanami/cli/generators/app/slice.rb +14 -6
- data/lib/hanami/cli/generators/app/slice_context.rb +9 -2
- data/lib/hanami/cli/generators/app/struct.rb +39 -0
- data/lib/hanami/cli/generators/app/view_context.rb +4 -16
- data/lib/hanami/cli/generators/constants.rb +39 -0
- data/lib/hanami/cli/generators/context.rb +48 -0
- data/lib/hanami/cli/generators/gem/app/action.erb +3 -0
- data/lib/hanami/cli/generators/gem/app/env.erb +4 -0
- data/lib/hanami/cli/generators/gem/app/gemfile.erb +11 -0
- data/lib/hanami/cli/generators/gem/app/gitignore.erb +1 -1
- data/lib/hanami/cli/generators/gem/app/operation.erb +13 -0
- data/lib/hanami/cli/generators/gem/app/relation.erb +10 -0
- data/lib/hanami/cli/generators/gem/app/repo.erb +10 -0
- data/lib/hanami/cli/generators/gem/app/struct.erb +10 -0
- data/lib/hanami/cli/generators/gem/app.rb +19 -0
- data/lib/hanami/cli/ruby_file_generator.rb +123 -0
- data/lib/hanami/cli/version.rb +1 -1
- metadata +39 -16
- data/lib/hanami/cli/commands/app/db/create_migration.rb +0 -32
- data/lib/hanami/cli/commands/app/db/reset.rb +0 -28
- data/lib/hanami/cli/commands/app/db/rollback.rb +0 -81
- data/lib/hanami/cli/commands/app/db/sample_data.rb +0 -42
- data/lib/hanami/cli/commands/app/db/setup.rb +0 -26
- data/lib/hanami/cli/commands/app/db/utils/database_config.rb +0 -60
- data/lib/hanami/cli/generators/app/slice/repository.erb +0 -10
@@ -80,6 +80,44 @@ module Hanami
|
|
80
80
|
!options.fetch(:skip_assets, false)
|
81
81
|
end
|
82
82
|
|
83
|
+
# @since 2.2.0
|
84
|
+
# @api private
|
85
|
+
def generate_db?
|
86
|
+
!options.fetch(:skip_db, false)
|
87
|
+
end
|
88
|
+
|
89
|
+
# @since 2.2.0
|
90
|
+
# @api private
|
91
|
+
def generate_sqlite?
|
92
|
+
database_option == Commands::Gem::New::DATABASE_SQLITE
|
93
|
+
end
|
94
|
+
|
95
|
+
# @since 2.2.0
|
96
|
+
# @api private
|
97
|
+
def generate_postgres?
|
98
|
+
database_option == Commands::Gem::New::DATABASE_POSTGRES
|
99
|
+
end
|
100
|
+
|
101
|
+
# @since 2.2.0
|
102
|
+
# @api private
|
103
|
+
def generate_mysql?
|
104
|
+
database_option == Commands::Gem::New::DATABASE_MYSQL
|
105
|
+
end
|
106
|
+
|
107
|
+
# @since 2.2.0
|
108
|
+
# @api private
|
109
|
+
def database_url
|
110
|
+
if generate_sqlite?
|
111
|
+
"sqlite://db/#{app}.sqlite"
|
112
|
+
elsif generate_postgres?
|
113
|
+
"postgres://localhost/#{app}"
|
114
|
+
elsif generate_mysql?
|
115
|
+
"mysql://localhost/#{app}"
|
116
|
+
else
|
117
|
+
raise "Unknown database option: #{database_option}"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
83
121
|
# @since 2.1.0
|
84
122
|
# @api private
|
85
123
|
def bundled_views?
|
@@ -92,6 +130,12 @@ module Hanami
|
|
92
130
|
Hanami.bundled?("hanami-assets")
|
93
131
|
end
|
94
132
|
|
133
|
+
# @since 2.2.0
|
134
|
+
# @api private
|
135
|
+
def bundled_dry_monads?
|
136
|
+
Hanami.bundled?("dry-monads")
|
137
|
+
end
|
138
|
+
|
95
139
|
# @since 2.1.0
|
96
140
|
# @api private
|
97
141
|
#
|
@@ -102,6 +146,10 @@ module Hanami
|
|
102
146
|
|
103
147
|
private
|
104
148
|
|
149
|
+
def database_option
|
150
|
+
options.fetch(:database, Commands::Gem::New::DATABASE_SQLITE)
|
151
|
+
end
|
152
|
+
|
105
153
|
# @since 2.0.0
|
106
154
|
# @api private
|
107
155
|
attr_reader :inflector
|
@@ -2,8 +2,11 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require "hanami/action"
|
5
|
+
require "dry/monads"
|
5
6
|
|
6
7
|
module <%= camelized_app_name %>
|
7
8
|
class Action < Hanami::Action
|
9
|
+
# Provide `Success` and `Failure` for pattern matching on operation results
|
10
|
+
include Dry::Monads[:result]
|
8
11
|
end
|
9
12
|
end
|
@@ -7,13 +7,24 @@ source "https://rubygems.org"
|
|
7
7
|
<%= hanami_gem("assets") %>
|
8
8
|
<%- end -%>
|
9
9
|
<%= hanami_gem("controller") %>
|
10
|
+
<%- if generate_db? -%>
|
11
|
+
<%= hanami_gem("db") %>
|
12
|
+
<%- end -%>
|
10
13
|
<%= hanami_gem("router") %>
|
11
14
|
<%= hanami_gem("validations") %>
|
12
15
|
<%= hanami_gem("view") %>
|
13
16
|
|
14
17
|
gem "dry-types", "~> 1.0", ">= 1.6.1"
|
18
|
+
gem "dry-operation", github: "dry-rb/dry-operation"
|
15
19
|
gem "puma"
|
16
20
|
gem "rake"
|
21
|
+
<%- if generate_sqlite? -%>
|
22
|
+
gem "sqlite3"
|
23
|
+
<%- elsif generate_postgres? -%>
|
24
|
+
gem "pg"
|
25
|
+
<%- elsif generate_mysql? -%>
|
26
|
+
gem "mysql2"
|
27
|
+
<%- end -%>
|
17
28
|
|
18
29
|
group :development do
|
19
30
|
<%= hanami_gem("webconsole") %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# auto_register: false
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "dry/operation"
|
5
|
+
|
6
|
+
module <%= camelized_app_name %>
|
7
|
+
class Operation < Dry::Operation
|
8
|
+
<%- if generate_db? -%>
|
9
|
+
# Provide `transaction do ... end` method for database transactions
|
10
|
+
include Dry::Operation::Extensions::ROM
|
11
|
+
<%- end -%>
|
12
|
+
end
|
13
|
+
end
|
@@ -68,6 +68,25 @@ module Hanami
|
|
68
68
|
fs.write("app/assets/images/favicon.ico", file("favicon.ico"))
|
69
69
|
end
|
70
70
|
|
71
|
+
if context.generate_db?
|
72
|
+
fs.write("app/db/relation.rb", t("relation.erb", context))
|
73
|
+
fs.write("app/relations/.keep", t("keep.erb", context))
|
74
|
+
|
75
|
+
fs.write("app/db/repo.rb", t("repo.erb", context))
|
76
|
+
fs.write("app/repos/.keep", t("keep.erb", context))
|
77
|
+
|
78
|
+
fs.write("app/db/struct.rb", t("struct.erb", context))
|
79
|
+
fs.write("app/structs/.keep", t("keep.erb", context))
|
80
|
+
|
81
|
+
fs.write("config/db/migrate/.keep" , t("keep.erb", context))
|
82
|
+
|
83
|
+
if context.generate_sqlite?
|
84
|
+
fs.write("db/.keep" , t("keep.erb", context))
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
fs.write("app/operation.rb", t("operation.erb", context))
|
89
|
+
|
71
90
|
fs.write("public/404.html", file("404.html"))
|
72
91
|
fs.write("public/500.html", file("500.html"))
|
73
92
|
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "ripper"
|
4
|
+
|
5
|
+
module Hanami
|
6
|
+
module CLI
|
7
|
+
class RubyFileGenerator
|
8
|
+
# @api private
|
9
|
+
# @since 2.2.0
|
10
|
+
class GeneratedUnparseableCodeError < Error
|
11
|
+
def initialize(source_code)
|
12
|
+
super(
|
13
|
+
<<~ERROR_MESSAGE
|
14
|
+
Sorry, the code we generated is not valid Ruby.
|
15
|
+
|
16
|
+
Here's what we got:
|
17
|
+
|
18
|
+
#{source_code}
|
19
|
+
|
20
|
+
Please fix the errors and try again.
|
21
|
+
ERROR_MESSAGE
|
22
|
+
)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
INDENT = " "
|
27
|
+
|
28
|
+
def self.class(class_name, **args)
|
29
|
+
new(class_name: class_name, **args).to_s
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.module(*names, **args)
|
33
|
+
module_names = if names.first.is_a?(Array)
|
34
|
+
names.first
|
35
|
+
else
|
36
|
+
names
|
37
|
+
end
|
38
|
+
|
39
|
+
new(modules: module_names, class_name: nil, parent_class: nil, **args).to_s
|
40
|
+
end
|
41
|
+
|
42
|
+
def initialize(
|
43
|
+
class_name: nil,
|
44
|
+
parent_class: nil,
|
45
|
+
modules: [],
|
46
|
+
header: [],
|
47
|
+
body: []
|
48
|
+
)
|
49
|
+
@class_name = class_name
|
50
|
+
@parent_class = parent_class
|
51
|
+
@modules = modules
|
52
|
+
@header = header.any? ? (header + [""]) : []
|
53
|
+
@body = body
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_s
|
57
|
+
definition = lines(modules).map { |line| "#{line}\n" }.join
|
58
|
+
source_code = [header, definition].flatten.join("\n")
|
59
|
+
ensure_parseable!(source_code)
|
60
|
+
source_code
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
attr_reader(
|
66
|
+
:class_name,
|
67
|
+
:parent_class,
|
68
|
+
:modules,
|
69
|
+
:header,
|
70
|
+
:body
|
71
|
+
)
|
72
|
+
|
73
|
+
def lines(remaining_modules)
|
74
|
+
this_module, *rest_modules = remaining_modules
|
75
|
+
if this_module
|
76
|
+
with_module_lines(this_module, lines(rest_modules))
|
77
|
+
elsif class_name
|
78
|
+
class_lines
|
79
|
+
else
|
80
|
+
body
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def with_module_lines(module_name, contents_lines)
|
85
|
+
[
|
86
|
+
"module #{module_name}",
|
87
|
+
*contents_lines.map { |line| indent(line) },
|
88
|
+
"end"
|
89
|
+
]
|
90
|
+
end
|
91
|
+
|
92
|
+
def class_lines
|
93
|
+
[
|
94
|
+
class_definition,
|
95
|
+
*body.map { |line| indent(line) },
|
96
|
+
"end"
|
97
|
+
].compact
|
98
|
+
end
|
99
|
+
|
100
|
+
def class_definition
|
101
|
+
if parent_class
|
102
|
+
"class #{class_name} < #{parent_class}"
|
103
|
+
else
|
104
|
+
"class #{class_name}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def indent(line)
|
109
|
+
if line.strip.empty?
|
110
|
+
""
|
111
|
+
else
|
112
|
+
INDENT + line
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def ensure_parseable!(source_code)
|
117
|
+
unless Ripper.sexp(source_code)
|
118
|
+
raise GeneratedUnparseableCodeError.new(source_code)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
data/lib/hanami/cli/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hanami-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -31,9 +31,9 @@ dependencies:
|
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '1.0'
|
34
|
-
- - "
|
34
|
+
- - ">="
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version:
|
36
|
+
version: 1.1.0
|
37
37
|
type: :runtime
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -41,9 +41,9 @@ dependencies:
|
|
41
41
|
- - "~>"
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: '1.0'
|
44
|
-
- - "
|
44
|
+
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
46
|
+
version: 1.1.0
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: dry-files
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -183,6 +183,7 @@ files:
|
|
183
183
|
- Rakefile
|
184
184
|
- bin/console
|
185
185
|
- bin/setup
|
186
|
+
- docker-compose.yml
|
186
187
|
- exe/hanami
|
187
188
|
- hanami-cli.gemspec
|
188
189
|
- lib/hanami-cli.rb
|
@@ -197,18 +198,15 @@ files:
|
|
197
198
|
- lib/hanami/cli/commands/app/assets/watch.rb
|
198
199
|
- lib/hanami/cli/commands/app/command.rb
|
199
200
|
- lib/hanami/cli/commands/app/console.rb
|
201
|
+
- lib/hanami/cli/commands/app/db/command.rb
|
200
202
|
- lib/hanami/cli/commands/app/db/create.rb
|
201
|
-
- lib/hanami/cli/commands/app/db/create_migration.rb
|
202
203
|
- lib/hanami/cli/commands/app/db/drop.rb
|
203
204
|
- lib/hanami/cli/commands/app/db/migrate.rb
|
204
|
-
- lib/hanami/cli/commands/app/db/
|
205
|
-
- lib/hanami/cli/commands/app/db/rollback.rb
|
206
|
-
- lib/hanami/cli/commands/app/db/sample_data.rb
|
205
|
+
- lib/hanami/cli/commands/app/db/prepare.rb
|
207
206
|
- lib/hanami/cli/commands/app/db/seed.rb
|
208
|
-
- lib/hanami/cli/commands/app/db/setup.rb
|
209
207
|
- lib/hanami/cli/commands/app/db/structure/dump.rb
|
208
|
+
- lib/hanami/cli/commands/app/db/structure/load.rb
|
210
209
|
- lib/hanami/cli/commands/app/db/utils/database.rb
|
211
|
-
- lib/hanami/cli/commands/app/db/utils/database_config.rb
|
212
210
|
- lib/hanami/cli/commands/app/db/utils/mysql.rb
|
213
211
|
- lib/hanami/cli/commands/app/db/utils/postgres.rb
|
214
212
|
- lib/hanami/cli/commands/app/db/utils/sqlite.rb
|
@@ -216,8 +214,15 @@ files:
|
|
216
214
|
- lib/hanami/cli/commands/app/dev.rb
|
217
215
|
- lib/hanami/cli/commands/app/generate.rb
|
218
216
|
- lib/hanami/cli/commands/app/generate/action.rb
|
217
|
+
- lib/hanami/cli/commands/app/generate/command.rb
|
218
|
+
- lib/hanami/cli/commands/app/generate/component.rb
|
219
|
+
- lib/hanami/cli/commands/app/generate/migration.rb
|
220
|
+
- lib/hanami/cli/commands/app/generate/operation.rb
|
219
221
|
- lib/hanami/cli/commands/app/generate/part.rb
|
222
|
+
- lib/hanami/cli/commands/app/generate/relation.rb
|
223
|
+
- lib/hanami/cli/commands/app/generate/repo.rb
|
220
224
|
- lib/hanami/cli/commands/app/generate/slice.rb
|
225
|
+
- lib/hanami/cli/commands/app/generate/struct.rb
|
221
226
|
- lib/hanami/cli/commands/app/generate/view.rb
|
222
227
|
- lib/hanami/cli/commands/app/install.rb
|
223
228
|
- lib/hanami/cli/commands/app/middleware.rb
|
@@ -238,12 +243,21 @@ files:
|
|
238
243
|
- lib/hanami/cli/generators/app/action/template.html.erb
|
239
244
|
- lib/hanami/cli/generators/app/action/view.erb
|
240
245
|
- lib/hanami/cli/generators/app/action_context.rb
|
246
|
+
- lib/hanami/cli/generators/app/component.rb
|
247
|
+
- lib/hanami/cli/generators/app/component/component.erb
|
248
|
+
- lib/hanami/cli/generators/app/component/slice_component.erb
|
249
|
+
- lib/hanami/cli/generators/app/component_context.rb
|
250
|
+
- lib/hanami/cli/generators/app/migration.rb
|
251
|
+
- lib/hanami/cli/generators/app/operation.rb
|
241
252
|
- lib/hanami/cli/generators/app/part.rb
|
242
253
|
- lib/hanami/cli/generators/app/part/app_base_part.erb
|
243
254
|
- lib/hanami/cli/generators/app/part/app_part.erb
|
244
255
|
- lib/hanami/cli/generators/app/part/slice_base_part.erb
|
245
256
|
- lib/hanami/cli/generators/app/part/slice_part.erb
|
246
257
|
- lib/hanami/cli/generators/app/part_context.rb
|
258
|
+
- lib/hanami/cli/generators/app/relation.rb
|
259
|
+
- lib/hanami/cli/generators/app/repo.rb
|
260
|
+
- lib/hanami/cli/generators/app/ruby_file_writer.rb
|
247
261
|
- lib/hanami/cli/generators/app/slice.rb
|
248
262
|
- lib/hanami/cli/generators/app/slice/action.erb
|
249
263
|
- lib/hanami/cli/generators/app/slice/app_css.erb
|
@@ -253,17 +267,21 @@ files:
|
|
253
267
|
- lib/hanami/cli/generators/app/slice/favicon.ico
|
254
268
|
- lib/hanami/cli/generators/app/slice/helpers.erb
|
255
269
|
- lib/hanami/cli/generators/app/slice/keep.erb
|
256
|
-
- lib/hanami/cli/generators/app/slice/
|
270
|
+
- lib/hanami/cli/generators/app/slice/operation.erb
|
271
|
+
- lib/hanami/cli/generators/app/slice/relation.erb
|
272
|
+
- lib/hanami/cli/generators/app/slice/repo.erb
|
257
273
|
- lib/hanami/cli/generators/app/slice/routes.erb
|
258
|
-
- lib/hanami/cli/generators/app/slice/
|
274
|
+
- lib/hanami/cli/generators/app/slice/struct.erb
|
259
275
|
- lib/hanami/cli/generators/app/slice/view.erb
|
260
276
|
- lib/hanami/cli/generators/app/slice_context.rb
|
277
|
+
- lib/hanami/cli/generators/app/struct.rb
|
261
278
|
- lib/hanami/cli/generators/app/view.rb
|
262
279
|
- lib/hanami/cli/generators/app/view/app_template.html.erb
|
263
280
|
- lib/hanami/cli/generators/app/view/app_view.erb
|
264
281
|
- lib/hanami/cli/generators/app/view/slice_template.html.erb
|
265
282
|
- lib/hanami/cli/generators/app/view/slice_view.erb
|
266
283
|
- lib/hanami/cli/generators/app/view_context.rb
|
284
|
+
- lib/hanami/cli/generators/constants.rb
|
267
285
|
- lib/hanami/cli/generators/context.rb
|
268
286
|
- lib/hanami/cli/generators/gem/app.rb
|
269
287
|
- lib/hanami/cli/generators/gem/app/404.html
|
@@ -282,13 +300,17 @@ files:
|
|
282
300
|
- lib/hanami/cli/generators/gem/app/gitignore.erb
|
283
301
|
- lib/hanami/cli/generators/gem/app/helpers.erb
|
284
302
|
- lib/hanami/cli/generators/gem/app/keep.erb
|
303
|
+
- lib/hanami/cli/generators/gem/app/operation.erb
|
285
304
|
- lib/hanami/cli/generators/gem/app/package.json.erb
|
286
305
|
- lib/hanami/cli/generators/gem/app/procfile.erb
|
287
306
|
- lib/hanami/cli/generators/gem/app/puma.erb
|
288
307
|
- lib/hanami/cli/generators/gem/app/rakefile.erb
|
289
308
|
- lib/hanami/cli/generators/gem/app/readme.erb
|
309
|
+
- lib/hanami/cli/generators/gem/app/relation.erb
|
310
|
+
- lib/hanami/cli/generators/gem/app/repo.erb
|
290
311
|
- lib/hanami/cli/generators/gem/app/routes.erb
|
291
312
|
- lib/hanami/cli/generators/gem/app/settings.erb
|
313
|
+
- lib/hanami/cli/generators/gem/app/struct.erb
|
292
314
|
- lib/hanami/cli/generators/gem/app/types.erb
|
293
315
|
- lib/hanami/cli/generators/gem/app/validator.erb
|
294
316
|
- lib/hanami/cli/generators/gem/app/view.erb
|
@@ -300,6 +322,7 @@ files:
|
|
300
322
|
- lib/hanami/cli/repl/core.rb
|
301
323
|
- lib/hanami/cli/repl/irb.rb
|
302
324
|
- lib/hanami/cli/repl/pry.rb
|
325
|
+
- lib/hanami/cli/ruby_file_generator.rb
|
303
326
|
- lib/hanami/cli/server.rb
|
304
327
|
- lib/hanami/cli/system_call.rb
|
305
328
|
- lib/hanami/cli/url.rb
|
@@ -324,14 +347,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
324
347
|
requirements:
|
325
348
|
- - ">="
|
326
349
|
- !ruby/object:Gem::Version
|
327
|
-
version: '3.
|
350
|
+
version: '3.1'
|
328
351
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
329
352
|
requirements:
|
330
353
|
- - ">="
|
331
354
|
- !ruby/object:Gem::Version
|
332
355
|
version: '0'
|
333
356
|
requirements: []
|
334
|
-
rubygems_version: 3.5.
|
357
|
+
rubygems_version: 3.5.9
|
335
358
|
signing_key:
|
336
359
|
specification_version: 4
|
337
360
|
summary: Hanami CLI
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "../../app/command"
|
4
|
-
require_relative "structure/dump"
|
5
|
-
|
6
|
-
module Hanami
|
7
|
-
module CLI
|
8
|
-
module Commands
|
9
|
-
module App
|
10
|
-
# @api private
|
11
|
-
module DB
|
12
|
-
# @api private
|
13
|
-
class CreateMigration < App::Command
|
14
|
-
desc "Create new migration file"
|
15
|
-
|
16
|
-
argument :name, desc: "Migration file name"
|
17
|
-
|
18
|
-
# @api private
|
19
|
-
def call(name:, **)
|
20
|
-
migrator = database.migrator
|
21
|
-
version = migrator.generate_version
|
22
|
-
|
23
|
-
measure "migration #{version}_#{name} created" do
|
24
|
-
migrator.create_file(name, version)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "../../app/command"
|
4
|
-
require_relative "create"
|
5
|
-
require_relative "drop"
|
6
|
-
require_relative "migrate"
|
7
|
-
|
8
|
-
module Hanami
|
9
|
-
module CLI
|
10
|
-
module Commands
|
11
|
-
module App
|
12
|
-
module DB
|
13
|
-
# @api private
|
14
|
-
class Reset < App::Command
|
15
|
-
desc "Drop, create, and migrate database"
|
16
|
-
|
17
|
-
# @api private
|
18
|
-
def call(**)
|
19
|
-
run_command Drop
|
20
|
-
run_command Create
|
21
|
-
run_command Migrate
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,81 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "../../app/command"
|
4
|
-
require_relative "structure/dump"
|
5
|
-
|
6
|
-
module Hanami
|
7
|
-
module CLI
|
8
|
-
module Commands
|
9
|
-
module App
|
10
|
-
module DB
|
11
|
-
# @api private
|
12
|
-
class Rollback < App::Command
|
13
|
-
desc "Rollback database to a previous migration"
|
14
|
-
|
15
|
-
option :target, desc: "Target migration number", aliases: ["-t"]
|
16
|
-
option :dump, desc: "Dump structure after rolling back"
|
17
|
-
|
18
|
-
# @api private
|
19
|
-
def call(target: nil, dump: true, **)
|
20
|
-
migration_code, migration_name = find_migration(target)
|
21
|
-
|
22
|
-
if migration_name.nil?
|
23
|
-
output = if target
|
24
|
-
"==> migration file for target #{target} was not found"
|
25
|
-
else
|
26
|
-
"==> no migrations to rollback"
|
27
|
-
end
|
28
|
-
|
29
|
-
out.puts output
|
30
|
-
return
|
31
|
-
end
|
32
|
-
|
33
|
-
measure "database #{database.name} rolled back to #{migration_name}" do
|
34
|
-
database.run_migrations(target: Integer(migration_code))
|
35
|
-
|
36
|
-
true
|
37
|
-
end
|
38
|
-
|
39
|
-
run_command Structure::Dump if dump
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def find_migration(code) # rubocop:disable Metrics/PerceivedComplexity
|
45
|
-
applied_migrations = database.applied_migrations
|
46
|
-
|
47
|
-
return if applied_migrations.empty?
|
48
|
-
|
49
|
-
# Rollback to initial state if we have only one migration and
|
50
|
-
# no target is specified. In this case the rollback target
|
51
|
-
# will be the current migration timestamp minus 1
|
52
|
-
if applied_migrations.one? && code.nil?
|
53
|
-
migration = applied_migrations.first
|
54
|
-
|
55
|
-
migration_code = Integer(migration.split("_").first) - 1
|
56
|
-
migration_name = "initial state"
|
57
|
-
|
58
|
-
return [migration_code, migration_name]
|
59
|
-
end
|
60
|
-
|
61
|
-
# Otherwise rollback to target or to previous migration
|
62
|
-
migration =
|
63
|
-
if code
|
64
|
-
applied_migrations.detect { |m| m.split("_").first == code }
|
65
|
-
else
|
66
|
-
applied_migrations[-2]
|
67
|
-
end
|
68
|
-
|
69
|
-
return unless migration
|
70
|
-
|
71
|
-
migration_code = code || migration.split("_").first
|
72
|
-
migration_name = File.basename(migration, ".*")
|
73
|
-
|
74
|
-
[migration_code, migration_name]
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "../../app/command"
|
4
|
-
require_relative "structure/dump"
|
5
|
-
|
6
|
-
module Hanami
|
7
|
-
module CLI
|
8
|
-
module Commands
|
9
|
-
module App
|
10
|
-
module DB
|
11
|
-
# @api private
|
12
|
-
class SampleData < App::Command
|
13
|
-
FILE_PATH = "db/sample_data.rb"
|
14
|
-
|
15
|
-
desc "Load sample data"
|
16
|
-
|
17
|
-
# @api private
|
18
|
-
def call(**)
|
19
|
-
if has_file?
|
20
|
-
measure "sample data loaded from #{FILE_PATH}" do
|
21
|
-
load full_file_path
|
22
|
-
end
|
23
|
-
else
|
24
|
-
out.puts "=> #{FILE_PATH} not found"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def full_file_path
|
31
|
-
File.join(app.root, FILE_PATH)
|
32
|
-
end
|
33
|
-
|
34
|
-
def has_file?
|
35
|
-
File.exist?(full_file_path)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|