commit 2e18ae47ee80ef0037e5c0fdbccb252d44e988d7 Author: Brandon Cornejo Date: Mon Dec 2 20:44:52 2019 -0600 Initial commit diff --git a/flask-create.sh b/flask-create.sh new file mode 100755 index 0000000..1181ae1 --- /dev/null +++ b/flask-create.sh @@ -0,0 +1,273 @@ +# Create the blueprint for a new flask project +if [[ -z $1 ]]; then + echo "[FlaskCreate] Syntax Error: flask-create.sh " + 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..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..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. 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 " + + + {% block title %}{% endblock %} - $PROJECT_NAME + + + + + {% block head %} {% endblock %} + + + +
+ {% block content %}{% endblock %} +
+ + +" > $TEMPLATE_DIR/base.html; + +echo "{% extends "base.html" %} +{% block title %}$PROJECT_NAME Home{% endblock %} +{% block content %} +
+
+{% endblock %} + +{% block head %} + +{% 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; +