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 |