diff --git a/.github/workflows/pylint.yml b/.github/workflows/lint-and-format.yml similarity index 93% rename from .github/workflows/pylint.yml rename to .github/workflows/lint-and-format.yml index 941f7dd..7f9d0d0 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/lint-and-format.yml @@ -1,5 +1,4 @@ -name: Pylint - +name: Linting and format on: push: pull_request: @@ -51,3 +50,6 @@ jobs: - name: Run Pylint run: poetry run pylint byteguide/ + + - name: Run Black + run: poetry run black --check byteguide/ diff --git a/byteguide/libs/fs.py b/byteguide/libs/fs.py index f68cb58..9cc8eb3 100644 --- a/byteguide/libs/fs.py +++ b/byteguide/libs/fs.py @@ -88,7 +88,7 @@ def _delete_all_versions(self, project: str) -> t.Tuple[bool, str]: if version_dir.is_dir(): try: shutil.rmtree(version_dir) - except Exception as e: # pylint: disable=broad-except + except Exception as e: # pylint: disable=broad-except log.error(e) return False, f"Unknown error when deleting version {version_dir}: {str(e)}" @@ -166,7 +166,9 @@ def upload(self, filename: FileStorage, uniq_key: str, reupload: bool = False) - return status - def delete(self, project: str, unique_key: str, version: t.Optional[str] = None) -> t.Tuple[bool, str]: # pylint: disable=too-many-return-statements + def delete( # pylint: disable=too-many-return-statements + self, project: str, unique_key: str, version: t.Optional[str] = None + ) -> t.Tuple[bool, str]: """ Delete a version from the project. @@ -197,7 +199,7 @@ def delete(self, project: str, unique_key: str, version: t.Optional[str] = None) try: shutil.rmtree(self.docs_dir / project) - except Exception as e: # pylint: disable=broad-except + except Exception as e: # pylint: disable=broad-except log.error(e) return False, f"Unknown error when deleting project {project}: {str(e)}" return True, f"Project {project} deleted successfully!" diff --git a/byteguide/libs/util.py b/byteguide/libs/util.py index 897a27f..00e725f 100644 --- a/byteguide/libs/util.py +++ b/byteguide/libs/util.py @@ -90,16 +90,14 @@ def validate_register_project(data: t.Dict) -> t.List[str]: if not data.get("name"): errors.append("Project 'name' is required!") - - if not data.get("description"): - errors.append("Project 'description' is required!") - - # Check that name does not contain any special characters or whitespace - if not Validators.is_valid_name(data.get("name")): + elif not Validators.is_valid_name(data.get("name")): errors.append( "Project 'name' must be alphanumeric separated by dash or underscore and cannot contain whitespaces!" ) + if not data.get("description"): + errors.append("Project 'description' is required!") + if "tags" in data and not isinstance(data["tags"], list): # optional errors.append("Project 'tags' must be a list!") diff --git a/byteguide/routes/display.py b/byteguide/routes/display.py index 8a1179f..17b8631 100644 --- a/byteguide/routes/display.py +++ b/byteguide/routes/display.py @@ -123,3 +123,23 @@ def changelog(project): text = f"< '{project_changelog}' missing! >" return render_template("changelog.html", content=text) + + +@display_routes.route("/metadata/", methods=["GET"]) +def metadata(project): + """ + View the metadata of a project. + + Args: + project (str): name of the project whose metadata is to be fetched. + + Example: + GET /browse/metadata/ + """ + log.debug(f"Requested metadata for project {project}") + handler = MetaDataHandler(project) + + if handler.metadata: + return jsonify(handler.metadata), 200 + + return jsonify({"status": "failed", "message": f"Project {project} not found"}), 404 diff --git a/byteguide/routes/manage.py b/byteguide/routes/manage.py index 9a1ff50..235cc1a 100644 --- a/byteguide/routes/manage.py +++ b/byteguide/routes/manage.py @@ -47,7 +47,8 @@ def register(): errors = util.validate_register_project(register_project) if errors: - return jsonify({"message": "failed to register project", "errors": errors}), 400 + error_message = ", ".join(errors) + return jsonify({"message": f"Failed to register project: {error_message}", "status": "failed"}), 400 docfiles_dir = Path(config.docfiles_dir)