hanamismith 2.2.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/hanamismith.gemspec +6 -6
  4. data/lib/hanamismith/builders/bundler.rb +20 -18
  5. data/lib/hanamismith/builders/caliber.rb +20 -9
  6. data/lib/hanamismith/builders/core.rb +4 -0
  7. data/lib/hanamismith/builders/providers/database.rb +20 -0
  8. data/lib/hanamismith/builders/providers/logger.rb +2 -6
  9. data/lib/hanamismith/builders/rake/configuration.rb +11 -2
  10. data/lib/hanamismith/builders/reek.rb +15 -6
  11. data/lib/hanamismith/cli/commands/build.rb +1 -0
  12. data/lib/hanamismith/templates/%project_name%/app/mailer.rb.erb +9 -0
  13. data/lib/hanamismith/templates/%project_name%/app/providers/logger.rb.erb +18 -1
  14. data/lib/hanamismith/templates/%project_name%/config/app.rb.erb +0 -16
  15. data/lib/hanamismith/templates/%project_name%/config/initializers/universal_logger_patch.rb.erb +24 -0
  16. data/lib/hanamismith/templates/%project_name%/config/providers/db.rb.erb +5 -0
  17. data/lib/hanamismith/templates/%project_name%/config/providers/htmx.rb.erb +9 -1
  18. data/lib/hanamismith/templates/%project_name%/config/puma.rb.erb +3 -4
  19. data/lib/hanamismith/templates/%project_name%/package.json.erb +5 -2
  20. data/lib/hanamismith/templates/%project_name%/spec/hanami_helper.rb.erb +9 -1
  21. data.tar.gz.sig +0 -0
  22. metadata +16 -16
  23. metadata.gz.sig +0 -0
  24. data/lib/hanamismith/templates/%project_name%/app/aspects/logging/rack_adapter.rb.erb +0 -21
  25. data/lib/hanamismith/templates/%project_name%/config/initializers/rack_logger_patch.rb.erb +0 -21
  26. data/lib/hanamismith/templates/%project_name%/config/initializers/sql_logger_patch.rb.erb +0 -13
  27. data/lib/hanamismith/templates/%project_name%/spec/app/aspects/logging/rack_adapter_spec.rb.erb +0 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4a9eef9a133bfdb6a7cda1eb54fd6b65d89b7a424fbe7fae8ea8e60ab680caa1
4
- data.tar.gz: 6f8904b41367cc61ddae0642a4aabd8365abaf54d1cb0e365b9b820111300c4b
3
+ metadata.gz: f0c8864aa328874754512be314522a523aa831bdbae209bafeec22a5e31bd0bb
4
+ data.tar.gz: 899e32fcfdced1478fc8b08f5e0a00758d300992417bcc723f91439f21a497e9
5
5
  SHA512:
6
- metadata.gz: ad1a87bf5ea5e7c4c8781ee6d2fb5fcd711ce681d8fb390c999f04438138cfb98ddec2a37d4174fd13c4362f746fb030e76f52bafaa068e40300db74a816e46c
7
- data.tar.gz: be141eafc796882bf13e5cf5ad7f8f96b420ae8dc16d83db189df09e7b9c39795099792b66799368f4ea779dff0f66376631b210cf82382dcadc996e2bdff1f0
6
+ metadata.gz: bdad438b6b4e9e46200ee87866f94e5f631cc35c41a2e018b517871a5e7cab61320063ac30936ea7e298345ac38eeaf1e1d4bc34a8ee8fa09e91b8d403e319fa
7
+ data.tar.gz: 5a646edeefdaae29dcb4cf5cb260e3f43fc0c9b95fc35dc74b32859836848b9844953709644c36c6de3bae374a646b07e63daba033e7a6f7fd4625e4cf00987d
checksums.yaml.gz.sig CHANGED
Binary file
data/hanamismith.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "hanamismith"
5
- spec.version = "2.2.0"
5
+ spec.version = "3.0.0"
6
6
  spec.authors = ["Brooke Kuhlmann"]
7
7
  spec.email = ["brooke@alchemists.io"]
8
8
  spec.homepage = "https://alchemists.io/projects/hanamismith"
@@ -24,19 +24,19 @@ Gem::Specification.new do |spec|
24
24
 
25
25
  spec.required_ruby_version = ">= 4.0"
26
26
 
27
- spec.add_dependency "cogger", "~> 2.0"
28
- spec.add_dependency "containable", "~> 2.0"
27
+ spec.add_dependency "cogger", "~> 2.3"
28
+ spec.add_dependency "containable", "~> 2.3"
29
29
  spec.add_dependency "dry-monads", "~> 1.9"
30
30
  spec.add_dependency "dry-schema", "~> 1.15"
31
- spec.add_dependency "etcher", "~> 4.0"
31
+ spec.add_dependency "etcher", "~> 4.3"
32
32
  spec.add_dependency "htmx", "~> 3.0"
33
33
  spec.add_dependency "infusible", "~> 5.0"
34
34
  spec.add_dependency "refinements", "~> 14.0"
35
- spec.add_dependency "rubysmith", "~> 9.2"
35
+ spec.add_dependency "rubysmith", "~> 10.0"
36
36
  spec.add_dependency "runcom", "~> 13.0"
37
37
  spec.add_dependency "sod", "~> 2.0"
38
38
  spec.add_dependency "spek", "~> 5.0"
39
- spec.add_dependency "zeitwerk", "~> 2.7"
39
+ spec.add_dependency "zeitwerk", "~> 2.8"
40
40
 
41
41
  spec.bindir = "exe"
42
42
  spec.executables << "hanamismith"
@@ -35,35 +35,37 @@ module Hanamismith
35
35
 
36
36
  def insert_hanami
37
37
  with_template.insert_after "source", <<~CONTENT.strip
38
- gem "hanami", "~> 2.3"
39
- gem "hanami-assets", "~> 2.3"
40
- gem "hanami-controller", "~> 2.3"
41
- gem "hanami-db", "~> 2.3"
42
- gem "hanami-router", "~> 2.3"
43
- gem "hanami-validations", "~> 2.3"
44
- gem "hanami-view", "~> 2.3"
38
+ gem "hanami", "~> 3.0"
39
+ gem "hanami-action", "~> 3.0"
40
+ gem "hanami-assets", "~> 3.0"
41
+ gem "hanami-db", "~> 3.0"
42
+ gem "hanami-mailer", "~> 3.0"
43
+ gem "hanami-router", "~> 3.0"
44
+ gem "hanami-view", "~> 3.0"
45
45
  CONTENT
46
46
  end
47
47
 
48
48
  def insert_main
49
49
  with_template.insert_after "source", <<~CONTENT
50
- gem "dry-schema", "~> 1.15"
50
+ gem "cogger", "~> 2.4"
51
+ gem "core", "~> 3.2"
52
+ gem "dry-schema", "~> 1.16"
51
53
  gem "dry-types", "~> 1.9"
52
54
  gem "dry-validation", "~> 1.11"
53
- gem "htmx", "~> 3.0"
54
- gem "overmind", "~> 2.5"
55
- gem "puma", "~> 7.0"
56
- gem "rack-attack", "~> 6.7"
55
+ gem "htmx", "~> 3.2"
56
+ gem "i18n", "~> 1.15"
57
+ gem "puma", "~> 8.0"
58
+ gem "rack-attack", "~> 6.8"
57
59
  CONTENT
58
60
  end
59
61
 
60
62
  def insert_persistence
61
63
  with_template.insert_after "source", <<~CONTENT
62
64
 
63
- gem "pg", "~> 1.5"
65
+ gem "pg", "~> 1.6", force_ruby_platform: true
64
66
  gem "rom", "~> 5.4"
65
67
  gem "rom-sql", "~> 3.7"
66
- gem "sequel", "~> 5.89"
68
+ gem "sequel", "~> 5.106"
67
69
  CONTENT
68
70
  end
69
71
 
@@ -75,7 +77,7 @@ module Hanamismith
75
77
  with_template.insert_before(/group :development/, <<~CONTENT)
76
78
 
77
79
  group :development, :test do
78
- gem "dotenv", "~> 3.1"
80
+ gem "dotenv", "~> 3.2"
79
81
  end
80
82
 
81
83
  CONTENT
@@ -83,8 +85,8 @@ module Hanamismith
83
85
 
84
86
  def insert_development
85
87
  with_template.insert_after(/group :development do/, <<~CONTENT.gsub("gem", " gem"))
86
- gem "hanami-webconsole", "~> 2.3"
87
- gem "localhost", "~> 1.3"
88
+ gem "hanami-webconsole", "~> 3.0"
89
+ gem "localhost", "~> 1.8"
88
90
  CONTENT
89
91
  end
90
92
 
@@ -92,7 +94,7 @@ module Hanamismith
92
94
  with_template.insert_after(/group :test/, <<~CONTENT.gsub("gem", " gem"))
93
95
  gem "capybara", "~> 3.40"
94
96
  gem "capybara-validate_html5", "~> 2.1"
95
- gem "cuprite", "~> 0.15"
97
+ gem "cuprite", "~> 0.17"
96
98
  gem "database_cleaner-sequel", "~> 2.0"
97
99
  gem "launchy", "~> 3.1"
98
100
  gem "rack-test", "~> 2.2"
@@ -12,17 +12,28 @@ module Hanamismith
12
12
  return false unless settings.build_caliber
13
13
 
14
14
  super
15
- path = "%project_name%/.config/rubocop/config.yml.erb"
16
- builder.call(settings.with(template_path: path))
17
- .append("\nplugins: rubocop-sequel\n\n")
18
- .append(<<~CONTENT)
19
- RSpec/SpecFilePathFormat:
20
- CustomTransform:
21
- #{settings.project_namespaced_class}: ""
22
- CONTENT
23
-
15
+ with_template.append "\nplugins: rubocop-sequel\n\n"
16
+ add_configuration
24
17
  true
25
18
  end
19
+
20
+ private
21
+
22
+ def add_configuration
23
+ with_template.append <<~CONTENT
24
+ Metrics/MethodLength:
25
+ Exclude:
26
+ - config/initializers/universal_logger_patch.rb
27
+ RSpec/SpecFilePathFormat:
28
+ CustomTransform:
29
+ #{settings.project_namespaced_class}: ""
30
+ CONTENT
31
+ end
32
+
33
+ def with_template
34
+ path = "%project_name%/.config/rubocop/config.yml.erb"
35
+ builder.call settings.with(template_path: path)
36
+ end
26
37
  end
27
38
  end
28
39
  end
@@ -31,6 +31,10 @@ module Hanamismith
31
31
  builder.call(settings.with(template_path: "%project_name%/app/action.rb.erb")).render
32
32
  end
33
33
 
34
+ def add_mailer
35
+ builder.call(settings.with(template_path: "%project_name%/app/mailer.rb.erb")).render
36
+ end
37
+
34
38
  def add_view
35
39
  builder.call(settings.with(template_path: "%project_name%/app/view.rb.erb")).render
36
40
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/struct"
4
+
5
+ module Hanamismith
6
+ module Builders
7
+ module Providers
8
+ # Builds project skeleton for database provider.
9
+ class Database < Rubysmith::Builders::Abstract
10
+ using Refinements::Struct
11
+
12
+ def call
13
+ path = "%project_name%/config/providers/db.rb.erb"
14
+ builder.call(settings.with(template_path: path)).render
15
+ true
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -22,10 +22,7 @@ module Hanamismith
22
22
  %project_name%/app/providers/logger.rb.erb
23
23
  %project_name%/spec/app/providers/logger_spec.rb.erb
24
24
  %project_name%/config/providers/logger.rb.erb
25
- %project_name%/app/aspects/logging/rack_adapter.rb.erb
26
- %project_name%/spec/app/aspects/logging/rack_adapter_spec.rb.erb
27
- %project_name%/config/initializers/rack_logger_patch.rb.erb
28
- %project_name%/config/initializers/sql_logger_patch.rb.erb
25
+ %project_name%/config/initializers/universal_logger_patch.rb.erb
29
26
  ].each { build it }
30
27
  end
31
28
 
@@ -37,8 +34,7 @@ module Hanamismith
37
34
  /require/,
38
35
  <<~REQUIRES
39
36
 
40
- require_relative "initializers/rack_logger_patch"
41
- require_relative "initializers/sql_logger_patch"
37
+ require_relative "initializers/universal_logger_patch"
42
38
  REQUIRES
43
39
  )
44
40
  end
@@ -13,12 +13,21 @@ module Hanamismith
13
13
  return false unless settings.build_rake
14
14
 
15
15
  super
16
+ process
17
+ true
18
+ end
19
+
20
+ private
21
+
22
+ def process
16
23
  builder.call(settings.with(template_path: "%project_name%/Rakefile.erb"))
17
24
  .render
25
+ .replace(
26
+ "Reek::Rake::Task.new",
27
+ %(Reek::Rake::Task.new { it.source_files = "{app,config,lib,slices}/**/*.rb" })
28
+ )
18
29
  .insert_after(%r(bundler/setup), %(require "hanami/rake_tasks"))
19
30
  .insert_after(/RuboCop::RakeTask/, %(\nRake.add_rakelib "lib/tasks"\n))
20
-
21
- true
22
31
  end
23
32
  end
24
33
  end
@@ -12,20 +12,29 @@ module Hanamismith
12
12
  return false unless settings.build_reek
13
13
 
14
14
  super
15
- add_detectors
15
+ add_duplicate_exclusion
16
+ add_too_many_statements_exclusion
16
17
  true
17
18
  end
18
19
 
19
- def add_detectors
20
+ def add_duplicate_exclusion
21
+ with_template.insert_before(
22
+ /LongParameterList:\n/,
23
+ <<~DETECTORS.gsub(/^/, " ")
24
+ DuplicateMethodCall:
25
+ exclude:
26
+ - UniversalLoggerPatch#_log_structured
27
+ DETECTORS
28
+ )
29
+ end
30
+
31
+ def add_too_many_statements_exclusion
20
32
  with_template.insert_after(
21
33
  /enabled:\sfalse\n/,
22
34
  <<~DETECTORS.gsub(/^/, " ")
23
35
  TooManyStatements:
24
36
  exclude:
25
- - RackLoggerPatch#prepare_app_providers
26
- UtilityFunction:
27
- exclude:
28
- - SQLLoggerPatch#log_query
37
+ - UniversalLoggerPatch#_log_structured
29
38
  DETECTORS
30
39
  )
31
40
  end
@@ -13,6 +13,7 @@ module Hanamismith
13
13
  BUILDERS = [
14
14
  Rubysmith::Builders::Init,
15
15
  Builders::Core,
16
+ Builders::Providers::Database,
16
17
  Builders::Providers::HTMX,
17
18
  Builders::Providers::Logger,
18
19
  Builders::Refinement,
@@ -0,0 +1,9 @@
1
+ # auto_register: false
2
+
3
+ require "hanami/mailer"
4
+
5
+ <% namespace do %>
6
+ # The application base mailer.
7
+ class Mailer < Hanami::Mailer
8
+ end
9
+ <% end %>
@@ -16,6 +16,7 @@
16
16
  def prepare = require "cogger"
17
17
 
18
18
  def start
19
+ add_aliases
19
20
  add_filters
20
21
  register :logger, build_instance
21
22
  end
@@ -24,7 +25,23 @@
24
25
 
25
26
  attr_reader :environment, :resolver, :id
26
27
 
27
- def add_filters = cogger.add_filters :api_key, :csrf, :password, :password_confirmation
28
+ def add_aliases
29
+ cogger.add_formatter(
30
+ :rack,
31
+ Cogger::Formatters::Emoji,
32
+ "%<emoji:dynamic>s <dynamic>[%<id>s] [%<level>s] [%<at>s] %<verb>s " \
33
+ "%<status>s %<elapsed>s %<ip>s %<path>s %<length>s </dynamic>"
34
+ )
35
+
36
+ cogger.add_formatter :sql,
37
+ Cogger::Formatters::Emoji,
38
+ "%<emoji:dynamic>s <dynamic>[%<id>s] [%<level>s] [%<at>s] %<db>s " \
39
+ "%<elapsed>s%<elapsed_unit>s %<query>s</dynamic>"
40
+ end
41
+
42
+ def add_filters
43
+ cogger.add_filters :csrf, :HTTP_ID, :mac_address, :password, :password_confirmation
44
+ end
28
45
 
29
46
  def build_instance
30
47
  io = "log/#{environment}.log"
@@ -10,12 +10,6 @@ require "hanami"
10
10
  Dry::Schema.load_extensions :monads
11
11
  Dry::Validation.load_extensions :monads
12
12
 
13
- prepare_container do |container|
14
- container.config.component_dirs.dir "app" do |dir|
15
- dir.memoize = -> component { component.key.start_with? "repositories." }
16
- end
17
- end
18
-
19
13
  config.actions.content_security_policy.then do |csp|
20
14
  csp[:manifest_src] = "'self'"
21
15
  csp[:script_src] += " 'unsafe-eval' 'unsafe-inline'"
@@ -29,15 +23,5 @@ require "hanami"
29
23
  expire_after: 3_600 # 1 hour.
30
24
  }
31
25
  # rubocop:enable Layout/FirstArrayElementLineBreak
32
-
33
- environment :development do
34
- # :nocov:
35
- config.logger.options[:colorize] = true
36
-
37
- config.logger = config.logger.instance.add_backend(
38
- colorize: false,
39
- stream: root.join("log/development.log")
40
- )
41
- end
42
26
  end
43
27
  <% end %>
@@ -0,0 +1,24 @@
1
+ # auto_register: false
2
+
3
+ # Patches Hanami's universal logger to work with Cogger.
4
+ module UniversalLoggerPatch
5
+ def _log_structured method, message, payload
6
+ tags = _current_tags
7
+ block_content = yield if block_given?
8
+
9
+ logger.formatter = case tags
10
+ in [:rack] then tags.delete :rack
11
+ in [:sql] if block_content.is_a? Hash then tags.delete :sql
12
+ else Hanami.env == :development ? :emoji : :json
13
+ end
14
+
15
+ unless block_content.is_a? Hash
16
+ message = block_content
17
+ block_content = {}
18
+ end
19
+
20
+ logger.public_send method, message, tags:, **block_content.merge!(payload)
21
+ end
22
+ end
23
+
24
+ Hanami::UniversalLogger.prepend UniversalLoggerPatch
@@ -0,0 +1,5 @@
1
+ Hanami.app.configure_provider :db do
2
+ Sequel.default_timezone = :utc
3
+ Sequel.application_timezone = :local
4
+ Sequel.extension :lit_require_frozen
5
+ end
@@ -1,5 +1,13 @@
1
1
  Hanami.app.register_provider :htmx do
2
2
  prepare { require "htmx" }
3
3
 
4
- start { register :htmx, HTMX }
4
+ start do
5
+ toggler = lambda do |request, default = "app"|
6
+ HTMX.request?(request.env, :request, "true") ? false : default
7
+ end
8
+
9
+ register :htmx, HTMX
10
+ register :htmx_defaults, {"allowScriptTags" => false, "defaultSwapStyle" => "outerHTML"}.freeze
11
+ register :htmx_layout, toggler
12
+ end
5
13
  end
@@ -1,6 +1,5 @@
1
1
  development = ENV.fetch("HANAMI_ENV", "development") == "development"
2
2
 
3
- require "concurrent"
4
3
  require "localhost" if development
5
4
 
6
5
  Bundler.require :tools if development
@@ -8,9 +7,10 @@ Bundler.root.join("tmp").then { |path| path.mkdir unless path.exist? }
8
7
 
9
8
  max_threads = ENV.fetch "HANAMI_MAX_THREADS", 5
10
9
  min_threads = ENV.fetch "HANAMI_MIN_THREADS", max_threads
11
- concurrency = ENV.fetch "HANAMI_WEB_CONCURRENCY", Concurrent.physical_processor_count
10
+ concurrency = Integer ENV.fetch "HANAMI_WEB_CONCURRENCY", 0
12
11
 
13
12
  threads min_threads, max_threads
13
+ max_io_threads 5
14
14
  port ENV.fetch("HANAMI_PORT", 2300)
15
15
  environment ENV.fetch("HANAMI_ENV", "development")
16
16
  workers concurrency
@@ -18,5 +18,4 @@ worker_timeout 3600 if development
18
18
  ssl_bind "localhost", 2443 if development
19
19
  pidfile ENV.fetch("PIDFILE", "tmp/server.pid")
20
20
  plugin :tmp_restart
21
-
22
- preload_app! && before_fork { Hanami.shutdown } if concurrency.to_i.positive?
21
+ before_fork { Hanami.shutdown } if concurrency > 1
@@ -8,7 +8,10 @@
8
8
  "type": "module",
9
9
  "keywords": ["hanami", "htmx", "ruby"],
10
10
  "dependencies": {
11
- "hanami-assets": "^2.3.0",
12
- "htmx.org": "^2.0.8"
11
+ "hanami-assets": "^3.0.0",
12
+ "htmx.org": "^2.0.10"
13
+ },
14
+ "allowScripts": {
15
+ "esbuild@0.28.1": true
13
16
  }
14
17
  }
@@ -15,7 +15,7 @@ using Refinements::Pathname
15
15
 
16
16
  ENV["LD_PRELOAD"] = nil
17
17
  Capybara.app = Hanami.app
18
- Capybara.server = :puma, {Silent: true, Threads: "0:1"}
18
+ Capybara.server = :puma, {Silent: true, Threads: "2:2"}
19
19
  Capybara.javascript_driver = :cuprite
20
20
  Capybara.save_path = Hanami.app.root.join "tmp/capybara"
21
21
  Capybara.register_driver :cuprite do |app|
@@ -56,6 +56,14 @@ RSpec.configure do |config|
56
56
  end
57
57
  end
58
58
 
59
+ config.prepend_before :each, :mailers do
60
+ Hanami.app.with_slices.each do |slice|
61
+ next unless slice.key? "mailers.delivery_method"
62
+
63
+ slice["mailers.delivery_method"].clear
64
+ end
65
+ end
66
+
59
67
  config.append_after :each, :db do
60
68
  databases.call.each { |db| DatabaseCleaner[:sequel, db:].clean }
61
69
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanamismith
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brooke Kuhlmann
@@ -41,28 +41,28 @@ dependencies:
41
41
  requirements:
42
42
  - - "~>"
43
43
  - !ruby/object:Gem::Version
44
- version: '2.0'
44
+ version: '2.3'
45
45
  type: :runtime
46
46
  prerelease: false
47
47
  version_requirements: !ruby/object:Gem::Requirement
48
48
  requirements:
49
49
  - - "~>"
50
50
  - !ruby/object:Gem::Version
51
- version: '2.0'
51
+ version: '2.3'
52
52
  - !ruby/object:Gem::Dependency
53
53
  name: containable
54
54
  requirement: !ruby/object:Gem::Requirement
55
55
  requirements:
56
56
  - - "~>"
57
57
  - !ruby/object:Gem::Version
58
- version: '2.0'
58
+ version: '2.3'
59
59
  type: :runtime
60
60
  prerelease: false
61
61
  version_requirements: !ruby/object:Gem::Requirement
62
62
  requirements:
63
63
  - - "~>"
64
64
  - !ruby/object:Gem::Version
65
- version: '2.0'
65
+ version: '2.3'
66
66
  - !ruby/object:Gem::Dependency
67
67
  name: dry-monads
68
68
  requirement: !ruby/object:Gem::Requirement
@@ -97,14 +97,14 @@ dependencies:
97
97
  requirements:
98
98
  - - "~>"
99
99
  - !ruby/object:Gem::Version
100
- version: '4.0'
100
+ version: '4.3'
101
101
  type: :runtime
102
102
  prerelease: false
103
103
  version_requirements: !ruby/object:Gem::Requirement
104
104
  requirements:
105
105
  - - "~>"
106
106
  - !ruby/object:Gem::Version
107
- version: '4.0'
107
+ version: '4.3'
108
108
  - !ruby/object:Gem::Dependency
109
109
  name: htmx
110
110
  requirement: !ruby/object:Gem::Requirement
@@ -153,14 +153,14 @@ dependencies:
153
153
  requirements:
154
154
  - - "~>"
155
155
  - !ruby/object:Gem::Version
156
- version: '9.2'
156
+ version: '10.0'
157
157
  type: :runtime
158
158
  prerelease: false
159
159
  version_requirements: !ruby/object:Gem::Requirement
160
160
  requirements:
161
161
  - - "~>"
162
162
  - !ruby/object:Gem::Version
163
- version: '9.2'
163
+ version: '10.0'
164
164
  - !ruby/object:Gem::Dependency
165
165
  name: runcom
166
166
  requirement: !ruby/object:Gem::Requirement
@@ -209,14 +209,14 @@ dependencies:
209
209
  requirements:
210
210
  - - "~>"
211
211
  - !ruby/object:Gem::Version
212
- version: '2.7'
212
+ version: '2.8'
213
213
  type: :runtime
214
214
  prerelease: false
215
215
  version_requirements: !ruby/object:Gem::Requirement
216
216
  requirements:
217
217
  - - "~>"
218
218
  - !ruby/object:Gem::Version
219
- version: '2.7'
219
+ version: '2.8'
220
220
  email:
221
221
  - brooke@alchemists.io
222
222
  executables:
@@ -251,6 +251,7 @@ files:
251
251
  - lib/hanamismith/builders/javascript.rb
252
252
  - lib/hanamismith/builders/layout.rb
253
253
  - lib/hanamismith/builders/node.rb
254
+ - lib/hanamismith/builders/providers/database.rb
254
255
  - lib/hanamismith/builders/providers/htmx.rb
255
256
  - lib/hanamismith/builders/providers/logger.rb
256
257
  - lib/hanamismith/builders/puma/configuration.rb
@@ -282,7 +283,6 @@ files:
282
283
  - lib/hanamismith/templates/%project_name%/Procfile.dev.erb
283
284
  - lib/hanamismith/templates/%project_name%/Procfile.erb
284
285
  - lib/hanamismith/templates/%project_name%/app/action.rb.erb
285
- - lib/hanamismith/templates/%project_name%/app/aspects/logging/rack_adapter.rb.erb
286
286
  - lib/hanamismith/templates/%project_name%/app/assets/css/colors.css.erb
287
287
  - lib/hanamismith/templates/%project_name%/app/assets/css/defaults.css.erb
288
288
  - lib/hanamismith/templates/%project_name%/app/assets/css/layout.css.erb
@@ -294,6 +294,7 @@ files:
294
294
  - lib/hanamismith/templates/%project_name%/app/db/relation.rb.erb
295
295
  - lib/hanamismith/templates/%project_name%/app/db/repository.rb.erb
296
296
  - lib/hanamismith/templates/%project_name%/app/db/struct.rb.erb
297
+ - lib/hanamismith/templates/%project_name%/app/mailer.rb.erb
297
298
  - lib/hanamismith/templates/%project_name%/app/providers/logger.rb.erb
298
299
  - lib/hanamismith/templates/%project_name%/app/templates/layouts/app.html.erb.erb
299
300
  - lib/hanamismith/templates/%project_name%/app/view.rb.erb
@@ -303,8 +304,8 @@ files:
303
304
  - lib/hanamismith/templates/%project_name%/config/app.rb.erb
304
305
  - lib/hanamismith/templates/%project_name%/config/assets.js.erb
305
306
  - lib/hanamismith/templates/%project_name%/config/initializers/rack_attack.rb.erb
306
- - lib/hanamismith/templates/%project_name%/config/initializers/rack_logger_patch.rb.erb
307
- - lib/hanamismith/templates/%project_name%/config/initializers/sql_logger_patch.rb.erb
307
+ - lib/hanamismith/templates/%project_name%/config/initializers/universal_logger_patch.rb.erb
308
+ - lib/hanamismith/templates/%project_name%/config/providers/db.rb.erb
308
309
  - lib/hanamismith/templates/%project_name%/config/providers/htmx.rb.erb
309
310
  - lib/hanamismith/templates/%project_name%/config/providers/logger.rb.erb
310
311
  - lib/hanamismith/templates/%project_name%/config/puma.rb.erb
@@ -334,7 +335,6 @@ files:
334
335
  - lib/hanamismith/templates/%project_name%/slices/home/view.rb.erb
335
336
  - lib/hanamismith/templates/%project_name%/slices/home/views/context.rb.erb
336
337
  - lib/hanamismith/templates/%project_name%/slices/home/views/show.rb.erb
337
- - lib/hanamismith/templates/%project_name%/spec/app/aspects/logging/rack_adapter_spec.rb.erb
338
338
  - lib/hanamismith/templates/%project_name%/spec/app/providers/logger_spec.rb.erb
339
339
  - lib/hanamismith/templates/%project_name%/spec/features/home_spec.rb.erb
340
340
  - lib/hanamismith/templates/%project_name%/spec/hanami_helper.rb.erb
@@ -366,7 +366,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
366
366
  - !ruby/object:Gem::Version
367
367
  version: '0'
368
368
  requirements: []
369
- rubygems_version: 4.0.10
369
+ rubygems_version: 4.0.15
370
370
  specification_version: 4
371
371
  summary: A command line interface for smithing Hanami projects.
372
372
  test_files: []
metadata.gz.sig CHANGED
Binary file
@@ -1,21 +0,0 @@
1
- <% namespace do %>
2
- module Aspects
3
- module Logging
4
- # Adapts Cogger Rack middleware for provider registration.
5
- module RackAdapter
6
- module_function
7
-
8
- def with logger
9
- @logger = logger
10
- self
11
- end
12
-
13
- def new application
14
- @application = Cogger::Rack::Logger.new application, {logger: @logger}
15
- end
16
-
17
- def call(environment) = @application.call environment
18
- end
19
- end
20
- end
21
- <% end %>
@@ -1,21 +0,0 @@
1
- require "dry/system"
2
-
3
- # Patches Hanami's default providers.
4
- module RackLoggerPatch
5
- def prepare_app_providers
6
- require "hanami/providers/inflector"
7
-
8
- logger = Class.new Hanami::Provider::Source do
9
- def start
10
- slice.start :logger
11
- register :monitor, <%= settings.project_namespaced_class %>::Aspects::Logging::RackAdapter.with(slice[:logger])
12
- end
13
- end
14
-
15
- register_provider :inflector, source: Hanami::Providers::Inflector
16
- register_provider :rack, source: logger, namespace: true
17
- register_provider :db_logging, source: Hanami::Providers::DBLogging
18
- end
19
- end
20
-
21
- Hanami::App::ClassMethods.prepend RackLoggerPatch
@@ -1,13 +0,0 @@
1
- require "dry-monitor"
2
- require "dry/monitor/sql/logger"
3
-
4
- # Patches Hanami's default SQL logger.
5
- module SQLLoggerPatch
6
- def log_query time:, name:, query:
7
- # :nocov:
8
- Hanami.app[:logger].info { {message: query, tags: [{db: name, duration: time}]} }
9
- # :nocov:
10
- end
11
- end
12
-
13
- Dry::Monitor::SQL::Logger.prepend SQLLoggerPatch
@@ -1,34 +0,0 @@
1
- require "hanami_helper"
2
-
3
- RSpec.describe <%= settings.project_namespaced_class %>::Aspects::Logging::RackAdapter do
4
- subject(:adapter) { described_class }
5
-
6
- include_context "with application dependencies"
7
-
8
- let(:application) { proc { [200, {"Content-Type" => "text/plain"}, "test"] } }
9
-
10
- describe ".with" do
11
- it "answers itself" do
12
- expect(adapter.with(nil)).to eq(adapter)
13
- end
14
- end
15
-
16
- describe ".new" do
17
- it "answers Cogger middleware" do
18
- expect(adapter.with(logger).new(application)).to be_a(Cogger::Rack::Logger)
19
- end
20
- end
21
-
22
- describe ".call" do
23
- let(:middleware) { adapter.with(logger).new application }
24
-
25
- it "answers application" do
26
- expect(middleware.call({})).to eq([200, {"Content-Type" => "text/plain"}, "test"])
27
- end
28
-
29
- it "logs request" do
30
- middleware.call({})
31
- expect(logger.reread).to match(/level.+INFO.+status.+200/)
32
- end
33
- end
34
- end