glue 0.28.0 → 0.29.0

Sign up to get free protection for your applications and to get access to all the features.
data/ProjectInfo CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  TITLE : &title Glue
4
4
  NAME : &pkg glue
5
- VERSION : '0.28.0'
5
+ VERSION : '0.29.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, '= 1.0.2' ]
18
+ - [ facets, '= 1.0.3' ]
19
19
  - [ cmdparse, '= 2.0.0' ]
20
20
 
21
21
  DISTRIBUTE: [ gem, tgz, zip ]
data/README CHANGED
@@ -1,4 +1,4 @@
1
- = Glue 0.28.0 README
1
+ = Glue 0.29.0 README
2
2
 
3
3
  Useful utilites and methods.
4
4
 
data/Rakefile CHANGED
@@ -35,7 +35,7 @@ Rake::TestTask.new do |t|
35
35
  %w[glue nitro og].each do |dir|
36
36
  t.libs << File.join(cwd, dir, 'lib')
37
37
  end
38
- t.test_files = FileList['test/**/*.rb']
38
+ t.test_files = FileList['test/**/tc*.rb']
39
39
  t.verbose = true
40
40
  end
41
41
 
data/doc/RELEASES CHANGED
@@ -1,3 +1,11 @@
1
+ == Version 0.29.0
2
+
3
+ * MemCache store for the generalized caching system.
4
+
5
+ * Many, many bugfixes and small improvements.
6
+
7
+ * Updated for facets 1.0.3
8
+
1
9
  == Version 0.28.0
2
10
 
3
11
  * New generalized caching system. The caching code is refactored
data/lib/glue.rb CHANGED
@@ -36,7 +36,7 @@ module Glue
36
36
 
37
37
  # The version.
38
38
 
39
- Version = '0.28.0'
39
+ Version = '0.29.0'
40
40
 
41
41
  # Library path.
42
42
 
data/lib/glue/aspects.rb CHANGED
@@ -7,7 +7,7 @@ module Glue
7
7
  class Aspect
8
8
  class << self
9
9
  def wrap(target, methods = target.instance_methods, pre = :pre, post = :post)
10
- target.send(:include, Aspects) unless target.ancestors.include?(Aspects)
10
+ target.send(:include, Glue::Aspects) unless target.ancestors.include?(Glue::Aspects)
11
11
  target.wrap(self, :pre => pre, :post => post)
12
12
  end
13
13
 
@@ -15,7 +15,7 @@ class Aspect
15
15
  end
16
16
 
17
17
  def wrap(target, methods = target.instance_methods, pre = :pre, post = :post)
18
- target.send(:include, Aspects) unless target.ancestors.include?(Aspects)
18
+ target.send(:include, Glue::Aspects) unless target.ancestors.include?(Glue::Aspects)
19
19
  target.wrap(self, :pre => pre, :post => post)
20
20
  end
21
21
  alias_method :observe, :wrap
@@ -33,11 +33,11 @@ module Kernel
33
33
  $autoreload_dirty = true
34
34
  need_reload.each_pair do |file,mtime|
35
35
  file_mtime[file] = mtime
36
- STDERR.puts "File '#{ file }' reloaded"
36
+ Logger.debug "File '#{ file }' reloaded"
37
37
  begin
38
38
  load(file)
39
39
  rescue Exception => e
40
- STDERR.puts e.inspect
40
+ Logger.info e.inspect
41
41
  end
42
42
  end
43
43
  end
@@ -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
- STDERR.puts "File '#{ file }' changed"
51
+ Logger.debug "File '#{ file }' changed"
52
52
  end
53
53
  end
54
54
 
data/lib/glue/cache.rb CHANGED
@@ -12,6 +12,11 @@ end
12
12
  # scoped variables and more.
13
13
 
14
14
  class Cache
15
+
16
+ def update(hash)
17
+ hash.each { |key, value| self[key] = value }
18
+ end
19
+
15
20
  end
16
21
 
17
22
  end
@@ -33,13 +33,18 @@ 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
- def initialize(options = {})
37
- c = {
38
- :address => '127.0.0.1',
39
- :port => 9080,
40
- }.update(options)
41
36
 
42
- @hash = DRbObject.new(nil, "druby://#{options[:address]}:#{options[:port]}")
37
+ # The address of the Session cache / store (if distibuted).
38
+
39
+ setting :address, :default => '127.0.0.1', :doc => 'The address of the Session cache'
40
+
41
+ # The port of the Session DRb cache / store (if distributed).
42
+
43
+ setting :port, :default => 9069, :doc => 'The port of the Session cache'
44
+
45
+
46
+ def initialize
47
+ @hash = DRbObject.new(nil, "druby://#{DrbCache.address}:#{DrbCache.port}")
43
48
  end
44
49
 
45
50
  end
@@ -1,15 +1,14 @@
1
+ require 'uri'
1
2
  require 'fileutils'
2
3
  require 'tmpdir'
3
4
 
4
5
  module Glue
5
6
 
6
- # TODO: safe locking of files, because Nitro can be multiprocess
7
-
8
7
  class FileCache
9
8
 
10
9
  setting :basedir, :default => "#{Dir.tmpdir}/nitro_file_cache", :doc => 'The directory to store files'
11
10
 
12
- def initialize(name, keepalive = nil)
11
+ def initialize(name = "cache", keepalive = nil)
13
12
  @path = File.join(FileCache.basedir, name)
14
13
  @keepalive = keepalive
15
14
 
@@ -17,16 +16,23 @@ module Glue
17
16
  end
18
17
 
19
18
  def []=(k,v)
20
- fn = File.join(@path, k.to_s)
19
+ fn = File.join(@path, escape_filename(k.to_s) )
21
20
  encode_file(fn, v)
22
21
  end
22
+ alias :set :[]=
23
23
 
24
24
  def [](k)
25
- fn = File.join(@path, k.to_s)
25
+ fn = File.join(@path, escape_filename(k.to_s) )
26
26
  return nil unless File.exists?(fn)
27
27
  decode_file(fn)
28
28
  end
29
+ alias :get :[]
29
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
+
30
36
  def gc!
31
37
  return unless @keepalive
32
38
 
@@ -44,16 +50,29 @@ module Glue
44
50
  private
45
51
 
46
52
  def decode_file(fn)
47
- Marshal.load( File.read(fn) )
53
+ val = nil
54
+ File.open(fn,"r") do |f|
55
+ f.flock(File::LOCK_EX)
56
+ val = Marshal.load( File.read(fn) )
57
+ f.flock(File::LOCK_UN)
58
+ end
59
+ return val
48
60
  end
49
61
 
50
62
  def encode_file(fn, value)
51
63
  File.open(fn, "w") do |f|
64
+ f.flock(File::LOCK_EX)
52
65
  f.chmod(0600)
53
66
  f.write(Marshal.dump(value))
67
+ f.flock(File::LOCK_UN)
54
68
  end
55
69
  end
56
70
 
71
+ # need this for fat filesystems
72
+ def escape_filename(fn)
73
+ URI.escape(fn, /["\/:;|=,\[\]]/)
74
+ end
75
+
57
76
  end
58
77
  end
59
78
 
@@ -0,0 +1,68 @@
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
@@ -48,9 +48,6 @@ class Configuration
48
48
  @value.to_s
49
49
  end
50
50
 
51
- def <=>(other)
52
- "#{owner}.#{name}" <=> "#{other.owner}.#{other.name}"
53
- end
54
51
  end
55
52
 
56
53
  class << self
data/lib/glue/fixture.rb CHANGED
@@ -93,7 +93,7 @@ class Fixture < Hash
93
93
  def parse_yaml(path)
94
94
  require 'yaml'
95
95
 
96
- str = Template.new.render(File.read(path))
96
+ str = Glue::Template.new.render(File.read(path))
97
97
 
98
98
  if yaml = YAML::load(str)
99
99
  for name, data in yaml
@@ -115,7 +115,7 @@ class Fixture < Hash
115
115
  def parse_csv(path)
116
116
  require 'csv'
117
117
 
118
- str = Template.new.render(File.read(path))
118
+ str = Glue::Template.new.render(File.read(path))
119
119
 
120
120
  reader = CSV::Reader.create(str)
121
121
  header = reader.shift
@@ -9,7 +9,7 @@ module OutgoingMailer
9
9
 
10
10
  on_included %{ base.extend ClassMethods }
11
11
 
12
- def initialize(from = nil, to = nil, subject = nil, body = FileTemplate.new)
12
+ def initialize(from = nil, to = nil, subject = nil, body = Glue::FileTemplate.new)
13
13
  super
14
14
  @charset = Mailer.default_charset.dup
15
15
  @encode_subject = Mailer.encode_subject
data/lib/glue/property.rb CHANGED
@@ -164,7 +164,7 @@ class Property
164
164
  if prop_or_rel.on_populate && obj.respond_to?(prop_or_rel.on_populate.to_sym)
165
165
  return obj.send(prop_or_rel.on_populate.to_sym, value)
166
166
  elsif Object.const_defined? :Nitro
167
- if control = Nitro::Control.fetch(obj, prop_or_rel, :default => nil) and control.respond_to?(:on_populate)
167
+ if control = Nitro::Form::Control.fetch(obj, prop_or_rel, :default => nil) and control.respond_to?(:on_populate)
168
168
  return control.on_populate(value)
169
169
  end
170
170
  else
@@ -181,7 +181,7 @@ class Property
181
181
  self.#{sym} = force_#{sym}(val)
182
182
  else
183
183
  self.#{sym}=(} << case klass.name
184
- when Fixnum.name: 'val.nil? ? nil : val.to_i'
184
+ when Fixnum.name: 'val.to_s.empty? ? nil : val.to_i'
185
185
  when String.name: 'val.to_s'
186
186
  when Float.name: 'val.to_f'
187
187
  when Time.name: 'val.is_a?(Hash) ? Time.local(val["year"],val["month"],val["day"],val["hour"],val["min"]) : Time.parse(val.to_s)'
data/lib/glue/template.rb CHANGED
@@ -164,14 +164,14 @@ class Template
164
164
  setting :strip_xml_comments, :default => false, :doc => 'Strip xml comments from templates?'
165
165
 
166
166
  class << self
167
- include TemplateMixin
167
+ include Glue::TemplateMixin
168
168
  alias_method :compile, :compile_template
169
169
  alias_method :transform, :compile_template
170
170
  alias_method :evaluate, :evaluate_template
171
171
  alias_method :process, :process_template
172
172
  end
173
173
 
174
- include TemplateMixin
174
+ include Glue::TemplateMixin
175
175
 
176
176
  # Helper.
177
177
 
@@ -188,7 +188,7 @@ end
188
188
  # expansion environment.
189
189
 
190
190
  class FileTemplate < Flexob
191
- include TemplateMixin
191
+ include Glue::TemplateMixin
192
192
 
193
193
  @@compiled_template_cache = {}
194
194
 
data/lib/glue/uri.rb CHANGED
@@ -37,7 +37,7 @@ module UriUtils
37
37
 
38
38
  # real_path = "#{$root_dir}/#{path}"
39
39
 
40
- parameters = UriUtils.query_string_to_hash(query_string)
40
+ parameters = Glue::UriUtils.query_string_to_hash(query_string)
41
41
  path.gsub!(/\+/, " ")
42
42
 
43
43
  return [path, type, parameters, query_string]
@@ -97,7 +97,7 @@ module UriUtils
97
97
  # only encode simple classes !
98
98
 
99
99
  if value.is_a?(Numeric) or value.is_a?(String)
100
- pairs << "#{param}=#{value}"
100
+ pairs << "#{param}=#{CGI.escape(value.to_s)}"
101
101
  end
102
102
  }
103
103
  return pairs.join(";")
@@ -113,6 +113,14 @@ module Validation
113
113
  def clear
114
114
  @errors.clear
115
115
  end
116
+
117
+ def to_a
118
+ @errors.values
119
+ end
120
+
121
+ def join(glue)
122
+ @errors.to_a.join(glue)
123
+ end
116
124
  end
117
125
 
118
126
  # A Key is used to uniquely identify a validation rule.
@@ -7,7 +7,7 @@ class TC_BuildersXml < Test::Unit::TestCase # :nodoc: all
7
7
  include Glue
8
8
 
9
9
  def test_string
10
- x = XmlBuilder.new
10
+ x = Glue::XmlBuilder.new
11
11
 
12
12
  x.start_tag!('html').
13
13
  start_tag!('title').text!('hello').end_tag!('title').
@@ -17,34 +17,34 @@ class TC_BuildersXml < Test::Unit::TestCase # :nodoc: all
17
17
  end
18
18
 
19
19
  def test_missing
20
- x = XmlBuilder.new
20
+ x = Glue::XmlBuilder.new
21
21
  x.b('This is bold')
22
22
  assert_equal '<b>This is bold</b>', x.buffer
23
23
 
24
- x = XmlBuilder.new
24
+ x = Glue::XmlBuilder.new
25
25
  x.a('Navel', :href => 'http://www.navel.gr')
26
26
  assert_equal '<a href="http://www.navel.gr">Navel</a>', x.buffer
27
27
 
28
28
 
29
- x = XmlBuilder.new
29
+ x = Glue::XmlBuilder.new
30
30
  x.b {
31
31
  x.i 'Hello', :class =>'new'
32
32
  x.p 'Paragraph'
33
33
  }
34
34
  assert_equal '<b><i class="new">Hello</i><p>Paragraph</p></b>', x.buffer
35
35
 
36
- x = XmlBuilder.new
36
+ x = Glue::XmlBuilder.new
37
37
  x.hr
38
38
  assert_equal '<hr />', x.buffer
39
39
 
40
- x = XmlBuilder.new
40
+ x = Glue::XmlBuilder.new
41
41
  x.hr(:style => 'height: 1px')
42
42
  assert_equal '<hr style="height: 1px" />', x.buffer
43
43
  end
44
44
 
45
45
  def test_xml_builder
46
46
  buffer = ''
47
- x = XmlBuilder.new(buffer)
47
+ x = Glue::XmlBuilder.new(buffer)
48
48
 
49
49
  x.start_tag!('html').
50
50
  start_tag!('title').text!('hello').end_tag!('title').
@@ -24,14 +24,14 @@ class TestCaseAspects < Test::Unit::TestCase # :nodoc: all
24
24
  end
25
25
 
26
26
  module Tester
27
- include Aspects
27
+ include Glue::Aspects
28
28
 
29
29
  attr_accessor :ta
30
30
  pre { |this| this.ta = 5 }
31
31
  end
32
32
 
33
33
  class Dummy
34
- include Aspects
34
+ include Glue::Aspects
35
35
  include Tester
36
36
 
37
37
  attr_accessor :a, :b, :c
@@ -82,7 +82,7 @@ class TestCaseAspects < Test::Unit::TestCase # :nodoc: all
82
82
  def test_all
83
83
  Observer.wrap(Dummy, :hello)
84
84
  Epilogue.new.wrap(Dummy, :hello)
85
- Aspects.wrap(Dummy, :hello)
85
+ Glue::Aspects.wrap(Dummy, :hello)
86
86
 
87
87
  d = Dummy.new
88
88
  d.hello(3)
@@ -0,0 +1,17 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'lib')
2
+
3
+ require 'test/unit'
4
+
5
+ require 'glue/cache/memory'
6
+
7
+ class TC_CachingStores < Test::Unit::TestCase # :nodoc: all
8
+
9
+ def test_memory
10
+ s = Glue::Cache::MemoryCache.new
11
+ s.write('test', 'hello', { :none => 1})
12
+ s.read('test')
13
+ end
14
+
15
+ end
16
+
17
+ # * George Moschovitis <gm@navel.gr>
@@ -23,7 +23,7 @@ class TestTemplate < Test::Unit::TestCase # :nodoc: all
23
23
  items = %w{ nitro is really great }
24
24
  out = ''
25
25
 
26
- Template.process(template, :out, binding)
26
+ Glue::Template.process(template, :out, binding)
27
27
 
28
28
  assert_match %r{\<li\>nitro\</li\>}, out
29
29
  assert_match %r{\<li\>really\</li\>}, out
data/test/glue/tc_uri.rb CHANGED
@@ -11,22 +11,22 @@ class TC_Uri < Test::Unit::TestCase # :nodoc: all
11
11
  def test_query_string_to_hash
12
12
  # bad query string
13
13
 
14
- assert_equal(0, UriUtils.query_string_to_hash("").length)
15
- assert_equal(0, UriUtils.query_string_to_hash(nil).length)
14
+ assert_equal(0, Glue::UriUtils.query_string_to_hash("").length)
15
+ assert_equal(0, Glue::UriUtils.query_string_to_hash(nil).length)
16
16
 
17
17
  # single valued
18
18
 
19
- parameters = UriUtils.query_string_to_hash("koko=2&lala=3")
19
+ parameters = Glue::UriUtils.query_string_to_hash("koko=2&lala=3")
20
20
  assert_equal("2", parameters["koko"])
21
21
  assert_equal("3", parameters["lala"])
22
22
 
23
- parameters = UriUtils.query_string_to_hash("koko=2;lala=3")
23
+ parameters = Glue::UriUtils.query_string_to_hash("koko=2;lala=3")
24
24
  assert_equal("2", parameters["koko"])
25
25
  assert_equal("3", parameters["lala"])
26
26
 
27
27
  # multivalued
28
28
 
29
- parameters = UriUtils.query_string_to_hash("koko=2;lala=3&koko=5")
29
+ parameters = Glue::UriUtils.query_string_to_hash("koko=2;lala=3&koko=5")
30
30
  assert_equal(2, parameters["koko"].length)
31
31
  assert_equal("2", parameters["koko"][0])
32
32
  assert_equal("3", parameters["lala"])
@@ -39,59 +39,59 @@ class TC_Uri < Test::Unit::TestCase # :nodoc: all
39
39
  def test_hash_to_query_string
40
40
  hash = { "koko" => 1, "lala" => 2}
41
41
  qs = "koko=1;lala=2"
42
- assert_equal(qs, UriUtils.hash_to_query_string(hash))
42
+ assert_equal(qs, Glue::UriUtils.hash_to_query_string(hash))
43
43
 
44
- assert_equal(nil, UriUtils.hash_to_query_string(nil))
44
+ assert_equal(nil, Glue::UriUtils.hash_to_query_string(nil))
45
45
 
46
46
  # bug: dont encode complex objects
47
47
  hash = { "a" => 2, "b" => 3, "c" => Dummy.new }
48
48
  qs = "a=2;b=3"
49
- assert_equal(qs, UriUtils.hash_to_query_string(hash))
49
+ assert_equal(qs, Glue::UriUtils.hash_to_query_string(hash))
50
50
  end
51
51
 
52
52
  def test_get_query_string
53
53
  uri = "people/gmosx.sx?koko=1;lala=2"
54
- assert_equal("koko=1;lala=2", UriUtils.get_query_string(uri))
54
+ assert_equal("koko=1;lala=2", Glue::UriUtils.get_query_string(uri))
55
55
 
56
56
  uri = "http://www.navel.gr/people/gmosx.sx?koko=1&lala=2"
57
- assert_equal("koko=1&lala=2", UriUtils.get_query_string(uri))
57
+ assert_equal("koko=1&lala=2", Glue::UriUtils.get_query_string(uri))
58
58
 
59
59
  uri = "http://www.navel.gr:8080/people/gmosx.sx?koko=1;lala=2"
60
- assert_equal("koko=1;lala=2", UriUtils.get_query_string(uri))
60
+ assert_equal("koko=1;lala=2", Glue::UriUtils.get_query_string(uri))
61
61
  end
62
62
 
63
63
  def test_chomp_query_string
64
64
  uri = "people/gmosx.sx"
65
- assert_equal("people/gmosx.sx", UriUtils.chomp_query_string(uri))
65
+ assert_equal("people/gmosx.sx", Glue::UriUtils.chomp_query_string(uri))
66
66
 
67
67
  uri = "people/gmosx.sx?koko=1;lala=2"
68
- assert_equal("people/gmosx.sx", UriUtils.chomp_query_string(uri))
68
+ assert_equal("people/gmosx.sx", Glue::UriUtils.chomp_query_string(uri))
69
69
 
70
70
  uri = "http://www.navel.gr/people/gmosx.sx?koko=1&lala=2"
71
- assert_equal("http://www.navel.gr/people/gmosx.sx", UriUtils.chomp_query_string(uri))
71
+ assert_equal("http://www.navel.gr/people/gmosx.sx", Glue::UriUtils.chomp_query_string(uri))
72
72
 
73
73
  uri = "http://www.navel.gr:8080/people/gmosx.sx?koko=1;lala=2"
74
- assert_equal("http://www.navel.gr:8080/people/gmosx.sx", UriUtils.chomp_query_string(uri))
74
+ assert_equal("http://www.navel.gr:8080/people/gmosx.sx", Glue::UriUtils.chomp_query_string(uri))
75
75
 
76
- assert_equal(nil, UriUtils.chomp_query_string(nil))
76
+ assert_equal(nil, Glue::UriUtils.chomp_query_string(nil))
77
77
  end
78
78
 
79
79
  def test_update_query_string
80
80
  uri = "ko/index.sx?koko=1"
81
81
  hash = {"lala" => 2, "kaka" => 3}
82
- assert_equal("ko/index.sx?koko=1;lala=2;kaka=3", UriUtils.update_query_string(uri, hash))
82
+ assert_equal("ko/index.sx?koko=1;lala=2;kaka=3", Glue::UriUtils.update_query_string(uri, hash))
83
83
 
84
84
  uri = "http://www.navel.gr:8080/ko/index.sx?koko=1"
85
85
  hash = {"lala" => 2, "kaka" => 3}
86
- assert_equal("http://www.navel.gr:8080/ko/index.sx?koko=1;lala=2;kaka=3", UriUtils.update_query_string(uri, hash))
86
+ assert_equal("http://www.navel.gr:8080/ko/index.sx?koko=1;lala=2;kaka=3", Glue::UriUtils.update_query_string(uri, hash))
87
87
 
88
88
  uri = "http://www.navel.gr"
89
89
  hash = {"lala" => 2, "kaka" => 3}
90
- assert_equal("http://www.navel.gr?lala=2;kaka=3", UriUtils.update_query_string(uri, hash))
90
+ assert_equal("http://www.navel.gr?lala=2;kaka=3", Glue::UriUtils.update_query_string(uri, hash))
91
91
 
92
92
  # bug: no ? when passed an empty hash
93
93
  uri = "http://www.navel.gr"
94
- assert_equal("http://www.navel.gr", UriUtils.update_query_string(uri, {}))
94
+ assert_equal("http://www.navel.gr", Glue::UriUtils.update_query_string(uri, {}))
95
95
  end
96
96
 
97
97
  end
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.28.0
7
- date: 2006-02-06 00:00:00 +02:00
6
+ version: 0.29.0
7
+ date: 2006-03-07 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: false
18
+ has_rdoc: true
19
19
  required_ruby_version: !ruby/object:Gem::Version::Requirement
20
20
  requirements:
21
21
  - - ">"
@@ -59,7 +59,6 @@ files:
59
59
  - lib/glue/mail.rb
60
60
  - lib/glue/logger.rb
61
61
  - lib/glue/attribute.rb
62
- - lib/glue/paramix.rb
63
62
  - lib/glue/flexob.rb
64
63
  - lib/glue/fixture.rb
65
64
  - lib/glue/builder.rb
@@ -68,6 +67,7 @@ files:
68
67
  - lib/glue/cache.rb
69
68
  - lib/glue/aspects.rb
70
69
  - lib/glue/markup.rb
70
+ - lib/glue/paramix.rb
71
71
  - lib/glue/accumulate.rb
72
72
  - lib/glue/autoreload.rb
73
73
  - lib/glue/builder/xml.rb
@@ -75,7 +75,7 @@ files:
75
75
  - lib/glue/mailer/incoming.rb
76
76
  - lib/glue/cache/file.rb
77
77
  - lib/glue/cache/og.rb
78
- - lib/glue/cache/memcache.rb
78
+ - lib/glue/cache/memcached.rb
79
79
  - lib/glue/cache/memory.rb
80
80
  - lib/glue/cache/drb.rb
81
81
  - lib/html/tokenizer.rb
@@ -105,7 +105,7 @@ files:
105
105
  - test/glue/tc_builder.rb
106
106
  - test/glue/tc_accumulate.rb
107
107
  - test/glue/tc_aspects.rb
108
- - test/glue/multi_validations_model.rb
108
+ - test/glue/tc_stores.rb
109
109
  - test/glue/builder/tc_xml.rb
110
110
  - test/public/dummy_mailer
111
111
  - test/public/dummy_mailer/registration.xhtml
@@ -129,7 +129,7 @@ dependencies:
129
129
  requirements:
130
130
  - - "="
131
131
  - !ruby/object:Gem::Version
132
- version: 1.0.2
132
+ version: 1.0.3
133
133
  version:
134
134
  - !ruby/object:Gem::Dependency
135
135
  name: cmdparse
@@ -1,2 +0,0 @@
1
- # gmosx: not implemented yet, anyone wants to take over this
2
- # bounty?
@@ -1,5 +0,0 @@
1
- class User
2
- property :name, String
3
- validate_length :name, :range => 2..6
4
- validate_format :name, :format => /[a-z]*/, :msg => 'invalid format', :on => :create
5
- end