hanami 0.0.0 → 0.7.0

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 (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