mirror of
https://github.com/GSA/notifications-api.git
synced 2026-02-13 14:42:54 -05:00
Basic commit to add get pages showing
- bootstrap script - run script - couple of views - basic config
This commit is contained in:
@@ -7,3 +7,4 @@ Application for the notification api.
|
||||
Read and write notifications/status queue.
|
||||
Get and update notification status.
|
||||
|
||||
mkvirtualenv -p /usr/local/bin/python3 notify-api
|
||||
@@ -0,0 +1,70 @@
|
||||
import os
|
||||
|
||||
from flask._compat import string_types
|
||||
from flask import Flask
|
||||
from config import configs
|
||||
|
||||
|
||||
def create_app(config_name):
|
||||
application = Flask(__name__)
|
||||
|
||||
application.config['NOTIFY_API_ENVIRONMENT'] = config_name
|
||||
application.config.from_object(configs[config_name])
|
||||
|
||||
init_app(application)
|
||||
|
||||
from .main import main as main_blueprint
|
||||
application.register_blueprint(main_blueprint)
|
||||
|
||||
return application
|
||||
|
||||
|
||||
def init_app(app):
|
||||
for key, value in app.config.items():
|
||||
if key in os.environ:
|
||||
app.config[key] = convert_to_boolean(os.environ[key])
|
||||
|
||||
|
||||
def convert_to_boolean(value):
|
||||
"""Turn strings to bools if they look like them
|
||||
|
||||
Truthy things should be True
|
||||
>>> for truthy in ['true', 'on', 'yes', '1']:
|
||||
... assert convert_to_boolean(truthy) == True
|
||||
|
||||
Falsey things should be False
|
||||
>>> for falsey in ['false', 'off', 'no', '0']:
|
||||
... assert convert_to_boolean(falsey) == False
|
||||
|
||||
Other things should be unchanged
|
||||
>>> for value in ['falsey', 'other', True, 0]:
|
||||
... assert convert_to_boolean(value) == value
|
||||
"""
|
||||
if isinstance(value, string_types):
|
||||
if value.lower() in ['t', 'true', 'on', 'yes', '1']:
|
||||
return True
|
||||
elif value.lower() in ['f', 'false', 'off', 'no', '0']:
|
||||
return False
|
||||
|
||||
return value
|
||||
|
||||
|
||||
def convert_to_number(value):
|
||||
"""Turns numeric looking things into floats or ints
|
||||
|
||||
Integery things should be integers
|
||||
>>> for inty in ['0', '1', '2', '99999']:
|
||||
... assert isinstance(convert_to_number(inty), int)
|
||||
|
||||
Floaty things should be floats
|
||||
>>> for floaty in ['0.99', '1.1', '1000.0000001']:
|
||||
... assert isinstance(convert_to_number(floaty), float)
|
||||
|
||||
Other things should be unchanged
|
||||
>>> for value in [0, 'other', True, 123]:
|
||||
... assert convert_to_number(value) == value
|
||||
"""
|
||||
try:
|
||||
return float(value) if "." in value else int(value)
|
||||
except (TypeError, ValueError):
|
||||
return value
|
||||
|
||||
7
app/main/__init__.py
Normal file
7
app/main/__init__.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from flask import Blueprint
|
||||
|
||||
|
||||
main = Blueprint('main', __name__)
|
||||
|
||||
|
||||
from .views import notifications, index
|
||||
7
app/main/views/index.py
Normal file
7
app/main/views/index.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from flask import jsonify
|
||||
from .. import main
|
||||
|
||||
|
||||
@main.route('/', methods=['GET'])
|
||||
def index():
|
||||
return jsonify(result="hello world"), 200
|
||||
7
app/main/views/notifications.py
Normal file
7
app/main/views/notifications.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from flask import jsonify
|
||||
from .. import main
|
||||
|
||||
|
||||
@main.route('/notification', methods=['POST'])
|
||||
def create_notification():
|
||||
return jsonify(result="created"), 201
|
||||
@@ -1,11 +1,24 @@
|
||||
from flask import Flask
|
||||
#!/usr/bin/env python
|
||||
|
||||
app = Flask(__name__)
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
|
||||
from flask.ext.script import Manager, Server
|
||||
|
||||
from app import create_app
|
||||
|
||||
application = create_app(os.getenv('NOTIFY_API_ENVIRONMENT') or 'development')
|
||||
manager = Manager(application)
|
||||
port = int(os.environ.get('PORT', 6011))
|
||||
manager.add_command("runserver", Server(host='0.0.0.0', port=port))
|
||||
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
return 'Hello from notify-notifications-api'
|
||||
@manager.command
|
||||
def list_routes():
|
||||
"""List URLs of all application routes."""
|
||||
for rule in sorted(application.url_map.iter_rules(), key=lambda r: r.rule):
|
||||
print("{:10} {}".format(", ".join(rule.methods - set(['OPTIONS', 'HEAD'])), rule.rule))
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(port=6011)
|
||||
manager.run()
|
||||
|
||||
21
config.py
Normal file
21
config.py
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
class Config(object):
|
||||
DEBUG = False
|
||||
|
||||
|
||||
class Development(Config):
|
||||
DEBUG = True
|
||||
|
||||
|
||||
class Test(Config):
|
||||
DEBUG = True
|
||||
|
||||
|
||||
class Live(Config):
|
||||
pass
|
||||
|
||||
configs = {
|
||||
'development': Development,
|
||||
'test': Test,
|
||||
'live': Live,
|
||||
}
|
||||
30
scripts/bootstrap.sh
Executable file
30
scripts/bootstrap.sh
Executable file
@@ -0,0 +1,30 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Bootstrap virtualenv environment and postgres databases locally.
|
||||
#
|
||||
# NOTE: This script expects to be run from the project root with
|
||||
# ./scripts/bootstrap.sh
|
||||
|
||||
set -o pipefail
|
||||
|
||||
function display_result {
|
||||
RESULT=$1
|
||||
EXIT_STATUS=$2
|
||||
TEST=$3
|
||||
|
||||
if [ $RESULT -ne 0 ]; then
|
||||
echo -e "\033[31m$TEST failed\033[0m"
|
||||
exit $EXIT_STATUS
|
||||
else
|
||||
echo -e "\033[32m$TEST passed\033[0m"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ ! $VIRTUAL_ENV ]; then
|
||||
virtualenv ./venv
|
||||
. ./venv/bin/activate
|
||||
fi
|
||||
|
||||
|
||||
# Install Python development dependencies
|
||||
pip3 install -r requirements_for_test.txt
|
||||
3
scripts/run_app.sh
Executable file
3
scripts/run_app.sh
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
python application.py runserver
|
||||
Reference in New Issue
Block a user