Skip to content

Commit

Permalink
Merge pull request #44 from SylvainCorlay/readonly
Browse files Browse the repository at this point in the history
Read-only trait attributes
  • Loading branch information
minrk committed Jul 23, 2015
2 parents 684b5fa + 17bb29e commit 7f2ce7e
Showing 1 changed file with 18 additions and 2 deletions.
20 changes: 18 additions & 2 deletions traitlets/traitlets.py
Original file line number Diff line number Diff line change
Expand Up @@ -330,9 +330,10 @@ class TraitType(BaseDescriptor):
metadata = {}
default_value = Undefined
allow_none = False
read_only = False
info_text = 'any value'

def __init__(self, default_value=Undefined, allow_none=None, **metadata):
def __init__(self, default_value=Undefined, allow_none=None, read_only=None, **metadata):
"""Declare a traitlet.
If *allow_none* is True, None is a valid value in addition to any
Expand All @@ -347,6 +348,8 @@ def __init__(self, default_value=Undefined, allow_none=None, **metadata):
self.default_value = default_value
if allow_none is not None:
self.allow_none = allow_none
if read_only is not None:
self.read_only = read_only

if 'default' in metadata:
# Warn the user that they probably meant default_value.
Expand Down Expand Up @@ -446,7 +449,7 @@ def __get__(self, obj, cls=None):
else:
return value

def __set__(self, obj, value):
def set(self, obj, value):
new_value = self._validate(obj, value)
try:
old_value = obj._trait_values[self.name]
Expand All @@ -464,6 +467,12 @@ def __set__(self, obj, value):
# comparison above returns something other than True/False
obj._notify_trait(self.name, old_value, new_value)

def __set__(self, obj, value):
if self.read_only:
raise TraitError('The "%s" trait is read-only.' % self.name)
else:
self.set(obj, value)

def _validate(self, obj, value):
if value is None and self.allow_none:
return value
Expand Down Expand Up @@ -860,6 +869,13 @@ def add_traits(self, **traits):
for trait in traits.values():
trait.instance_init(self)

def set_trait(self, name, value):
if not self.has_trait(name):
raise TraitError("Class %s does not have a trait named %s" %
(self.__class__.__name__, name))
else:
self.traits()[name].set(self, value)

#-----------------------------------------------------------------------------
# Actual TraitTypes implementations/subclasses
#-----------------------------------------------------------------------------
Expand Down

0 comments on commit 7f2ce7e

Please sign in to comment.