refactoring metaprogramming examples

This commit is contained in:
Luciano Ramalho 2015-01-01 12:11:47 -02:00
parent 8e2b8d90e5
commit 1edb0cd05b
11 changed files with 61 additions and 64 deletions

1
.gitignore vendored
View File

@ -1,4 +1,5 @@
concurrency/flags/img/*.gif
metaprog/oscon-schedule/data/schedule?_db
# Byte-compiled / optimized / DLL files
__pycache__/

View File

@ -1,7 +1,8 @@
"""
explore.py: Script to download and explore the OSCON schedule feed
explore1.py: Script to explore the OSCON schedule feed
>>> raw_feed = load_json()
>>> from osconfeed import load
>>> raw_feed = load()
>>> feed = FrozenJSON(raw_feed)
>>> sorted(feed.Schedule.keys())
['conferences', 'events', 'speakers', 'venues']
@ -24,26 +25,8 @@ explore.py: Script to download and explore the OSCON schedule feed
"""
from urllib.request import urlopen
import warnings
import os
import json
from collections import abc
URL = 'http://www.oreilly.com/pub/sc/osconfeed'
JSON_NAME = 'osconfeed.json'
def load_json():
if not os.path.exists(JSON_NAME):
msg = 'downloading {} to {}'.format(URL, JSON_NAME)
warnings.warn(msg)
with urlopen(URL) as remote, open(JSON_NAME, 'wb') as local:
local.write(remote.read())
with open(JSON_NAME) as fp:
return json.load(fp)
class FrozenJSON:
"""A read-only façade for navigating a JSON-like object

View File

@ -1,7 +1,8 @@
"""
explore2.py: Script to download and explore the OSCON schedule feed
explore2.py: Script to explore the OSCON schedule feed
>>> raw_feed = load_json()
>>> from osconfeed import load
>>> raw_feed = load()
>>> feed = FrozenJSON(raw_feed)
>>> sorted(feed.Schedule.keys())
['conferences', 'events', 'speakers', 'venues']
@ -24,26 +25,8 @@ explore2.py: Script to download and explore the OSCON schedule feed
"""
from urllib.request import urlopen
import warnings
import os
import json
from collections import abc
URL = 'http://www.oreilly.com/pub/sc/osconfeed'
JSON_NAME = 'osconfeed.json'
def load_json():
if not os.path.exists(JSON_NAME):
msg = 'downloading {} to {}'.format(URL, JSON_NAME)
warnings.warn(msg)
with urlopen(URL) as remote, open(JSON_NAME, 'wb') as local:
local.write(remote.read())
with open(JSON_NAME) as fp:
return json.load(fp)
class FrozenJSON:
"""A read-only façade for navigating a JSON-like object

View File

@ -1,7 +1,7 @@
"""
explore0.py: Script to download and explore the OSCON schedule feed
osconfeed.py: Script to download the OSCON schedule feed
>>> feed = load_json()
>>> feed = load()
>>> sorted(feed['Schedule'].keys())
['conferences', 'events', 'speakers', 'venues']
>>> for key, value in sorted(feed['Schedule'].items()):
@ -29,10 +29,10 @@ import os
import json
URL = 'http://www.oreilly.com/pub/sc/osconfeed'
JSON_NAME = 'osconfeed.json'
JSON_NAME = 'data/osconfeed.json'
def load_json():
def load():
if not os.path.exists(JSON_NAME):
msg = 'downloading {} to {}'.format(URL, JSON_NAME)
warnings.warn(msg)

View File

@ -1,23 +1,24 @@
"""
schedule1.py: traversing OSCON schedule data
>>> db = shelve.open(DB_NAME)
>>> if CONFERENCE not in db: load_db(db)
>>> event = db['event.33950']
>>> record = db['speaker.3471']
>>> record.name
'Anna Martelli Ravenscroft'
>>> record.twitter
'annaraven'
>>> db.close()
>>> import shelve
>>> db = shelve.open(DB_NAME)
>>> if CONFERENCE not in db: load_db(db)
>>> event = db['event.33950']
>>> speaker = db['speaker.3471']
>>> speaker.name
'Anna Martelli Ravenscroft'
>>> speaker.twitter
'annaraven'
>>> db.close()
"""
import warnings
import shelve
from explore import load_json
import osconfeed
DB_NAME = 'schedule_db'
DB_NAME = 'data/schedule1_db'
CONFERENCE = 'conference.115'
@ -27,7 +28,7 @@ class Record:
def load_db(db):
raw_data = load_json()
raw_data = osconfeed.load()
warnings.warn('loading ' + DB_NAME)
for collection, rec_list in raw_data['Schedule'].items():
rec_type = collection[:-1]

View File

@ -1,9 +1,25 @@
"""
schedule2.py: traversing OSCON schedule data
>>> import shelve
>>> db = shelve.open(DB_NAME)
>>> if CONFERENCE not in db: load_db(db)
>>> DbRecord.set_db(db)
>>> event = Event.get('event.33950')
>>> event
<Event 'There *Will* Be Bugs'>
>>> event.speakers[0].name
'Anna Martelli Ravenscroft'
>>> db.close()
"""
import warnings
import inspect
from explore import load_json
import osconfeed
DB_NAME = 'schedule2_db'
DB_NAME = 'data/schedule2_db'
CONFERENCE = 'conference.115'
@ -26,12 +42,19 @@ class Record:
return '<{} {}>'.format(cls_name, ident)
class Event(Record):
class DbRecord(Record):
@classmethod
def set_db(cls, db):
cls._db = db
@classmethod
def get(cls, ident):
return cls._db[ident]
class Event(DbRecord):
@property
def venue(self):
key = self.venue_serial
@ -47,7 +70,7 @@ class Event(Record):
def load_db(db):
raw_data = load_json()
raw_data = osconfeed.load()
warnings.warn('loading ' + DB_NAME)
for collection, rec_list in raw_data['Schedule'].items():
rec_type = collection[:-1]

Binary file not shown.

Binary file not shown.

View File

@ -1,7 +1,7 @@
import shelve
import pytest
import schedule
import schedule1 as schedule
@pytest.yield_fixture

View File

@ -34,9 +34,15 @@ def test_speaker_record(db):
assert speaker.name == 'Anna Martelli Ravenscroft'
def test_dbrecord(db):
schedule.DbRecord.set_db(db)
venue = schedule.DbRecord.get('venue.1585')
assert venue.name == 'Exhibit Hall B'
def test_event_record(db):
event = db['event.33950']
assert event.name == 'There *Will* Be Bugs'
assert repr(event) == "<Event 'There *Will* Be Bugs'>"
def test_event_venue(db):
@ -54,8 +60,8 @@ def test_event_speakers(db):
anna_and_alex = [db['speaker.3471'], db['speaker.5199']]
assert event.speakers == anna_and_alex
def test_event_no_speakers(db):
schedule.Event.set_db(db)
event = db['event.36848']
assert len(event.speakers) == 0