glue 0.24.0 → 0.25.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ProjectInfo +2 -5
- data/doc/RELEASES +8 -0
- data/lib/glue.rb +11 -15
- data/lib/glue/builder/xml.rb +6 -6
- data/lib/glue/{mixins.rb → expirable.rb} +2 -4
- data/lib/glue/markup.rb +121 -0
- data/lib/glue/property.rb +17 -40
- data/lib/glue/template.rb +6 -6
- data/lib/glue/validation.rb +3 -1
- data/test/glue/tc_property_mixins.rb +9 -9
- data/test/glue/tc_template.rb +3 -0
- metadata +5 -7
- data/lib/glue/bit.rb +0 -53
- data/lib/glue/helper.rb +0 -31
- data/lib/glue/mock.rb +0 -40
data/ProjectInfo
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
TITLE : &title Glue
|
4
4
|
NAME : &pkg glue
|
5
|
-
VERSION : '0.
|
5
|
+
VERSION : '0.25.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.
|
18
|
+
- [ facets, '= 2005.10.30' ]
|
19
19
|
- [ cmdparse, '= 2.0.0' ]
|
20
20
|
|
21
21
|
DISTRIBUTE: [ gem, tgz, zip ]
|
@@ -39,9 +39,6 @@ ANNOUNCE:
|
|
39
39
|
sectype: tls # ~, tls, ssl (tls is broke)
|
40
40
|
file: ANN
|
41
41
|
slogan: Glue
|
42
|
-
|
43
|
-
|
44
|
-
|
45
42
|
links:
|
46
43
|
- http://www.nitrohq.com
|
47
44
|
|
data/doc/RELEASES
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== Version 0.25.0
|
2
|
+
|
3
|
+
This is the first in a series of releases focused on stability
|
4
|
+
and refinement. Many bugs where fixed, the high level api was
|
5
|
+
improved where needed, and we still got some small but incredibly
|
6
|
+
useful new features. Enjoy!
|
7
|
+
|
8
|
+
|
1
9
|
== Version 0.24.0
|
2
10
|
|
3
11
|
* Totaly recoded annotation / property system. The property
|
data/lib/glue.rb
CHANGED
@@ -12,14 +12,22 @@ require 'English'
|
|
12
12
|
require 'pp'
|
13
13
|
|
14
14
|
require 'mega/null'
|
15
|
+
require 'mega/dynamod'
|
16
|
+
require 'nano/module/is'
|
15
17
|
|
16
18
|
require 'glue/property'
|
17
19
|
require 'glue/attribute'
|
18
20
|
|
19
|
-
|
21
|
+
module Glue
|
22
|
+
|
23
|
+
# The version.
|
24
|
+
|
25
|
+
Version = '0.25.0'
|
26
|
+
|
27
|
+
# Library path.
|
28
|
+
|
29
|
+
LibPath = File.dirname(__FILE__)
|
20
30
|
|
21
|
-
class NullClass
|
22
|
-
def [](key); nil; end
|
23
31
|
end
|
24
32
|
|
25
33
|
class NilClass
|
@@ -60,18 +68,6 @@ module Kernel
|
|
60
68
|
end
|
61
69
|
end
|
62
70
|
|
63
|
-
module Glue
|
64
|
-
|
65
|
-
# The version.
|
66
|
-
|
67
|
-
Version = '0.24.0'
|
68
|
-
|
69
|
-
# Library path.
|
70
|
-
|
71
|
-
LibPath = File.dirname(__FILE__)
|
72
|
-
|
73
|
-
end
|
74
|
-
|
75
71
|
# Include in the top level binding for easy access.
|
76
72
|
|
77
73
|
include Glue
|
data/lib/glue/builder/xml.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'glue/builder'
|
2
2
|
|
3
|
-
require 'nitro/
|
4
|
-
require 'nitro/
|
5
|
-
require 'nitro/
|
3
|
+
require 'nitro/helper/xhtml'
|
4
|
+
require 'nitro/helper/form'
|
5
|
+
require 'nitro/helper/table'
|
6
6
|
|
7
7
|
module Glue
|
8
8
|
|
@@ -12,9 +12,9 @@ module Glue
|
|
12
12
|
#++
|
13
13
|
|
14
14
|
class XmlBuilder < Builder
|
15
|
-
include_builder Nitro::
|
16
|
-
include_builder Nitro::
|
17
|
-
include_builder Nitro::
|
15
|
+
include_builder Nitro::XhtmlHelper
|
16
|
+
include_builder Nitro::TableHelper
|
17
|
+
include_builder Nitro::FormHelper
|
18
18
|
|
19
19
|
def method_missing(tag, *args, &block)
|
20
20
|
self.class.module_eval <<-"end_eval", __FILE__, __LINE__
|
@@ -1,7 +1,3 @@
|
|
1
|
-
# * George Moschovitis <gm@navel.gr>
|
2
|
-
# (c) 2004-2005 Navel, all rights reserved.
|
3
|
-
# $Id: mixins.rb 182 2005-07-22 10:07:50Z gmosx $
|
4
|
-
|
5
1
|
module Glue
|
6
2
|
|
7
3
|
# Generic expiring functionality mixin.
|
@@ -34,3 +30,5 @@ module Expirable
|
|
34
30
|
end
|
35
31
|
|
36
32
|
end
|
33
|
+
|
34
|
+
# * George Moschovitis <gm@navel.gr>
|
data/lib/glue/markup.rb
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
require 'redcloth'
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
require 'glue/sanitize'
|
6
|
+
|
7
|
+
module Glue
|
8
|
+
|
9
|
+
# Generalised Markup transformations.
|
10
|
+
#
|
11
|
+
# The expand methods evaluate (expand) the markup
|
12
|
+
# code to produce the final content. The compact
|
13
|
+
# methods reverse this process to create the original
|
14
|
+
# markup code. Not all markup transformations are
|
15
|
+
# reversible.
|
16
|
+
#
|
17
|
+
# When this library is included, the default PropertyUtils
|
18
|
+
# implementation is overriden to add markup support.
|
19
|
+
#
|
20
|
+
# === Examples
|
21
|
+
#
|
22
|
+
# Define your custom markup methods like this:
|
23
|
+
#
|
24
|
+
# module Markup
|
25
|
+
# def markup_simple
|
26
|
+
# ...
|
27
|
+
# end
|
28
|
+
# def markup_special
|
29
|
+
# ...
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# # maps the {{..}} macro
|
33
|
+
# alias_method :sanitize, :markup_simple
|
34
|
+
# # maps the {|..|} macro
|
35
|
+
# alias_method :markup, :markup_special
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# here comes the #{obj.body} # => prints the expanded version.
|
39
|
+
#
|
40
|
+
# obj.body = markup(@params['body'])
|
41
|
+
|
42
|
+
module Markup
|
43
|
+
# The default markup method. You should override this method
|
44
|
+
# in your application to call your custom markup
|
45
|
+
# methods.
|
46
|
+
|
47
|
+
def expand(str)
|
48
|
+
if str
|
49
|
+
xstr = str.dup
|
50
|
+
xstr.gsub!(/</, '<')
|
51
|
+
xstr.gsub!(/>/, '>')
|
52
|
+
xstr.gsub!(/\n/m, '<br/>')
|
53
|
+
return String.sanitize(xstr)
|
54
|
+
end
|
55
|
+
return nil
|
56
|
+
end
|
57
|
+
alias_method :sanitize, :expand
|
58
|
+
|
59
|
+
# ...
|
60
|
+
|
61
|
+
def expand_redcloth(str)
|
62
|
+
if str
|
63
|
+
return RedCloth.new(expand(str)).to_html
|
64
|
+
end
|
65
|
+
return nil
|
66
|
+
end
|
67
|
+
alias_method :markup, :expand_redcloth
|
68
|
+
|
69
|
+
# Compact (reverse) the content to the origial markup
|
70
|
+
# code. Not all markup transformations are reversible.
|
71
|
+
# You should override this method in your application
|
72
|
+
# to call your custom markup methods.
|
73
|
+
#
|
74
|
+
# NOT IMPLEMENTED.
|
75
|
+
|
76
|
+
def compact(str, meth = nil)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Remove markup code from the input string.
|
80
|
+
#
|
81
|
+
# NOT IMPLEMENTED.
|
82
|
+
|
83
|
+
def clear(str)
|
84
|
+
end
|
85
|
+
|
86
|
+
def escape(str)
|
87
|
+
return nil unless str
|
88
|
+
CGI.escape(str.gsub(/ /, '_'))
|
89
|
+
end
|
90
|
+
|
91
|
+
def unescape(str)
|
92
|
+
CGI.unescape(str.gsub(/_/, ' '))
|
93
|
+
end
|
94
|
+
|
95
|
+
class << self
|
96
|
+
# Helper method for manipulating the sanitize transformation.
|
97
|
+
|
98
|
+
def setup_sanitize_transform(&block)
|
99
|
+
self.send :define_method, :sanitize, block
|
100
|
+
end
|
101
|
+
alias_method :setup_sanitize_transformation, :setup_sanitize_transform
|
102
|
+
|
103
|
+
# Helper method for manipulating the markup transformation.
|
104
|
+
|
105
|
+
def setup_markup_transform(&block)
|
106
|
+
self.send :define_method, :markup, block
|
107
|
+
end
|
108
|
+
alias_method :setup_markup_transformation, :setup_markup_transform
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# An abstract Markup class.
|
113
|
+
|
114
|
+
class MarkupKit
|
115
|
+
extend Markup
|
116
|
+
include Markup
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
# * George Moschovitis <gm@navel.gr>
|
data/lib/glue/property.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'mega/annotation'
|
2
2
|
require 'mega/inheritor'
|
3
|
-
require 'mega/
|
3
|
+
require 'mega/dictionary'
|
4
4
|
|
5
5
|
require 'glue/on_included'
|
6
6
|
require 'og/entity'
|
@@ -69,7 +69,7 @@ class Property
|
|
69
69
|
# if incoming file then read contents into a string.
|
70
70
|
|
71
71
|
prop_value = values[prop_name]
|
72
|
-
prop_value.read if prop_value.respond_to?(:read)
|
72
|
+
#TODO remove this? prop_value.read if prop_value.respond_to?(:read)
|
73
73
|
prop_value = prop_value.to_s unless prop_value.is_a?(Hash) or prop_value.is_a?(Array)
|
74
74
|
|
75
75
|
# If property is a Blob dont overwrite current property's data if "".
|
@@ -84,20 +84,7 @@ class Property
|
|
84
84
|
# Only enabled if force_boolean == true.
|
85
85
|
|
86
86
|
obj.send("__force_#{prop_name}", 0)
|
87
|
-
else
|
88
|
-
# check if there is a hashed version of the property (in the form values[symbol.part])
|
89
87
|
|
90
|
-
property_parts = Hash.new
|
91
|
-
values.each do |k,v|
|
92
|
-
if k =~ /^#{prop_name}\./
|
93
|
-
part_key = k.sub("#{prop_name}.", "")
|
94
|
-
property_parts[part_key.to_sym] = values[k].to_s
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
# pass the hashed version to __force_hash_ for processing.
|
99
|
-
|
100
|
-
obj.send("__force_hash_#{prop_name}", property_parts) unless property_parts.empty?
|
101
88
|
end
|
102
89
|
end
|
103
90
|
|
@@ -116,7 +103,7 @@ class Property
|
|
116
103
|
if foreign_oid = values[rel_name]
|
117
104
|
foreign_oid = nil if foreign_oid == 'nil' or foreign_oid == 'none'
|
118
105
|
end
|
119
|
-
obj.send("__force_#{rel.foreign_key}", foreign_oid)
|
106
|
+
obj.send("__force_#{rel.foreign_key}", foreign_oid.to_s)
|
120
107
|
elsif rel.kind_of? Og::JoinsMany or rel.kind_of? Og::HasMany
|
121
108
|
# Empty current relationships.
|
122
109
|
|
@@ -143,30 +130,20 @@ class Property
|
|
143
130
|
|
144
131
|
code = %{
|
145
132
|
def __force_#{sym}(val)
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
'val'
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
case klass.name
|
162
|
-
when Time.name
|
163
|
-
code << %{
|
164
|
-
self.#{sym} = Time.local(hash[:year],hash[:month],hash[:day],hash[:hour],hash[:min])
|
165
|
-
}
|
166
|
-
end
|
167
|
-
|
168
|
-
code << %{
|
169
|
-
end
|
133
|
+
if respond_to?(:force_#{sym})
|
134
|
+
self.#{sym} = force_#{sym}(val)
|
135
|
+
else
|
136
|
+
self.#{sym}=(} << case klass.name
|
137
|
+
when Fixnum.name: 'val.nil? ? nil : val.to_i'
|
138
|
+
when String.name: 'val.to_s'
|
139
|
+
when Float.name: 'val.to_f'
|
140
|
+
when Time.name: 'val.is_a?(Hash) ? Time.local(val["year"],val["month"],val["day"],val["hour"],val["min"]) : Time.parse(val.to_s)'
|
141
|
+
when Date.name: 'val.is_a?(Hash) ? Time.local(val["year"],val["month"],val["day"]).to_date : Time.parse(val.to_s).to_date'
|
142
|
+
when TrueClass.name, FalseClass.name: 'val == "on" or val == "true" ? true
|
143
|
+
else 'val'
|
144
|
+
end + %{)
|
145
|
+
end
|
146
|
+
end
|
170
147
|
}
|
171
148
|
|
172
149
|
m.module_eval(code)
|
data/lib/glue/template.rb
CHANGED
@@ -37,12 +37,12 @@ module TemplateMixin
|
|
37
37
|
#
|
38
38
|
# Example:
|
39
39
|
# <?include href="root/myfile.sx" ?>
|
40
|
-
|
40
|
+
|
41
41
|
text.gsub!(/<\?include href=["|'](.*?)["|'](.*)\?>/) do |match|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
itext = File.read("#{base_dir}/#$1")
|
43
|
+
itext.gsub!(/<\?xml.*\?>/, '')
|
44
|
+
itext.gsub!(/<\/?root(.*?)>/m, ' ');
|
45
|
+
itext
|
46
46
|
end
|
47
47
|
|
48
48
|
# Transform include instructions <include href="xxx" />
|
@@ -53,7 +53,7 @@ module TemplateMixin
|
|
53
53
|
# add load_statically_included fixes.
|
54
54
|
|
55
55
|
text.gsub!(/<include href=["|'](.*?)["|'](.*)(.?)\/>/) do |match|
|
56
|
-
"<?r File.read( '
|
56
|
+
"<?r File.read( '\#{@dispatcher.root}/#$1' ?>"
|
57
57
|
end
|
58
58
|
|
59
59
|
# xform render/inject instructions <render href="xxx" />
|
data/lib/glue/validation.rb
CHANGED
@@ -7,6 +7,9 @@ module Glue
|
|
7
7
|
# objects. Typically used in Validator objects but can be
|
8
8
|
# included in managed objects too.
|
9
9
|
#
|
10
|
+
# Additional og-related validation macros can be found
|
11
|
+
# in lib/og/validation.
|
12
|
+
#
|
10
13
|
# The following validation macros are available:
|
11
14
|
#
|
12
15
|
# * validate_value
|
@@ -55,7 +58,6 @@ module Glue
|
|
55
58
|
#
|
56
59
|
#--
|
57
60
|
# TODO: all validation methods should imply validate_value
|
58
|
-
# TODO: add validate_unique
|
59
61
|
#++
|
60
62
|
|
61
63
|
module Validation
|
@@ -5,13 +5,13 @@ require 'glue/property'
|
|
5
5
|
|
6
6
|
module Mixin
|
7
7
|
prop_accessor :date
|
8
|
-
ann
|
8
|
+
ann self, :dummy => [123]
|
9
9
|
end
|
10
10
|
|
11
11
|
class MixedOnly
|
12
12
|
include Mixin
|
13
|
-
ann.
|
14
|
-
ann.
|
13
|
+
ann.self.dummy! << 5
|
14
|
+
ann.self.dummy! << 3
|
15
15
|
end
|
16
16
|
|
17
17
|
class MixedOnly2
|
@@ -33,12 +33,12 @@ end
|
|
33
33
|
|
34
34
|
class Base
|
35
35
|
prop_accessor :date
|
36
|
-
ann
|
36
|
+
ann self, :dummy => [123]
|
37
37
|
end
|
38
38
|
|
39
39
|
class Child1 < Base
|
40
|
-
ann.
|
41
|
-
ann.
|
40
|
+
ann.self.dummy!.first << 5
|
41
|
+
ann.self.dummy!.first << 3
|
42
42
|
end
|
43
43
|
|
44
44
|
class Child2 < Base
|
@@ -71,10 +71,10 @@ class TC_MixinsTest < ::Test::Unit::TestCase
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def test_crosspolination
|
74
|
-
assert_equal 3, MixedOnly.ann.
|
74
|
+
assert_equal 3, MixedOnly.ann.self[:dummy].size
|
75
75
|
# FIXME:
|
76
|
-
# assert_equal 1, MixedOnly2.ann.
|
77
|
-
# assert_equal 1, Mixin.ann.
|
76
|
+
# assert_equal 1, MixedOnly2.ann.self[:dummy].size
|
77
|
+
# assert_equal 1, Mixin.ann.self[:dummy].size
|
78
78
|
=begin
|
79
79
|
gmosx: THINK!
|
80
80
|
assert_equal 3, Child1.__meta[:dummy].first.size
|
data/test/glue/tc_template.rb
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
|
|
3
3
|
specification_version: 1
|
4
4
|
name: glue
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2005-
|
6
|
+
version: 0.25.0
|
7
|
+
date: 2005-11-17
|
8
8
|
summary: Utility methods and classes for Nitro.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -44,20 +44,18 @@ files:
|
|
44
44
|
- lib/html
|
45
45
|
- lib/glue/aspects.rb
|
46
46
|
- lib/glue/attribute.rb
|
47
|
-
- lib/glue/bit.rb
|
48
47
|
- lib/glue/builder
|
49
48
|
- lib/glue/builder.rb
|
50
49
|
- lib/glue/configuration.rb
|
50
|
+
- lib/glue/expirable.rb
|
51
51
|
- lib/glue/fixture.rb
|
52
52
|
- lib/glue/flexob.rb
|
53
|
-
- lib/glue/helper.rb
|
54
53
|
- lib/glue/localization.rb
|
55
54
|
- lib/glue/logger.rb
|
56
55
|
- lib/glue/mail.rb
|
57
56
|
- lib/glue/mailer
|
58
57
|
- lib/glue/mailer.rb
|
59
|
-
- lib/glue/
|
60
|
-
- lib/glue/mock.rb
|
58
|
+
- lib/glue/markup.rb
|
61
59
|
- lib/glue/on_included.rb
|
62
60
|
- lib/glue/property.rb
|
63
61
|
- lib/glue/sanitize.rb
|
@@ -112,7 +110,7 @@ dependencies:
|
|
112
110
|
-
|
113
111
|
- "="
|
114
112
|
- !ruby/object:Gem::Version
|
115
|
-
version: 2005.10.
|
113
|
+
version: 2005.10.30
|
116
114
|
version:
|
117
115
|
- !ruby/object:Gem::Dependency
|
118
116
|
name: cmdparse
|
data/lib/glue/bit.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
# (c) 2005 George Moschovitis <gm@navel.gr>
|
2
|
-
|
3
|
-
def bitmask(bit)
|
4
|
-
1 << bit
|
5
|
-
end
|
6
|
-
|
7
|
-
def set_bit(num, bit)
|
8
|
-
mask = bitmask(bit)
|
9
|
-
num |= mask
|
10
|
-
end
|
11
|
-
|
12
|
-
def clear_bit(num, bit)
|
13
|
-
mask = bitmask(bit)
|
14
|
-
num &= mask
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_bit(num, bit)
|
18
|
-
mask = bitmask(bit)
|
19
|
-
(num & mask) != 0
|
20
|
-
end
|
21
|
-
alias :bit? :test_bit
|
22
|
-
alias :bit_set? :test_bit
|
23
|
-
|
24
|
-
def set_bitmask(num, mask)
|
25
|
-
num |= mask
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_bitmask(num, mask)
|
29
|
-
num &= mask
|
30
|
-
end
|
31
|
-
alias :bitmask? :test_bitmask
|
32
|
-
|
33
|
-
if $0 == __FILE__
|
34
|
-
a = 1
|
35
|
-
m = bitmask(4)
|
36
|
-
a = set_bitmask(a, m)
|
37
|
-
p a
|
38
|
-
p test_bitmask(a, m)
|
39
|
-
p test_bit(a, 4)
|
40
|
-
p bit_set?(a, 4)
|
41
|
-
p test_bit(a, 12)
|
42
|
-
end
|
43
|
-
|
44
|
-
__END__
|
45
|
-
|
46
|
-
Is it possible to get an interface like this?
|
47
|
-
|
48
|
-
a = 1
|
49
|
-
a.set_bit(3)
|
50
|
-
if a.test_bit(3)
|
51
|
-
|
52
|
-
if a.bit_set? 3
|
53
|
-
end
|
data/lib/glue/helper.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'nano/module/by_name'
|
2
|
-
|
3
|
-
require 'glue/attribute'
|
4
|
-
|
5
|
-
module Glue
|
6
|
-
|
7
|
-
# Helpers are standard Ruby modules that contain utility
|
8
|
-
# methods. By using the special 'helper'
|
9
|
-
# macro provided by HelperSupport, the utility methods are
|
10
|
-
# included as private methods.
|
11
|
-
|
12
|
-
module Helpers
|
13
|
-
|
14
|
-
def self.append_features(base)
|
15
|
-
super
|
16
|
-
base.module_eval do
|
17
|
-
def self.helper(*modules)
|
18
|
-
for mod in modules
|
19
|
-
symbols = mod.instance_methods.collect { |m| m.to_sym }
|
20
|
-
self.send(:include, mod)
|
21
|
-
self.send(:private, *symbols)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
# * George Moschovitis <gm@navel.gr>
|
data/lib/glue/mock.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'ostruct'
|
2
|
-
|
3
|
-
# A simple mocking facility. Typically used in test cases.
|
4
|
-
#
|
5
|
-
# === Example:
|
6
|
-
#
|
7
|
-
# class ContextMock < Mock
|
8
|
-
# mock :response_headers, {}
|
9
|
-
# mock :host_url, 'http://www.nitrohq.com'
|
10
|
-
# end
|
11
|
-
#
|
12
|
-
# ctx = ContextMock.new
|
13
|
-
# ctx.response_headers['location'] = url
|
14
|
-
# ctx.host_url
|
15
|
-
|
16
|
-
class Mock < OpenStruct
|
17
|
-
class << self
|
18
|
-
attr :mocks
|
19
|
-
|
20
|
-
# Mock a symbol, val is the default values. Useful
|
21
|
-
# for mocking structured variables like arrays and
|
22
|
-
# hashes.
|
23
|
-
|
24
|
-
def mock(sym, val)
|
25
|
-
@mocks ||= {}
|
26
|
-
@mocks[sym] = val
|
27
|
-
attr_accessor sym
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def initialize
|
32
|
-
super
|
33
|
-
|
34
|
-
for sym, val in self.class.mocks
|
35
|
-
unless val.is_a? Proc
|
36
|
-
instance_variable_set "@#{sym}", val
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|