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