mirror of
https://github.com/MunGell/awesome-for-beginners.git
synced 2026-01-24 12:28:08 -08:00
108 lines
3.3 KiB
Python
Executable File
108 lines
3.3 KiB
Python
Executable File
from jinja2 import Environment, FileSystemLoader
|
|
import json
|
|
import os
|
|
import logging
|
|
|
|
# Configuring logging
|
|
logging.basicConfig(level=logging.INFO)
|
|
|
|
DATAFILE = "./data.json"
|
|
TEMPLATEPATH = "./.github/"
|
|
TEMPLATEFILE = "README-template.j2"
|
|
TARGETFILE = "./README.md"
|
|
|
|
def new_technology_dict(repo_technology):
|
|
return {"link_id": repo_technology.lower(), "entries": []}
|
|
|
|
# Function to log warnings for missing data
|
|
def log_warning(message):
|
|
logging.warning(message)
|
|
|
|
# Check if the data file exists
|
|
if not os.path.exists(DATAFILE):
|
|
log_warning(f"Data file {DATAFILE} does not exist.")
|
|
exit(1)
|
|
|
|
# Load data from the JSON file
|
|
try:
|
|
with open(DATAFILE, "r") as datafile:
|
|
data = json.loads(datafile.read())
|
|
except json.JSONDecodeError:
|
|
log_warning("Error: Failed to parse JSON data in the file.")
|
|
exit(1)
|
|
|
|
# Initialize technologies dictionary
|
|
technologies = {}
|
|
|
|
# Processing technologies
|
|
for technology in data.get("technologies", {}):
|
|
technologies[technology] = {
|
|
"link_id": data["technologies"].get(technology),
|
|
"entries": [],
|
|
}
|
|
|
|
# Processing repositories
|
|
for repository in data.get("repositories", []):
|
|
repo_technologies = repository.get("technologies", [])
|
|
if not repo_technologies:
|
|
log_warning(f"Repository {repository['name']} has no technologies listed.")
|
|
for repo_technology in repo_technologies:
|
|
if repo_technology not in technologies:
|
|
technologies[repo_technology] = new_technology_dict(repo_technology)
|
|
log_warning(f"Technology {repo_technology} is newly added.")
|
|
technologies[repo_technology]["entries"].append(repository)
|
|
|
|
# Create Jinja2 environment and load the template
|
|
env = Environment(loader=FileSystemLoader(TEMPLATEPATH))
|
|
if not os.path.exists(os.path.join(TEMPLATEPATH, TEMPLATEFILE)):
|
|
log_warning(f"Template file {TEMPLATEFILE} does not exist in the provided path.")
|
|
exit(1)
|
|
template = env.get_template(TEMPLATEFILE)
|
|
|
|
# Create categories from the technologies
|
|
categories = []
|
|
for key, value in technologies.items():
|
|
categories.append(
|
|
{"title": key, "link_id": value["link_id"], "entries": value["entries"]}
|
|
)
|
|
|
|
# Sorting categories and entries
|
|
categories = sorted(categories, key=lambda x: x["title"].upper())
|
|
|
|
category_groups = {"Misc": []}
|
|
for category in categories:
|
|
category["entries"] = sorted(category["entries"], key=lambda x: x["name"].upper())
|
|
first_char = category["title"][0].upper()
|
|
if first_char in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
|
|
if first_char not in category_groups:
|
|
category_groups[first_char] = []
|
|
category_groups[first_char].append(category)
|
|
else:
|
|
category_groups["Misc"].append(category)
|
|
|
|
# Process sponsors
|
|
sponsors = data.get("sponsors", [])
|
|
|
|
# Generate Table of Contents (TOC)
|
|
toc = []
|
|
for category in categories:
|
|
toc.append(f"- [{category['title']}]({category['link_id']})")
|
|
|
|
# Prepare context for rendering the template
|
|
context = {
|
|
"category_groups": category_groups,
|
|
"categories": categories,
|
|
"sponsors": sponsors,
|
|
"toc": toc # Adding TOC to context
|
|
}
|
|
|
|
# Rendering the README file
|
|
try:
|
|
output = template.render(context)
|
|
with open(TARGETFILE, "w") as targetfile:
|
|
targetfile.write(output)
|
|
logging.info("README file generated successfully.")
|
|
except Exception as e:
|
|
log_warning(f"Error while rendering template: {e}")
|
|
exit(1)
|