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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/FEATURES.md +12 -0
- data/README.md +3 -0
- data/bin/hanami +3 -3
- data/hanami.gemspec +9 -9
- data/lib/hanami.rb +27 -0
- data/lib/hanami/action/routing_helpers.rb +1 -1
- data/lib/hanami/application_configuration.rb +0 -8
- data/lib/hanami/application_name.rb +1 -3
- data/lib/hanami/application_namespace.rb +1 -1
- data/lib/hanami/cli/commands.rb +101 -0
- data/lib/hanami/cli/commands/assets.rb +16 -0
- data/lib/hanami/cli/commands/assets/precompile.rb +42 -0
- data/lib/hanami/cli/commands/command.rb +180 -0
- data/lib/hanami/cli/commands/console.rb +95 -0
- data/lib/hanami/cli/commands/db.rb +30 -0
- data/lib/hanami/cli/commands/db/apply.rb +32 -0
- data/lib/hanami/cli/commands/db/console.rb +44 -0
- data/lib/hanami/cli/commands/db/create.rb +32 -0
- data/lib/hanami/cli/commands/db/drop.rb +32 -0
- data/lib/hanami/cli/commands/db/migrate.rb +39 -0
- data/lib/hanami/cli/commands/db/prepare.rb +32 -0
- data/lib/hanami/cli/commands/db/version.rb +32 -0
- data/lib/hanami/cli/commands/destroy.rb +26 -0
- data/lib/hanami/cli/commands/destroy/action.rb +131 -0
- data/lib/hanami/cli/commands/destroy/app.rb +159 -0
- data/lib/hanami/cli/commands/destroy/mailer.rb +74 -0
- data/lib/hanami/cli/commands/destroy/migration.rb +51 -0
- data/lib/hanami/cli/commands/destroy/model.rb +84 -0
- data/lib/hanami/cli/commands/generate.rb +28 -0
- data/lib/hanami/cli/commands/generate/action.rb +224 -0
- data/lib/hanami/cli/commands/generate/action/action.erb +8 -0
- data/lib/hanami/cli/commands/generate/action/action_spec.minitest.erb +11 -0
- data/lib/hanami/{generators/action/action_spec.rspec.tt → cli/commands/generate/action/action_spec.rspec.erb} +1 -3
- data/lib/hanami/cli/commands/generate/action/action_without_view.erb +9 -0
- data/lib/hanami/cli/commands/generate/action/view.erb +5 -0
- data/lib/hanami/cli/commands/generate/action/view_spec.minitest.erb +15 -0
- data/lib/hanami/{generators/action/view_spec.rspec.tt → cli/commands/generate/action/view_spec.rspec.erb} +2 -4
- data/lib/hanami/cli/commands/generate/app.rb +231 -0
- data/lib/hanami/{generators/app/application.rb.tt → cli/commands/generate/app/application.erb} +6 -6
- data/lib/hanami/{generators → cli/commands/generate}/app/favicon.ico +0 -0
- data/lib/hanami/{generators/action/template.tt → cli/commands/generate/app/gitkeep.erb} +0 -0
- data/lib/hanami/cli/commands/generate/app/layout.erb +7 -0
- data/lib/hanami/cli/commands/generate/app/layout_spec.minitest.erb +11 -0
- data/lib/hanami/cli/commands/generate/app/layout_spec.rspec.erb +11 -0
- data/lib/hanami/{generators/app/config/routes.rb.tt → cli/commands/generate/app/routes.erb} +0 -0
- data/lib/hanami/{generators/app/templates/application.html.erb.tt → cli/commands/generate/app/template.erb.erb} +1 -1
- data/lib/hanami/{generators/app/templates/application.html.haml.tt → cli/commands/generate/app/template.haml.erb} +1 -1
- data/lib/hanami/{generators/app/templates/application.html.slim.tt → cli/commands/generate/app/template.slim.erb} +1 -1
- data/lib/hanami/cli/commands/generate/mailer.rb +94 -0
- data/lib/hanami/cli/commands/generate/mailer/mailer.erb +7 -0
- data/lib/hanami/cli/commands/generate/mailer/mailer_spec.minitest.erb +7 -0
- data/lib/hanami/cli/commands/generate/mailer/mailer_spec.rspec.erb +5 -0
- data/lib/hanami/cli/commands/generate/migration.rb +41 -0
- data/lib/hanami/{generators/migration/migration.rb.tt → cli/commands/generate/migration/migration.erb} +0 -0
- data/lib/hanami/cli/commands/generate/model.rb +98 -0
- data/lib/hanami/cli/commands/generate/model/entity.erb +2 -0
- data/lib/hanami/cli/commands/generate/model/entity_spec.minitest.erb +5 -0
- data/lib/hanami/cli/commands/generate/model/entity_spec.rspec.erb +3 -0
- data/lib/hanami/{generators/model/migration.rb.tt → cli/commands/generate/model/migration.erb} +1 -1
- data/lib/hanami/cli/commands/generate/model/repository.erb +2 -0
- data/lib/hanami/cli/commands/generate/model/repository_spec.minitest.erb +5 -0
- data/lib/hanami/cli/commands/generate/model/repository_spec.rspec.erb +3 -0
- data/lib/hanami/cli/commands/generate/secret.rb +48 -0
- data/lib/hanami/cli/commands/new.rb +575 -0
- data/lib/hanami/{generators/application/container/.env.development.tt → cli/commands/new/.env.development.erb} +1 -1
- data/lib/hanami/{generators/application/container/.env.test.tt → cli/commands/new/.env.test.erb} +1 -1
- data/lib/hanami/{generators/app/config/initializers/.gitkeep → cli/commands/new/.gitkeep.erb} +0 -0
- data/lib/hanami/cli/commands/new/Gemfile.erb +57 -0
- data/lib/hanami/cli/commands/new/README.md.erb +35 -0
- data/lib/hanami/{generators/application/container/config.ru.tt → cli/commands/new/config.ru.erb} +0 -0
- data/lib/hanami/{generators/application/container/config/boot.rb.tt → cli/commands/new/config/boot.erb} +0 -0
- data/lib/hanami/{generators/application/container/config/environment.rb.tt → cli/commands/new/config/environment.erb} +8 -8
- data/lib/hanami/{generators/application/container/gitignore.tt → cli/commands/new/gitignore.erb} +0 -0
- data/lib/hanami/{generators/application/container/gitignore_with_sqlite.tt → cli/commands/new/gitignore_with_sqlite.erb} +0 -0
- data/lib/hanami/cli/commands/new/hanamirc.erb +3 -0
- data/lib/hanami/cli/commands/new/lib/project.erb +2 -0
- data/lib/hanami/{generators/application/container/Rakefile.minitest.tt → cli/commands/new/minitest/Rakefile.erb} +0 -0
- data/lib/hanami/{generators/application/container/features_helper.rb.minitest.tt → cli/commands/new/minitest/features_helper.erb} +0 -0
- data/lib/hanami/{generators/application/container/spec_helper.rb.minitest.tt → cli/commands/new/minitest/spec_helper.erb} +0 -0
- data/lib/hanami/{generators/application/container/Rakefile.rspec.tt → cli/commands/new/rspec/Rakefile.erb} +0 -0
- data/lib/hanami/{generators/application/container/capybara.rb.rspec.tt → cli/commands/new/rspec/capybara.erb} +0 -0
- data/lib/hanami/{generators/application/container/features_helper.rb.rspec.tt → cli/commands/new/rspec/features_helper.erb} +0 -0
- data/lib/hanami/{generators/application/container/rspec.rspec.tt → cli/commands/new/rspec/rspec.erb} +0 -0
- data/lib/hanami/{generators/application/container/spec_helper.rb.rspec.tt → cli/commands/new/rspec/spec_helper.erb} +0 -0
- data/lib/hanami/{generators/application/container/.gitignore → cli/commands/new/schema.sql.erb} +0 -0
- data/lib/hanami/cli/commands/project.rb +421 -0
- data/lib/hanami/cli/commands/routes.rb +21 -0
- data/lib/hanami/cli/commands/server.rb +39 -0
- data/lib/hanami/cli/commands/templates.rb +31 -0
- data/lib/hanami/cli/commands/version.rb +19 -0
- data/lib/hanami/common_logger.rb +14 -4
- data/lib/hanami/components.rb +39 -1
- data/lib/hanami/components/components.rb +36 -1
- data/lib/hanami/config/sessions.rb +1 -1
- data/lib/hanami/environment.rb +20 -50
- data/lib/hanami/hanamirc.rb +7 -30
- data/lib/hanami/middleware.rb +0 -26
- data/lib/hanami/static.rb +1 -1
- data/lib/hanami/templates/welcome.html.erb +1 -1
- data/lib/hanami/version.rb +1 -1
- data/lib/hanami/welcome.rb +1 -11
- metadata +125 -135
- data/lib/hanami/cli.rb +0 -154
- data/lib/hanami/cli_base.rb +0 -49
- data/lib/hanami/cli_sub_commands/assets.rb +0 -24
- data/lib/hanami/cli_sub_commands/db.rb +0 -138
- data/lib/hanami/cli_sub_commands/destroy.rb +0 -115
- data/lib/hanami/cli_sub_commands/generate.rb +0 -150
- data/lib/hanami/commands/apps.rb +0 -4
- data/lib/hanami/commands/assets/precompile.rb +0 -26
- data/lib/hanami/commands/command.rb +0 -77
- data/lib/hanami/commands/console.rb +0 -107
- data/lib/hanami/commands/db/apply.rb +0 -19
- data/lib/hanami/commands/db/console.rb +0 -41
- data/lib/hanami/commands/db/create.rb +0 -19
- data/lib/hanami/commands/db/drop.rb +0 -19
- data/lib/hanami/commands/db/migrate.rb +0 -30
- data/lib/hanami/commands/db/prepare.rb +0 -19
- data/lib/hanami/commands/db/version.rb +0 -19
- data/lib/hanami/commands/generate/abstract.rb +0 -76
- data/lib/hanami/commands/generate/action.rb +0 -322
- data/lib/hanami/commands/generate/app.rb +0 -154
- data/lib/hanami/commands/generate/mailer.rb +0 -131
- data/lib/hanami/commands/generate/migration.rb +0 -75
- data/lib/hanami/commands/generate/model.rb +0 -132
- data/lib/hanami/commands/generate/secret_token.rb +0 -37
- data/lib/hanami/commands/new/abstract.rb +0 -178
- data/lib/hanami/commands/new/app.rb +0 -129
- data/lib/hanami/commands/new/container.rb +0 -119
- data/lib/hanami/commands/routes.rb +0 -26
- data/lib/hanami/commands/server.rb +0 -32
- data/lib/hanami/generators/action/action.rb.tt +0 -8
- data/lib/hanami/generators/action/action_spec.minitest.tt +0 -12
- data/lib/hanami/generators/action/action_without_view.rb.tt +0 -9
- data/lib/hanami/generators/action/view.rb.tt +0 -5
- data/lib/hanami/generators/action/view_spec.minitest.tt +0 -16
- data/lib/hanami/generators/app/.gitkeep.tt +0 -1
- data/lib/hanami/generators/app/views/application_layout.rb.tt +0 -7
- data/lib/hanami/generators/application/container/.gitkeep +0 -1
- data/lib/hanami/generators/application/container/Gemfile.tt +0 -56
- data/lib/hanami/generators/application/container/config/initializers/.gitkeep +0 -0
- data/lib/hanami/generators/application/container/db/.gitkeep +0 -1
- data/lib/hanami/generators/application/container/hanamirc.tt +0 -4
- data/lib/hanami/generators/application/container/lib/chirp/entities/.gitkeep +0 -1
- data/lib/hanami/generators/application/container/lib/chirp/mailers/.gitkeep +0 -0
- data/lib/hanami/generators/application/container/lib/chirp/mailers/templates/.gitkeep +0 -0
- data/lib/hanami/generators/application/container/lib/chirp/repositories/.gitkeep +0 -1
- data/lib/hanami/generators/application/container/lib/project.rb.tt +0 -2
- data/lib/hanami/generators/application/container/schema.sql.tt +0 -0
- data/lib/hanami/generators/database_config.rb +0 -114
- data/lib/hanami/generators/generatable.rb +0 -69
- data/lib/hanami/generators/generator.rb +0 -52
- data/lib/hanami/generators/mailer/mailer.rb.tt +0 -7
- data/lib/hanami/generators/mailer/mailer_spec.rb.minitest.tt +0 -7
- data/lib/hanami/generators/mailer/mailer_spec.rb.rspec.tt +0 -5
- data/lib/hanami/generators/mailer/template.html.tt +0 -0
- data/lib/hanami/generators/mailer/template.txt.tt +0 -0
- data/lib/hanami/generators/model/entity.rb.tt +0 -2
- data/lib/hanami/generators/model/entity_spec.minitest.tt +0 -5
- data/lib/hanami/generators/model/entity_spec.rspec.tt +0 -3
- data/lib/hanami/generators/model/repository.rb.tt +0 -2
- data/lib/hanami/generators/model/repository_spec.minitest.tt +0 -5
- data/lib/hanami/generators/model/repository_spec.rspec.tt +0 -3
- data/lib/hanami/generators/template_engine.rb +0 -44
- data/lib/hanami/generators/test_framework.rb +0 -55
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0563f150b8f7f4d4d829600edba47e56e22d12a6
|
|
4
|
+
data.tar.gz: da1e14370a1c34df67516438b1f8b480f0c85f86
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 88b3c5a16d520bb93a27d262fd5c77d786095c6d5969c0b1f2d412a8f58c229ebd76225b4c05ecc7bc3d077b3ac411ae92f26d91564e826f6918aef2d9e8a257
|
|
7
|
+
data.tar.gz: c317261106b08f792784b56ed52e3834926c0a814ac64290345025bd0f0480a3d43b29f1136c10da0410d77d83dd5feaac1bc61e13d1f618da75ecc34439532a
|
data/CHANGELOG.md
CHANGED
|
@@ -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.
|
data/FEATURES.md
CHANGED
|
@@ -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
data/hanami.gemspec
CHANGED
|
@@ -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', '
|
|
25
|
-
spec.add_dependency 'hanami-validations', '
|
|
26
|
-
spec.add_dependency 'hanami-router', '
|
|
27
|
-
spec.add_dependency 'hanami-controller', '
|
|
28
|
-
spec.add_dependency 'hanami-view', '
|
|
29
|
-
spec.add_dependency 'hanami-helpers', '
|
|
30
|
-
spec.add_dependency 'hanami-mailer', '
|
|
31
|
-
spec.add_dependency 'hanami-assets', '
|
|
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'
|
data/lib/hanami.rb
CHANGED
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|