Skip to content
This repository was archived by the owner on Jul 20, 2019. It is now read-only.

Commit a851c99

Browse files
committed
added simple server & data builder
1 parent aa31955 commit a851c99

File tree

7 files changed

+122
-1
lines changed

7 files changed

+122
-1
lines changed

builder.py

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#coding: utf-8
2+
3+
'''
4+
builder.py
5+
~~~~~~~~~~
6+
7+
Build data.
8+
'''
9+
10+
import db
11+
12+
13+
def pick(size, start_id=None):
14+
if start_id:
15+
cur = db.get_page_by_id(start_id)
16+
else:
17+
cur = db.get_random_page()
18+
19+
dataset = [cur]
20+
while len(dataset) < size:
21+
for i in cur.relatives:
22+
if i not in dataset:
23+
dataset.append(i)
24+
if dataset.index(cur) + 1 >= len(dataset):
25+
while cur in dataset:
26+
cur = db.get_random_page()
27+
dataset.append(cur)
28+
else:
29+
cur = dataset[dataset.index(cur) + 1]
30+
while len(dataset) > size:
31+
dataset.pop()
32+
33+
return dataset
34+
35+
36+
def build(size, start_id=None):
37+
raw = pick(size, start_id)
38+
39+
dataset = {}
40+
for i in raw:
41+
dataset[i.id] = i.dict
42+
43+
return dataset

config.py

+3
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,6 @@
2323

2424
#: PageRank settings
2525
pr_iterate_times = 100
26+
27+
#: server settings
28+
DEBUG = True

db.py

+14
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#coding: utf-8
22

3+
from random import randint
4+
35
from sqlalchemy import create_engine
46
from sqlalchemy.orm import sessionmaker, scoped_session
57
from sqlalchemy.sql import and_
@@ -35,10 +37,22 @@ def _get_one(model, cond):
3537
return ret[0] if ret else None
3638

3739

40+
def pages_count():
41+
return session.query(Page).count()
42+
43+
44+
def get_page_by_id(id):
45+
return _get_one(Page, (Page.id == id))
46+
47+
3848
def get_page(name, section):
3949
return _get_one(Page, and_(Page.name == name, Page.section == section))
4050

4151

52+
def get_random_page():
53+
return get_page_by_id(randint(1, pages_count()))
54+
55+
4256
def add_page(name, section, relatives=None):
4357
#: replace the empty section with 3
4458
section = section or '3'

manage.py

+23-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,29 @@
11
#coding: utf-8
22

3+
import sys
4+
35
import db
6+
import server
7+
8+
9+
def _main():
10+
command = 'server'
11+
if len(sys.argv) > 1:
12+
command = sys.argv[1]
13+
14+
if command == 'server':
15+
server.app.run()
16+
elif command == 'rating':
17+
if sys.argv[2] == 'init':
18+
db.init_rating()
19+
elif sys.argv[2] == 'update':
20+
db.rating()
21+
elif command == 'db':
22+
if sys.argv[2] == 'drop':
23+
db.drop_all()
24+
elif sys.argv[2] == 'create':
25+
db.create_all()
426

527

628
if __name__ == '__main__':
7-
db.rating()
29+
_main()

models.py

+19
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#coding: utf-8
22

3+
import json
4+
35
from sqlalchemy import Column, Integer, String, Float
46
from sqlalchemy import ForeignKey, Table
57
from sqlalchemy.orm import relationship
@@ -40,3 +42,20 @@ def __repr__(self):
4042
@property
4143
def relatives(self):
4244
return list(set(self.fromme + self.tome))
45+
46+
@property
47+
def dict(self):
48+
49+
def _relatives(rel):
50+
return [i.id for i in rel]
51+
52+
return {
53+
'fromme': _relatives(self.fromme),
54+
'tome': _relatives(self.tome),
55+
'name': self.name,
56+
'id': self.id,
57+
'rating': self.rating,
58+
}
59+
60+
def to_json(self):
61+
return json.dumps(self.dict)

requirements.txt

+3
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1+
Flask==0.9
2+
Jinja2==2.6
13
SQLAlchemy==0.7.9
4+
Werkzeug==0.8.3
25
wsgiref==0.1.2

server.py

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#coding: utf-8
2+
3+
from flask import Flask, request, jsonify
4+
5+
import builder
6+
7+
#: init app
8+
app = Flask(__name__)
9+
app.config.from_pyfile('config.py')
10+
11+
12+
@app.route('/pages.json')
13+
def get():
14+
limit = int(request.args.get('limit', 20))
15+
start_id = request.args.get('start_id', None)
16+
start_id = int(start_id) if start_id else None
17+
return jsonify(builder.build(limit, start_id))

0 commit comments

Comments
 (0)