Compare commits
1 commit
main
...
roda-views
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2543c54446 |
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -1,4 +0,0 @@
|
||||||
/.rake_tasks~
|
|
||||||
/temp.db
|
|
||||||
/vendor/
|
|
||||||
/bin/
|
|
||||||
7
Gemfile
7
Gemfile
|
|
@ -4,13 +4,6 @@ gem 'roda'
|
||||||
gem 'rack-unreloader'
|
gem 'rack-unreloader'
|
||||||
gem 'tilt'
|
gem 'tilt'
|
||||||
gem 'erubi'
|
gem 'erubi'
|
||||||
gem 'sequel'
|
|
||||||
gem 'rake'
|
|
||||||
|
|
||||||
# Change to whatever database you plan to use
|
|
||||||
gem 'sqlite3'
|
|
||||||
# gem 'pg' # will also want gem sequel-pg
|
|
||||||
# gem 'mysql2'
|
|
||||||
|
|
||||||
# change to gunicorn or passenger if you prefer:
|
# change to gunicorn or passenger if you prefer:
|
||||||
gem 'puma'
|
gem 'puma'
|
||||||
|
|
|
||||||
60
README.md
60
README.md
|
|
@ -2,8 +2,6 @@
|
||||||
|
|
||||||
For the single file app template, really the only file you need is the config.ru and run it with puma.
|
For the single file app template, really the only file you need is the config.ru and run it with puma.
|
||||||
|
|
||||||
## Database
|
|
||||||
|
|
||||||
## Views
|
## Views
|
||||||
|
|
||||||
In this template, I've taken the single-file template and split up the config.ru to put routes and app logic in app.rb and call on templates to render proper html pages. `tilt` and `erubi` gems are added to do the rendering, and `rack-unreloader` gem is added to have puma automatically load file changes while running in development mode.
|
In this template, I've taken the single-file template and split up the config.ru to put routes and app logic in app.rb and call on templates to render proper html pages. `tilt` and `erubi` gems are added to do the rendering, and `rack-unreloader` gem is added to have puma automatically load file changes while running in development mode.
|
||||||
|
|
@ -14,17 +12,6 @@ Next Roda app template iterations will add database, then authentication.
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
### Get git
|
|
||||||
|
|
||||||
```
|
|
||||||
sudo apt install git
|
|
||||||
git config --global user.email "myemail@gmail.com"
|
|
||||||
git config --global user.name "Full Name"
|
|
||||||
git config --global credential.helper "cache"
|
|
||||||
|
|
||||||
git clone https://path/to/project.git
|
|
||||||
```
|
|
||||||
|
|
||||||
### Prereq installs
|
### Prereq installs
|
||||||
|
|
||||||
Will need ruby; install it via package manager or a ruby manager like rbenv/ruby-build. Will need the roda gem, and then an application server such as puma (recommended), gunicorn, or passenger. My examples will use system ruby and puma.
|
Will need ruby; install it via package manager or a ruby manager like rbenv/ruby-build. Will need the roda gem, and then an application server such as puma (recommended), gunicorn, or passenger. My examples will use system ruby and puma.
|
||||||
|
|
@ -34,64 +21,31 @@ Will need ruby; install it via package manager or a ruby manager like rbenv/ruby
|
||||||
With this example, will basically just ignore the project's Gemfile. Debian 12 has a pretty current ruby version so just using it.
|
With this example, will basically just ignore the project's Gemfile. Debian 12 has a pretty current ruby version so just using it.
|
||||||
|
|
||||||
```
|
```
|
||||||
sudo apt install ruby ruby-rack puma ruby-erubi ruby-tilt ruby-sequel ruby-sqlite3 rake
|
sudo apt install ruby ruby-rack puma ruby-erubi ruby-tilt
|
||||||
sudo gem install roda rack-unreloader
|
sudo gem install roda rack-unreloader
|
||||||
|
|
||||||
cd my-project
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Option 2a: Bundler system package
|
#### Option 2: Bundler
|
||||||
|
|
||||||
Run the bundle install command from the project's root directory
|
Run the bundle command from the project's root directory
|
||||||
|
|
||||||
```
|
```
|
||||||
sudo apt install ruby ruby-bundler ruby-dev gcc pkgconf make g++ libyaml-dev libffi-dev
|
sudo apt install ruby ruby-bundler
|
||||||
echo 'gem: --no-document' >> ~/.gemrc
|
bundle config set --local path 'vendor/bundle'
|
||||||
sudo cp ~/.gemrc /root/
|
|
||||||
bundle config set --global path 'vendor/bundle'
|
|
||||||
sudo cp -r .bundle /root/
|
|
||||||
|
|
||||||
cd my-project
|
|
||||||
bundle install
|
bundle install
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Option 2b: Bundler system gem (recommended)
|
|
||||||
|
|
||||||
Similar to above but might as well use the gem install to get the latest bundler. The Debian apt packaged bundler is currently a bit outdated and missing some features compared to the latest.
|
|
||||||
|
|
||||||
```
|
|
||||||
sudo apt install ruby ruby-dev gcc pkgconf make g++ libyaml-dev # zlib1g-dev libffi-dev #(for rails stuff)
|
|
||||||
echo 'gem: --no-document' >> ~/.gemrc
|
|
||||||
sudo cp ~/.gemrc /root/
|
|
||||||
sudo gem install bundler
|
|
||||||
bundle config set --global path 'vendor/bundle'
|
|
||||||
sudo cp -r .bundle /root/
|
|
||||||
|
|
||||||
cd my-project
|
|
||||||
bundle install
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Option 3: Rbenv Ruby
|
|
||||||
|
|
||||||
Todo
|
|
||||||
|
|
||||||
## Run it
|
## Run it
|
||||||
|
|
||||||
In the project root directory:
|
In the project root directory:
|
||||||
|
|
||||||
```
|
```
|
||||||
bundle exec puma
|
|
||||||
|
|
||||||
# or if you did not use bundler to install puma...
|
|
||||||
puma
|
puma
|
||||||
```
|
```
|
||||||
|
|
||||||
This default to development mode. Run it in production mode with:
|
This default to development mode. Run it in production mode with:
|
||||||
|
|
||||||
```
|
```
|
||||||
RACK_ENV=production bundle exec puma
|
|
||||||
|
|
||||||
# or if you did not install puma
|
|
||||||
RACK_ENV=production puma
|
RACK_ENV=production puma
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -99,7 +53,7 @@ For development, just run it like that. For production, probably want to set up
|
||||||
|
|
||||||
### Run it with systemd in production
|
### Run it with systemd in production
|
||||||
|
|
||||||
Copy the example myapp.service file to `/etc/systemd/system/` and edit accordingly. The example assumes a user named "myapp" with a group name "myapp", the application files are in `/opt/myapp/`, and puma is the system puma. If you installed puma with bundler, the exe will be at `/opt/myapp/vendor/bundle/ruby/3.1.0/bin/puma`.
|
Copy the example myapp.service file to `/etc/systemd/system/` and edit accordingly. The example assumes a user named "myapp" with a group name "myapp", the application files are in `/opt/myapp/`, and puma is the system puma.
|
||||||
|
|
||||||
### Notes
|
### Notes
|
||||||
|
|
||||||
|
|
@ -109,7 +63,7 @@ This has puma reload with any file changes while you are working on the app, whe
|
||||||
|
|
||||||
<https://github.com/jeremyevans/rack-unreloader>.
|
<https://github.com/jeremyevans/rack-unreloader>.
|
||||||
|
|
||||||
Basically, you require the app from the config.ru, and then within you app files, any "require_relative" will be "Unreloader.require" instead, plus you do need to include the file extension.
|
Basically, you require the app from the config.ru, and then within you app files, any "require_relative" will be "Unreloader.require" instead, plus you do need to include the file extension when using Unreloader.require.
|
||||||
|
|
||||||
In config.ru, the `dev =` line stores true or false depending on the RACK_ENV environment variable (see above for changing from default development). Then the `:reload=>dev` uses the dev variable to tell Unreload to reload files or not. Lastly the `run` command uses the dev variable to choose between running Unreloader, or bypass Unreloader and run App like normal in production.
|
In config.ru, the `dev =` line stores true or false depending on the RACK_ENV environment variable (see above for changing from default development). Then the `:reload=>dev` uses the dev variable to tell Unreload to reload files or not. Lastly the `run` command uses the dev variable to choose between running Unreloader, or bypass Unreloader and run App like normal in production.
|
||||||
|
|
||||||
|
|
|
||||||
33
Rakefile
33
Rakefile
|
|
@ -1,33 +0,0 @@
|
||||||
namespace :db do
|
|
||||||
|
|
||||||
migrator = lambda do |version|
|
|
||||||
require_relative 'db'
|
|
||||||
Sequel.extension :migration
|
|
||||||
Sequel::Migrator.apply(DB, 'migrate', version)
|
|
||||||
end
|
|
||||||
|
|
||||||
namespace :migrate do
|
|
||||||
|
|
||||||
desc "Perform migration up to latest migration available"
|
|
||||||
task :up do
|
|
||||||
migrator.call(nil)
|
|
||||||
end
|
|
||||||
|
|
||||||
desc "Perform migration all the way down (erase all data)"
|
|
||||||
task :down do
|
|
||||||
migrator.call(0)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
desc "Erase all data, then bring back to latest migration"
|
|
||||||
task :reset do
|
|
||||||
migrator.call(0)
|
|
||||||
Sequel::Migrator.apply(DB, 'migrate')
|
|
||||||
end
|
|
||||||
|
|
||||||
#desc "Migrate to a specific version"
|
|
||||||
#task :migrate do |version|
|
|
||||||
#end
|
|
||||||
|
|
||||||
end
|
|
||||||
7
app.rb
7
app.rb
|
|
@ -14,12 +14,6 @@ class App < Roda
|
||||||
view :index
|
view :index
|
||||||
end
|
end
|
||||||
|
|
||||||
r.is 'users' do
|
|
||||||
@users = User.order(:id)
|
|
||||||
view :users
|
|
||||||
end
|
|
||||||
|
|
||||||
r.on 'hello' do
|
|
||||||
r.is String do |name|
|
r.is String do |name|
|
||||||
@page_title = 'A Custom Greeting'
|
@page_title = 'A Custom Greeting'
|
||||||
@name = name.capitalize
|
@name = name.capitalize
|
||||||
|
|
@ -27,5 +21,4 @@ class App < Roda
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,7 @@ dev = ENV['RACK_ENV'] == 'development'
|
||||||
|
|
||||||
require 'rack/unreloader'
|
require 'rack/unreloader'
|
||||||
|
|
||||||
Unreloader = Rack::Unreloader.new(:subclasses=>%w'Roda Sequel::Model', reload: dev, autoload: dev){App}
|
Unreloader = Rack::Unreloader.new(:subclasses=>%w'Roda', :reload=>dev){App}
|
||||||
Unreloader.require './models.rb'
|
|
||||||
Unreloader.require './app.rb'
|
Unreloader.require './app.rb'
|
||||||
|
|
||||||
run(dev ? Unreloader : App)
|
run(dev ? Unreloader : App)
|
||||||
|
|
|
||||||
4
db.rb
4
db.rb
|
|
@ -1,4 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
require 'sequel/core'
|
|
||||||
|
|
||||||
DB = Sequel.connect('sqlite://temp.db')
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
Sequel.migration do
|
|
||||||
change do
|
|
||||||
create_table(:users) do
|
|
||||||
primary_key :id
|
|
||||||
String :name, unique: true, null: false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
14
models.rb
14
models.rb
|
|
@ -1,14 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
require_relative 'db'
|
|
||||||
require 'sequel/model'
|
|
||||||
|
|
||||||
if ENV['RACK_ENV'] == 'development'
|
|
||||||
Sequel::Model.cache_associations = false
|
|
||||||
end
|
|
||||||
|
|
||||||
unless defined?(Unreloader)
|
|
||||||
require 'rack/unreloader'
|
|
||||||
Unreloader = Rack::Unreloader.new(reload: false, autoload: !ENV['NO_AUTOLOAD'])
|
|
||||||
end
|
|
||||||
|
|
||||||
Unreloader.autoload('models'){|f| Sequel::Model.send(:camelize, File.basename(f).sub(/\.rb\z/, ''))}
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
class User < Sequel::Model
|
|
||||||
end
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
<p class="subtitle">
|
<p class="subtitle is-3">
|
||||||
Hello, <%= @name %>!
|
Hello, <%= @name %>!
|
||||||
</p>
|
</p>
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
<p class="subtitle">
|
<p class="subtitle is-3">
|
||||||
Welcome to my new page! Running in <%= ENV['RACK_ENV'] %> mode!
|
Welcome to my new page!
|
||||||
</p>
|
</p>
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,16 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8"/>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title><%= @page_title || "My Website" %></title>
|
<title><%= @page_title || "My Website" %></title>
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@1/css/bulma.min.css">
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<section class="section">
|
<section class="section">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h1 class="title">
|
<h1 class="title is-1"><%= @page_title || 'Page Title Placeholder' %></h1>
|
||||||
<%= @page_title || 'Page Title Placeholder' %>
|
<% # maybe put a flash section here some day %>
|
||||||
</h1>
|
|
||||||
<%== yield %>
|
<%== yield %>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
<% for u in @users do %>
|
|
||||||
<p class="subtitle">
|
|
||||||
Hello, <%= u.name %>! You're #<%= u.id %>!
|
|
||||||
</p>
|
|
||||||
<% end %>
|
|
||||||
Loading…
Reference in a new issue