Source code for lodstorage.sample
"""
Created on 2020-08-24
@author: wf
"""
import json
import urllib.request
from datetime import date, datetime
from lodstorage.jsonable import JSONAble, JSONAbleList
[docs]
class Sample(object):
"""
Sample dataset generator
"""
cityList = None
def __init__(self):
"""
Constructor
"""
[docs]
@staticmethod
def getSample(size):
listOfDicts = []
for index in range(size):
listOfDicts.append({"pkey": "index%d" % index, "cindex": index})
return listOfDicts
[docs]
@staticmethod
def getCountries():
countryJsonUrl = "https://gist.githubusercontent.com/erdem/8c7d26765831d0f9a8c62f02782ae00d/raw/248037cd701af0a4957cce340dabb0fd04e38f4c/countries.json"
with urllib.request.urlopen(countryJsonUrl) as url:
countryList = json.loads(url.read().decode())
return countryList
[docs]
@staticmethod
def getCities():
"""
get a list of cities
"""
if Sample.cityList is None:
cityJsonUrl = "https://raw.githubusercontent.com/lutangar/cities.json/master/cities.json"
with urllib.request.urlopen(cityJsonUrl) as url:
Sample.cityList = json.loads(url.read().decode())
for city in Sample.cityList:
city["cityId"] = "%s-%s" % (city["country"], city["name"])
return Sample.cityList
[docs]
@staticmethod
def dob(isoDateString):
"""get the date of birth from the given iso date state"""
# if sys.version_info >= (3, 7):
# dt=datetime.fromisoformat(isoDateString)
# else:
dt = datetime.strptime(isoDateString, "%Y-%m-%d")
return dt.date()
[docs]
@staticmethod
def getRoyals():
return Royal.getSamples()
[docs]
@staticmethod
def getRoyalsInstances():
lod = Royal.getSamples()
royals = []
for record in lod:
royal = Royal()
royal.fromDict(record)
royals.append(royal)
return royals
[docs]
class Royals(JSONAbleList):
"""
a non ORM Royals list
"""
def __init__(self, load=False):
super(Royals, self).__init__("royals", clazz=None)
if load:
self.royals = Royal.getSamples()
else:
self.royals = None
[docs]
class RoyalsORMList(JSONAbleList):
def __init__(self, load=False):
super(RoyalsORMList, self).__init__("royals", Royal)
if load:
self.royals = Sample.getRoyalsInstances()
[docs]
class Royal(JSONAble):
"""
i am a single Royal
"""
[docs]
@classmethod
def getSamples(cls):
listOfDicts = [
{
"name": "Elizabeth Alexandra Mary Windsor",
"born": Sample.dob("1926-04-21"),
"numberInLine": 0,
"wikidataurl": "https://www.wikidata.org/wiki/Q9682",
},
{
"name": "Charles, Prince of Wales",
"born": Sample.dob("1948-11-14"),
"numberInLine": 1,
"wikidataurl": "https://www.wikidata.org/wiki/Q43274",
},
{
"name": "George of Cambridge",
"born": Sample.dob("2013-07-22"),
"numberInLine": 3,
"wikidataurl": "https://www.wikidata.org/wiki/Q1359041",
},
{
"name": "Harry Duke of Sussex",
"born": Sample.dob("1984-09-15"),
"numberInLine": 6,
"wikidataurl": "https://www.wikidata.org/wiki/Q152316",
},
]
today = date.today()
for person in listOfDicts:
born = person["born"]
age = (today - born).days / 365.2425
person["age"] = age
person["ofAge"] = age >= 18
person["lastmodified"] = datetime.now()
return listOfDicts
def __repr__(self):
text = self.__class__.__name__
attrs = ["name", "born"]
delim = ":"
for attr in attrs:
if hasattr(self, attr):
value = getattr(self, attr)
text += f"{delim}{value}"
delim = ":"
return text
[docs]
class Cities(JSONAbleList):
def __init__(self, load=False):
super(Cities, self).__init__("cities", clazz=None)
if load:
self.cities = Sample.getCities()
else:
self.cities = None