clean client npm and gulp config, change flask root url, reference static url in template, change config management to follow flask convention
authorymh <ymh.work@gmail.com>
Mon, 13 Oct 2014 12:43:47 +0200
changeset 13 435d5c15275a
parent 12 a0f1f77148d9
child 14 30ee8c47e48f
clean client npm and gulp config, change flask root url, reference static url in template, change config management to follow flask convention
.hgignore
annot-server/README.md
annot-server/annotserver.py
annot-server/config.py
annot-server/config.py.tmpl
annot-server/server.tac
annot-server/settings.py.tmpl
annot-server/webapp.py
client/app/annotationclient.html
client/app/app.css
client/gulpfile.js
client/package.json
--- a/.hgignore	Fri Oct 10 17:08:31 2014 +0200
+++ b/.hgignore	Mon Oct 13 12:43:47 2014 +0200
@@ -12,4 +12,11 @@
 ^client/.jscsrc$
 ^client/.jshintrc$
 ^annot-server/twistd.pid$
-^annot-server/config.py$
+^annot-server/settings.py$
+^annot-server/static/css/app
+^annot-server/static/css/lib
+^annot-server/static/css/fonts/
+^annot-server/static/js/app
+^annot-server/static/js/lib
+^annot-server/static/data
+^annot-server/templates/annotationclient.html$
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/annot-server/README.md	Mon Oct 13 12:43:47 2014 +0200
@@ -0,0 +1,9 @@
+
+# Mons Annotation server
+
+
+To start it :
+  1. create virtualenv with requirements.txt
+  1. activate the virtualenv
+  1. create settings.py from settings.py.tmpl
+  1. `twistd -ny server.tac`
--- a/annot-server/annotserver.py	Fri Oct 10 17:08:31 2014 +0200
+++ b/annot-server/annotserver.py	Mon Oct 13 12:43:47 2014 +0200
@@ -12,6 +12,7 @@
 from twisted.web.wsgi import WSGIResource
 from twisted.web.static import Data, File
 
+import config
 from oscserver import OSCServerProtocol
 from websockets import BroadcastServerFactory, AnotationServerFactory
 from webapp import app
@@ -21,7 +22,7 @@
 WS_PORT = 8090
 OSC_PORT = 9090
 
-def make_service(config, conn, debug=False):
+def make_service(conn, debug=False):
 
     s = service.MultiService()
     # Create and start a thread pool,
@@ -32,14 +33,14 @@
     reactor.addSystemEventTrigger('after', 'shutdown', wsgiThreadPool.stop)
 
 
-    wsFactory = BroadcastServerFactory("ws://localhost:%d/broadcast" % config.get('ws_port',WS_PORT),
+    wsFactory = BroadcastServerFactory("ws://localhost:%d/broadcast" % getattr(config,'WS_PORT',WS_PORT),
                                        debug = debug,
                                        debugCodePaths = debug)
     wsFactory.setProtocolOptions(allowHixie76 = True)
     wsResource = WebSocketResource(wsFactory)
 
 
-    wsAnnotFactory = AnotationServerFactory("ws://localhost:%d/annot" % config.get('ws_port',WS_PORT),
+    wsAnnotFactory = AnotationServerFactory("ws://localhost:%d/annot" % getattr(config,'WS_PORT',WS_PORT),
                                        debug = debug,
                                        debugCodePaths = debug,
                                        ws_factory = wsFactory,
@@ -55,21 +56,21 @@
 
 
     webResource = resource.Resource()
-    webResource.putChild(config['static_url'], File(config['static_root']))
+    webResource.putChild(getattr(config,'STATIC_URL').lstrip('/'), File(getattr(config,'STATIC_ROOT')))
     # Create the WSGI resource
     wsgiAppAsResource = WSGIResource(reactor, wsgiThreadPool, app)
-    webResource.putChild('', wsgiAppAsResource)
+    webResource.putChild('p', wsgiAppAsResource)
 
 
     # Hooks for twistd
 
-    webserver = strports.service('tcp:%d' % config.get('web_port',WEB_PORT), server.Site(webResource))
+    webserver = strports.service('tcp:%d' % getattr(config,'WEB_PORT',WEB_PORT), server.Site(webResource))
     webserver.setServiceParent(s)
 
-    wsserver = strports.service('tcp:%d' % config.get('ws_port',WS_PORT), server.Site(rootWs))
+    wsserver = strports.service('tcp:%d' % getattr(config,'WS_PORT',WS_PORT), server.Site(rootWs))
     wsserver.setServiceParent(s)
 
-    oscservice = internet.UDPServer(config.get('osc_port',OSC_PORT), OSCServerProtocol(wsFactory, conn))
+    oscservice = internet.UDPServer(getattr(config,'OSC_PORT',OSC_PORT), OSCServerProtocol(wsFactory, conn))
     oscservice.setServiceParent(s)
 
     return s
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/annot-server/config.py	Mon Oct 13 12:43:47 2014 +0200
@@ -0,0 +1,12 @@
+import os.path
+
+WEB_PORT = 8080
+WS_PORT = 8090
+OSC_PORT = 9090
+
+CONN_STR = ''
+
+STATIC_URL = '/static'
+STATIC_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)),'static')
+
+from settings import *
--- a/annot-server/config.py.tmpl	Fri Oct 10 17:08:31 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-import os.path
-
-config = {
-    'web_port': 8080,
-    'ws_port': 8090,
-    'osc_port': 9090,
-    'conn_str': 'postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]',
-    'static_url': 'static',
-    'static_root' : os.path.join(os.path.dirname(os.path.abspath(__file__)),'static')
-}
--- a/annot-server/server.tac	Fri Oct 10 17:08:31 2014 +0200
+++ b/annot-server/server.tac	Mon Oct 13 12:43:47 2014 +0200
@@ -14,7 +14,7 @@
 from txpostgres import txpostgres
 
 from annotserver import make_service
-from config import config
+import config
 from models import get_table_create_stmt
 from utils import create_connection_pool
 
@@ -22,7 +22,7 @@
 psycopg2.extras.register_uuid()
 
 
-conn, d = create_connection_pool(config['conn_str'])
+conn, d = create_connection_pool(config.CONN_STR)
 #to do treat error
 d.addCallback(lambda _: conn.runOperation(get_table_create_stmt()))
 
@@ -32,5 +32,5 @@
 
 application = service.Application("annot-server")
 
-annotserver = make_service(config, conn)
+annotserver = make_service(conn)
 annotserver.setServiceParent(service.IServiceCollection(application))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/annot-server/settings.py.tmpl	Mon Oct 13 12:43:47 2014 +0200
@@ -0,0 +1,12 @@
+import os.path
+
+WEB_PORT = 8080
+WS_PORT = 8090
+OSC_PORT = 9090
+
+CONN_STR = ''
+
+STATIC_URL = '/static'
+STATIC_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)),'static')
+
+from settings import *
--- a/annot-server/webapp.py	Fri Oct 10 17:08:31 2014 +0200
+++ b/annot-server/webapp.py	Mon Oct 13 12:43:47 2014 +0200
@@ -8,8 +8,11 @@
 
 from flask import Flask, render_template
 
+import config
+
 app = Flask(__name__)
 app.secret_key = str(uuid.uuid4())
+app.config.from_object(config)
 
 @app.route('/')
 def page_home():
--- a/client/app/annotationclient.html	Fri Oct 10 17:08:31 2014 +0200
+++ b/client/app/annotationclient.html	Mon Oct 13 12:43:47 2014 +0200
@@ -4,8 +4,8 @@
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <title>Mons by IRI</title>
-  <link rel="stylesheet" href="{{ pre_static_path }}static/css/lib.css">
-  <link rel="stylesheet" href="{{ pre_static_path }}static/css/app.css">
+  <link rel="stylesheet" href="{{ config['STATIC_URL'] }}/css/lib.css">
+  <link rel="stylesheet" href="{{ config['STATIC_URL'] }}/css/app.css">
 </head>
 <body ng-controller="homeCtrl" ng-app="mons" ng-cloak>
   <div class="container">
@@ -46,7 +46,7 @@
     </div>
     <div class="mons-content">
       <div ng-show="!selectedlevel">
-          <div class="mons-button hand" ng-repeat="c in data.categories" style="background-color: {{ '{{' }} c.color {{ '}}' }}" 
+          <div class="mons-button hand" ng-repeat="c in data.categories" style="background-color: {{ '{{' }} c.color {{ '}}' }}"
                                         ng-click="selectLevel(c.label, c.code, c)" ng-class="{'success-border':c.sendSuccess}">
             <div class="content">
                 <div class="table">
@@ -59,7 +59,7 @@
           </div>
       </div>
       <div ng-show="selectedlevel">
-          <div class="mons-button hand" ng-repeat="c in selectedlevel" style="background-color: {{ '{{' }} c.color {{ '}}' }}" 
+          <div class="mons-button hand" ng-repeat="c in selectedlevel" style="background-color: {{ '{{' }} c.color {{ '}}' }}"
                                         ng-click="sendAnnotation(c.label, c.code, c)" ng-class="{'success-border':c.sendSuccess}">
             <div class="content">
                 <div class="table">
@@ -86,15 +86,15 @@
       <div class="alert" ng-class="{'alert-success':showSuccessAlert, 'alert-danger':!showSuccessAlert}" role="alert" ng-show="showAlertDiv">{{ '{{' }} alertMessage {{ '}}' }}</div>
     </div>
   </div>
-  <script type="text/javascript" src="{{ pre_static_path }}static/js/lib.js"></script>
+  <script type="text/javascript" src="{{ config['STATIC_URL'] }}/js/lib.js"></script>
   <!--script type="text/javascript" src="{{ pre_static_path }}static/js/templates.js"></script-->
-  <script type="text/javascript" src="{{ pre_static_path }}static/js/app.js"></script>
+  <script type="text/javascript" src="{{ config['STATIC_URL'] }}/js/app.js"></script>
   <script type="text/javascript">
     angular.module("mons")
         .value('context', {
             {% if logging %}logging: true,{% endif %}
             urls: {
-                dataUrl: "{{ pre_static_path }}static/data/categories.json"
+                dataUrl: "{{ config['STATIC_URL'] }}/data/categories.json"
             }
         });
   </script>
--- a/client/app/app.css	Fri Oct 10 17:08:31 2014 +0200
+++ b/client/app/app.css	Mon Oct 13 12:43:47 2014 +0200
@@ -1,5 +1,5 @@
 .row{
-	margin-top: 10px;
+    margin-top: 10px;
 }
 footer{
     background: none;
@@ -13,20 +13,21 @@
     cursor: pointer;
 }
 .btn-lg{
-	width: 100%;
-	line-height: 2;
-	font-size: 4vw;
-	background-color: #E6E6E6;
+    width: 100%;
+    line-height: 2;
+    font-size: 4vw;
+    background-color: #E6E6E6;
 }
 .row{
-	margin-left: 0px;
-    margin-right: 0px;
+    margin-left: 0;
+    margin-right: 0;
 }
 .mons-content{
     width: 100%;
 }
 .mons-button{
-	background-color: #1e1e1e;
+    box-sizing: content-box;
+    background-color: #1e1e1e;
     border: 10px solid #fff;
     float: left;
     margin: 0.5%;
@@ -36,7 +37,8 @@
     width: 47%;
 }
 .mons-button .content{
-	height: 90%;
+    box-sizing: content-box;
+    height: 90%;
     padding: 5%;
     position: absolute;
     width: 90%;
@@ -50,7 +52,7 @@
     display: table-cell;
     text-align: center;
     vertical-align: middle;
-    text-shadow: 0px 0px 5px #fff;
+    text-shadow: 0 0 5px #fff;
 }
 .large-cat{
     font-size: 300%;
@@ -67,7 +69,7 @@
     background-color: #e6e6e6;
 }
 .send, .return{
-	padding-bottom: 20%;
+    padding-bottom: 20%;
 }
 
 .row input{
@@ -75,15 +77,14 @@
 }
 
 .messages {
-	position: fixed;
-	top: 0px;
-	z-index: 7000;
+    position: fixed;
+    top: 0;
+    z-index: 7000;
 }
 .success-border{
-	border: 10px solid #3c763d;
+    border: 10px solid #3c763d;
 }
 
 /*.ng-scope{
     border: red 1px solid;
 }*/
-
--- a/client/gulpfile.js	Fri Oct 10 17:08:31 2014 +0200
+++ b/client/gulpfile.js	Mon Oct 13 12:43:47 2014 +0200
@@ -1,20 +1,22 @@
 var gulp = require('gulp');
+var del = require('del');
 var gutil = require('gulp-util')
 var plugins = require("gulp-load-plugins")({lazy:false});
-//var flatten = require('gulp-flatten');
-//var uglify = require('gulp-uglify');
-//var clean = require('gulp-clean');
-//var rename = require('gulp-rename');
-//var filesize = require('gulp-filesize');
-//var cssmin  = require('gulp-cssmin');
 
 var templateFolder = '../annot-server/templates/';
 var templateFileDest = '../annot-server/templates/annotationclient.html';
 var staticFolder = '../annot-server/static';
 
-gulp.task('clean', function () {
-  gulp.src(templateFileDest, {read: false}).pipe(clean());
-  gulp.src(staticFolder, {read: false}).pipe(clean());
+var clientBaseName = 'app';
+var vendorBaseName = 'lib';
+
+gulp.task('clean', function (cb) {
+    del([
+        templateFileDest,
+        staticFolder + "/css/app*",
+        staticFolder + "/js/app*",
+        staticFolder + "/data/categories.json",
+    ],{'force':true}, cb);
 });
 
 var scriptsSrc = ['!./app/**/*_test.js','./app/**/*.js'];
@@ -25,34 +27,26 @@
         .pipe(plugins.jshint())
         .pipe(plugins.jshint.reporter('default'))
         .pipe(plugins.jshint.reporter('fail'))
-        .pipe(plugins.concat('app.js'))
+        .pipe(plugins.concat(clientBaseName+'.js'))
         .pipe(gulp.dest(staticFolder+'/js'))
         .pipe(plugins.filesize())
         .pipe(plugins.uglify())
-        .pipe(plugins.rename('app.min.js'))
+        .pipe(plugins.rename(clientBaseName+'.min.js'))
         .pipe(gulp.dest(staticFolder+'/js'))
         .pipe(plugins.filesize())
         .on('error', gutil.log);
 });
 
 
-//gulp.task('templates',function(){
-//    //combine all template files of the app into a js file
-//    gulp.src(['!./app/index.html',
-//        './app/**/*.html'])
-//        .pipe(plugins.angularTemplatecache('templates.js',{standalone:true}))
-//        .pipe(gulp.dest(staticFolder+'/js'));
-//});
-
 gulp.task('css', function(){
     gulp.src('./app/**/*.css')
-//        .pipe(plugins.csslint())
-//        .pipe(plugins.csslint.reporter())
-        .pipe(plugins.concat('app.css'))
+        .pipe(plugins.csslint({ 'box-sizing': false }))
+        .pipe(plugins.csslint.reporter())
+        .pipe(plugins.concat(clientBaseName+'.css'))
         .pipe(gulp.dest(staticFolder+'/css'))
         .pipe(plugins.filesize())
         .pipe(plugins.minifyCss({keepBreaks:true}))
-        .pipe(plugins.rename('app.min.css'))
+        .pipe(plugins.rename(clientBaseName+'.min.css'))
         .pipe(gulp.dest(staticFolder+'/css'))
         .pipe(plugins.filesize());
 });
@@ -85,11 +79,11 @@
     //concatenate vendor CSS files
     gulp.src(['!./bower_components/**/*.min.css',
         './bower_components/**/*.css'])
-        .pipe(plugins.concat('lib.css'))
+        .pipe(plugins.concat(vendorBaseName+'.css'))
         .pipe(gulp.dest(staticFolder+'/css'))
         .pipe(plugins.filesize())
         .pipe(plugins.minifyCss({keepBreaks:true}))
-        .pipe(plugins.rename('lib.min.css'))
+        .pipe(plugins.rename(vendorBaseName+'.min.css'))
         .pipe(gulp.dest(staticFolder+'/css'))
         .pipe(plugins.filesize());
 });
@@ -122,10 +116,9 @@
         staticFolder+'/**/*.css'
     ], function(event) {
         return gulp.src(event.path)
-            .pipe(plugins.connect.reload());
+            .pipe(plugins.webserver.reload());
     });
     gulp.watch(['./app/**/*.js','!./app/**/*test.js'],['scripts']);
-    //gulp.watch(['!./app/index.html','./app/**/*.html'],['templates']);
     gulp.watch('./app/**/*.css',['css']);
     gulp.watch('./app/annotationclient.html',['copy-index']);
     gulp.watch('./data/**/*',['copy-data']);
@@ -133,11 +126,13 @@
 
 });
 
-gulp.task('connect', plugins.connect.server({
-    root: ['build'],
-    port: 9000,
-    livereload: true
-}));
+gulp.task('connect', function() {
+    gulp.src('build').pipe(
+        plugins.webserver({
+            port: 9000,
+            livereload: true
+        })
+    );
+});
 
-//gulp.task('default',['connect','scripts','templates','css','copy-index','copy-data','copy-img','vendorJS','vendorCSS','vendorFonts','watch']);
-gulp.task('default',['scripts','css','copy-index','copy-data','copy-img','vendorJS','vendorCSS','vendorFonts','watch']);
+gulp.task('default',['scripts','css','copy-index','copy-data','copy-img','vendorJS','vendorCSS','vendorFonts']);
--- a/client/package.json	Fri Oct 10 17:08:31 2014 +0200
+++ b/client/package.json	Mon Oct 13 12:43:47 2014 +0200
@@ -10,24 +10,24 @@
   "author": "IRI",
   "license": "Cecill-C",
   "devDependencies": {
-    "bower": "^1.3.4",
+    "bower": "^1.3.12",
+    "del": "^0.1.3",
     "grunt-cli": "^0.1.13",
-    "gulp": "~3.5.5",
-    "gulp-angular-templatecache": "^1.1.0",
-    "gulp-clean": "^0.3.0",
-    "gulp-concat": "~2.1.7",
-    "gulp-connect": "^1.0.7",
-    "gulp-csslint": "^0.1.4",
+    "gulp": "~3.8.8",
+    "gulp-angular-templatecache": "^1.4.2",
+    "gulp-concat": "~2.4.1",
+    "gulp-csslint": "^0.1.5",
     "gulp-filesize": "0.0.6",
-    "gulp-flatten": "0.0.2",
-    "gulp-jshint": "~1.5.0",
-    "gulp-load-plugins": "~0.4.0",
-    "gulp-minify-css": "^0.3.4",
+    "gulp-flatten": "0.0.4",
+    "gulp-jshint": "~1.8.5",
+    "gulp-load-plugins": "~0.7.0",
+    "gulp-minify-css": "^0.3.10",
     "gulp-rename": "^1.2.0",
-    "gulp-uglify": "^0.3.0",
-    "gulp-util": "^2.2.16",
-    "karma": "^0.12.1",
-    "karma-chrome-launcher": "^0.1.2",
+    "gulp-uglify": "^1.0.1",
+    "gulp-util": "^3.0.1",
+    "gulp-webserver": "^0.8.3",
+    "karma": "^0.12.23",
+    "karma-chrome-launcher": "^0.1.4",
     "karma-jasmine": "^0.1.5"
   }
 }