def test_can_request_project_instructions_for_id(self): for (project_id, expected_project_instructions ) in TEST_PROJECT_ID_TO_INSTRUCTIONS_MAP.iteritems(): extracted_project_instructions = scratchwebapi.request_project_instructions_for( project_id) assert extracted_project_instructions == expected_project_instructions, \ "'{}' is not equal to '{}'".format(extracted_project_instructions, expected_project_instructions)
def __init__(self, project_base_path, name=None, project_id=None, progress_bar=None): def read_md5_to_resource_path_mapping(): md5_to_resource_path_map = {} # TODO: clarify that only files with extension are covered for res_file_path in glob.glob( os.path.join(project_base_path, "*.*")): resource_name = common.md5_hash( res_file_path) + os.path.splitext(res_file_path)[1] md5_to_resource_path_map[resource_name] = res_file_path try: # penLayer is no regular resource file del md5_to_resource_path_map[self['penLayerMD5']] except KeyError: # TODO: include penLayer download in webapi pass assert self['penLayerMD5'] not in md5_to_resource_path_map return md5_to_resource_path_map super(Project, self).__init__( self.raw_project_code_from_project_folder_path(project_base_path)) self.project_base_path = project_base_path self.project_id = self.get_info().get( "projectID") if project_id is None else project_id if not self.project_id: self.project_id = "0" self.name = name if name is not None else "Untitled" self.instructions = self.notes_and_credits = None self.automatic_screenshot_image_url = None else: self.name = name if name is not None else scratchwebapi.request_project_title_for( self.project_id) self.instructions = scratchwebapi.request_project_instructions_for( self.project_id) self.notes_and_credits = scratchwebapi.request_project_notes_and_credits_for( self.project_id) self.automatic_screenshot_image_url = "{}{}.png".format( scratchwebapi.SCRATCH_PROJECT_IMAGE_BASE_URL, self.project_id) if progress_bar != None: progress_bar.update(ProgressType.DETAILS) # details step passed _log.info( "Scratch project: %s%s", self.name, "(ID: {})".format(self.project_id) if self.project_id > 0 else "") self.name = self.name.strip( ) if self.name != None else "Unknown Project" self.md5_to_resource_path_map = read_md5_to_resource_path_mapping() self.global_user_lists = self.objects[0].get_lists() for scratch_object in self.objects: verify_resources_of_scratch_object(scratch_object, self.md5_to_resource_path_map, self.project_base_path) listened_keys = [] for scratch_obj in self.objects: for script in scratch_obj.scripts: if script.type == SCRIPT_KEY_PRESSED: assert len(script.arguments) == 1 listened_keys += [(argument, "listenedKeys") for argument in script.arguments] try: self.listened_keys.union(listened_keys) except AttributeError: self.listened_keys = set(listened_keys) # TODO: rename self.background_md5_names = set( [costume[JsonKeys.COSTUME_MD5] for costume in self.get_costumes()]) result = self.find_unused_resources_name_and_filepath() self.unused_resource_names = result[0] if len(result) > 0 else [] self.unused_resource_paths = result[1] if len(result) > 0 else [] for unused_path in self.unused_resource_paths: _log.warning("Project folder contains unused resource file: '%s'. These " \ "will be omitted for Catrobat project.", os.path.basename(unused_path))
def test_can_request_project_instructions_for_id(self): for (project_id, expected_project_instructions) in TEST_PROJECT_ID_TO_INSTRUCTIONS_MAP.iteritems(): extracted_project_instructions = scratchwebapi.request_project_instructions_for(project_id) assert extracted_project_instructions == expected_project_instructions, \ "'{}' is not equal to '{}'".format(extracted_project_instructions, expected_project_instructions)
def __init__(self, project_base_path, name=None, id_=None, progress_bar=None): def read_md5_to_resource_path_mapping(): md5_to_resource_path_map = {} # TODO: clarify that only files with extension are covered for res_file_path in glob.glob(os.path.join(project_base_path, "*.*")): resource_name = common.md5_hash(res_file_path) + os.path.splitext(res_file_path)[1] md5_to_resource_path_map[resource_name] = res_file_path try: # penLayer is no regular resource file del md5_to_resource_path_map[self["penLayerMD5"]] except KeyError: # TODO: include penLayer download in webapi pass assert self["penLayerMD5"] not in md5_to_resource_path_map return md5_to_resource_path_map super(Project, self).__init__(self.raw_project_code_from_project_folder_path(project_base_path)) self.project_base_path = project_base_path if id_ != None: self.project_id = id_ else: self.project_id = self.get_info().get("projectID") if not self.project_id: self.project_id = "0" self.name = name if name is not None else "Untitled" self.instructions = self.notes_and_credits = None self.automatic_screenshot_image_url = None else: self.name = name if name is not None else scratchwebapi.request_project_title_for(self.project_id) self.instructions = scratchwebapi.request_project_instructions_for(self.project_id) self.notes_and_credits = scratchwebapi.request_project_notes_and_credits_for(self.project_id) self.automatic_screenshot_image_url = scratchwebapi.request_project_image_url_for(self.project_id) if progress_bar != None: progress_bar.update(ProgressType.DETAILS) # details step passed _log.info("Scratch project: %s%s", self.name, "(ID: {})".format(self.project_id) if self.project_id > 0 else "") self.name = self.name.strip() if self.name != None else "Unknown Project" self.md5_to_resource_path_map = read_md5_to_resource_path_mapping() self.global_user_lists = self.objects[0].get_lists() for scratch_object in self.objects: verify_resources_of_scratch_object(scratch_object, self.md5_to_resource_path_map, self.project_base_path) listened_keys = [] for scratch_obj in self.objects: for script in scratch_obj.scripts: if script.type == SCRIPT_KEY_PRESSED: assert len(script.arguments) == 1 listened_keys += script.arguments self.listened_keys = set(listened_keys) # TODO: rename self.background_md5_names = set([costume[JsonKeys.COSTUME_MD5] for costume in self.get_costumes()]) result = self.find_unused_resources_name_and_filepath() self.unused_resource_names = result[0] if len(result) > 0 else [] self.unused_resource_paths = result[1] if len(result) > 0 else [] for unused_path in self.unused_resource_paths: _log.warning( "Project folder contains unused resource file: '%s'. These " "will be omitted for Catrobat project.", os.path.basename(unused_path), )