Modified:
branches/unhork/grassyknoll/backend/lucene/LuceneCollection.py
branches/unhork/grassyknoll/lib/Model.py
branches/unhork/grassyknoll/lib/Norman.py
branches/unhork/grassyknoll/tests/test_Model.py
branches/unhork/grassyknoll/tests/test_Norman.py
branches/unhork/grassyknoll/tests/test_backends/FixtureCollectionTests.py
branches/unhork/grassyknoll/tests/test_backends/GenericCollectionTests.py
branches/unhork/grassyknoll/tests/test_backends/NSFCollectionTests.py
branches/unhork/grassyknoll/tests/test_backends/ShakespeareCollectionTests.py
branches/unhork/grassyknoll/tests/test_backends/test_LuceneCollection.py
Log:
Issue #162: Converted ${foo}Norman to ${foo} where ${foo} != None, Factory.
Modified: branches/unhork/grassyknoll/backend/lucene/LuceneCollection.py
==============================================================================
--- branches/unhork/grassyknoll/backend/lucene/LuceneCollection.py
(original)
+++ branches/unhork/grassyknoll/backend/lucene/LuceneCollection.py Mon Dec
29 11:22:36 2008
@@ -331,8 +331,8 @@
optional=False)
-class LuceneNorman(Norman.ObjectNorman):
- """a reasonable default L{Norman.ObjectNorman} for use with
L{LuceneCollection}.
+class LuceneNorman(Norman.Object):
+ """a reasonable default L{Norman.Object} for use with
L{LuceneCollection}.
Users should add addtional L{SmartFieldNorman}s as desired.
Modified: branches/unhork/grassyknoll/lib/Model.py
==============================================================================
--- branches/unhork/grassyknoll/lib/Model.py (original)
+++ branches/unhork/grassyknoll/lib/Model.py Mon Dec 29 11:22:36 2008
@@ -1,6 +1,6 @@
"""contains L{Model} and L{Schema}
-Here's how you use this thing. Schemas will include ObjectNorman,
TableMaker,
+Here's how you use this thing. Schemas will include Object, TableMaker,
etc.:
with Model(sub1 = MySchema(),
Modified: branches/unhork/grassyknoll/lib/Norman.py
==============================================================================
--- branches/unhork/grassyknoll/lib/Norman.py (original)
+++ branches/unhork/grassyknoll/lib/Norman.py Mon Dec 29 11:22:36 2008
@@ -1,9 +1,9 @@
"""Norman likes things neat
->>> pants = ObjectNorman()
->>> pants.sale_date = DateNorman()
->>> pants.size = IntNorman(optional=True)
->>> pants.color = UnicodeNorman()
+>>> pants = Object()
+>>> pants.sale_date = Date()
+>>> pants.size = Int(optional=True)
+>>> pants.color = Unicode()
>>> pants.constant = FactoryNorman(lambda x: u"CONSTANT", prohibited=True,
filled=True)
>>> input = dict(sale_date='April 1, 2007', size='32', color='blue')
>>> bluejeans = pants(input)
@@ -50,7 +50,7 @@
"""base class for Normans
The following are only meaningful when the Norman is attached to a
- L{ObjectNorman}.
+ L{Object}.
@ivar optional: may this value be omitted
@type optional: bool
@@ -79,10 +79,10 @@
@staticmethod
def idField():
- return UnicodeNorman(optional=False)
+ return Unicode(optional=False)
class NamedNormanError(NormanError):
- """Error raised when a single NormanError was caught by an
ObjectNorman.
+ """Error raised when a single NormanError was caught by an Object.
@ivar name: Name of the field that had the error.
@type name: str
@@ -111,7 +111,7 @@
return str(self.errors)
__repr__ = __str__
-class ObjectNorman(Norman, Model.Schema):
+class Object(Norman, Model.Schema):
"""Norman that operates on dict or object.__dict__
Attach further Normans as attributes. These will be called on the
@@ -142,7 +142,7 @@
Model.Schema.__init__(self)
def __repr__(self):
- return '#ObjectNorman(%r)' % self.__fields__ # Useful for debugging
+ return '#Object(%r)' % self.__fields__ # Useful for debugging
def byKey(self, d, unknown=None):
assert isinstance(d, dict)
@@ -250,7 +250,7 @@
except ValueError: # Not in list
pass
-class ListNorman(Norman):
+class List(Norman):
"""wraps up another L{Norman}, and returns a list of values
@ivar subnorman: the wrapped-up norman
@@ -263,7 +263,7 @@
optional = subnorman.optional
filled = subnorman.filled
prohibited = subnorman.prohibited
- super(ListNorman, self).__init__(optional=optional, filled=filled,
+ super(List, self).__init__(optional=optional, filled=filled,
prohibited=prohibited)
def __call__(self, x):
@@ -311,7 +311,7 @@
else:
delattr(self.fact, name)
-class IdemNorman(Norman):
+class Idem(Norman):
"""a Norman that just returns whatever you pass it
Perhaps useful for testing
@@ -343,7 +343,7 @@
else:
raise NormanError(x)
-class BoolNorman(Norman):
+class Bool(Norman):
"""normalizes to boolean
Strings in these should be lower case.
@@ -365,7 +365,7 @@
if falses is not None:
self.falses = falses
- super(BoolNorman, self).__init__(**kwargs)
+ super(Bool, self).__init__(**kwargs)
@lowerString
def __call__(self, x):
@@ -376,7 +376,7 @@
else:
raise NormanError(x)
-class IntNorman(Norman):
+class Int(Norman):
"""normalizes to an integer"""
@staticmethod
@@ -386,7 +386,7 @@
except ValueError:
raise NormanError(x)
-class FloatNorman(Norman):
+class Float(Norman):
"""normalizes to a float"""
@staticmethod
@@ -396,7 +396,7 @@
except ValueError:
raise NormanError(x)
-class UnicodeNorman(Norman):
+class Unicode(Norman):
"""Normalizes to L{unicode} by decoding.
Attributes C{encoding} and C{errors} are interpreted as in
str.decode(..);
@@ -406,7 +406,7 @@
def __init__(self, encoding='utf8', errors='strict', **kwargs):
self.encoding = encoding
self.errors = errors
- super(UnicodeNorman, self).__init__(**kwargs)
+ super(Unicode, self).__init__(**kwargs)
def __call__(self, x):
if isinstance(x, unicode):
@@ -419,7 +419,7 @@
except UnicodeDecodeError:
raise NormanError('Failed to decode: %r' % x)
-class StrNorman(Norman):
+class Str(Norman):
"""Normalizes to L{str} by encoding.
Attributes C{encoding} and C{errors} are interpreted as in
unicode.encode(..);
@@ -429,7 +429,7 @@
def __init__(self, encoding='utf8', errors='strict', **kwargs):
self.encoding = encoding
self.errors = errors
- super(StrNorman, self).__init__(**kwargs)
+ super(Str, self).__init__(**kwargs)
def __call__(self, x):
if isinstance(x, str):
@@ -443,7 +443,7 @@
raise NormanError(x)
# XXX poorly named, as it doesn't return a dict
-class DictNorman(Norman):
+class Dict(Norman):
"""Normalizes using a dict
@ivar map: input => output
@@ -451,7 +451,7 @@
"""
def __init__(self, map, **kwargs):
self.map = map
- super(DictNorman, self).__init__(**kwargs)
+ super(Dict, self).__init__(**kwargs)
@lowerString
def __call__(self, x):
@@ -460,7 +460,7 @@
except KeyError:
raise NormanError(x)
-class DatetimeNorman(Norman):
+class Datetime(Norman):
"""Normalizes to a L{datetime.datetime}
@note: NOTE: this should probably be stricter. dateutils always
returns a full
@@ -477,7 +477,7 @@
self.out_tzinfo = out_tzinfo or dateutil.tz.tzutc()
self.add_tzinfo = add_tzinfo
self.kwargs = kwargs
- super(DatetimeNorman, self).__init__(optional=optional,
filled=filled,
+ super(Datetime, self).__init__(optional=optional, filled=filled,
prohibited=prohibited)
def __call__(self, x):
@@ -505,16 +505,16 @@
dt = dt.astimezone(self.out_tzinfo)
return dt
-class DateNorman(DatetimeNorman):
+class Date(Datetime):
"""Normalizes to L{datetime.date}"""
def __call__(self, x):
if isinstance(x, datetime.date):
return x # Timezone doesn't matter for dates, apparently.
else:
- dt = super(DateNorman, self).__call__(x)
+ dt = super(Date, self).__call__(x)
return dt.date()
-class TimeNorman(DatetimeNorman):
+class Time(Datetime):
"""Normalizes to L{datetime.time}"""
def _time(self, dt):
return dt.time().replace(tzinfo=dt.tzinfo)
@@ -524,7 +524,7 @@
today = datetime.datetime.today()
return self._time(self._addTz(datetime.datetime.combine(today,
x)))
else:
- dt = super(TimeNorman, self).__call__(x)
+ dt = super(Time, self).__call__(x)
# For some dumb reason, datetime.datetime.time() doesn't
preserve the tzinfo.
return self._time(dt)
@@ -559,7 +559,7 @@
## Could include `object` here, but...
for t in Model.SCALAR_TYPES:
- _type2norman[t] = getattr(this_module, t.__name__.capitalize()
+ "Norman")
+ _type2norman[t] = getattr(this_module, t.__name__.capitalize())
_build_type2norman()
Modified: branches/unhork/grassyknoll/tests/test_Model.py
==============================================================================
--- branches/unhork/grassyknoll/tests/test_Model.py (original)
+++ branches/unhork/grassyknoll/tests/test_Model.py Mon Dec 29 11:22:36 2008
@@ -184,29 +184,29 @@
assert model.sub3.quantity.wrapped is int
-def test_Model_with_ObjectNorman():
- norm = Norman.ObjectNorman()
+def test_Model_with_Object():
+ norm = Norman.Object()
with Model(norm = norm) as model:
assert model.norm is norm
model.size = int
assert model.size is int
- assert isinstance(norm.size, Norman.IntNorman)
+ assert isinstance(norm.size, Norman.Int)
model.color = unicode
assert model.color is unicode
- assert isinstance(norm.color, Norman.UnicodeNorman)
+ assert isinstance(norm.color, Norman.Unicode)
model.price = float
assert model.price is float
- assert isinstance(norm.price, Norman.FloatNorman)
+ assert isinstance(norm.price, Norman.Float)
with model.description(type = unicode) as _:
assert model.description is unicode
- _.norm = Norman.UnicodeNorman(errors = 'replace')
+ _.norm = Norman.Unicode(errors = 'replace')
- assert isinstance(norm.description, Norman.UnicodeNorman)
+ assert isinstance(norm.description, Norman.Unicode)
assert norm.description.errors == 'replace'
# something not in SCALAR_TYPES but supported by Norman
@@ -275,7 +275,7 @@
def test_Realistic_Model():
- with Model(fixture = Norman.ObjectNorman(unknown='delete').\
+ with Model(fixture = Norman.Object(unknown='delete').\
default(optional=False), # XXX this won't
work right
lucene = LuceneCollection.LuceneNorman(unknown='delete').\
default(store = True), # XXX nor
this
@@ -291,7 +291,7 @@
_.lucene.index = 'untokenized'
_.lucene.optional = True
- assert isinstance(model.fixture.Date, Norman.DateNorman)
+ assert isinstance(model.fixture.Date, Norman.Date)
assert isinstance(model.table.Date, TableMaker.Column)
assert model.table.Date.type is datetime.date
assert isinstance(model.lucene.Date, Norman.FactoryNorman)
Modified: branches/unhork/grassyknoll/tests/test_Norman.py
==============================================================================
--- branches/unhork/grassyknoll/tests/test_Norman.py (original)
+++ branches/unhork/grassyknoll/tests/test_Norman.py Mon Dec 29 11:22:36
2008
@@ -13,11 +13,11 @@
assert_does_not_raise(Norman.Norman.idField)
-def testObjectNormanDict():
- pants = Norman.ObjectNorman()
- pants.sale_date = Norman.DateNorman()
- pants.size = Norman.IntNorman(optional=True)
- pants.color = Norman.UnicodeNorman()
+def testObjectDict():
+ pants = Norman.Object()
+ pants.sale_date = Norman.Date()
+ pants.size = Norman.Int(optional=True)
+ pants.color = Norman.Unicode()
pants.constant = Norman.FactoryNorman(lambda x: u"CONSTANT",
prohibited=True, filled=True)
@@ -55,8 +55,8 @@
assert bluejeans.sale_date == datetime.date(2007, 4, 1)
assert bluejeans.constant == u'CONSTANT'
-def test_ObjectNormanUnknown():
- on = Norman.ObjectNorman()
+def test_ObjectUnknown():
+ on = Norman.Object()
d = {'foo': 'bar'}
dd = on(d, unknown=id)
assert_equals(id(d['foo']), dd['foo'])
@@ -66,14 +66,14 @@
assert_equals(d['foo'], dd['foo'])
assert_raises(Norman.NormanError, on, d, unknown='error')
-def test_ObjectNormanUnsetField():
- on = Norman.ObjectNorman(unknown='ignore')
- on.foo = Norman.IntNorman()
+def test_ObjectUnsetField():
+ on = Norman.Object(unknown='ignore')
+ on.foo = Norman.Int()
assert_equals(on({'foo': '1'}), {'foo': 1})
del on.foo
assert_equals(on({'foo': '1'}), {'foo': '1'})
- on.bar = Norman.IntNorman(optional=True)
+ on.bar = Norman.Int(optional=True)
assert_equals(on({'bar': '1'}), {'bar': 1})
del on.bar
assert_equals(on({'bar': '1'}), {'bar': '1'})
@@ -85,9 +85,9 @@
assert_equals(str(nes).count('name'), 3, str(nes))
assert_equals(str(nes).count('foo'), 3, str(nes))
-def test_ListNorman():
- intNorman = Norman.IntNorman()
- multiNorman = Norman.ListNorman(intNorman)
+def test_List():
+ intNorman = Norman.Int()
+ multiNorman = Norman.List(intNorman)
assert hasattr(multiNorman, 'optional')
assert hasattr(multiNorman, 'filled')
assert hasattr(multiNorman, 'prohibited')
@@ -98,8 +98,8 @@
def testTypes():
assert issubclass(Norman.NormanError, ValueError)
-def test_IdemNorman():
- norm = Norman.IdemNorman()
+def test_Idem():
+ norm = Norman.Idem()
d = {}
assert norm(d) is d
@@ -108,62 +108,62 @@
assert norm(None) is norm('null') is None
assert_raises(Norman.NormanError, norm, 0)
-def test_BoolNorman():
- norm = Norman.BoolNorman()
+def test_Bool():
+ norm = Norman.Bool()
assert norm('yes') and norm(True)
assert not norm(0) and isinstance(norm('no'), bool)
assert_raises(Norman.NormanError, norm, None)
- norm = Norman.BoolNorman(trues=['absolutely'], falses=['arguably'])
+ norm = Norman.Bool(trues=['absolutely'], falses=['arguably'])
assert_raises(Norman.NormanError, norm, 'yes')
assert norm('absolutely')
assert_raises(Norman.NormanError, norm, 'no')
assert not norm('arguably')
-def test_IntNorman():
- norm = Norman.IntNorman()
+def test_Int():
+ norm = Norman.Int()
assert norm('1') == 1
assert norm('0') == 0
assert norm('-1') == -1
-def test_FloatNorman():
- norm = Norman.FloatNorman()
+def test_Float():
+ norm = Norman.Float()
assert norm('1.0') == 1.0
assert isinstance(norm(0), float)
assert norm('-1.0') == -1.0
assert norm('inf') == float('inf')
assert_raises(Norman.NormanError, norm, '0x1')
-def test_UnicodeNorman():
- norm = Norman.UnicodeNorman()
+def test_Unicode():
+ norm = Norman.Unicode()
assert_equals(norm(u'foo'), u'foo')
assert_raises(Norman.NormanError, norm, [])
assert isinstance(norm('foo'), unicode)
assert norm('foo') == u'foo'
assert norm('\xe2\x98\xba') == u'\u263a'
- norm = Norman.UnicodeNorman(encoding='iso8859-7')
+ norm = Norman.Unicode(encoding='iso8859-7')
assert norm('\xf0') == u'\u03c0'
- norm = Norman.UnicodeNorman(encoding='ascii')
+ norm = Norman.Unicode(encoding='ascii')
assert_raises(Norman.NormanError, norm, 'foo\xFF')
-def test_StrNorman():
- norm = Norman.StrNorman()
+def test_Str():
+ norm = Norman.Str()
assert norm('abc') == 'abc' and isinstance(norm(u''), str)
assert_raises(Norman.NormanError, norm, [])
- norm = Norman.StrNorman(encoding='ascii')
+ norm = Norman.Str(encoding='ascii')
assert_raises(Norman.NormanError, norm, u'\u1234')
-def test_DictNorman():
- norm = Norman.DictNorman({'foo': 'FOO', 'bar': 'BAR'})
+def test_Dict():
+ norm = Norman.Dict({'foo': 'FOO', 'bar': 'BAR'})
assert norm('foo') == 'FOO'
assert norm('bar') == 'BAR'
assert_raises(Norman.NormanError, norm, 'baz')
-def test_DatetimeNorman():
- norm = Norman.DatetimeNorman()
+def test_Datetime():
+ norm = Norman.Datetime()
assert_equals(norm('2008-1-1 12:00:00'),
datetime.datetime(2008, 1, 1, 12, tzinfo=tzutc))
norm.in_tzinfo = tzcst
@@ -180,19 +180,19 @@
assert isinstance(norm(0.0), datetime.datetime)
assert_raises(Norman.NormanError, norm, 'Yesterday')
-def test_DateNorman():
- norm = Norman.DateNorman()
+def test_Date():
+ norm = Norman.Date()
assert norm('2008-1-1') == datetime.date(2008, 1, 1)
assert_raises(Norman.NormanError, norm, '2008-13-13 12:00:00')
-def test_TimeNorman():
- norm = Norman.TimeNorman()
+def test_Time():
+ norm = Norman.Time()
assert norm('12:00') == datetime.time(12, 0, 0, 0, tzutc)
assert norm(norm('12:00')) == datetime.time(12, 0, 0, 0, tzutc)
assert_raises(Norman.NormanError, norm, '2008-13-13 12:00:00')
-def test_TimeNormanTZ():
- norm = Norman.TimeNorman(in_tzinfo=dateutil.tz.tzstr('CST6CDT'))
+def test_TimeTZ():
+ norm = Norman.Time(in_tzinfo=dateutil.tz.tzstr('CST6CDT'))
assert_equals(norm('1:00'), datetime.time(7, 0, 0, 0, tzutc))
def test_FactoryNorman():
Modified:
branches/unhork/grassyknoll/tests/test_backends/FixtureCollectionTests.py
==============================================================================
---
branches/unhork/grassyknoll/tests/test_backends/FixtureCollectionTests.py
(original)
+++
branches/unhork/grassyknoll/tests/test_backends/FixtureCollectionTests.py
Mon Dec 29 11:22:36 2008
@@ -39,7 +39,7 @@
class FixtureCollectionTest(GenericCollectionTest):
fixture_source = None
- fixture_norman = Norman.IdemNorman()
+ fixture_norman = Norman.Idem()
fixture_directory = os.path.join(os.path.dirname(__file__),
'../../../grassyknoll/tests/fixtures')
Modified:
branches/unhork/grassyknoll/tests/test_backends/GenericCollectionTests.py
==============================================================================
---
branches/unhork/grassyknoll/tests/test_backends/GenericCollectionTests.py
(original)
+++
branches/unhork/grassyknoll/tests/test_backends/GenericCollectionTests.py
Mon Dec 29 11:22:36 2008
@@ -130,7 +130,7 @@
super(ClientCollectionTest, self).setup_hook()
self.underlying_collection = self.collectionClass(self.location,
**(self.__init_kwargs__ or {}))
-
CherrypyResources.grassyKnollObjects.setup(self.underlying_collection,
Norman.IdemNorman())
+
CherrypyResources.grassyKnollObjects.setup(self.underlying_collection,
Norman.Idem())
# install wsgi_intercept
# TODO: Ken, this should be global/general, not stuffed in the
test!
Modified:
branches/unhork/grassyknoll/tests/test_backends/NSFCollectionTests.py
==============================================================================
--- branches/unhork/grassyknoll/tests/test_backends/NSFCollectionTests.py
(original)
+++ branches/unhork/grassyknoll/tests/test_backends/NSFCollectionTests.py
Mon Dec 29 11:22:36 2008
@@ -13,27 +13,27 @@
fixture_source = 'nsf_ra'
## InputNorman, I think? ##
- fixture_norman = Norman.ObjectNorman(unknown='delete')
+ fixture_norman = Norman.Object(unknown='delete')
- fixture_norman.Date = Norman.DateNorman()
- fixture_norman.Start_Date = Norman.DateNorman()
- fixture_norman.Expires = Norman.DateNorman()
+ fixture_norman.Date = Norman.Date()
+ fixture_norman.Start_Date = Norman.Date()
+ fixture_norman.Expires = Norman.Date()
- fixture_norman.NSF_Program = Norman.IntNorman()
- fixture_norman.Total_Amt = Norman.IntNorman()
+ fixture_norman.NSF_Program = Norman.Int()
+ fixture_norman.Total_Amt = Norman.Int()
- fixture_norman.Fld_Applictn = Norman.UnicodeNorman()
- fixture_norman.Investigator = Norman.UnicodeNorman()
- fixture_norman.Abstract = Norman.UnicodeNorman()
- fixture_norman.Award_Instr = Norman.UnicodeNorman()
- fixture_norman.Prgm_Manager = Norman.UnicodeNorman()
- fixture_norman.Sponsor = Norman.UnicodeNorman()
- fixture_norman.File = Norman.UnicodeNorman()
- fixture_norman.Program_Ref = Norman.UnicodeNorman()
- fixture_norman.NSF_Org = Norman.UnicodeNorman()
- fixture_norman.Type = Norman.UnicodeNorman()
- fixture_norman.Title = Norman.UnicodeNorman()
- fixture_norman.Award_Number = Norman.UnicodeNorman()
+ fixture_norman.Fld_Applictn = Norman.Unicode()
+ fixture_norman.Investigator = Norman.Unicode()
+ fixture_norman.Abstract = Norman.Unicode()
+ fixture_norman.Award_Instr = Norman.Unicode()
+ fixture_norman.Prgm_Manager = Norman.Unicode()
+ fixture_norman.Sponsor = Norman.Unicode()
+ fixture_norman.File = Norman.Unicode()
+ fixture_norman.Program_Ref = Norman.Unicode()
+ fixture_norman.NSF_Org = Norman.Unicode()
+ fixture_norman.Type = Norman.Unicode()
+ fixture_norman.Title = Norman.Unicode()
+ fixture_norman.Award_Number = Norman.Unicode()
def test_basic(self):
ids = self.collection.list()
Modified:
branches/unhork/grassyknoll/tests/test_backends/ShakespeareCollectionTests.py
==============================================================================
---
branches/unhork/grassyknoll/tests/test_backends/ShakespeareCollectionTests.py
(original)
+++
branches/unhork/grassyknoll/tests/test_backends/ShakespeareCollectionTests.py
Mon Dec 29 11:22:36 2008
@@ -1,5 +1,5 @@
from grassyknoll.tests import assert_sorted_equals
-from grassyknoll.lib.Norman import ObjectNorman, UnicodeNorman
+from grassyknoll.lib.Norman import Object, Unicode
from grassyknoll.tests.test_backends.FixtureCollectionTests import *
__all__ = ['ShakespeareBasicTest', 'makeTestClasses']
Modified:
branches/unhork/grassyknoll/tests/test_backends/test_LuceneCollection.py
==============================================================================
---
branches/unhork/grassyknoll/tests/test_backends/test_LuceneCollection.py
(original)
+++
branches/unhork/grassyknoll/tests/test_backends/test_LuceneCollection.py
Mon Dec 29 11:22:36 2008
@@ -4,7 +4,7 @@
from grassyknoll.tests import *
from Factory import ObjectTemplate, Bunch
-from grassyknoll.lib.Norman import ObjectNorman, UnicodeNorman
+from grassyknoll.lib.Norman import Object, Unicode
from grassyknoll.tests.test_backends.GenericCollectionTests import
TestFilenameFactory
from grassyknoll.backend.lucene.LuceneCollection import (LuceneCollection,
LuceneNorman,
@@ -97,12 +97,12 @@
__init_kwargs__={'storage_normans':
storage_normans})
-shakes_norman = ObjectNorman()
-shakes_norman.act = UnicodeNorman()
-shakes_norman.play = UnicodeNorman()
-shakes_norman.title = UnicodeNorman()
-shakes_norman.scene = UnicodeNorman()
-shakes_norman.contents = UnicodeNorman()
+shakes_norman = Object()
+shakes_norman.act = Unicode()
+shakes_norman.play = Unicode()
+shakes_norman.title = Unicode()
+shakes_norman.scene = Unicode()
+shakes_norman.contents = Unicode()
shakes_storage_norman = LuceneNorman()
shakes_storage_norman.act = SmartFieldNorman(store=True)