feat(example): add example app and blog app with demos
This commit is contained in:
1 parent
28e6bc3cf2
commit
7d2312b94b
13 files changed
+234
No files matched your search
@@ -0,0 +1,27 @@
|
|||||||
|
$LOAD_PATH.unshift(File.expand_path('lib', __dir__))
|
||||||
|
require 'prism'
|
||||||
|
require 'net/http'
|
||||||
|
require_relative 'examples/blog/app'
|
||||||
|
|
||||||
|
server = Prism::Server.new(Blog, port: 0).start
|
||||||
|
port = server.port
|
||||||
|
puts "blog demo server on port #{port}"
|
||||||
|
puts "database file: #{File.join(__dir__, 'examples/blog/db/development.pstore')}"
|
||||||
|
puts '-' * 40
|
||||||
|
|
||||||
|
Net::HTTP.start('127.0.0.1', port) do |http|
|
||||||
|
create = http.post(
|
||||||
|
'/posts',
|
||||||
|
URI.encode_www_form(title: 'Hello from Prism', body: 'This record was written through the ORM-lite file store.'),
|
||||||
|
'Content-Type' => 'application/x-www-form-urlencoded'
|
||||||
|
)
|
||||||
|
puts "POST /posts -> #{create.code} Location=#{create['location']}"
|
||||||
|
|
||||||
|
listing = http.get('/posts')
|
||||||
|
puts "GET /posts -> #{listing.code}"
|
||||||
|
puts listing.body
|
||||||
|
end
|
||||||
|
|
||||||
|
server.stop
|
||||||
|
puts '-' * 40
|
||||||
|
puts 'blog demo done (process about to exit; data stays on disk for the restart check)'
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
$LOAD_PATH.unshift(File.expand_path('lib', __dir__))
|
||||||
|
require 'prism'
|
||||||
|
require 'net/http'
|
||||||
|
require_relative 'examples/app'
|
||||||
|
|
||||||
|
server = Prism::Server.new(ExampleApp, port: 0).start
|
||||||
|
port = server.port
|
||||||
|
puts "demo server on port #{port}"
|
||||||
|
puts '-' * 40
|
||||||
|
|
||||||
|
Net::HTTP.start('127.0.0.1', port) do |http|
|
||||||
|
hello = http.get('/hello/Ruby')
|
||||||
|
puts "GET /hello/Ruby -> #{hello.code}"
|
||||||
|
puts hello.body
|
||||||
|
|
||||||
|
search = http.get('/search?q=prism&page=2')
|
||||||
|
puts "GET /search?q=prism&page=2 -> #{search.code} #{search.body}"
|
||||||
|
|
||||||
|
echo = http.post('/echo', JSON.generate(name: 'foksiu', role: 'admin'), 'Content-Type' => 'application/json')
|
||||||
|
puts "POST /echo -> #{echo.code} #{echo.body}"
|
||||||
|
|
||||||
|
files = http.get('/files/docs/readme.txt')
|
||||||
|
puts "GET /files/docs/readme.txt -> #{files.code} #{files.body}"
|
||||||
|
|
||||||
|
status = http.get('/api/status')
|
||||||
|
puts "GET /api/status -> #{status.code} #{status.body}"
|
||||||
|
|
||||||
|
first = http.get('/count')
|
||||||
|
cookie = first['set-cookie'].split(';').first
|
||||||
|
puts "GET /count -> #{first.body} (cookie issued: #{!first['set-cookie'].nil?})"
|
||||||
|
second = http.get('/count', 'Cookie' => cookie)
|
||||||
|
puts "GET /count (with cookie) -> #{second.body}"
|
||||||
|
|
||||||
|
redirect = http.get('/old')
|
||||||
|
puts "GET /old -> #{redirect.code} Location=#{redirect['location']}"
|
||||||
|
end
|
||||||
|
|
||||||
|
server.stop
|
||||||
|
puts '-' * 40
|
||||||
|
puts 'demo done'
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
$LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
|
||||||
|
require 'prism'
|
||||||
|
|
||||||
|
class ExampleApp < Prism::Application
|
||||||
|
enable_sessions(secret: 'prism-demo-secret')
|
||||||
|
use Prism::Middleware::Logger
|
||||||
|
|
||||||
|
helpers do
|
||||||
|
def layout(title, inner)
|
||||||
|
erb(<<~TEMPLATE, locals: { title: title, inner: inner })
|
||||||
|
<!doctype html>
|
||||||
|
<html><head><title><%= title %></title></head>
|
||||||
|
<body><%== inner %></body></html>
|
||||||
|
TEMPLATE
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
get '/' do
|
||||||
|
html('<h1>Prism</h1>')
|
||||||
|
end
|
||||||
|
|
||||||
|
get '/hello/:name' do
|
||||||
|
greeting = erb('<p>Hello, <%= name %>!</p>', locals: { name: params['name'] })
|
||||||
|
layout('Hello', greeting)
|
||||||
|
end
|
||||||
|
|
||||||
|
get '/search' do
|
||||||
|
json(query: params['q'], page: params['page'])
|
||||||
|
end
|
||||||
|
|
||||||
|
post '/echo' do
|
||||||
|
json(received: params.to_h)
|
||||||
|
end
|
||||||
|
|
||||||
|
get '/files/*' do
|
||||||
|
json(path: params['splat'])
|
||||||
|
end
|
||||||
|
|
||||||
|
group '/api' do
|
||||||
|
get '/status' do
|
||||||
|
json(ok: true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
get '/count' do
|
||||||
|
session['count'] = (session['count'] || 0) + 1
|
||||||
|
json(count: session['count'])
|
||||||
|
end
|
||||||
|
|
||||||
|
get '/old' do
|
||||||
|
redirect '/', 301
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if __FILE__ == $PROGRAM_NAME
|
||||||
|
server = Prism::Server.new(ExampleApp, port: (ARGV[0] || 0).to_i).start
|
||||||
|
puts "Prism example listening on #{server.url}"
|
||||||
|
trap('INT') do
|
||||||
|
server.stop
|
||||||
|
exit
|
||||||
|
end
|
||||||
|
sleep
|
||||||
|
end
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
require 'prism'
|
||||||
|
|
||||||
|
APP_ROOT = __dir__
|
||||||
|
|
||||||
|
Prism::Orm.connect(File.join(APP_ROOT, 'db', 'development.pstore'))
|
||||||
|
Prism::Orm.migrator(File.join(APP_ROOT, 'db', 'migrate')).migrate!
|
||||||
|
|
||||||
|
Prism::Controller.views_root(File.join(APP_ROOT, 'app', 'views'))
|
||||||
|
Prism::Controller.layout(:application)
|
||||||
|
|
||||||
|
Dir[File.join(APP_ROOT, 'app', 'models', '*.rb')].sort.each { |file| require file }
|
||||||
|
Dir[File.join(APP_ROOT, 'app', 'controllers', '*.rb')].sort.each { |file| require file }
|
||||||
|
|
||||||
|
class Blog < Prism::Application
|
||||||
|
set :views, File.join(APP_ROOT, 'app', 'views')
|
||||||
|
enable_sessions(secret: 'blog-demo-secret')
|
||||||
|
use Prism::Middleware::Logger
|
||||||
|
use Prism::Middleware::ParamsParser
|
||||||
|
use Prism::Middleware::Static, root: File.join(APP_ROOT, 'public')
|
||||||
|
|
||||||
|
root(to: 'posts#index')
|
||||||
|
resources :posts, only: %i[index show create]
|
||||||
|
end
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
class PostsController < Prism::Controller
|
||||||
|
layout :application
|
||||||
|
|
||||||
|
def index
|
||||||
|
render(:index, locals: { posts: Post.order(:created_at, :desc), notice: flash[:notice], errors: [] })
|
||||||
|
end
|
||||||
|
|
||||||
|
def show
|
||||||
|
render(:show, locals: { post: Post.find(params['id']) })
|
||||||
|
rescue Prism::Orm::RecordNotFound
|
||||||
|
halt(404, 'Post not found')
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
post = Post.new(title: params['title'], body: params['body'])
|
||||||
|
if post.save
|
||||||
|
flash[:notice] = "Post ##{post.id} created"
|
||||||
|
redirect url_for(:posts)
|
||||||
|
else
|
||||||
|
status(422)
|
||||||
|
render(:index, locals: { posts: Post.order(:created_at, :desc), notice: nil, errors: post.errors.full_messages })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class Post < Prism::Orm::Model
|
||||||
|
validates :title, presence: true, length: { minimum: 3 }
|
||||||
|
end
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head><title><%= defined?(title) ? title : 'Prism App' %></title></head>
|
||||||
|
<body><%== content %></body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<li class="post" id="post-<%= post.id %>">
|
||||||
|
<h2><%= post.title %></h2>
|
||||||
|
<p><%= post.body %></p>
|
||||||
|
</li>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<h1>Blog</h1>
|
||||||
|
<% if notice %>
|
||||||
|
<p class="notice"><%= notice %></p>
|
||||||
|
<% end %>
|
||||||
|
<% unless errors.empty? %>
|
||||||
|
<ul class="errors">
|
||||||
|
<% errors.each do |message| %>
|
||||||
|
<li><%= message %></li>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
<form method="post" action="/posts">
|
||||||
|
<input type="text" name="title" placeholder="Title">
|
||||||
|
<textarea name="body" placeholder="Body"></textarea>
|
||||||
|
<button type="submit">Create post</button>
|
||||||
|
</form>
|
||||||
|
<ul class="posts">
|
||||||
|
<% posts.each do |post| %>
|
||||||
|
<%== partial('post', locals: { post: post }) %>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<h1><%= post.title %></h1>
|
||||||
|
<p><%= post.body %></p>
|
||||||
Executable
+6
@@ -0,0 +1,6 @@
|
|||||||
|
require_relative '../app'
|
||||||
|
|
||||||
|
server = Prism::Server.new(Blog, port: (ARGV[0] || 3000).to_i).start
|
||||||
|
puts "listening on #{server.url}"
|
||||||
|
trap('INT') { server.stop; exit }
|
||||||
|
sleep
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
require_relative 'app'
|
||||||
|
|
||||||
|
run Blog
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
class CreatePosts < Prism::Orm::Migration
|
||||||
|
def up
|
||||||
|
create_table :posts do |t|
|
||||||
|
t.string :title
|
||||||
|
t.text :body
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
drop_table :posts
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in new issue
Block a user