def create_project(<EOL>self, project_config_data, case_type, dirpath):
<EOL>if case_type not in self.DERIVED_ATTRIBUTES_CASE_TYPES:<EOL><INDENT>raise ValueError(<EOL>"<STR_LIT>".<EOL>format(case_type, self.DERIVED_ATTRIBUTES_CASE_TYPES))<EOL><DEDENT>expected_derived_attributes = copy.copy(Project.DERIVED_ATTRIBUTES_DEFAULT)<EOL>if case_type == "<STR_LIT>":<EOL><INDENT>assert "<STR_LIT>" not in project_config_data<EOL><DEDENT>else:<EOL><INDENT>explicit_derived_attributes =copy.copy(self.ADDITIONAL_DERIVED_ATTRIBUTES)<EOL>expected_derived_attributes.extend(self.ADDITIONAL_DERIVED_ATTRIBUTES)<EOL>if case_type == "<STR_LIT>":<EOL><INDENT>explicit_derived_attributes.extend(<EOL>Project.DERIVED_ATTRIBUTES_DEFAULT)<EOL><DEDENT>project_config_data["<STR_LIT>"] = explicit_derived_attributes<EOL><DEDENT>conf_file_path = _write_project_config(<EOL>project_config_data, dirpath=dirpath)<EOL>with mock.patch("<STR_LIT>"):<EOL><INDENT>project = Project(conf_file_path)<EOL><DEDENT>return expected_derived_attributes, project<EOL>
For a test case, determine expectations and create Project instance.

:param dict project_config_data: the actual data to write to the 
    Project configuration file
:param str default_env_path: path to the default environment config 
    file to pass to Project constructor
:param str case_type: type of test case to execute; this determines 
    how to specify the derived attribute in the config file
:param str dirpath: path in which to write config file
:return (Iterable[str], Project): collection of names of derived 
    attribute to expect, along with Project instance with which to test