
commit
947594e76c
14 changed files with 490 additions and 0 deletions
@ -0,0 +1,3 @@ |
|||
.tox/ |
|||
*.pyc |
|||
/virtualenv |
@ -0,0 +1,4 @@ |
|||
# file GENERATED by distutils, do NOT edit |
|||
README |
|||
setup.py |
|||
minecraftcodex/__init__.py |
@ -0,0 +1,4 @@ |
|||
Minecraft Codex |
|||
=============== |
|||
|
|||
A database helper for Minecraft players. |
@ -0,0 +1 @@ |
|||
-r ../requirements.pip |
@ -0,0 +1,288 @@ |
|||
# Libs |
|||
import sys |
|||
import os |
|||
from subprocess import call, Popen, PIPE |
|||
from shutil import copytree |
|||
|
|||
# Config |
|||
APPS_PATH = './app' |
|||
CONFIGS_PATH = './config' |
|||
APP_DIRECTORY = '%s/minecraftcodex' % APPS_PATH |
|||
|
|||
GIT_REPOSITORY = 'git@bitbucket.org:fmartingr/minecraftcodex.git' |
|||
GIT_BRANCH = 'master' |
|||
GIT_DOWNLOAD_DIR = './src' |
|||
GIT_APP_PATH = 'minecraftcodex' |
|||
GIT_PATH_THIS = '%s/config/production/deploy.py' % GIT_DOWNLOAD_DIR |
|||
|
|||
VIRTUALENV_PATH = './virtualenv' |
|||
|
|||
CHECK_SCRIPT_UPDATE = False |
|||
THIS_NAME = 'deploy.py' |
|||
|
|||
PYTHON = { |
|||
'py': 'python-2.7', |
|||
'pip': 'pip-2.7', |
|||
'virtualenv': 'virtualenv-2.7' |
|||
} |
|||
|
|||
PIP_REQUIREMENTS_FILES = [ |
|||
#'%s/config/requirements.pip' % GIT_DOWNLOAD_DIR, |
|||
'%s/config/production/requirements.pip' % GIT_DOWNLOAD_DIR |
|||
] |
|||
|
|||
CONFIG_FILES = [ |
|||
( |
|||
'%s/config/development/local_settings.py' % GIT_DOWNLOAD_DIR, |
|||
'%s/local_settings.py' % CONFIGS_PATH |
|||
), |
|||
] |
|||
|
|||
FIXTURES = [ |
|||
#'%s/config/development/initial_data.json' % GIT_DOWNLOAD_DIR |
|||
] |
|||
|
|||
REQUIREMENTS = [ |
|||
'git', |
|||
] |
|||
|
|||
ENVIRONMENT_VARIABLES = [ |
|||
'DATABASE_URL' |
|||
] |
|||
|
|||
CONTINUE = True |
|||
|
|||
|
|||
# Functions |
|||
class Colors: |
|||
END = '\033[0m' |
|||
|
|||
def __init__(self, c='ter,'): |
|||
if c == 'custom': |
|||
self.custom() |
|||
else: |
|||
self.term() |
|||
|
|||
def custom(self): |
|||
self.WHITE = '\033[89m' |
|||
self.BLACK = '\033[90m' |
|||
self.RED = '\033[91m' |
|||
self.GREEN = '\033[92m' |
|||
self.YELLOW = '\033[93m' |
|||
self.BLUE = '\033[94m' |
|||
self.PURPLE = '\033[95m' |
|||
self.CYAN = '\033[96m' |
|||
|
|||
def term(self): |
|||
self.WHITE = '\033[29m' |
|||
self.BLACK = '\033[30m' |
|||
self.RED = '\033[31m' |
|||
self.GREEN = '\033[32m' |
|||
self.YELLOW = '\033[33m' |
|||
self.BLUE = '\033[34m' |
|||
self.PURPLE = '\033[35m' |
|||
self.CYAN = '\033[36m' |
|||
|
|||
colors = Colors('custom') |
|||
|
|||
|
|||
def echo(string, end='\r\n', color=None): |
|||
if color: |
|||
sys.stdout.write("%s%s%s" % ( |
|||
color, |
|||
string, |
|||
colors.END |
|||
)) |
|||
else: |
|||
sys.stdout.write(string) |
|||
if end: |
|||
sys.stdout.write("\n") |
|||
sys.stdout.flush() |
|||
|
|||
|
|||
# Shortcurts |
|||
def check_status(status=None, words=['done', 'failed']): |
|||
if status is not None: |
|||
if status == 0: |
|||
echo(words[0], color=colors.GREEN) |
|||
else: |
|||
echo(words[1], color=colors.RED) |
|||
pass |
|||
#exit(-1) |
|||
|
|||
|
|||
def exists(path): |
|||
return os.path.exists(path) |
|||
|
|||
|
|||
def title(string): |
|||
print("") |
|||
echo("[==] %s" % string, color=colors.PURPLE) |
|||
|
|||
|
|||
def info(string): |
|||
echo("[ i] %s" % string, color=colors.BLUE) |
|||
|
|||
|
|||
def error(string): |
|||
echo("[ E] %s" % string, color=colors.RED) |
|||
|
|||
|
|||
def success(string): |
|||
echo("[OK] %s" % string, color=colors.GREEN) |
|||
|
|||
|
|||
def sub(string, end=''): |
|||
echo(" %s " % string, end=end) |
|||
|
|||
|
|||
# Checking if there's an active virtualenv |
|||
if 'VIRTUAL_ENV' in os.environ: |
|||
error('Active virtualenv detected. Deactivate it first.') |
|||
exit(-2) |
|||
|
|||
os.system('clear') |
|||
info("Running from %s" % os.getcwd()) |
|||
|
|||
|
|||
# =============== CHECK REQUIREMENTS =============== |
|||
title('Checking requirements') |
|||
for req in REQUIREMENTS: |
|||
sub('%s:' % req) |
|||
status = call(["which", req], stdout=open(os.devnull, 'wb')) |
|||
check_status(status, words=['present', 'not present']) |
|||
if status != 0: |
|||
CONTINUE = False |
|||
|
|||
# ========== CHECK ENVIRONMENT VARIABLES ========== |
|||
title('Checking environment variables') |
|||
for env in ENVIRONMENT_VARIABLES: |
|||
sub('%s:' % env) |
|||
if env in os.environ: |
|||
status = 0 |
|||
else: |
|||
CONTINUE = False |
|||
status = -1 |
|||
check_status(status, words=['present', 'not present']) |
|||
|
|||
# Prequisites check |
|||
if not CONTINUE: |
|||
print("") |
|||
error('Prequisites not met. Abort.') |
|||
#error('You should CTRL+C now, errors may occur!') |
|||
exit(1) |
|||
|
|||
# ================== GIT DOWNLOAD ================== |
|||
title('Getting last source code') |
|||
if not exists(GIT_DOWNLOAD_DIR): |
|||
os.mkdir(GIT_DOWNLOAD_DIR) |
|||
sub('git clone:') |
|||
status = call(['git', 'clone', '-b', GIT_BRANCH, GIT_REPOSITORY, GIT_DOWNLOAD_DIR], |
|||
stdout=open(os.devnull, 'wb'), |
|||
stderr=open(os.devnull, 'wb')) |
|||
else: |
|||
sub('git pull:') |
|||
status = call(['git', 'pull'], cwd=GIT_DOWNLOAD_DIR, |
|||
stdout=open(os.devnull, 'wb'), |
|||
stderr=open(os.devnull, 'wb')) |
|||
|
|||
check_status(status) |
|||
|
|||
# =========== CHECK SCRIPT UPDATE ================== |
|||
if CHECK_SCRIPT_UPDATE: |
|||
title('Checking if deploy script is updated on repository') |
|||
actual_size = os.stat('./%s.py' % THIS_NAME).st_size |
|||
repository_size = os.stat(GIT_PATH_THIS).st_size |
|||
if repository_size != actual_size: |
|||
sub('Script is updated.', end='\r\n') |
|||
|
|||
sub('Deleting old script:') |
|||
status = call(['rm', './%s.py' % THIS_NAME], stdout=open(os.devnull, 'wb')) |
|||
check_status(status) |
|||
|
|||
sub('Installing new version:') |
|||
status = call(['cp', GIT_PATH_THIS, './%s.py' % THIS_NAME], |
|||
stdout=open(os.devnull, 'wb')) |
|||
check_status(status) |
|||
info('Restarting execution!') |
|||
os.system('%s ./%s.py' % (PYTHON['py'], THIS_NAME)) |
|||
exit(0) |
|||
else: |
|||
sub('Script is up-to-date.', end='\r\n') |
|||
|
|||
# =========== VIRTUALENV ========================= |
|||
title('Checking and updating virtualenv') |
|||
if not exists(VIRTUALENV_PATH): |
|||
sub('Creating virtualenv:') |
|||
status = call([PYTHON['virtualenv'], '-q', '--distribute', VIRTUALENV_PATH], |
|||
stdout=open(os.devnull, 'wb')) |
|||
check_status(status) |
|||
else: |
|||
sub('Virtualenv exists.', end='\r\n') |
|||
|
|||
title('Updating requirements') |
|||
for requirements in PIP_REQUIREMENTS_FILES: |
|||
sub('From %s:' % requirements) |
|||
if exists(requirements): |
|||
if os.stat(requirements).st_size > 0: |
|||
status = call( |
|||
'source %s/bin/activate && pip install -r %s' % ( |
|||
VIRTUALENV_PATH, |
|||
requirements, |
|||
), |
|||
stdout=open(os.devnull, 'wb'), |
|||
shell=True, executable='/bin/bash' |
|||
) |
|||
check_status(status) |
|||
else: |
|||
echo('empty', color=colors.YELLOW) |
|||
else: |
|||
echo('not exist', color=colors.RED) |
|||
|
|||
# ================== APP INSTALL ================== |
|||
title('Installing the app') |
|||
sub('Removing old data (if any):') |
|||
if exists(APP_DIRECTORY): |
|||
status = call(['rm', '-rf', APP_DIRECTORY], |
|||
stdout=open(os.devnull, 'wb')) |
|||
check_status(status) |
|||
|
|||
if not exists(APPS_PATH): |
|||
call(['mkdir', 'app']) |
|||
|
|||
sub('Copy source to application dir:') |
|||
git_path = "%s/%s" % (GIT_DOWNLOAD_DIR, GIT_APP_PATH) |
|||
app_path = "%s" % (APP_DIRECTORY) |
|||
try: |
|||
copytree(git_path, app_path) |
|||
echo('done', color=colors.GREEN) |
|||
except Exception as error: |
|||
echo(error, color=colors.RED) |
|||
#status = call(['cp', '-r', git_path, app_path], |
|||
# stdout=open(os.devnull, 'wb')) |
|||
#check_status(status) |
|||
|
|||
title('Installing config files') |
|||
if not exists(CONFIGS_PATH): |
|||
call(['mkdir', CONFIGS_PATH]) |
|||
call(['touch', "%s/__init__.py" % CONFIGS_PATH]) |
|||
|
|||
for from_file, to_file in CONFIG_FILES: |
|||
sub('%s:' % os.path.basename(from_file)) |
|||
if exists(from_file): |
|||
if os.stat(from_file).st_size > 0: |
|||
status = call(['cp', from_file, to_file], |
|||
stdout=open(os.devnull, 'wb')) |
|||
check_status(status, words=[os.path.basename(to_file), 'error!']) |
|||
else: |
|||
echo('empty', color=colors.YELLOW) |
|||
else: |
|||
echo('not exists', color=colors.RED) |
|||
|
|||
# ============ DATABASE MIGRATIONS ============== |
|||
title('Database migrations') |
|||
# Syncdb |
|||
sub('Not ready yet!') |
|||
|
|||
print("") |
|||
success('Finished!') |
@ -0,0 +1 @@ |
|||
-r ../requirements.pip |
@ -0,0 +1,2 @@ |
|||
Django==1.5.1 |
|||
jingo==0.6.1 |
@ -0,0 +1,168 @@ |
|||
## |
|||
# This fabric script only add automation to tasks for |
|||
# local development, is not intended to be used for |
|||
# deploys or stuff. |
|||
## |
|||
|
|||
# IMPORTS |
|||
from fabric.api import local, env, prefix, execute |
|||
from fabric.context_managers import settings, hide |
|||
from os.path import exists |
|||
from os import environ, stat |
|||
from fabric.colors import yellow, red, green |
|||
from subprocess import PIPE, Popen |
|||
import sys |
|||
|
|||
# Fabric env |
|||
env.hosts = ['localhost'] |
|||
env.activate = 'source virtualenv/bin/activate' |
|||
env.python = None |
|||
|
|||
# Development data |
|||
env.development_ddbb = 'dev.sqlite3' |
|||
|
|||
# Configuration |
|||
#python_version = "3.3.1" |
|||
python_version = "2.7.4" |
|||
|
|||
|
|||
# Functions |
|||
def echo(string, end='\r\n'): |
|||
sys.stdout.write(string) |
|||
if end: |
|||
sys.stdout.write("\n") |
|||
sys.stdout.flush() |
|||
|
|||
|
|||
def active_virtualenv(): |
|||
result = 'VIRTUAL_ENV' in environ |
|||
if result: |
|||
print red("Active virtualenv detected! You must deactivate it first.") |
|||
exit(-1) |
|||
return result |
|||
|
|||
|
|||
def python(): |
|||
if env.python is None: |
|||
print(yellow('Looking for python %s ...' % python_version)) |
|||
|
|||
# System python |
|||
echo(yellow('- System python: '), end='') |
|||
active = Popen('python --version', |
|||
stdout=PIPE, |
|||
stderr=PIPE, |
|||
shell=True) |
|||
version = active.communicate()[1].split()[1] |
|||
if version == python_version: |
|||
print(green('found!')) |
|||
env.python = 'python' |
|||
return(env.python) |
|||
else: |
|||
print(red(version)) |
|||
|
|||
# Alternate install |
|||
echo(yellow('- Alternate install: '), end='') |
|||
active = Popen('python3 --version', |
|||
stdout=PIPE, |
|||
stderr=PIPE, |
|||
shell=True) |
|||
version = active.communicate()[1].split()[1] |
|||
if version == python_version: |
|||
print(green('found!')) |
|||
env.python = 'python3' |
|||
return(env.python) |
|||
else: |
|||
if active.returncode == 0: |
|||
print(red(version)) |
|||
else: |
|||
print(red('not found')) |
|||
|
|||
# PythonZ |
|||
echo(yellow('- PythonZ: '), end='') |
|||
active = Popen('$HOME/.pythonz/pythons/CPython-3.3.1/bin/python3 --version', |
|||
stdout=PIPE, |
|||
stderr=PIPE, |
|||
shell=True) |
|||
output = active.communicate() |
|||
version = output[1].split()[1] |
|||
if version == python_version: |
|||
print(green('found!')) |
|||
env.python = "~/.pythonz/pythons/CPython-3.3.1/bin/python3" |
|||
return(env.python) |
|||
else: |
|||
if active.returncode == 0: |
|||
print(red(version)) |
|||
else: |
|||
print(red('not found')) |
|||
|
|||
# Anything found? D: |
|||
print(red('Python %s was not found!' % python_version)) |
|||
exit(-1) |
|||
else: |
|||
return env.python |
|||
|
|||
|
|||
# Virtualenv |
|||
def create_virtualenv(): |
|||
if not exists('./virtualenv'): |
|||
print(yellow('Making virtualenv')) |
|||
local("virtualenv -q --distribute -p %s ./virtualenv" % python()) |
|||
else: |
|||
print(green('Virtualenv already exists.')) |
|||
|
|||
|
|||
# Requirements |
|||
def install_requirements(): |
|||
if not active_virtualenv(): |
|||
with prefix(env.activate): |
|||
if stat('./config/development/requirements.pip').st_size > 0: |
|||
print(yellow('Installing development requirements')) |
|||
local('pip install -q -r ./config/development/requirements.pip') |
|||
|
|||
|
|||
def install(package): |
|||
"Install packages on the environment using fab install:<package name>" |
|||
if not active_virtualenv(): |
|||
with prefix(env.activate): |
|||
local('pip install ' + package) |
|||
|
|||
|
|||
def requirements(environ='global'): |
|||
if not active_virtualenv(): |
|||
with prefix(env.activate): |
|||
local('pip freeze') |
|||
|
|||
|
|||
# Easy-mode |
|||
def prepare(): |
|||
execute(create_virtualenv) |
|||
execute(install_requirements) |
|||
|
|||
|
|||
def p(): |
|||
execute(prepare) |
|||
|
|||
|
|||
def run(): |
|||
if not active_virtualenv(): |
|||
with prefix(env.activate): |
|||
environ['BACKEND_SETTINGS'] = 'config.development.backend_settings' |
|||
local('python app.py') |
|||
|
|||
|
|||
def test(): |
|||
if not active_virtualenv(): |
|||
with prefix(env.activate): |
|||
local('python -m unittest discover') |
|||
with settings(hide('warnings', 'running', 'stdout', 'stderr'), |
|||
warn_only=True): |
|||
local('find . -type d -name __pycache__ -exec rm -rf {} \;', |
|||
capture=True) |
|||
|
|||
|
|||
def tox(): |
|||
local('tox') |
|||
with settings(hide('warnings', 'running', 'stdout', 'stderr'), |
|||
warn_only=True): |
|||
local('find . -type d -name __pycache__ -exec rm -rf {} \;', |
|||
capture=True) |
@ -0,0 +1,10 @@ |
|||
#!/usr/bin/env python |
|||
from distutils.core import setup |
|||
|
|||
setup(name='minecraftcodex', |
|||
version='0.0.0', |
|||
author='Felipe Martin', |
|||
author_email='fmartingr@me.com', |
|||
url='http://www.minecraftcodex.com', |
|||
packages=['minecraftcodex'] |
|||
) |
@ -0,0 +1,9 @@ |
|||
[tox] |
|||
envlist = py27, py33 |
|||
|
|||
[testenv] |
|||
commands = {envpython} -m unittest discover |
|||
|
|||
deps = |
|||
Django==1.5.1 |
|||
jingo==0.6.1 |
Loading…
Reference in new issue