glue 0.41.0 → 1.0.0
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 +6 -0
- data/Manifest.txt +6 -0
- data/README.txt +130 -0
- data/Rakefile +16 -0
- data/lib/glue.rb +49 -72
- data/test/test_glue.rb +218 -0
- metadata +84 -100
- data/doc/AUTHORS +0 -13
- data/doc/CHANGELOG.1 +0 -354
- data/doc/LICENSE +0 -32
- data/doc/RELEASES +0 -207
- data/lib/glue/attribute.rb +0 -113
- data/lib/glue/attributeutils.rb +0 -117
- data/lib/glue/autoreload.rb +0 -60
- data/lib/glue/builder.rb +0 -57
- data/lib/glue/builder/xml.rb +0 -103
- data/lib/glue/cache.rb +0 -22
- data/lib/glue/cache/drb.rb +0 -51
- data/lib/glue/cache/file.rb +0 -78
- data/lib/glue/cache/memcached.rb +0 -68
- data/lib/glue/cache/memory.rb +0 -79
- data/lib/glue/cache/og.rb +0 -61
- data/lib/glue/configuration.rb +0 -305
- data/lib/glue/fixture.rb +0 -154
- data/lib/glue/html.rb +0 -12
- data/lib/glue/localization.rb +0 -129
- data/lib/glue/logger.rb +0 -208
- data/lib/glue/mail.rb +0 -160
- data/lib/glue/mailer.rb +0 -55
- data/lib/glue/mailer/incoming.rb +0 -41
- data/lib/glue/mailer/outgoing.rb +0 -119
- data/lib/glue/settings.rb +0 -3
- data/lib/glue/uri.rb +0 -190
- data/lib/glue/validation.rb +0 -447
- data/lib/html/document.rb +0 -63
- data/lib/html/node.rb +0 -480
- data/lib/html/tokenizer.rb +0 -103
- data/lib/html/version.rb +0 -11
- data/test/fixture/article.csv +0 -3
- data/test/fixture/article.yml +0 -13
- data/test/fixture/user.yml +0 -12
- data/test/glue/builder/tc_xml.rb +0 -57
- data/test/glue/tc_aspects.rb +0 -99
- data/test/glue/tc_attribute.rb +0 -112
- data/test/glue/tc_attribute_mixins.rb +0 -86
- data/test/glue/tc_builder.rb +0 -30
- data/test/glue/tc_configuration.rb +0 -135
- data/test/glue/tc_fixture.rb +0 -98
- data/test/glue/tc_localization.rb +0 -49
- data/test/glue/tc_logger.rb +0 -43
- data/test/glue/tc_mail.rb +0 -99
- data/test/glue/tc_stores.rb +0 -16
- data/test/glue/tc_uri.rb +0 -97
- data/test/glue/tc_validation.rb +0 -217
- data/test/public/dummy_mailer/registration.xhtml +0 -5
data/lib/glue/autoreload.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
require 'facet/dir/self/recurse'
|
2
|
-
|
3
|
-
module Kernel
|
4
|
-
|
5
|
-
# A Customized version of the autoreload from Facets. Also
|
6
|
-
# checks template files, and keeps a dirty flag.
|
7
|
-
|
8
|
-
def autoreload(check_interval=10, glob = '.')
|
9
|
-
Thread.new(Time.now) do |start_time|
|
10
|
-
check_dirty = lambda do |file,hash,file_mtime|
|
11
|
-
if File.exists?(file) and (mtime = File.stat(file).mtime) > (file_mtime[file] || start_time)
|
12
|
-
hash[file] = mtime
|
13
|
-
end
|
14
|
-
end
|
15
|
-
file_mtime = {}
|
16
|
-
|
17
|
-
files = []
|
18
|
-
Dir.recurse(glob) do |f|
|
19
|
-
if f !~ /\/_darcs\// and f =~ /(.?)\.x(.?)/
|
20
|
-
files << f
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
loop do
|
25
|
-
need_reload = Hash.new
|
26
|
-
sleep check_interval
|
27
|
-
$LOADED_FEATURES.each do |feature|
|
28
|
-
check_dirty.call(feature,need_reload,file_mtime)
|
29
|
-
$LOAD_PATH.each {|lp| check_dirty.call(File.join(lp, feature),need_reload,file_mtime)}
|
30
|
-
end
|
31
|
-
|
32
|
-
unless need_reload.empty?
|
33
|
-
$autoreload_dirty = true
|
34
|
-
need_reload.each_pair do |file,mtime|
|
35
|
-
file_mtime[file] = mtime
|
36
|
-
Logger.debug "File '#{ file }' reloaded" if $DBG
|
37
|
-
begin
|
38
|
-
load(file)
|
39
|
-
rescue Exception => e
|
40
|
-
Logger.info e.inspect
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
# Check for template files.
|
46
|
-
|
47
|
-
files.each do |file|
|
48
|
-
if File.exists?(file) and (mtime = File.stat(file).mtime) > (file_mtime[file] || start_time)
|
49
|
-
$autoreload_dirty = true
|
50
|
-
file_mtime[file] = mtime
|
51
|
-
Logger.debug "File '#{ file }' changed" if $DBG
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
end # loop
|
56
|
-
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
data/lib/glue/builder.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
module Glue
|
2
|
-
|
3
|
-
# A Builder integrates a number of Modules containing text
|
4
|
-
# manipulation utilities and provides an alternative
|
5
|
-
# 'accomulation' interface.
|
6
|
-
|
7
|
-
class Builder
|
8
|
-
|
9
|
-
# The builder output is accomulated in the buffer.
|
10
|
-
|
11
|
-
attr_accessor :buffer
|
12
|
-
|
13
|
-
class << self
|
14
|
-
|
15
|
-
def include_builder(*modules)
|
16
|
-
for mod in modules
|
17
|
-
include mod
|
18
|
-
for meth in mod.public_instance_methods
|
19
|
-
self.module_eval %{
|
20
|
-
alias_method :_mixin_#{meth}, :#{meth}
|
21
|
-
def #{meth}(*args)
|
22
|
-
@buffer << _mixin_#{meth}(*args)
|
23
|
-
return self
|
24
|
-
end
|
25
|
-
}
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
alias_method :builder, :include_builder
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
# Provide the target where the builder output will be
|
34
|
-
# accomulated. The builder utilizes duck typing to make it
|
35
|
-
# compatible with any target responding to <<.
|
36
|
-
|
37
|
-
def initialize(buffer = '', options = {})
|
38
|
-
@buffer = buffer
|
39
|
-
end
|
40
|
-
|
41
|
-
# Emit a text string.
|
42
|
-
|
43
|
-
def text!(str)
|
44
|
-
@buffer << str
|
45
|
-
|
46
|
-
return self
|
47
|
-
end
|
48
|
-
alias_method :print, :text!
|
49
|
-
alias_method :<<, :text!
|
50
|
-
|
51
|
-
def to_s
|
52
|
-
@buffer.to_s
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|
data/lib/glue/builder/xml.rb
DELETED
@@ -1,103 +0,0 @@
|
|
1
|
-
require 'glue/builder'
|
2
|
-
|
3
|
-
module Glue
|
4
|
-
|
5
|
-
# A Builder for programmatically building XML blocks.
|
6
|
-
#--
|
7
|
-
# TODO: move to nitro or move mixins here.
|
8
|
-
#++
|
9
|
-
|
10
|
-
class XmlBuilder < Builder
|
11
|
-
require 'nitro/helper/xhtml'
|
12
|
-
require 'nitro/helper/form'
|
13
|
-
require 'nitro/helper/table'
|
14
|
-
|
15
|
-
include_builder Nitro::XhtmlHelper
|
16
|
-
include_builder Nitro::TableHelper
|
17
|
-
include_builder Nitro::FormHelper
|
18
|
-
|
19
|
-
def method_missing(tag, *args, &block)
|
20
|
-
self.class.module_eval <<-"end_eval", __FILE__, __LINE__
|
21
|
-
def #{tag}(*args)
|
22
|
-
attrs = args.last.is_a?(Hash) ? args.pop : nil
|
23
|
-
|
24
|
-
if block_given?
|
25
|
-
start_tag!('#{tag}', attrs)
|
26
|
-
yield
|
27
|
-
end_tag!('#{tag}')
|
28
|
-
elsif (!args.empty?)
|
29
|
-
start_tag!('#{tag}', attrs)
|
30
|
-
@buffer << args.first.to_s
|
31
|
-
end_tag!('#{tag}')
|
32
|
-
else
|
33
|
-
start_tag!('#{tag}', attrs, false)
|
34
|
-
@buffer << ' />'
|
35
|
-
end
|
36
|
-
|
37
|
-
return self
|
38
|
-
end
|
39
|
-
end_eval
|
40
|
-
|
41
|
-
self.send(tag, *args, &block)
|
42
|
-
end
|
43
|
-
|
44
|
-
# Emit the start (opening) tag of an element.
|
45
|
-
|
46
|
-
def start_tag!(tag, attributes = nil, close = true)
|
47
|
-
unless attributes
|
48
|
-
if close
|
49
|
-
@buffer << "<#{tag}>"
|
50
|
-
else
|
51
|
-
@buffer << "<#{tag}"
|
52
|
-
end
|
53
|
-
else
|
54
|
-
@buffer << "<#{tag}"
|
55
|
-
for name, value in attributes
|
56
|
-
if value
|
57
|
-
@buffer << %| #{name}="#{value}"|
|
58
|
-
else
|
59
|
-
@buffer << %| #{name}="1"|
|
60
|
-
end
|
61
|
-
end
|
62
|
-
@buffer << ">" if close
|
63
|
-
end
|
64
|
-
|
65
|
-
return self
|
66
|
-
end
|
67
|
-
|
68
|
-
# Emit the end (closing) tag of an element.
|
69
|
-
|
70
|
-
def end_tag!(tag)
|
71
|
-
@buffer << "</#{tag}>"
|
72
|
-
|
73
|
-
return self
|
74
|
-
end
|
75
|
-
|
76
|
-
# Emit a comment.
|
77
|
-
|
78
|
-
def comment!(str)
|
79
|
-
@buffer << "<!-- #{str} -->"
|
80
|
-
|
81
|
-
return self
|
82
|
-
end
|
83
|
-
|
84
|
-
# Emit a processing instruction.
|
85
|
-
|
86
|
-
def processing_instruction!(name, attributes = nil)
|
87
|
-
unless attributes
|
88
|
-
@buffer << "<?#{name} ?>"
|
89
|
-
else
|
90
|
-
@buffer << "<?#{name} "
|
91
|
-
attributes.each do |a, v|
|
92
|
-
@buffer << %[#{a}="#{v}" ]
|
93
|
-
end
|
94
|
-
@buffer << "?>"
|
95
|
-
end
|
96
|
-
|
97
|
-
return self
|
98
|
-
end
|
99
|
-
alias_method :pi!, :processing_instruction!
|
100
|
-
|
101
|
-
end
|
102
|
-
|
103
|
-
end
|
data/lib/glue/cache.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
module Glue
|
2
|
-
|
3
|
-
# A general cache key.
|
4
|
-
|
5
|
-
class CacheKey
|
6
|
-
end
|
7
|
-
|
8
|
-
# A general cache mechanism.
|
9
|
-
#
|
10
|
-
# This cache system was originaly developed for Nitro. It is
|
11
|
-
# used to cache fragments, og objects (entities), sessions,
|
12
|
-
# application scoped variables and more.
|
13
|
-
|
14
|
-
class Cache
|
15
|
-
|
16
|
-
def update(hash)
|
17
|
-
hash.each { |key, value| self[key] = value }
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
data/lib/glue/cache/drb.rb
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
require 'drb'
|
2
|
-
|
3
|
-
require 'glue/cache/memory'
|
4
|
-
|
5
|
-
module Glue
|
6
|
-
|
7
|
-
# A cached backed in a DRb server.
|
8
|
-
#
|
9
|
-
# === Example
|
10
|
-
#
|
11
|
-
# This cache needs a corresponding DRb server. Here is how you
|
12
|
-
# can setup the standard Nitro Drb server to keep a DrbCache:
|
13
|
-
#
|
14
|
-
# require 'glue/cache/memory'
|
15
|
-
#
|
16
|
-
# class MyDrbServer < Nitro::DrbServer
|
17
|
-
# def setup_drb_objects
|
18
|
-
# ..
|
19
|
-
# @my_cache = SyncHash.new
|
20
|
-
# DRb.start_service("druby://#{my_drb_address}:#{my_drb_port}", @my_cache)
|
21
|
-
# ..
|
22
|
-
# end
|
23
|
-
# end
|
24
|
-
#
|
25
|
-
# MyDrbServer.start
|
26
|
-
|
27
|
-
class DrbCache < MemoryCache
|
28
|
-
|
29
|
-
# Initialize the cache.
|
30
|
-
#
|
31
|
-
# === Options
|
32
|
-
#
|
33
|
-
# :address = The address of the DRb cache object.
|
34
|
-
# :port = The port of the DRb cache object.
|
35
|
-
|
36
|
-
# The address of the Session cache / store (if distibuted).
|
37
|
-
|
38
|
-
setting :address, :default => '127.0.0.1', :doc => 'The address of the Session cache'
|
39
|
-
|
40
|
-
# The port of the Session DRb cache / store (if distributed).
|
41
|
-
|
42
|
-
setting :port, :default => 9069, :doc => 'The port of the Session cache'
|
43
|
-
|
44
|
-
|
45
|
-
def initialize(address = DrbCache.address, port = DrbCache.port)
|
46
|
-
@hash = DRbObject.new(nil, "druby://#{address}:#{port}")
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
data/lib/glue/cache/file.rb
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
require 'uri'
|
2
|
-
require 'fileutils'
|
3
|
-
require 'tmpdir'
|
4
|
-
|
5
|
-
module Glue
|
6
|
-
|
7
|
-
class FileCache
|
8
|
-
|
9
|
-
setting :basedir, :default => "#{Dir.tmpdir}/nitro_file_cache", :doc => 'The directory to store files'
|
10
|
-
|
11
|
-
def initialize(name = "cache", keepalive = nil)
|
12
|
-
@path = File.join(FileCache.basedir, name)
|
13
|
-
@keepalive = keepalive
|
14
|
-
|
15
|
-
FileUtils.mkdir_p(@path, :mode => 0700)
|
16
|
-
end
|
17
|
-
|
18
|
-
def []=(k,v)
|
19
|
-
fn = File.join(@path, escape_filename(k.to_s) )
|
20
|
-
encode_file(fn, v)
|
21
|
-
end
|
22
|
-
alias :set :[]=
|
23
|
-
|
24
|
-
def [](k)
|
25
|
-
fn = File.join(@path, escape_filename(k.to_s) )
|
26
|
-
return nil unless File.exists?(fn)
|
27
|
-
decode_file(fn)
|
28
|
-
end
|
29
|
-
alias :get :[]
|
30
|
-
|
31
|
-
def delete(k)
|
32
|
-
f = File.join(@path, escape_filename(k.to_s))
|
33
|
-
File.delete(f) if File.exists?(f)
|
34
|
-
end
|
35
|
-
|
36
|
-
def gc!
|
37
|
-
return unless @keepalive
|
38
|
-
|
39
|
-
now = Time.now
|
40
|
-
all.each do |fn|
|
41
|
-
expire_time = File.stat(fn).atime + @keepalive
|
42
|
-
File.delete(fn) if now > expire_time
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def all
|
47
|
-
Dir.glob( File.join(@path, '*' ) )
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
def decode_file(fn)
|
53
|
-
val = nil
|
54
|
-
File.open(fn,"rb") do |f|
|
55
|
-
f.flock(File::LOCK_EX)
|
56
|
-
val = Marshal.load( f.read )
|
57
|
-
f.flock(File::LOCK_UN)
|
58
|
-
end
|
59
|
-
return val
|
60
|
-
end
|
61
|
-
|
62
|
-
def encode_file(fn, value)
|
63
|
-
File.open(fn, "wb") do |f|
|
64
|
-
f.flock(File::LOCK_EX)
|
65
|
-
f.chmod(0600)
|
66
|
-
f.write(Marshal.dump(value))
|
67
|
-
f.flock(File::LOCK_UN)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
# need this for fat filesystems
|
72
|
-
def escape_filename(fn)
|
73
|
-
URI.escape(fn, /["\/:;|=,\[\]]/)
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
data/lib/glue/cache/memcached.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
# specifications:
|
2
|
-
# http://cvs.danga.com/browse.cgi/wcmtools/memcached/doc/protocol.txt?rev=HEAD&content-type=text/plain
|
3
|
-
#
|
4
|
-
# very simple (= very fast) client for memcached
|
5
|
-
#
|
6
|
-
# i found the Ruby-MemCache library a little bit buggy and complicated, so i made my own before
|
7
|
-
# fixing it ;)
|
8
|
-
#
|
9
|
-
# TODO socket disconnection handling
|
10
|
-
# TODO error handling
|
11
|
-
# TODO multiple servers connections
|
12
|
-
|
13
|
-
require "socket"
|
14
|
-
|
15
|
-
module Glue
|
16
|
-
|
17
|
-
class MemCached
|
18
|
-
|
19
|
-
setting :address, :default => 'localhost', :doc => 'Server address'
|
20
|
-
setting :port, :default => 11211, :doc => 'Server port'
|
21
|
-
|
22
|
-
def initialize(name = "cache", keepalive = nil)
|
23
|
-
@sock = TCPSocket.new(MemCached.address, MemCached.port)
|
24
|
-
@name = name
|
25
|
-
@keepalive = keepalive
|
26
|
-
end
|
27
|
-
|
28
|
-
def []=(k,v)
|
29
|
-
if @keepalive
|
30
|
-
exptime = (Time.now + @keepalive).to_i
|
31
|
-
else
|
32
|
-
exptime = 0
|
33
|
-
end
|
34
|
-
|
35
|
-
data = Marshal.dump(v)
|
36
|
-
@sock.print("set #{@name}:#{k} 0 #{exptime} #{data.size}\r\n#{data}\r\n")
|
37
|
-
response = @sock.gets # "STORED\r\n"
|
38
|
-
v
|
39
|
-
end
|
40
|
-
alias :set :[]=
|
41
|
-
|
42
|
-
def [](k)
|
43
|
-
@sock.print("get #{@name}:#{k}\r\n")
|
44
|
-
resp = @sock.gets
|
45
|
-
if resp == "END\r\n"
|
46
|
-
return nil
|
47
|
-
end
|
48
|
-
|
49
|
-
#dummy, key, flags, size
|
50
|
-
size = resp.split(/ /).last.to_i
|
51
|
-
raw_data = @sock.read(size)
|
52
|
-
@sock.gets # \r\n
|
53
|
-
@sock.gets # END\r\n
|
54
|
-
Marshal.load( raw_data )
|
55
|
-
end
|
56
|
-
alias :get :[]
|
57
|
-
|
58
|
-
def delete(k)
|
59
|
-
@sock.print("delete #{@name}:#{k}\r\n")
|
60
|
-
@sock.gets # "DELETED\r\n"
|
61
|
-
end
|
62
|
-
|
63
|
-
def gc!
|
64
|
-
# garbage collection is handled by the memcache server
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
end
|