refactoring metaprogramming examples
This commit is contained in:
parent
8e2b8d90e5
commit
1edb0cd05b
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,4 +1,5 @@
|
||||
concurrency/flags/img/*.gif
|
||||
metaprog/oscon-schedule/data/schedule?_db
|
||||
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
@ -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]
|
@ -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.
@ -1,7 +1,7 @@
|
||||
import shelve
|
||||
import pytest
|
||||
|
||||
import schedule
|
||||
import schedule1 as schedule
|
||||
|
||||
|
||||
@pytest.yield_fixture
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user