hanamismith 1.9.0 → 1.11.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 (60) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.adoc +8 -6
  4. data/hanamismith.gemspec +3 -3
  5. data/lib/hanamismith/builders/asset.rb +1 -1
  6. data/lib/hanamismith/builders/binstub.rb +1 -1
  7. data/lib/hanamismith/builders/bundler.rb +2 -2
  8. data/lib/hanamismith/builders/caliber.rb +1 -1
  9. data/lib/hanamismith/builders/circle_ci.rb +16 -1
  10. data/lib/hanamismith/builders/console.rb +2 -2
  11. data/lib/hanamismith/builders/core.rb +13 -14
  12. data/lib/hanamismith/builders/docker/compose.rb +1 -1
  13. data/lib/hanamismith/builders/docker/file.rb +1 -1
  14. data/lib/hanamismith/builders/documentation/readme.rb +1 -1
  15. data/lib/hanamismith/builders/environments/all.rb +3 -2
  16. data/lib/hanamismith/builders/environments/development.rb +1 -1
  17. data/lib/hanamismith/builders/environments/test.rb +1 -1
  18. data/lib/hanamismith/builders/git/ignore.rb +1 -1
  19. data/lib/hanamismith/builders/git_hub/ci.rb +1 -1
  20. data/lib/hanamismith/builders/icon.rb +1 -1
  21. data/lib/hanamismith/builders/javascript.rb +1 -1
  22. data/lib/hanamismith/builders/layout.rb +35 -1
  23. data/lib/hanamismith/builders/node.rb +1 -1
  24. data/lib/hanamismith/builders/providers/htmx.rb +20 -0
  25. data/lib/hanamismith/builders/puma/configuration.rb +1 -1
  26. data/lib/hanamismith/builders/puma/procfile.rb +2 -2
  27. data/lib/hanamismith/builders/pwa.rb +1 -1
  28. data/lib/hanamismith/builders/rack/attack.rb +2 -2
  29. data/lib/hanamismith/builders/rack/configuration.rb +1 -1
  30. data/lib/hanamismith/builders/rack/deflater.rb +1 -1
  31. data/lib/hanamismith/builders/rake/configuration.rb +1 -1
  32. data/lib/hanamismith/builders/refinement.rb +1 -1
  33. data/lib/hanamismith/builders/rspec/application_shared_context.rb +1 -1
  34. data/lib/hanamismith/builders/rspec/hanami.rb +1 -1
  35. data/lib/hanamismith/builders/rspec/helper.rb +1 -1
  36. data/lib/hanamismith/builders/setup.rb +1 -1
  37. data/lib/hanamismith/builders/slices/health.rb +8 -8
  38. data/lib/hanamismith/builders/slices/home.rb +9 -9
  39. data/lib/hanamismith/builders/stylesheet.rb +10 -2
  40. data/lib/hanamismith/cli/commands/build.rb +1 -0
  41. data/lib/hanamismith/templates/%project_name%/.circleci/config.yml.erb +1 -0
  42. data/lib/hanamismith/templates/%project_name%/app/assets/css/colors.css.erb +4 -0
  43. data/lib/hanamismith/templates/%project_name%/app/assets/css/defaults.css.erb +120 -0
  44. data/lib/hanamismith/templates/%project_name%/app/assets/css/{app.css.erb → layout.css.erb} +16 -17
  45. data/lib/hanamismith/templates/%project_name%/app/assets/css/settings.css.erb +7 -0
  46. data/lib/hanamismith/templates/%project_name%/app/assets/css/view_transitions.css.erb +5 -0
  47. data/lib/hanamismith/templates/%project_name%/app/assets/js/app.js.erb +8 -1
  48. data/lib/hanamismith/templates/%project_name%/app/templates/layouts/app.html.erb.erb +9 -8
  49. data/lib/hanamismith/templates/%project_name%/config/app.rb.erb +13 -1
  50. data/lib/hanamismith/templates/%project_name%/config/providers/htmx.rb.erb +5 -0
  51. data/lib/hanamismith/templates/%project_name%/config/settings.rb.erb +1 -0
  52. data/lib/hanamismith/templates/%project_name%/env.erb +4 -1
  53. data/lib/hanamismith/templates/%project_name%/lib/%project_path%/refines/actions/response.rb.erb +3 -1
  54. data/lib/hanamismith/templates/%project_name%/package.json.erb +3 -2
  55. data/lib/hanamismith/templates/%project_name%/spec/lib/%project_path%/refines/actions/response_spec.rb.erb +15 -3
  56. data.tar.gz.sig +1 -1
  57. metadata +13 -9
  58. metadata.gz.sig +0 -0
  59. data/lib/hanamismith/templates/%project_name%/config/providers/persistence.rb.erb +0 -44
  60. data/lib/hanamismith/templates/%project_name%/config/providers/yjit.rb.erb +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d1d15f62423c7145f26fb391000e14852da8584671697e05c8a47466fa8aeede
4
- data.tar.gz: d6ea33248d186e29d468e6ad2c53dfca29be1835f14f6efc19cc720a8912cb89
3
+ metadata.gz: 99d8a44f11d0435d1a4a42b5fe9cccb713ffa2cea43da1ce7291cfaabc926b17
4
+ data.tar.gz: 0e802783aededd9c3779551d0204f8ad246615940586c3eb60262a8fc29caaf1
5
5
  SHA512:
6
- metadata.gz: 2b57fa52c6a81f4b9f80b77b08a13c26194a802a4843c387e3830bb7be4f55d3a1f4ba617c7dc95ea7f27d221a19c6679f5c16e7922752ee151021eedd8cbd9d
7
- data.tar.gz: 0f849fda00afed8e14432527b96110efb11f448d741cf2c1ce9342ab3ba65fa658745d6481d647f149fb225f855353d4cb8d12b18e2f5e2951efda8b72fa1f90
6
+ metadata.gz: f3d77a113ad86e3a95528667b2c5c217a3580b0a7fc4f27a899e02335c7a9a92a688fc1bed007f0ca29afcfcac434cf5c591f49565016c1b7696210357b7b4b0
7
+ data.tar.gz: 949f259fc32d8fad670a2c8d0ee627817c87348a66699298899b80d7a5347cf18f6c73157f20b78f9350852a7d36d13b4e609743ced1c6bae5bd444d035de11a
checksums.yaml.gz.sig CHANGED
Binary file
data/README.adoc CHANGED
@@ -7,8 +7,10 @@
7
7
  :dotenv_link: link:https://github.com/bkeepers/dotenv[Dotenv]
8
8
  :dotfiles_link: link:https://alchemists.io/projects/dotfiles[Dotfiles]
9
9
  :hanami_link: link:https://hanamirb.org[Hanami]
10
- :htmx_link: link:https://alchemists.io/projects/htmx[HTMX]
10
+ :htmx_gem_link: link:https://alchemists.io/projects/htmx[HTMX]
11
+ :htmx_link: link:https://htmx.org[htmx]
11
12
  :pg_link: link:https://github.com/ged/ruby-pg[pg]
13
+ :postgresql_link: link:https://www.postgresql.org[PostgreSQL]
12
14
  :puma_link: link:https://puma.io[Puma]
13
15
  :rack_link: link:https://github.com/rack/rack[Rack]
14
16
  :rom_link: link:https://rom-rb.org[ROM]
@@ -22,18 +24,18 @@ toc::[]
22
24
 
23
25
  == Features
24
26
 
25
- * Built atop {rubysmith_link} for building project skeleton.
27
+ * Built atop {rubysmith_link} for building project skeletons.
26
28
  * Uses {hanami_link} for web application development.
27
- * Uses {htmx_link} for Hypermedia REST so you can write less code and avoid bloated JavaScript stacks.
28
- * Uses {pg_link} coupled with {rom_link} for database management.
29
+ * Uses {htmx_link} (along with the {htmx_gem_link} gem) for Hypermedia REST so you can write less code and avoid bloated JavaScript stacks.
30
+ * Uses {postgresql_link} for the database, {pg_link} for the client, and {rom_link} Ruby object mapper.
29
31
  * Uses {rack_link}, specifically: link:https://github.com/rack/rack-attack[Rack::Attack], `Rack::Deflater`, and `Rack::Static`.
30
- * Uses {puma_link} as the default web server and fully configured for local and production environments.
32
+ * Uses {puma_link} for the web server including being fully configured for local and production environments.
31
33
  * Uses {capybara_link} with {cuprite_link} (driver) for full, headless, feature testing.
32
34
  * Uses {dotenv_link} for managing your environment configurations.
33
35
  * Provides support for Continuous Integration systems like link:https://circleci.com[Circle CI] (default) and link:https://docs.github.com/en/actions[GitHub Actions].
34
36
  * Provides the `/up` health check endpoint via the `Health` slice.
35
37
  * Configures link:https://github.com/ruby/ruby/blob/master/doc/yjit/yjit.md[YJIT] so you can deploy with YJIT disabled (i.e. `RUBYOPT=--yjit-disable --yjit-exec-mem-size=192`) and let the application enable upon boot.
36
- * Disables link:https://github.com/ruby/irb[IRB] console autocomplete when used in production-like environments. You can re-enable IRB autocomplete by setting `IRB_USE_AUTOCOMPLETE=true` before launching your console in non development or test environments.
38
+ * Ensures link:https://github.com/ruby/irb[IRB] console autocomplete is disabled when used in production-like environments. You can re-enable IRB autocomplete by setting `IRB_USE_AUTOCOMPLETE=true` before launching your console in non development or test environments.
37
39
 
38
40
  == Screenshots/Screencasts
39
41
 
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 = "1.9.0"
5
+ spec.version = "1.11.0"
6
6
  spec.authors = ["Brooke Kuhlmann"]
7
7
  spec.email = ["brooke@alchemists.io"]
8
8
  spec.homepage = "https://alchemists.io/projects/hanamismith"
@@ -30,8 +30,8 @@ Gem::Specification.new do |spec|
30
30
  spec.add_dependency "etcher", "~> 3.0"
31
31
  spec.add_dependency "htmx", "~> 2.0"
32
32
  spec.add_dependency "infusible", "~> 4.0"
33
- spec.add_dependency "refinements", "~> 13.3"
34
- spec.add_dependency "rubysmith", "~> 8.6"
33
+ spec.add_dependency "refinements", "~> 13.5"
34
+ spec.add_dependency "rubysmith", "~> 8.7"
35
35
  spec.add_dependency "runcom", "~> 12.0"
36
36
  spec.add_dependency "sod", "~> 1.0"
37
37
  spec.add_dependency "spek", "~> 4.0"
@@ -10,7 +10,7 @@ module Hanamismith
10
10
 
11
11
  def call
12
12
  path = "%project_name%/config/assets.js.erb"
13
- builder.call(settings.merge(template_path: path)).render
13
+ builder.call(settings.with(template_path: path)).render
14
14
  true
15
15
  end
16
16
  end
@@ -9,7 +9,7 @@ module Hanamismith
9
9
  using Refinements::Struct
10
10
 
11
11
  def call
12
- builder.call(settings.merge(template_path: "%project_name%/bin/hanami.erb"))
12
+ builder.call(settings.with(template_path: "%project_name%/bin/hanami.erb"))
13
13
  .render
14
14
  .permit 0o755
15
15
 
@@ -52,7 +52,7 @@ module Hanamismith
52
52
  gem "dry-validation", "~> 1.10"
53
53
  gem "htmx", "~> 2.1"
54
54
  gem "overmind", "~> 2.5"
55
- gem "puma", "~> 6.6"
55
+ gem "puma", "~> 7.0"
56
56
  gem "rack-attack", "~> 6.7"
57
57
  CONTENT
58
58
  end
@@ -104,7 +104,7 @@ module Hanamismith
104
104
  def remove_zeitwerk = with_template.replace(/.+zeitwerk.+\n\n/, "\n")
105
105
 
106
106
  def with_template
107
- builder.call settings.merge(template_path: "%project_name%/Gemfile.erb")
107
+ builder.call settings.with(template_path: "%project_name%/Gemfile.erb")
108
108
  end
109
109
  end
110
110
  end
@@ -13,7 +13,7 @@ module Hanamismith
13
13
 
14
14
  super
15
15
  path = "%project_name%/.config/rubocop/config.yml.erb"
16
- builder.call(settings.merge(template_path: path))
16
+ builder.call(settings.with(template_path: path))
17
17
  .append("\nplugins: rubocop-sequel\n")
18
18
 
19
19
  true
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "refinements/struct"
4
+ require "securerandom"
4
5
 
5
6
  module Hanamismith
6
7
  module Builders
@@ -8,13 +9,27 @@ module Hanamismith
8
9
  class CircleCI < Rubysmith::Builders::Abstract
9
10
  using Refinements::Struct
10
11
 
12
+ def initialize(generator: SecureRandom, **)
13
+ @generator = generator
14
+ super(**)
15
+ end
16
+
11
17
  def call
12
18
  return false unless settings.build_circle_ci
13
19
 
14
20
  path = "%project_name%/.circleci/config.yml.erb"
15
- builder.call(settings.merge(template_path: path)).render.replace(/\n\n\Z/, "\n")
21
+
22
+ builder.call(settings.with(template_path: path))
23
+ .render
24
+ .replace("<app_secret>", generator.hex(30))
25
+ .replace(/\n\n\Z/, "\n")
26
+
16
27
  true
17
28
  end
29
+
30
+ private
31
+
32
+ attr_reader :generator
18
33
  end
19
34
  end
20
35
  end
@@ -12,7 +12,7 @@ module Hanamismith
12
12
  return false unless settings.build_console
13
13
 
14
14
  super
15
- builder.call(settings.merge(template_path: "%project_name%/bin/console.erb"))
15
+ builder.call(settings.with(template_path: "%project_name%/bin/console.erb"))
16
16
  .replace(/require Bundler.root.+/, %(require "hanami/prepare"))
17
17
 
18
18
  add_irb_autocomplete
@@ -33,7 +33,7 @@ module Hanamismith
33
33
  end
34
34
 
35
35
  def with_template
36
- builder.call settings.merge(template_path: "%project_name%/bin/console.erb")
36
+ builder.call settings.with(template_path: "%project_name%/bin/console.erb")
37
37
  end
38
38
  end
39
39
  end
@@ -16,63 +16,62 @@ module Hanamismith
16
16
  private
17
17
 
18
18
  def add_db_relation
19
- builder.call(settings.merge(template_path: "%project_name%/app/db/relation.rb.erb")).render
19
+ builder.call(settings.with(template_path: "%project_name%/app/db/relation.rb.erb")).render
20
20
  end
21
21
 
22
22
  def add_db_repository
23
- builder.call(settings.merge(template_path: "%project_name%/app/db/repository.rb.erb"))
24
- .render
23
+ builder.call(settings.with(template_path: "%project_name%/app/db/repository.rb.erb")).render
25
24
  end
26
25
 
27
26
  def add_db_struct
28
- builder.call(settings.merge(template_path: "%project_name%/app/db/struct.rb.erb")).render
27
+ builder.call(settings.with(template_path: "%project_name%/app/db/struct.rb.erb")).render
29
28
  end
30
29
 
31
30
  def add_action
32
- builder.call(settings.merge(template_path: "%project_name%/app/action.rb.erb")).render
31
+ builder.call(settings.with(template_path: "%project_name%/app/action.rb.erb")).render
33
32
  end
34
33
 
35
34
  def add_view
36
- builder.call(settings.merge(template_path: "%project_name%/app/view.rb.erb")).render
35
+ builder.call(settings.with(template_path: "%project_name%/app/view.rb.erb")).render
37
36
  end
38
37
 
39
38
  def add_application_configuration
40
- builder.call(settings.merge(template_path: "%project_name%/config/app.rb.erb")).render
39
+ builder.call(settings.with(template_path: "%project_name%/config/app.rb.erb")).render
41
40
  end
42
41
 
43
42
  def add_routes_configuration
44
- builder.call(settings.merge(template_path: "%project_name%/config/routes.rb.erb")).render
43
+ builder.call(settings.with(template_path: "%project_name%/config/routes.rb.erb")).render
45
44
  end
46
45
 
47
46
  def add_settings_configuration
48
- builder.call(settings.merge(template_path: "%project_name%/config/settings.rb.erb")).render
47
+ builder.call(settings.with(template_path: "%project_name%/config/settings.rb.erb")).render
49
48
  end
50
49
 
51
50
  def add_types
52
51
  path = "%project_name%/lib/%project_path%/types.rb.erb"
53
- builder.call(settings.merge(template_path: path)).render
52
+ builder.call(settings.with(template_path: path)).render
54
53
  end
55
54
 
56
55
  def add_migrate_directory
57
- builder.call(settings.merge(template_path: "%project_name%/db/migrate")).make_path
56
+ builder.call(settings.with(template_path: "%project_name%/db/migrate")).make_path
58
57
  end
59
58
 
60
59
  def add_well_known_security_text
61
60
  return unless settings.build_security
62
61
 
63
62
  path = "%project_name%/public/.well-known/security.txt.erb"
64
- builder.call(settings.merge(template_path: path)).render
63
+ builder.call(settings.with(template_path: path)).render
65
64
  end
66
65
 
67
66
  def add_public_http_errors
68
67
  %w[404 500].each do |code|
69
68
  path = "%project_name%/public/#{code}.html.erb"
70
- builder.call(settings.merge(template_path: path)).render
69
+ builder.call(settings.with(template_path: path)).render
71
70
  end
72
71
  end
73
72
 
74
73
  def add_temp_directory
75
- builder.call(settings.merge(template_path: "%project_name%/tmp")).make_path
74
+ builder.call(settings.with(template_path: "%project_name%/tmp")).make_path
76
75
  end
77
76
  end
78
77
  end
@@ -12,7 +12,7 @@ module Hanamismith
12
12
  def call
13
13
  return false unless settings.build_docker
14
14
 
15
- builder.call(settings.merge(template_path: "%project_name%/compose.yml.erb")).render
15
+ builder.call(settings.with(template_path: "%project_name%/compose.yml.erb")).render
16
16
  true
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module Hanamismith
12
12
  def call
13
13
  return false unless settings.build_docker
14
14
 
15
- builder.call(settings.merge(template_path: "%project_name%/Dockerfile.erb")).render
15
+ builder.call(settings.with(template_path: "%project_name%/Dockerfile.erb")).render
16
16
  true
17
17
  end
18
18
  end
@@ -13,7 +13,7 @@ module Hanamismith
13
13
  return false unless settings.build_readme
14
14
 
15
15
  super
16
- builder.call(settings.merge(template_path: "%project_name%/README.#{kind}.erb"))
16
+ builder.call(settings.with(template_path: "%project_name%/README.#{kind}.erb"))
17
17
  .replace("Rubysmith", "Hanamismith")
18
18
  .replace("rubysmith", "hanamismith")
19
19
 
@@ -16,9 +16,10 @@ module Hanamismith
16
16
  end
17
17
 
18
18
  def call
19
- builder.call(settings.merge(template_path: "%project_name%/env.erb"))
19
+ builder.call(settings.with(template_path: "%project_name%/env.erb"))
20
20
  .render
21
- .replace("<password>", generator.hex(15))
21
+ .replace("<app_secret>", generator.hex(40))
22
+ .replace("<pg_password>", generator.hex(15))
22
23
  .rename(".env")
23
24
 
24
25
  true
@@ -10,7 +10,7 @@ module Hanamismith
10
10
  using Refinements::Struct
11
11
 
12
12
  def call
13
- builder.call(settings.merge(template_path: "%project_name%/env.development.erb"))
13
+ builder.call(settings.with(template_path: "%project_name%/env.development.erb"))
14
14
  .render
15
15
  .rename(".env.development")
16
16
 
@@ -10,7 +10,7 @@ module Hanamismith
10
10
  using Refinements::Struct
11
11
 
12
12
  def call
13
- builder.call(settings.merge(template_path: "%project_name%/env.test.erb"))
13
+ builder.call(settings.with(template_path: "%project_name%/env.test.erb"))
14
14
  .render
15
15
  .rename(".env.test")
16
16
 
@@ -13,7 +13,7 @@ module Hanamismith
13
13
  return false unless settings.build_git
14
14
 
15
15
  super
16
- builder.call(settings.merge(template_path: "%project_name%/.gitignore.erb"))
16
+ builder.call(settings.with(template_path: "%project_name%/.gitignore.erb"))
17
17
  .insert_before "tmp\n", <<~CONTENT
18
18
  node_modules
19
19
  public/assets
@@ -13,7 +13,7 @@ module Hanamismith
13
13
  return false unless settings.build_git_hub_ci
14
14
 
15
15
  path = "%project_name%/.github/workflows/ci.yml.erb"
16
- builder.call(settings.merge(template_path: path)).render.replace(/\n\n\Z/, "\n")
16
+ builder.call(settings.with(template_path: path)).render.replace(/\n\n\Z/, "\n")
17
17
  true
18
18
  end
19
19
  end
@@ -10,7 +10,7 @@ module Hanamismith
10
10
 
11
11
  def call
12
12
  path = "%project_name%/app/assets/images/icon.svg.erb"
13
- builder.call(settings.merge(template_path: path)).render
13
+ builder.call(settings.with(template_path: path)).render
14
14
  true
15
15
  end
16
16
  end
@@ -10,7 +10,7 @@ module Hanamismith
10
10
 
11
11
  def call
12
12
  path = "%project_name%/app/assets/js/app.js.erb"
13
- builder.call(settings.merge(template_path: path)).render
13
+ builder.call(settings.with(template_path: path)).render
14
14
  true
15
15
  end
16
16
  end
@@ -10,19 +10,33 @@ module Hanamismith
10
10
 
11
11
  def call
12
12
  path = "%project_name%/app/templates/layouts/app.html.erb.erb"
13
- builder.call(settings.merge(template_path: path))
13
+ builder.call(settings.with(template_path: path))
14
14
  .render
15
15
  .replace("<!-- title -->", "<%= content_for :title %>")
16
+ .replace("<!-- favicon -->", favicon)
16
17
  .replace("<!-- icon -->", icon)
18
+ .replace("<!-- apple_icon -->", apple_icon)
17
19
  .replace("<!-- manifest -->", manifest)
18
20
  .replace("<!-- stylesheet -->", stylesheet)
21
+ .replace("<!-- javascript -->", javascript)
19
22
  .replace("<!-- yield -->", "<%= yield %>")
23
+ .replace("<!-- flash:alert -->", flash(:alert))
24
+ .replace("<!-- flash:notice -->", flash(:notice))
20
25
 
21
26
  true
22
27
  end
23
28
 
24
29
  private
25
30
 
31
+ def favicon
32
+ uri = "https://alchemists.io/images/projects/hanamismith/icons/favicon.ico"
33
+
34
+ %(<%= tag.link title: "#{settings.project_label}: Favicon",\n) +
35
+ %( rel: :icon,\n) +
36
+ %( href: "#{uri}",\n) +
37
+ %( sizes: "32x32" %>)
38
+ end
39
+
26
40
  def icon
27
41
  %(<%= tag.link title: "#{settings.project_label}: Icon",\n) +
28
42
  %( rel: :icon,\n) +
@@ -30,6 +44,24 @@ module Hanamismith
30
44
  %( type: "image/svg+xml" %>)
31
45
  end
32
46
 
47
+ def apple_icon
48
+ uri = "https://alchemists.io/images/projects/hanamismith/icons/apple.png"
49
+
50
+ %(<%= tag.link title: "#{settings.project_label}: Apple Icon",\n) +
51
+ %( rel: "apple-touch-icon",\n) +
52
+ %( href: "#{uri}",\n) +
53
+ %( type: "image/png" %>)
54
+ end
55
+
56
+ # :reek:UtilityFunction
57
+ def flash kind
58
+ %(<% if flash[:#{kind}] %>\n) +
59
+ %( <div class="site-#{kind}">\n) +
60
+ %( <p><%= flash[:#{kind}] %></p>\n) +
61
+ %( </div>\n) +
62
+ %( <% end %>\n)
63
+ end
64
+
33
65
  def manifest
34
66
  %(<%= tag.link title: "#{settings.project_label}: Manifest",\n) +
35
67
  %( rel: :manifest,\n) +
@@ -40,6 +72,8 @@ module Hanamismith
40
72
  %(<%= tag.link title: "#{settings.project_label}: Stylesheet", rel: :stylesheet, ) +
41
73
  %(href: app_assets["app.css"] %>)
42
74
  end
75
+
76
+ def javascript = %(<%= tag.script src: app_assets["app.js"], type: "text/javascript" %>)
43
77
  end
44
78
  end
45
79
  end
@@ -20,7 +20,7 @@ module Hanamismith
20
20
 
21
21
  def call
22
22
  build_version
23
- builder.call(settings.merge(template_path: "%project_name%/package.json.erb")).render
23
+ builder.call(settings.with(template_path: "%project_name%/package.json.erb")).render
24
24
  true
25
25
  end
26
26
 
@@ -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 HTMX provider.
9
+ class HTMX < Rubysmith::Builders::Abstract
10
+ using Refinements::Struct
11
+
12
+ def call
13
+ path = "%project_name%/config/providers/htmx.rb.erb"
14
+ builder.call(settings.with(template_path: path)).render
15
+ true
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -10,7 +10,7 @@ module Hanamismith
10
10
  using Refinements::Struct
11
11
 
12
12
  def call
13
- builder.call(settings.merge(template_path: "%project_name%/config/puma.rb.erb")).render
13
+ builder.call(settings.with(template_path: "%project_name%/config/puma.rb.erb")).render
14
14
 
15
15
  true
16
16
  end
@@ -10,8 +10,8 @@ module Hanamismith
10
10
  using Refinements::Struct
11
11
 
12
12
  def call
13
- builder.call(settings.merge(template_path: "%project_name%/Procfile.erb")).render
14
- builder.call(settings.merge(template_path: "%project_name%/Procfile.dev.erb")).render
13
+ builder.call(settings.with(template_path: "%project_name%/Procfile.erb")).render
14
+ builder.call(settings.with(template_path: "%project_name%/Procfile.dev.erb")).render
15
15
  true
16
16
  end
17
17
  end
@@ -10,7 +10,7 @@ module Hanamismith
10
10
 
11
11
  def call
12
12
  path = "%project_name%/app/assets/pwa/manifest.webmanifest.erb"
13
- builder.call(settings.merge(template_path: path)).render
13
+ builder.call(settings.with(template_path: path)).render
14
14
  true
15
15
  end
16
16
  end
@@ -19,11 +19,11 @@ module Hanamismith
19
19
 
20
20
  def add_configuration
21
21
  template_path = "%project_name%/config/initializers/rack_attack.rb.erb"
22
- builder.call(settings.merge(template_path:)).render
22
+ builder.call(settings.with(template_path:)).render
23
23
  end
24
24
 
25
25
  def add_middleware
26
- builder.call(settings.merge(template_path: "%project_name%/config/app.rb.erb"))
26
+ builder.call(settings.with(template_path: "%project_name%/config/app.rb.erb"))
27
27
  .insert_after(/require/, %(\nrequire_relative "initializers/rack_attack"\n))
28
28
  .insert_before(/environment/, " config.middleware.use Rack::Attack\n\n")
29
29
  end
@@ -10,7 +10,7 @@ module Hanamismith
10
10
  using Refinements::Struct
11
11
 
12
12
  def call
13
- builder.call(settings.merge(template_path: "%project_name%/config.ru.erb")).render
13
+ builder.call(settings.with(template_path: "%project_name%/config.ru.erb")).render
14
14
  true
15
15
  end
16
16
  end
@@ -10,7 +10,7 @@ module Hanamismith
10
10
  using Refinements::Struct
11
11
 
12
12
  def call
13
- builder.call(settings.merge(template_path: "%project_name%/config/app.rb.erb"))
13
+ builder.call(settings.with(template_path: "%project_name%/config/app.rb.erb"))
14
14
  .insert_after(/Rack::Attack/, " config.middleware.use Rack::Deflater\n")
15
15
 
16
16
  true
@@ -13,7 +13,7 @@ module Hanamismith
13
13
  return false unless settings.build_rake
14
14
 
15
15
  super
16
- builder.call(settings.merge(template_path: "%project_name%/Rakefile.erb"))
16
+ builder.call(settings.with(template_path: "%project_name%/Rakefile.erb"))
17
17
  .render
18
18
  .insert_after(%r(bundler/setup), %(require "hanami/rake_tasks"))
19
19
 
@@ -13,7 +13,7 @@ module Hanamismith
13
13
  %project_name%/lib/%project_path%/refines/actions/response.rb.erb
14
14
  %project_name%/spec/lib/%project_path%/refines/actions/response_spec.rb.erb
15
15
  ].each do |path|
16
- builder.call(settings.merge(template_path: path)).render
16
+ builder.call(settings.with(template_path: path)).render
17
17
  end
18
18
 
19
19
  true
@@ -13,7 +13,7 @@ module Hanamismith
13
13
  return false unless settings.build_rspec
14
14
 
15
15
  path = "%project_name%/spec/support/shared_contexts/application.rb.erb"
16
- builder.call(settings.merge(template_path: path)).render
16
+ builder.call(settings.with(template_path: path)).render
17
17
 
18
18
  true
19
19
  end
@@ -13,7 +13,7 @@ module Hanamismith
13
13
  return false unless settings.build_rspec
14
14
 
15
15
  path = "%project_name%/spec/hanami_helper.rb.erb"
16
- builder.call(settings.merge(template_path: path)).render
16
+ builder.call(settings.with(template_path: path)).render
17
17
 
18
18
  true
19
19
  end
@@ -11,7 +11,7 @@ module Hanamismith
11
11
 
12
12
  def initialize(...)
13
13
  super
14
- @template = builder.call settings.merge(
14
+ @template = builder.call settings.with(
15
15
  template_path: "%project_name%/spec/spec_helper.rb.erb"
16
16
  )
17
17
  end
@@ -19,7 +19,7 @@ module Hanamismith
19
19
  private
20
20
 
21
21
  def append
22
- builder.call(settings.merge(template_path: "%project_name%/bin/setup.erb"))
22
+ builder.call(settings.with(template_path: "%project_name%/bin/setup.erb"))
23
23
  .insert_after(%(Runner.call "bundle install"\n), <<~CONTENT.gsub(/^(?=\w)/, " "))
24
24
 
25
25
  puts "Installing packages..."