Gentoo Archives: gentoo-commits

From: Mart Raudsepp <leio@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/grumpy:master commit in: backend/lib/, /, backend/
Date: Tue, 06 Sep 2016 21:21:50
Message-Id: 1473196802.6d5b0a5ba688677a127d1df1439080482c9709d1.leio@gentoo
1 commit: 6d5b0a5ba688677a127d1df1439080482c9709d1
2 Author: Mart Raudsepp <leio <AT> gentoo <DOT> org>
3 AuthorDate: Tue Sep 6 21:19:29 2016 +0000
4 Commit: Mart Raudsepp <leio <AT> gentoo <DOT> org>
5 CommitDate: Tue Sep 6 21:20:02 2016 +0000
6 URL: https://gitweb.gentoo.org/proj/grumpy.git/commit/?id=6d5b0a5b
7
8 Add initial code to sync categories from packages.g.o with associated plumbing
9
10 Now this should make http://localhost:5000 show the available categories:
11 ./manage.py init
12 ./manage.py sync_gentoo
13 ./manage.py runserver
14
15 backend/__init__.py | 15 ++++++++++++++-
16 backend/lib/models.py | 28 ++++++++++++++++++++++++++++
17 backend/lib/sync.py | 21 +++++++++++++++++++++
18 manage.py | 15 +++++++++++++--
19 requirements.txt | 2 ++
20 5 files changed, 78 insertions(+), 3 deletions(-)
21
22 diff --git a/backend/__init__.py b/backend/__init__.py
23 index 81ca7eb..b03432b 100644
24 --- a/backend/__init__.py
25 +++ b/backend/__init__.py
26 @@ -1,7 +1,20 @@
27 from flask import Flask
28 +from flask_sqlalchemy import SQLAlchemy
29
30 app = Flask(__name__)
31 +app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///grumpy.db" # FIXME: configuration support
32 +db = SQLAlchemy(app)
33 +
34 +from .lib import models
35 +
36
37 @app.route("/")
38 def hello_world():
39 - return "Hello World!"
40 + categories = models.Category.query.all()
41 + text = ""
42 + for cat in categories:
43 + text += "<b>%s</b>: %s<br>" % (cat.name, cat.description)
44 + return "Hello World! These are the package categories I know about:<br>%s" % text
45 +
46 +
47 +__all__ = ["app", "db"]
48
49 diff --git a/backend/lib/models.py b/backend/lib/models.py
50 new file mode 100644
51 index 0000000..5088e3e
52 --- /dev/null
53 +++ b/backend/lib/models.py
54 @@ -0,0 +1,28 @@
55 +from .. import db
56 +
57 +
58 +class Category(db.Model):
59 + id = db.Column(db.Integer, primary_key=True)
60 + name = db.Column(db.String(30), unique=True, nullable=False)
61 + description = db.Column(db.String(500))
62 +
63 + def __repr__(self):
64 + return "<Category %r>" % self.name
65 +
66 +class Package(db.Model):
67 + id = db.Column(db.Integer, primary_key=True)
68 + name = db.Column(db.String(128), nullable=False)
69 + category_id = db.Column(db.Integer, db.ForeignKey('category.id'), nullable=False)
70 + category = db.relationship('Category', backref=db.backref('packages', lazy='dynamic'))
71 +
72 + def __repr__(self):
73 + return "<Package %r/%r>" % (self.category.name, self.name)
74 +
75 +class PackageVersion(db.Model):
76 + id = db.Column(db.Integer, primary_key=True)
77 + version = db.Column(db.String(128), nullable=False)
78 + package_id = db.Column(db.Integer, db.ForeignKey('package.id'), nullable=False)
79 + package = db.relationship('Package', backref=db.backref('versions', lazy='dynamic'))
80 +
81 + def __repr__(self):
82 + return "<PackageVersion %s/%r-%r>" % (self.package.category.name, self.package.name, self.version)
83
84 diff --git a/backend/lib/sync.py b/backend/lib/sync.py
85 new file mode 100644
86 index 0000000..3cfb746
87 --- /dev/null
88 +++ b/backend/lib/sync.py
89 @@ -0,0 +1,21 @@
90 +from flask import json
91 +import requests
92 +from .. import app, db
93 +from .models import Category
94 +
95 +http_session = requests.session()
96 +
97 +def sync_categories():
98 + url = "https://packages.gentoo.org/categories.json"
99 + data = http_session.get(url)
100 + categories = json.loads(data.text)
101 + existing_categories = {}
102 + for cat in Category.query.all():
103 + existing_categories[cat.name] = cat
104 + for category in categories:
105 + if category['name'] in existing_categories:
106 + existing_categories[category['name']].description = category['description']
107 + else:
108 + new_cat = Category(name=category['name'], description=category['description'])
109 + db.session.add(new_cat)
110 + db.session.commit()
111
112 diff --git a/manage.py b/manage.py
113 index b28d93a..4f123aa 100755
114 --- a/manage.py
115 +++ b/manage.py
116 @@ -3,15 +3,26 @@
117
118 from flask_script import Manager, Shell
119
120 -from backend import app
121 +from backend import app, db
122 +from backend.lib.sync import sync_categories
123
124
125 manager = Manager(app)
126
127 def shell_context():
128 - return dict(app=manager.app)
129 + return dict(app=manager.app, db=db)
130
131 manager.add_command('shell', Shell(make_context=shell_context))
132
133 +@×××××××.command
134 +def init():
135 + """Initialize empty database with tables"""
136 + db.create_all()
137 +
138 +@×××××××.command
139 +def sync_gentoo():
140 + """Syncronize Gentoo data from packages.gentoo.org API"""
141 + sync_categories()
142 +
143 if __name__ == '__main__':
144 manager.run()
145
146 diff --git a/requirements.txt b/requirements.txt
147 index eaf59ef..78e4b2b 100644
148 --- a/requirements.txt
149 +++ b/requirements.txt
150 @@ -1,2 +1,4 @@
151 Flask
152 +Flask-SQLAlchemy
153 Flask-Script #manage.py
154 +requests