Initial commit
This commit is contained in:
		
						commit
						2e18ae47ee
					
				
							
								
								
									
										273
									
								
								flask-create.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										273
									
								
								flask-create.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,273 @@ | |||||||
|  | # Create the blueprint for a new flask project | ||||||
|  | if [[ -z $1 ]]; then | ||||||
|  |     echo "[FlaskCreate] Syntax Error: flask-create.sh <project_name> <parent_directory:default cwd>" | ||||||
|  |     exit; | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | PROJECT_NAME=$1 | ||||||
|  | PROJECT_ROOT=$2 | ||||||
|  | 
 | ||||||
|  | if [[ -z $PROJECT_ROOT ]]; then | ||||||
|  |     PROJECT_ROOT=$(pwd) | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | echo "-=[FlaskCreate]=-"; | ||||||
|  | echo "Project Name: $PROJECT_NAME"; | ||||||
|  | echo "Project Root: $PROJECT_ROOT/$PROJECT_NAME"; | ||||||
|  | 
 | ||||||
|  | echo "Start a new Flask project? (y/n)"; | ||||||
|  | read START_CONFIRM; | ||||||
|  | 
 | ||||||
|  | if [[ $START_CONFIRM != y && $START_CONFIRM != Y ]]; then | ||||||
|  |     exit; | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | PROJECT_FOLDER=$PROJECT_ROOT/$PROJECT_NAME | ||||||
|  | 
 | ||||||
|  | echo ""; | ||||||
|  | echo ""; | ||||||
|  | echo "[FlaskCreate] Creating directory $PROJECT_FOLDER..."; | ||||||
|  | mkdir $PROJECT_FOLDER; | ||||||
|  | 
 | ||||||
|  | mkdir $PROJECT_FOLDER/data; | ||||||
|  | mkdir $PROJECT_FOLDER/$PROJECT_NAME; | ||||||
|  | 
 | ||||||
|  | touch $PROJECT_FOLDER/uwsgi.ini; | ||||||
|  | echo "[FlaskCreate] Generating uwsgi config..."; | ||||||
|  | echo "[uwsgi] | ||||||
|  | module = wsgi:application | ||||||
|  | 
 | ||||||
|  | master = true | ||||||
|  | processes = 4 | ||||||
|  | 
 | ||||||
|  | socket = $PROJECT_NAME.sock | ||||||
|  | chmod-scoket = 660 | ||||||
|  | vacuum = true | ||||||
|  | 
 | ||||||
|  | die-on-term = true | ||||||
|  | " > $PROJECT_FOLDER/uwsgi.ini; | ||||||
|  | 
 | ||||||
|  | touch $PROJECT_FOLDER/start.py; | ||||||
|  | echo "from $PROJECT_NAME import create_app | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | app = create_app() | ||||||
|  | 
 | ||||||
|  | if __name__ == \"__main__\": | ||||||
|  |     app.run() | ||||||
|  | " > $PROJECT_FOLDER/start.py; | ||||||
|  | 
 | ||||||
|  | echo "[FlaskCreate] Creating Flask app module files..."; | ||||||
|  | touch $PROJECT_FOLDER/$PROJECT_NAME/__init__.py; | ||||||
|  | echo "from flask import Flask | ||||||
|  | 
 | ||||||
|  | def create_app(): | ||||||
|  |     app = Flask(__name__) | ||||||
|  |     app.config.from_object('$PROJECT_NAME.default_settings') | ||||||
|  |     app.config.from_envvar('FLASK_SETTINGS_FILE') | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     # Prep the database | ||||||
|  |     from $PROJECT_NAME.models import db | ||||||
|  |     app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///../data/$PROJECT_NAME.db' | ||||||
|  |     app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False | ||||||
|  |     db.init_app(app) | ||||||
|  | 
 | ||||||
|  |     # Load our views | ||||||
|  |     from $PROJECT_NAME.views import default_views | ||||||
|  |     app.register_blueprint(default_views) | ||||||
|  | 
 | ||||||
|  |     # from $PROJECT_NAME.<app_name>.views import app_views | ||||||
|  |     # app.register_blueprint(app_views) | ||||||
|  | 
 | ||||||
|  |     # Load our CLI commands | ||||||
|  |     from $PROJECT_NAME.commands import default_cli | ||||||
|  |     app.cli.add_command(default_cli) | ||||||
|  | 
 | ||||||
|  |     # from $PROJECT_NAME.<app_name>.commands import app_cli | ||||||
|  |     # app.cli.add_command(app_cli) | ||||||
|  | 
 | ||||||
|  |     return app | ||||||
|  | " > $PROJECT_FOLDER/$PROJECT_NAME/__init__.py; | ||||||
|  | 
 | ||||||
|  | echo "[FlaskCreate] Generating SQLAlchemy base model..."; | ||||||
|  | touch $PROJECT_FOLDER/$PROJECT_NAME/models.py; | ||||||
|  | echo "from flask_sqlalchemy import SQLAlchemy | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | db = SQLAlchemy() | ||||||
|  | 
 | ||||||
|  | class BaseModel(db.Model): | ||||||
|  |     __abstract__ = True | ||||||
|  | 
 | ||||||
|  |     id = db.Column(db.Integer, primary_key=True) | ||||||
|  |     created_at = db.Column(db.DateTime) | ||||||
|  | " > $PROJECT_FOLDER/$PROJECT_NAME/models.py; | ||||||
|  | 
 | ||||||
|  | echo "[FlaskCreate] Generating basic CLI commands..."; | ||||||
|  | touch $PROJECT_FOLDER/$PROJECT_NAME/commands.py; | ||||||
|  | echo "import click | ||||||
|  | from flask.cli import AppGroup | ||||||
|  | 
 | ||||||
|  | from $PROJECT_NAME.models import db | ||||||
|  | 
 | ||||||
|  | default_cli = AppGroup('$PROJECT_NAME') | ||||||
|  | 
 | ||||||
|  | @default_cli.command('initdb') | ||||||
|  | def initialize_database(): | ||||||
|  |     from $PROJECT_NAME import models | ||||||
|  |     # from $PROJECT_NAME.<app_name> import models | ||||||
|  |     db.create_all() | ||||||
|  | " > $PROJECT_FOLDER/$PROJECT_NAME/commands.py; | ||||||
|  | 
 | ||||||
|  | echo "[FlaskCreate] Generating default views..."; | ||||||
|  | touch $PROJECT_FOLDER/$PROJECT_NAME/views.py; | ||||||
|  | echo "from flask import current_app, Blueprint, render_template | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | default_views = Blueprint('default_views', __name__, url_prefix='/') | ||||||
|  | 
 | ||||||
|  | @default_views.route('/') | ||||||
|  | def index(): | ||||||
|  |     return render_template('index.html') | ||||||
|  | " > $PROJECT_FOLDER/$PROJECT_NAME/views.py; | ||||||
|  | 
 | ||||||
|  | echo "[FlaskCreate] Initializing default templates..."; | ||||||
|  | TEMPLATE_DIR=$PROJECT_FOLDER/$PROJECT_NAME/templates | ||||||
|  | mkdir $TEMPLATE_DIR; | ||||||
|  | touch $TEMPLATE_DIR/base.html; | ||||||
|  | touch $TEMPLATE_DIR/index.html; | ||||||
|  | 
 | ||||||
|  | echo " <!doctype html> | ||||||
|  | <html> | ||||||
|  |     <head> | ||||||
|  |         <title>{% block title %}{% endblock %} - $PROJECT_NAME</title> | ||||||
|  |         <meta charset="utf-8"> | ||||||
|  |         <meta name="viewport" contents="width=device-width, initial-scale=1"> | ||||||
|  |         <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.2.0/css/uikit.min.css" integrity="sha256-5YtK9j+Nl/245lAkSjrIs600d6edKTevi+3JYdjuHhY=" crossorigin="anonymous" /> | ||||||
|  |         <script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.2.0/js/uikit.min.js" integrity="sha256-rhLALrRmAQVu/OxzVDpQaiHAEMxiRSN8h8RDydUEh2g=" crossorigin="anonymous"></script> | ||||||
|  |         {% block head %} {% endblock %} | ||||||
|  |     </head> | ||||||
|  |     <body> | ||||||
|  |         <nav class="uk-navbar-container" uk-navbar> | ||||||
|  |             <div class="uk-navbar-left"> | ||||||
|  |                 <a href="" class="uk-navbar-item uk-logo">$PROJECT_NAME</a> | ||||||
|  |             </div> | ||||||
|  |             <div class="uk-navbar-center"> | ||||||
|  |                 <ul class="uk-navbar-nav"> | ||||||
|  |                     <li class="uk-active"><a href="">Nav Item 1</a></li> | ||||||
|  |                     <li><a href="">Nav Item 2</a></li> | ||||||
|  |                     <li><a href="">Nav Item 3</a></li> | ||||||
|  |                     <li><a href="">Nav Item 4</a></li> | ||||||
|  |                 </ul> | ||||||
|  |             </div> | ||||||
|  |         </nav> | ||||||
|  |         <div class="uk-container"> | ||||||
|  |         {% block content %}{% endblock %} | ||||||
|  |         </div> | ||||||
|  |     </body> | ||||||
|  | </html> | ||||||
|  | " > $TEMPLATE_DIR/base.html; | ||||||
|  | 
 | ||||||
|  | echo "{% extends "base.html" %} | ||||||
|  | {% block title %}$PROJECT_NAME Home{% endblock %} | ||||||
|  | {% block content %} | ||||||
|  | <div> | ||||||
|  | </div> | ||||||
|  | {% endblock %} | ||||||
|  | 
 | ||||||
|  | {% block head %} | ||||||
|  | <style> | ||||||
|  | </style> | ||||||
|  | {% endblock %} | ||||||
|  | " > $TEMPLATE_DIR/index.html; | ||||||
|  | 
 | ||||||
|  | echo "[FlaskCreate] Creating default_settings config file..."; | ||||||
|  | touch $PROJECT_FOLDER/$PROJECT_NAME/default_settings.py; | ||||||
|  | echo "# Default Configuration | ||||||
|  | SECRET_KEY = "" | ||||||
|  | 
 | ||||||
|  | # Flask-SQLAlchemy | ||||||
|  | SQLALCHEMY_TRACK_MODIFICATIONS = False | ||||||
|  | " > $PROJECT_FOLDER/$PROJECT_NAME/default_settings.py; | ||||||
|  | 
 | ||||||
|  | echo "[FlaskCreate] Creating environment config files..."; | ||||||
|  | mkdir $PROJECT_FOLDER/config; | ||||||
|  | touch $PROJECT_FOLDER/config/prod.cfg; touch $PROJECT_FOLDER/config/dev.py | ||||||
|  | 
 | ||||||
|  | PROD_KEY=$(echo $(od -vN 20 -An -tx1 /dev/urandom | tr -d " \n")) | ||||||
|  | DEV_KEY=$(echo $(od -vN 20 -An -tx1 /dev/urandom | tr -d " \n")) | ||||||
|  | echo "# Default Configuration | ||||||
|  | DEBUG = True | ||||||
|  | SECRET_KEY = \"$DEV_KEY\" | ||||||
|  | 
 | ||||||
|  | # Flask-SQLAlchemy | ||||||
|  | SQLALCHEMY_DATABASE_URI = 'sqlite:///../data/acks.db' | ||||||
|  | SQLALCHEMY_TRACK_MODIFICATIONS = False | ||||||
|  | " > $PROJECT_FOLDER/config/dev.cfg | ||||||
|  | 
 | ||||||
|  | echo "# Default Configuration | ||||||
|  | DEBUG = False | ||||||
|  | SECRET_KEY = \"$PROD_KEY\" | ||||||
|  | 
 | ||||||
|  | # Flask-SQLAlchemy | ||||||
|  | SQLALCHEMY_DATABASE_URI = 'sqlite:///../data/acks.db' | ||||||
|  | SQLALCHEMY_TRACK_MODIFICATIONS = False | ||||||
|  | " > $PROJECT_FOLDER/config/prod.cfg | ||||||
|  | 
 | ||||||
|  | echo "[FlaskCreate] Generating a Makefile..."; | ||||||
|  | touch $PROJECT_FOLDER/Makefile; | ||||||
|  | echo -e ".PHONY: run debug clean | ||||||
|  | 
 | ||||||
|  | bin/activate: requirements.txt | ||||||
|  | \t test -f bin/activate || $(which python3) -m venv . | ||||||
|  | \t bin/pip install -Ur requirements.txt | ||||||
|  | \t touch bin/activate | ||||||
|  | 
 | ||||||
|  | run: bin/activate | ||||||
|  | \t . bin/activate; FLASK_SETTINGS_FILE=config/prod.cfg FLASK_ENV=production FLASK_APP=start.py flask run --host=0.0.0.0 | ||||||
|  | 
 | ||||||
|  | debug: bin/activate | ||||||
|  | \t . bin/activate; FLASK_SETTINGS_FILE=config/dev.cfg FLASK_ENV=development FLASK_APP=start.py flask run --host=0.0.0.0 | ||||||
|  | 
 | ||||||
|  | clean: | ||||||
|  | \t rm -rf bin/ include/ lib/ lib64/ __pycache__/ share/; rm pyvenv.cfg | ||||||
|  | " > $PROJECT_FOLDER/Makefile | ||||||
|  | 
 | ||||||
|  | echo "[FlaskCreate] Initializing a git repository and creating initial commit..."; | ||||||
|  | cd $PROJECT_FOLDER; | ||||||
|  | touch $PROJECT_FOLDER/.gitignore | ||||||
|  | echo "# Python | ||||||
|  | *.py[co] | ||||||
|  | 
 | ||||||
|  | # Vim | ||||||
|  | *.swp | ||||||
|  | 
 | ||||||
|  | # Virtualenv | ||||||
|  | bin | ||||||
|  | include | ||||||
|  | lib | ||||||
|  | lib64 | ||||||
|  | __pycache__ | ||||||
|  | share | ||||||
|  | pyvenv.cfg | ||||||
|  | 
 | ||||||
|  | # App specific | ||||||
|  | data | ||||||
|  | config | ||||||
|  | " > $PROJECT_FOLDER/.gitignore | ||||||
|  | git init $PROJECT_FOLDER &> /dev/null; | ||||||
|  | git add . &> /dev/null; | ||||||
|  | git commit -m "Initial commit (FlaskCreate)" &> /dev/null; | ||||||
|  | 
 | ||||||
|  | echo "[FlaskCreate] Creating Python3 virtual environment..."; | ||||||
|  | python3 -m venv $PROJECT_FOLDER | ||||||
|  | source $PROJECT_FOLDER/bin/activate | ||||||
|  | 
 | ||||||
|  | echo "[FlaskCreate] Installing dependencies..."; | ||||||
|  | pip install flask flask-sqlalchemy &> /dev/null | ||||||
|  | pip freeze > $PROJECT_FOLDER/requirements.txt; | ||||||
|  | 
 | ||||||
|  | echo "[FlaskCreate] Finished. Project lives at $PROJECT_FOLDER." | ||||||
|  | cd $PROJECT_FOLDER; | ||||||
|  | 
 | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user