def __validate1 (property): """ Exit with error if property is not valid. """ msg = None f = get_grist (property) if f: value = get_value (property) if not feature.valid (f): f = ungrist (get_grist (property)) # Ungrist for better error messages msg = "Unknown feature '%s'" % f elif value and not 'free' in feature.attributes (f): feature.validate_value_string (f, value) elif not value: f = ungrist (get_grist (property)) # Ungrist for better error messages msg = "No value specified for feature '%s'" % f else: f = feature.implied_feature (property) feature.validate_value_string (f, property) if msg: # FIXME: don't use globals like this. Import here to # break circular dependency. from b2.manager import get_manager get_manager().errors()("Invalid property '%s': %s" % (property, msg))
def create_from_string(s, allow_condition=False, allow_missing_value=False): assert isinstance(s, basestring) assert isinstance(allow_condition, bool) assert isinstance(allow_missing_value, bool) condition = [] import types if not isinstance(s, types.StringType): print type(s) if __re_has_condition.search(s): if not allow_condition: raise BaseException( "Conditional property is not allowed in this context") m = __re_separate_condition_and_property.match(s) condition = m.group(1) s = m.group(2) # FIXME: break dependency cycle from b2.manager import get_manager feature_name = get_grist(s) if not feature_name: if feature.is_implicit_value(s): f = feature.implied_feature(s) value = s else: raise get_manager().errors()( "Invalid property '%s' -- unknown feature" % s) else: if feature.valid(feature_name): f = feature.get(feature_name) value = get_value(s) else: # In case feature name is not known, it is wrong to do a hard error. # Feature sets change depending on the toolset. So e.g. # <toolset-X:version> is an unknown feature when using toolset Y. # # Ideally we would like to ignore this value, but most of # Boost.Build code expects that we return a valid Property. For this # reason we use a sentinel <not-applicable-in-this-context> feature. # # The underlying cause for this problem is that python port Property # is more strict than its Jam counterpart and must always reference # a valid feature. f = feature.get(__not_applicable_feature) value = s if not value and not allow_missing_value: get_manager().errors()( "Invalid property '%s' -- no value specified" % s) if condition: condition = [create_from_string(x) for x in condition.split(',')] return Property(f, value, condition)
def create_from_string(s, allow_condition=False,allow_missing_value=False): assert isinstance(s, basestring) assert isinstance(allow_condition, bool) assert isinstance(allow_missing_value, bool) condition = [] import types if not isinstance(s, types.StringType): print type(s) if __re_has_condition.search(s): if not allow_condition: raise BaseException("Conditional property is not allowed in this context") m = __re_separate_condition_and_property.match(s) condition = m.group(1) s = m.group(2) # FIXME: break dependency cycle from b2.manager import get_manager feature_name = get_grist(s) if not feature_name: if feature.is_implicit_value(s): f = feature.implied_feature(s) value = s else: raise get_manager().errors()("Invalid property '%s' -- unknown feature" % s) else: if feature.valid(feature_name): f = feature.get(feature_name) value = get_value(s) else: # In case feature name is not known, it is wrong to do a hard error. # Feature sets change depending on the toolset. So e.g. # <toolset-X:version> is an unknown feature when using toolset Y. # # Ideally we would like to ignore this value, but most of # Boost.Build code expects that we return a valid Property. For this # reason we use a sentinel <not-applicable-in-this-context> feature. # # The underlying cause for this problem is that python port Property # is more strict than its Jam counterpart and must always reference # a valid feature. f = feature.get(__not_applicable_feature) value = s if not value and not allow_missing_value: get_manager().errors()("Invalid property '%s' -- no value specified" % s) if condition: condition = [create_from_string(x) for x in condition.split(',')] return Property(f, value, condition)