hanamismith 0.22.1 → 0.23.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 (35) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.adoc +2 -2
  4. data/hanamismith.gemspec +1 -2
  5. data/lib/hanamismith/builders/asset.rb +29 -0
  6. data/lib/hanamismith/builders/bundler.rb +13 -0
  7. data/lib/hanamismith/builders/git/ignore.rb +29 -0
  8. data/lib/hanamismith/builders/icon.rb +1 -1
  9. data/lib/hanamismith/builders/javascript.rb +29 -0
  10. data/lib/hanamismith/builders/{rack.rb → node.rb} +4 -3
  11. data/lib/hanamismith/builders/pwa.rb +1 -1
  12. data/lib/hanamismith/builders/rack/attack.rb +42 -0
  13. data/lib/hanamismith/builders/rack/configuration.rb +30 -0
  14. data/lib/hanamismith/builders/rack/deflater.rb +32 -0
  15. data/lib/hanamismith/builders/setup.rb +1 -0
  16. data/lib/hanamismith/builders/slices/home.rb +17 -0
  17. data/lib/hanamismith/builders/stylesheet.rb +1 -1
  18. data/lib/hanamismith/cli/commands/build.rb +9 -3
  19. data/lib/hanamismith/extensions/npm.rb +43 -0
  20. data/lib/hanamismith/templates/%project_name%/Procfile.dev.erb +2 -1
  21. data/lib/hanamismith/templates/%project_name%/Procfile.erb +1 -0
  22. data/lib/hanamismith/templates/%project_name%/{public → app/assets/pwa}/manifest.webmanifest.erb +1 -1
  23. data/lib/hanamismith/templates/%project_name%/config/app.rb.erb +0 -9
  24. data/lib/hanamismith/templates/%project_name%/config/assets.js.erb +3 -0
  25. data/lib/hanamismith/templates/%project_name%/config/initializers/rack_attack.rb.erb +16 -0
  26. data/lib/hanamismith/templates/%project_name%/config/puma.rb.erb +7 -7
  27. data/lib/hanamismith/templates/%project_name%/package.json.erb +16 -0
  28. data/lib/hanamismith/templates/%project_name%/{public/stylesheets/home.css.erb → slices/home/assets/css/app.css.erb} +18 -15
  29. data/lib/hanamismith/templates/%project_name%/slices/home/assets/js/app.js.erb +1 -0
  30. data/lib/hanamismith/templates/%project_name%/slices/home/templates/layouts/app.html.erb.erb +3 -3
  31. data/lib/hanamismith.rb +1 -0
  32. data.tar.gz.sig +0 -0
  33. metadata +17 -20
  34. metadata.gz.sig +0 -0
  35. /data/lib/hanamismith/templates/%project_name%/{public → app/assets/images}/icon.svg.erb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '09277ca7f3035e772530aa49b02d48ce98fccae142e92592b836860261754c1b'
4
- data.tar.gz: ca7c7098d42ab47acf3c716d24ce7da62a0deed50011af0b2200eec4ee291db6
3
+ metadata.gz: ac116718fe8f0827a091ed6f10024328c6f6a6593b84ba109cc184716b013207
4
+ data.tar.gz: 4ae3b9a123b1119386e1afa938b3fe47bd91ac271eb128c2ec14cb518a8fe615
5
5
  SHA512:
6
- metadata.gz: ef78c4797a6fd4ecfaf577e20ae4e2aa8e06877f61fcc47d1f31c4637415b004016cf1833802dfa758669b93d531574f5c3dfe77519e4d15ce162088851c1d29
7
- data.tar.gz: bf8783423886a76fc10cac7b2e7ab015babe450de463ff7707757b73b486014e35cb87706157c5249323a8a53910f51b50f35b48e2a02cedb08ad8ad341d32e5
6
+ metadata.gz: abbc3f774efcf10bce992ee77c78c912542b14ce4f467323391e4ecd717ce96e64956d0cf3f09a326a58fb6058288239a2853e2fb23091dc6b111041d471c48d
7
+ data.tar.gz: 97000aca93757adb0fba3435fcf8beeacd747d273af59f5105c9db1f7e58ddf5705427c881c113549dc0a1855397d209f5d460edd275a8dcfd9e55e4b7112a9f
checksums.yaml.gz.sig CHANGED
Binary file
data/README.adoc CHANGED
@@ -33,7 +33,7 @@ toc::[]
33
33
  * Uses {hanami_link} for web application development.
34
34
  * Uses {htmx_link} for Hypermedia REST APIs (i.e. HTML over the wire) so you can write less code and avoid bloated JavaScript stacks.
35
35
  * Uses {pg_link} coupled with {rom_link} for database management.
36
- * Uses {rack_link}, specifically: `Rack::Deflater`, `Rack::Static`, and link:https://github.com/rack/rack-attack[Rack::Attack].
36
+ * Uses {rack_link}, specifically: `Rack::Deflater` and link:https://github.com/rack/rack-attack[Rack::Attack].
37
37
  * Uses {puma_link} as the default web server and fully configured for local and production environments.
38
38
  * Uses {capybara_link} with {cuprite_link} (driver) for full, headless, feature testing.
39
39
  * Uses {dotenv_link} for managing your environment configurations.
@@ -43,7 +43,7 @@ toc::[]
43
43
 
44
44
  == Screenshots/Screencasts
45
45
 
46
- image:https://alchemists.io/images/projects/hanamismith/screenshots/home.png[Home,width=664,height=693,role=focal_point]
46
+ image:https://alchemists.io/images/projects/hanamismith/screenshots/home.png[Home,width=695,height=706,role=focal_point]
47
47
 
48
48
  The above is a screenshot of a _Demo_ project that was generated and run locally. For a fully working demonstration application -- as built by this gem -- check out the link:https://github.com/bkuhlmann/hemo[Hemo] project. Here's a quick screencast overview of this demonstration application in action:
49
49
 
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 = "0.22.1"
5
+ spec.version = "0.23.0"
6
6
  spec.authors = ["Brooke Kuhlmann"]
7
7
  spec.email = ["brooke@alchemists.io"]
8
8
  spec.homepage = "https://alchemists.io/projects/hanamismith"
@@ -28,7 +28,6 @@ Gem::Specification.new do |spec|
28
28
  spec.add_dependency "dry-monads", "~> 1.6"
29
29
  spec.add_dependency "dry-schema", "~> 1.13"
30
30
  spec.add_dependency "etcher", "~> 0.2"
31
- spec.add_dependency "hanami", "~> 2.0"
32
31
  spec.add_dependency "htmx", "~> 0.3"
33
32
  spec.add_dependency "infusible", "~> 2.2"
34
33
  spec.add_dependency "refinements", "~> 11.0"
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+
5
+ module Hanamismith
6
+ module Builders
7
+ # Builds project skeleton for assets.
8
+ class Asset
9
+ using Refinements::Structs
10
+
11
+ def self.call(...) = new(...).call
12
+
13
+ def initialize configuration, builder: Rubysmith::Builder
14
+ @configuration = configuration
15
+ @builder = builder
16
+ end
17
+
18
+ def call
19
+ path = "%project_name%/config/assets.js.erb"
20
+ builder.call(configuration.merge(template_path: path)).render
21
+ configuration
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :configuration, :builder
27
+ end
28
+ end
29
+ end
@@ -5,6 +5,7 @@ require "refinements/structs"
5
5
  module Hanamismith
6
6
  module Builders
7
7
  # Builds project skeleton with Gemfile configuration.
8
+ # rubocop:todo Metrics/ClassLength
8
9
  class Bundler < Rubysmith::Builders::Bundler
9
10
  using Refinements::Structs
10
11
 
@@ -32,6 +33,10 @@ module Hanamismith
32
33
  "source",
33
34
  %(gem "hanami", github: "hanami/hanami", branch: "main"\n)
34
35
  )
36
+ .insert_after(
37
+ "source",
38
+ %(gem "hanami-assets", github: "hanami/assets", branch: "main"\n)
39
+ )
35
40
  .insert_after(
36
41
  "source",
37
42
  %(gem "hanami-cli", github: "hanami/cli", branch: "main"\n)
@@ -69,8 +74,13 @@ module Hanamismith
69
74
  .insert_after("source", %(\ngem "sequel", "~> 5.68"\n))
70
75
  end
71
76
 
77
+ # rubocop:todo Metrics/MethodLength
72
78
  def alter_groups
73
79
  with_template.insert_after(/group :code_quality/, %( gem "rubocop-sequel", "~> 0.3"\n))
80
+ .insert_after(
81
+ /group :development do/,
82
+ %( gem "hanami-webconsole", github: "hanami/webconsole", branch: "main"\n)
83
+ )
74
84
  .insert_after(/group :development do/, %( gem "localhost", "~> 1.1"\n))
75
85
  .insert_after(/group :development do/, %( gem "rerun", "~> 0.14"\n))
76
86
  .insert_after(/group :test/, %( gem "capybara", "~> 3.39"\n))
@@ -80,12 +90,14 @@ module Hanamismith
80
90
  .insert_after(/group :test/, %( gem "rack-test", "~> 2.1"\n))
81
91
  .insert_after(/group :test/, %( gem "rom-factory", "~> 0.11"\n))
82
92
  end
93
+ # rubocop:enable Metrics/MethodLength
83
94
 
84
95
  def append_development_group
85
96
  return if configuration.markdown? || configuration.build_rake || configuration.build_yard
86
97
 
87
98
  with_template.append <<~CONTENT
88
99
  group :development do
100
+ gem "hanami-webconsole", github: "hanami/webconsole", branch: "main"
89
101
  gem "localhost", "~> 1.1"
90
102
  gem "rerun", "~> 0.14"
91
103
  end
@@ -128,4 +140,5 @@ module Hanamismith
128
140
  end
129
141
  end
130
142
  end
143
+ # rubocop:enable Metrics/ClassLength
131
144
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+
5
+ module Hanamismith
6
+ module Builders
7
+ module Git
8
+ # Builds project skeleton Git ignore.
9
+ class Ignore < Rubysmith::Builders::Git::Ignore
10
+ using Refinements::Structs
11
+
12
+ def call
13
+ return configuration unless configuration.build_git
14
+
15
+ super
16
+ builder.call(configuration.merge(template_path: "%project_name%/.gitignore.erb"))
17
+ .insert_before("tmp\n", "node_modules\n")
18
+ .insert_before("tmp\n", "public\n")
19
+
20
+ configuration
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :configuration, :builder
26
+ end
27
+ end
28
+ end
29
+ end
@@ -16,7 +16,7 @@ module Hanamismith
16
16
  end
17
17
 
18
18
  def call
19
- path = "%project_name%/public/icon.svg.erb"
19
+ path = "%project_name%/app/assets/images/icon.svg.erb"
20
20
  builder.call(configuration.merge(template_path: path)).render
21
21
  configuration
22
22
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+
5
+ module Hanamismith
6
+ module Builders
7
+ # Builds project skeleton javascript.
8
+ class Javascript
9
+ using Refinements::Structs
10
+
11
+ def self.call(...) = new(...).call
12
+
13
+ def initialize configuration, builder: Rubysmith::Builder
14
+ @configuration = configuration
15
+ @builder = builder
16
+ end
17
+
18
+ def call
19
+ path = "%project_name%/slices/home/assets/js/app.js.erb"
20
+ builder.call(configuration.merge(template_path: path)).render
21
+ configuration
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :configuration, :builder
27
+ end
28
+ end
29
+ end
@@ -4,8 +4,8 @@ require "refinements/structs"
4
4
 
5
5
  module Hanamismith
6
6
  module Builders
7
- # Builds project skeleton Rack support.
8
- class Rack
7
+ # Builds project skeleton for Node.
8
+ class Node
9
9
  using Refinements::Structs
10
10
 
11
11
  def self.call(...) = new(...).call
@@ -16,7 +16,8 @@ module Hanamismith
16
16
  end
17
17
 
18
18
  def call
19
- builder.call(configuration.merge(template_path: "%project_name%/config.ru.erb")).render
19
+ path = "%project_name%/package.json.erb"
20
+ builder.call(configuration.merge(template_path: path)).render
20
21
  configuration
21
22
  end
22
23
 
@@ -16,7 +16,7 @@ module Hanamismith
16
16
  end
17
17
 
18
18
  def call
19
- path = "%project_name%/public/manifest.webmanifest.erb"
19
+ path = "%project_name%/app/assets/pwa/manifest.webmanifest.erb"
20
20
  builder.call(configuration.merge(template_path: path)).render
21
21
  configuration
22
22
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+
5
+ module Hanamismith
6
+ module Builders
7
+ module Rack
8
+ # Builds project skeleton.
9
+ class Attack
10
+ using Refinements::Structs
11
+
12
+ def self.call(...) = new(...).call
13
+
14
+ def initialize configuration, builder: Rubysmith::Builder
15
+ @configuration = configuration
16
+ @builder = builder
17
+ end
18
+
19
+ def call
20
+ add_configuration
21
+ add_middleware
22
+ configuration
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :configuration, :builder
28
+
29
+ def add_configuration
30
+ template_path = "%project_name%/config/initializers/rack_attack.rb.erb"
31
+ builder.call(configuration.merge(template_path:)).render
32
+ end
33
+
34
+ def add_middleware
35
+ builder.call(configuration.merge(template_path: "%project_name%/config/app.rb.erb"))
36
+ .insert_after(/require/, %(\nrequire_relative "initializers/rack_attack"\n))
37
+ .insert_before(/environment/, " config.middleware.use Rack::Attack\n\n")
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+
5
+ module Hanamismith
6
+ module Builders
7
+ module Rack
8
+ # Builds project skeleton.
9
+ class Configuration
10
+ using Refinements::Structs
11
+
12
+ def self.call(...) = new(...).call
13
+
14
+ def initialize configuration, builder: Rubysmith::Builder
15
+ @configuration = configuration
16
+ @builder = builder
17
+ end
18
+
19
+ def call
20
+ builder.call(configuration.merge(template_path: "%project_name%/config.ru.erb")).render
21
+ configuration
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :configuration, :builder
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/structs"
4
+
5
+ module Hanamismith
6
+ module Builders
7
+ module Rack
8
+ # Builds project skeleton.
9
+ class Deflater
10
+ using Refinements::Structs
11
+
12
+ def self.call(...) = new(...).call
13
+
14
+ def initialize configuration, builder: Rubysmith::Builder
15
+ @configuration = configuration
16
+ @builder = builder
17
+ end
18
+
19
+ def call
20
+ builder.call(configuration.merge(template_path: "%project_name%/config/app.rb.erb"))
21
+ .insert_after(/Rack::Attack/, " config.middleware.use Rack::Deflater\n")
22
+
23
+ configuration
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :configuration, :builder
29
+ end
30
+ end
31
+ end
32
+ end
@@ -21,6 +21,7 @@ module Hanamismith
21
21
  def append
22
22
  builder.call(configuration.merge(template_path: "%project_name%/bin/setup.erb"))
23
23
  .append(<<~CONTENT)
24
+ npm install
24
25
 
25
26
  hanami db create
26
27
  hanami db migrate
@@ -45,9 +45,26 @@ module Hanamismith
45
45
  builder.call(configuration.merge(template_path: path))
46
46
  .render
47
47
  .replace("<!-- title -->", "<%= content_for :title %>")
48
+ .replace("<!-- favicon -->", favicon)
49
+ .replace("<!-- manifest -->", manifest)
50
+ .replace("<!-- stylesheet -->", stylesheet)
48
51
  .replace("<!-- yield -->", "<%= yield %>")
49
52
  end
50
53
 
54
+ def favicon
55
+ %(<%= favicon_tag "icon.svg", title: "#{configuration.project_label}: Icon", rel: ) +
56
+ %(:icon, type: "image/svg+xml" %>)
57
+ end
58
+
59
+ def manifest
60
+ %(<%= tag.link title: "#{configuration.project_label}: Manifest", rel: ) +
61
+ %(:manifest, href: asset_url("manifest.webmanifest") %>)
62
+ end
63
+
64
+ def stylesheet
65
+ %(<%= stylesheet_tag "home/app", title: "#{configuration.project_label}: Stylesheet" %>)
66
+ end
67
+
51
68
  def add_show_template
52
69
  path = "%project_name%/slices/home/templates/show.html.erb.erb"
53
70
 
@@ -16,7 +16,7 @@ module Hanamismith
16
16
  end
17
17
 
18
18
  def call
19
- path = "%project_name%/public/stylesheets/home.css.erb"
19
+ path = "%project_name%/slices/home/assets/css/app.css.erb"
20
20
  builder.call(configuration.merge(template_path: path)).render
21
21
  configuration
22
22
  end
@@ -9,7 +9,7 @@ module Hanamismith
9
9
  class Build < Sod::Command
10
10
  include Hanamismith::Import[:input, :logger]
11
11
 
12
- # Order is important.
12
+ # Order matters.
13
13
  BUILDERS = [
14
14
  Rubysmith::Builders::Init,
15
15
  Builders::Core,
@@ -17,6 +17,7 @@ module Hanamismith
17
17
  Builders::Refinement,
18
18
  Builders::Icon,
19
19
  Builders::Stylesheet,
20
+ Builders::Javascript,
20
21
  Builders::PWA,
21
22
  Builders::Slices::Home,
22
23
  Builders::Slices::Health,
@@ -26,9 +27,11 @@ module Hanamismith
26
27
  Rubysmith::Builders::Documentation::License,
27
28
  Rubysmith::Builders::Documentation::Version,
28
29
  Rubysmith::Builders::Git::Setup,
29
- Rubysmith::Builders::Git::Ignore,
30
+ Builders::Git::Ignore,
30
31
  Rubysmith::Builders::Git::Safe,
31
32
  Builders::Bundler,
33
+ Builders::Node,
34
+ Builders::Asset,
32
35
  Builders::Rake,
33
36
  Builders::Binstub,
34
37
  Builders::Console,
@@ -45,7 +48,9 @@ module Hanamismith
45
48
  Builders::RSpec::Factory,
46
49
  Builders::RSpec::Helper,
47
50
  Builders::RSpec::Hanami,
48
- Builders::Rack,
51
+ Builders::Rack::Configuration,
52
+ Builders::Rack::Attack,
53
+ Builders::Rack::Deflater,
49
54
  Builders::Puma::Configuration,
50
55
  Builders::Puma::Procfile,
51
56
  Builders::Caliber,
@@ -53,6 +58,7 @@ module Hanamismith
53
58
  Rubysmith::Extensions::Pragmater,
54
59
  Rubysmith::Extensions::Tocer,
55
60
  Rubysmith::Extensions::Rubocop,
61
+ Extensions::NPM,
56
62
  Builders::Environments::Development,
57
63
  Builders::Environments::Test,
58
64
  Builders::Git::Commit
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/ios"
4
+ require "refinements/pathnames"
5
+ require "rubocop"
6
+
7
+ module Hanamismith
8
+ module Extensions
9
+ # Ensures NPM packages are installed if NPM is available.
10
+ class NPM
11
+ include Import[:kernel, :logger]
12
+
13
+ using Refinements::IOs
14
+ using Refinements::Pathnames
15
+
16
+ def self.call(...) = new(...).call
17
+
18
+ def initialize(configuration, **)
19
+ super(**)
20
+ @configuration = configuration
21
+ end
22
+
23
+ def call
24
+ logger.error { "Unable to detect NPM. Install NPM and run: `npm install`." } unless run
25
+ configuration
26
+ end
27
+
28
+ private
29
+
30
+ attr_reader :configuration
31
+
32
+ def run
33
+ success = false
34
+
35
+ configuration.project_root.change_dir do
36
+ STDOUT.squelch { success = kernel.system "command -v npm && npm install" }
37
+ end
38
+
39
+ success
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1 +1,2 @@
1
- web: rerun --dir app,config,lib,public,slices --pattern="**/*.{css,erb,js,rb}" -- bundle exec puma --config ./config/puma.rb
1
+ web: rerun --dir app,config,lib,slices --pattern="**/*.{erb,rb}" -- bundle exec puma --config ./config/puma.rb
2
+ assets: bundle exec hanami assets watch
@@ -1 +1,2 @@
1
1
  web: bundle exec puma --config ./config/puma.rb
2
+ assets: bundle exec hanami assets compile
@@ -17,5 +17,5 @@
17
17
  "display": "standalone",
18
18
  "start_url": "/",
19
19
  "scope": "/",
20
- "theme_color": "#E39184"
20
+ "theme_color": "#000000"
21
21
  }
@@ -1,5 +1,4 @@
1
1
  require "hanami"
2
- require "rack/attack"
3
2
 
4
3
  <% namespace do %>
5
4
  # Defines global application configuration.
@@ -12,14 +11,6 @@ require "rack/attack"
12
11
  csp[:script_src] += " 'unsafe-eval' 'unsafe-inline' https://unpkg.com/"
13
12
  end
14
13
 
15
- Rack::Attack.safelist("allow localhost") { |request| %w[127.0.0.1 ::1].include? request.ip }
16
- Rack::Attack.throttle("requests by IP", limit: 100, period: 60, &:ip)
17
-
18
- config.middleware.use Rack::Attack
19
- config.middleware.use Rack::Deflater
20
- config.middleware.use Rack::Static,
21
- {root: "public", urls: %w[/icon.svg /manifest.webmanifest /stylesheets]}
22
-
23
14
  environment :development do
24
15
  # :nocov:
25
16
  config.logger.options[:colorize] = true
@@ -0,0 +1,3 @@
1
+ import * as assets from "hanami-assets";
2
+
3
+ await assets.run();
@@ -0,0 +1,16 @@
1
+ require "ipaddr"
2
+ require "rack/attack"
3
+
4
+ private_subnets = [
5
+ IPAddr.new("10.0.0.0/8"),
6
+ IPAddr.new("172.16.0.0/12"),
7
+ IPAddr.new("192.168.0.0/16"),
8
+ IPAddr.new("127.0.0.1"),
9
+ IPAddr.new("::1")
10
+ ]
11
+
12
+ Rack::Attack.safelist "allow private network" do |request|
13
+ private_subnets.any? { |subnet| subnet.include? request.ip }
14
+ end
15
+
16
+ Rack::Attack.throttle("requests by IP", limit: 100, period: 60, &:ip)
@@ -6,17 +6,17 @@ require "localhost" if development
6
6
  Bundler.require :tools if development
7
7
  Bundler.root.join("tmp").then { |path| path.mkdir unless path.exist? }
8
8
 
9
- max_threads_count = ENV.fetch "HANAMI_MAX_THREADS", 5
10
- min_threads_count = ENV.fetch "HANAMI_MIN_THREADS", max_threads_count
11
- threads min_threads_count, max_threads_count
9
+ max_threads = ENV.fetch "HANAMI_MAX_THREADS", 5
10
+ min_threads = ENV.fetch "HANAMI_MIN_THREADS", max_threads
11
+ concurrency = ENV.fetch "HANAMI_WEB_CONCURRENCY", Concurrent.physical_processor_count
12
12
 
13
+ threads min_threads, max_threads
13
14
  port ENV.fetch "HANAMI_PORT", 2300
14
15
  environment ENV.fetch "HANAMI_ENV", "development"
15
- workers ENV.fetch "HANAMI_WEB_CONCURRENCY", Concurrent.physical_processor_count
16
+ workers concurrency
16
17
  worker_timeout 3600 if development
17
- ssl_bind "localhost", "9050" if development
18
+ ssl_bind "localhost", 2443 if development
18
19
  pidfile ENV.fetch "PIDFILE", "tmp/server.pid"
19
- on_worker_boot { Hanami.shutdown }
20
20
  plugin :tmp_restart
21
21
 
22
- preload_app!
22
+ preload_app! && before_fork { Hanami.shutdown } if concurrency.to_i.positive?
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "<%= configuration.project_name %>",
3
+ "description": "",
4
+ "version": "<%= configuration.project_version %>",
5
+ "author": "<%= configuration.author_name %>",
6
+ "license": "<%= configuration.license_label_version %>",
7
+ "private": true,
8
+ "type": "module",
9
+ "keywords": ["ruby", "hanami"],
10
+ "scripts": {
11
+ "assets": "node config/assets.js"
12
+ },
13
+ "dependencies": {
14
+ "hanami-assets": "^2.1.0-rc.2"
15
+ }
16
+ }
@@ -10,27 +10,30 @@ html {
10
10
  --font-family: Verdana;
11
11
 
12
12
  background-color: var(--color-white);
13
- background-image:
14
- radial-gradient(at 17% 25%, var(--color-rose) 0px, transparent 50%),
15
- radial-gradient(at 17% 68%, var(--color-rose) 0px, transparent 50%),
16
- radial-gradient(at 50% 45%, var(--color-pink) 0px, transparent 50%),
17
- radial-gradient(at 81% 25%, var(--color-rose) 0px, transparent 50%),
18
- radial-gradient(at 81% 68%, var(--color-rose) 0px, transparent 50%),
19
- radial-gradient(at 9% 7%, var(--color-red) 0px, transparent 50%),
20
- radial-gradient(at 9% 93%, var(--color-red) 0px, transparent 50%),
21
- radial-gradient(at 91% 7%, var(--color-red) 0px, transparent 50%),
22
- radial-gradient(at 91% 93%, var(--color-red) 0px, transparent 50%);
23
- background-repeat: no-repeat;
13
+ background-image: linear-gradient(
14
+ 0deg,
15
+ hsl(351deg 100% 95%) 0%,
16
+ hsl(352deg 100% 96%) 16%,
17
+ hsl(352deg 100% 98%) 24%,
18
+ hsl(352deg 100% 99%) 30%,
19
+ hsl(300deg 100% 100%) 35%,
20
+ hsl(300deg 100% 100%) 40%,
21
+ hsl(300deg 100% 100%) 45%,
22
+ hsl(0deg 0% 100%) 50%,
23
+ hsl(300deg 100% 100%) 55%,
24
+ hsl(300deg 100% 100%) 60%,
25
+ hsl(300deg 100% 100%) 65%,
26
+ hsl(300deg 100% 100%) 70%,
27
+ hsl(300deg 100% 100%) 76%,
28
+ hsl(300deg 100% 100%) 84%,
29
+ hsl(0deg 0% 100%) 100%
30
+ );
24
31
  display: flex;
25
32
  flex-direction: column;
26
33
  font-family: var(--font-family);
27
34
  justify-content: space-between;
28
35
  min-height: 97vh;
29
36
 
30
- .link {
31
- color: var(--color-white);
32
- }
33
-
34
37
  .navigation {
35
38
  align-items: center;
36
39
  display: flex;
@@ -0,0 +1 @@
1
+ import "../css/app.css";
@@ -16,13 +16,13 @@
16
16
  rel="icon"
17
17
  href="https://alchemists.io/images/projects/hanamismith/icons/favicon.ico"
18
18
  sizes="32x32">
19
- <link title="<%= configuration.project_label %>: Icon" rel="icon" href="/icon.svg" type="image/svg+xml">
19
+ <!-- favicon -->
20
20
  <link title="<%= configuration.project_label %>: Apple Icon"
21
21
  rel="apple-touch-icon"
22
22
  href="https://alchemists.io/images/projects/hanamismith/icons/apple.png"
23
23
  type="image/png">
24
- <link title="<%= configuration.project_label %>: Manifest" rel="manifest" href="/manifest.webmanifest">
25
- <link title="<%= configuration.project_label %>: Stylesheet" rel="stylesheet" href="/stylesheets/home.css" type="text/css">
24
+ <!-- manifest -->
25
+ <!-- stylesheet -->
26
26
  </head>
27
27
 
28
28
  <body class="home-page">
data/lib/hanamismith.rb CHANGED
@@ -7,6 +7,7 @@ Zeitwerk::Loader.new.then do |loader|
7
7
  loader.inflector.inflect "cli" => "CLI",
8
8
  "ci" => "CI",
9
9
  "htmx" => "HTMX",
10
+ "npm" => "NPM",
10
11
  "pwa" => "PWA",
11
12
  "rspec" => "RSpec"
12
13
  loader.tag = File.basename __FILE__, ".rb"
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: 0.22.1
4
+ version: 0.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brooke Kuhlmann
@@ -35,7 +35,7 @@ cert_chain:
35
35
  3n5C8/6Zh9DYTkpcwPSuIfAga6wf4nXc9m6JAw8AuMLaiWN/r/2s4zJsUHYERJEu
36
36
  gZGm4JqtuSg8pYjPeIJxS960owq+SfuC+jxqmRA54BisFCv/0VOJi7tiJVY=
37
37
  -----END CERTIFICATE-----
38
- date: 2023-11-17 00:00:00.000000000 Z
38
+ date: 2023-12-02 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: cogger
@@ -107,20 +107,6 @@ dependencies:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0.2'
110
- - !ruby/object:Gem::Dependency
111
- name: hanami
112
- requirement: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - "~>"
115
- - !ruby/object:Gem::Version
116
- version: '2.0'
117
- type: :runtime
118
- prerelease: false
119
- version_requirements: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - "~>"
122
- - !ruby/object:Gem::Version
123
- version: '2.0'
124
110
  - !ruby/object:Gem::Dependency
125
111
  name: htmx
126
112
  requirement: !ruby/object:Gem::Requirement
@@ -248,6 +234,7 @@ files:
248
234
  - exe/hanamismith
249
235
  - hanamismith.gemspec
250
236
  - lib/hanamismith.rb
237
+ - lib/hanamismith/builders/asset.rb
251
238
  - lib/hanamismith/builders/binstub.rb
252
239
  - lib/hanamismith/builders/bundler.rb
253
240
  - lib/hanamismith/builders/caliber.rb
@@ -259,13 +246,18 @@ files:
259
246
  - lib/hanamismith/builders/environments/development.rb
260
247
  - lib/hanamismith/builders/environments/test.rb
261
248
  - lib/hanamismith/builders/git/commit.rb
249
+ - lib/hanamismith/builders/git/ignore.rb
262
250
  - lib/hanamismith/builders/guard.rb
263
251
  - lib/hanamismith/builders/icon.rb
252
+ - lib/hanamismith/builders/javascript.rb
253
+ - lib/hanamismith/builders/node.rb
264
254
  - lib/hanamismith/builders/providers/persistence.rb
265
255
  - lib/hanamismith/builders/puma/configuration.rb
266
256
  - lib/hanamismith/builders/puma/procfile.rb
267
257
  - lib/hanamismith/builders/pwa.rb
268
- - lib/hanamismith/builders/rack.rb
258
+ - lib/hanamismith/builders/rack/attack.rb
259
+ - lib/hanamismith/builders/rack/configuration.rb
260
+ - lib/hanamismith/builders/rack/deflater.rb
269
261
  - lib/hanamismith/builders/rake.rb
270
262
  - lib/hanamismith/builders/refinement.rb
271
263
  - lib/hanamismith/builders/rspec/application_shared_context.rb
@@ -280,6 +272,7 @@ files:
280
272
  - lib/hanamismith/cli/commands/build.rb
281
273
  - lib/hanamismith/cli/shell.rb
282
274
  - lib/hanamismith/container.rb
275
+ - lib/hanamismith/extensions/npm.rb
283
276
  - lib/hanamismith/import.rb
284
277
  - lib/hanamismith/templates/%project_name%/.circleci/config.yml.erb
285
278
  - lib/hanamismith/templates/%project_name%/.github/workflows/ci.yml.erb
@@ -287,11 +280,15 @@ files:
287
280
  - lib/hanamismith/templates/%project_name%/Procfile.dev.erb
288
281
  - lib/hanamismith/templates/%project_name%/Procfile.erb
289
282
  - lib/hanamismith/templates/%project_name%/app/action.rb.erb
283
+ - lib/hanamismith/templates/%project_name%/app/assets/images/icon.svg.erb
284
+ - lib/hanamismith/templates/%project_name%/app/assets/pwa/manifest.webmanifest.erb
290
285
  - lib/hanamismith/templates/%project_name%/app/repository.rb.erb
291
286
  - lib/hanamismith/templates/%project_name%/app/view.rb.erb
292
287
  - lib/hanamismith/templates/%project_name%/bin/hanami.erb
293
288
  - lib/hanamismith/templates/%project_name%/config.ru.erb
294
289
  - lib/hanamismith/templates/%project_name%/config/app.rb.erb
290
+ - lib/hanamismith/templates/%project_name%/config/assets.js.erb
291
+ - lib/hanamismith/templates/%project_name%/config/initializers/rack_attack.rb.erb
295
292
  - lib/hanamismith/templates/%project_name%/config/providers/persistence.rb.erb
296
293
  - lib/hanamismith/templates/%project_name%/config/puma.rb.erb
297
294
  - lib/hanamismith/templates/%project_name%/config/routes.rb.erb
@@ -300,12 +297,12 @@ files:
300
297
  - lib/hanamismith/templates/%project_name%/env.test.erb
301
298
  - lib/hanamismith/templates/%project_name%/lib/%project_path%/refines/actions/response.rb.erb
302
299
  - lib/hanamismith/templates/%project_name%/lib/%project_path%/types.rb.erb
303
- - lib/hanamismith/templates/%project_name%/public/icon.svg.erb
304
- - lib/hanamismith/templates/%project_name%/public/manifest.webmanifest.erb
305
- - lib/hanamismith/templates/%project_name%/public/stylesheets/home.css.erb
300
+ - lib/hanamismith/templates/%project_name%/package.json.erb
306
301
  - lib/hanamismith/templates/%project_name%/slices/health/actions/show.rb.erb
307
302
  - lib/hanamismith/templates/%project_name%/slices/home/action.rb.erb
308
303
  - lib/hanamismith/templates/%project_name%/slices/home/actions/show.rb.erb
304
+ - lib/hanamismith/templates/%project_name%/slices/home/assets/css/app.css.erb
305
+ - lib/hanamismith/templates/%project_name%/slices/home/assets/js/app.js.erb
309
306
  - lib/hanamismith/templates/%project_name%/slices/home/repository.rb.erb
310
307
  - lib/hanamismith/templates/%project_name%/slices/home/templates/layouts/app.html.erb.erb
311
308
  - lib/hanamismith/templates/%project_name%/slices/home/templates/show.html.erb.erb
metadata.gz.sig CHANGED
Binary file