merb 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +2 -0
- data/Rakefile +1 -1
- data/examples/skeleton.tar +0 -0
- data/examples/skeleton/Rakefile +82 -0
- data/examples/skeleton/dist/app/controllers/application.rb +3 -0
- data/examples/skeleton/dist/app/helpers/global_helper.rb +5 -0
- data/examples/skeleton/dist/app/views/layout/application.herb +12 -0
- data/examples/skeleton/dist/conf/merb.yml +53 -0
- data/examples/skeleton/dist/conf/merb_init.rb +21 -0
- data/examples/skeleton/dist/conf/router.rb +19 -0
- data/examples/skeleton/dist/conf/upload.conf +5 -0
- data/examples/skeleton/dist/schema/migrations/001_add_sessions_table.rb +15 -0
- data/examples/skeleton/script/new_migration +21 -0
- data/examples/skeleton/script/stop_merb +13 -0
- data/lib/merb.rb +3 -2
- data/lib/merb/core_ext/merb_module.rb +16 -0
- data/lib/merb/merb_server.rb +7 -3
- data/lib/merb/merb_upload_handler.rb +30 -1
- data/lib/tasks/db.rake +1 -1
- data/lib/tasks/merb.rake +15 -0
- metadata +36 -2
data/README
CHANGED
data/Rakefile
CHANGED
data/examples/skeleton.tar
CHANGED
Binary file
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/rdoctask'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'code_statistics'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'rubygems'
|
7
|
+
require 'merb'
|
8
|
+
require MERB_FRAMEWORK_ROOT+'/merb_tasks'
|
9
|
+
MERB_ROOT = File.dirname(__FILE__)
|
10
|
+
include FileUtils
|
11
|
+
|
12
|
+
|
13
|
+
#desc "Packages up Merb."
|
14
|
+
#task :default => [:package]
|
15
|
+
|
16
|
+
desc "load merb_init.rb"
|
17
|
+
task :merb_init do
|
18
|
+
require 'merb'
|
19
|
+
require File.dirname(__FILE__)+'/dist/conf/merb_init.rb'
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "Load db schema"
|
23
|
+
task :load_schema => [:merb_init] do
|
24
|
+
require File.dirname(__FILE__)+'/dist/schema/schema.rb'
|
25
|
+
end
|
26
|
+
|
27
|
+
task :uninstall => [:clean] do
|
28
|
+
sh %{sudo gem uninstall #{NAME}}
|
29
|
+
end
|
30
|
+
|
31
|
+
desc 'Run unit tests'
|
32
|
+
Rake::TestTask.new('test_unit') do |t|
|
33
|
+
t.libs << 'test'
|
34
|
+
t.pattern = 'test/unit/*_test.rb'
|
35
|
+
t.verbose = true
|
36
|
+
end
|
37
|
+
|
38
|
+
desc 'Run functional tests'
|
39
|
+
Rake::TestTask.new('test_functional') do |t|
|
40
|
+
t.libs << 'test'
|
41
|
+
t.pattern = 'test/functional/*_test.rb'
|
42
|
+
t.verbose = true
|
43
|
+
end
|
44
|
+
|
45
|
+
desc 'Run all tests'
|
46
|
+
Rake::TestTask.new('test') do |t|
|
47
|
+
t.libs << 'test'
|
48
|
+
t.pattern = 'test/**/*_test.rb'
|
49
|
+
t.verbose = true
|
50
|
+
end
|
51
|
+
|
52
|
+
desc 'Run all tests, specs and finish with rcov'
|
53
|
+
task :aok do
|
54
|
+
sh %{rake rcov}
|
55
|
+
sh %{rake spec}
|
56
|
+
end
|
57
|
+
|
58
|
+
##############################################################################
|
59
|
+
# Statistics
|
60
|
+
##############################################################################
|
61
|
+
|
62
|
+
STATS_DIRECTORIES = [
|
63
|
+
%w(Code lib/),
|
64
|
+
%w(Unit\ tests test/unit),
|
65
|
+
%w(Functional\ tests test/functional)
|
66
|
+
].collect { |name, dir| [ name, "./#{dir}" ] }.select { |name, dir| File.directory?(dir) }
|
67
|
+
|
68
|
+
desc "Report code statistics (KLOCs, etc) from the application"
|
69
|
+
task :stats do
|
70
|
+
#require 'extra/stats'
|
71
|
+
verbose = true
|
72
|
+
CodeStatistics.new(*STATS_DIRECTORIES).to_s
|
73
|
+
end
|
74
|
+
|
75
|
+
##############################################################################
|
76
|
+
# SVN
|
77
|
+
##############################################################################
|
78
|
+
|
79
|
+
desc "Add new files to subversion"
|
80
|
+
task :svn_add do
|
81
|
+
system "svn status | grep '^\?' | sed -e 's/? *//' | sed -e 's/ /\ /g' | xargs svn add"
|
82
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
|
+
<head>
|
4
|
+
<title>Fresh Merb App</title>
|
5
|
+
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<div id='content'>
|
9
|
+
<%= catch_content :layout %>
|
10
|
+
</div>
|
11
|
+
</body>
|
12
|
+
</html>
|
@@ -0,0 +1,53 @@
|
|
1
|
+
---
|
2
|
+
# hostname or IP to bind to.
|
3
|
+
:host: 127.0.0.1
|
4
|
+
|
5
|
+
# port merb runs on or starting port for merb cluster.
|
6
|
+
:port: "4000"
|
7
|
+
|
8
|
+
# in development mode your controler classes get reloaded every request
|
9
|
+
# and templates are parsed each time and not cached
|
10
|
+
# in production mode templates are cached, as well as all your classes
|
11
|
+
:environment: development
|
12
|
+
|
13
|
+
# uncomment for memory sessions. This only works when
|
14
|
+
# you are running 1 merb at a time. ANd sessions do not persist
|
15
|
+
# between restarts.
|
16
|
+
# :memory_session: true
|
17
|
+
|
18
|
+
# This turns on the ActiveRecord sessions with rails parasite
|
19
|
+
# mode if active_support gem is installed. Skeleton app comes with a
|
20
|
+
# migration to create the sessions table. Or you can point merb to
|
21
|
+
# the same sessions table that your rails app uses to share sessions
|
22
|
+
# between merb and rails.
|
23
|
+
:sql_session: true
|
24
|
+
|
25
|
+
# uncomment to use the merb upload progress
|
26
|
+
#:config: dist/conf/upload.conf
|
27
|
+
|
28
|
+
# uncomment to cache templates in dev mode.
|
29
|
+
# templates are cached automatically in production mode.
|
30
|
+
#:cache_templates: true
|
31
|
+
|
32
|
+
# uncomment and set this is you want to run a drb
|
33
|
+
# server for upload progress or other drb services.
|
34
|
+
#:drb_server_port: 32323
|
35
|
+
|
36
|
+
# If you want to protect some or all of your app with
|
37
|
+
# HTTP basic auth then uncomment the folowing and fill
|
38
|
+
# in your credentials you want it to use. Then you need
|
39
|
+
# to set a before filter in a controller:
|
40
|
+
# before :basic_authentication
|
41
|
+
#:basic_auth:
|
42
|
+
# :username: ezra
|
43
|
+
# :password: test
|
44
|
+
# :domain: localhost
|
45
|
+
|
46
|
+
# uncomment this if you want merb to daemonize when you start it
|
47
|
+
# you can also just use merb -d for the same effect. Don't uncomment
|
48
|
+
# this if you use the cluster option
|
49
|
+
#:daemonize: true
|
50
|
+
|
51
|
+
# uncomment this to set the number of members in your merb cluster
|
52
|
+
# don't set this and :daemonize: at the same time.
|
53
|
+
#:cluster: 3
|
@@ -0,0 +1,21 @@
|
|
1
|
+
puts "merb init called"
|
2
|
+
require 'active_record'
|
3
|
+
ActiveRecord::Base.verification_timeout = 14400
|
4
|
+
ActiveRecord::Base.logger = MERB_LOGGER
|
5
|
+
Dir[DIST_ROOT+"/app/helpers/*.rb"].each { |m| require m }
|
6
|
+
require DIST_ROOT+"/app/controllers/application.rb"
|
7
|
+
Dir[DIST_ROOT+"/app/controllers/*.rb"].each { |m| require m }
|
8
|
+
Dir[DIST_ROOT+"/app/models/*.rb"].each { |m| require m }
|
9
|
+
Dir[DIST_ROOT+"/lib/**/*.rb"].each { |m| require m }
|
10
|
+
Dir[DIST_ROOT+"/plugins/*/init.rb"].each { |m| require m }
|
11
|
+
|
12
|
+
# set your db info here
|
13
|
+
ActiveRecord::Base.establish_connection(
|
14
|
+
:adapter => 'mysql',
|
15
|
+
:username => 'root',
|
16
|
+
:password => 'xxxxx',
|
17
|
+
:database => 'merb'
|
18
|
+
)
|
19
|
+
|
20
|
+
# add your own ruby code here for app specific stuff. This file gets loaded
|
21
|
+
# after the framework is loaded.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Merb::RouteMatcher is the request routing mapper for the merb framework.
|
2
|
+
# You can define placeholder parts of the url with the :smbol notation.
|
3
|
+
# so r.add '/foo/:bar/baz/:id', :class => 'Bar', :method => 'foo'
|
4
|
+
# will match against a request to /foo/123/baz/456. It will then
|
5
|
+
# use the class Bar as your merb controller and call the foo method on it.
|
6
|
+
# the foo method will recieve a hash with {:bar => '123', :id => '456'}
|
7
|
+
# as the content. So the :placeholders sections of your routes become
|
8
|
+
# a hash of arguments to your controller methods.
|
9
|
+
# The default route is installed
|
10
|
+
|
11
|
+
|
12
|
+
puts "Compiling routes.."
|
13
|
+
Merb::RouteMatcher.prepare do |r|
|
14
|
+
# default route, usually you don't want to change this
|
15
|
+
r.add '/:controller/:action/:id'
|
16
|
+
|
17
|
+
# change this for your home page to be avaiable at /
|
18
|
+
r.add '/', :controller => 'default', :action =>'index'
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class AddSessionsTable < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :sessions, :force => true do |t|
|
4
|
+
t.column :id, :integer, :null => false
|
5
|
+
t.column :session_id, :string, :limit => 32
|
6
|
+
t.column :created_at, :datetime
|
7
|
+
t.column :data, :text
|
8
|
+
add_index "sessions", ["session_id"], :name => "session_id_index"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.down
|
13
|
+
drop_table :sessions
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'merb'
|
4
|
+
|
5
|
+
TMPL = <<EOF
|
6
|
+
class <%= class_name.snake_case.camel_case %> < ActiveRecord::Migration
|
7
|
+
def self.up
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.down
|
11
|
+
end
|
12
|
+
end
|
13
|
+
EOF
|
14
|
+
|
15
|
+
class_name = ARGV[0]
|
16
|
+
highest_migration = Dir[Dir.pwd+'/dist/schema/migrations/*'].map{|f| File.basename(f) =~ /^(\d+)/; $1}.max
|
17
|
+
filename = format("%03d_%s", (highest_migration.to_i+1), class_name.snake_case)
|
18
|
+
|
19
|
+
File.open(Dir.pwd+"/dist/schema/migrations/#{filename}.rb", 'w+') do |file|
|
20
|
+
file.write Erubis::Eruby.new(TMPL).result(binding)
|
21
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
pids=[]
|
5
|
+
|
6
|
+
port_or_star = ARGV[0] || '*'
|
7
|
+
|
8
|
+
Dir[File.dirname(__FILE__)+"/../log/merb.#{port_or_star}.pid"].each do |f|
|
9
|
+
pid = IO.read(f).chomp.to_i
|
10
|
+
puts "killing PID: #{pid}"
|
11
|
+
Process.kill(9, pid)
|
12
|
+
FileUtils.rm f
|
13
|
+
end
|
data/lib/merb.rb
CHANGED
@@ -6,13 +6,13 @@ require 'logger'
|
|
6
6
|
|
7
7
|
begin
|
8
8
|
require 'fjson'
|
9
|
-
puts "using fjson"
|
10
9
|
rescue LoadError
|
11
10
|
require 'json'
|
12
11
|
end
|
13
12
|
|
13
|
+
|
14
14
|
module Merb
|
15
|
-
VERSION='0.0
|
15
|
+
VERSION='0.1.0' unless defined?VERSION
|
16
16
|
class Server
|
17
17
|
class << self
|
18
18
|
def config
|
@@ -93,6 +93,7 @@ class Merb::Controller
|
|
93
93
|
end
|
94
94
|
require "merb/session/merb_ar_session"
|
95
95
|
include ::Merb::SessionMixin
|
96
|
+
Thread.new{ loop{ sleep(60*60); ActiveRecord::Base.verify_active_connections! } }.priority = -10
|
96
97
|
end
|
97
98
|
|
98
99
|
if Merb::Server.basic_auth
|
@@ -1,4 +1,5 @@
|
|
1
1
|
class Module
|
2
|
+
|
2
3
|
def alias_method_chain(target, feature)
|
3
4
|
# Strip out punctuation on predicates or bang methods since
|
4
5
|
# e.g. target?_without_feature is not a valid method name.
|
@@ -7,4 +8,19 @@ class Module
|
|
7
8
|
alias_method "#{aliased_target}_without_#{feature}#{punctuation}", target
|
8
9
|
alias_method target, "#{aliased_target}_with_#{feature}#{punctuation}"
|
9
10
|
end
|
11
|
+
|
12
|
+
def attr_initialize(*attrs)
|
13
|
+
define_method(:initialize) do |*passed|
|
14
|
+
raise ArgumentError, "Wrong number of arguments" \
|
15
|
+
unless attrs.size == passed.size
|
16
|
+
|
17
|
+
attrs.each_with_index do |att, i|
|
18
|
+
instance_variable_set("@#{att}", passed[i])
|
19
|
+
end
|
20
|
+
|
21
|
+
after_initialize if respond_to? :after_initialize
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
10
26
|
end
|
data/lib/merb/merb_server.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'rubygems'
|
1
2
|
require 'optparse'
|
2
3
|
require 'ostruct'
|
3
4
|
require 'fileutils'
|
@@ -103,8 +104,8 @@ module Merb
|
|
103
104
|
|
104
105
|
def initialize_merb
|
105
106
|
require 'merb'
|
106
|
-
require @@merb_opts[:merb_root]
|
107
|
-
require @@merb_opts[:merb_root]
|
107
|
+
require @@merb_opts[:merb_root] / 'dist/conf/router.rb'
|
108
|
+
require @@merb_opts[:merb_root] / 'dist/conf/merb_init.rb'
|
108
109
|
end
|
109
110
|
|
110
111
|
def run
|
@@ -131,7 +132,10 @@ module Merb
|
|
131
132
|
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/app/controllers') )
|
132
133
|
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/app/models') )
|
133
134
|
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/lib') )
|
134
|
-
|
135
|
+
if File.exist? File.join(@@merb_opts[:dist_root] , '/framework')
|
136
|
+
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/framework') )
|
137
|
+
end
|
138
|
+
|
135
139
|
if @@merb_opts[:generate]
|
136
140
|
require 'merb/generators/merb_app/merb_app'
|
137
141
|
::Merb::AppGenerator.run @@merb_opts[:generate]
|
@@ -1,4 +1,25 @@
|
|
1
|
-
|
1
|
+
module Mongrel
|
2
|
+
module Const
|
3
|
+
POST = 'POST'.freeze unless const_defined?(:POST)
|
4
|
+
QUERY_STRING = 'QUERY_STRING'.freeze unless const_defined?(:QUERY_STRING)
|
5
|
+
UPLOAD_ID = 'upload_id'.freeze
|
6
|
+
end
|
7
|
+
|
8
|
+
HttpHandler.class_eval do
|
9
|
+
def request_aborted(params)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
HttpRequest.class_eval do
|
14
|
+
def initialize_with_abort(params, socket, dispatchers)
|
15
|
+
initialize_without_abort(params, socket, dispatchers)
|
16
|
+
dispatchers.each {|d| d.request_aborted(params) if @body.nil? && d }
|
17
|
+
end
|
18
|
+
|
19
|
+
alias_method :initialize_without_abort, :initialize
|
20
|
+
alias_method :initialize, :initialize_with_abort
|
21
|
+
end
|
22
|
+
end
|
2
23
|
|
3
24
|
|
4
25
|
class MerbUploadHandler < Mongrel::HttpHandler
|
@@ -29,6 +50,14 @@ class MerbUploadHandler < Mongrel::HttpHandler
|
|
29
50
|
def process(request, response)
|
30
51
|
upload_notify(:finish, request.params)
|
31
52
|
end
|
53
|
+
|
54
|
+
def request_aborted(params)
|
55
|
+
return unless params[Mongrel::Const::PATH_INFO] == @path_info &&
|
56
|
+
params[Mongrel::Const::REQUEST_METHOD] == Mongrel::Const::POST &&
|
57
|
+
upload_id = Mongrel::HttpRequest.query_parse(params[Mongrel::Const::QUERY_STRING])[Mongrel::Const::UPLOAD_ID]
|
58
|
+
Mongrel::Uploads.finish(upload_id)
|
59
|
+
puts "request aborted!"
|
60
|
+
end
|
32
61
|
|
33
62
|
private
|
34
63
|
def upload_notify(action, params, *args)
|
data/lib/tasks/db.rake
CHANGED
data/lib/tasks/merb.rake
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
namespace :merb do
|
2
|
+
desc "freeze the merb framework into dist/merb for portability"
|
3
|
+
task :freeze do
|
4
|
+
FileUtils.rm_rf MERB_ROOT / 'dist/framework'
|
5
|
+
FileUtils.cp_r MERB_FRAMEWORK_ROOT, (MERB_ROOT / 'dist/framework')
|
6
|
+
tmpl = "#!/usr/local/bin/ruby\nrequire File.expand_path(File.dirname(__FILE__)+'/../dist/framework/merb/merb_server')\nMerb::Server.run\n"
|
7
|
+
File.open(MERB_ROOT / 'script/merb', 'wb') {|f|
|
8
|
+
f.write tmpl
|
9
|
+
f.chmod(0744)
|
10
|
+
}
|
11
|
+
|
12
|
+
puts "Freezing Merb Framework into dist/framework"
|
13
|
+
puts "Use script/merb to start instead of plain merb"
|
14
|
+
end
|
15
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0.9
|
|
3
3
|
specification_version: 1
|
4
4
|
name: merb
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0
|
7
|
-
date: 2007-01-
|
6
|
+
version: 0.1.0
|
7
|
+
date: 2007-01-18 00:00:00 -08:00
|
8
8
|
summary: Merb == Mongrel + Erb. Pocket rocket web framework.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -82,8 +82,42 @@ files:
|
|
82
82
|
- lib/merb/vendor/paginator/paginator.rb
|
83
83
|
- lib/merb/vendor/paginator/README.txt
|
84
84
|
- lib/tasks/db.rake
|
85
|
+
- lib/tasks/merb.rake
|
85
86
|
- examples/README_EXAMPLES
|
87
|
+
- examples/skeleton
|
86
88
|
- examples/skeleton.tar
|
89
|
+
- examples/skeleton/dist
|
90
|
+
- examples/skeleton/log
|
91
|
+
- examples/skeleton/Rakefile
|
92
|
+
- examples/skeleton/script
|
93
|
+
- examples/skeleton/test
|
94
|
+
- examples/skeleton/dist/app
|
95
|
+
- examples/skeleton/dist/conf
|
96
|
+
- examples/skeleton/dist/lib
|
97
|
+
- examples/skeleton/dist/plugins
|
98
|
+
- examples/skeleton/dist/public
|
99
|
+
- examples/skeleton/dist/schema
|
100
|
+
- examples/skeleton/dist/app/controllers
|
101
|
+
- examples/skeleton/dist/app/helpers
|
102
|
+
- examples/skeleton/dist/app/models
|
103
|
+
- examples/skeleton/dist/app/views
|
104
|
+
- examples/skeleton/dist/app/controllers/application.rb
|
105
|
+
- examples/skeleton/dist/app/helpers/global_helper.rb
|
106
|
+
- examples/skeleton/dist/app/views/layout
|
107
|
+
- examples/skeleton/dist/app/views/layout/application.herb
|
108
|
+
- examples/skeleton/dist/conf/merb.yml
|
109
|
+
- examples/skeleton/dist/conf/merb_init.rb
|
110
|
+
- examples/skeleton/dist/conf/router.rb
|
111
|
+
- examples/skeleton/dist/conf/upload.conf
|
112
|
+
- examples/skeleton/dist/public/images
|
113
|
+
- examples/skeleton/dist/public/javascripts
|
114
|
+
- examples/skeleton/dist/public/stylesheets
|
115
|
+
- examples/skeleton/dist/schema/migrations
|
116
|
+
- examples/skeleton/dist/schema/migrations/001_add_sessions_table.rb
|
117
|
+
- examples/skeleton/script/new_migration
|
118
|
+
- examples/skeleton/script/stop_merb
|
119
|
+
- examples/skeleton/test/specs
|
120
|
+
- examples/skeleton/test/unit
|
87
121
|
test_files: []
|
88
122
|
|
89
123
|
rdoc_options:
|