glue 0.20.0 → 0.21.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.
Files changed (58) hide show
  1. data/CHANGELOG +161 -110
  2. data/INSTALL +12 -12
  3. data/README +1 -1
  4. data/Rakefile +43 -45
  5. data/doc/AUTHORS +5 -5
  6. data/doc/LICENSE +3 -3
  7. data/doc/RELEASES +32 -24
  8. data/install.rb +7 -17
  9. data/lib/facet/object/alias_class.rb +12 -0
  10. data/lib/glue.rb +35 -35
  11. data/lib/glue/array.rb +46 -46
  12. data/lib/glue/aspects.rb +199 -209
  13. data/lib/glue/attribute.rb +15 -15
  14. data/lib/glue/autoreload.rb +1 -1
  15. data/lib/glue/builder.rb +48 -0
  16. data/lib/glue/builder/xml.rb +114 -0
  17. data/lib/glue/cache.rb +189 -0
  18. data/lib/glue/configuration.rb +108 -90
  19. data/lib/glue/flexob.rb +17 -17
  20. data/lib/glue/hash.rb +71 -71
  21. data/lib/glue/helper.rb +12 -12
  22. data/lib/glue/idgen.rb +9 -0
  23. data/lib/glue/idgen/md5.rb +24 -0
  24. data/lib/glue/idgen/sequential.rb +15 -0
  25. data/lib/glue/literal_method.rb +44 -0
  26. data/lib/glue/localization.rb +130 -0
  27. data/lib/glue/logger.rb +98 -98
  28. data/lib/glue/misc.rb +7 -7
  29. data/lib/glue/mixins.rb +19 -19
  30. data/lib/glue/number.rb +8 -8
  31. data/lib/glue/object.rb +2 -2
  32. data/lib/glue/pool.rb +43 -43
  33. data/lib/glue/property.rb +392 -392
  34. data/lib/glue/sanitize.rb +34 -34
  35. data/lib/glue/settings.rb +1 -1
  36. data/lib/glue/snapshot.rb +104 -0
  37. data/lib/glue/string.rb +129 -129
  38. data/lib/glue/time.rb +53 -53
  39. data/lib/glue/uri.rb +162 -162
  40. data/lib/glue/validation.rb +421 -421
  41. data/lib/vendor/blankslate.rb +53 -0
  42. data/test/glue/builder/tc_xml.rb +56 -0
  43. data/test/glue/tc_aspects.rb +90 -90
  44. data/test/glue/tc_attribute.rb +11 -11
  45. data/test/glue/tc_builder.rb +30 -0
  46. data/test/glue/tc_configuration.rb +97 -97
  47. data/test/glue/tc_flexob.rb +10 -10
  48. data/test/glue/tc_hash.rb +23 -23
  49. data/test/glue/tc_localization.rb +49 -0
  50. data/test/glue/tc_logger.rb +31 -31
  51. data/test/glue/tc_numbers.rb +9 -9
  52. data/test/glue/tc_property.rb +67 -67
  53. data/test/glue/tc_property_mixins.rb +17 -17
  54. data/test/glue/tc_property_type_checking.rb +13 -13
  55. data/test/glue/tc_strings.rb +94 -94
  56. data/test/glue/tc_uri.rb +65 -65
  57. data/test/glue/tc_validation.rb +196 -196
  58. metadata +26 -4
data/lib/glue/time.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: time.rb 1 2005-04-11 11:04:30Z gmosx $
3
+ # $Id: time.rb 182 2005-07-22 10:07:50Z gmosx $
4
4
 
5
5
  require 'time.rb'
6
6
 
@@ -20,65 +20,65 @@ module Glue;
20
20
 
21
21
  module TimeUtils
22
22
 
23
- NOW = Time.now
24
- NEVER = Time.mktime(2038)
25
- ZERO = Time.mktime(1972)
23
+ NOW = Time.now
24
+ NEVER = Time.mktime(2038)
25
+ ZERO = Time.mktime(1972)
26
26
 
27
- # Convert the time to a nice String representation.
28
-
29
- def self.date_time(time)
30
- return nil unless time
31
- return time.strftime("%d-%m-%Y %H:%M")
32
- end
33
-
34
- # This method calculates the days extrema given two time objects.
35
- # start time is the given time1 at 00:00:00
36
- # end time is the given time2 at 23:59:59:999
37
- #
38
- # Input:
39
- # - the two times (if only time1 is provided then you get an extrema
40
- # of exactly one day extrema.
41
- #
42
- # Output
43
- # - the time range. you can get the start/end times using
44
- # range methods.
45
-
46
- def self.days_extrema(time1, time2=nil)
47
- time2 = time1 if (not time2.valid? Time)
48
- time2 = NEVER if (time2 <= time1)
49
- start_time = Time.self.start_of_day(time1)
50
- end_time = self.end_of_day(time2)
51
- return (start_time..end_time)
52
- end
27
+ # Convert the time to a nice String representation.
28
+
29
+ def self.date_time(time)
30
+ return nil unless time
31
+ return time.strftime("%d-%m-%Y %H:%M")
32
+ end
33
+
34
+ # This method calculates the days extrema given two time objects.
35
+ # start time is the given time1 at 00:00:00
36
+ # end time is the given time2 at 23:59:59:999
37
+ #
38
+ # Input:
39
+ # - the two times (if only time1 is provided then you get an extrema
40
+ # of exactly one day extrema.
41
+ #
42
+ # Output
43
+ # - the time range. you can get the start/end times using
44
+ # range methods.
45
+
46
+ def self.days_extrema(time1, time2=nil)
47
+ time2 = time1 if (not time2.valid? Time)
48
+ time2 = NEVER if (time2 <= time1)
49
+ start_time = Time.self.start_of_day(time1)
50
+ end_time = self.end_of_day(time2)
51
+ return (start_time..end_time)
52
+ end
53
53
 
54
- # Set time to start of day
55
-
56
- def self.start_of_day(time)
57
- return Time.mktime(time.year, time.month, time.day, 0, 0, 0, 0)
58
- end
54
+ # Set time to start of day
55
+
56
+ def self.start_of_day(time)
57
+ return Time.mktime(time.year, time.month, time.day, 0, 0, 0, 0)
58
+ end
59
59
 
60
-
61
- # Set time to end of day
62
-
63
- def self.end_of_day(time)
64
- return Time.mktime(time.year, time.month, time.day, 23, 59, 59, 999)
65
- end
60
+
61
+ # Set time to end of day
62
+
63
+ def self.end_of_day(time)
64
+ return Time.mktime(time.year, time.month, time.day, 23, 59, 59, 999)
65
+ end
66
66
 
67
67
 
68
- # Returns true only if day of time is included in the
69
- # range (stime..etime). Only year days are checked.
70
-
71
- def self.time_in_day_range(time, stime=ZERO, etime=NEVER)
72
- if (etime <= stime)
73
- Logger.debug "Invalid end time (#{etime} < #{stime})" if $DBG
74
- etime = NEVER
75
- end
68
+ # Returns true only if day of time is included in the
69
+ # range (stime..etime). Only year days are checked.
70
+
71
+ def self.time_in_day_range(time, stime=ZERO, etime=NEVER)
72
+ if (etime <= stime)
73
+ Logger.debug "Invalid end time (#{etime} < #{stime})" if $DBG
74
+ etime = NEVER
75
+ end
76
76
 
77
- stime = start_of_day(stime)
78
- etime = end_of_day(etime)
77
+ stime = start_of_day(stime)
78
+ etime = end_of_day(etime)
79
79
 
80
- return (stime..etime).include?(time)
81
- end
80
+ return (stime..etime).include?(time)
81
+ end
82
82
 
83
83
  end
84
84
 
data/lib/glue/uri.rb CHANGED
@@ -21,168 +21,168 @@ module Glue
21
21
 
22
22
  module UriUtils
23
23
 
24
- # Decode the uri components.
25
-
26
- def self.decode(uri)
27
- # gmosx: hmm is this needed?
28
- # guard against invalid filenames for example pictures with
29
- # spaces uploaded by users
30
- escaped_uri = uri.gsub(/ /, "+")
31
-
32
- if md = URI::REGEXP::REL_URI.match(escaped_uri)
33
-
34
- path = "#{md[5]}#{md[6]}"
35
- type = File.extname(path)
36
- query_string = md[7]
37
-
38
- # real_path = "#{$root_dir}/#{path}"
39
-
40
- parameters = UriUtils.query_string_to_hash(query_string)
41
- path.gsub!(/\+/, " ")
42
-
43
- return [path, type, parameters, query_string]
44
-
45
- end # match
46
-
47
- # this is usefull for uncovering bugs!
48
- raise ArgumentError.new("the parameter '#{uri}' is not a valid uri")
49
- end
50
-
51
- # Extend the basic query string parser provided by the cgi module.
52
- # converts single valued params (the most common case) to
53
- # objects instead of arrays
54
- #
55
- # Input:
56
- # the query string
57
- #
58
- # Output:
59
- # hash of parameters, contains arrays for multivalued parameters
60
- # (multiselect, checkboxes , etc)
61
- # If no query string is provided (nil or "") returns an empty hash.
62
-
63
- def self.query_string_to_hash(query_string)
64
- return {} unless query_string
65
-
66
- query_parameters = CGI::parse(query_string)
67
-
68
- query_parameters.each { |key, val|
69
- # replace the array with an object
70
- query_parameters[key] = val[0] if 1 == val.length
71
- }
72
-
73
- # set default value to nil! cgi sets this to []
74
- query_parameters.default = nil
75
-
76
- return query_parameters
77
- end
78
-
79
- # Given a hash with parameter/value pairs construct a
80
- # standard query string. This method only encodes simple
81
- # types (Numeric, String) to avoid query string polution
82
- # with marshal, etc.
83
- #
84
- # gmosx, FIXME: only numeric and strings are passed to
85
- # the latest code, so update old code and optimize this!
86
- #
87
- # Input:
88
- # the parameter hash
89
- #
90
- # Output:
91
- # the query string
92
-
93
- def self.hash_to_query_string(parameters)
94
- return nil unless parameters
95
- pairs = []
96
- parameters.each { |param, value|
97
- # only encode simple classes !
98
-
99
- if value.is_a?(Numeric) or value.is_a?(String)
100
- pairs << "#{param}=#{value}"
101
- end
102
- }
103
- return pairs.join(";")
104
- end
105
-
106
- # This method returns the query string of a uri
107
- #
108
- # Input:
109
- # the uri
110
- #
111
- # Output:
112
- # the query string.
113
- # returns nil if no query string
114
-
115
- def self.get_query_string(uri)
116
- return nil unless uri
117
- # gmosx: INVESTIGATE ruby's URI seems to differently handle
118
- # abs and rel uris.
119
- if md = URI::REGEXP::ABS_URI.match(uri)
120
- return md[8]
121
- elsif md = URI::REGEXP::REL_URI.match(uri)
122
- return md[7]
123
- end
124
- return nil
125
- end
126
-
127
- # Removes the query string from a uri
128
- #
129
- # Input:
130
- # the uri
131
- #
132
- # Output:
133
- # the chomped uri.
134
-
135
- def self.chomp_query_string(uri)
136
- return nil unless uri
137
- query_string = self.get_query_string(uri)
138
- return uri.dup.chomp("?#{query_string}")
139
- end
140
-
141
- # Get a uri and a hash of parameters. Inject the hash values
142
- # as parameters in the query sting path. Returns the full
143
- # uri.
144
- #
145
- # Input:
146
- # the uri to filter (String)
147
- # hash of parameters to update
148
- #
149
- # Output:
150
- # the full updated query string
151
- #
152
- # === TODO:
153
- # optimize this a litle bit.
154
-
155
- def self.update_query_string(uri, parameters)
156
- query_string = self.get_query_string(uri)
157
- rest = uri.dup.gsub(/\?#{query_string}/, "")
158
-
159
- hash = self.query_string_to_hash(query_string)
160
- hash.update(parameters)
161
- query_string = self.hash_to_query_string(hash)
162
-
163
- if Glue::StringUtils.valid?(query_string)
164
- return "#{rest}?#{query_string}"
165
- else
166
- return rest
167
- end
168
- end
169
-
170
- # TODO: find a better name.
171
- # Gets the request uri, injects extra parameters in the query string
172
- # and returns a new uri. The request object is not modified.
173
- # There is always a qs string so an extra test is skipped.
174
-
175
- def self.update_request_uri(request, parameters)
176
- hash = request.parameters.dup()
177
- hash.update(parameters)
178
-
179
- # use this in hash_to_querystring.
180
- query_string = hash.collect { |k, v|
181
- "#{k}=#{v}"
182
- }.join(";")
183
-
184
- return "#{request.translated_uri}?#{query_string}"
185
- end
24
+ # Decode the uri components.
25
+
26
+ def self.decode(uri)
27
+ # gmosx: hmm is this needed?
28
+ # guard against invalid filenames for example pictures with
29
+ # spaces uploaded by users
30
+ escaped_uri = uri.gsub(/ /, "+")
31
+
32
+ if md = URI::REGEXP::REL_URI.match(escaped_uri)
33
+
34
+ path = "#{md[5]}#{md[6]}"
35
+ type = File.extname(path)
36
+ query_string = md[7]
37
+
38
+ # real_path = "#{$root_dir}/#{path}"
39
+
40
+ parameters = UriUtils.query_string_to_hash(query_string)
41
+ path.gsub!(/\+/, " ")
42
+
43
+ return [path, type, parameters, query_string]
44
+
45
+ end # match
46
+
47
+ # this is usefull for uncovering bugs!
48
+ raise ArgumentError.new("the parameter '#{uri}' is not a valid uri")
49
+ end
50
+
51
+ # Extend the basic query string parser provided by the cgi module.
52
+ # converts single valued params (the most common case) to
53
+ # objects instead of arrays
54
+ #
55
+ # Input:
56
+ # the query string
57
+ #
58
+ # Output:
59
+ # hash of parameters, contains arrays for multivalued parameters
60
+ # (multiselect, checkboxes , etc)
61
+ # If no query string is provided (nil or "") returns an empty hash.
62
+
63
+ def self.query_string_to_hash(query_string)
64
+ return {} unless query_string
65
+
66
+ query_parameters = CGI::parse(query_string)
67
+
68
+ query_parameters.each { |key, val|
69
+ # replace the array with an object
70
+ query_parameters[key] = val[0] if 1 == val.length
71
+ }
72
+
73
+ # set default value to nil! cgi sets this to []
74
+ query_parameters.default = nil
75
+
76
+ return query_parameters
77
+ end
78
+
79
+ # Given a hash with parameter/value pairs construct a
80
+ # standard query string. This method only encodes simple
81
+ # types (Numeric, String) to avoid query string polution
82
+ # with marshal, etc.
83
+ #
84
+ # gmosx, FIXME: only numeric and strings are passed to
85
+ # the latest code, so update old code and optimize this!
86
+ #
87
+ # Input:
88
+ # the parameter hash
89
+ #
90
+ # Output:
91
+ # the query string
92
+
93
+ def self.hash_to_query_string(parameters)
94
+ return nil unless parameters
95
+ pairs = []
96
+ parameters.each { |param, value|
97
+ # only encode simple classes !
98
+
99
+ if value.is_a?(Numeric) or value.is_a?(String)
100
+ pairs << "#{param}=#{value}"
101
+ end
102
+ }
103
+ return pairs.join(";")
104
+ end
105
+
106
+ # This method returns the query string of a uri
107
+ #
108
+ # Input:
109
+ # the uri
110
+ #
111
+ # Output:
112
+ # the query string.
113
+ # returns nil if no query string
114
+
115
+ def self.get_query_string(uri)
116
+ return nil unless uri
117
+ # gmosx: INVESTIGATE ruby's URI seems to differently handle
118
+ # abs and rel uris.
119
+ if md = URI::REGEXP::ABS_URI.match(uri)
120
+ return md[8]
121
+ elsif md = URI::REGEXP::REL_URI.match(uri)
122
+ return md[7]
123
+ end
124
+ return nil
125
+ end
126
+
127
+ # Removes the query string from a uri
128
+ #
129
+ # Input:
130
+ # the uri
131
+ #
132
+ # Output:
133
+ # the chomped uri.
134
+
135
+ def self.chomp_query_string(uri)
136
+ return nil unless uri
137
+ query_string = self.get_query_string(uri)
138
+ return uri.dup.chomp("?#{query_string}")
139
+ end
140
+
141
+ # Get a uri and a hash of parameters. Inject the hash values
142
+ # as parameters in the query sting path. Returns the full
143
+ # uri.
144
+ #
145
+ # Input:
146
+ # the uri to filter (String)
147
+ # hash of parameters to update
148
+ #
149
+ # Output:
150
+ # the full updated query string
151
+ #
152
+ # === TODO:
153
+ # optimize this a litle bit.
154
+
155
+ def self.update_query_string(uri, parameters)
156
+ query_string = self.get_query_string(uri)
157
+ rest = uri.dup.gsub(/\?#{query_string}/, "")
158
+
159
+ hash = self.query_string_to_hash(query_string)
160
+ hash.update(parameters)
161
+ query_string = self.hash_to_query_string(hash)
162
+
163
+ if Glue::StringUtils.valid?(query_string)
164
+ return "#{rest}?#{query_string}"
165
+ else
166
+ return rest
167
+ end
168
+ end
169
+
170
+ # TODO: find a better name.
171
+ # Gets the request uri, injects extra parameters in the query string
172
+ # and returns a new uri. The request object is not modified.
173
+ # There is always a qs string so an extra test is skipped.
174
+
175
+ def self.update_request_uri(request, parameters)
176
+ hash = request.parameters.dup()
177
+ hash.update(parameters)
178
+
179
+ # use this in hash_to_querystring.
180
+ query_string = hash.collect { |k, v|
181
+ "#{k}=#{v}"
182
+ }.join(";")
183
+
184
+ return "#{request.translated_uri}?#{query_string}"
185
+ end
186
186
 
187
187
  end
188
188