proteus 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +674 -0
- data/README +88 -0
- data/Rakefile +33 -0
- data/bin/pro +189 -0
- data/lib/ClassParser.rb +84 -0
- data/lib/ComponentClass.rb +51 -0
- data/lib/ComponentInstance.rb +76 -0
- data/lib/DefinitionHelper.rb +157 -0
- data/lib/DefinitionParser.rb +107 -0
- data/lib/Facade.rb +116 -0
- data/lib/FileHelper.rb +80 -0
- data/lib/InputParser.rb +241 -0
- data/lib/InstanceParser.rb +65 -0
- data/lib/InstanceProxy.rb +100 -0
- data/lib/PropertyHash.rb +64 -0
- data/lib/TemplateRenderer.rb +128 -0
- data/lib/exceptions.rb +50 -0
- data/test/spec/ClassParser_spec.rb +314 -0
- data/test/spec/ComponentClass_spec.rb +44 -0
- data/test/spec/ComponentInstance_spec.rb +50 -0
- data/test/spec/DefinitionHelper_spec.rb +134 -0
- data/test/spec/DefinitionParser_spec.rb +236 -0
- data/test/spec/Facade_spec.rb +44 -0
- data/test/spec/FileHelper_spec.rb +113 -0
- data/test/spec/InputParser_spec.rb +424 -0
- data/test/spec/InstanceParser_spec.rb +125 -0
- data/test/spec/TemplateRenderer_spec.rb +54 -0
- data/test/spec/lib/NS1/TestComponent10.def +4 -0
- data/test/spec/lib/NS1/TestComponent11.def +4 -0
- data/test/spec/lib/NS1/TestComponent4.def +4 -0
- data/test/spec/lib/NS1/TestComponent5.def +4 -0
- data/test/spec/lib/NS1/TestComponent8.def +4 -0
- data/test/spec/lib/NS1/TestComponent9.def +4 -0
- data/test/spec/lib/NS2/TestComponent6.def +4 -0
- data/test/spec/lib/TestComponent1.def +4 -0
- data/test/spec/lib/TestComponent3.def +4 -0
- data/test/spec/test_lib_dir1/File1.def +0 -0
- data/test/spec/test_lib_dir1/File3.def +0 -0
- data/test/spec/test_lib_dir1/NS1/File4.def +0 -0
- data/test/spec/test_lib_dir1/NS1/NS2/File5.def +0 -0
- data/test/spec/test_lib_dir2/File1.def +0 -0
- data/test/spec/test_lib_dir2/File2.def +0 -0
- metadata +113 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
################################################################################
|
2
|
+
# (C) Copyright 2009 William Madden
|
3
|
+
#
|
4
|
+
# This file is part of Proteus.
|
5
|
+
#
|
6
|
+
# Proteus is free software: you can redistribute it and/or modify it under the
|
7
|
+
# terms of the GNU General Public License as published by the Free Software
|
8
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
9
|
+
# version.
|
10
|
+
#
|
11
|
+
# Proteus is distributed in the hope that it will be useful, but WITHOUT ANY
|
12
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
13
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License along with
|
16
|
+
# Proteus. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
################################################################################
|
18
|
+
|
19
|
+
require File.expand_path( 'lib/ComponentClass.rb' )
|
20
|
+
|
21
|
+
include Proteus
|
22
|
+
|
23
|
+
|
24
|
+
describe ComponentClass do
|
25
|
+
|
26
|
+
#-----------------------------------------------------------------------------
|
27
|
+
#
|
28
|
+
# Input Constants
|
29
|
+
#
|
30
|
+
#-----------------------------------------------------------------------------
|
31
|
+
|
32
|
+
#-----------------------------------------------------------------------------
|
33
|
+
#
|
34
|
+
# Set up, tear down
|
35
|
+
#
|
36
|
+
#-----------------------------------------------------------------------------
|
37
|
+
|
38
|
+
#-----------------------------------------------------------------------------
|
39
|
+
#
|
40
|
+
# Tests
|
41
|
+
#
|
42
|
+
#-----------------------------------------------------------------------------
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
################################################################################
|
2
|
+
# (C) Copyright 2009 William Madden
|
3
|
+
#
|
4
|
+
# This file is part of Proteus.
|
5
|
+
#
|
6
|
+
# Proteus is free software: you can redistribute it and/or modify it under the
|
7
|
+
# terms of the GNU General Public License as published by the Free Software
|
8
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
9
|
+
# version.
|
10
|
+
#
|
11
|
+
# Proteus is distributed in the hope that it will be useful, but WITHOUT ANY
|
12
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
13
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License along with
|
16
|
+
# Proteus. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
################################################################################
|
18
|
+
|
19
|
+
require File.expand_path( 'lib/ComponentInstance.rb' )
|
20
|
+
|
21
|
+
include Proteus
|
22
|
+
|
23
|
+
|
24
|
+
describe ComponentInstance do
|
25
|
+
|
26
|
+
#-----------------------------------------------------------------------------
|
27
|
+
#
|
28
|
+
# Input Constants
|
29
|
+
#
|
30
|
+
#-----------------------------------------------------------------------------
|
31
|
+
|
32
|
+
#-----------------------------------------------------------------------------
|
33
|
+
#
|
34
|
+
# Set up, tear down
|
35
|
+
#
|
36
|
+
#-----------------------------------------------------------------------------
|
37
|
+
|
38
|
+
#-----------------------------------------------------------------------------
|
39
|
+
#
|
40
|
+
# Tests
|
41
|
+
#
|
42
|
+
#-----------------------------------------------------------------------------
|
43
|
+
|
44
|
+
it "should override its class's default properties"
|
45
|
+
|
46
|
+
|
47
|
+
it "should drop its class's children in favour of its own, if present"
|
48
|
+
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
################################################################################
|
2
|
+
# (C) Copyright 2009 William Madden
|
3
|
+
#
|
4
|
+
# This file is part of Proteus.
|
5
|
+
#
|
6
|
+
# Proteus is free software: you can redistribute it and/or modify it under the
|
7
|
+
# terms of the GNU General Public License as published by the Free Software
|
8
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
9
|
+
# version.
|
10
|
+
#
|
11
|
+
# Proteus is distributed in the hope that it will be useful, but WITHOUT ANY
|
12
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
13
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License along with
|
16
|
+
# Proteus. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
################################################################################
|
18
|
+
|
19
|
+
require File.expand_path( 'lib/DefinitionHelper.rb' )
|
20
|
+
require File.expand_path( 'lib/exceptions.rb' )
|
21
|
+
|
22
|
+
include Proteus
|
23
|
+
|
24
|
+
|
25
|
+
describe DefinitionHelper do
|
26
|
+
|
27
|
+
#-----------------------------------------------------------------------------
|
28
|
+
#
|
29
|
+
# Input Constants
|
30
|
+
#
|
31
|
+
#-----------------------------------------------------------------------------
|
32
|
+
|
33
|
+
#-----------------------------------------------------------------------------
|
34
|
+
#
|
35
|
+
# Set up, tear down
|
36
|
+
#
|
37
|
+
#-----------------------------------------------------------------------------
|
38
|
+
|
39
|
+
#------------------------------
|
40
|
+
# before(:all)
|
41
|
+
#------------------------------
|
42
|
+
|
43
|
+
before(:all) do
|
44
|
+
|
45
|
+
# Instance parser
|
46
|
+
@instance_parser = InstanceParser.new
|
47
|
+
|
48
|
+
# Class parser
|
49
|
+
@class_parser = ClassParser.new
|
50
|
+
|
51
|
+
# Definition parser
|
52
|
+
@definition_parser = DefinitionParser.new
|
53
|
+
@definition_parser.class_parser = @class_parser
|
54
|
+
|
55
|
+
# Definition helper
|
56
|
+
@definition_helper = DefinitionHelper.new
|
57
|
+
@definition_helper.definition_parser = @definition_parser
|
58
|
+
@definition_helper.path = "test/spec/lib"
|
59
|
+
|
60
|
+
@definition_parser.definition_helper = @definition_helper
|
61
|
+
|
62
|
+
# Input parser
|
63
|
+
@input_parser = InputParser.new
|
64
|
+
@input_parser.instance_parser = @instance_parser
|
65
|
+
@input_parser.definition_helper = @definition_helper
|
66
|
+
|
67
|
+
@definition_parser.input_parser = @input_parser
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
#-----------------------------------------------------------------------------
|
72
|
+
#
|
73
|
+
# Tests
|
74
|
+
#
|
75
|
+
#-----------------------------------------------------------------------------
|
76
|
+
|
77
|
+
it "should use the current namespace if no namespace is given" do
|
78
|
+
result = @definition_helper.get_class( ["TestComponent4"], ["NS1"] )
|
79
|
+
result.name.should == "TestComponent4"
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
it "should use the given namespace if present" do
|
84
|
+
result = @definition_helper.get_class( ["NS2", "TestComponent6"], ["NS1"] )
|
85
|
+
result.name.should == "TestComponent6"
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
it "should return classes that have already been loaded" do
|
90
|
+
result = @definition_helper.get_class( ["TestComponent4"], ["NS1"] )
|
91
|
+
result.name.should == "TestComponent4"
|
92
|
+
|
93
|
+
result2 = @definition_helper.get_class( ["TestComponent4"], ["NS1"] )
|
94
|
+
result2.should == result
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
it "should fail if it can't find the class definition" do
|
99
|
+
begin
|
100
|
+
result = @definition_helper.get_class( ["TestComponent7"], ["NS1"] )
|
101
|
+
rescue Exceptions::DefinitionUnavailable
|
102
|
+
success = true
|
103
|
+
end
|
104
|
+
|
105
|
+
success.should == true
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
it "should be able to handle recursive classes" do
|
110
|
+
result = @definition_helper.get_class( ["TestComponent8"], ["NS1"] )
|
111
|
+
result.is_a?( ComponentClass ).should == true
|
112
|
+
result.name.should == "TestComponent8"
|
113
|
+
result.parent.should == result
|
114
|
+
|
115
|
+
result = @definition_helper.get_class( ["TestComponent9"], ["NS1"] )
|
116
|
+
result.is_a?( ComponentClass ).should == true
|
117
|
+
result.name.should == "TestComponent9"
|
118
|
+
result.parent.is_a?( ComponentClass ).should == true
|
119
|
+
result.parent.name.should == "TestComponent10"
|
120
|
+
result.parent.parent.should == result
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should fail if the definition's class name doesn't match its filename" do
|
125
|
+
begin
|
126
|
+
result = @definition_helper.get_class( ["TestComponent11"], ["NS1"] )
|
127
|
+
rescue Exceptions::DefinitionMalformed
|
128
|
+
success = true
|
129
|
+
end
|
130
|
+
|
131
|
+
success.should == true
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
@@ -0,0 +1,236 @@
|
|
1
|
+
################################################################################
|
2
|
+
# (C) Copyright 2009 William Madden
|
3
|
+
#
|
4
|
+
# This file is part of Proteus.
|
5
|
+
#
|
6
|
+
# Proteus is free software: you can redistribute it and/or modify it under the
|
7
|
+
# terms of the GNU General Public License as published by the Free Software
|
8
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
9
|
+
# version.
|
10
|
+
#
|
11
|
+
# Proteus is distributed in the hope that it will be useful, but WITHOUT ANY
|
12
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
13
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License along with
|
16
|
+
# Proteus. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
################################################################################
|
18
|
+
|
19
|
+
require File.expand_path( 'lib/InputParser.rb' )
|
20
|
+
|
21
|
+
include Proteus
|
22
|
+
|
23
|
+
|
24
|
+
describe DefinitionParser do
|
25
|
+
|
26
|
+
#-----------------------------------------------------------------------------
|
27
|
+
#
|
28
|
+
# Input Constants
|
29
|
+
#
|
30
|
+
#-----------------------------------------------------------------------------
|
31
|
+
|
32
|
+
class DummyInputParser
|
33
|
+
|
34
|
+
attr_accessor :called, :inputs
|
35
|
+
|
36
|
+
def initialize
|
37
|
+
@inputs = []
|
38
|
+
end
|
39
|
+
|
40
|
+
def parse_yaml( yaml, current_ns )
|
41
|
+
@called = true
|
42
|
+
@inputs.push( yaml )
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
class DummyClassParser
|
48
|
+
|
49
|
+
attr_accessor :called, :yaml, :component_class
|
50
|
+
|
51
|
+
def initialize()
|
52
|
+
@called = false
|
53
|
+
end
|
54
|
+
|
55
|
+
def parse_yaml( yaml, component_class )
|
56
|
+
@called = true
|
57
|
+
|
58
|
+
@yaml = yaml
|
59
|
+
@component_class = component_class
|
60
|
+
|
61
|
+
component_class.name = "SomeComponent"
|
62
|
+
component_class.parent = "SomeParent"
|
63
|
+
component_class.children = [
|
64
|
+
"child1",
|
65
|
+
"child2",
|
66
|
+
"child3"
|
67
|
+
]
|
68
|
+
component_class.properties = {
|
69
|
+
"prop1" => "value1",
|
70
|
+
"prop2" => "value2",
|
71
|
+
"prop3" => "value3"
|
72
|
+
}
|
73
|
+
|
74
|
+
return component_class
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
class DummyDefinitionHelper
|
80
|
+
|
81
|
+
attr_accessor :called, :class_id
|
82
|
+
|
83
|
+
def get_class( class_id, current_ns )
|
84
|
+
@called = true
|
85
|
+
@class_id = class_id
|
86
|
+
|
87
|
+
return nil
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
@@PARENT_NAME = "SomeParent"
|
93
|
+
@@UNKNOWN_PARENT_NAME = "UnknownParent"
|
94
|
+
|
95
|
+
@@COMPONENT_NAME = "SomeComponent"
|
96
|
+
@@COMPONENT_CHILDREN = [
|
97
|
+
"child1",
|
98
|
+
"child2",
|
99
|
+
"child3"
|
100
|
+
]
|
101
|
+
@@COMPONENT_PROPS = {
|
102
|
+
"prop1" => "value1",
|
103
|
+
"prop2" => "value2",
|
104
|
+
"prop3" => "value3"
|
105
|
+
}
|
106
|
+
|
107
|
+
@@COMPONENT_FULL_PROPS = {
|
108
|
+
"prop1" => "value1",
|
109
|
+
"prop2" => "value2",
|
110
|
+
"prop3" => "value3",
|
111
|
+
"children" => @@COMPONENT_CHILDREN
|
112
|
+
}
|
113
|
+
|
114
|
+
@@EXPECTED_INPUTS = [
|
115
|
+
"value1",
|
116
|
+
"value2",
|
117
|
+
"value3",
|
118
|
+
"child1",
|
119
|
+
"child2",
|
120
|
+
"child3"
|
121
|
+
]
|
122
|
+
|
123
|
+
@@DEFINITION = {
|
124
|
+
@@COMPONENT_NAME + " < " + @@PARENT_NAME => @@COMPONENT_FULL_PROPS
|
125
|
+
}
|
126
|
+
|
127
|
+
@@UNKNOWN_PARENT_DEFINITION = {
|
128
|
+
@@COMPONENT_NAME + " < " + @@UNKNOWN_PARENT_NAME => @@COMPONENT_FULL_PROPS
|
129
|
+
}
|
130
|
+
|
131
|
+
#-----------------------------------------------------------------------------
|
132
|
+
#
|
133
|
+
# Set up, tear down
|
134
|
+
#
|
135
|
+
#-----------------------------------------------------------------------------
|
136
|
+
|
137
|
+
#------------------------------
|
138
|
+
# before(:each)
|
139
|
+
#------------------------------
|
140
|
+
|
141
|
+
before(:each) do
|
142
|
+
@dummy_dh = DummyDefinitionHelper.new
|
143
|
+
@dummy_cp = DummyClassParser.new
|
144
|
+
@dummy_ip = DummyInputParser.new
|
145
|
+
|
146
|
+
@definition_parser =
|
147
|
+
DefinitionParser.new( @dummy_dh, @dummy_cp, @dummy_ip )
|
148
|
+
end
|
149
|
+
|
150
|
+
#-----------------------------------------------------------------------------
|
151
|
+
#
|
152
|
+
# Tests
|
153
|
+
#
|
154
|
+
#-----------------------------------------------------------------------------
|
155
|
+
|
156
|
+
it "should use the class parser to parse the file" do
|
157
|
+
|
158
|
+
component_class = ComponentClass.new
|
159
|
+
|
160
|
+
@definition_parser.parse_yaml( @@DEFINITION, component_class )
|
161
|
+
|
162
|
+
@dummy_cp.called.should == true
|
163
|
+
@dummy_cp.component_class.should == component_class
|
164
|
+
@dummy_cp.yaml.should == @@DEFINITION
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
|
169
|
+
it "should use the input parser to parse the class's values" do
|
170
|
+
|
171
|
+
component_class = ComponentClass.new
|
172
|
+
|
173
|
+
@definition_parser.parse_yaml( @@DEFINITION, component_class )
|
174
|
+
|
175
|
+
@dummy_ip.called.should == true
|
176
|
+
@dummy_ip.inputs.should == @@EXPECTED_INPUTS
|
177
|
+
|
178
|
+
end
|
179
|
+
|
180
|
+
|
181
|
+
it "should use the definition helper to get the parent" do
|
182
|
+
|
183
|
+
component_class = ComponentClass.new
|
184
|
+
|
185
|
+
@definition_parser.parse_yaml( @@DEFINITION, component_class )
|
186
|
+
|
187
|
+
@dummy_dh.called.should == true
|
188
|
+
@dummy_dh.class_id.should == [ @@PARENT_NAME ]
|
189
|
+
|
190
|
+
end
|
191
|
+
|
192
|
+
|
193
|
+
it "should fail if the parent is unavailable" do
|
194
|
+
|
195
|
+
component_class = ComponentClass.new
|
196
|
+
|
197
|
+
# Set up real parsers
|
198
|
+
|
199
|
+
# Instance parser
|
200
|
+
@instance_parser = InstanceParser.new
|
201
|
+
|
202
|
+
# Class parser
|
203
|
+
@class_parser = ClassParser.new
|
204
|
+
|
205
|
+
# Definition parser
|
206
|
+
@definition_parser = DefinitionParser.new
|
207
|
+
@definition_parser.class_parser = @class_parser
|
208
|
+
|
209
|
+
# Definition helper
|
210
|
+
@definition_helper = DefinitionHelper.new
|
211
|
+
@definition_helper.definition_parser = @definition_parser
|
212
|
+
@definition_helper.path = "spec/lib"
|
213
|
+
|
214
|
+
@definition_parser.definition_helper = @definition_helper
|
215
|
+
|
216
|
+
# Input parser
|
217
|
+
@input_parser = InputParser.new
|
218
|
+
@input_parser.instance_parser = @instance_parser
|
219
|
+
@input_parser.definition_helper = @definition_helper
|
220
|
+
|
221
|
+
@definition_parser.input_parser = @input_parser
|
222
|
+
|
223
|
+
begin
|
224
|
+
@definition_parser.parse_yaml( @@UNKNOWN_PARENT_DEFINITION,
|
225
|
+
component_class )
|
226
|
+
rescue Exceptions::DefinitionUnavailable
|
227
|
+
success = true
|
228
|
+
end
|
229
|
+
|
230
|
+
success.should == true
|
231
|
+
|
232
|
+
end
|
233
|
+
|
234
|
+
|
235
|
+
end
|
236
|
+
|