Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TypeError in Router.py during build process #44

Open
Leoeis opened this issue Jun 8, 2024 · 0 comments
Open

TypeError in Router.py during build process #44

Leoeis opened this issue Jun 8, 2024 · 0 comments
Labels
bug Something isn't working

Comments

@Leoeis
Copy link

Leoeis commented Jun 8, 2024

Description

I encountered a TypeError when attempting to build my site using Maverick. The error message indicates that a NoneType object is being found where a str instance is expected.

Error Log

Traceback (most recent call last):
  File "./build.py", line 43, in <module>
    main(sys.argv[1:])
  File "./build.py", line 39, in main
    builder.build_all()
  File "/home/runner/work/Blog-With-GitHub-Boilerplate/Blog-With-GitHub-Boilerplate/Maverick/Maverick/Builder.py", line 173, in build_all
    self._template.render(self._config, self._posts, self._pages)
  File "/home/runner/work/Blog-With-GitHub-Boilerplate/Blog-With-GitHub-Boilerplate/Galileo/__init__.py", line 22, in render
    Galileo(conf, posts, pages)()
  File "/home/runner/work/Blog-With-GitHub-Boilerplate/Blog-With-GitHub-Boilerplate/Maverick/Maverick/Template.py", line 155, in __call__
    self.render()
  File "/home/runner/work/Blog-With-GitHub-Boilerplate/Blog-With-GitHub-Boilerplate/Galileo/__init__.py", line 39, in render
    self.build_search_cache()
  File "/home/runner/work/Blog-With-GitHub-Boilerplate/Blog-With-GitHub-Boilerplate/Maverick/Maverick/Utils.py", line 42, in wrapper
    func(*args, **kwargs)
  File "/home/runner/work/Blog-With-GitHub-Boilerplate/Blog-With-GitHub-Boilerplate/Galileo/__init__.py", line 266, in build_search_cache
    cache_str = render_search_cache(self._posts, self._pages)
  File "/home/runner/work/Blog-With-GitHub-Boilerplate/Blog-With-GitHub-Boilerplate/Galileo/__init__.py", line 256, in render_search_cache
    posts = [gen_entry(post) for post in post_list if not post.skip]
  File "/home/runner/work/Blog-With-GitHub-Boilerplate/Blog-With-GitHub-Boilerplate/Galileo/__init__.py", line 256, in <listcomp>
    posts = [gen_entry(post) for post in post_list if not post.skip]
  File "/home/runner/work/Blog-With-GitHub-Boilerplate/Blog-With-GitHub-Boilerplate/Galileo/__init__.py", line 252, in gen_entry
    "permalink": router.gen_permalink('tag', tag, 1)
  File "/home/runner/work/Blog-With-GitHub-Boilerplate/Blog-With-GitHub-Boilerplate/Maverick/Maverick/Router.py", line 35, in gen_permalink
    link, _ = self.gen(type, slug, page)
  File "/home/runner/work/Blog-With-GitHub-Boilerplate/Blog-With-GitHub-Boilerplate/Maverick/Maverick/Router.py", line 60, in gen
    path = "/".join(routes)
TypeError: sequence item 1: expected str instance, NoneType found

Analysis

It appears that the error occurs in the gen() method in Router.py when the routes list contains a None value. This can happen if type or slug are not correctly defined.

Proposed Solution

I suggest adding a validation check in the gen() method to ensure that no None values are present in the routes list before attempting to join them into a path.

Here is a potential fix for Router.py:

# -*- coding: utf-8 -*-

class Router:
    def __init__(self, conf):
        self.config = conf

    def gen_static_file_prefix(self):
        if self.config.enable_jsdelivr['enabled']:
            return "https://cdn.jsdelivr.net/gh/%s/" % \
                self.config.enable_jsdelivr["repo"]
        else:
            return self.config.site_prefix

    def gen_permalink_by_meta(self, meta):
        link, _ = self.gen_by_meta(meta)
        return link

    def gen_permalink_by_content(self, content):
        link, _ = self.gen_by_content(content)
        return link

    def gen_permalink(self, type, slug, page=0):
        link, _ = self.gen(type, slug, page)
        return link

    def gen_by_meta(self, meta):
        return self.gen(meta["layout"], meta["slug"])

    def gen_by_content(self, content):
        return self.gen(content.get_meta('layout'), content.get_meta('slug'))

    def gen(self, type, slug, page=1):
        routes = list()
        if type == "post":
            routes = ["archives", slug]
        elif type == "page":
            routes = [slug]
        elif type == "tag" or type == "category":
            routes = [type, slug]
        elif type == "archives":
            routes = ["archives"]
        elif type == "index" and page > 1:
            routes = ["page"]

        if page > 1:
            routes.append(str(page))

        if any(r is None for r in routes):
            raise ValueError(f"One of the routes is None: {routes}")

        path = "/".join(routes)
        if len(routes):
            path += "/"

        local_path = self.config.build_dir + path
        permalink = self.config.site_prefix + path

        return permalink, local_path

This code adds a check to raise a ValueError if any None values are found in the routes list.

Steps to Reproduce

  1. Clone the repository.
  2. Set up the environment as described in the documentation.
  3. Attempt to build the site using the provided configuration and sample content.

Environment

  • Operating System: [Your OS]
  • Python Version: 3.7.17
  • Maverick Version: [Commit Hash or Version Number]

Thank you for your assistance in resolving this issue.

@Leoeis Leoeis added the bug Something isn't working label Jun 8, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant