Skip to content

Commit 1edb0cd

Browse files
committed
refactoring metaprogramming examples
1 parent 8e2b8d9 commit 1edb0cd

File tree

11 files changed

+62
-65
lines changed

11 files changed

+62
-65
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
concurrency/flags/img/*.gif
2+
metaprog/oscon-schedule/data/schedule?_db
23

34
# Byte-compiled / optimized / DLL files
45
__pycache__/
File renamed without changes.

metaprog/oscon-schedule/explore1.py

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
"""
2-
explore.py: Script to download and explore the OSCON schedule feed
2+
explore1.py: Script to explore the OSCON schedule feed
33
4-
>>> raw_feed = load_json()
4+
>>> from osconfeed import load
5+
>>> raw_feed = load()
56
>>> feed = FrozenJSON(raw_feed)
67
>>> sorted(feed.Schedule.keys())
78
['conferences', 'events', 'speakers', 'venues']
@@ -24,26 +25,8 @@
2425
2526
"""
2627

27-
from urllib.request import urlopen
28-
import warnings
29-
import os
30-
import json
3128
from collections import abc
3229

33-
URL = 'http://www.oreilly.com/pub/sc/osconfeed'
34-
JSON_NAME = 'osconfeed.json'
35-
36-
37-
def load_json():
38-
if not os.path.exists(JSON_NAME):
39-
msg = 'downloading {} to {}'.format(URL, JSON_NAME)
40-
warnings.warn(msg)
41-
with urlopen(URL) as remote, open(JSON_NAME, 'wb') as local:
42-
local.write(remote.read())
43-
44-
with open(JSON_NAME) as fp:
45-
return json.load(fp)
46-
4730

4831
class FrozenJSON:
4932
"""A read-only façade for navigating a JSON-like object

metaprog/oscon-schedule/explore2.py

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
"""
2-
explore2.py: Script to download and explore the OSCON schedule feed
2+
explore2.py: Script to explore the OSCON schedule feed
33
4-
>>> raw_feed = load_json()
4+
>>> from osconfeed import load
5+
>>> raw_feed = load()
56
>>> feed = FrozenJSON(raw_feed)
67
>>> sorted(feed.Schedule.keys())
78
['conferences', 'events', 'speakers', 'venues']
@@ -24,26 +25,8 @@
2425
2526
"""
2627

27-
from urllib.request import urlopen
28-
import warnings
29-
import os
30-
import json
3128
from collections import abc
3229

33-
URL = 'http://www.oreilly.com/pub/sc/osconfeed'
34-
JSON_NAME = 'osconfeed.json'
35-
36-
37-
def load_json():
38-
if not os.path.exists(JSON_NAME):
39-
msg = 'downloading {} to {}'.format(URL, JSON_NAME)
40-
warnings.warn(msg)
41-
with urlopen(URL) as remote, open(JSON_NAME, 'wb') as local:
42-
local.write(remote.read())
43-
44-
with open(JSON_NAME) as fp:
45-
return json.load(fp)
46-
4730

4831
class FrozenJSON:
4932
"""A read-only façade for navigating a JSON-like object
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""
2-
explore0.py: Script to download and explore the OSCON schedule feed
2+
osconfeed.py: Script to download the OSCON schedule feed
33
4-
>>> feed = load_json()
4+
>>> feed = load()
55
>>> sorted(feed['Schedule'].keys())
66
['conferences', 'events', 'speakers', 'venues']
77
>>> for key, value in sorted(feed['Schedule'].items()):
@@ -29,10 +29,10 @@
2929
import json
3030

3131
URL = 'http://www.oreilly.com/pub/sc/osconfeed'
32-
JSON_NAME = 'osconfeed.json'
32+
JSON_NAME = 'data/osconfeed.json'
3333

3434

35-
def load_json():
35+
def load():
3636
if not os.path.exists(JSON_NAME):
3737
msg = 'downloading {} to {}'.format(URL, JSON_NAME)
3838
warnings.warn(msg)
Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
"""
2-
3-
>>> db = shelve.open(DB_NAME)
4-
>>> if CONFERENCE not in db: load_db(db)
5-
>>> event = db['event.33950']
6-
>>> record = db['speaker.3471']
7-
>>> record.name
8-
'Anna Martelli Ravenscroft'
9-
>>> record.twitter
10-
'annaraven'
11-
>>> db.close()
2+
schedule1.py: traversing OSCON schedule data
3+
4+
>>> import shelve
5+
>>> db = shelve.open(DB_NAME)
6+
>>> if CONFERENCE not in db: load_db(db)
7+
>>> event = db['event.33950']
8+
>>> speaker = db['speaker.3471']
9+
>>> speaker.name
10+
'Anna Martelli Ravenscroft'
11+
>>> speaker.twitter
12+
'annaraven'
13+
>>> db.close()
1214
1315
"""
1416

1517
import warnings
16-
import shelve
1718

18-
from explore import load_json
19+
import osconfeed
1920

20-
DB_NAME = 'schedule_db'
21+
DB_NAME = 'data/schedule1_db'
2122
CONFERENCE = 'conference.115'
2223

2324

@@ -27,7 +28,7 @@ def __init__(self, mapping):
2728

2829

2930
def load_db(db):
30-
raw_data = load_json()
31+
raw_data = osconfeed.load()
3132
warnings.warn('loading ' + DB_NAME)
3233
for collection, rec_list in raw_data['Schedule'].items():
3334
rec_type = collection[:-1]

metaprog/oscon-schedule/schedule2.py

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,25 @@
1+
"""
2+
schedule2.py: traversing OSCON schedule data
3+
4+
>>> import shelve
5+
>>> db = shelve.open(DB_NAME)
6+
>>> if CONFERENCE not in db: load_db(db)
7+
>>> DbRecord.set_db(db)
8+
>>> event = Event.get('event.33950')
9+
>>> event
10+
<Event 'There *Will* Be Bugs'>
11+
>>> event.speakers[0].name
12+
'Anna Martelli Ravenscroft'
13+
>>> db.close()
14+
15+
"""
16+
117
import warnings
218
import inspect
319

4-
from explore import load_json
20+
import osconfeed
521

6-
DB_NAME = 'schedule2_db'
22+
DB_NAME = 'data/schedule2_db'
723
CONFERENCE = 'conference.115'
824

925

@@ -26,12 +42,19 @@ def __repr__(self):
2642
return '<{} {}>'.format(cls_name, ident)
2743

2844

29-
class Event(Record):
45+
class DbRecord(Record):
3046

3147
@classmethod
3248
def set_db(cls, db):
3349
cls._db = db
3450

51+
@classmethod
52+
def get(cls, ident):
53+
return cls._db[ident]
54+
55+
56+
class Event(DbRecord):
57+
3558
@property
3659
def venue(self):
3760
key = self.venue_serial
@@ -47,7 +70,7 @@ def speakers(self):
4770

4871

4972
def load_db(db):
50-
raw_data = load_json()
73+
raw_data = osconfeed.load()
5174
warnings.warn('loading ' + DB_NAME)
5275
for collection, rec_list in raw_data['Schedule'].items():
5376
rec_type = collection[:-1]
-756 KB
Binary file not shown.
-752 KB
Binary file not shown.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import shelve
22
import pytest
33

4-
import schedule
4+
import schedule1 as schedule
55

66

77
@pytest.yield_fixture

0 commit comments

Comments
 (0)