Split up MoveEffectProperty; don't detect dict proxies.
authorEevee <git@veekun.com>
Sun, 3 Apr 2011 08:25:59 +0000 (01:25 -0700)
committerEevee <git@veekun.com>
Sun, 3 Apr 2011 08:25:59 +0000 (01:25 -0700)
(It didn't work anyway!)

pokedex/db/markdown.py
pokedex/db/tables.py

index dd86746..616830a 100644 (file)
@@ -72,12 +72,10 @@ class MoveEffectProperty(object):
         some_move.effect            # returns a MarkdownString
         some_move.effect.as_html    # returns a chunk of HTML
 
-    This class attempts to detect if the wrapped property is a dict-based
-    association proxy, and will act like such a dict if so.  Don't rely on it
-    for querying, of course.
-
     This class also performs simple substitution on the effect, replacing
     `$effect_chance` with the move's actual effect chance.
+
+    Use `MoveEffectPropertyMap` for dict-like association proxies.
     """
 
     def __init__(self, effect_column):
@@ -85,16 +83,19 @@ class MoveEffectProperty(object):
 
     def __get__(self, obj, cls):
         prop = getattr(obj.move_effect, self.effect_column)
-        if isinstance(prop, dict):
-            # Looks like a dict proxy; markdownify everyone
-            newdict = dict(prop)
-            for key in newdict:
-                newdict[key] = _markdownify_effect_text(obj, newdict[key])
-            return newdict
-
-        # Otherwise, scalar prop.  Boring
         return _markdownify_effect_text(obj, prop)
 
+class MoveEffectPropertyMap(MoveEffectProperty):
+    """Similar to `MoveEffectProperty`, but works on dict-like association
+    proxies.
+    """
+    def __get__(self, obj, cls):
+        prop = getattr(obj.move_effect, self.effect_column)
+        newdict = dict(prop)
+        for key in newdict:
+            newdict[key] = _markdownify_effect_text(obj, newdict[key])
+        return newdict
+
 class MarkdownColumn(sqlalchemy.types.TypeDecorator):
     """Generic SQLAlchemy column type for Markdown text.
 
index a182730..d96b965 100644 (file)
@@ -1781,18 +1781,18 @@ Move.target = relation(MoveTarget, backref='moves')
 Move.type = relation(Type, backref='moves')
 
 Move.effect = markdown.MoveEffectProperty('effect')
-Move.effect_map = markdown.MoveEffectProperty('effect_map')
+Move.effect_map = markdown.MoveEffectPropertyMap('effect_map')
 Move.short_effect = markdown.MoveEffectProperty('short_effect')
-Move.short_effect_map = markdown.MoveEffectProperty('short_effect_map')
+Move.short_effect_map = markdown.MoveEffectPropertyMap('short_effect_map')
 
 MoveChangelog.changed_in = relation(VersionGroup, backref='move_changelog')
 MoveChangelog.move_effect = relation(MoveEffect, backref='move_changelog')
 MoveChangelog.type = relation(Type, backref='move_changelog')
 
 MoveChangelog.effect = markdown.MoveEffectProperty('effect')
-MoveChangelog.effect_map = markdown.MoveEffectProperty('effect_map')
+MoveChangelog.effect_map = markdown.MoveEffectPropertyMap('effect_map')
 MoveChangelog.short_effect = markdown.MoveEffectProperty('short_effect')
-MoveChangelog.short_effect_map = markdown.MoveEffectProperty('short_effect_map')
+MoveChangelog.short_effect_map = markdown.MoveEffectPropertyMap('short_effect_map')
 
 MoveEffect.category_map = relation(MoveEffectCategoryMap)
 MoveEffect.categories = association_proxy('category_map', 'category')