Snippets

ahmed sayed sass architecture structure generator

Created by Ahmed El Sayed last modified
# for more information from mrAdam Marsden please visit:
# https://gist.github.com/AdamMarsden/7b85e8d5bdb5bef969a0
from pathlib import Path


class StructureBuilder:
    def __init__(self, project_name, structure, main_file_name):
        self.project_path = Path(__file__).parent.absolute()
        self.project_name = project_name
        self.structure = structure
        self.main_file_name = main_file_name
        self.main_directories_generator = (
            Path(self.project_path / self.project_name / m_dir) for m_dir in self.structure.keys()
        )
        self.files_generator = (
            Path(self.project_path / self.project_name / mdir / sass_file)
            for mdir in self.structure for sass_file in self.structure[mdir]
        )

    def initialize_project(self):
        # create main directory
        Path(self.project_path / self.project_name).mkdir(parents=True, exist_ok=True)
        # create main sass file
        Path(
            self.project_path / self.project_name / self.main_file_name
        ).touch(exist_ok=True)

    def write_files(self):
        for direc in self.main_directories_generator:
            Path(direc).mkdir(parents=True, exist_ok=True)

        for f in self.files_generator:
            f.touch(exist_ok=True)

    def remove_prefix(self, text, prefix):
        return text[text.startswith(prefix) and len(prefix):]

    def write_main_file_contents(self):
        # generate imports from files if it's begin with _
        main_file = Path(
            self.project_path / self.project_name / self.main_file_name
        )
        with main_file.open("w") as f:
            for mdir in self.structure:
                f.write("\n")
                # write import comment
                f.write(f"// import '{mdir}' styles\n")
                for sass_file in self.structure[mdir]:
                    if sass_file.startswith("_"):
                        # remove _ from file name
                        clean_name = self.remove_prefix(sass_file, "_")
                        # remove .scss extension
                        clean_name = Path(clean_name).stem
                        f.write(f"@use '{mdir}/{clean_name}';\n")


if __name__ == '__main__':
    folders_structure = {
        "base": ["_reset.scss", "_typography.scss"],
        "components": [
            "_buttons.scss",
            "_carousel.scss",
            "_cover.scss",
            "_dropdown.scss",
        ],
        "layout": [
            "_navigation.scss",
            "_grid.scss",
            "_header.scss",
            "_footer.scss",
            "_sidebar.scss",
            "_forms.scss",
        ],
        "pages": [
            "_home.scss",
            "_contact.scss",
        ],
        "sassutils": [
            "_variables.scss",
            "_functions.scss",
            "_mixins.scss",
            "_helpers.scss",
        ],
        "vendors": [
            "_bootstrap.scss",
            "_jqueryui.scss",
        ]
    }

    builder = StructureBuilder(
        project_name="sass", structure=folders_structure, main_file_name="main.scss"
    )
    builder.initialize_project()
    builder.write_files()
    builder.write_main_file_contents()

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.