vintage 0.0.1
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.
- data/History.txt +4 -0
- data/License.txt +20 -0
- data/Manifest.txt +33 -0
- data/README.txt +40 -0
- data/Rakefile +4 -0
- data/app_generators/vintage_application/USAGE +5 -0
- data/app_generators/vintage_application/templates/README +6 -0
- data/app_generators/vintage_application/templates/configuration.yml +17 -0
- data/app_generators/vintage_application/templates/index.erb +29 -0
- data/app_generators/vintage_application/templates/style.css +8 -0
- data/app_generators/vintage_application/templates/vintage.png +0 -0
- data/app_generators/vintage_application/vintage_application_generator.rb +71 -0
- data/bin/vintage +76 -0
- data/config/hoe.rb +72 -0
- data/config/requirements.rb +17 -0
- data/lib/vintage/errors.rb +76 -0
- data/lib/vintage/handler.rb +121 -0
- data/lib/vintage/helpers.rb +110 -0
- data/lib/vintage/log.rb +16 -0
- data/lib/vintage/renderer.rb +62 -0
- data/lib/vintage/request_context.rb +37 -0
- data/lib/vintage/server.rb +37 -0
- data/lib/vintage/version.rb +9 -0
- data/lib/vintage.rb +8 -0
- data/log/debug.log +0 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +9 -0
- data/test/test_generator_helper.rb +20 -0
- data/test/test_helper.rb +2 -0
- data/test/test_vintage.rb +11 -0
- data/test/test_vintage_application_generator.rb +43 -0
- metadata +92 -0
@@ -0,0 +1,110 @@
|
|
1
|
+
module Vintage
|
2
|
+
# A module of various helpers, many of them copied or based on Rails helpers.
|
3
|
+
module Helpers
|
4
|
+
# Borrowed from Rails, a regex to pick out things to link in text
|
5
|
+
AUTO_LINK_RE = %r{
|
6
|
+
( # leading text
|
7
|
+
<\w+.*?>| # leading HTML tag, or
|
8
|
+
[^=!:'"/]| # leading punctuation, or
|
9
|
+
^ # beginning of line
|
10
|
+
)
|
11
|
+
(
|
12
|
+
(?:https?://)| # protocol spec, or
|
13
|
+
(?:www\.) # www.*
|
14
|
+
)
|
15
|
+
(
|
16
|
+
[-\w]+ # subdomain or domain
|
17
|
+
(?:\.[-\w]+)* # remaining subdomains or domain
|
18
|
+
(?::\d+)? # port
|
19
|
+
(?:/(?:(?:[~\w\+@%-]|(?:[,.;:][^\s$]))+)?)* # path
|
20
|
+
(?:\?[\w\+@%&=.;-]+)? # query string
|
21
|
+
(?:\#[\w\-]*)? # trailing anchor
|
22
|
+
)
|
23
|
+
([[:punct:]]|\s|<|$) # trailing text
|
24
|
+
}x unless const_defined?(:AUTO_LINK_RE)
|
25
|
+
|
26
|
+
# Redirect to a URL or other action using a 301 status code
|
27
|
+
# and +Location+ header.
|
28
|
+
def redirect_to(url)
|
29
|
+
response.code = 301
|
30
|
+
response.headers['Location'] = url
|
31
|
+
end
|
32
|
+
|
33
|
+
# Link to a given +url+ with the given +text+.
|
34
|
+
def link_to(text, url)
|
35
|
+
"<a href='#{url}' title='#{text}'>#{text}</a>"
|
36
|
+
end
|
37
|
+
|
38
|
+
# Auto link URLs and e-mail addresses in +text+.
|
39
|
+
def auto_link(text)
|
40
|
+
auto_link_email_addresses(auto_link_urls(text))
|
41
|
+
end
|
42
|
+
|
43
|
+
# Auto link e-mail addresses in +text+.
|
44
|
+
def auto_link_email_addresses(text)
|
45
|
+
body = text.dup
|
46
|
+
text.gsub(/([\w\.!#\$%\-+.]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/) do
|
47
|
+
text = $1
|
48
|
+
|
49
|
+
if body.match(/<a\b[^>]*>(.*)(#{Regexp.escape(text)})(.*)<\/a>/)
|
50
|
+
text
|
51
|
+
else
|
52
|
+
%{<a href="mailto:#{text}">#{text}</a>}
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Auto link URLs in +text.
|
58
|
+
def auto_link_urls(text)
|
59
|
+
text.gsub(AUTO_LINK_RE) do
|
60
|
+
all, a, b, c, d = $&, $1, $2, $3, $4
|
61
|
+
|
62
|
+
if a =~ /<a\s/i # don't replace URL's that are already linked
|
63
|
+
all
|
64
|
+
else
|
65
|
+
text = b + c
|
66
|
+
%(#{a}<a href="#{b=="www."?"http://www.":b}#{c}">#{text}</a>#{d})
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Grab an excerpt from +text+, starting at +start+ and stopping at +stop+.
|
72
|
+
# The +padding+ argument lets you define what should be on eithe side of the
|
73
|
+
# excerpt.
|
74
|
+
def excerpt(text, start = 0, stop = 20, padding = "...")
|
75
|
+
return "" if text.nil?
|
76
|
+
|
77
|
+
(padding if start > 0).to_s + text[start..(start + stop)] + padding
|
78
|
+
end
|
79
|
+
|
80
|
+
# Highlight an array of +phrases+ in +text+. The +highlighter+ argument lets you set
|
81
|
+
# how to highlight the text.
|
82
|
+
def highlight(text, phrases, highlighter = '<strong class="highlight">\1</strong>')
|
83
|
+
if text.blank? || phrases.blank?
|
84
|
+
text
|
85
|
+
else
|
86
|
+
match = Array(phrases).map { |p| Regexp.escape(p) }.join('|')
|
87
|
+
text.gsub(/(#{match})/i, highlighter)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Truncate +text+ to the length specified in +length+ with +ending+
|
92
|
+
# as the text appearing on the end.
|
93
|
+
def truncate(text, length = 20, ending = "...")
|
94
|
+
return "" if text.nil?
|
95
|
+
|
96
|
+
text[0..length] + ending
|
97
|
+
end
|
98
|
+
|
99
|
+
# Create a button that submits to another URL.
|
100
|
+
def button_to(url, text = "Click Here")
|
101
|
+
"<form method='GET' action='#{url}'><div class='button-to'><input type='submit' value='#{text}'></div></form>"
|
102
|
+
end
|
103
|
+
|
104
|
+
# Create a +mailto:+ link for +address+. You can optionally provide
|
105
|
+
# +text+ for the link's text.
|
106
|
+
def mail_to(address, text = nil)
|
107
|
+
"<a href='mailto:#{address}'>#{text || address}</a>"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
data/lib/vintage/log.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module Vintage
|
4
|
+
# Class to handle logging to a file and to
|
5
|
+
# the console.
|
6
|
+
class Log
|
7
|
+
# Method to log something.
|
8
|
+
def self.enter(text = "", level = :debug)
|
9
|
+
@@console ||= Logger.new(STDOUT)
|
10
|
+
@@file ||= Logger.new('requests.log')
|
11
|
+
|
12
|
+
@@console.send(level, text)
|
13
|
+
@@file.send(level, text)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
%w{ erubis redcloth bluecloth markaby haml }.each do |engine|
|
2
|
+
begin
|
3
|
+
require engine
|
4
|
+
rescue LoadError
|
5
|
+
next
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
module Vintage
|
10
|
+
# Core rendering class.
|
11
|
+
class Renderer
|
12
|
+
# Render an ERb template. Uses Erubis if available
|
13
|
+
# and if not, falls back to standard ERb.
|
14
|
+
def self.erb(template, request)
|
15
|
+
if Erubis
|
16
|
+
Erubis::Eruby.new(template).evaluate(request)
|
17
|
+
else
|
18
|
+
ERB.new(template).result(request.send(:binding))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Render a HAML template.
|
23
|
+
def self.haml(template, request)
|
24
|
+
if Haml
|
25
|
+
Haml::Engine.new(template).render(request)
|
26
|
+
else
|
27
|
+
raise "You don't have Haml installed!"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Render a Textile template using RedCloth.
|
32
|
+
def self.textile(template, request)
|
33
|
+
if RedCloth
|
34
|
+
RedCloth.new(template).to_html
|
35
|
+
else
|
36
|
+
raise "You don't have RedCloth installed!"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Render a Markdown template using BlueCloth, or
|
41
|
+
# if that isn't available, using RedCloth.
|
42
|
+
def self.markdown(template, request)
|
43
|
+
if BlueCloth
|
44
|
+
BlueCloth.new(template).to_html
|
45
|
+
elsif RedCloth
|
46
|
+
RedCloth.new(template).to_html
|
47
|
+
else
|
48
|
+
raise "You don't have BlueCloth or RedCloth installed!"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Render a Markaby template.
|
53
|
+
def self.mab(template, request)
|
54
|
+
if Markaby
|
55
|
+
Markaby::Builder.new.instance_eval(template).to_s
|
56
|
+
else
|
57
|
+
raise "You don't have Markaby installed!"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# Class that encapsulates information about the request.
|
2
|
+
class Request
|
3
|
+
attr_accessor :remote_ip, :method, :params, :query_string, :uri, :referer, :user_agent
|
4
|
+
|
5
|
+
def initialize(request, param_hash)
|
6
|
+
self.remote_ip = request.params['REMOTE_ADDR']
|
7
|
+
self.referer = request.params['HTTP_REFERER']
|
8
|
+
self.uri = request.params['REQUEST_URI']
|
9
|
+
self.method = request.params['REQUEST_METHOD']
|
10
|
+
self.user_agent = request.params['HTTP_USER_AGENT']
|
11
|
+
self.query_string = request.params['QUERY_STRING']
|
12
|
+
self.params = param_hash
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Class that encapsulates the response's headers and
|
17
|
+
# response code.
|
18
|
+
class Response
|
19
|
+
attr_accessor :headers, :code
|
20
|
+
|
21
|
+
def initialize(headers)
|
22
|
+
self.headers = headers
|
23
|
+
self.code = 200
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# A class that creates a context for template
|
28
|
+
# rendering. Helpers are mixed in here to give
|
29
|
+
# templates access to them.
|
30
|
+
class RequestContext
|
31
|
+
attr_accessor :request, :response
|
32
|
+
|
33
|
+
def initialize(incoming_request, params, headers)
|
34
|
+
self.request = Request.new(incoming_request, params)
|
35
|
+
self.response = Response.new(headers)
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'mongrel'
|
3
|
+
|
4
|
+
require 'erubis'
|
5
|
+
|
6
|
+
require 'vintage/version'
|
7
|
+
require 'vintage/log'
|
8
|
+
require 'vintage/helpers'
|
9
|
+
|
10
|
+
begin
|
11
|
+
Dir.entries("helpers/").select{|entry| entry =~ /(.*).rb$/}.each do |helper_file|
|
12
|
+
Vintage::Helpers.module_eval(File.open(helper_file).read)
|
13
|
+
end
|
14
|
+
rescue
|
15
|
+
# No helpers
|
16
|
+
end
|
17
|
+
|
18
|
+
module Vintage
|
19
|
+
# Launches the Mongrel handler.
|
20
|
+
class Server
|
21
|
+
def self.run(options)
|
22
|
+
Log.enter "- vintage version #{VERSION::STRING}"
|
23
|
+
Log.enter "\t starting server on port #{options[:port]}"
|
24
|
+
Log.enter
|
25
|
+
|
26
|
+
h = Mongrel::HttpServer.new("0.0.0.0", options[:port])
|
27
|
+
h.register(options[:mount], Handler.new(options))
|
28
|
+
h.run.join
|
29
|
+
rescue Interrupt
|
30
|
+
Log.enter
|
31
|
+
Log.enter "- interrupt signal caught"
|
32
|
+
Log.enter "\tshutting server down"
|
33
|
+
Log.enter
|
34
|
+
exit 0
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/vintage.rb
ADDED
data/log/debug.log
ADDED
File without changes
|
data/script/destroy
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.join(File.dirname(__FILE__), '..')
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/destroy'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.join(File.dirname(__FILE__), '..')
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/generate'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|