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
@@ -0,0 +1,21 @@
1
+ module Hanami
2
+ class CLI
3
+ module Commands
4
+ # @since 1.1.0
5
+ # @api private
6
+ class Routes < Command
7
+ requires "routes.inspector"
8
+
9
+ desc "Prints routes"
10
+
11
+ # @since 1.1.0
12
+ # @api private
13
+ def call(*)
14
+ puts requirements['routes.inspector'].inspect
15
+ end
16
+ end
17
+ end
18
+
19
+ register "routes", Commands::Routes
20
+ end
21
+ end
@@ -0,0 +1,39 @@
1
+ module Hanami
2
+ class CLI
3
+ module Commands
4
+ # @since 1.1.0
5
+ # @api private
6
+ class Server < Command
7
+ requires 'code_reloading'
8
+
9
+ desc "Start Hanami server (only for development)"
10
+
11
+ option :server, desc: "Force a server engine (eg, webrick, puma, thin, etc..)"
12
+ option :host, desc: "The host address to bind to"
13
+ option :port, desc: "The port to run the server on", aliases: ["-p"]
14
+ option :debug, desc: "Turn on debug output"
15
+ option :warn, desc: "Turn on warnings"
16
+ option :daemonize, desc: "Daemonize the server"
17
+ option :pid, desc: "Path to write a pid file after daemonize"
18
+ option :code_reloading, desc: "Code reloading", type: :boolean, default: true
19
+
20
+ example [
21
+ " # Basic usage (it uses the bundled server engine)",
22
+ "--server=webrick # Force `webrick` server engine",
23
+ "--host=0.0.0.0 # Bind to a host",
24
+ "--port=2306 # Bind to a port",
25
+ "--no-code-reloading # Disable code reloading"
26
+ ]
27
+
28
+ # @since 1.1.0
29
+ # @api private
30
+ def call(*)
31
+ require "hanami/server"
32
+ Hanami::Server.new.start
33
+ end
34
+ end
35
+ end
36
+
37
+ register "server", Commands::Server, aliases: ["s"]
38
+ end
39
+ end
@@ -0,0 +1,31 @@
1
+ module Hanami
2
+ class CLI
3
+ module Commands
4
+ # @since 1.1.0
5
+ # @api private
6
+ class Templates
7
+ NAMESPACE = name.sub(Utils::String.demodulize(name), "").freeze
8
+
9
+ # @since 1.1.0
10
+ # @api private
11
+ def initialize(klass)
12
+ word = klass.name.sub(NAMESPACE, "").split("::").map(&:downcase)
13
+ @root = Pathname.new(File.join(__dir__, *word))
14
+ freeze
15
+ end
16
+
17
+ # @since 1.1.0
18
+ # @api private
19
+ def find(*names)
20
+ @root.join(*names)
21
+ end
22
+
23
+ private
24
+
25
+ # @since 1.1.0
26
+ # @api private
27
+ attr_reader :root
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,19 @@
1
+ module Hanami
2
+ class CLI
3
+ module Commands
4
+ # @since 1.1.0
5
+ # @api private
6
+ class Version < Command
7
+ desc "Print Hanami version"
8
+
9
+ # @since 1.1.0
10
+ # @api private
11
+ def call(*)
12
+ puts "v#{Hanami::VERSION}"
13
+ end
14
+ end
15
+ end
16
+
17
+ register "version", Commands::Version, aliases: ["v", "-v", "--version"]
18
+ end
19
+ end
@@ -34,11 +34,15 @@ module Hanami
34
34
 
35
35
  # @since 1.0.0
36
36
  # @api private
37
- QUERY_STRING = 'QUERY_STRING'.freeze
37
+ RACK_ERRORS = 'rack.errors'.freeze
38
38
 
39
- # @since 1.0.0
39
+ # @since x.x.x
40
40
  # @api private
41
- RACK_ERRORS = 'rack.errors'.freeze
41
+ QUERY_HASH = 'rack.request.query_hash'.freeze
42
+
43
+ # @since x.x.x
44
+ # @api private
45
+ FORM_HASH = 'rack.request.form_hash'.freeze
42
46
 
43
47
  # @since 1.0.0
44
48
  # @api private
@@ -55,8 +59,8 @@ module Hanami
55
59
  status: status.to_s[0..3],
56
60
  ip: env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR],
57
61
  path: env[SCRIPT_NAME] + env[PATH_INFO],
58
- query: env[QUERY_STRING],
59
62
  length: length,
63
+ params: extract_params(env),
60
64
  elapsed: now - began_at
61
65
  ]
62
66
 
@@ -69,5 +73,11 @@ module Hanami
69
73
  logger.info(msg)
70
74
  end
71
75
  end
76
+
77
+ # @since 1.1.0
78
+ # @api private
79
+ def extract_params(env)
80
+ (env[QUERY_HASH] || {}).merge(env[FORM_HASH] || {})
81
+ end
72
82
  end
73
83
  end
@@ -8,6 +8,29 @@ module Hanami
8
8
  #
9
9
  # The implementation is thread-safe
10
10
  #
11
+ # @example
12
+ # Hanami::Components.resolved('repo') { UserRepository.new }
13
+ # Hanami::Components['repository.users'] # => #<UserRepository relations=[...]>
14
+ #
15
+ # Also you can use Hanami::Components with dry-auto_inject
16
+ #
17
+ # @example
18
+ # Hanami::Components.resolved('repo') { UserRepository.new }
19
+ # Hanami::Components['repository.users'] # => #<UserRepository relations=[...]>
20
+ #
21
+ # HanamiImport = Dry::AutoInject(Hanami::Components)
22
+ #
23
+ # class CreateUser
24
+ # include HanamiImport['repository.users']
25
+ #
26
+ # def call(payload)
27
+ # users.create(payload)
28
+ # end
29
+ # end
30
+ #
31
+ # CreateUser.new.call # => #<User:...>
32
+ # CreateUser.new(users: MockRepository.new).call # => #<MockUser:...>
33
+ #
11
34
  # @since 0.9.0
12
35
  # @api private
13
36
  module Components
@@ -87,7 +110,13 @@ module Hanami
87
110
  end
88
111
  end
89
112
 
90
- # Return the value of an already resolved component.
113
+ # Return the value of an already resolved component. Or raise error for not resolved component.
114
+ #
115
+ # @example
116
+ # Hanami::Components.resolved('repository.users') { UserRepository.new }
117
+ #
118
+ # Hanami::Components['repository.users'] # => #<UserRepository relations=[...]>
119
+ # Hanami::Components['repository.other'] # => error
91
120
  #
92
121
  # @param name [String] the component name
93
122
  #
@@ -106,6 +135,15 @@ module Hanami
106
135
  #
107
136
  # NOTE: this MUST NOT be used unless you know what you're doing.
108
137
  #
138
+ # @example
139
+ # Hanami::Components.resolved('repository.users') { UserRepository.new }
140
+ # Hanami::Components['repository.users'] # => #<UserRepository relations=[...]>
141
+ #
142
+ # Hanami::Components.release
143
+ # Hanami::Components['repository.users']
144
+ # # => ArgumentError: Component not resolved: `repo'.
145
+ # # => Resolved components are: ...
146
+ #
109
147
  # @since 1.0.0
110
148
  # @api private
111
149
  def self.release
@@ -28,7 +28,13 @@ module Hanami
28
28
  end
29
29
 
30
30
  resolve do |configuration|
31
- Hanami::Logger.new(Hanami.environment.project_name, *configuration.logger) unless configuration.logger.nil?
31
+ if configuration.logger.is_a?(Array)
32
+ if configuration.logger.first.is_a?(::Logger)
33
+ configuration.logger.first
34
+ else
35
+ Hanami::Logger.new(Hanami.environment.project_name, *configuration.logger)
36
+ end
37
+ end
32
38
  end
33
39
  end
34
40
 
@@ -111,6 +117,35 @@ module Hanami
111
117
  end
112
118
  end
113
119
 
120
+ # Tries to evaluate hanami-model configuration, if available for the project
121
+ # and it doesn't activate migrations logger
122
+ #
123
+ # @since 1.1.0
124
+ # @api private
125
+ #
126
+ # @example With hanami-model
127
+ # Hanami::Components.resolve('model.configuration.no_logger')
128
+ # Hanami::Components['model.configuration.no_logger'].class # => Hanami::Model::Configuration
129
+ #
130
+ # @example Without hanami-model
131
+ # Hanami::Components.resolve('model.configuration.no_logger')
132
+ # Hanami::Components['model.configuration.no_logger'].class # => NilClass
133
+ register 'model.configuration.no_logger' do
134
+ requires 'model.bundled'
135
+
136
+ prepare do
137
+ require 'stringio'
138
+ end
139
+
140
+ resolve do |configuration|
141
+ if Components['model.bundled']
142
+ Hanami::Model.configure(&configuration.model)
143
+ Hanami::Model.config.migrations_logger(StringIO.new)
144
+ Hanami::Model.configuration
145
+ end
146
+ end
147
+ end
148
+
114
149
  # Tries to load SQL support for hanami, if available for the project
115
150
  #
116
151
  # @since 0.9.0
@@ -58,7 +58,7 @@ module Hanami
58
58
  def middleware
59
59
  middleware = case @adapter
60
60
  when Symbol
61
- RACK_NAMESPACE % Utils::String.new(@adapter).classify
61
+ RACK_NAMESPACE % Utils::String.classify(@adapter)
62
62
  else
63
63
  @adapter
64
64
  end
@@ -110,19 +110,7 @@ module Hanami
110
110
 
111
111
  # @since 0.4.0
112
112
  # @api private
113
- CONTAINER = 'container'.freeze
114
-
115
- # @since 0.4.0
116
- # @api private
117
- CONTAINER_PATH = 'apps'.freeze
118
-
119
- # @since 0.4.0
120
- # @api private
121
- APPLICATION = 'app'.freeze
122
-
123
- # @since 0.4.0
124
- # @api private
125
- APPLICATION_PATH = 'app'.freeze
113
+ APPS_PATH = 'apps'.freeze
126
114
 
127
115
  # @since 0.4.0
128
116
  # @api private
@@ -140,12 +128,17 @@ module Hanami
140
128
  # When initialized, it sets standard `ENV` variables for Rack and Hanami,
141
129
  # such as `RACK_ENV` and `HANAMI_ENV`.
142
130
  #
143
- # It also evaluates configuration from `.env` and `.env.<environment>`
131
+ # It evaluates configuration ONLY from `.env.<environment>` file
144
132
  # located under the config directory. All the settings in those files will
145
133
  # be exported as `ENV` variables.
146
134
  #
147
- # The format of those `.env` files is compatible with `dotenv` and `foreman`
148
- # gems.
135
+ # Master .env file is ignored to suggest clear separation of environment
136
+ # configurations and discourage putting sensitive information into source
137
+ # control.
138
+ #
139
+ # The format of those `.env.<environment>` files follows UNIX and UNIX-like
140
+ # operating system environment variable declaration format and compatible
141
+ # with `dotenv` and `foreman` gems.
149
142
  #
150
143
  # @param options [Hash] override default options for various environment
151
144
  # attributes
@@ -164,10 +157,10 @@ module Hanami
164
157
  # # % tree .
165
158
  # # .
166
159
  # # # ...
167
- # # ├── .env
160
+ # # ├── .env.test
168
161
  # # └── .env.development
169
162
  #
170
- # # % cat .env
163
+ # # % cat .env.test
171
164
  # # FOO="bar"
172
165
  # # XYZ="yes"
173
166
  #
@@ -188,14 +181,11 @@ module Hanami
188
181
  #
189
182
  # # User defined ENV vars
190
183
  # ENV['FOO'] # => "ok"
191
- # ENV['XYZ'] # => "yes"
192
- #
193
- # # Hanami::Environment evaluates `.env` first as master configuration.
194
- # # Then it evaluates `.env.development` because the current environment
195
- # # is "development". The settings defined in this last file override
196
- # # the one defined in the parent (eg `FOO` is overwritten). All the
197
- # # other settings (eg `XYZ`) will be left untouched.
198
- # # Variables declared on `.env` and `.env.development` will not override
184
+ # ENV['XYZ'] # => nil
185
+ #
186
+ # # Hanami::Environment evaluates `.env.development` because the current
187
+ # # environment is "development".
188
+ # # Variables declared on `.env.development` will not override
199
189
  # # any variable declared on the shell when calling a `hanami` command.
200
190
  # # Eg. In `FOO="not ok" bundle exec hanami c` `FOO` will not be overwritten
201
191
  # # to `"ok"`.
@@ -203,7 +193,7 @@ module Hanami
203
193
  opts = options.to_h.dup
204
194
  @env = Hanami::Env.new(env: opts.delete(:env) || ENV)
205
195
  @options = Hanami::Hanamirc.new(root).options
206
- @options.merge! Utils::Hash.new(opts.clone).symbolize!
196
+ @options.merge! Utils::Hash.symbolize(opts.clone)
207
197
  LOCK.synchronize { set_env_vars! }
208
198
  end
209
199
 
@@ -389,7 +379,7 @@ module Hanami
389
379
  #
390
380
  # @see Hanami::Environment::DEFAULT_ENVIRONMENT_CONFIG
391
381
  def env_config
392
- root.join(@options.fetch(:environment) { config.join(DEFAULT_ENVIRONMENT_CONFIG) })
382
+ root.join("config", "environment.rb")
393
383
  end
394
384
 
395
385
  alias project_environment_configuration env_config
@@ -430,21 +420,6 @@ module Hanami
430
420
  @options.fetch(:code_reloading) { !!CODE_RELOADING[environment] }
431
421
  end
432
422
 
433
- # @since 0.4.0
434
- # @api private
435
- def architecture
436
- @options.fetch(:architecture) do
437
- puts "Cannot recognize Hanami architecture, please check `.hanamirc'"
438
- exit 1
439
- end
440
- end
441
-
442
- # @since 0.4.0
443
- # @api private
444
- def container?
445
- architecture == CONTAINER
446
- end
447
-
448
423
  # @since 0.6.0
449
424
  # @api private
450
425
  def serve_static_assets?
@@ -468,17 +443,12 @@ module Hanami
468
443
  # @since 0.4.0
469
444
  # @api private
470
445
  def apps_path
471
- @options.fetch(:path) {
472
- case architecture
473
- when CONTAINER then CONTAINER_PATH
474
- when APPLICATION then APPLICATION_PATH
475
- end
476
- }
446
+ @options.fetch(:path, APPS_PATH)
477
447
  end
478
448
 
479
449
  # Serialize the most relevant settings into a Hash
480
450
  #
481
- # @return [Hanami::Utils::Hash]
451
+ # @return [::Hash]
482
452
  #
483
453
  # @since 0.1.0
484
454
  # @api private
@@ -15,28 +15,6 @@ module Hanami
15
15
  # @see Hanami::Hanamirc#path_file
16
16
  FILE_NAME = '.hanamirc'.freeze
17
17
 
18
- # Architecture default value
19
- #
20
- # @since 0.3.0
21
- # @api private
22
- #
23
- # @see Hanami::Hanamirc#options
24
- DEFAULT_ARCHITECTURE = 'container'.freeze
25
-
26
- # Application architecture value
27
- #
28
- # @since 0.6.0
29
- # @api private
30
- APP_ARCHITECTURE = 'app'.freeze
31
-
32
- # Architecture key for writing the hanamirc file
33
- #
34
- # @since 0.3.0
35
- # @api private
36
- #
37
- # @see Hanami::Hanamirc#default_options
38
- ARCHITECTURE_KEY = 'architecture'.freeze
39
-
40
18
  # Project name for writing the hanamirc file
41
19
  #
42
20
  # @since 0.8.0
@@ -94,16 +72,16 @@ module Hanami
94
72
 
95
73
  # Read hanamirc file (if exists) and parse it's values or return default.
96
74
  #
97
- # @return [Hanami::Utils::Hash] parsed values
75
+ # @return [::Hash] parsed values
98
76
  #
99
77
  # @example Default values if file doesn't exist
100
78
  # Hanami::Hanamirc.new(Pathname.new(Dir.pwd)).options
101
- # # => { architecture: 'container', test: 'minitest', template: 'erb' }
79
+ # # => { test: 'minitest', template: 'erb' }
102
80
  #
103
81
  # @example Custom values if file doesn't exist
104
- # options = { architect: 'application', test: 'rspec', template: 'slim' }
82
+ # options = { test: 'rspec', template: 'slim' }
105
83
  # Hanami::Hanamirc.new(Pathname.new(Dir.pwd), options).options
106
- # # => { architecture: 'application', test: 'rspec', template: 'slim' }
84
+ # # => { test: 'rspec', template: 'slim' }
107
85
  def options
108
86
  @options ||= symbolize(default_options.merge(file_options))
109
87
  end
@@ -115,12 +93,11 @@ module Hanami
115
93
  #
116
94
  # @see Hanami::Hanamirc#options
117
95
  def default_options
118
- @default_options ||= Utils::Hash.new({
119
- ARCHITECTURE_KEY => DEFAULT_ARCHITECTURE,
96
+ @default_options ||= Utils::Hash.symbolize({
120
97
  PROJECT_NAME => project_name,
121
98
  TEST_KEY => DEFAULT_TEST_SUITE,
122
99
  TEMPLATE_KEY => DEFAULT_TEMPLATE
123
- }).symbolize!.freeze
100
+ }).freeze
124
101
  end
125
102
 
126
103
  # Check if hanamirc file exists
@@ -137,7 +114,7 @@ module Hanami
137
114
 
138
115
  # @api private
139
116
  def symbolize(hash)
140
- Utils::Hash.new(hash).symbolize!
117
+ Utils::Hash.symbolize(hash)
141
118
  end
142
119
 
143
120
  # @api private