commit: 6d5b0a5ba688677a127d1df1439080482c9709d1 Author: Mart Raudsepp <leio <AT> gentoo <DOT> org> AuthorDate: Tue Sep 6 21:19:29 2016 +0000 Commit: Mart Raudsepp <leio <AT> gentoo <DOT> org> CommitDate: Tue Sep 6 21:20:02 2016 +0000 URL: https://gitweb.gentoo.org/proj/grumpy.git/commit/?id=6d5b0a5b
Add initial code to sync categories from packages.g.o with associated plumbing Now this should make http://localhost:5000 show the available categories: ./manage.py init ./manage.py sync_gentoo ./manage.py runserver backend/__init__.py | 15 ++++++++++++++- backend/lib/models.py | 28 ++++++++++++++++++++++++++++ backend/lib/sync.py | 21 +++++++++++++++++++++ manage.py | 15 +++++++++++++-- requirements.txt | 2 ++ 5 files changed, 78 insertions(+), 3 deletions(-) diff --git a/backend/__init__.py b/backend/__init__.py index 81ca7eb..b03432b 100644 --- a/backend/__init__.py +++ b/backend/__init__.py @@ -1,7 +1,20 @@ from flask import Flask +from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///grumpy.db" # FIXME: configuration support +db = SQLAlchemy(app) + +from .lib import models + @app.route("/") def hello_world(): - return "Hello World!" + categories = models.Category.query.all() + text = "" + for cat in categories: + text += "<b>%s</b>: %s<br>" % (cat.name, cat.description) + return "Hello World! These are the package categories I know about:<br>%s" % text + + +__all__ = ["app", "db"] diff --git a/backend/lib/models.py b/backend/lib/models.py new file mode 100644 index 0000000..5088e3e --- /dev/null +++ b/backend/lib/models.py @@ -0,0 +1,28 @@ +from .. import db + + +class Category(db.Model): + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(30), unique=True, nullable=False) + description = db.Column(db.String(500)) + + def __repr__(self): + return "<Category %r>" % self.name + +class Package(db.Model): + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(128), nullable=False) + category_id = db.Column(db.Integer, db.ForeignKey('category.id'), nullable=False) + category = db.relationship('Category', backref=db.backref('packages', lazy='dynamic')) + + def __repr__(self): + return "<Package %r/%r>" % (self.category.name, self.name) + +class PackageVersion(db.Model): + id = db.Column(db.Integer, primary_key=True) + version = db.Column(db.String(128), nullable=False) + package_id = db.Column(db.Integer, db.ForeignKey('package.id'), nullable=False) + package = db.relationship('Package', backref=db.backref('versions', lazy='dynamic')) + + def __repr__(self): + return "<PackageVersion %s/%r-%r>" % (self.package.category.name, self.package.name, self.version) diff --git a/backend/lib/sync.py b/backend/lib/sync.py new file mode 100644 index 0000000..3cfb746 --- /dev/null +++ b/backend/lib/sync.py @@ -0,0 +1,21 @@ +from flask import json +import requests +from .. import app, db +from .models import Category + +http_session = requests.session() + +def sync_categories(): + url = "https://packages.gentoo.org/categories.json" + data = http_session.get(url) + categories = json.loads(data.text) + existing_categories = {} + for cat in Category.query.all(): + existing_categories[cat.name] = cat + for category in categories: + if category['name'] in existing_categories: + existing_categories[category['name']].description = category['description'] + else: + new_cat = Category(name=category['name'], description=category['description']) + db.session.add(new_cat) + db.session.commit() diff --git a/manage.py b/manage.py index b28d93a..4f123aa 100755 --- a/manage.py +++ b/manage.py @@ -3,15 +3,26 @@ from flask_script import Manager, Shell -from backend import app +from backend import app, db +from backend.lib.sync import sync_categories manager = Manager(app) def shell_context(): - return dict(app=manager.app) + return dict(app=manager.app, db=db) manager.add_command('shell', Shell(make_context=shell_context)) +@manager.command +def init(): + """Initialize empty database with tables""" + db.create_all() + +@manager.command +def sync_gentoo(): + """Syncronize Gentoo data from packages.gentoo.org API""" + sync_categories() + if __name__ == '__main__': manager.run() diff --git a/requirements.txt b/requirements.txt index eaf59ef..78e4b2b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,4 @@ Flask +Flask-SQLAlchemy Flask-Script #manage.py +requests