hanami 1.0.0 → 1.1.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1942d51ca0465a143c823ccd7d0c074dc33b4ff1
4
- data.tar.gz: ad0f56731ae8a04ff999473ca7abfbda98f4b429
3
+ metadata.gz: 0563f150b8f7f4d4d829600edba47e56e22d12a6
4
+ data.tar.gz: da1e14370a1c34df67516438b1f8b480f0c85f86
5
5
  SHA512:
6
- metadata.gz: 502ab09ab805fecfed890fda4e291aecd0fd22613017ef19c11beb8f11e296fe2b22e634e673d56ba6301c18d407538ea1840e98b65d1b7650a7d7c303436c77
7
- data.tar.gz: 18ff6036ff018c333a9a1e16f9b3eccc8416227b102ba59ebcef77e3d41de81ee5e2ec447c055223bc8dcd0aa7a921b6476a2a426bbd6e8d816e8a8385eba671
6
+ metadata.gz: 88b3c5a16d520bb93a27d262fd5c77d786095c6d5969c0b1f2d412a8f58c229ebd76225b4c05ecc7bc3d077b3ac411ae92f26d91564e826f6918aef2d9e8a257
7
+ data.tar.gz: c317261106b08f792784b56ed52e3834926c0a814ac64290345025bd0f0480a3d43b29f1136c10da0410d77d83dd5feaac1bc61e13d1f618da75ecc34439532a
@@ -1,6 +1,19 @@
1
1
  # Hanami
2
2
  The web, with simplicity.
3
3
 
4
+ ## v1.1.0.beta1 - 2017-08-11
5
+ ### Added
6
+ - [Ben Johnson] Allow to use custom logger as `Hanami.logger` (eg. `Hanami.configure { logger Timber::Logger.new($stdout) }`)
7
+ - [akhramov] Generate spec file for application layout when generating a new app
8
+ - [Anton Davydov] Generate `README.md` file for new projects
9
+ - [Anton Davydov] Selectively boot apps via `HANAMI_APPS=web bundle exec hanami server`
10
+ - [Marion Duprey & Gabriel Gizotti] Log payload (params) for non-GET HTTP requests
11
+ - [Marion Duprey & Gabriel Gizotti] Filter sensitive data in logs
12
+
13
+ ### Fixed
14
+ - [jarosluv] Ensure to remove the correct migration file when executing `hanami db destroy model`
15
+ - [sovetnik] Fix require path for Minitest spec helper
16
+
4
17
  ## v1.0.0 - 2017-04-06
5
18
 
6
19
  ## v1.0.0.rc1 - 2017-03-31
@@ -19,6 +32,7 @@ The web, with simplicity.
19
32
  - [Tobias Sandelius] Don't mount `Hanami::CommonLogger` middleware if logging is disabled for the project.
20
33
  - [Anton Davydov] Don't configure mailers, if it's mailing is disabled for the project.
21
34
  - [Marcello Rocha] Ensure code reloading don't misconfigure mailer settings
35
+ - [Jimmy Börjesson] Make `apps/web/application.rb` code to wrap around the 80th column
22
36
 
23
37
  ### Changed
24
38
  - [Luca Guidi] Removed deprecated `ApplicationConfiguration#default_format`. Use `#default_request_format` instead.
@@ -3,6 +3,18 @@
3
3
 
4
4
  ## Features
5
5
 
6
+ ## v1.1.0 (unreleased)
7
+
8
+ - One-To-Many association (aka `belongs_to`)
9
+ - One-To-One association (aka `has_one`)
10
+ - Many-To-Many association (aka `has_many :through`)
11
+ - Allow third-party developers to register commands for CLI (eg `hanami generate webpack`)
12
+ - Introduced new extra behaviors for entity manual schema: `:schema` (default), `:strict`, `:weak`, and `:permissive`
13
+ - Custom logger for `Hanami.logger`
14
+ - Selectively boot apps via `HANAMI_APPS=web` env var
15
+ - Log payload (params) for non-GET HTTP requests
16
+ - Filter sensitive data in logs
17
+
6
18
  ### v1.0.0 - 2017-04-06
7
19
 
8
20
  - Logger rotation
data/README.md CHANGED
@@ -25,6 +25,7 @@ which provides the glue that ties all the parts together:
25
25
  * [**Hanami::Helpers**](https://github.com/hanami/helpers) - View helpers for Ruby applications
26
26
  * [**Hanami::Mailer**](https://github.com/hanami/mailer) - Mail for Ruby applications
27
27
  * [**Hanami::Assets**](https://github.com/hanami/assets) - Assets management for Ruby
28
+ * [**Hanami::CLI**](https://github.com/hanami/cli) - Ruby command line interface
28
29
  * [**Hanami::Utils**](https://github.com/hanami/utils) - Ruby core extensions and class utilities
29
30
 
30
31
  These components are designed to be used independently or together in a Hanami application.
@@ -52,7 +53,9 @@ You can give back to Open Source, by supporting Hanami development via a [donati
52
53
 
53
54
  ### Supporters
54
55
 
56
+ * [Trung Lê](https://github.com/joneslee85)
55
57
  * [James Carlson](https://github.com/jxxcarlson)
58
+ * [Creditas](https://www.creditas.com.br/)
56
59
 
57
60
  ## Contact
58
61
 
data/bin/hanami CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
-
3
2
  require 'bundler'
4
- require 'hanami/cli'
5
- Hanami::Cli.start
3
+ require 'hanami/cli/commands'
4
+
5
+ Hanami::CLI.new(Hanami::CLI::Commands).call
@@ -21,16 +21,16 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.metadata['allowed_push_host'] = 'https://rubygems.org'
23
23
 
24
- spec.add_dependency 'hanami-utils', '~> 1.0'
25
- spec.add_dependency 'hanami-validations', '~> 1.0'
26
- spec.add_dependency 'hanami-router', '~> 1.0'
27
- spec.add_dependency 'hanami-controller', '~> 1.0'
28
- spec.add_dependency 'hanami-view', '~> 1.0'
29
- spec.add_dependency 'hanami-helpers', '~> 1.0'
30
- spec.add_dependency 'hanami-mailer', '~> 1.0'
31
- spec.add_dependency 'hanami-assets', '~> 1.0'
24
+ spec.add_dependency 'hanami-utils', '1.1.0.beta1'
25
+ spec.add_dependency 'hanami-validations', '1.1.0.beta1'
26
+ spec.add_dependency 'hanami-router', '1.1.0.beta1'
27
+ spec.add_dependency 'hanami-controller', '1.1.0.beta1'
28
+ spec.add_dependency 'hanami-view', '1.1.0.beta1'
29
+ spec.add_dependency 'hanami-helpers', '1.1.0.beta1'
30
+ spec.add_dependency 'hanami-mailer', '1.1.0.beta1'
31
+ spec.add_dependency 'hanami-assets', '1.1.0.beta1'
32
+ spec.add_dependency 'hanami-cli', '0.1.0.beta1'
32
33
  spec.add_dependency 'concurrent-ruby', '~> 1.0'
33
- spec.add_dependency 'thor', '~> 0.19'
34
34
  spec.add_dependency 'bundler', '~> 1.13'
35
35
 
36
36
  spec.add_development_dependency 'rspec', '~> 3.5'
@@ -118,6 +118,33 @@ module Hanami
118
118
  App.new(configuration, environment)
119
119
  end
120
120
 
121
+ # Check if an application is allowed to load.
122
+ #
123
+ # The list of applications to be loaded can be set via the `HANAMI_APPS`
124
+ # env variable. If the HANAMI_APPS env variable is not set, it defaults
125
+ # to loading all applications.
126
+ #
127
+ # @return [TrueClass,FalseClass] the result of the check
128
+ #
129
+ # @since 1.1.0
130
+ #
131
+ # @example
132
+ #
133
+ # # Mount hanami app for specific app
134
+ # Hanami.configure do
135
+ # if Hanami.app?(:web)
136
+ # require_relative '../apps/web/application'
137
+ # mount Web::Application, at: '/'
138
+ # end
139
+ # end
140
+ #
141
+ def self.app?(app)
142
+ return true unless ENV.key?('HANAMI_APPS')
143
+
144
+ allowed_apps = ENV['HANAMI_APPS'].to_s.split(',')
145
+ allowed_apps.include?(app.to_s.downcase)
146
+ end
147
+
121
148
  # Return root of the project (top level directory).
122
149
  #
123
150
  # @return [Pathname] root path
@@ -25,7 +25,7 @@ module Hanami
25
25
  # end
26
26
  module RoutingHelpers
27
27
  def self.included(base)
28
- factory = "#{Utils::String.new(base).namespace}.routes"
28
+ factory = "#{Utils::String.namespace(base)}.routes"
29
29
 
30
30
  base.class_eval <<-END_EVAL, __FILE__, __LINE__
31
31
  private
@@ -1012,10 +1012,6 @@ module Hanami
1012
1012
 
1013
1013
  # Defines a relative pattern to find controllers.
1014
1014
  #
1015
- # Hanami supports multiple architectures (aka application structures), this
1016
- # setting helps to understand the namespace where to find applications'
1017
- # controllers and actions.
1018
- #
1019
1015
  # By default this equals to <tt>"Controllers::%{controller}::%{action}"</tt>
1020
1016
  # That means controllers must be structured like this:
1021
1017
  # <tt>Bookshelf::Controllers::Dashboard::Index</tt>, where <tt>Bookshelf</tt>
@@ -1143,10 +1139,6 @@ module Hanami
1143
1139
 
1144
1140
  # Defines a relative pattern to find views:.
1145
1141
  #
1146
- # Hanami supports multiple architectures (aka application structures), this
1147
- # setting helps to understand the namespace where to find applications'
1148
- # views:.
1149
- #
1150
1142
  # By default this equals to <tt>"Views::%{controller}::%{action}"</tt>
1151
1143
  # That means views must be structured like this:
1152
1144
  # <tt>Bookshelf::Views::Dashboard::Index</tt>, where <tt>Bookshelf</tt> is
@@ -102,9 +102,7 @@ module Hanami
102
102
  # @since 0.2.1
103
103
  # @api private
104
104
  def sanitize(name)
105
- Utils::String.new(
106
- name.strip
107
- ).namespace.underscore.to_s
105
+ Utils::String.transform(name.strip, :namespace, :underscore)
108
106
  end
109
107
  end
110
108
  end
@@ -7,7 +7,7 @@ module Hanami
7
7
  # @api private
8
8
  def self.resolve(name)
9
9
  Utils::Class.load!(
10
- Utils::String.new(name).namespace
10
+ Utils::String.namespace(name)
11
11
  )
12
12
  end
13
13
  end
@@ -0,0 +1,101 @@
1
+ require 'hanami/cli'
2
+ require 'ostruct'
3
+
4
+ module Hanami
5
+ # Hanami CLI
6
+ #
7
+ # @since 1.1.0
8
+ class CLI
9
+ # Register a command to expand Hanami CLI
10
+ #
11
+ # @param name [String] the command name
12
+ # @param command [NilClass,Hanami::CLI::Command,Hanami::CLI::Commands::Command]
13
+ # the optional command
14
+ # @param aliases [Array<String>] an optional list of aliases
15
+ #
16
+ # @since 1.1.0
17
+ #
18
+ # @example Third party gem
19
+ # require "hanami/cli/commands"
20
+ #
21
+ # module Hanami
22
+ # module Webpack
23
+ # module CLI
24
+ # module Commands
25
+ # class Generate < Hanami::CLI::Command
26
+ # desc "Generate Webpack config"
27
+ #
28
+ # def call(*)
29
+ # # ...
30
+ # end
31
+ # end
32
+ # end
33
+ # end
34
+ # end
35
+ # end
36
+ #
37
+ # Hanami::CLI.register "generate webpack", Hanami::Webpack::CLI::Commands::Generate
38
+ #
39
+ # # $ bundle exec hanami generate
40
+ # # Commands:
41
+ # # hanami generate action APP ACTION # Generate an action for app
42
+ # # hanami generate app APP # Generate an app
43
+ # # hanami generate mailer MAILER # Generate a mailer
44
+ # # hanami generate migration MIGRATION # Generate a migration
45
+ # # hanami generate model MODEL # Generate a model
46
+ # # hanami generate secret [APP] # Generate session secret
47
+ # # hanami generate webpack # Generate Webpack configuration
48
+ def self.register(name, command = nil, aliases: [], &blk)
49
+ Commands.register(name, command, aliases: aliases, &blk)
50
+ end
51
+
52
+ # CLI commands registry
53
+ #
54
+ # @since 1.1.0
55
+ # @api private
56
+ module Commands
57
+ extend Hanami::CLI::Registry
58
+
59
+ # CLI command context
60
+ #
61
+ # @since 1.1.0
62
+ # @api private
63
+ class Context < OpenStruct
64
+ # @since 1.1.0
65
+ # @api private
66
+ def initialize(data)
67
+ data = data.each_with_object({}) do |(k, v), result|
68
+ v = Utils::String.new(v) if v.is_a?(::String)
69
+ result[k] = v
70
+ end
71
+
72
+ super(data)
73
+ freeze
74
+ end
75
+
76
+ # @since 1.1.0
77
+ # @api private
78
+ def with(data)
79
+ self.class.new(to_h.merge(data))
80
+ end
81
+
82
+ # @since 1.1.0
83
+ # @api private
84
+ def binding
85
+ super
86
+ end
87
+ end
88
+
89
+ require "hanami/cli/commands/command"
90
+ require "hanami/cli/commands/assets"
91
+ require "hanami/cli/commands/console"
92
+ require "hanami/cli/commands/db"
93
+ require "hanami/cli/commands/destroy"
94
+ require "hanami/cli/commands/generate"
95
+ require "hanami/cli/commands/new"
96
+ require "hanami/cli/commands/routes"
97
+ require "hanami/cli/commands/server"
98
+ require "hanami/cli/commands/version"
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,16 @@
1
+ module Hanami
2
+ # Hanami CLI
3
+ #
4
+ # @since 1.1.0
5
+ class CLI
6
+ module Commands
7
+ # @since 1.1.0
8
+ # @api private
9
+ module Assets
10
+ require "hanami/cli/commands/assets/precompile"
11
+ end
12
+ end
13
+
14
+ register "assets precompile", Commands::Assets::Precompile
15
+ end
16
+ end
@@ -0,0 +1,42 @@
1
+ module Hanami
2
+ class CLI
3
+ module Commands
4
+ module Assets
5
+ # @since 1.1.0
6
+ # @api private
7
+ class Precompile < Command
8
+ requires "apps.assets.configurations"
9
+
10
+ desc "Precompile assets for deployment"
11
+
12
+ example [
13
+ " # Basic usage",
14
+ "HANAMI_ENV=production # Precompile assets for production environment"
15
+ ]
16
+
17
+ # @since 1.1.0
18
+ # @api private
19
+ def call(**options)
20
+ context = Context.new(options: options)
21
+
22
+ precompile_assets(context)
23
+ end
24
+
25
+ private
26
+
27
+ # @since 1.1.0
28
+ # @api private
29
+ def precompile_assets(*)
30
+ Hanami::Assets.precompile(configurations)
31
+ end
32
+
33
+ # @since 1.1.0
34
+ # @api private
35
+ def configurations
36
+ requirements['apps.assets.configurations']
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,180 @@
1
+ require 'hanami'
2
+ require 'hanami/environment'
3
+ require 'hanami/components'
4
+ require 'hanami/cli/command'
5
+ require 'hanami/cli/commands/project'
6
+ require 'hanami/cli/commands/templates'
7
+ require 'concurrent'
8
+ require 'hanami/utils/files'
9
+ require 'erb'
10
+
11
+ module Hanami
12
+ # Hanami CLI
13
+ #
14
+ # @since 1.1.0
15
+ class CLI
16
+ module Commands
17
+ # Abstract command
18
+ #
19
+ # @since 1.1.0
20
+ class Command < Hanami::CLI::Command
21
+ # @since 1.1.0
22
+ # @api private
23
+ def self.inherited(component)
24
+ super
25
+
26
+ component.class_eval do
27
+ @_requirements = Concurrent::Array.new
28
+ extend ClassMethods
29
+ prepend InstanceMethods
30
+ end
31
+ end
32
+
33
+ # Class level interface
34
+ #
35
+ # @since 1.1.0
36
+ module ClassMethods
37
+ # Requires an internal Hanami component
38
+ #
39
+ # @param names [Array<String>] the name of one or more components
40
+ #
41
+ # @since 1.1.0
42
+ #
43
+ # @example
44
+ # require "hanami/cli/commands"
45
+ #
46
+ # module HanamiDatabaseHelpers
47
+ # class TruncateTables < Hanami::CLI::Commands::Command
48
+ # requires "model.configuration"
49
+ #
50
+ # def call(*)
51
+ # url = requirements["model.configuration"].url
52
+ # # ...
53
+ # end
54
+ # end
55
+ # end
56
+ #
57
+ # Hanami::CLI.register "db truncate", HanamiDatabaseHelpers::TruncateTables
58
+ def requires(*names)
59
+ requirements.concat(names)
60
+ end
61
+
62
+ # @since 1.1.0
63
+ # @api private
64
+ def requirements
65
+ @_requirements
66
+ end
67
+ end
68
+
69
+ # @since 1.1.0
70
+ # @api private
71
+ module InstanceMethods
72
+ # @since 1.1.0
73
+ # @api private
74
+ def call(**options)
75
+ if self.class.requirements.any?
76
+ environment = Hanami::Environment.new(options)
77
+ environment.require_project_environment
78
+
79
+ requirements.resolved('environment', environment)
80
+ requirements.resolve(self.class.requirements)
81
+
82
+ options = environment.to_options.merge(options)
83
+ end
84
+
85
+ super(options)
86
+ rescue StandardError => e
87
+ warn e.message
88
+ exit(1)
89
+ end
90
+ end
91
+
92
+ # @since 1.1.0
93
+ # @api private
94
+ def initialize(command_name:, out: $stdout, files: Utils::Files)
95
+ super(command_name: command_name)
96
+
97
+ @out = out
98
+ @files = files
99
+ @templates = Templates.new(self.class)
100
+ end
101
+
102
+ private
103
+
104
+ # Template renderer
105
+ #
106
+ # @since 1.1.0
107
+ # @api private
108
+ class Renderer
109
+ # @since 1.1.0
110
+ # @api private
111
+ TRIM_MODE = "-".freeze
112
+
113
+ # @since 1.1.0
114
+ # @api private
115
+ def initialize
116
+ freeze
117
+ end
118
+
119
+ # @since 1.1.0
120
+ # @api private
121
+ def call(template, context)
122
+ ::ERB.new(template, nil, TRIM_MODE).result(context)
123
+ end
124
+ end
125
+
126
+ # @since 1.1.0
127
+ # @api private
128
+ SAY_FORMATTER = "%<operation>12s %<path>s\n".freeze
129
+
130
+ # @since 1.1.0
131
+ # @api private
132
+ attr_reader :out
133
+
134
+ # @since 1.1.0
135
+ # @api private
136
+ attr_reader :files
137
+
138
+ # @since 1.1.0
139
+ # @api private
140
+ attr_reader :templates
141
+
142
+ # @since 1.1.0
143
+ # @api private
144
+ def render(path, context)
145
+ template = File.read(path)
146
+ renderer = Renderer.new
147
+
148
+ renderer.call(template, context.binding)
149
+ end
150
+
151
+ # @since 1.1.0
152
+ # @api private
153
+ def generate_file(source, destination, context)
154
+ files.write(
155
+ destination,
156
+ render(source, context)
157
+ )
158
+ end
159
+
160
+ # @since 1.1.0
161
+ # @api private
162
+ def say(operation, path)
163
+ out.puts(SAY_FORMATTER % { operation: operation, path: path }) # rubocop:disable Style/FormatString
164
+ end
165
+
166
+ # @since 1.1.0
167
+ # @api private
168
+ def project
169
+ Project
170
+ end
171
+
172
+ # @since 1.1.0
173
+ # @api private
174
+ def requirements
175
+ Hanami::Components
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end