hanami-cli 2.2.0 → 2.3.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.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +9 -0
  3. data/CHANGELOG.md +43 -0
  4. data/Gemfile +3 -1
  5. data/hanami-cli.gemspec +2 -0
  6. data/lib/hanami/cli/command.rb +5 -11
  7. data/lib/hanami/cli/commands/app/command.rb +5 -5
  8. data/lib/hanami/cli/commands/app/console.rb +1 -0
  9. data/lib/hanami/cli/commands/app/db/command.rb +0 -1
  10. data/lib/hanami/cli/commands/app/db/drop.rb +2 -2
  11. data/lib/hanami/cli/commands/app/db/rollback.rb +204 -0
  12. data/lib/hanami/cli/commands/app/db/utils/mysql.rb +3 -2
  13. data/lib/hanami/cli/commands/app/db/utils/postgres.rb +3 -1
  14. data/lib/hanami/cli/commands/app/generate/action.rb +32 -40
  15. data/lib/hanami/cli/commands/app/generate/command.rb +54 -17
  16. data/lib/hanami/cli/commands/app/generate/component.rb +4 -19
  17. data/lib/hanami/cli/commands/app/generate/part.rb +4 -21
  18. data/lib/hanami/cli/commands/app/generate/slice.rb +2 -2
  19. data/lib/hanami/cli/commands/app/generate/view.rb +5 -24
  20. data/lib/hanami/cli/commands/app/install.rb +12 -0
  21. data/lib/hanami/cli/commands/app/server.rb +0 -1
  22. data/lib/hanami/cli/commands/app.rb +1 -0
  23. data/lib/hanami/cli/commands/gem/new.rb +37 -7
  24. data/lib/hanami/cli/errors.rb +26 -0
  25. data/lib/hanami/cli/files.rb +20 -6
  26. data/lib/hanami/cli/generators/app/action.rb +78 -101
  27. data/lib/hanami/cli/generators/app/component.rb +11 -33
  28. data/lib/hanami/cli/generators/app/migration.rb +1 -1
  29. data/lib/hanami/cli/generators/app/operation.rb +4 -5
  30. data/lib/hanami/cli/generators/app/part.rb +42 -65
  31. data/lib/hanami/cli/generators/app/relation.rb +4 -5
  32. data/lib/hanami/cli/generators/app/repo.rb +3 -5
  33. data/lib/hanami/cli/generators/app/ruby_class_file.rb +32 -0
  34. data/lib/hanami/cli/generators/app/ruby_file.rb +128 -0
  35. data/lib/hanami/cli/generators/app/ruby_module_file.rb +28 -0
  36. data/lib/hanami/cli/generators/app/slice.rb +130 -37
  37. data/lib/hanami/cli/generators/app/struct.rb +3 -4
  38. data/lib/hanami/cli/generators/app/view.rb +40 -45
  39. data/lib/hanami/cli/generators/context.rb +6 -0
  40. data/lib/hanami/cli/generators/gem/app/assets.js +14 -13
  41. data/lib/hanami/cli/generators/gem/app/dev +1 -1
  42. data/lib/hanami/cli/generators/gem/app/gemfile.erb +5 -0
  43. data/lib/hanami/cli/generators/gem/app/gitignore.erb +3 -1
  44. data/lib/hanami/cli/generators/gem/app/rakefile.erb +3 -0
  45. data/lib/hanami/cli/generators/gem/app/readme.erb +14 -0
  46. data/lib/hanami/cli/generators/gem/app.rb +40 -37
  47. data/lib/hanami/cli/ruby_file_generator.rb +17 -8
  48. data/lib/hanami/cli/server.rb +15 -1
  49. data/lib/hanami/cli/version.rb +1 -1
  50. data/lib/hanami/console/context.rb +5 -0
  51. metadata +35 -41
  52. data/lib/hanami/cli/generators/app/action/action.erb +0 -17
  53. data/lib/hanami/cli/generators/app/action/slice_action.erb +0 -17
  54. data/lib/hanami/cli/generators/app/action/slice_template.html.erb +0 -1
  55. data/lib/hanami/cli/generators/app/action/slice_view.erb +0 -10
  56. data/lib/hanami/cli/generators/app/action/template.erb +0 -0
  57. data/lib/hanami/cli/generators/app/action/template.html.erb +0 -1
  58. data/lib/hanami/cli/generators/app/action/view.erb +0 -10
  59. data/lib/hanami/cli/generators/app/action_context.rb +0 -90
  60. data/lib/hanami/cli/generators/app/component/component.erb +0 -8
  61. data/lib/hanami/cli/generators/app/component/slice_component.erb +0 -8
  62. data/lib/hanami/cli/generators/app/component_context.rb +0 -82
  63. data/lib/hanami/cli/generators/app/part/app_base_part.erb +0 -9
  64. data/lib/hanami/cli/generators/app/part/app_part.erb +0 -13
  65. data/lib/hanami/cli/generators/app/part/slice_base_part.erb +0 -9
  66. data/lib/hanami/cli/generators/app/part/slice_part.erb +0 -13
  67. data/lib/hanami/cli/generators/app/part_context.rb +0 -82
  68. data/lib/hanami/cli/generators/app/ruby_file_writer.rb +0 -151
  69. data/lib/hanami/cli/generators/app/slice/action.erb +0 -7
  70. data/lib/hanami/cli/generators/app/slice/app_css.erb +0 -5
  71. data/lib/hanami/cli/generators/app/slice/app_js.erb +0 -1
  72. data/lib/hanami/cli/generators/app/slice/app_layout.erb +0 -18
  73. data/lib/hanami/cli/generators/app/slice/helpers.erb +0 -10
  74. data/lib/hanami/cli/generators/app/slice/keep.erb +0 -0
  75. data/lib/hanami/cli/generators/app/slice/operation.erb +0 -7
  76. data/lib/hanami/cli/generators/app/slice/relation.erb +0 -8
  77. data/lib/hanami/cli/generators/app/slice/repo.erb +0 -8
  78. data/lib/hanami/cli/generators/app/slice/routes.erb +0 -3
  79. data/lib/hanami/cli/generators/app/slice/struct.erb +0 -8
  80. data/lib/hanami/cli/generators/app/slice/view.erb +0 -7
  81. data/lib/hanami/cli/generators/app/slice_context.rb +0 -72
  82. data/lib/hanami/cli/generators/app/view/app_template.html.erb +0 -1
  83. data/lib/hanami/cli/generators/app/view/app_view.erb +0 -10
  84. data/lib/hanami/cli/generators/app/view/slice_template.html.erb +0 -1
  85. data/lib/hanami/cli/generators/app/view/slice_view.erb +0 -10
  86. data/lib/hanami/cli/generators/app/view_context.rb +0 -88
@@ -1,151 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "erb"
4
- require "dry/files"
5
- require_relative "../constants"
6
- require_relative "../../errors"
7
-
8
- module Hanami
9
- module CLI
10
- module Generators
11
- module App
12
- # @since 2.2.0
13
- # @api private
14
- class RubyFileWriter
15
- # @since 2.2.0
16
- # @api private
17
- def initialize(fs:, inflector:)
18
- @fs = fs
19
- @inflector = inflector
20
- end
21
-
22
- # @since 2.2.0
23
- # @api private
24
- def call(key:, namespace:, base_path:, relative_parent_class:, extra_namespace: nil, body: [])
25
- ClassFile.new(
26
- fs: fs,
27
- inflector: inflector,
28
- key: key,
29
- namespace: namespace,
30
- base_path: base_path,
31
- relative_parent_class: relative_parent_class,
32
- extra_namespace: extra_namespace,
33
- body: body,
34
- ).write
35
- end
36
-
37
- private
38
-
39
- # @since 2.2.0
40
- # @api private
41
- attr_reader :fs, :inflector
42
- end
43
-
44
- class ClassFile
45
- def initialize(
46
- fs:,
47
- inflector:,
48
- key:,
49
- namespace:,
50
- base_path:,
51
- relative_parent_class:,
52
- extra_namespace: nil,
53
- body: []
54
- )
55
- @fs = fs
56
- @inflector = inflector
57
- @key = key
58
- @namespace = namespace
59
- @base_path = base_path
60
- @extra_namespace = extra_namespace&.downcase
61
- @relative_parent_class = relative_parent_class
62
- @body = body
63
- end
64
-
65
- def write
66
- fs.write(path, file_contents)
67
- end
68
-
69
- private
70
-
71
- # @since 2.2.0
72
- # @api private
73
- attr_reader(
74
- :fs,
75
- :inflector,
76
- :key,
77
- :namespace,
78
- :base_path,
79
- :extra_namespace,
80
- :relative_parent_class,
81
- :body,
82
- )
83
-
84
- # @since 2.2.0
85
- # @api private
86
- def file_contents
87
- class_definition(
88
- class_name: class_name,
89
- local_namespaces: local_namespaces,
90
- )
91
- end
92
-
93
- # @since 2.2.0
94
- # @api private
95
- def class_name
96
- key.split(KEY_SEPARATOR)[-1]
97
- end
98
-
99
- # @since 2.2.0
100
- # @api private
101
- def local_namespaces
102
- Array(extra_namespace) + key.split(KEY_SEPARATOR)[..-2]
103
- end
104
-
105
- # @since 2.2.0
106
- # @api private
107
- def directory
108
- @directory ||= if local_namespaces.any?
109
- fs.join(base_path, local_namespaces)
110
- else
111
- base_path
112
- end
113
- end
114
-
115
- # @since 2.2.0
116
- # @api private
117
- def path
118
- fs.join(directory, "#{class_name}.rb")
119
- end
120
-
121
- # @since 2.2.0
122
- # @api private
123
- def class_definition(class_name:, local_namespaces:)
124
- container_module = normalize(namespace)
125
-
126
- modules = local_namespaces
127
- .map { normalize(_1) }
128
- .compact
129
- .prepend(container_module)
130
-
131
- parent_class = [container_module, relative_parent_class].join("::")
132
-
133
- RubyFileGenerator.class(
134
- normalize(class_name),
135
- parent_class: parent_class,
136
- modules: modules,
137
- header: ["# frozen_string_literal: true"],
138
- body: body
139
- )
140
- end
141
-
142
- # @since 2.2.0
143
- # @api private
144
- def normalize(name)
145
- inflector.camelize(name).gsub(/[^\p{Alnum}]/, "")
146
- end
147
- end
148
- end
149
- end
150
- end
151
- end
@@ -1,7 +0,0 @@
1
- # auto_register: false
2
- # frozen_string_literal: true
3
-
4
- module <%= camelized_slice_name %>
5
- class Action < <%= camelized_app_name %>::Action
6
- end
7
- end
@@ -1,5 +0,0 @@
1
- body {
2
- background-color: #fff;
3
- color: #000;
4
- font-family: sans-serif;
5
- }
@@ -1 +0,0 @@
1
- import "../css/app.css";
@@ -1,18 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title><%= humanized_app_name %> - <%= humanized_slice_name %></title>
7
- <%- if bundled_assets? -%>
8
- <%%= favicon_tag %>
9
- <%= stylesheet_erb_tag %>
10
- <%- end -%>
11
- </head>
12
- <body>
13
- <%%= yield %>
14
- <%- if bundled_assets? -%>
15
- <%= javascript_erb_tag %>
16
- <%- end -%>
17
- </body>
18
- </html>
@@ -1,10 +0,0 @@
1
- # auto_register: false
2
- # frozen_string_literal: true
3
-
4
- module <%= camelized_slice_name %>
5
- module Views
6
- module Helpers
7
- # Add your view helpers here
8
- end
9
- end
10
- end
File without changes
@@ -1,7 +0,0 @@
1
- # auto_register: false
2
- # frozen_string_literal: true
3
-
4
- module <%= camelized_slice_name %>
5
- class Operation < <%= camelized_app_name %>::Operation
6
- end
7
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module <%= camelized_slice_name %>
4
- module DB
5
- class Relation < <%= camelized_app_name %>::DB::Relation
6
- end
7
- end
8
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module <%= camelized_slice_name %>
4
- module DB
5
- class Repo < <%= camelized_app_name %>::DB::Repo
6
- end
7
- end
8
- end
@@ -1,3 +0,0 @@
1
-
2
- slice :<%= underscored_slice_name %>, at: "<%= url %>" do
3
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module <%= camelized_slice_name %>
4
- module DB
5
- class Struct < <%= camelized_app_name %>::DB::Struct
6
- end
7
- end
8
- end
@@ -1,7 +0,0 @@
1
- # auto_register: false
2
- # frozen_string_literal: true
3
-
4
- module <%= camelized_slice_name %>
5
- class View < <%= camelized_app_name %>::View
6
- end
7
- end
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../context"
4
- require_relative "../constants"
5
-
6
- module Hanami
7
- module CLI
8
- module Generators
9
- module App
10
- # @since 2.0.0
11
- # @api private
12
- class SliceContext < Generators::Context
13
- # @since 2.0.0
14
- # @api private
15
- def initialize(inflector, app, slice, url, **options)
16
- @slice = slice
17
- @url = url
18
- super(inflector, app, **options)
19
- end
20
-
21
- # @since 2.0.0
22
- # @api private
23
- def camelized_slice_name
24
- inflector.camelize(slice)
25
- end
26
-
27
- # @since 2.0.0
28
- # @api private
29
- def underscored_slice_name
30
- inflector.underscore(slice)
31
- end
32
-
33
- # @since 2.1.0
34
- # @api private
35
- def humanized_slice_name
36
- inflector.humanize(slice)
37
- end
38
-
39
- # @since 2.1.0
40
- # @api private
41
- def stylesheet_erb_tag
42
- %(<%= stylesheet_tag "app" %>)
43
- end
44
-
45
- # @since 2.1.0
46
- # @api private
47
- def javascript_erb_tag
48
- %(<%= javascript_tag "app" %>)
49
- end
50
-
51
- # @since 2.2.0
52
- # @api private
53
- def generate_db?
54
- !options.fetch(:skip_db, false)
55
- end
56
-
57
- # @since 2.2.0
58
- # @api private
59
- def generate_route?
60
- !options.fetch(:skip_route, false)
61
- end
62
-
63
- private
64
-
65
- attr_reader :slice
66
-
67
- attr_reader :url
68
- end
69
- end
70
- end
71
- end
72
- end
@@ -1 +0,0 @@
1
- <h1><%= camelized_app_name %>::Views::<%= camelized_namespace %>::<%= camelized_name %></h1>
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module <%= camelized_app_name %>
4
- module Views
5
- <%= module_namespace_declaration %>
6
- <%= module_namespace_offset %>class <%= camelized_name %> < <%= camelized_app_name %>::View
7
- <%= module_namespace_offset %>end
8
- <%= module_namespace_end %>
9
- end
10
- end
@@ -1 +0,0 @@
1
- <h1><%= camelized_slice_name %>::Views::<%= camelized_namespace %>::<%= camelized_name %></h1>
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module <%= camelized_slice_name %>
4
- module Views
5
- <%= module_namespace_declaration %>
6
- <%= module_namespace_offset %>class <%= camelized_name %> < <%= camelized_slice_name %>::View
7
- <%= module_namespace_offset %>end
8
- <%= module_namespace_end %>
9
- end
10
- end
@@ -1,88 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "slice_context"
4
- require "dry/files/path"
5
- require_relative "../constants"
6
-
7
- module Hanami
8
- module CLI
9
- module Generators
10
- # @since 2.1.0
11
- # @api private
12
- module App
13
- # @since 2.1.0
14
- # @api private
15
- class ViewContext < SliceContext
16
- # @since 2.1.0
17
- # @api private
18
- attr_reader :key
19
-
20
- # @since 2.1.0
21
- # @api private
22
- def initialize(inflector, app, slice, key)
23
- @key = key
24
- super(inflector, app, slice, nil)
25
- end
26
-
27
- # @since 2.1.0
28
- # @api private
29
- def namespaces
30
- @namespaces ||= key.split(KEY_SEPARATOR)[..-2]
31
- end
32
-
33
- # @since 2.1.0
34
- # @api private
35
- def name
36
- @name ||= key.split(KEY_SEPARATOR)[-1]
37
- end
38
-
39
- # @since 2.1.0
40
- # @api private
41
- def camelized_namespace
42
- namespaces.map { inflector.camelize(_1) }.join(NAMESPACE_SEPARATOR)
43
- end
44
-
45
- # @since 2.1.0
46
- # @api private
47
- def camelized_name
48
- inflector.camelize(name)
49
- end
50
-
51
- # @since 2.1.0
52
- # @api private
53
- def underscored_namespace
54
- namespaces.map { inflector.underscore(_1) }
55
- end
56
-
57
- # @since 2.1.0
58
- # @api private
59
- def underscored_name
60
- inflector.underscore(name)
61
- end
62
-
63
- # @since 2.1.0
64
- # @api private
65
- def module_namespace_declaration
66
- namespaces.each_with_index.map { |token, i|
67
- "#{NESTED_OFFSET}#{INDENTATION * i}module #{inflector.camelize(token)}"
68
- }.join($/)
69
- end
70
-
71
- # @since 2.1.0
72
- # @api private
73
- def module_namespace_end
74
- namespaces.each_with_index.map { |_, i|
75
- "#{NESTED_OFFSET}#{INDENTATION * i}end"
76
- }.reverse.join($/)
77
- end
78
-
79
- # @since 2.1.0
80
- # @api private
81
- def module_namespace_offset
82
- "#{NESTED_OFFSET}#{INDENTATION * namespaces.count}"
83
- end
84
- end
85
- end
86
- end
87
- end
88
- end