hanami 1.0.0 → 1.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/FEATURES.md +12 -0
  4. data/README.md +3 -0
  5. data/bin/hanami +3 -3
  6. data/hanami.gemspec +9 -9
  7. data/lib/hanami.rb +27 -0
  8. data/lib/hanami/action/routing_helpers.rb +1 -1
  9. data/lib/hanami/application_configuration.rb +0 -8
  10. data/lib/hanami/application_name.rb +1 -3
  11. data/lib/hanami/application_namespace.rb +1 -1
  12. data/lib/hanami/cli/commands.rb +101 -0
  13. data/lib/hanami/cli/commands/assets.rb +16 -0
  14. data/lib/hanami/cli/commands/assets/precompile.rb +42 -0
  15. data/lib/hanami/cli/commands/command.rb +180 -0
  16. data/lib/hanami/cli/commands/console.rb +95 -0
  17. data/lib/hanami/cli/commands/db.rb +30 -0
  18. data/lib/hanami/cli/commands/db/apply.rb +32 -0
  19. data/lib/hanami/cli/commands/db/console.rb +44 -0
  20. data/lib/hanami/cli/commands/db/create.rb +32 -0
  21. data/lib/hanami/cli/commands/db/drop.rb +32 -0
  22. data/lib/hanami/cli/commands/db/migrate.rb +39 -0
  23. data/lib/hanami/cli/commands/db/prepare.rb +32 -0
  24. data/lib/hanami/cli/commands/db/version.rb +32 -0
  25. data/lib/hanami/cli/commands/destroy.rb +26 -0
  26. data/lib/hanami/cli/commands/destroy/action.rb +131 -0
  27. data/lib/hanami/cli/commands/destroy/app.rb +159 -0
  28. data/lib/hanami/cli/commands/destroy/mailer.rb +74 -0
  29. data/lib/hanami/cli/commands/destroy/migration.rb +51 -0
  30. data/lib/hanami/cli/commands/destroy/model.rb +84 -0
  31. data/lib/hanami/cli/commands/generate.rb +28 -0
  32. data/lib/hanami/cli/commands/generate/action.rb +224 -0
  33. data/lib/hanami/cli/commands/generate/action/action.erb +8 -0
  34. data/lib/hanami/cli/commands/generate/action/action_spec.minitest.erb +11 -0
  35. data/lib/hanami/{generators/action/action_spec.rspec.tt → cli/commands/generate/action/action_spec.rspec.erb} +1 -3
  36. data/lib/hanami/cli/commands/generate/action/action_without_view.erb +9 -0
  37. data/lib/hanami/cli/commands/generate/action/view.erb +5 -0
  38. data/lib/hanami/cli/commands/generate/action/view_spec.minitest.erb +15 -0
  39. data/lib/hanami/{generators/action/view_spec.rspec.tt → cli/commands/generate/action/view_spec.rspec.erb} +2 -4
  40. data/lib/hanami/cli/commands/generate/app.rb +231 -0
  41. data/lib/hanami/{generators/app/application.rb.tt → cli/commands/generate/app/application.erb} +6 -6
  42. data/lib/hanami/{generators → cli/commands/generate}/app/favicon.ico +0 -0
  43. data/lib/hanami/{generators/action/template.tt → cli/commands/generate/app/gitkeep.erb} +0 -0
  44. data/lib/hanami/cli/commands/generate/app/layout.erb +7 -0
  45. data/lib/hanami/cli/commands/generate/app/layout_spec.minitest.erb +11 -0
  46. data/lib/hanami/cli/commands/generate/app/layout_spec.rspec.erb +11 -0
  47. data/lib/hanami/{generators/app/config/routes.rb.tt → cli/commands/generate/app/routes.erb} +0 -0
  48. data/lib/hanami/{generators/app/templates/application.html.erb.tt → cli/commands/generate/app/template.erb.erb} +1 -1
  49. data/lib/hanami/{generators/app/templates/application.html.haml.tt → cli/commands/generate/app/template.haml.erb} +1 -1
  50. data/lib/hanami/{generators/app/templates/application.html.slim.tt → cli/commands/generate/app/template.slim.erb} +1 -1
  51. data/lib/hanami/cli/commands/generate/mailer.rb +94 -0
  52. data/lib/hanami/cli/commands/generate/mailer/mailer.erb +7 -0
  53. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.minitest.erb +7 -0
  54. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.rspec.erb +5 -0
  55. data/lib/hanami/cli/commands/generate/migration.rb +41 -0
  56. data/lib/hanami/{generators/migration/migration.rb.tt → cli/commands/generate/migration/migration.erb} +0 -0
  57. data/lib/hanami/cli/commands/generate/model.rb +98 -0
  58. data/lib/hanami/cli/commands/generate/model/entity.erb +2 -0
  59. data/lib/hanami/cli/commands/generate/model/entity_spec.minitest.erb +5 -0
  60. data/lib/hanami/cli/commands/generate/model/entity_spec.rspec.erb +3 -0
  61. data/lib/hanami/{generators/model/migration.rb.tt → cli/commands/generate/model/migration.erb} +1 -1
  62. data/lib/hanami/cli/commands/generate/model/repository.erb +2 -0
  63. data/lib/hanami/cli/commands/generate/model/repository_spec.minitest.erb +5 -0
  64. data/lib/hanami/cli/commands/generate/model/repository_spec.rspec.erb +3 -0
  65. data/lib/hanami/cli/commands/generate/secret.rb +48 -0
  66. data/lib/hanami/cli/commands/new.rb +575 -0
  67. data/lib/hanami/{generators/application/container/.env.development.tt → cli/commands/new/.env.development.erb} +1 -1
  68. data/lib/hanami/{generators/application/container/.env.test.tt → cli/commands/new/.env.test.erb} +1 -1
  69. data/lib/hanami/{generators/app/config/initializers/.gitkeep → cli/commands/new/.gitkeep.erb} +0 -0
  70. data/lib/hanami/cli/commands/new/Gemfile.erb +57 -0
  71. data/lib/hanami/cli/commands/new/README.md.erb +35 -0
  72. data/lib/hanami/{generators/application/container/config.ru.tt → cli/commands/new/config.ru.erb} +0 -0
  73. data/lib/hanami/{generators/application/container/config/boot.rb.tt → cli/commands/new/config/boot.erb} +0 -0
  74. data/lib/hanami/{generators/application/container/config/environment.rb.tt → cli/commands/new/config/environment.erb} +8 -8
  75. data/lib/hanami/{generators/application/container/gitignore.tt → cli/commands/new/gitignore.erb} +0 -0
  76. data/lib/hanami/{generators/application/container/gitignore_with_sqlite.tt → cli/commands/new/gitignore_with_sqlite.erb} +0 -0
  77. data/lib/hanami/cli/commands/new/hanamirc.erb +3 -0
  78. data/lib/hanami/cli/commands/new/lib/project.erb +2 -0
  79. data/lib/hanami/{generators/application/container/Rakefile.minitest.tt → cli/commands/new/minitest/Rakefile.erb} +0 -0
  80. data/lib/hanami/{generators/application/container/features_helper.rb.minitest.tt → cli/commands/new/minitest/features_helper.erb} +0 -0
  81. data/lib/hanami/{generators/application/container/spec_helper.rb.minitest.tt → cli/commands/new/minitest/spec_helper.erb} +0 -0
  82. data/lib/hanami/{generators/application/container/Rakefile.rspec.tt → cli/commands/new/rspec/Rakefile.erb} +0 -0
  83. data/lib/hanami/{generators/application/container/capybara.rb.rspec.tt → cli/commands/new/rspec/capybara.erb} +0 -0
  84. data/lib/hanami/{generators/application/container/features_helper.rb.rspec.tt → cli/commands/new/rspec/features_helper.erb} +0 -0
  85. data/lib/hanami/{generators/application/container/rspec.rspec.tt → cli/commands/new/rspec/rspec.erb} +0 -0
  86. data/lib/hanami/{generators/application/container/spec_helper.rb.rspec.tt → cli/commands/new/rspec/spec_helper.erb} +0 -0
  87. data/lib/hanami/{generators/application/container/.gitignore → cli/commands/new/schema.sql.erb} +0 -0
  88. data/lib/hanami/cli/commands/project.rb +421 -0
  89. data/lib/hanami/cli/commands/routes.rb +21 -0
  90. data/lib/hanami/cli/commands/server.rb +39 -0
  91. data/lib/hanami/cli/commands/templates.rb +31 -0
  92. data/lib/hanami/cli/commands/version.rb +19 -0
  93. data/lib/hanami/common_logger.rb +14 -4
  94. data/lib/hanami/components.rb +39 -1
  95. data/lib/hanami/components/components.rb +36 -1
  96. data/lib/hanami/config/sessions.rb +1 -1
  97. data/lib/hanami/environment.rb +20 -50
  98. data/lib/hanami/hanamirc.rb +7 -30
  99. data/lib/hanami/middleware.rb +0 -26
  100. data/lib/hanami/static.rb +1 -1
  101. data/lib/hanami/templates/welcome.html.erb +1 -1
  102. data/lib/hanami/version.rb +1 -1
  103. data/lib/hanami/welcome.rb +1 -11
  104. metadata +125 -135
  105. data/lib/hanami/cli.rb +0 -154
  106. data/lib/hanami/cli_base.rb +0 -49
  107. data/lib/hanami/cli_sub_commands/assets.rb +0 -24
  108. data/lib/hanami/cli_sub_commands/db.rb +0 -138
  109. data/lib/hanami/cli_sub_commands/destroy.rb +0 -115
  110. data/lib/hanami/cli_sub_commands/generate.rb +0 -150
  111. data/lib/hanami/commands/apps.rb +0 -4
  112. data/lib/hanami/commands/assets/precompile.rb +0 -26
  113. data/lib/hanami/commands/command.rb +0 -77
  114. data/lib/hanami/commands/console.rb +0 -107
  115. data/lib/hanami/commands/db/apply.rb +0 -19
  116. data/lib/hanami/commands/db/console.rb +0 -41
  117. data/lib/hanami/commands/db/create.rb +0 -19
  118. data/lib/hanami/commands/db/drop.rb +0 -19
  119. data/lib/hanami/commands/db/migrate.rb +0 -30
  120. data/lib/hanami/commands/db/prepare.rb +0 -19
  121. data/lib/hanami/commands/db/version.rb +0 -19
  122. data/lib/hanami/commands/generate/abstract.rb +0 -76
  123. data/lib/hanami/commands/generate/action.rb +0 -322
  124. data/lib/hanami/commands/generate/app.rb +0 -154
  125. data/lib/hanami/commands/generate/mailer.rb +0 -131
  126. data/lib/hanami/commands/generate/migration.rb +0 -75
  127. data/lib/hanami/commands/generate/model.rb +0 -132
  128. data/lib/hanami/commands/generate/secret_token.rb +0 -37
  129. data/lib/hanami/commands/new/abstract.rb +0 -178
  130. data/lib/hanami/commands/new/app.rb +0 -129
  131. data/lib/hanami/commands/new/container.rb +0 -119
  132. data/lib/hanami/commands/routes.rb +0 -26
  133. data/lib/hanami/commands/server.rb +0 -32
  134. data/lib/hanami/generators/action/action.rb.tt +0 -8
  135. data/lib/hanami/generators/action/action_spec.minitest.tt +0 -12
  136. data/lib/hanami/generators/action/action_without_view.rb.tt +0 -9
  137. data/lib/hanami/generators/action/view.rb.tt +0 -5
  138. data/lib/hanami/generators/action/view_spec.minitest.tt +0 -16
  139. data/lib/hanami/generators/app/.gitkeep.tt +0 -1
  140. data/lib/hanami/generators/app/views/application_layout.rb.tt +0 -7
  141. data/lib/hanami/generators/application/container/.gitkeep +0 -1
  142. data/lib/hanami/generators/application/container/Gemfile.tt +0 -56
  143. data/lib/hanami/generators/application/container/config/initializers/.gitkeep +0 -0
  144. data/lib/hanami/generators/application/container/db/.gitkeep +0 -1
  145. data/lib/hanami/generators/application/container/hanamirc.tt +0 -4
  146. data/lib/hanami/generators/application/container/lib/chirp/entities/.gitkeep +0 -1
  147. data/lib/hanami/generators/application/container/lib/chirp/mailers/.gitkeep +0 -0
  148. data/lib/hanami/generators/application/container/lib/chirp/mailers/templates/.gitkeep +0 -0
  149. data/lib/hanami/generators/application/container/lib/chirp/repositories/.gitkeep +0 -1
  150. data/lib/hanami/generators/application/container/lib/project.rb.tt +0 -2
  151. data/lib/hanami/generators/application/container/schema.sql.tt +0 -0
  152. data/lib/hanami/generators/database_config.rb +0 -114
  153. data/lib/hanami/generators/generatable.rb +0 -69
  154. data/lib/hanami/generators/generator.rb +0 -52
  155. data/lib/hanami/generators/mailer/mailer.rb.tt +0 -7
  156. data/lib/hanami/generators/mailer/mailer_spec.rb.minitest.tt +0 -7
  157. data/lib/hanami/generators/mailer/mailer_spec.rb.rspec.tt +0 -5
  158. data/lib/hanami/generators/mailer/template.html.tt +0 -0
  159. data/lib/hanami/generators/mailer/template.txt.tt +0 -0
  160. data/lib/hanami/generators/model/entity.rb.tt +0 -2
  161. data/lib/hanami/generators/model/entity_spec.minitest.tt +0 -5
  162. data/lib/hanami/generators/model/entity_spec.rspec.tt +0 -3
  163. data/lib/hanami/generators/model/repository.rb.tt +0 -2
  164. data/lib/hanami/generators/model/repository_spec.minitest.tt +0 -5
  165. data/lib/hanami/generators/model/repository_spec.rspec.tt +0 -3
  166. data/lib/hanami/generators/template_engine.rb +0 -44
  167. data/lib/hanami/generators/test_framework.rb +0 -55
@@ -1,154 +0,0 @@
1
- require 'hanami/commands/generate/abstract'
2
- require 'hanami/application_name'
3
- require 'hanami/utils/blank'
4
- require 'securerandom'
5
-
6
- module Hanami
7
- # @api private
8
- module Commands
9
- # @api private
10
- class Generate
11
- # @api private
12
- class App < Abstract
13
-
14
- # @api private
15
- attr_reader :base_path
16
-
17
- # @api private
18
- def initialize(options, application_name)
19
- @environment = Hanami::Environment.new(options)
20
- @options = Hanami::Utils::Hash.new(options).symbolize!
21
- assert_options!
22
-
23
- @target_path = Hanami.root
24
- assert_application_name!(application_name)
25
- assert_architecture!
26
- assert_application_base_url!
27
-
28
- @application_name = ApplicationName.new(application_name)
29
- @base_path = Pathname.pwd
30
- end
31
-
32
- # @api private
33
- def map_templates
34
- add_mapping('application.rb.tt', 'application.rb')
35
- add_mapping('config/routes.rb.tt', 'config/routes.rb')
36
- add_mapping('views/application_layout.rb.tt', 'views/application_layout.rb')
37
- add_mapping("templates/application.html.#{ template_engine.name }.tt", "templates/application.html.#{ template_engine.name }")
38
- add_mapping('favicon.ico', 'assets/favicon.ico')
39
-
40
- add_mapping('.gitkeep', 'controllers/.gitkeep')
41
- add_mapping('.gitkeep', 'assets/images/.gitkeep')
42
- add_mapping('.gitkeep', 'assets/javascripts/.gitkeep')
43
- add_mapping('.gitkeep', 'assets/stylesheets/.gitkeep')
44
- add_mapping('.gitkeep', "../../spec/#{ app_name }/features/.gitkeep")
45
- add_mapping('.gitkeep', "../../spec/#{ app_name }/controllers/.gitkeep")
46
- add_mapping('.gitkeep', "../../spec/#{ app_name }/views/.gitkeep")
47
- end
48
-
49
- # @api private
50
- def template_options
51
- {
52
- app_name: app_name,
53
- upcase_app_name: upcase_app_name,
54
- classified_app_name: classified_app_name,
55
- app_base_url: application_base_url,
56
- app_base_path: application_base_path,
57
- template: template_engine.name
58
- }
59
- end
60
-
61
- # @api private
62
- def post_process_templates
63
- add_require_app
64
- add_mount_app
65
- add_web_session_secret
66
- end
67
-
68
- private
69
-
70
- # @api private
71
- def application_base_url
72
- options.fetch(:application_base_url, "/#{app_name}")
73
- end
74
-
75
- # @api private
76
- def add_require_app
77
- # Add "require_relative '../apps/web/application'"
78
- generator.inject_into_file base_path.join('config/environment.rb'), after: /require_relative '\.\.\/lib\/.*'/ do
79
- "\nrequire_relative '../apps/#{ app_name }/application'"
80
- end
81
- end
82
-
83
- # @api private
84
- def add_mount_app
85
- generator.inject_into_file base_path.join('config/environment.rb'), after: /Hanami.configure do/ do |match|
86
- "\n mount #{ classified_app_name }::Application, at: '#{ application_base_url }'"
87
- end
88
- end
89
-
90
- # @api private
91
- def add_web_session_secret
92
- ['development', 'test'].each do |environment|
93
- # Add WEB_SESSIONS_SECRET="abc123" (random hex)
94
- generator.append_to_file base_path.join(".env.#{ environment }") do
95
- %(#{ upcase_app_name }_SESSIONS_SECRET="#{ SecureRandom.hex(32) }"\n)
96
- end
97
- end
98
- end
99
-
100
- # @api private
101
- def hanamirc
102
- @hanamirc ||= Hanamirc.new(base_path)
103
- end
104
-
105
- # @api private
106
- def target_path
107
- base_path.join(application_base_path)
108
- end
109
-
110
- # @api private
111
- def app_name
112
- @application_name.to_s
113
- end
114
-
115
- # @api private
116
- def upcase_app_name
117
- @application_name.to_env_s
118
- end
119
-
120
- # @api private
121
- def application_base_path
122
- ["apps", @application_name].join(::File::SEPARATOR)
123
- end
124
-
125
- # @api private
126
- def classified_app_name
127
- Utils::String.new(app_name).classify.tr('::', '')
128
- end
129
-
130
- # @api private
131
- def assert_application_name!(value)
132
- if argument_blank?(value)
133
- raise ArgumentError.new('Application name is missing')
134
- end
135
- end
136
-
137
- # @api private
138
- def assert_architecture!
139
- if !environment.container?
140
- raise ArgumentError.new('App generator is only available for container architecture.')
141
- end
142
- end
143
-
144
- # @api private
145
- def assert_application_base_url!
146
- if options.key?(:application_base_url) && Utils::Blank.blank?(options[:application_base_url])
147
- warn "`' is not a valid URL"
148
- exit(1)
149
- end
150
- end
151
- end
152
- end
153
- end
154
- end
@@ -1,131 +0,0 @@
1
- require "hanami/commands/generate/abstract"
2
-
3
- module Hanami
4
- # @api private
5
- module Commands
6
- # @api private
7
- class Generate
8
- # @since 0.5.0
9
- # @api private
10
- class Mailer < Abstract
11
- # @api private
12
- attr_reader :name
13
- # @api private
14
- attr_reader :name_underscored
15
- # @api private
16
- attr_reader :from
17
- # @api private
18
- attr_reader :to
19
- # @api private
20
- attr_reader :subject
21
-
22
- # @since 0.5.0
23
- # @api private
24
- TXT_FORMAT = ".txt".freeze
25
-
26
- # @since 0.5.0
27
- # @api private
28
- HTML_FORMAT = ".html".freeze
29
-
30
- # @since 0.5.0
31
- # @api private
32
- DEFAULT_ENGINE = "erb".freeze
33
-
34
- # @since 0.5.0
35
- # @api private
36
- DEFAULT_FROM = "'<from>'".freeze
37
-
38
- # @since 0.5.0
39
- # @api private
40
- DEFAULT_TO = "'<to>'".freeze
41
-
42
- # @since 0.5.0
43
- # @api private
44
- DEFAULT_SUBJECT = "'Hello'".freeze
45
-
46
- # @since 0.5.0
47
- # @api private
48
- def initialize(options, name)
49
- super(options)
50
-
51
- @name_underscored = Utils::String.new(name).underscore
52
- @name = Utils::String.new(name_underscored).classify
53
- @from = options[:from] || DEFAULT_FROM
54
- @to = options[:to] || DEFAULT_TO
55
- @subject = options[:subject] || DEFAULT_SUBJECT
56
-
57
- assert_name!
58
- end
59
-
60
- # @since 0.5.0
61
- # @api private
62
- def map_templates
63
- add_mapping("mailer_spec.rb.#{test_framework.framework}.tt", mailer_spec_path)
64
- add_mapping("mailer.rb.tt", mailer_path)
65
- add_mapping("template.txt.tt", txt_template_path)
66
- add_mapping("template.html.tt", html_template_path)
67
- end
68
-
69
- # @api private
70
- def template_options
71
- {
72
- mailer: name,
73
- from: from,
74
- to: to,
75
- subject: subject,
76
- }
77
- end
78
-
79
- private
80
-
81
- # @since 0.5.0
82
- # @api private
83
- def assert_name!
84
- if argument_blank?(name)
85
- raise ArgumentError.new('Mailer name is missing')
86
- end
87
- end
88
-
89
- # @since 0.5.0
90
- # @api private
91
- def mailer_path
92
- core_root.join('mailers', "#{ name_underscored }.rb").to_s
93
- end
94
-
95
- # @since 0.5.0
96
- # @api private
97
- def mailer_spec_path
98
- spec_root.join(::File.basename(Dir.getwd), "mailers", "#{ name_underscored }_spec.rb")
99
- end
100
-
101
- # @since 0.5.0
102
- # @api private
103
- def txt_template_path
104
- template_path(TXT_FORMAT)
105
- end
106
-
107
- # @since 0.5.0
108
- # @api private
109
- def html_template_path
110
- template_path(HTML_FORMAT)
111
- end
112
-
113
- # @since 0.5.0
114
- # @api private
115
- def template_path(format)
116
- core_root.join("mailers", "templates", "#{ name_underscored }#{ format }.#{ DEFAULT_ENGINE }")
117
- end
118
-
119
- # @api private
120
- def spec_root
121
- Pathname.new("spec")
122
- end
123
-
124
- # @api private
125
- def core_root
126
- Pathname.new("lib").join(project_name)
127
- end
128
- end
129
- end
130
- end
131
- end
@@ -1,75 +0,0 @@
1
- require 'hanami/commands/generate/abstract'
2
- require 'hanami/utils/file_list'
3
-
4
- module Hanami
5
- # @api private
6
- module Commands
7
- # @api private
8
- class Generate
9
- # @api private
10
- class Migration < Abstract
11
- # @api private
12
- attr_reader :name
13
- # @api private
14
- attr_reader :underscored_name
15
-
16
- # @since 0.6.0
17
- # @api private
18
- #
19
- # @example
20
- # 20150612160502
21
- TIMESTAMP_FORMAT = '%Y%m%d%H%M%S'.freeze
22
-
23
- # @since 0.6.0
24
- # @api private
25
- #
26
- # @example
27
- # 20150612160502_create_books.rb
28
- FILENAME_PATTERN = '%{timestamp}_%{name}.rb'.freeze
29
-
30
- # @api private
31
- def initialize(options, name)
32
- super(options)
33
-
34
- @name = name
35
- @underscored_name = Utils::String.new(@name).underscore
36
-
37
- Components.resolve('model.configuration')
38
- assert_migration_name!
39
- end
40
-
41
- # @api private
42
- def map_templates
43
- add_mapping('migration.rb.tt', destination_path)
44
- end
45
-
46
- private
47
-
48
- # @api private
49
- def destination_path
50
- existing_migration_path || new_migration_path
51
- end
52
-
53
- # @api private
54
- def existing_migration_path
55
- Utils::FileList["#{Hanami::Model.configuration.migrations}/[0-9]*_#{underscored_name}.rb"].first
56
- end
57
-
58
- # @api private
59
- def new_migration_path
60
- timestamp = Time.now.utc.strftime(TIMESTAMP_FORMAT)
61
- filename = FILENAME_PATTERN % { timestamp: timestamp, name: underscored_name}
62
-
63
- Hanami::Model.configuration.migrations.join(filename)
64
- end
65
-
66
- # @api private
67
- def assert_migration_name!
68
- if argument_blank?(name)
69
- raise ArgumentError.new('Migration name is missing')
70
- end
71
- end
72
- end
73
- end
74
- end
75
- end
@@ -1,132 +0,0 @@
1
- require 'hanami/commands/generate/abstract'
2
- require 'hanami/commands/generate/migration'
3
-
4
- module Hanami
5
- # @api private
6
- module Commands
7
- # @api private
8
- class Generate
9
- # @api private
10
- class Model < Abstract
11
-
12
- # @api private
13
- attr_reader :input
14
- # @api private
15
- attr_reader :model_name
16
- # @api private
17
- attr_reader :table_name
18
-
19
- # @api private
20
- def initialize(options, model_name)
21
- super(options)
22
- @input = Utils::String.new(model_name).underscore
23
- @model_name = Utils::String.new(@input).classify
24
- @table_name = Utils::String.new(@input).pluralize
25
-
26
- unless skip_migration?
27
- Components.resolve('model.configuration')
28
- end
29
-
30
- assert_model_name!
31
- end
32
-
33
- # @api private
34
- def map_templates
35
- add_mapping('entity.rb.tt', entity_path)
36
- add_mapping('repository.rb.tt', repository_path)
37
- unless skip_migration?
38
- add_mapping('migration.rb.tt', migration_path)
39
- end
40
- add_mapping("entity_spec.#{ test_framework.framework }.tt", entity_spec_path,)
41
- add_mapping("repository_spec.#{ test_framework.framework }.tt", repository_spec_path)
42
- end
43
-
44
- # @api private
45
- def template_options
46
- {
47
- model_name: model_name,
48
- table_name: table_name
49
- }
50
- end
51
-
52
- private
53
-
54
- # @since 0.6.0
55
- # @api private
56
- def assert_model_name!
57
- model_name_not_blank
58
- model_name_valid
59
- end
60
-
61
- # Validates that a model name was provided
62
- #
63
- # @since 0.6.0
64
- # @api private
65
- def model_name_not_blank
66
- if argument_blank?(model_name)
67
- raise ArgumentError.new('Model name is missing')
68
- end
69
- end
70
-
71
- # Validates that the provided model name doesn't start with numbers
72
- #
73
- # @since 0.6.0
74
- # @api private
75
- def model_name_valid
76
- unless model_name.match(/^[a-z]/i)
77
- raise ArgumentError.new("Invalid model name. The model name shouldn't begin with a number.")
78
- end
79
- end
80
-
81
- # @api private
82
- def skip_migration?
83
- options.fetch(:skip_migration, false)
84
- end
85
-
86
- # @api private
87
- def model_root
88
- Pathname.new('lib').join(project_name)
89
- end
90
-
91
- # @since 0.5.0
92
- # @api private
93
- def entity_path
94
- model_root.join('entities', "#{ model_name_underscored }.rb").to_s
95
- end
96
-
97
- # @since 0.5.0
98
- # @api private
99
- def repository_path
100
- model_root.join('repositories', "#{ model_name_underscored }_repository.rb").to_s
101
- end
102
-
103
- # @since 0.9.1
104
- # @api private
105
- def migration_path
106
- timestamp = Time.now.utc.strftime(Migration::TIMESTAMP_FORMAT)
107
- filename = Migration::FILENAME_PATTERN % { timestamp: timestamp, name: "create_#{table_name}"}
108
- Hanami::Model.configuration.migrations.join(filename)
109
- end
110
-
111
- # @since 0.5.0
112
- # @api private
113
- def entity_spec_path
114
- target_path.join('spec', project_name, 'entities', "#{ model_name_underscored }_spec.rb")
115
- end
116
-
117
- # @since 0.5.0
118
- # @api private
119
- def repository_spec_path
120
- target_path.join('spec', project_name, 'repositories',
121
- "#{ model_name_underscored }_repository_spec.rb")
122
- end
123
-
124
- # @since 0.5.0
125
- # @api private
126
- def model_name_underscored
127
- input
128
- end
129
- end
130
- end
131
- end
132
- end