Changeset 3057:1ad9c0acc32a in livinglogic.python.xist
- Timestamp:
- 12/18/07 16:34:42 (12 years ago)
- Branch:
- default
- Files:
-
- 2 modified
Legend:
- Unmodified
- Added
- Removed
-
src/ll/xist/xsc.py
r3055 r3057 3390 3390 ### 3391 3391 3392 class Pool( object):3392 class Pool(misc.Pool): 3393 3393 def __init__(self, *objects): 3394 3394 self._elementsbyxmlname = weakref.WeakValueDictionary() … … 3404 3404 self._attrsbypyname = weakref.WeakValueDictionary() 3405 3405 self._attrs = weakref.WeakValueDictionary() 3406 for object in objects: 3407 self.register(object) 3406 misc.Pool.__init__(self, *objects) 3408 3407 3409 3408 def register(self, object): … … 3451 3450 self.register(attr) 3452 3451 elif isinstance(object, types.ModuleType): 3452 super(Pool, self).register(object) 3453 3453 for (key, value) in object.__dict__.iteritems(): 3454 3454 if isinstance(value, type): # This avoids recursive module registration 3455 3455 self.register(value) 3456 try:3457 self._attrs[key] = value3458 except TypeError:3459 pass3460 3456 elif isinstance(object, dict): 3457 super(Pool, self).register(object) 3461 3458 for (key, value) in object.iteritems(): 3462 3459 if isinstance(value, type): # This avoids recursive module registration 3463 3460 self.register(value) 3464 try: 3465 self._attrs[key] = value 3466 except TypeError: 3467 pass 3461 elif isinstance(object, Pool): 3462 super(Pool, self).register(object) 3468 3463 3469 3464 def __enter__(self): … … 3478 3473 Return an iterator for all registered element classes. 3479 3474 """ 3480 return self._elementsbypyname.itervalues() 3475 return self._elementsbypyname.itervalues() # FIXME: this ignores bases 3481 3476 3482 3477 def elementclass(self, name, xmlns): … … 3499 3494 except KeyError: 3500 3495 pass 3496 for base in self.bases: 3497 return base.elementclass(name, xmlns) 3501 3498 raise IllegalElementError(name, xmlns, False) 3502 3499 … … 3520 3517 except KeyError: 3521 3518 pass 3519 for base in self.bases: 3520 return base.elementclass_xml(name, xmlns) 3522 3521 raise IllegalElementError(name, xmlns, True) 3523 3522 … … 3541 3540 with the Python name <arg>name</arg> and the namespace <arg>xmlns</arg>? 3542 3541 """ 3543 return (name, nsname(xmlns)) in self._elementsbypyname 3542 return (name, nsname(xmlns)) in self._elementsbypyname or any(base.haselement(name, xmlns) for base in self.bases) 3544 3543 3545 3544 def haselement_xml(self, name, xmlns): … … 3548 3547 with the &xml; name <arg>name</arg> and the namespace <arg>xmlns</arg>? 3549 3548 """ 3550 return (name, nsname(xmlns)) in self._elementsbyxmlname 3549 return (name, nsname(xmlns)) in self._elementsbyxmlname or any(base.haselement_xml(name, xmlns) for base in self.bases) 3551 3550 3552 3551 def procinsts(self): … … 3554 3553 Return an iterator for all registered processing instruction classes. 3555 3554 """ 3556 return self._procinstsbypyname.itervalues() 3555 return self._procinstsbypyname.itervalues() # FIXME: this ignores bases 3557 3556 3558 3557 def procinstclass(self, name): … … 3565 3564 return self._procinstsbypyname[name] 3566 3565 except KeyError: 3566 for base in self.bases: 3567 return base.procinstclass(name, xmlns) 3567 3568 raise IllegalProcInstError(name, False) 3568 3569 … … 3576 3577 return self._procinstsbyxmlname[name] 3577 3578 except KeyError: 3579 for base in self.bases: 3580 return base.procinstclass_xml(name, xmlns) 3578 3581 raise IllegalProcInstError(name, True) 3579 3582 … … 3597 3600 PI with the Python name <arg>name</arg>? 3598 3601 """ 3599 return name in self._procinstsbypyname 3602 return name in self._procinstsbypyname or any(base.hasprocinst(name) for base in self.bases) 3600 3603 3601 3604 def hasprocinst_xml(self, name): … … 3604 3607 PI with the &xml; name <arg>name</arg>? 3605 3608 """ 3606 return name in self._procinstsbyxmlname 3609 return name in self._procinstsbyxmlname or any(base.hasprocinst_xml(name) for base in self.bases) 3607 3610 3608 3611 def entities(self): … … 3610 3613 Return an iterator for all registered entity classes. 3611 3614 """ 3612 return self._entitiesbypyname.itervalues() 3615 return self._entitiesbypyname.itervalues() # FIXME: this ignores bases 3613 3616 3614 3617 def entityclass(self, name): … … 3621 3624 return self._entitiesbypyname[name] 3622 3625 except KeyError: 3626 for base in self.bases: 3627 return base.entityclass(name) 3623 3628 raise IllegalEntityError(name, False) 3624 3629 … … 3632 3637 return self._entitiesbyxmlname[name] 3633 3638 except KeyError: 3639 for base in self.bases: 3640 return base.entityclass_xml(name) 3634 3641 raise IllegalEntityError(name, True) 3635 3642 … … 3653 3660 Python name <arg>name</arg>? 3654 3661 """ 3655 return name in self._entitiesbypyname 3662 return name in self._entitiesbypyname or any(base.hasentity(name) for base in self.bases) 3656 3663 3657 3664 def hasentity_xml(self, name): … … 3660 3667 &xml; name <arg>name</arg>? 3661 3668 """ 3662 return name in self._entitiesbyxmlname 3669 return name in self._entitiesbyxmlname or any(base.hasentity_xml(name) for base in self.bases) 3663 3670 3664 3671 def charrefs(self): … … 3666 3673 Return an iterator for all character entity classes. 3667 3674 """ 3668 return self._charrefsbypyname.itervalues() 3675 return self._charrefsbypyname.itervalues() # FIXME: this ignores bases 3669 3676 3670 3677 def charrefclass(self, name): … … 3680 3687 return self._charrefsbypyname[name] 3681 3688 except KeyError: 3689 for base in self.bases: 3690 return base.charrefclass(name) 3682 3691 raise IllegalEntityError(name, False) 3683 3692 … … 3694 3703 return self._charrefsbyxmlname[name] 3695 3704 except KeyError: 3705 for base in self.bases: 3706 return base.charrefclass_xml(name) 3696 3707 raise IllegalEntityError(name, True) 3697 3708 … … 3716 3727 """ 3717 3728 if isinstance(name, (int, long)): 3718 returnname in self._charrefsbycodepoint3729 has = name in self._charrefsbycodepoint 3719 3730 else: 3720 return name in self._charrefsbypyname 3731 has = name in self._charrefsbypyname 3732 return has or any(base.hascharref(name) for base in self.bases) 3721 3733 3722 3734 def hascharref_xml(self, name): … … 3726 3738 """ 3727 3739 if isinstance(name, (int, long)): 3728 returnname in self._charrefsbycodepoint3740 has = name in self._charrefsbycodepoint 3729 3741 else: 3730 return name in self._charrefsbypyname 3742 has = name in self._charrefsbypyname 3743 return has or any(base.hascharref_xml(name) for base in self.bases) 3731 3744 3732 3745 def attrclass(self, name, xmlns): … … 3744 3757 except KeyError: 3745 3758 pass 3759 for base in self.bases: 3760 return base.attrclass(name, xmlns) 3746 3761 raise IllegalAttrError(name, xmlns, False) 3747 3762 … … 3760 3775 except KeyError: 3761 3776 pass 3777 for base in self.bases: 3778 return base.attrclass_xml(name, xmlns) 3762 3779 raise IllegalAttrError(name, xmlns, True) 3763 3780 … … 3778 3795 return self._attrs[key] 3779 3796 except KeyError: 3797 for base in self.bases: 3798 return getattr(base, key) 3780 3799 raise AttributeError(key) 3781 3800 … … 3784 3803 Return a copy of <self/>. 3785 3804 """ 3786 copy = self.__class__()3805 copy = Pool.clone(self) 3787 3806 copy._elementsbyxmlname = self._elementsbyxmlname.copy() 3788 3807 copy._elementsbypyname = self._elementsbypyname.copy() … … 3796 3815 copy._attrsbyxmlname = self._attrsbyxmlname.copy() 3797 3816 copy._attrsbypyname = self._attrsbypyname.copy() 3798 copy._attrs = self._attrs.copy()3799 3817 return copy 3800 3818 3801 3819 3802 class ChainedPool(Pool):3803 """3804 <par>Class pool for <pyref class="Element">element</pyref>,3805 <pyref class="ProcInst">procinst</pyref>, <pyref class="Entity">entity</pyref>,3806 <pyref class="CharRef">charref</pyref> and <pyref class="Attr">attribute</pyref> classes.</par>3807 3808 <par>This is used by the parser to map names to classes.</par>3809 """3810 def __init__(self, *objects):3811 """3812 <par>Create a new pool. All objects in <arg>objects</arg> will be passed3813 to the <method>register</method> method.</par>3814 """3815 self.bases = []3816 Pool.__init__(self, *objects)3817 3818 def register(self, object):3819 """3820 <par>Register <arg>object</arg> in the pool. In addition to the types3821 supported by the base class' <pyref class="Pool"><method>register</method></pyref>3822 method, the following arguments are supported:</par>3823 <ulist>3824 <item>A <class>Pool</class> object (this pool object will be added to the3825 base pools. If a class isn't found in <self/> the search continues in this3826 base pool;</item>3827 <item><lit>True</lit>, which adds the current default pool to the base pools.</item>3828 </ulist>3829 """3830 Pool.register(self, object)3831 if object is True:3832 self.bases.append(getpoolstack()[-1])3833 elif isinstance(object, Pool):3834 self.bases.append(object)3835 elif isinstance(object, types.ModuleType) and hasattr(object, "xmlbases"):3836 for module in object.xmlbases:3837 self.register(ChainedPool(module))3838 3839 def elementclass(self, name, xmlns):3840 try:3841 return Pool.elementclass(self, name, xmlns)3842 except IllegalElementError:3843 for base in self.bases:3844 return base.elementclass(name, xmlns)3845 raise3846 3847 def elementclass_xml(self, name, xmlns):3848 try:3849 return Pool.elementclass_xml(self, name, xmlns)3850 except IllegalElementError:3851 for base in self.bases:3852 return base.elementclass_xml(name, xmlns)3853 raise3854 3855 def haselement(self, name, xmlns):3856 return Pool.haselement(self, name, xmlns) or any(base.haselement(name, xmlns) for base in self.bases)3857 3858 def haselement_xml(self, name, xmlns):3859 return Pool.haselement_xml(self, name, xmlns) or any(base.haselement_xml(name, xmlns) for base in self.bases)3860 3861 def procinstclass(self, name):3862 try:3863 return Pool.procinstclass(self, name)3864 except IllegalProcInstError:3865 for base in self.bases:3866 return base.procinstclass(name, xmlns)3867 raise3868 3869 def procinstclass_xml(self, name):3870 try:3871 return Pool.procinstclass_xml(self, name)3872 except IllegalProcInstError:3873 for base in self.bases:3874 return base.procinstclass_xml(name, xmlns)3875 raise3876 3877 def hasprocinst(self, name):3878 return Pool.hasprocinst(self, name) or any(base.hasprocinst(name) for base in self.bases)3879 3880 def hasprocinst_xml(self, name):3881 return Pool.hasprocinst_xml(self, name) or any(base.hasprocinst_xml(name) for base in self.bases)3882 3883 def entityclass(self, name):3884 try:3885 return Pool.entityclass(self, name)3886 except IllegalEntityError:3887 for base in self.bases:3888 return base.entityclass(name)3889 raise3890 3891 def entityclass_xml(self, name):3892 try:3893 return Pool.entityclass_xml(self, name)3894 except IllegalEntityError:3895 for base in self.bases:3896 return base.entityclass_xml(name)3897 raise3898 3899 def hasentity(self, name):3900 return Pool.hasentity(self, name) or any(base.hasentity(name) for base in self.bases)3901 3902 def hasentity_xml(self, name):3903 return Pool.hasentity_xml(self, name) or any(base.hasentity_xml(name) for base in self.bases)3904 3905 def charrefclass(self, name):3906 try:3907 return Pool.charrefclass(self, name)3908 except IllegalEntityError:3909 for base in self.bases:3910 return base.charrefclass(name)3911 raise3912 3913 def charrefclass_xml(self, name):3914 try:3915 return Pool.charrefclass_xml(self, name)3916 except IllegalEntityError:3917 for base in self.bases:3918 return base.charrefclass_xml(name)3919 raise3920 3921 def hascharref(self, name):3922 return Pool.hascharref(self, name) or any(base.hascharref(name) for base in self.bases)3923 3924 def hascharref_xml(self, name):3925 return Pool.hascharref_xml(self, name) or any(base.hascharref_xml(name) for base in self.bases)3926 3927 def attrclass(self, name, xmlns):3928 try:3929 return Pool.attrclass(self, name, xmlns)3930 except IllegalAttrError:3931 for base in self.bases:3932 return base.attrclass(name, xmlns)3933 raise3934 3935 def attrclass_xml(self, name, xmlns):3936 try:3937 return Pool.attrclass_xml(self, name, xmlns)3938 except IllegalAttrError:3939 for base in self.bases:3940 return base.attrclass_xml(name, xmlns)3941 raise3942 3943 def __getattr__(self, key):3944 try:3945 return Pool.__getattr__(self, key)3946 except AttributeError:3947 for base in self.bases:3948 return getattr(base, key)3949 raise3950 3951 def clone(self):3952 """3953 Return a copy of <self/>.3954 """3955 copy = Pool.clone(self)3956 copy.bases = self.bases[:]3957 return copy3958 3959 3960 3820 # Default class pool 3961 defaultpool = ChainedPool()3821 defaultpool = Pool() 3962 3822 3963 3823 -
test/test_pool.py
r3035 r3057 228 228 xmlns = "nix" 229 229 230 with xsc. ChainedPool(r1) as r2:230 with xsc.Pool(r1) as r2: 231 231 class foo2(xsc.Element): 232 232 xmlname = "foo" … … 249 249 xmlns = "nix" 250 250 251 with xsc. ChainedPool(True) as r2:251 with xsc.Pool(True) as r2: 252 252 class bar(xsc.Element): 253 253 xmlns = "nix"