import ujson as json
import time
import six
try:
from swapi.utils import query
except:
from utils import query
[docs]class BaseModel(object):
def __init__(self, raw_data):
json_data = json.loads(raw_data)
for key, value in six.iteritems(json_data):
setattr(self, key, value)
[docs]class BaseQuerySet(object):
def __init__(self):
self.items = []
[docs] def order_by(self, order_attribute):
''' Return the list of items in a certain order '''
to_return = []
for f in sorted(self.items, key=lambda i: getattr(i, order_attribute)):
to_return.append(f)
return to_return
[docs] def count(self):
''' Get the number of items in this queryset'''
return len(self.items)
[docs] def iter(self):
''' A generator that returns each resource in self.items '''
for i in self.items:
yield i
[docs]class StarshipQuerySet(BaseQuerySet):
def __init__(self, list_of_urls):
super(StarshipQuerySet, self).__init__()
for url in list_of_urls:
response = query(url)
self.items.append(Starship(response.content))
def __repr__(self):
return '<StarshipQuerySet - {0}>'.format(str(len(self.items)))
[docs]class Starship(BaseModel):
def __init__(self, raw_data):
super(Starship, self).__init__(raw_data)
def __repr__(self):
return '<Starship - {0}>'.format(self.name)
[docs] def get_films(self):
return FilmQuerySet(self.films)
[docs] def get_pilots(self):
return PeopleQuerySet(self.pilots)
[docs]class VehicleQuerySet(BaseQuerySet):
def __init__(self, list_of_urls):
super(VehicleQuerySet, self).__init__()
for url in list_of_urls:
response = query(url)
self.items.append(Vehicle(response.content))
def __repr__(self):
return '<VehicleQuerySet - {0}>'.format(str(len(self.items)))
[docs]class Vehicle(BaseModel):
def __init__(self, raw_data):
super(Vehicle, self).__init__(raw_data)
def __repr__(self):
return '<Vehicle - {0}>'.format(self.name)
[docs] def get_films(self):
return FilmQuerySet(self.films)
[docs] def get_pilots(self):
return PeopleQuerySet(self.pilots)
[docs]class FilmQuerySet(BaseQuerySet):
def __init__(self, list_of_urls):
super(FilmQuerySet, self).__init__()
for url in list_of_urls:
response = query(url)
self.items.append(Film(response.content))
def __repr__(self):
return '<FilmQuerySet - {0}>'.format(str(len(self.items)))
[docs]class Film(BaseModel):
def __init__(self, raw_data):
super(Film, self).__init__(raw_data)
def __repr__(self):
return '<Film - {0}>'.format(self.title)
[docs] def get_starships(self):
return StarshipQuerySet(self.starships)
[docs] def get_characters(self):
return PeopleQuerySet(self.characters)
[docs] def get_vehicles(self):
return VehicleQuerySet(self.vehicles)
[docs] def get_planets(self):
return PlanetQuerySet(self.planets)
[docs] def get_species(self):
return SpeciesQuerySet(self.species)
[docs] def gen_opening_crawl(self):
''' Return a generator yielding each line of the opening crawl'''
for line in self.opening_crawl.split('\n'):
yield line
[docs] def print_crawl(self):
''' Print the opening crawl one line at a time '''
print("Star Wars")
time.sleep(.5)
print("Episode {0}".format(self.episode_id))
time.sleep(.5)
print("")
time.sleep(.5)
print("{0}".format(self.title))
for line in self.gen_opening_crawl():
time.sleep(.5)
print(line)
[docs]class PlanetQuerySet(BaseQuerySet):
def __init__(self, list_of_urls):
super(PlanetQuerySet, self).__init__()
for url in list_of_urls:
response = query(url)
self.items.append(Planet(response.content))
def __repr__(self):
return '<PlanetQuerySet - {0}>'.format(str(len(self.items)))
[docs]class Planet(BaseModel):
def __init__(self, raw_data):
super(Planet, self).__init__(raw_data)
def __repr__(self):
return '<Planet - {0}>'.format(self.name)
[docs] def get_films(self):
return FilmQuerySet(self.films)
[docs] def get_residents(self):
return PeopleQuerySet(self.residents)
[docs]class SpeciesQuerySet(BaseQuerySet):
def __init__(self, list_of_urls):
super(SpeciesQuerySet, self).__init__()
for url in list_of_urls:
response = query(url)
self.items.append(Species(response.content))
def __repr__(self):
return '<SpeciesQuerySet - {0}>'.format(str(len(self.items)))
[docs]class Species(BaseModel):
def __init__(self, raw_data):
super(Species, self).__init__(raw_data)
def __repr__(self):
return '<Species - {0}>'.format(self.name)
[docs] def get_films(self):
return FilmQuerySet(self.films)
[docs] def get_people(self):
return PeopleQuerySet(self.people)
[docs] def get_homeworld(self):
response = query(self.homeworld)
return Planet(response.content)
[docs]class PeopleQuerySet(BaseQuerySet):
def __init__(self, list_of_urls):
super(PeopleQuerySet, self).__init__()
for url in list_of_urls:
response = query(url)
self.items.append(People(response.content))
def __repr__(self):
return '<PeopleQuerySet - {0}>'.format(str(len(self.items)))
[docs]class People(BaseModel):
''' Representing a single person '''
def __init__(self, raw_data):
super(People, self).__init__(raw_data)
def __repr__(self):
return '<Person - {0}>'.format(self.name)
[docs] def get_starships(self):
return StarshipQuerySet(self.starships)
[docs] def get_films(self):
return FilmQuerySet(self.films)
[docs] def get_vehicles(self):
return VehicleQuerySet(self.vehicles)
[docs] def get_homeworld(self):
response = query(self.homeworld)
return Planet(response.content)
[docs] def get_species(self):
return SpeciesQuerySet(self.species)