Refaktorioitu aikatauluhaku

Sat, 10 Jun 2017 21:03:26 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Sat, 10 Jun 2017 21:03:26 +0300
changeset 17
fa3c822859b5
parent 16
d94cde20abee
child 18
1c8ff93fbfac

Refaktorioitu aikatauluhaku

buses.py file | annotate | diff | comparison | revisions
service.py file | annotate | diff | comparison | revisions
--- a/buses.py	Sat Jun 10 20:56:48 2017 +0300
+++ b/buses.py	Sat Jun 10 21:03:26 2017 +0300
@@ -66,7 +66,7 @@
 		self.pairs = set() # samannimiset lähellä olevat pysäkit
 	def __repr__(self):
 		return 'pysäkit[%r]' % self.tunniste
-	def aikataulu(self, määrä = 50):
+	def schedule(self, max_amount = 50):
 		'''
 			Hakee tämän pysäkin seuraavat `määrä` lähtöä. Päätepysäkille saapuvia busseja ei
 			lasketa. Palauttaa pysähdykset listana jossa alkiot ovat muotoa (aika, pysähdys),
@@ -77,45 +77,45 @@
 			Mikäli pysäkille ei ole määrätty riittävästi pysähdyksiä kalenterissa, tuloslista
 			jää alimittaiseksi, mahdollisesti jopa tyhjäksi.
 		'''
-		class PäivätLoppuError(Exception):
-			pass
-		# Hakee pysäkin aikataulut tiettynä päivänä.
-		def aikataulu_päivänä(päivä):
-			# Jos päädyttiin aikataulukalenterin ulkopuolelle, niin tuotetaan virhe. Jos vain
-			# palautettaisiin tyhjä tulos, niin algoritmi jatkaisi etsintää loputtomiin.
-			if päivä > viimeinen_käyttöpäivä:
-				raise PäivätLoppuError()
-			taulu = []
-			# Jokaiselle ajovuorolle,
-			for ajo in ajot.values():
-				# jos tämä ajovuoro ajetaan tänä päivänä
-				if ajo.ajetaan_päivänä(päivä):
-					# ja jos tämä ajo pysähtyy tällä pysäkillä, ei kuitenkaan saapuen
-					# päätepysäkille,
-					pysähdys = ajo.pysäkkiReitillä(self)
-					if pysähdys and pysähdys is not ajo.reitti[-1]:
-						# ja jos tämä pysähdys on tulevaisuudessa,
-						aika = datetime.combine(päivä, time()) + pysähdys.saapumisaika
-						if aika >= nyt():
-							# lisää pysähdys listaan.
-							taulu.append((aika, pysähdys))
-			# Lajittele lopputulos saapumisajan mukaan.
-			taulu.sort(key = lambda tietue: tietue[0])
-			return taulu
-		taulu = []
-		päivä = tänään()
+		result = []
+		date = tänään()
 		# Niin kauan kuin aikatauluja ei ole vielä tarpeeksi,
-		while len(taulu) < määrä:
+		while len(result) < max_amount:
 			try:
 				# hae nykyisen päivän aikataulut ja lisää ne,
-				taulu += aikataulu_päivänä(päivä)
-			except PäivätLoppuError:
+				result += self.schedule_for_day(date)
+			except ValueError:
 				# paitsi jos mentiin kalenterin ulkopuolelle, jolloin lopetetaan,
 				break
 			# ja siirry seuraavaan päivään.
-			päivä += timedelta(1)
+			date += timedelta(1)
 		# Typistä lopputulos haluttuun tulosmäärään.
-		return taulu[:määrä]
+		return result[:max_amount]
+	def schedule_for_day(self, date):
+		'''
+			Hakee pysäkin aikataulut tiettynä päivänä.
+		'''
+		# Jos päädyttiin aikataulukalenterin ulkopuolelle, niin tuotetaan virhe. Jos vain
+		# palautettaisiin tyhjä tulos, niin algoritmi jatkaisi etsintää loputtomiin.
+		if date > viimeinen_käyttöpäivä:
+			raise ValueError('tried to retrieve schedule for date %s which is outside schedule data' % date)
+		result = []
+		# Jokaiselle ajovuorolle,
+		for trip in ajot.values():
+			# jos tämä ajovuoro ajetaan tänä päivänä
+			if trip.ajetaan_päivänä(date):
+				# ja jos tämä ajo pysähtyy tällä pysäkillä, ei kuitenkaan saapuen
+				# päätepysäkille,
+				stop = trip.pysäkkiReitillä(self)
+				if stop and stop is not trip.reitti[-1]:
+					# ja jos tämä pysähdys on tulevaisuudessa,
+					aika = datetime.combine(date, time()) + stop.saapumisaika
+					if aika >= nyt():
+						# lisää pysähdys listaan.
+						result.append((aika, stop))
+		# Lajittele lopputulos saapumisajan mukaan.
+		result.sort(key = lambda entry: entry[0])
+		return result
 	@property
 	def linkki_karttaan(self):
 		return 'http://www.openstreetmap.org/#map=19/%f/%f' % (self.sijainti.leveys, self.sijainti.pituus)
--- a/service.py	Sat Jun 10 20:56:48 2017 +0300
+++ b/service.py	Sat Jun 10 21:03:26 2017 +0300
@@ -53,7 +53,7 @@
 		pysäkki = pysäkit[tunniste]
 	except KeyError:
 		abort(404)
-	for (aika, pysähdys) in pysäkki.aikataulu(100):
+	for (aika, pysähdys) in pysäkki.schedule(100):
 		kyltti = supista_reitti(pysähdys.ajo.suppea_reitti(pysähdys))
 		kyltti = [tr(paikka, 'paikat') for paikka in kyltti]
 		kylttiesitys = ' - '.join(kyltti)

mercurial