Skip to content

Commit 3b59005

Browse files
committed
SESPRINGPYTHONPY-86: Merged branch to trunk.
git-svn-id: https://src.springframework.org/svn/se-springpython-py/trunk/springpython@393 ce8fead1-4192-4296-8608-a705134b927f
1 parent 45f7cc4 commit 3b59005

5 files changed

Lines changed: 125 additions & 18 deletions

File tree

springpython.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
# Collection of properties involved in managing Spring Python testing and packaging.
22

3-
version=1.0.0
3+
version=0.9.1
44
natural.name=se-springpython-py
55
project.key=EXT
66

77
# release, milestone or snapshot. Trunk is always snapshot for CI build
8-
release.type=release
8+
release.type=snapshot
99

1010
# This property is only un-commented and set for official tagged releases.
11-
build.stamp=RELEASE
11+
#build.stamp=RELEASE
1212

1313
# docbook reference documentation
1414
doc.ref.dir=docs/reference

src/springpython/config/__init__.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,16 @@ def scan_value(self, container, value):
128128
else:
129129
return value
130130

131-
132131
def get_value(self, container):
133-
return self.value
132+
val = self._replace_refs_with_actuals(self.value, container)
133+
if val is None:
134+
return self.value
135+
else:
136+
return val
134137

135138
def set_value(self, obj, container):
136139
setattr(obj, self.name, self.value)
137-
self._replace_refs_with_actuals(obj, container)
140+
val = self._replace_refs_with_actuals(obj, container)
138141

139142
def _replace_refs_with_actuals(self, obj, container):
140143
"""Normal values do nothing for this step. However, sub-classes are defined for
@@ -184,7 +187,11 @@ def _replace_refs_with_actuals(self, obj, container):
184187
new_value[i] = container.get_object(new_value[i].ref)
185188
else:
186189
new_value[i] = self.scan_value(container, new_value[i])
187-
setattr(obj, self.name, tuple(new_value))
190+
try:
191+
setattr(obj, self.name, tuple(new_value))
192+
except AttributeError:
193+
pass
194+
return tuple(new_value)
188195

189196
class SetDef(ValueDef):
190197
"""Handles behavior for a set-based value."""
@@ -214,7 +221,11 @@ def _replace_refs_with_actuals(self, obj, container):
214221
else:
215222
new_set.remove(item)
216223
new_set.add(self.scan_value(container, item))
217-
setattr(obj, self.name, frozenset(new_set))
224+
try:
225+
setattr(obj, self.name, frozenset(new_set))
226+
except AttributeError:
227+
pass
228+
return frozenset(new_set)
218229

219230
class Config(object):
220231
"""
@@ -464,16 +475,6 @@ def _convert_dict(self, dict_node, id, name):
464475
dict[str(entry.key.value)] = self._convert_value(element, id, "%s.dict['%s']" % (name, entry.key.value))
465476
else:
466477
self.logger.debug("dict: Don't know how to handle %s" % element.localName)
467-
#if hasattr(entry, "value"):
468-
# if len(entry.value.xml_child_elements) > 0:
469-
# self.logger.debug("This dict entry has child elements.")
470-
# dict[str(entry.key.value)] = self._convert_value(entry.value, id, name)
471-
# else:
472-
# dict[str(entry.key.value)] = str(entry.value)
473-
#elif hasattr(entry, "ref"):
474-
# dict[str(entry.key.value)] = self._convert_ref(entry.ref, str(entry.key.value))
475-
#else:
476-
# self.logger.debug("dict: Don't know how to handle %s" % entry)
477478
return DictDef(name, dict)
478479

479480
def _convert_props(self, props_node, name):
@@ -563,6 +564,7 @@ def _convert_prop_def(self, comp, p, name):
563564
elif hasattr(p, "set"):
564565
return self._convert_set(p.set, comp.id, name)
565566
elif hasattr(p, "frozenset"):
567+
self.logger.debug("Converting frozenset")
566568
return self._convert_frozen_set(p.frozenset, comp.id, name)
567569
elif hasattr(p, "object"):
568570
return self._convert_inner_object(p.object, comp.id, name)

test/springpythontest/contextTestCases.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,9 @@ def testCollections(self):
504504
self.assertTrue(isinstance(value_holder.some_tuple, tuple))
505505
self.assertEquals(3, len(value_holder.some_tuple))
506506
self.assertEquals("Hello, world!", value_holder.some_tuple[0])
507+
print "xxx value_holder = %s" % value_holder
508+
print "xxx value_holder.some_tuple = %s" % str(value_holder.some_tuple)
509+
print "xxx value_holder.some_tuple[1] = %s" % value_holder.some_tuple[1]
507510
self.assertTrue(isinstance(value_holder.some_tuple[1], testSupportClasses.StringHolder))
508511
self.assertEquals("There should only be one copy of this string", value_holder.some_tuple[1].str)
509512
self.assertEquals("Spring Python", value_holder.some_tuple[2])
@@ -783,3 +786,42 @@ def testAThirdComplexContainer(self):
783786

784787
self.assertEquals("Test10", service4.user_dict["value"])
785788

789+
class XMLConfigConstructorBasedTestCase(unittest.TestCase):
790+
"""This test case exercises the constructors for XMLConfig"""
791+
792+
def testUsingConstructorWithObjectReference(self):
793+
ctx = ApplicationContext(XMLConfig("support/contextXMLConfigWithConstructorArgs.xml"))
794+
795+
controller = ctx.get_object("controller-list")
796+
self.assertTrue(isinstance(controller.executors, list))
797+
self.assertEquals(2, len(controller.executors))
798+
for executor in controller.executors:
799+
self.assertTrue(isinstance(executor, testSupportClasses.Executor))
800+
801+
controller = ctx.get_object("controller-set")
802+
self.assertTrue(isinstance(controller.executors, set))
803+
self.assertEquals(2, len(controller.executors))
804+
for executor in controller.executors:
805+
self.assertTrue(isinstance(executor, testSupportClasses.Executor))
806+
807+
controller = ctx.get_object("controller-dict")
808+
self.assertTrue(isinstance(controller.executors, dict))
809+
self.assertEquals(2, len(controller.executors))
810+
for key in controller.executors:
811+
self.assertTrue(isinstance(controller.executors[key], testSupportClasses.Executor))
812+
813+
controller = ctx.get_object("controller-frozenset")
814+
self.assertTrue(isinstance(controller.executors, frozenset))
815+
self.assertEquals(2, len(controller.executors))
816+
for executor in controller.executors:
817+
self.assertTrue(isinstance(executor, testSupportClasses.Executor))
818+
819+
controller = ctx.get_object("controller-tuple")
820+
self.assertTrue(isinstance(controller.executors, tuple))
821+
self.assertEquals(2, len(controller.executors))
822+
for executor in controller.executors:
823+
self.assertTrue(isinstance(executor, testSupportClasses.Executor))
824+
825+
826+
827+
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<objects xmlns="http://www.springframework.org/springpython/schema/objects"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://www.springframework.org/springpython/schema/objects
5+
http://springpython.webfactional.com/schema/context/spring-python-context-1.0.xsd">
6+
7+
<object id="controller-list" class="springpythontest.support.testSupportClasses.Controller">
8+
<constructor-arg name="executors">
9+
<list>
10+
<ref object="exec1"/>
11+
<ref object="exec2"/>
12+
</list>
13+
</constructor-arg>
14+
</object>
15+
16+
<object id="controller-set" class="springpythontest.support.testSupportClasses.Controller">
17+
<constructor-arg name="executors">
18+
<set>
19+
<ref object="exec1"/>
20+
<ref object="exec2"/>
21+
</set>
22+
</constructor-arg>
23+
</object>
24+
25+
<object id="controller-frozenset" class="springpythontest.support.testSupportClasses.Controller">
26+
<constructor-arg name="executors">
27+
<frozenset>
28+
<ref object="exec1"/>
29+
<ref object="exec2"/>
30+
</frozenset>
31+
</constructor-arg>
32+
</object>
33+
34+
<object id="controller-dict" class="springpythontest.support.testSupportClasses.Controller">
35+
<constructor-arg name="executors">
36+
<dict>
37+
<entry><key><value>exec1</value></key><ref object="exec1"/></entry>
38+
<entry><key><value>exec2</value></key><ref object="exec2"/></entry>
39+
</dict>
40+
</constructor-arg>
41+
</object>
42+
43+
<object id="controller-tuple" class="springpythontest.support.testSupportClasses.Controller">
44+
<constructor-arg name="executors">
45+
<tuple>
46+
<ref object="exec1"/>
47+
<ref object="exec2"/>
48+
</tuple>
49+
</constructor-arg>
50+
</object>
51+
52+
<object id="exec1" class="springpythontest.support.testSupportClasses.Executor"/>
53+
54+
<object id="exec2" class="springpythontest.support.testSupportClasses.Executor"/>
55+
56+
</objects>

test/springpythontest/support/testSupportClasses.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,3 +480,10 @@ def MultiValueHolder(self):
480480
@Object
481481
def MultiValueHolder2(self):
482482
return MultiValueHolder(c="alt c", b="alt b")
483+
484+
class Controller(object):
485+
def __init__(self, executors=None):
486+
self.executors = executors
487+
488+
class Executor(object):
489+
pass

0 commit comments

Comments
 (0)