glue 0.24.0 → 0.25.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.
- 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
|