def test_can_request_project_image_url_for_id(self):
     for (project_id, expected_project_image_URL) in TEST_PROJECT_ID_TO_IMAGE_URL_MAP.iteritems():
         extracted_project_image_URL = scratchwebapi.request_project_image_url_for(project_id)
         assert extracted_project_image_URL is not None
         assert extracted_project_image_URL == expected_project_image_URL, \
                "'{}' is not equal to '{}'".format(extracted_project_image_URL, expected_project_image_URL)
Example #2
0
    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),
            )