glue 0.29.0 → 0.30.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ProjectInfo +17 -29
- data/README +2 -2
- data/doc/RELEASES +8 -0
- data/lib/glue.rb +5 -5
- data/lib/glue/autoreload.rb +2 -2
- data/lib/glue/builder.rb +17 -6
- data/lib/glue/builder/xml.rb +4 -13
- data/lib/glue/cache/drb.rb +2 -3
- data/lib/glue/cache/file.rb +3 -3
- data/lib/glue/configuration.rb +124 -40
- data/lib/glue/fixture.rb +2 -1
- data/lib/glue/localization.rb +2 -1
- data/lib/glue/property.rb +13 -9
- data/test/glue/tc_aspects.rb +4 -6
- data/test/glue/tc_configuration.rb +12 -3
- data/test/glue/tc_fixture.rb +56 -2
- data/test/glue/tc_flexob.rb +2 -1
- data/test/glue/tc_stores.rb +2 -1
- metadata +43 -57
- data/Rakefile +0 -222
- data/lib/glue/aspects.rb +0 -230
- data/lib/glue/expirable.rb +0 -39
- data/lib/glue/on_included.rb +0 -48
- data/lib/glue/paramix.rb +0 -233
data/ProjectInfo
CHANGED
@@ -2,40 +2,38 @@
|
|
2
2
|
|
3
3
|
TITLE : &title Glue
|
4
4
|
NAME : &pkg glue
|
5
|
-
VERSION : '0.
|
5
|
+
VERSION : '0.30.0'
|
6
6
|
STATUS : beta
|
7
7
|
|
8
8
|
AUTHOR : George Moschovitis
|
9
9
|
EMAIL : &email gm@navel.gr
|
10
|
-
HOMEPAGE : "http://www.
|
10
|
+
HOMEPAGE : "http://www.nitroproject.org"
|
11
11
|
|
12
12
|
SUMMARY: Utility methods and classes for Nitro.
|
13
13
|
|
14
14
|
DESCRIPTION: >
|
15
15
|
Utility methods and classes for Nitro.
|
16
16
|
|
17
|
-
DEPENDENCIES:
|
18
|
-
- [ facets, '= 1.0.3' ]
|
19
|
-
- [ cmdparse, '= 2.0.0' ]
|
20
|
-
|
21
|
-
DISTRIBUTE: [ gem, tgz, zip ]
|
22
|
-
|
23
17
|
RUBYFORGE:
|
24
18
|
PROJECT: 'nitro'
|
25
19
|
USERNAME: 'gmosx'
|
26
20
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
21
|
+
DEPENDENCIES:
|
22
|
+
- [ facets, '= 1.3.3' ]
|
23
|
+
|
24
|
+
PACKAGE: !!package
|
25
|
+
distribute: [ gem, tgz, zip ]
|
26
|
+
|
27
|
+
RDOC: !!rdoc
|
28
|
+
dir: rdoc
|
29
|
+
options: ['--all', '--inline-source']
|
30
|
+
include:
|
31
|
+
- 'lib/glue/**/*'
|
32
|
+
- '[A-Z]*'
|
33
33
|
|
34
|
-
|
35
|
-
#TEST:
|
36
|
-
# fixture: ''
|
34
|
+
TEST: !!test
|
37
35
|
|
38
|
-
ANNOUNCE:
|
36
|
+
ANNOUNCE: !!announce
|
39
37
|
to: george.moschovitis@gmail.com
|
40
38
|
from: gm@navel.gr
|
41
39
|
domain: navel.gr
|
@@ -47,15 +45,5 @@ ANNOUNCE:
|
|
47
45
|
file: ANN
|
48
46
|
slogan: Glue
|
49
47
|
links:
|
50
|
-
- http://www.
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
48
|
+
- http://www.nitroproject.org
|
61
49
|
|
data/README
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
= Glue 0.
|
1
|
+
= Glue 0.30.0 README
|
2
2
|
|
3
3
|
Useful utilites and methods.
|
4
4
|
|
@@ -6,7 +6,7 @@ Useful utilites and methods.
|
|
6
6
|
== Purpose
|
7
7
|
|
8
8
|
Useful libraries are stored here. An attempt is made to
|
9
|
-
graduate smaller libraries to the more general
|
9
|
+
graduate smaller libraries to the more general Facets
|
10
10
|
ruby project.
|
11
11
|
|
12
12
|
|
data/doc/RELEASES
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== Version 0.30.0
|
2
|
+
|
3
|
+
Cleaned up the codebase. Removed files duplicating functionality
|
4
|
+
already present in Facets. Moreover, we moved several generally
|
5
|
+
useful files into Facets. Expect the cleanup process to be
|
6
|
+
continued in next versions.
|
7
|
+
|
8
|
+
|
1
9
|
== Version 0.29.0
|
2
10
|
|
3
11
|
* MemCache store for the generalized caching system.
|
data/lib/glue.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# = Glue
|
2
2
|
#
|
3
|
-
# Copyright (c) 2004-
|
4
|
-
# Copyright (c) 2004-
|
3
|
+
# Copyright (c) 2004-2006, George Moschovitis (http://www.gmosx.com)
|
4
|
+
# Copyright (c) 2004-2006, Navel Ltd (http://www.navel.gr)
|
5
5
|
#
|
6
|
-
# Glue (http://www.
|
6
|
+
# Glue (http://www.nitroproject.org) is copyrighted free software
|
7
7
|
# created and maintained by George Moschovitis (mailto:gm@navel.gr)
|
8
8
|
# and released under the standard BSD Licence. For details
|
9
9
|
# consult the file doc/LICENCE.
|
@@ -12,7 +12,7 @@ require 'English'
|
|
12
12
|
require 'pp'
|
13
13
|
|
14
14
|
require 'facet/nullclass'
|
15
|
-
require '
|
15
|
+
require 'facets/more/paramix' # keep this before module/is
|
16
16
|
require 'facet/module/is'
|
17
17
|
|
18
18
|
require 'glue/property'
|
@@ -36,7 +36,7 @@ module Glue
|
|
36
36
|
|
37
37
|
# The version.
|
38
38
|
|
39
|
-
Version = '0.
|
39
|
+
Version = '0.30.0'
|
40
40
|
|
41
41
|
# Library path.
|
42
42
|
|
data/lib/glue/autoreload.rb
CHANGED
@@ -33,7 +33,7 @@ module Kernel
|
|
33
33
|
$autoreload_dirty = true
|
34
34
|
need_reload.each_pair do |file,mtime|
|
35
35
|
file_mtime[file] = mtime
|
36
|
-
Logger.debug "File '#{ file }' reloaded"
|
36
|
+
Logger.debug "File '#{ file }' reloaded" if $DBG
|
37
37
|
begin
|
38
38
|
load(file)
|
39
39
|
rescue Exception => e
|
@@ -48,7 +48,7 @@ module Kernel
|
|
48
48
|
if File.exists?(file) and (mtime = File.stat(file).mtime) > (file_mtime[file] || start_time)
|
49
49
|
$autoreload_dirty = true
|
50
50
|
file_mtime[file] = mtime
|
51
|
-
Logger.debug "File '#{ file }' changed"
|
51
|
+
Logger.debug "File '#{ file }' changed" if $DBG
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
data/lib/glue/builder.rb
CHANGED
@@ -32,17 +32,28 @@ class Builder
|
|
32
32
|
|
33
33
|
# Provide the target where the builder output will be
|
34
34
|
# accomulated. The builder utilizes duck typing to make it
|
35
|
-
# compatible with
|
35
|
+
# compatible with any target responding to <<.
|
36
36
|
|
37
|
-
def initialize(buffer = '',
|
38
|
-
@buffer = buffer
|
39
|
-
|
37
|
+
def initialize(buffer = '', options = {})
|
38
|
+
@buffer = buffer
|
40
39
|
end
|
41
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
|
+
|
42
55
|
end
|
43
56
|
|
44
57
|
end
|
45
58
|
|
46
59
|
# * George Moschovitis <gm@navel.gr>
|
47
|
-
|
48
|
-
__END__
|
data/lib/glue/builder/xml.rb
CHANGED
@@ -1,9 +1,5 @@
|
|
1
1
|
require 'glue/builder'
|
2
2
|
|
3
|
-
require 'nitro/helper/xhtml'
|
4
|
-
require 'nitro/helper/form'
|
5
|
-
require 'nitro/helper/table'
|
6
|
-
|
7
3
|
module Glue
|
8
4
|
|
9
5
|
# A Builder for programmatically building XML blocks.
|
@@ -12,6 +8,10 @@ module Glue
|
|
12
8
|
#++
|
13
9
|
|
14
10
|
class XmlBuilder < Builder
|
11
|
+
require 'nitro/helper/xhtml'
|
12
|
+
require 'nitro/helper/form'
|
13
|
+
require 'nitro/helper/table'
|
14
|
+
|
15
15
|
include_builder Nitro::XhtmlHelper
|
16
16
|
include_builder Nitro::TableHelper
|
17
17
|
include_builder Nitro::FormHelper
|
@@ -73,15 +73,6 @@ class XmlBuilder < Builder
|
|
73
73
|
return self
|
74
74
|
end
|
75
75
|
|
76
|
-
# Emit a text string.
|
77
|
-
|
78
|
-
def text!(str)
|
79
|
-
@buffer << str
|
80
|
-
|
81
|
-
return self
|
82
|
-
end
|
83
|
-
alias_method :print, :text!
|
84
|
-
|
85
76
|
# Emit a comment.
|
86
77
|
|
87
78
|
def comment!(str)
|
data/lib/glue/cache/drb.rb
CHANGED
@@ -33,7 +33,6 @@ class DrbCache < MemoryCache
|
|
33
33
|
# :address = The address of the DRb cache object.
|
34
34
|
# :port = The port of the DRb cache object.
|
35
35
|
|
36
|
-
|
37
36
|
# The address of the Session cache / store (if distibuted).
|
38
37
|
|
39
38
|
setting :address, :default => '127.0.0.1', :doc => 'The address of the Session cache'
|
@@ -43,8 +42,8 @@ class DrbCache < MemoryCache
|
|
43
42
|
setting :port, :default => 9069, :doc => 'The port of the Session cache'
|
44
43
|
|
45
44
|
|
46
|
-
def initialize
|
47
|
-
@hash = DRbObject.new(nil, "druby://#{
|
45
|
+
def initialize(address = DrbCache.address, port = DrbCache.port)
|
46
|
+
@hash = DRbObject.new(nil, "druby://#{address}:#{port}")
|
48
47
|
end
|
49
48
|
|
50
49
|
end
|
data/lib/glue/cache/file.rb
CHANGED
@@ -51,16 +51,16 @@ module Glue
|
|
51
51
|
|
52
52
|
def decode_file(fn)
|
53
53
|
val = nil
|
54
|
-
File.open(fn,"
|
54
|
+
File.open(fn,"rb") do |f|
|
55
55
|
f.flock(File::LOCK_EX)
|
56
|
-
val = Marshal.load(
|
56
|
+
val = Marshal.load( f.read )
|
57
57
|
f.flock(File::LOCK_UN)
|
58
58
|
end
|
59
59
|
return val
|
60
60
|
end
|
61
61
|
|
62
62
|
def encode_file(fn, value)
|
63
|
-
File.open(fn, "
|
63
|
+
File.open(fn, "wb") do |f|
|
64
64
|
f.flock(File::LOCK_EX)
|
65
65
|
f.chmod(0600)
|
66
66
|
f.write(Marshal.dump(value))
|
data/lib/glue/configuration.rb
CHANGED
@@ -2,6 +2,8 @@ require 'yaml'
|
|
2
2
|
|
3
3
|
require 'facet/kernel/constant'
|
4
4
|
require 'facet/synchash'
|
5
|
+
require 'facet/dictionary'
|
6
|
+
require 'facet/string/capitalized'
|
5
7
|
|
6
8
|
require 'glue/attribute'
|
7
9
|
require 'glue/flexob'
|
@@ -9,7 +11,13 @@ require 'glue/flexob'
|
|
9
11
|
module Glue
|
10
12
|
|
11
13
|
# A Configuration holds a group of Settings organized by
|
12
|
-
# Owners.
|
14
|
+
# Owners. An owner is a class that represents the system to be
|
15
|
+
# configured. An alias for this class is Settings.
|
16
|
+
#
|
17
|
+
# You can pass strings, constants or symbols as keys for the
|
18
|
+
# classes to be configured. Passing symbols you can configure
|
19
|
+
# classes even before they are defined.
|
20
|
+
#
|
13
21
|
#--
|
14
22
|
# TODO: implement with annotations.
|
15
23
|
#++
|
@@ -25,49 +33,86 @@ class Configuration
|
|
25
33
|
@@owners = SyncHash.new
|
26
34
|
|
27
35
|
# A datastructure to store Settings metadata.
|
28
|
-
|
36
|
+
#
|
37
|
+
# Please note the difference between :default and :value,
|
38
|
+
# :default does NOT override :value.
|
39
|
+
|
29
40
|
class Setting
|
30
41
|
attr_accessor :owner, :name, :type, :value, :options
|
31
42
|
|
32
43
|
def initialize(owner, name, options)
|
33
|
-
|
44
|
+
if options.key? :value
|
45
|
+
@value = options[:value]
|
46
|
+
elsif options.key? :default
|
47
|
+
@value = options[:default]
|
48
|
+
else
|
49
|
+
raise ArgumentError.new('A value is required')
|
50
|
+
end
|
51
|
+
|
34
52
|
@owner, @name = owner, name
|
35
|
-
@options = options
|
36
|
-
@value = options[:default]
|
53
|
+
@options = options
|
37
54
|
@type = options[:type] = options[:type] || @value.class
|
38
55
|
end
|
39
56
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
57
|
+
# Update the setting from an options hash. The update does
|
58
|
+
# NOT take default values into account!
|
59
|
+
|
60
|
+
def update(hash)
|
61
|
+
if hash.key? :value
|
62
|
+
@value = hash[:value]
|
63
|
+
@type = @value.class
|
64
|
+
end
|
65
|
+
|
66
|
+
if hash.key? :type
|
67
|
+
@type = hash[:type]
|
68
|
+
end
|
46
69
|
|
70
|
+
@options.update(hash)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Text representation of this setting.
|
74
|
+
|
47
75
|
def to_s
|
48
76
|
@value.to_s
|
49
77
|
end
|
50
78
|
|
51
79
|
end
|
80
|
+
|
81
|
+
# A collection of Settings. This helper enables intuitive
|
82
|
+
# settings initialization like this:
|
83
|
+
#
|
84
|
+
# Configuration.Compiler.template_root = 'public'
|
85
|
+
# instead of
|
86
|
+
# Configuration.setting :compiler, :template_root, :value => 'public'
|
52
87
|
|
88
|
+
class SettingCollection < Hash
|
89
|
+
attr_accessor :owner
|
90
|
+
|
91
|
+
# Handles setting readers and writers.
|
92
|
+
|
93
|
+
def method_missing(sym, *args)
|
94
|
+
if sym.to_s =~ /=$/
|
95
|
+
# Remove trailing
|
96
|
+
sym = sym.to_s.gsub(/=/, '').to_sym
|
97
|
+
Configuration.setting @owner, sym, :value => args.first
|
98
|
+
else
|
99
|
+
self[sym]
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
53
104
|
class << self
|
54
105
|
|
55
|
-
# Inject the configuration parameters
|
56
|
-
# classes.
|
106
|
+
# Inject the configuration parameters provided as a hash
|
107
|
+
# (dictionary, ordered) to classes to be configured.
|
108
|
+
#
|
109
|
+
# === Warning: Pass an ordered hash (dictionary)
|
57
110
|
|
58
111
|
def setup(options)
|
59
112
|
options.each do |owner, ss|
|
60
113
|
next unless ss
|
61
|
-
begin
|
62
|
-
owner = constant(owner)
|
63
|
-
rescue NameError
|
64
|
-
next
|
65
|
-
end
|
66
114
|
ss.each do |name, s|
|
67
|
-
|
68
|
-
owner.module_eval %{
|
69
|
-
@@#{name} = #{s.inspect}
|
70
|
-
}
|
115
|
+
add_setting(owner, name.to_sym, :value => s)
|
71
116
|
end
|
72
117
|
end
|
73
118
|
end
|
@@ -76,14 +121,15 @@ class Configuration
|
|
76
121
|
|
77
122
|
def parse(options)
|
78
123
|
temp = YAML::load(options)
|
79
|
-
options =
|
124
|
+
options = Dictionary.new
|
80
125
|
temp.each do |k, v|
|
81
126
|
begin
|
82
|
-
options[
|
127
|
+
options[k.gsub(/\./, '::').to_sym] = v
|
83
128
|
rescue Object
|
84
129
|
options[k] = v
|
85
130
|
end
|
86
131
|
end
|
132
|
+
|
87
133
|
setup(options)
|
88
134
|
end
|
89
135
|
|
@@ -92,15 +138,38 @@ class Configuration
|
|
92
138
|
def load(filename)
|
93
139
|
parse(File.read(filename))
|
94
140
|
end
|
95
|
-
|
141
|
+
|
142
|
+
# Manually add a configuration setting. The class key can
|
143
|
+
# be the actual class name constant or a symbol. If the
|
144
|
+
# setting is already defined it updates it.
|
145
|
+
#
|
146
|
+
# === Examples
|
147
|
+
#
|
148
|
+
# Configuration.add_setting Compiler, :verification, :value => 12, :doc => '...'
|
149
|
+
# Configuration.setting :IdPart, :verify_registration_email, :value => false
|
150
|
+
# s = Configuration.Compiler.verification.value
|
151
|
+
|
96
152
|
def add_setting(owner, name, options)
|
97
|
-
|
98
|
-
|
99
|
-
@@owners[owner]
|
153
|
+
owner = owner.to_s.to_sym
|
154
|
+
@@owners[owner] ||= {}
|
155
|
+
if s = @@owners[owner][name]
|
156
|
+
# The setting already exists, update it.
|
157
|
+
s.update(options)
|
158
|
+
else
|
159
|
+
# The setting does not exist, create it.
|
160
|
+
@@owners[owner][name] = Setting.new(owner, name, options)
|
161
|
+
end
|
100
162
|
end
|
101
|
-
|
163
|
+
alias_method :setting, :add_setting
|
164
|
+
|
165
|
+
# Return the settings for the given owner. The owner is
|
166
|
+
# typically the Class that represents the system to be
|
167
|
+
# configured. If no class is provided, it returns all the
|
168
|
+
# registered settings.
|
169
|
+
|
102
170
|
def settings(owner = nil)
|
103
171
|
if owner
|
172
|
+
owner = owner.to_s.to_sym
|
104
173
|
@@owners[owner]
|
105
174
|
else
|
106
175
|
@@owners.values.inject([]) { |memo, obj| memo.concat(obj.values) }
|
@@ -109,9 +178,20 @@ class Configuration
|
|
109
178
|
alias_method :all, :settings
|
110
179
|
alias_method :[], :settings
|
111
180
|
|
181
|
+
|
182
|
+
#--
|
183
|
+
# FIXME: this does not work as expected.
|
184
|
+
#++
|
185
|
+
|
112
186
|
def method_missing(sym)
|
113
|
-
if sym.to_s
|
114
|
-
Flexob.new(self[
|
187
|
+
if sym.to_s.capitalized?
|
188
|
+
# Flexob.new(self[sym])
|
189
|
+
bdl = SettingCollection.new
|
190
|
+
bdl.owner = sym
|
191
|
+
if hash = self[sym]
|
192
|
+
bdl.update(hash)
|
193
|
+
end
|
194
|
+
return bdl
|
115
195
|
end
|
116
196
|
end
|
117
197
|
end
|
@@ -126,24 +206,28 @@ end
|
|
126
206
|
|
127
207
|
class Module
|
128
208
|
|
129
|
-
# Defines a configuration setting.
|
130
|
-
|
131
|
-
#
|
132
|
-
|
209
|
+
# Defines a configuration setting for the enclosing class.
|
210
|
+
#
|
211
|
+
# === Example
|
212
|
+
#
|
213
|
+
# class Compiler
|
214
|
+
# setting :template_root, :default => 'src/template', :doc => 'The template root dir'
|
215
|
+
# end
|
133
216
|
|
134
217
|
def setting(sym, options = {})
|
135
218
|
Glue::Configuration.add_setting(self, sym, options)
|
219
|
+
|
136
220
|
module_eval %{
|
137
|
-
|
221
|
+
def self.#{sym}
|
222
|
+
Glue::Configuration[#{self}][:#{sym}].value
|
223
|
+
end
|
138
224
|
|
139
|
-
def self.#{sym
|
140
|
-
|
141
|
-
Glue::Configuration[#{self}][:#{sym}].value = obj
|
225
|
+
def self.#{sym}=(obj)
|
226
|
+
Glue::Configuration.setting #{self}, :#{sym}, :value => obj
|
142
227
|
end
|
143
228
|
}
|
144
229
|
end
|
145
230
|
|
146
231
|
end
|
147
232
|
|
148
|
-
|
149
233
|
# * George Moschovitis <gm@navel.gr>
|