margot 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ == 0.5 / 2006-10-23
2
+
3
+ * Got all projected up
4
+ * using Hoe for management/rakefileing
5
+ * split up the binary and the handler
6
+
7
+
@@ -0,0 +1,10 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ bin/margot
6
+ lib/margot.rb
7
+ test/test_margot.rb
8
+ test/layout.mab
9
+ test/index.mab
10
+ test/blog/index.mab
@@ -0,0 +1,60 @@
1
+ = MARGOT
2
+ by: The Polymorphers
3
+ * cdcarter
4
+ * willcodeforfoo
5
+ * defunkt
6
+
7
+ == DESCRIPTION:
8
+
9
+ Margot is the missing link between Mongrel (http://mongrel.rubyforge.org) and Markaby (http://code.whytheluckystiff.net/markaby). It is a full webserver that parses and serves Markaby files, giving access to the request information and the parameters
10
+
11
+ == FEATURES/PROBLEMS:
12
+
13
+ * The query string, and POST/PUT parameters are available through the +params+ hash
14
+ * Other request data can be attained through the +request+ method
15
+ * The Markaby instance is called +mab+ (But you do not need to call it directly. The +html+ method is an alias to +mab.html+)
16
+ * Margot keeps an in memory cache of pages and their parameters!
17
+ * To clear the cache and garbage collect, just send a USR1 signal to the process
18
+ * The mongrel status information is mounted by default at /status
19
+ * A directory handler is loaded at /assets to the directory +./assets+
20
+ * There is daemonization support but it is borked at the moment
21
+ * Template and layout handling
22
+
23
+ == REQUIREMENTS:
24
+
25
+ Margot requires the following gems
26
+ * Markaby
27
+ * Mongrel
28
+
29
+ == INSTALL:
30
+
31
+ sudo gem install margot
32
+
33
+ == Usage
34
+ To use Margot you just create a directory structure, with each subdirectory, and the root containing an +index.mab+ and a +layout.mab+, and start Margot on that directory
35
+ $ margot 0.0.0.0 3000 ./sites
36
+
37
+ == LICENSE:
38
+
39
+ (The MIT License)
40
+
41
+ Copyright (c) 2006 FIX
42
+
43
+ Permission is hereby granted, free of charge, to any person obtaining
44
+ a copy of this software and associated documentation files (the
45
+ 'Software'), to deal in the Software without restriction, including
46
+ without limitation the rights to use, copy, modify, merge, publish,
47
+ distribute, sublicense, and/or sell copies of the Software, and to
48
+ permit persons to whom the Software is furnished to do so, subject to
49
+ the following conditions:
50
+
51
+ The above copyright notice and this permission notice shall be
52
+ included in all copies or substantial portions of the Software.
53
+
54
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
55
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
56
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
57
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
58
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
59
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
60
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,18 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/margot.rb'
6
+
7
+ Hoe.new('margot', Margot::VERSION) do |p|
8
+ p.rubyforge_name = 'margot'
9
+ p.summary = 'The missing link between Markaby and Mongrel'
10
+ p.author = ['cdcarter','willcodeforfoo','defunkt']
11
+ p.description = p.paragraphs_of('README.txt', 2..6).join("\n\n")
12
+ p.url = "http://metacampsite.com/margot/"
13
+ p.email = "cdcarter@laundr.us"
14
+ p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
15
+ p.extra_deps = ['markaby','>= 0'],['mongrel','>= 0.3.13.3']
16
+ end
17
+
18
+ # vim: syntax=Ruby
@@ -0,0 +1,30 @@
1
+ %w[rubygems margot daemons/daemonize].each { |f| require f }
2
+
3
+ DAEMON = !!ARGV.delete('-d')
4
+ Daemonize.daemonize('mongrel.log') if DAEMON
5
+ puts "started logging" if DAEMON
6
+
7
+ DEBUG = !!ARGV.delete('-b')
8
+
9
+ STDERR.puts("usage: margot.rb <host> <port> <mab root>") unless ARGV.length == 3
10
+ exit(1) unless ARGV.length == 3
11
+
12
+ stats = Mongrel::StatisticsFilter.new(:sample_rate => 1)
13
+
14
+ config = Mongrel::Configurator.new :host => ARGV[0], :port => ARGV[1] do
15
+ listener do
16
+ uri "/", :handler => Margot.new(ARGV[2])
17
+ uri "/", :handler => stats
18
+ uri "/assets", :handler => Mongrel::DirHandler.new("./assets")
19
+ uri "/status", :handler => Mongrel::StatusHandler.new(:stats_filter => stats)
20
+ uri "/favicon.ico", :handler => Mongrel::Error404Handler.new("")
21
+ end
22
+
23
+ trap("INT") { stop }
24
+ trap("USR1") { @@cache = {}; GC.start; puts "cached cleared" }
25
+
26
+ run
27
+ end
28
+
29
+ puts "Mongrel running on #{ARGV[0]}:#{ARGV[1]} with mab root #{ARGV[2]}. PID #{$$}"
30
+ config.join
@@ -0,0 +1,56 @@
1
+ %w[rubygems markaby mongrel/stats mongrel/configurator mongrel mongrel/cgi daemons/daemonize].each { |f| require f }
2
+
3
+ class Margot < Mongrel::HttpHandler
4
+ VERSION = '0.5.0'
5
+
6
+ @@cache = {}
7
+
8
+ def initialize(path)
9
+ @root = File.expand_path(path)
10
+ end
11
+
12
+ def serve_file(path)
13
+ req_path = File.expand_path(File.join(@root, Mongrel::HttpRequest.unescape(path)), @root)
14
+ if File.file?(file = "#{req_path}.mab") || File.file?(file = "#{req_path}/index.mab")
15
+ File.open(file).read
16
+ end
17
+ end
18
+
19
+ def process(request, response)
20
+ @cgi, @request = Mongrel::CGIWrapper.new(request, response), request
21
+ status, content_type, body = 404, 'text/html', "<h1>404-File Not Found</h1>"
22
+
23
+ if @@cache[cache_key = request.params['PATH_INFO'] + @cgi.params.sort.to_s]
24
+ status = 200
25
+ body = @@cache[cache_key]
26
+ elsif file = serve_file(request.params['PATH_INFO'])
27
+ status = 200
28
+ @@cache[cache_key] = (body = layout(compile(file))).dup
29
+ end
30
+
31
+ response.start status do |head, out|
32
+ head["Content-Type"] = content_type
33
+ out << body
34
+ open('log', 'w') { |f| f << "#{status} - GET: #{request.params['REQUEST_URI']}\n" }
35
+ puts "#{status} - GET: #{request.params['REQUEST_URI']}" if DEBUG
36
+ end
37
+ rescue => e
38
+ puts e.message, e.backtrace.map { |line| " " << line }
39
+ end
40
+
41
+ def compile(file, cgi = @cgi, &block)
42
+ Markaby::Builder.new do |mab|
43
+ (class << mab; self end).send(:attr_accessor, :params)
44
+ mab.params = cgi.params
45
+ return mab.instance_eval(file) unless file =~ /layout/
46
+
47
+ mab.instance_eval %[def #{layout_method = "layout_" + file.hash}() #{file} end]
48
+ send(layout_method, &block)
49
+ end.to_s
50
+ end
51
+
52
+ def layout(content)
53
+ return content unless layout = serve_file(@request.params['PATH_INFO'].split('/').join('') + 'layout')
54
+ compile(layout) { content }
55
+ end
56
+ end
@@ -0,0 +1,23 @@
1
+ html do
2
+ head { title "RubyHP!" }
3
+ body do
4
+ h1 "Ruby Rocks"
5
+ ul do
6
+ li "Easy Webpages"
7
+ li "cool libraries"
8
+ li "awesome people"
9
+ end
10
+ if params.include? "defunkt"
11
+ text "GURU!"
12
+ else
13
+ params.each do |key, value|
14
+ text "#{key}: #{value}"
15
+ br
16
+ end
17
+ end
18
+
19
+ if params.empty?
20
+ text "Get some params! Try adding something like ?params=rock to the end of the URI!"
21
+ end
22
+ end
23
+ end
@@ -0,0 +1 @@
1
+ p "This is cool!"
@@ -0,0 +1,6 @@
1
+ html do
2
+ head { title "hi" }
3
+ body do
4
+ yield
5
+ end
6
+ end
File without changes
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.11
3
+ specification_version: 1
4
+ name: margot
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.5.0
7
+ date: 2006-10-23 00:00:00 -05:00
8
+ summary: The missing link between Markaby and Mongrel
9
+ require_paths:
10
+ - lib
11
+ - test
12
+ email: cdcarter@laundr.us
13
+ homepage: http://metacampsite.com/margot/
14
+ rubyforge_project: margot
15
+ description: "== FEATURES/PROBLEMS: * The query string, and POST/PUT parameters are available through the +params+ hash * Other request data can be attained through the +request+ method * The Markaby instance is called +mab+ (But you do not need to call it directly. The +html+ method is an alias to +mab.html+) * Margot keeps an in memory cache of pages and their parameters! * To clear the cache and garbage collect, just send a USR1 signal to the process * The mongrel status information is mounted by default at /status * A directory handler is loaded at /assets to the directory +./assets+ * There is daemonization support but it is borked at the moment * Template and layout handling == REQUIREMENTS: Margot requires the following gems * Markaby * Mongrel == INSTALL: sudo gem install margot"
16
+ autorequire:
17
+ default_executable:
18
+ bindir: bin
19
+ has_rdoc: true
20
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
21
+ requirements:
22
+ - - ">"
23
+ - !ruby/object:Gem::Version
24
+ version: 0.0.0
25
+ version:
26
+ platform: ruby
27
+ signing_key:
28
+ cert_chain:
29
+ authors:
30
+ - cdcarter
31
+ - willcodeforfoo
32
+ - defunkt
33
+ files:
34
+ - History.txt
35
+ - Manifest.txt
36
+ - README.txt
37
+ - Rakefile
38
+ - bin/margot
39
+ - lib/margot.rb
40
+ - test/test_margot.rb
41
+ - test/layout.mab
42
+ - test/index.mab
43
+ - test/blog/index.mab
44
+ test_files: []
45
+
46
+ rdoc_options: []
47
+
48
+ extra_rdoc_files: []
49
+
50
+ executables:
51
+ - margot
52
+ extensions: []
53
+
54
+ requirements: []
55
+
56
+ dependencies:
57
+ - !ruby/object:Gem::Dependency
58
+ name: markaby
59
+ version_requirement:
60
+ version_requirements: !ruby/object:Gem::Version::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: "0"
65
+ version:
66
+ - !ruby/object:Gem::Dependency
67
+ name: mongrel
68
+ version_requirement:
69
+ version_requirements: !ruby/object:Gem::Version::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: 0.3.13.3
74
+ version: