hanami 0.0.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +214 -0
  3. data/FEATURES.md +156 -0
  4. data/LICENSE.md +22 -0
  5. data/README.md +80 -15
  6. data/bin/hanami +5 -0
  7. data/hanami.gemspec +27 -12
  8. data/lib/hanami.rb +78 -2
  9. data/lib/hanami/action/csrf_protection.rb +167 -0
  10. data/lib/hanami/action/routing_helpers.rb +40 -0
  11. data/lib/hanami/application.rb +244 -0
  12. data/lib/hanami/application_name.rb +101 -0
  13. data/lib/hanami/cli.rb +119 -0
  14. data/lib/hanami/cli_sub_commands/assets.rb +29 -0
  15. data/lib/hanami/cli_sub_commands/db.rb +124 -0
  16. data/lib/hanami/cli_sub_commands/destroy.rb +102 -0
  17. data/lib/hanami/cli_sub_commands/generate.rb +127 -0
  18. data/lib/hanami/commands/assets/precompile.rb +35 -0
  19. data/lib/hanami/commands/console.rb +90 -0
  20. data/lib/hanami/commands/db/abstract.rb +19 -0
  21. data/lib/hanami/commands/db/apply.rb +14 -0
  22. data/lib/hanami/commands/db/console.rb +50 -0
  23. data/lib/hanami/commands/db/create.rb +14 -0
  24. data/lib/hanami/commands/db/drop.rb +14 -0
  25. data/lib/hanami/commands/db/migrate.rb +19 -0
  26. data/lib/hanami/commands/db/prepare.rb +14 -0
  27. data/lib/hanami/commands/db/version.rb +14 -0
  28. data/lib/hanami/commands/generate/abstract.rb +63 -0
  29. data/lib/hanami/commands/generate/action.rb +262 -0
  30. data/lib/hanami/commands/generate/app.rb +116 -0
  31. data/lib/hanami/commands/generate/mailer.rb +118 -0
  32. data/lib/hanami/commands/generate/migration.rb +63 -0
  33. data/lib/hanami/commands/generate/model.rb +96 -0
  34. data/lib/hanami/commands/new/abstract.rb +128 -0
  35. data/lib/hanami/commands/new/app.rb +116 -0
  36. data/lib/hanami/commands/new/container.rb +102 -0
  37. data/lib/hanami/commands/routes.rb +41 -0
  38. data/lib/hanami/commands/server.rb +79 -0
  39. data/lib/hanami/config/configure.rb +17 -0
  40. data/lib/hanami/config/cookies.rb +68 -0
  41. data/lib/hanami/config/framework_configuration.rb +42 -0
  42. data/lib/hanami/config/load_paths.rb +27 -0
  43. data/lib/hanami/config/mapper.rb +36 -0
  44. data/lib/hanami/config/mapping.rb +12 -0
  45. data/lib/hanami/config/routes.rb +16 -0
  46. data/lib/hanami/config/security.rb +58 -0
  47. data/lib/hanami/config/sessions.rb +97 -0
  48. data/lib/hanami/configuration.rb +1728 -0
  49. data/lib/hanami/container.rb +59 -0
  50. data/lib/hanami/environment.rb +485 -0
  51. data/lib/hanami/frameworks.rb +14 -0
  52. data/lib/hanami/generators/action/action.rb.tt +8 -0
  53. data/lib/hanami/generators/action/action_spec.minitest.tt +12 -0
  54. data/lib/hanami/generators/action/action_spec.rspec.tt +11 -0
  55. data/lib/hanami/generators/action/action_without_view.rb.tt +9 -0
  56. data/lib/hanami/generators/action/template.tt +0 -0
  57. data/lib/hanami/generators/action/view.rb.tt +5 -0
  58. data/lib/hanami/generators/action/view_spec.minitest.tt +13 -0
  59. data/lib/hanami/generators/action/view_spec.rspec.tt +12 -0
  60. data/lib/hanami/generators/app/.gitkeep.tt +1 -0
  61. data/lib/hanami/generators/app/application.rb.tt +273 -0
  62. data/lib/hanami/generators/app/config/initializers/.gitkeep +0 -0
  63. data/lib/hanami/generators/app/config/routes.rb.tt +2 -0
  64. data/lib/hanami/generators/app/favicon.ico +0 -0
  65. data/lib/hanami/generators/app/templates/application.html.erb.tt +10 -0
  66. data/lib/hanami/generators/app/views/application_layout.rb.tt +7 -0
  67. data/lib/hanami/generators/application/app/.env.development.tt +4 -0
  68. data/lib/hanami/generators/application/app/.env.test.tt +4 -0
  69. data/lib/hanami/generators/application/app/.env.tt +1 -0
  70. data/lib/hanami/generators/application/app/.gitignore +0 -0
  71. data/lib/hanami/generators/application/app/.gitkeep +1 -0
  72. data/lib/hanami/generators/application/app/Gemfile.tt +37 -0
  73. data/lib/hanami/generators/application/app/Rakefile.minitest.tt +11 -0
  74. data/lib/hanami/generators/application/app/Rakefile.rspec.tt +6 -0
  75. data/lib/hanami/generators/application/app/apps/.gitkeep.tt +1 -0
  76. data/lib/hanami/generators/application/app/capybara.rb.rspec.tt +8 -0
  77. data/lib/hanami/generators/application/app/config.ru.tt +3 -0
  78. data/lib/hanami/generators/application/app/config/application.rb.tt +270 -0
  79. data/lib/hanami/generators/application/app/config/environment.rb.tt +5 -0
  80. data/lib/hanami/generators/application/app/config/initializers/.gitkeep +0 -0
  81. data/lib/hanami/generators/application/app/config/routes.rb.tt +2 -0
  82. data/lib/hanami/generators/application/app/db/.gitkeep +1 -0
  83. data/lib/hanami/generators/application/app/favicon.ico +0 -0
  84. data/lib/hanami/generators/application/app/features_helper.rb.minitest.tt +11 -0
  85. data/lib/hanami/generators/application/app/features_helper.rb.rspec.tt +12 -0
  86. data/lib/hanami/generators/application/app/gitignore.tt +2 -0
  87. data/lib/hanami/generators/application/app/gitignore_with_db.tt +4 -0
  88. data/lib/hanami/generators/application/app/hanamirc.tt +3 -0
  89. data/lib/hanami/generators/application/app/lib/app_name.rb.tt +59 -0
  90. data/lib/hanami/generators/application/app/lib/chirp/entities/.gitkeep +1 -0
  91. data/lib/hanami/generators/application/app/lib/chirp/repositories/.gitkeep +1 -0
  92. data/lib/hanami/generators/application/app/lib/config/mapping.rb.tt +7 -0
  93. data/lib/hanami/generators/application/app/rspec.rspec.tt +2 -0
  94. data/lib/hanami/generators/application/app/schema.sql.tt +0 -0
  95. data/lib/hanami/generators/application/app/spec_helper.rb.minitest.tt +7 -0
  96. data/lib/hanami/generators/application/app/spec_helper.rb.rspec.tt +104 -0
  97. data/lib/hanami/generators/application/app/templates/application.html.erb.tt +10 -0
  98. data/lib/hanami/generators/application/app/views/application_layout.rb.tt +7 -0
  99. data/lib/hanami/generators/application/container/.env.development.tt +3 -0
  100. data/lib/hanami/generators/application/container/.env.test.tt +3 -0
  101. data/lib/hanami/generators/application/container/.env.tt +1 -0
  102. data/lib/hanami/generators/application/container/.gitignore +0 -0
  103. data/lib/hanami/generators/application/container/.gitkeep +1 -0
  104. data/lib/hanami/generators/application/container/Gemfile.tt +36 -0
  105. data/lib/hanami/generators/application/container/Rakefile.minitest.tt +11 -0
  106. data/lib/hanami/generators/application/container/Rakefile.rspec.tt +6 -0
  107. data/lib/hanami/generators/application/container/capybara.rb.rspec.tt +8 -0
  108. data/lib/hanami/generators/application/container/config.ru.tt +3 -0
  109. data/lib/hanami/generators/application/container/config/environment.rb.tt +7 -0
  110. data/lib/hanami/generators/application/container/config/initializers/.gitkeep +0 -0
  111. data/lib/hanami/generators/application/container/db/.gitkeep +1 -0
  112. data/lib/hanami/generators/application/container/features_helper.rb.minitest.tt +11 -0
  113. data/lib/hanami/generators/application/container/features_helper.rb.rspec.tt +12 -0
  114. data/lib/hanami/generators/application/container/gitignore.tt +2 -0
  115. data/lib/hanami/generators/application/container/gitignore_with_db.tt +4 -0
  116. data/lib/hanami/generators/application/container/hanamirc.tt +3 -0
  117. data/lib/hanami/generators/application/container/lib/app_name.rb.tt +60 -0
  118. data/lib/hanami/generators/application/container/lib/chirp/entities/.gitkeep +1 -0
  119. data/lib/hanami/generators/application/container/lib/chirp/mailers/.gitkeep +0 -0
  120. data/lib/hanami/generators/application/container/lib/chirp/mailers/templates/.gitkeep +0 -0
  121. data/lib/hanami/generators/application/container/lib/chirp/repositories/.gitkeep +1 -0
  122. data/lib/hanami/generators/application/container/lib/config/mapping.rb.tt +7 -0
  123. data/lib/hanami/generators/application/container/rspec.rspec.tt +2 -0
  124. data/lib/hanami/generators/application/container/schema.sql.tt +0 -0
  125. data/lib/hanami/generators/application/container/spec_helper.rb.minitest.tt +7 -0
  126. data/lib/hanami/generators/application/container/spec_helper.rb.rspec.tt +104 -0
  127. data/lib/hanami/generators/database_config.rb +99 -0
  128. data/lib/hanami/generators/generatable.rb +51 -0
  129. data/lib/hanami/generators/generator.rb +35 -0
  130. data/lib/hanami/generators/mailer/mailer.rb.tt +7 -0
  131. data/lib/hanami/generators/mailer/mailer_spec.rb.tt +7 -0
  132. data/lib/hanami/generators/mailer/template.html.tt +0 -0
  133. data/lib/hanami/generators/mailer/template.txt.tt +0 -0
  134. data/lib/hanami/generators/migration/migration.rb.tt +4 -0
  135. data/lib/hanami/generators/model/entity.rb.tt +3 -0
  136. data/lib/hanami/generators/model/entity_spec.minitest.tt +5 -0
  137. data/lib/hanami/generators/model/entity_spec.rspec.tt +3 -0
  138. data/lib/hanami/generators/model/repository.rb.tt +3 -0
  139. data/lib/hanami/generators/model/repository_spec.minitest.tt +5 -0
  140. data/lib/hanami/generators/model/repository_spec.rspec.tt +3 -0
  141. data/lib/hanami/generators/test_framework.rb +42 -0
  142. data/lib/hanami/hanamirc.rb +152 -0
  143. data/lib/hanami/loader.rb +258 -0
  144. data/lib/hanami/mailer/glue.rb +68 -0
  145. data/lib/hanami/middleware.rb +143 -0
  146. data/lib/hanami/rake_helper.rb +68 -0
  147. data/lib/hanami/rake_tasks.rb +2 -0
  148. data/lib/hanami/rendering_policy.rb +77 -0
  149. data/lib/hanami/repositories/car_repository.rb +3 -0
  150. data/lib/hanami/repositories/name_repository.rb +3 -0
  151. data/lib/hanami/root.rb +7 -0
  152. data/lib/hanami/routes.rb +151 -0
  153. data/lib/hanami/routing/default.rb +25 -0
  154. data/lib/hanami/setup.rb +3 -0
  155. data/lib/hanami/static.rb +77 -0
  156. data/lib/hanami/templates/default.html.erb +9 -0
  157. data/lib/hanami/templates/welcome.html.erb +52 -0
  158. data/lib/hanami/version.rb +4 -1
  159. data/lib/hanami/views/default.rb +34 -0
  160. data/lib/hanami/views/default_template_finder.rb +20 -0
  161. data/lib/hanami/views/null_view.rb +17 -0
  162. data/lib/hanami/welcome.rb +40 -0
  163. metadata +357 -16
  164. data/.gitignore +0 -9
  165. data/Gemfile +0 -4
  166. data/Rakefile +0 -2
  167. data/bin/console +0 -14
  168. data/bin/setup +0 -8
@@ -0,0 +1,63 @@
1
+ require 'hanami/commands/generate/abstract'
2
+
3
+ module Hanami
4
+ module Commands
5
+ class Generate
6
+ class Migration < Abstract
7
+
8
+ attr_reader :name, :underscored_name
9
+
10
+ # @since 0.6.0
11
+ # @api private
12
+ #
13
+ # @example
14
+ # 20150612160502
15
+ TIMESTAMP_FORMAT = '%Y%m%d%H%M%S'.freeze
16
+
17
+ # @since 0.6.0
18
+ # @api private
19
+ #
20
+ # @example
21
+ # 20150612160502_create_books.rb
22
+ FILENAME_PATTERN = '%{timestamp}_%{name}.rb'.freeze
23
+
24
+ def initialize(options, name)
25
+ super(options)
26
+
27
+ @name = name
28
+ @underscored_name = Utils::String.new(@name).underscore
29
+
30
+ environment.require_application_environment
31
+ assert_migration_name!
32
+ end
33
+
34
+ def map_templates
35
+ add_mapping('migration.rb.tt', destination_path)
36
+ end
37
+
38
+ private
39
+
40
+ def destination_path
41
+ existing_migration_path || new_migration_path
42
+ end
43
+
44
+ def existing_migration_path
45
+ Dir.glob("#{Hanami::Model.configuration.migrations}/[0-9]*_#{underscored_name}.rb").first
46
+ end
47
+
48
+ def new_migration_path
49
+ timestamp = Time.now.utc.strftime(TIMESTAMP_FORMAT)
50
+ filename = FILENAME_PATTERN % { timestamp: timestamp, name: underscored_name}
51
+
52
+ Hanami::Model.configuration.migrations.join(filename)
53
+ end
54
+
55
+ def assert_migration_name!
56
+ if name.nil? || name.strip.empty?
57
+ raise ArgumentError.new('Migration name nil or empty')
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,96 @@
1
+ require 'hanami/commands/generate/abstract'
2
+
3
+ module Hanami
4
+ module Commands
5
+ class Generate
6
+ class Model < Abstract
7
+
8
+ attr_reader :model_name
9
+
10
+ def initialize(options, model_name)
11
+ super(options)
12
+ @model_name = Utils::String.new(model_name).classify
13
+
14
+ assert_model_name!
15
+ end
16
+
17
+ def map_templates
18
+ add_mapping('entity.rb.tt', entity_path)
19
+ add_mapping('repository.rb.tt', repository_path)
20
+ add_mapping("entity_spec.#{ test_framework.framework }.tt", entity_spec_path,)
21
+ add_mapping("repository_spec.#{ test_framework.framework }.tt", repository_spec_path)
22
+ end
23
+
24
+ def template_options
25
+ {
26
+ model_name: model_name
27
+ }
28
+ end
29
+
30
+ private
31
+
32
+ # @since 0.6.0
33
+ # @api private
34
+ def assert_model_name!
35
+ model_name_not_blank
36
+ model_name_valid
37
+ end
38
+
39
+ # Validates that a model name was provided
40
+ #
41
+ # @since 0.6.0
42
+ # @api private
43
+ def model_name_not_blank
44
+ if model_name.nil? || model_name.strip.empty?
45
+ raise ArgumentError.new('Model name nil or empty.')
46
+ end
47
+ end
48
+
49
+ # Validates that the provided model name doesn't start with numbers
50
+ #
51
+ # @since 0.6.0
52
+ # @api private
53
+ def model_name_valid
54
+ unless model_name.match(/^[a-z]/i)
55
+ raise ArgumentError.new("Invalid model name. The model name shouldn't begin with a number.")
56
+ end
57
+ end
58
+
59
+ def model_root
60
+ Pathname.new('lib').join(::File.basename(Dir.getwd))
61
+ end
62
+
63
+ # @since 0.5.0
64
+ # @api private
65
+ def entity_path
66
+ model_root.join('entities', "#{ model_name_underscored }.rb").to_s
67
+ end
68
+
69
+ # @since 0.5.0
70
+ # @api private
71
+ def repository_path
72
+ model_root.join('repositories', "#{ model_name_underscored }_repository.rb").to_s
73
+ end
74
+
75
+ # @since 0.5.0
76
+ # @api private
77
+ def entity_spec_path
78
+ target_path.join('spec', ::File.basename(Dir.getwd), 'entities', "#{ model_name_underscored }_spec.rb")
79
+ end
80
+
81
+ # @since 0.5.0
82
+ # @api private
83
+ def repository_spec_path
84
+ target_path.join('spec', ::File.basename(Dir.getwd), 'repositories',
85
+ "#{ model_name_underscored }_repository_spec.rb")
86
+ end
87
+
88
+ # @since 0.5.0
89
+ # @api private
90
+ def model_name_underscored
91
+ Utils::String.new(model_name).underscore
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,128 @@
1
+ require 'shellwords'
2
+ require 'hanami/application_name'
3
+ require 'hanami/generators/database_config'
4
+ require 'hanami/generators/generatable'
5
+ require 'hanami/generators/test_framework'
6
+ require 'hanami/utils/hash'
7
+
8
+ module Hanami
9
+ module Commands
10
+ class New
11
+ class Abstract
12
+
13
+ include Hanami::Generators::Generatable
14
+
15
+ DEFAULT_ARCHITECTURE = 'container'.freeze
16
+ DEFAULT_APPLICATION_BASE_URL = '/'.freeze
17
+
18
+ attr_reader :options, :target_path, :database_config
19
+
20
+ def initialize(options, name)
21
+ @options = Hanami::Utils::Hash.new(options).symbolize!
22
+ @name = name
23
+ @options[:database] ||= Hanami::Generators::DatabaseConfig::DEFAULT_ENGINE
24
+
25
+ assert_options!
26
+ assert_name!
27
+ assert_architecture!
28
+
29
+ @hanami_model_version = '~> 0.5'
30
+ @database_config = Hanami::Generators::DatabaseConfig.new(options[:database], app_name)
31
+ end
32
+
33
+ def start
34
+ FileUtils.mkdir_p(@name)
35
+ Dir.chdir(@name) do
36
+ @target_path = Pathname.pwd
37
+
38
+ super
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def test_framework
45
+ @test_framework ||= Hanami::Generators::TestFramework.new(hanamirc, options[:test])
46
+ end
47
+
48
+ def hanamirc
49
+ @hanamirc ||= Hanamirc.new(Pathname.new('.'))
50
+ end
51
+
52
+ def start_in_app_dir
53
+ raise NotImplementedError
54
+ end
55
+
56
+ def add_sql_templates
57
+ return if !database_config.sql?
58
+
59
+ add_mapping('schema.sql.tt', 'db/schema.sql')
60
+ end
61
+
62
+ def add_git_templates
63
+ return if git_dir_present?
64
+
65
+ source = database_config.filesystem? ? 'gitignore_with_db.tt' : 'gitignore.tt'
66
+ target = '.gitignore'
67
+ add_mapping(source, target)
68
+ end
69
+
70
+ def real_app_name
71
+ @name == '.' ? ::File.basename(Dir.getwd) : @name
72
+ end
73
+
74
+ def app_name
75
+ ApplicationName.new(real_app_name)
76
+ end
77
+
78
+ def target
79
+ Pathname.new('.')
80
+ end
81
+
82
+ def init_git
83
+ return if git_dir_present?
84
+
85
+ generator.run("git init #{Shellwords.escape(target)}", capture: true)
86
+ end
87
+
88
+ def git_dir_present?
89
+ File.directory?(target.join('.git'))
90
+ end
91
+
92
+ def hanami_model_version
93
+ @hanami_model_version
94
+ end
95
+
96
+ def hanami_head?
97
+ options.fetch(:hanami_head, false)
98
+ end
99
+
100
+ def architecture
101
+ options.fetch(:architecture, DEFAULT_ARCHITECTURE)
102
+ end
103
+
104
+ def assert_name!
105
+ if @name.nil? || @name.strip == '' || @name.include?(File::SEPARATOR)
106
+ raise ArgumentError.new("APPLICATION_NAME is requried and must not contain #{File::SEPARATOR}.")
107
+ end
108
+ end
109
+
110
+ def assert_architecture!
111
+ if !['app', 'container'].include?(architecture)
112
+ raise ArgumentError.new("Architecture must be one of 'app', 'container' but was '#{architecture}'")
113
+ end
114
+ end
115
+
116
+ def application_base_url
117
+ options[:application_base_url] || DEFAULT_APPLICATION_BASE_URL
118
+ end
119
+
120
+ def assert_options!
121
+ if options.nil?
122
+ raise ArgumentError.new('options must not be nil')
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,116 @@
1
+ require 'hanami/commands/new/abstract'
2
+
3
+ module Hanami
4
+ module Commands
5
+ class New
6
+ class App < Abstract
7
+
8
+ def initialize(options, name)
9
+ super(options, name)
10
+ end
11
+
12
+ def map_templates
13
+ add_application_templates
14
+ add_empty_directories
15
+ add_test_templates
16
+ add_sql_templates
17
+ add_git_templates
18
+ end
19
+
20
+ def template_options
21
+ {
22
+ app_name: app_name,
23
+ upcase_app_name: upcase_app_name,
24
+ classified_app_name: classified_app_name,
25
+ application_base_url: application_base_url,
26
+ hanami_head: hanami_head?,
27
+ test: test_framework.framework,
28
+ database: database_config.type,
29
+ database_config: database_config.to_hash,
30
+ hanami_model_version: hanami_model_version,
31
+ }
32
+ end
33
+
34
+ def post_process_templates
35
+ init_git
36
+ end
37
+
38
+ private
39
+
40
+ def add_application_templates
41
+ add_mapping('hanamirc.tt', '.hanamirc')
42
+ add_mapping('.env.tt', '.env')
43
+ add_mapping('.env.development.tt', '.env.development')
44
+ add_mapping('.env.test.tt', '.env.test')
45
+ add_mapping('Gemfile.tt', 'Gemfile')
46
+ add_mapping('config.ru.tt', 'config.ru')
47
+ add_mapping('config/environment.rb.tt', 'config/environment.rb')
48
+ add_mapping('lib/app_name.rb.tt', "lib/#{ app_name }.rb")
49
+ add_mapping('lib/config/mapping.rb.tt', 'lib/config/mapping.rb')
50
+ add_mapping('config/application.rb.tt', 'config/application.rb')
51
+ add_mapping('config/routes.rb.tt', 'config/routes.rb')
52
+ add_mapping('views/application_layout.rb.tt', 'app/views/application_layout.rb')
53
+ add_mapping('templates/application.html.erb.tt', 'app/templates/application.html.erb')
54
+ add_mapping('favicon.ico', 'app/assets/favicon.ico')
55
+ end
56
+
57
+ def add_test_templates
58
+ if test_framework.rspec?
59
+ add_mapping('Rakefile.rspec.tt', 'Rakefile')
60
+ add_mapping('rspec.rspec.tt', '.rspec')
61
+ add_mapping('spec_helper.rb.rspec.tt', 'spec/spec_helper.rb')
62
+ add_mapping('features_helper.rb.rspec.tt', 'spec/features_helper.rb')
63
+ add_mapping('capybara.rb.rspec.tt', 'spec/support/capybara.rb')
64
+ else
65
+ add_mapping('Rakefile.minitest.tt', 'Rakefile')
66
+ add_mapping('spec_helper.rb.minitest.tt', 'spec/spec_helper.rb')
67
+ add_mapping('features_helper.rb.minitest.tt', 'spec/features_helper.rb')
68
+ end
69
+ end
70
+
71
+ def add_empty_directories
72
+ add_mapping('.gitkeep', 'config/initializers/.gitkeep')
73
+ add_mapping('.gitkeep', 'app/controllers/.gitkeep')
74
+ add_mapping('.gitkeep', 'app/views/.gitkeep')
75
+ add_mapping('.gitkeep', 'app/assets/images/.gitkeep')
76
+ add_mapping('.gitkeep', 'app/assets/javascripts/.gitkeep')
77
+ add_mapping('.gitkeep', 'app/assets/stylesheets/.gitkeep')
78
+ add_mapping('.gitkeep', "lib/#{ app_name }/entities/.gitkeep")
79
+ add_mapping('.gitkeep', "lib/#{ app_name }/repositories/.gitkeep")
80
+ add_mapping('.gitkeep', "lib/#{ app_name }/mailers/.gitkeep")
81
+ add_mapping('.gitkeep', "lib/#{ app_name }/mailers/templates/.gitkeep")
82
+ add_mapping('.gitkeep', 'public/.gitkeep')
83
+
84
+ add_mapping('.gitkeep', 'spec/features/.gitkeep')
85
+ add_mapping('.gitkeep', 'spec/controllers/.gitkeep')
86
+ add_mapping('.gitkeep', 'spec/views/.gitkeep')
87
+ add_mapping('.gitkeep', "spec/#{ app_name }/entities/.gitkeep")
88
+ add_mapping('.gitkeep', "spec/#{ app_name }/repositories/.gitkeep")
89
+ add_mapping('.gitkeep', "spec/#{ app_name }/mailers/.gitkeep")
90
+ add_mapping('.gitkeep', 'spec/support/.gitkeep')
91
+
92
+ if database_config.sql?
93
+ add_mapping('.gitkeep', 'db/migrations/.gitkeep')
94
+ else
95
+ add_mapping('.gitkeep', 'db/.gitkeep')
96
+ end
97
+ end
98
+ def template_source_path
99
+ Pathname.new(::File.dirname(__FILE__)).join('..', '..', 'generators', 'application', 'app').realpath
100
+ end
101
+
102
+ def upcase_app_name
103
+ app_name.to_env_s
104
+ end
105
+
106
+ def classified_app_name
107
+ Utils::String.new(app_name).classify.tr('::', '')
108
+ end
109
+
110
+ # def application_base_path
111
+ # [ 'apps', app_name ].join(::File::SEPARATOR)
112
+ # end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,102 @@
1
+ require 'hanami/commands/generate/app'
2
+ require 'hanami/commands/new/abstract'
3
+
4
+ module Hanami
5
+ module Commands
6
+ class New
7
+ class Container < Abstract
8
+
9
+ DEFAULT_APPLICATION_NAME = 'web'.freeze
10
+
11
+ def map_templates
12
+ add_application_templates
13
+ add_empty_directories
14
+ add_test_templates
15
+ add_sql_templates
16
+ add_git_templates
17
+ end
18
+
19
+ def template_options
20
+ {
21
+ app_name: app_name,
22
+ hanami_head: hanami_head?,
23
+ test: test_framework.framework,
24
+ database: database_config.type,
25
+ database_config: database_config.to_hash,
26
+ hanami_model_version: hanami_model_version,
27
+ }
28
+ end
29
+
30
+ def post_process_templates
31
+ init_git
32
+ generate_app
33
+ end
34
+
35
+ private
36
+
37
+ def add_application_templates
38
+ add_mapping('hanamirc.tt', '.hanamirc')
39
+ add_mapping('.env.tt', '.env')
40
+ add_mapping('.env.development.tt', '.env.development')
41
+ add_mapping('.env.test.tt', '.env.test')
42
+ add_mapping('Gemfile.tt', 'Gemfile')
43
+ add_mapping('config.ru.tt', 'config.ru')
44
+ add_mapping('config/environment.rb.tt', 'config/environment.rb')
45
+ add_mapping('lib/app_name.rb.tt', "lib/#{ app_name }.rb")
46
+ add_mapping('lib/config/mapping.rb.tt', 'lib/config/mapping.rb')
47
+ end
48
+
49
+ def add_test_templates
50
+ if test_framework.rspec?
51
+ add_mapping('Rakefile.rspec.tt', 'Rakefile')
52
+ add_mapping('rspec.rspec.tt', '.rspec')
53
+ add_mapping('spec_helper.rb.rspec.tt', 'spec/spec_helper.rb')
54
+ add_mapping('features_helper.rb.rspec.tt', 'spec/features_helper.rb')
55
+ add_mapping('capybara.rb.rspec.tt', 'spec/support/capybara.rb')
56
+ else # minitest (default)
57
+ add_mapping('Rakefile.minitest.tt', 'Rakefile')
58
+ add_mapping('spec_helper.rb.minitest.tt', 'spec/spec_helper.rb')
59
+ add_mapping('features_helper.rb.minitest.tt', 'spec/features_helper.rb')
60
+ end
61
+ end
62
+
63
+ def add_empty_directories
64
+ add_mapping('.gitkeep', 'public/.gitkeep')
65
+ add_mapping('.gitkeep', 'config/initializers/.gitkeep')
66
+ add_mapping('.gitkeep', "lib/#{ app_name }/entities/.gitkeep")
67
+ add_mapping('.gitkeep', "lib/#{ app_name }/repositories/.gitkeep")
68
+ add_mapping('.gitkeep', "lib/#{ app_name }/mailers/.gitkeep")
69
+ add_mapping('.gitkeep', "lib/#{ app_name }/mailers/templates/.gitkeep")
70
+ add_mapping('.gitkeep', "spec/#{ app_name }/entities/.gitkeep")
71
+ add_mapping('.gitkeep', "spec/#{ app_name }/repositories/.gitkeep")
72
+ add_mapping('.gitkeep', "spec/#{ app_name }/mailers/.gitkeep")
73
+ add_mapping('.gitkeep', 'spec/support/.gitkeep')
74
+
75
+ if database_config.sql?
76
+ add_mapping('.gitkeep', 'db/migrations/.gitkeep')
77
+ else
78
+ add_mapping('.gitkeep', 'db/.gitkeep')
79
+ end
80
+ end
81
+
82
+ def generate_app
83
+ Hanami::Commands::Generate::App.new(app_options, app_slice_name).start
84
+ end
85
+
86
+ def app_options
87
+ {
88
+ application_base_url: application_base_url
89
+ }
90
+ end
91
+
92
+ def app_slice_name
93
+ options.fetch(:application_name, DEFAULT_APPLICATION_NAME)
94
+ end
95
+
96
+ def template_source_path
97
+ Pathname.new(::File.dirname(__FILE__)).join('..', '..', 'generators', 'application', 'container').realpath
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end