File size: 3,615 Bytes
b3e3a0c
7ebae40
b3e3a0c
ac5eb89
7ebae40
2ba6c15
7ebae40
 
 
 
b3e3a0c
 
 
7ebae40
 
 
 
 
 
 
8065f07
 
 
 
b3e3a0c
7ebae40
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b3e3a0c
 
 
 
 
 
 
 
 
 
df51408
b3e3a0c
df51408
b3e3a0c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cbe25cd
b3e3a0c
ac5eb89
 
 
b3e3a0c
7ebae40
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2ba6c15
 
7ebae40
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import logging
import os
import tempfile
import time

import gradio as gr
from boilerplate_x.generator import ProjectGenerator

from blocks import customisation_block, github_repo_block

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("gradio")

INTRO_MD = """
<center>

# Boilerplate-X

Create project boilerplate for any programming language in minutes, with just an idea. Powered by Langchain and chatGPT API.


[![GitHub](https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge&logo=github&logoColor=white)](https://github.com/ajndkr/boilerplate-x)

</center>"""
BOOL2STR = {True: "yes", False: "no"}


def generate_boilerplate(
    api_key: str,
    prompt: str,
    unit_tests: bool,
    dockerization: bool,
    github_actions: bool,
    pre_commit_hooks: bool,
    gh_token: str,
    gh_repo_name: str,
    private: bool,
):
    """Generates project boilerplate."""
    if not api_key:
        gr.Error("Please enter your OpenAI API key!")
    os.environ["OPENAI_API_KEY"] = api_key

    with tempfile.TemporaryDirectory() as output_path:
        customisation_kwargs = {
            "unit_tests": BOOL2STR[unit_tests],
            "dockerization": BOOL2STR[dockerization],
            "github_actions": BOOL2STR[github_actions],
            "pre_commit_hooks": BOOL2STR[pre_commit_hooks],
        }

        if not gh_token:
            raise gr.Error("Please enter your GitHub token!")
        if not gh_repo_name:
            raise gr.Error("Please enter your GitHub repository name!")

        github_repo_creator_kwargs = {
            "token": gh_token,
            "repo_name": gh_repo_name,
            "private": private,
            "target_folder": output_path,
        }

        generator = ProjectGenerator(
            prompt=prompt,
            output_path=output_path,
            verbose=True,
            customisation_kwargs=customisation_kwargs,
            github_repo_creator_kwargs=github_repo_creator_kwargs,
        )

        try:
            logger.info("Generating project boilerplate...")
            generator.generate_template()
        except Exception as e:
            logger.error(e)
            raise gr.Error(e)

        # wait for GitHub repo to be created
        time.sleep(1)

        return f"Your project is now available on {generator.github_repo_url} 🚀 !"


def build_app():
    """Builds the Gradio UI."""
    block = gr.Blocks(title="Boilerplate X")

    with block:
        gr.Markdown(INTRO_MD)
        openai_api_key = gr.Textbox(
            placeholder="Paste your OpenAI API key",
            label="OpenAI API Key",
            lines=1,
            type="password",
        )
        prompt = gr.Textbox(
            placeholder="Enter your project idea",
            label="Prompt",
            lines=1,
        )
        (
            unit_tests,
            dockerization,
            github_actions,
            pre_commit_hooks,
        ) = customisation_block()
        gh_token, gh_repo_name, private = github_repo_block()
        generate = gr.Button("⚡ Generate Boilerplate ⚡")
        output = gr.Markdown()

        generate.click(
            fn=generate_boilerplate,
            inputs=[
                openai_api_key,
                prompt,
                unit_tests,
                dockerization,
                github_actions,
                pre_commit_hooks,
                gh_token,
                gh_repo_name,
                private,
            ],
            outputs=[output],
        )

    return block


if __name__ == "__main__":
    app = build_app()
    app.queue().launch()