glue 0.27.0 → 0.28.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,7 @@
2
2
 
3
3
  TITLE : &title Glue
4
4
  NAME : &pkg glue
5
- VERSION : '0.27.0'
5
+ VERSION : '0.28.0'
6
6
  STATUS : beta
7
7
 
8
8
  AUTHOR : George Moschovitis
@@ -15,7 +15,7 @@ DESCRIPTION: >
15
15
  Utility methods and classes for Nitro.
16
16
 
17
17
  DEPENDENCIES:
18
- - [ facets, '= 2005.10.30' ]
18
+ - [ facets, '= 1.0.2' ]
19
19
  - [ cmdparse, '= 2.0.0' ]
20
20
 
21
21
  DISTRIBUTE: [ gem, tgz, zip ]
data/README CHANGED
@@ -1,4 +1,4 @@
1
- = Glue 0.27.0 README
1
+ = Glue 0.28.0 README
2
2
 
3
3
  Useful utilites and methods.
4
4
 
data/Rakefile CHANGED
@@ -30,7 +30,7 @@ task :default => :package
30
30
  # Run all tests.
31
31
 
32
32
  Rake::TestTask.new do |t|
33
- cwd = File.expand_path(File.join(File.dirname(__FILE__) + '.'))
33
+ cwd = File.expand_path(File.join(File.dirname(__FILE__), '..'))
34
34
  t.libs << 'test'
35
35
  %w[glue nitro og].each do |dir|
36
36
  t.libs << File.join(cwd, dir, 'lib')
@@ -1,3 +1,17 @@
1
+ == Version 0.28.0
2
+
3
+ * New generalized caching system. The caching code is refactored
4
+ in a new Glue system. At the moment, caches in memory, DRb,
5
+ filesystem and Og are provided. A memcache version will be available
6
+ in the near future. The new caching system is used to implement
7
+ Session stores, Og caching, Fragment caching, and Application scoped
8
+ parameters. A useful DRb cache management script is provided to
9
+ manage multiple DRb caches.
10
+
11
+ * Integration of Facets 1.0.1. The new library features a better
12
+ API and better implementation of various features.
13
+
14
+
1
15
  == Version 0.27.0
2
16
 
3
17
  Various fixes and smaller improvements.
@@ -11,9 +11,9 @@
11
11
  require 'English'
12
12
  require 'pp'
13
13
 
14
- require 'mega/null'
15
- require 'mega/dynamod'
16
- require 'nano/module/is'
14
+ require 'facet/nullclass'
15
+ require 'glue/paramix' # keep this before module/is
16
+ require 'facet/module/is'
17
17
 
18
18
  require 'glue/property'
19
19
  require 'glue/attribute'
@@ -36,7 +36,7 @@ module Glue
36
36
 
37
37
  # The version.
38
38
 
39
- Version = '0.27.0'
39
+ Version = '0.28.0'
40
40
 
41
41
  # Library path.
42
42
 
@@ -1,4 +1,4 @@
1
- require 'mega/functor'
1
+ require 'facet/functor'
2
2
 
3
3
  module Enumerable
4
4
 
@@ -1,4 +1,4 @@
1
- require 'mega/inheritor'
1
+ require 'facet/inheritor'
2
2
 
3
3
  module Glue
4
4
 
@@ -1,4 +1,4 @@
1
- require 'nano/dir/self/recurse'
1
+ require 'facet/dir/self/recurse'
2
2
 
3
3
  module Kernel
4
4
 
@@ -7,7 +7,11 @@ module Kernel
7
7
 
8
8
  def autoreload(check_interval=10, glob = '.')
9
9
  Thread.new(Time.now) do |start_time|
10
-
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
11
15
  file_mtime = {}
12
16
 
13
17
  files = []
@@ -18,19 +22,22 @@ module Kernel
18
22
  end
19
23
 
20
24
  loop do
25
+ need_reload = Hash.new
21
26
  sleep check_interval
22
27
  $LOADED_FEATURES.each do |feature|
23
- $LOAD_PATH.each do |lp|
24
- file = File.join(lp, feature)
25
- if File.exists?(file) and (mtime = File.stat(file).mtime) > (file_mtime[file] || start_time)
26
- $autoreload_dirty = true
27
- file_mtime[file] = mtime
28
- STDERR.puts "File '#{ file }' reloaded"
29
- begin
30
- load(file)
31
- rescue Exception => e
32
- STDERR.puts e.inspect
33
- end
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
+ STDERR.puts "File '#{ file }' reloaded"
37
+ begin
38
+ load(file)
39
+ rescue Exception => e
40
+ STDERR.puts e.inspect
34
41
  end
35
42
  end
36
43
  end
@@ -44,7 +51,8 @@ module Kernel
44
51
  STDERR.puts "File '#{ file }' changed"
45
52
  end
46
53
  end
47
- end
54
+
55
+ end # loop
48
56
 
49
57
  end
50
58
  end
@@ -0,0 +1,19 @@
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 used
11
+ # to cache fragments, og objects (entities), sessions, application
12
+ # scoped variables and more.
13
+
14
+ class Cache
15
+ end
16
+
17
+ end
18
+
19
+ # * George Moschovitis <gm@navel.gr>
@@ -0,0 +1,49 @@
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
+ def initialize(options = {})
37
+ c = {
38
+ :address => '127.0.0.1',
39
+ :port => 9080,
40
+ }.update(options)
41
+
42
+ @hash = DRbObject.new(nil, "druby://#{options[:address]}:#{options[:port]}")
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ # * George Moschovitis <gm@navel.gr>
@@ -0,0 +1,59 @@
1
+ require 'fileutils'
2
+ require 'tmpdir'
3
+
4
+ module Glue
5
+
6
+ # TODO: safe locking of files, because Nitro can be multiprocess
7
+
8
+ class FileCache
9
+
10
+ setting :basedir, :default => "#{Dir.tmpdir}/nitro_file_cache", :doc => 'The directory to store files'
11
+
12
+ def initialize(name, keepalive = nil)
13
+ @path = File.join(FileCache.basedir, name)
14
+ @keepalive = keepalive
15
+
16
+ FileUtils.mkdir_p(@path, :mode => 0700)
17
+ end
18
+
19
+ def []=(k,v)
20
+ fn = File.join(@path, k.to_s)
21
+ encode_file(fn, v)
22
+ end
23
+
24
+ def [](k)
25
+ fn = File.join(@path, k.to_s)
26
+ return nil unless File.exists?(fn)
27
+ decode_file(fn)
28
+ end
29
+
30
+ def gc!
31
+ return unless @keepalive
32
+
33
+ now = Time.now
34
+ all.each do |fn|
35
+ expire_time = File.stat(fn).atime + @keepalive
36
+ File.delete(fn) if now > expire_time
37
+ end
38
+ end
39
+
40
+ def all
41
+ Dir.glob( File.join(@path, '*' ) )
42
+ end
43
+
44
+ private
45
+
46
+ def decode_file(fn)
47
+ Marshal.load( File.read(fn) )
48
+ end
49
+
50
+ def encode_file(fn, value)
51
+ File.open(fn, "w") do |f|
52
+ f.chmod(0600)
53
+ f.write(Marshal.dump(value))
54
+ end
55
+ end
56
+
57
+ end
58
+ end
59
+
@@ -0,0 +1,2 @@
1
+ # gmosx: not implemented yet, anyone wants to take over this
2
+ # bounty?
@@ -0,0 +1,81 @@
1
+ require 'facet/synchash'
2
+
3
+ require 'glue/cache'
4
+
5
+ module Glue
6
+
7
+ # A cache backed in memory.
8
+ #--
9
+ # This implementation is also the base for the Drb Cache.
10
+ #++
11
+
12
+ class MemoryCache < Cache
13
+ attr :hash
14
+
15
+ def initialize(options = {})
16
+ if options[:sync]
17
+ @hash = SyncHash
18
+ else
19
+ @hash = {}
20
+ end
21
+ end
22
+
23
+ # Get an object from the cache.
24
+
25
+ def get(key, options = nil)
26
+ @hash[key]
27
+ end
28
+ alias_method :read, :get
29
+ alias_method :[], :get
30
+
31
+ # Put an object in the cache.
32
+
33
+ def set(key, value = nil, options = nil)
34
+ @hash[key] = value
35
+ end
36
+ alias_method :put, :set
37
+ alias_method :write, :set
38
+ alias_method :[]=, :set
39
+
40
+ # Delete an object from the cache.
41
+
42
+ def delete(key, options = nil)
43
+ @hash.delete(key)
44
+ end
45
+ alias_method :remove, :delete
46
+
47
+ def delete_if(&block)
48
+ @hash.delete_if(&block)
49
+ end
50
+
51
+ # Perform session garbage collection. Typically this method
52
+ # is called from a cron like mechanism.
53
+
54
+ def gc!
55
+ delete_if { |key, s| s.expired? }
56
+ end
57
+
58
+ # Return the mapping.
59
+
60
+ def mapping
61
+ @hash
62
+ end
63
+
64
+ # Return all keys in the cache.
65
+
66
+ def keys
67
+ @hash.keys
68
+ end
69
+
70
+ # Return all objects in the cache.
71
+
72
+ def all
73
+ @hash.values
74
+ end
75
+ alias_method :values, :all
76
+
77
+ end
78
+
79
+ end
80
+
81
+ # * George Moschovitis <gm@navel.gr>
@@ -0,0 +1,56 @@
1
+ require 'og'
2
+ require 'base64'
3
+
4
+ module Glue
5
+
6
+ class OgCached
7
+ prop_accessor :unique_id, String, :unique => true
8
+ prop_accessor :expires, Time
9
+ prop_accessor :cache_name, String
10
+ prop_accessor :content
11
+ end
12
+
13
+ class OgCache
14
+
15
+ def initialize(cache_name, keepalive = nil)
16
+ @cache_name = cache_name
17
+ @keepalive = keepalive
18
+ end
19
+
20
+ def []=(k,v)
21
+ unless s = OgCached.find_by_unique_id_and_cache_name(k.to_s, @cache_name)
22
+ s = OgCached.new
23
+ s.cache_name = @cache_name
24
+ s.expires = Time.now + @keepalive if @keepalive
25
+ s.unique_id = k.to_s
26
+ end
27
+ #s.content = v.to_yaml
28
+ s.content = encode(v)
29
+ s.save
30
+ end
31
+
32
+ def [](k)
33
+ s = OgCached.find_by_unique_id_and_cache_name(k.to_s, @cache_name) and decode(s.content)
34
+ end
35
+
36
+ def gc!
37
+ OgCached.find(:condition => ["expires < ? AND cache_name = ?", Time.now, @cache_name]).each {|s| s.delete }
38
+ end
39
+
40
+ def all
41
+ OgCached.find_by_cache_name(@cache_name)
42
+ end
43
+
44
+ private
45
+
46
+ def encode(c)
47
+ Base64.encode64(Marshal.dump(c))
48
+ end
49
+
50
+ def decode(c)
51
+ Marshal::load(Base64.decode64(c))
52
+ #s.content = YAML::load(s.content)
53
+ end
54
+
55
+ end
56
+ end
@@ -1,7 +1,7 @@
1
1
  require 'yaml'
2
2
 
3
- require 'nano/kernel/constant'
4
- require 'mega/synchash'
3
+ require 'facet/kernel/constant'
4
+ require 'facet/synchash'
5
5
 
6
6
  require 'glue/attribute'
7
7
  require 'glue/flexob'
@@ -47,6 +47,10 @@ class Configuration
47
47
  def to_s
48
48
  @value.to_s
49
49
  end
50
+
51
+ def <=>(other)
52
+ "#{owner}.#{name}" <=> "#{other.owner}.#{other.name}"
53
+ end
50
54
  end
51
55
 
52
56
  class << self
@@ -109,7 +113,7 @@ class Configuration
109
113
  alias_method :[], :settings
110
114
 
111
115
  def method_missing(sym)
112
- if sym.to_s =~ /[A-Z]/ # nano's capitalized? is buggy at the moment.
116
+ if sym.to_s =~ /[A-Z]/ # FIXME: facets's capitalized? is buggy at the moment.
113
117
  Flexob.new(self[constant(sym)])
114
118
  end
115
119
  end
@@ -1,6 +1,6 @@
1
- require 'nano/kernel/constant'
1
+ require 'facet/kernel/constant'
2
2
 
3
- require 'mega/orm_support'
3
+ require 'facet/ormsupport'
4
4
 
5
5
  require 'glue/configuration'
6
6
  require 'glue/template'
@@ -43,7 +43,7 @@ class Logger
43
43
  unless expr.respond_to? :to_str
44
44
  warn "trace: Can't evaluate the given value: #{caller.first}"
45
45
  else
46
- require 'nano/binding/self/of_caller'
46
+ require 'facet/binding/self/of_caller'
47
47
 
48
48
  Binding.of_caller do |b|
49
49
  value = b.eval(expr.to_str)
@@ -155,7 +155,7 @@ class Logger
155
155
  unless expr.respond_to? :to_str
156
156
  warn "trace: Can't evaluate the given value: #{caller.first}"
157
157
  else
158
- require 'nano/binding/self/of_caller'
158
+ require 'facet/binding/self/of_caller'
159
159
 
160
160
  Binding.of_caller do |b|
161
161
  value = eval(expr.to_str, b)
@@ -2,7 +2,7 @@ require 'singleton'
2
2
  require 'redcloth'
3
3
  require 'cgi'
4
4
 
5
- require 'mega/class_inherit'
5
+ require 'facet/classinherit'
6
6
 
7
7
  require 'glue/sanitize'
8
8
 
@@ -0,0 +1,233 @@
1
+ # gmosx: replaces gems/facet_more-1.0.1/lib/facet/paramix.rb
2
+ # to make Nitro work, till we come up with a better solution.
3
+ #
4
+ # This is a temporary solution until the Facets version is
5
+ # fixed.
6
+
7
+ #--
8
+ # Parametric Mixins
9
+ #
10
+ # Copyright (c) 2005 Thomas Sawyer and George Moschovitis
11
+ #
12
+ # Ruby License
13
+ #
14
+ # This module is free software. You may use, modify, and/or redistribute this
15
+ # software under the same terms as Ruby.
16
+ #
17
+ # This program is distributed in the hope that it will be useful, but WITHOUT
18
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19
+ # FOR A PARTICULAR PURPOSE.
20
+ #
21
+ # ==========================================================================
22
+ # Revision History
23
+ # --------------------------------------------------------------------------
24
+ # 2005-12-02 trans * Simplified into fine elegance.
25
+ # 2005-09-19 trans * Cleaned up and renamed.
26
+ # 2005-04-28 trans * Added to Calibre.
27
+ # ==========================================================================
28
+ #
29
+ #++
30
+
31
+ require 'facet/module/basename'
32
+
33
+ #:title: Parametric Mixins
34
+ #
35
+ # Parametric Mixins provides parameters for mixin modules.
36
+ # Module parameters can be set at the time of inclusion or extension,
37
+ # then accessed via an instance method of the same name as the included
38
+ # module.
39
+ #
40
+ # == Synopsis
41
+ #
42
+ # module Mixin
43
+ # def hello
44
+ # puts "Hello from #{Mixin(:name)}"
45
+ # end
46
+ # end
47
+ #
48
+ # class MyClass
49
+ # include Mixin, :name => 'Ruby'
50
+ # end
51
+ #
52
+ # m = MyClass.new
53
+ # m.hello -> 'Hello from Ruby'
54
+ #
55
+ # You can view the full set of parameters via the #mixin_parameters
56
+ # class method, which returns a hash keyed on the included modules.
57
+ #
58
+ # MyClass.mixin_parameters #=> {Mixin=>{:name=>'Ruby'}}
59
+ # MyClass.mixin_parameters[Mixin] #=> {:name=>'Ruby'}
60
+ #
61
+ # To create _dynamic mixins_ you can use the #included callback
62
+ # method along with mixin_parameters method like so:
63
+ #
64
+ # module Mixin
65
+ # def included( base )
66
+ # parms = base.mixin_parameters[self]
67
+ # base.class_eval {
68
+ # def hello
69
+ # puts "Hello from #{parms(:name)}"
70
+ # end
71
+ # }
72
+ # end
73
+ # end
74
+ #
75
+ # More conveniently a new callback has been added, #included_with_parameters,
76
+ # which passes in the parameters in addition to the base class/module.
77
+ #
78
+ # module Mixin
79
+ # def included_with_parameters( base, parms )
80
+ # base.class_eval {
81
+ # def hello
82
+ # puts "Hello from #{parms(:name)}"
83
+ # end
84
+ # }
85
+ # end
86
+ # end
87
+ #
88
+ # We would prefer to have passed the parameters through the #included callback
89
+ # method itself, but implementation of such a feature is much more complicated.
90
+ # If a reasonable solution presents itself in the future however, we will fix.
91
+ #
92
+ # == Author(s)
93
+ #
94
+ # * George Moschovitis
95
+ # * Thomas Sawyer
96
+ #
97
+
98
+ class Module
99
+
100
+ # Store for module parameters. This is local per module
101
+ # and indexed on module/class included-into.
102
+ def mixin_parameters ; @mixin_parameters ||= {} ; end
103
+
104
+ alias_method :include_without_parameters, :include
105
+
106
+ def include(*args)
107
+ params = args.last.is_a?(Hash) ? args.pop : {}
108
+ =begin
109
+ for mod in args
110
+ mixin_parameters[mod] = params
111
+ define_method( mod.basename ) do |key|
112
+ if params.key?(key)
113
+ params[key]
114
+ else
115
+ super if defined?( super )
116
+ end
117
+ end
118
+ end
119
+ =end
120
+ r = include_without_parameters(*args)
121
+ for mod in args
122
+ mod.included_with_parameters( self, params ) if mod.respond_to?(:included_with_parameters)
123
+ end
124
+ r
125
+ end
126
+
127
+ alias_method :extend_without_parameters, :extend
128
+
129
+ def extend(*args)
130
+ params = args.last.is_a?(Hash) ? args.pop : nil
131
+ =begin
132
+ for mod in args
133
+ (class << self; self; end).class_eval do
134
+ mixin_parameters[mod] = params
135
+ define_method( mod.basename ) do |key|
136
+ if params.key?(key)
137
+ params[key]
138
+ else
139
+ super if defined?( super )
140
+ end
141
+ end
142
+ end
143
+ end
144
+ =end
145
+ r = extend_without_parameters(*args)
146
+ extended_with_parameters( self, params ) if method_defined?(:extended_with_parameters)
147
+ r
148
+ end
149
+
150
+ end
151
+
152
+
153
+
154
+ # _____ _
155
+ # |_ _|__ ___| |_
156
+ # | |/ _ \/ __| __|
157
+ # | | __/\__ \ |_
158
+ # |_|\___||___/\__|
159
+ #
160
+
161
+ =begin test
162
+
163
+ require 'test/unit'
164
+ require 'facet/kernel/adhoc'
165
+
166
+ class TC01 < Test::Unit::TestCase
167
+
168
+ module M
169
+ def f
170
+ M(:p)
171
+ end
172
+ def self.included_with_parameters( base, parms )
173
+ end
174
+ end
175
+
176
+ class C
177
+ include M, :p => "check"
178
+ end
179
+
180
+ class D
181
+ include M, :p => "steak"
182
+ end
183
+
184
+ def test_01_001
185
+ c = C.new
186
+ assert_equal( "check", c.f )
187
+ end
188
+
189
+ def test_01_002
190
+ d = D.new
191
+ assert_equal( "steak", d.f )
192
+ end
193
+
194
+ def test_01_003
195
+ assert_equal( {M=>{:p => "check"}}, C.mixin_parameters )
196
+ assert_equal( {M=>{:p => "steak"}}, D.mixin_parameters )
197
+ end
198
+
199
+ end
200
+
201
+
202
+ class TC02 < Test::Unit::TestCase
203
+
204
+ module M
205
+ def f
206
+ M(:p)
207
+ end
208
+ end
209
+
210
+ class C
211
+ extend M, :p => "mosh"
212
+ end
213
+
214
+ class D
215
+ extend M, :p => "many"
216
+ end
217
+
218
+ def test_02_001
219
+ assert_equal( "mosh", C.f )
220
+ end
221
+
222
+ def test_02_002
223
+ assert_equal( "many", D.f )
224
+ end
225
+
226
+ def test_02_003
227
+ assert_equal( {M=>{:p => "mosh"}}, C.adhoc.mixin_parameters )
228
+ assert_equal( {M=>{:p => "many"}}, D.adhoc.mixin_parameters )
229
+ end
230
+
231
+ end
232
+
233
+ =end
@@ -1,12 +1,12 @@
1
- require 'mega/annotation'
2
- require 'mega/inheritor'
3
- require 'mega/dictionary'
1
+ require 'facet/annotation'
2
+ require 'facet/inheritor'
3
+ require 'facet/dictionary'
4
4
 
5
5
  require 'glue/on_included'
6
- require 'og/entity'
7
6
  require 'glue/validation'
8
- require 'og/relation/all'
9
7
  require 'glue/aspects'
8
+ require 'og/entity'
9
+ require 'og/relation/all'
10
10
 
11
11
  # A convienience structure that holds property
12
12
  # metadata.
@@ -71,13 +71,19 @@ class Property
71
71
 
72
72
  prop_value = values[prop_name]
73
73
 
74
- # to_s must be called on the prop_value incase the request is IOString
74
+ # to_s must be called on the prop_value incase the
75
+ # request is IOString.
76
+
75
77
  prop_value = prop_value.to_s unless prop_value.is_a?(Hash) or prop_value.is_a?(Array)
76
78
 
77
- # If property is a Blob dont overwrite current property's data if "".
79
+ # If property is a Blob dont overwrite current
80
+ # property's data if "".
81
+
78
82
  break if prop.klass == Og::Blob and prop_value.empty?
79
83
 
80
- # if custom preprocessing is active then try and preprocess
84
+ # If custom preprocessing is active then try and
85
+ # preprocess.
86
+
81
87
  prop_value = preprocess_value(obj, prop, prop_value) if options[:preprocess]
82
88
 
83
89
  # assign using __force_ methods.
@@ -263,7 +269,7 @@ class Module
263
269
  end
264
270
  alias :property :prop_accessor
265
271
 
266
- # NITRO specific!! leave blank in nano/mega.
272
+ # NITRO specific!! leave blank in facets.
267
273
  # TODO: factor in eval_helpers into the hook!
268
274
 
269
275
  def self.__add_prop_hook__(m)
@@ -97,7 +97,7 @@ module TemplateMixin
97
97
  # (useful in xsl stylesheets)
98
98
  # Examples: %nbsp;, %rquo;
99
99
 
100
- text.gsub!(/%(\S*?);/, '&\1;')
100
+ text.gsub!(/%(#\d+|\w+);/, '&\1;')
101
101
 
102
102
  # Compile time ruby code. This code is evaluated when
103
103
  # compiling the template and the result injected directly
@@ -1,7 +1,7 @@
1
1
  require 'uri'
2
2
  require 'cgi'
3
3
 
4
- require 'nano/string/blank'
4
+ require 'facet/string/blank'
5
5
 
6
6
  module Glue
7
7
 
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: glue
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.27.0
7
- date: 2006-01-16 00:00:00 +02:00
6
+ version: 0.28.0
7
+ date: 2006-02-06 00:00:00 +02:00
8
8
  summary: Utility methods and classes for Nitro.
9
9
  require_paths:
10
10
  - lib
@@ -15,7 +15,7 @@ description:
15
15
  autorequire:
16
16
  default_executable:
17
17
  bindir: bin
18
- has_rdoc: true
18
+ has_rdoc: false
19
19
  required_ruby_version: !ruby/object:Gem::Version::Requirement
20
20
  requirements:
21
21
  - - ">"
@@ -53,16 +53,19 @@ files:
53
53
  - lib/glue/sanitize.rb
54
54
  - lib/glue/property.rb
55
55
  - lib/glue/on_included.rb
56
+ - lib/glue/cache
56
57
  - lib/glue/html.rb
57
58
  - lib/glue/mailer.rb
58
59
  - lib/glue/mail.rb
59
60
  - lib/glue/logger.rb
60
61
  - lib/glue/attribute.rb
62
+ - lib/glue/paramix.rb
61
63
  - lib/glue/flexob.rb
62
64
  - lib/glue/fixture.rb
63
65
  - lib/glue/builder.rb
64
66
  - lib/glue/configuration.rb
65
67
  - lib/glue/expirable.rb
68
+ - lib/glue/cache.rb
66
69
  - lib/glue/aspects.rb
67
70
  - lib/glue/markup.rb
68
71
  - lib/glue/accumulate.rb
@@ -70,6 +73,11 @@ files:
70
73
  - lib/glue/builder/xml.rb
71
74
  - lib/glue/mailer/outgoing.rb
72
75
  - lib/glue/mailer/incoming.rb
76
+ - lib/glue/cache/file.rb
77
+ - lib/glue/cache/og.rb
78
+ - lib/glue/cache/memcache.rb
79
+ - lib/glue/cache/memory.rb
80
+ - lib/glue/cache/drb.rb
73
81
  - lib/html/tokenizer.rb
74
82
  - lib/html/version.rb
75
83
  - lib/html/document.rb
@@ -121,7 +129,7 @@ dependencies:
121
129
  requirements:
122
130
  - - "="
123
131
  - !ruby/object:Gem::Version
124
- version: 2005.10.30
132
+ version: 1.0.2
125
133
  version:
126
134
  - !ruby/object:Gem::Dependency
127
135
  name: cmdparse