Skip to content

Commit f68823e

Browse files
committed
Final MongoDB edition.
1 parent 915bada commit f68823e

File tree

18 files changed

+340
-54
lines changed

18 files changed

+340
-54
lines changed

src/ch16-mongodb-version/final/pypi_nosql/.idea/dictionaries/screencaster.xml

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ch16-mongodb-version/final/pypi_nosql/.idea/inspectionProfiles/Project_Default.xml

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ch16-mongodb-version/final/pypi_nosql/pypi/__init__.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from pyramid.config import Configurator
44

55
from pypi.data.db_session import DbSession
6+
from pypi.nosql import mongo_setup
7+
from pypi.nosql.users import User
68

79

810
def main(global_config, **settings):
@@ -57,10 +59,4 @@ def init_routing(config):
5759

5860

5961
def init_db(_):
60-
db_file = os.path.abspath(
61-
os.path.join(
62-
os.path.dirname(__file__),
63-
'db',
64-
'pypi.sqlite'
65-
))
66-
DbSession.global_init(db_file)
62+
mongo_setup.global_init()
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import os
2+
3+
from pypi import DbSession
4+
from pypi.nosql import mongo_setup
5+
6+
from pypi.data.users import User as SqlUser
7+
from pypi.nosql.users import User as MongoUser
8+
9+
from pypi.data.packages import Package as SqlPackage
10+
from pypi.nosql.packages import Package as MongoPackage
11+
12+
from pypi.data.releases import Release as SqlRelease
13+
from pypi.nosql.releases import Release as MongoRelease
14+
15+
16+
def main():
17+
init_dbs()
18+
migrate_users()
19+
migrate_packages()
20+
migrate_releases()
21+
22+
23+
def migrate_users():
24+
if MongoUser.objects().count():
25+
return
26+
27+
session = DbSession.factory()
28+
sql_users = session.query(SqlUser).all()
29+
for sut in sql_users:
30+
su: SqlUser = sut
31+
u = MongoUser()
32+
u.created_date = su.created_date
33+
u.hashed_password = su.hashed_password
34+
u.name = su.name
35+
u.email = su.email
36+
u.save()
37+
38+
39+
def migrate_packages():
40+
if MongoPackage.objects().count():
41+
return
42+
43+
session = DbSession.factory()
44+
sql_packages = session.query(SqlPackage).all()
45+
for sup in sql_packages:
46+
sp: SqlPackage = sup
47+
p = MongoPackage()
48+
p.id = sp.id
49+
p.created_date = sp.created_date
50+
p.summary = sp.summary
51+
p.description = sp.description
52+
p.home_page = sp.home_page
53+
p.docs_url = sp.docs_url
54+
p.package_url = sp.package_url
55+
56+
p.author = sp.author_name
57+
p.author_email = sp.author_email
58+
59+
p.license = sp.license
60+
p.maintainers = [] # Find, load, and copy over maintainer IDs.
61+
62+
p.save()
63+
64+
65+
def migrate_releases():
66+
if MongoRelease.objects().count():
67+
return
68+
69+
session = DbSession.factory()
70+
sql_releases = session.query(SqlRelease).all()
71+
for srp in sql_releases:
72+
sr: SqlRelease = srp
73+
r = MongoRelease()
74+
r.created_date = sr.created_date
75+
r.comment = sr.comment
76+
r.major_ver = sr.major_ver
77+
r.minor_ver = sr.minor_ver
78+
r.build_ver = sr.build_ver
79+
r.url = sr.url
80+
r.size = sr.size
81+
r.package_id = sr.package_id
82+
83+
r.save()
84+
85+
86+
def init_dbs():
87+
db_file = os.path.abspath(
88+
os.path.join(
89+
os.path.dirname(__file__),
90+
'..',
91+
'db',
92+
'pypi.sqlite'
93+
))
94+
DbSession.global_init(db_file)
95+
96+
mongo_setup.global_init(db_name='pypi_nosql')
97+
98+
99+
if __name__ == '__main__':
100+
main()

src/ch16-mongodb-version/final/pypi_nosql/pypi/infrastructure/cookie_auth.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import bson
12
import hashlib
23
from datetime import timedelta
34
from typing import Optional
@@ -10,7 +11,7 @@
1011
auth_cookie_name = 'pypi_demo_user'
1112

1213

13-
def set_auth(request: Request, user_id: int):
14+
def set_auth(request: Request, user_id: bson.ObjectId):
1415
hash_val = __hash_text(str(user_id))
1516
val = "{}:{}".format(user_id, hash_val)
1617

@@ -28,7 +29,7 @@ def __add_cookie_callback(_, response: Response, name: str, value: str):
2829
response.set_cookie(name, value, max_age=timedelta(days=30))
2930

3031

31-
def get_user_id_via_auth_cookie(request: Request) -> Optional[int]:
32+
def get_user_id_via_auth_cookie(request: Request) -> Optional[bson.ObjectId]:
3233
if auth_cookie_name not in request.cookies:
3334
return None
3435

@@ -44,7 +45,10 @@ def get_user_id_via_auth_cookie(request: Request) -> Optional[int]:
4445
print("Warning: Hash mismatch, invalid cookie value")
4546
return None
4647

47-
return try_int(user_id)
48+
try:
49+
return bson.ObjectId(user_id)
50+
except:
51+
return None
4852

4953

5054
def logout(request: Request):

src/ch16-mongodb-version/final/pypi_nosql/pypi/nosql/__init__.py

Whitespace-only changes.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import datetime
2+
import mongoengine
3+
4+
5+
class Download(mongoengine.Document):
6+
__tablename__ = 'downloads'
7+
8+
created_date = mongoengine.DateTimeField(default=datetime.datetime.now)
9+
10+
package_id = mongoengine.StringField()
11+
release_id = mongoengine.IntField()
12+
13+
ip_address = mongoengine.StringField()
14+
user_agent = mongoengine.StringField()
15+
16+
meta = {
17+
'db_alias': 'core',
18+
'collection': 'documents',
19+
'indexes': [
20+
'created_date',
21+
'package_id',
22+
'release_id',
23+
]
24+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import datetime
2+
import mongoengine
3+
4+
5+
class ProgrammingLanguage(mongoengine.Document):
6+
7+
id = mongoengine.StringField(primary_key=True)
8+
created_date = mongoengine.DateTimeField(default=datetime.datetime.now)
9+
description = mongoengine.StringField()
10+
11+
meta = {
12+
'db_alias': 'core',
13+
'collection': 'languages',
14+
'indexes': [
15+
'created_date',
16+
]
17+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import datetime
2+
import mongoengine
3+
4+
5+
class License(mongoengine.Document):
6+
id = mongoengine.StringField(primary_key=True)
7+
created_date = mongoengine.DateTimeField(default=datetime.datetime.now)
8+
description = mongoengine.StringField()
9+
10+
meta = {
11+
'db_alias': 'core',
12+
'collection': 'licenses',
13+
'indexes': [
14+
'created_date',
15+
]
16+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import mongoengine
2+
3+
4+
def global_init(user=None, password=None, port=27017,
5+
server='localhost', use_ssl=True, db_name='pypi_nosql'):
6+
if user or password:
7+
# noinspection PyUnresolvedReferences
8+
data = dict(
9+
username=user,
10+
password=password,
11+
host=server,
12+
port=port,
13+
authentication_source='admin',
14+
authentication_mechanism='SCRAM-SHA-1',
15+
ssl=use_ssl,
16+
ssl_cert_reqs=ssl.CERT_NONE)
17+
mongoengine.register_connection(alias='core', name=db_name, **data)
18+
data['password'] = '*************'
19+
print(" --> Registering prod connection: {}".format(data))
20+
else:
21+
print(" --> Registering dev connection")
22+
mongoengine.register_connection(alias='core', name=db_name)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import datetime
2+
3+
import mongoengine
4+
5+
6+
class Package(mongoengine.Document):
7+
__tablename__ = 'packages'
8+
9+
id = mongoengine.StringField(primary_key=True)
10+
created_date = mongoengine.DateTimeField(default=datetime.datetime.now)
11+
summary = mongoengine.StringField()
12+
description = mongoengine.StringField()
13+
14+
home_page = mongoengine.StringField()
15+
docs_url = mongoengine.StringField()
16+
package_url = mongoengine.StringField()
17+
18+
author = mongoengine.StringField()
19+
author_email = mongoengine.StringField()
20+
license = mongoengine.StringField()
21+
22+
maintainers = mongoengine.ListField(mongoengine.ObjectIdField())
23+
24+
meta = {
25+
'db_alias': 'core',
26+
'collection': 'packages',
27+
'indexes': [
28+
'created_date',
29+
'author_email',
30+
'license',
31+
'maintainers'
32+
]
33+
}
34+
35+
def __repr__(self):
36+
return '<Package {}>'.format(self.id)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import datetime
2+
3+
import mongoengine
4+
5+
6+
class Release(mongoengine.Document):
7+
package_id = mongoengine.StringField()
8+
9+
major_ver = mongoengine.IntField()
10+
minor_ver = mongoengine.IntField()
11+
build_ver = mongoengine.IntField()
12+
13+
created_date = mongoengine.DateTimeField(default=datetime.datetime.now)
14+
comment = mongoengine.StringField()
15+
url = mongoengine.StringField()
16+
size = mongoengine.IntField()
17+
18+
meta = {
19+
'db_alias': 'core',
20+
'collection': 'releases',
21+
'indexes': [
22+
'created_date',
23+
'package_id',
24+
'major_ver',
25+
'minor_ver',
26+
'build_ver',
27+
{'fields': ['major_ver', 'minor_ver', 'build_ver']},
28+
{'fields': ['-major_ver', '-minor_ver', '-build_ver']},
29+
]
30+
}
31+
32+
@property
33+
def version_text(self):
34+
return '{}.{}.{}'.format(self.major_ver, self.minor_ver, self.build_ver)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import datetime
2+
import mongoengine
3+
4+
5+
class User(mongoengine.Document):
6+
email = mongoengine.StringField()
7+
name = mongoengine.StringField()
8+
hashed_password = mongoengine.StringField()
9+
created_date = mongoengine.DateTimeField(default=datetime.datetime.now)
10+
11+
meta = {
12+
'db_alias': 'core',
13+
'collection': 'users',
14+
'indexes': [
15+
'created_date',
16+
'email',
17+
]
18+
}

0 commit comments

Comments
 (0)