def initialize(self, context, params, used_names=None): context = context.create_child_context() context[constants.CTX_ALLOW_PROPERTY_WRITES] = True object_store = helpers.get_object_store() for property_name in self.type.properties: spec = self.type.properties[property_name] if spec.usage == dsl_types.PropertyUsages.Config: if property_name in self._config: property_value = self._config[property_name] else: property_value = dsl.NO_VALUE self.set_property(property_name, property_value, dry_run=self._initialized) init = self.type.methods.get('.init') used_names = used_names or set() names = set(self.type.properties) if init: names.update(init.arguments_scheme.keys()) last_errors = len(names) init_args = {} while True: errors = 0 for property_name in names: if init and property_name in init.arguments_scheme: spec = init.arguments_scheme[property_name] is_init_arg = True else: spec = self.type.properties[property_name] is_init_arg = False if property_name in used_names: continue if spec.usage in (dsl_types.PropertyUsages.Config, dsl_types.PropertyUsages.Static): used_names.add(property_name) continue if spec.usage == dsl_types.PropertyUsages.Runtime: if not spec.has_default: used_names.add(property_name) continue property_value = dsl.NO_VALUE else: property_value = params.get(property_name, dsl.NO_VALUE) try: if is_init_arg: init_args[property_name] = property_value else: self.set_property(property_name, property_value, context, dry_run=self._initialized) used_names.add(property_name) except exceptions.UninitializedPropertyAccessError: errors += 1 except exceptions.ContractViolationException: if spec.usage != dsl_types.PropertyUsages.Runtime: raise if not errors: break if errors >= last_errors: raise exceptions.CircularExpressionDependenciesError() last_errors = errors if (not object_store.initializing and self._extension is None and not self._initialized and not self._destroyed and not helpers.is_objects_dry_run_mode()): method = self.type.methods.get('__init__') if method: filtered_params = yaql_integration.filter_parameters( method.body, **params) yield lambda: method.invoke(self, filtered_params[0], filtered_params[1], context) for parent in self._parents.values(): for t in parent.initialize(context, params, used_names): yield t def run_init(): if init: context[constants.CTX_ARGUMENT_OWNER] = self.real_this init.invoke(self.real_this, (), init_args, context.create_child_context()) self._initialized = True if (not object_store.initializing and not helpers.is_objects_dry_run_mode() and not self._initialized and not self._destroyed): yield run_init
def initialize(self, context, object_store, params): if self.__initialized: return for property_name in self.__type.properties: spec = self.__type.get_property(property_name) if spec.usage == typespec.PropertyUsages.Config: if property_name in self.__config: property_value = self.__config[property_name] else: property_value = dsl.NO_VALUE self.set_property(property_name, property_value) init = self.type.methods.get('.init') used_names = set() names = set(self.__type.properties) if init: names.update(init.arguments_scheme.iterkeys()) last_errors = len(names) init_args = {} while True: errors = 0 for property_name in names: if init and property_name in init.arguments_scheme: spec = init.arguments_scheme[property_name] is_init_arg = True else: spec = self.__type.get_property(property_name) is_init_arg = False if property_name in used_names: continue if spec.usage == typespec.PropertyUsages.Config: used_names.add(property_name) continue if spec.usage == typespec.PropertyUsages.Runtime: if not spec.has_default: used_names.add(property_name) continue property_value = dsl.NO_VALUE else: property_value = params.get(property_name, dsl.NO_VALUE) try: if is_init_arg: init_args[property_name] = property_value else: self.set_property(property_name, property_value) used_names.add(property_name) except exceptions.UninitializedPropertyAccessError: errors += 1 except exceptions.ContractViolationException: if spec.usage != typespec.PropertyUsages.Runtime: raise if not errors: break if errors >= last_errors: raise exceptions.CircularExpressionDependenciesError() last_errors = errors executor = helpers.get_executor(context) if not object_store.initializing and self.__extension is None: method = self.type.methods.get('__init__') if method: filtered_params = yaql_integration.filter_parameters( method.body, **params) self.__extension = method.invoke(executor, self, filtered_params[0], filtered_params[1], context) for parent in self.__parents.values(): parent.initialize(context, object_store, params) if not object_store.initializing and init: context[constants.CTX_ARGUMENT_OWNER] = self.real_this init.invoke(executor, self.real_this, (), init_args, context) self.__initialized = True