refactoring metaprogramming examples
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,4 +1,5 @@
|
|||||||
concurrency/flags/img/*.gif
|
concurrency/flags/img/*.gif
|
||||||
|
metaprog/oscon-schedule/data/schedule?_db
|
||||||
|
|
||||||
# Byte-compiled / optimized / DLL files
|
# Byte-compiled / optimized / DLL files
|
||||||
__pycache__/
|
__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)
|
>>> feed = FrozenJSON(raw_feed)
|
||||||
>>> sorted(feed.Schedule.keys())
|
>>> sorted(feed.Schedule.keys())
|
||||||
['conferences', 'events', 'speakers', 'venues']
|
['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
|
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:
|
class FrozenJSON:
|
||||||
"""A read-only façade for navigating a JSON-like object
|
"""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)
|
>>> feed = FrozenJSON(raw_feed)
|
||||||
>>> sorted(feed.Schedule.keys())
|
>>> sorted(feed.Schedule.keys())
|
||||||
['conferences', 'events', 'speakers', 'venues']
|
['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
|
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:
|
class FrozenJSON:
|
||||||
"""A read-only façade for navigating a JSON-like object
|
"""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())
|
>>> sorted(feed['Schedule'].keys())
|
||||||
['conferences', 'events', 'speakers', 'venues']
|
['conferences', 'events', 'speakers', 'venues']
|
||||||
>>> for key, value in sorted(feed['Schedule'].items()):
|
>>> for key, value in sorted(feed['Schedule'].items()):
|
||||||
@@ -29,10 +29,10 @@ import os
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
URL = 'http://www.oreilly.com/pub/sc/osconfeed'
|
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):
|
if not os.path.exists(JSON_NAME):
|
||||||
msg = 'downloading {} to {}'.format(URL, JSON_NAME)
|
msg = 'downloading {} to {}'.format(URL, JSON_NAME)
|
||||||
warnings.warn(msg)
|
warnings.warn(msg)
|
||||||
@@ -1,23 +1,24 @@
|
|||||||
"""
|
"""
|
||||||
|
schedule1.py: traversing OSCON schedule data
|
||||||
|
|
||||||
>>> db = shelve.open(DB_NAME)
|
>>> import shelve
|
||||||
>>> if CONFERENCE not in db: load_db(db)
|
>>> db = shelve.open(DB_NAME)
|
||||||
>>> event = db['event.33950']
|
>>> if CONFERENCE not in db: load_db(db)
|
||||||
>>> record = db['speaker.3471']
|
>>> event = db['event.33950']
|
||||||
>>> record.name
|
>>> speaker = db['speaker.3471']
|
||||||
'Anna Martelli Ravenscroft'
|
>>> speaker.name
|
||||||
>>> record.twitter
|
'Anna Martelli Ravenscroft'
|
||||||
'annaraven'
|
>>> speaker.twitter
|
||||||
>>> db.close()
|
'annaraven'
|
||||||
|
>>> db.close()
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import warnings
|
import warnings
|
||||||
import shelve
|
|
||||||
|
|
||||||
from explore import load_json
|
import osconfeed
|
||||||
|
|
||||||
DB_NAME = 'schedule_db'
|
DB_NAME = 'data/schedule1_db'
|
||||||
CONFERENCE = 'conference.115'
|
CONFERENCE = 'conference.115'
|
||||||
|
|
||||||
|
|
||||||
@@ -27,7 +28,7 @@ class Record:
|
|||||||
|
|
||||||
|
|
||||||
def load_db(db):
|
def load_db(db):
|
||||||
raw_data = load_json()
|
raw_data = osconfeed.load()
|
||||||
warnings.warn('loading ' + DB_NAME)
|
warnings.warn('loading ' + DB_NAME)
|
||||||
for collection, rec_list in raw_data['Schedule'].items():
|
for collection, rec_list in raw_data['Schedule'].items():
|
||||||
rec_type = collection[:-1]
|
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 warnings
|
||||||
import inspect
|
import inspect
|
||||||
|
|
||||||
from explore import load_json
|
import osconfeed
|
||||||
|
|
||||||
DB_NAME = 'schedule2_db'
|
DB_NAME = 'data/schedule2_db'
|
||||||
CONFERENCE = 'conference.115'
|
CONFERENCE = 'conference.115'
|
||||||
|
|
||||||
|
|
||||||
@@ -26,12 +42,19 @@ class Record:
|
|||||||
return '<{} {}>'.format(cls_name, ident)
|
return '<{} {}>'.format(cls_name, ident)
|
||||||
|
|
||||||
|
|
||||||
class Event(Record):
|
class DbRecord(Record):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def set_db(cls, db):
|
def set_db(cls, db):
|
||||||
cls._db = db
|
cls._db = db
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get(cls, ident):
|
||||||
|
return cls._db[ident]
|
||||||
|
|
||||||
|
|
||||||
|
class Event(DbRecord):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def venue(self):
|
def venue(self):
|
||||||
key = self.venue_serial
|
key = self.venue_serial
|
||||||
@@ -47,7 +70,7 @@ class Event(Record):
|
|||||||
|
|
||||||
|
|
||||||
def load_db(db):
|
def load_db(db):
|
||||||
raw_data = load_json()
|
raw_data = osconfeed.load()
|
||||||
warnings.warn('loading ' + DB_NAME)
|
warnings.warn('loading ' + DB_NAME)
|
||||||
for collection, rec_list in raw_data['Schedule'].items():
|
for collection, rec_list in raw_data['Schedule'].items():
|
||||||
rec_type = collection[:-1]
|
rec_type = collection[:-1]
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1,7 +1,7 @@
|
|||||||
import shelve
|
import shelve
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
import schedule
|
import schedule1 as schedule
|
||||||
|
|
||||||
|
|
||||||
@pytest.yield_fixture
|
@pytest.yield_fixture
|
||||||
@@ -34,9 +34,15 @@ def test_speaker_record(db):
|
|||||||
assert speaker.name == 'Anna Martelli Ravenscroft'
|
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):
|
def test_event_record(db):
|
||||||
event = db['event.33950']
|
event = db['event.33950']
|
||||||
assert event.name == 'There *Will* Be Bugs'
|
assert repr(event) == "<Event 'There *Will* Be Bugs'>"
|
||||||
|
|
||||||
|
|
||||||
def test_event_venue(db):
|
def test_event_venue(db):
|
||||||
@@ -54,8 +60,8 @@ def test_event_speakers(db):
|
|||||||
anna_and_alex = [db['speaker.3471'], db['speaker.5199']]
|
anna_and_alex = [db['speaker.3471'], db['speaker.5199']]
|
||||||
assert event.speakers == anna_and_alex
|
assert event.speakers == anna_and_alex
|
||||||
|
|
||||||
|
|
||||||
def test_event_no_speakers(db):
|
def test_event_no_speakers(db):
|
||||||
schedule.Event.set_db(db)
|
schedule.Event.set_db(db)
|
||||||
event = db['event.36848']
|
event = db['event.36848']
|
||||||
assert len(event.speakers) == 0
|
assert len(event.speakers) == 0
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user