コード例 #1
0
    def testNormalRun(self):
        unused_stop_path = self.GetPath('test', 'data', 'unused_stop')
        # Make sure original data has an unused stop.
        accumulator = util.RecordingProblemAccumulator(self,
                                                       ("ExpirationDate", ))
        problem_reporter = transitfeed.ProblemReporter(accumulator)
        transitfeed.Loader(unused_stop_path,
                           problems=problem_reporter,
                           extra_validation=True).Load()
        accumulator.PopException("UnusedStop")
        accumulator.AssertNoMoreExceptions()

        (stdout, stderr) = self.CheckCallWithPath([
            self.GetExamplePath('filter_unused_stops.py'), '--list_removed',
            unused_stop_path, 'output.zip'
        ])
        # Extra stop was listed on stdout
        self.assertNotEqual(stdout.find('Bogus Stop'), -1)

        # Make sure unused stop was removed and another stop still exists.
        schedule = transitfeed.Loader('output.zip',
                                      problems=problem_reporter,
                                      extra_validation=True).Load()
        schedule.GetStop('STAGECOACH')
        accumulator.AssertNoMoreExceptions()
コード例 #2
0
ファイル: gtfs_test.py プロジェクト: yanghaocsg/bikesy-server
    def test_timezone_from_agency(self):
        sched = transitfeed.Loader(find_resource("google_transit.zip")).Load()

        assert graphserver.ext.gtfs.load_gtfs.timezone_from_agency(
            sched, "BART") == pytz.timezone("America/Los_Angeles")
        assert graphserver.ext.gtfs.load_gtfs.timezone_from_agency(
            sched, "AirBART") == pytz.timezone("America/Los_Angeles")
コード例 #3
0
    def testCustomAttribute(self):
        """Add unknown attributes to a Transfer and make sure they are saved."""
        transfer = transitfeed.Transfer()
        transfer.attr1 = "foo1"
        schedule = self.SimpleSchedule()
        transfer.to_stop_id = "stop1"
        transfer.from_stop_id = "stop1"
        schedule.add_transfer_object(transfer)
        transfer.attr2 = "foo2"

        saved_schedule_file = StringIO()
        schedule.write_google_transit_feed(saved_schedule_file)
        self.accumulator.assert_no_more_exceptions()

        # Ignore NoServiceExceptions error to keep the test simple
        load_problems = util.get_test_failure_problem_reporter(
            self,
            ("ExpirationDate", "UnrecognizedColumn", "NoServiceExceptions"))
        loaded_schedule = transitfeed.Loader(saved_schedule_file,
                                             loader_problems=load_problems,
                                             extra_validation=True).load()
        transfers = loaded_schedule.get_transfer_list()
        self.assertEquals(1, len(transfers))
        self.assertEquals("foo1", transfers[0].attr1)
        self.assertEquals("foo1", transfers[0]["attr1"])
        self.assertEquals("foo2", transfers[0].attr2)
        self.assertEquals("foo2", transfers[0]["attr2"])
コード例 #4
0
    def testDuplicateTransfer(self):
        self.AppendToArchiveContents(
            "stops.txt",
            "BEATTY_AIRPORT_HANGER,Airport Hanger,36.868178,-116.784915\n"
            "BEATTY_AIRPORT_34,Runway 34,36.85352,-116.786316\n")
        self.AppendToArchiveContents("trips.txt", "AB,FULLW,AIR1\n")
        self.AppendToArchiveContents(
            "stop_times.txt", "AIR1,7:00:00,7:00:00,BEATTY_AIRPORT_HANGER,1\n"
            "AIR1,7:05:00,7:05:00,BEATTY_AIRPORT_34,2\n"
            "AIR1,7:10:00,7:10:00,BEATTY_AIRPORT_HANGER,3\n")
        self.SetArchiveContents(
            "transfers.txt", "from_stop_id,to_stop_id,transfer_type\n"
            "BEATTY_AIRPORT,BEATTY_AIRPORT_HANGER,0\n"
            "BEATTY_AIRPORT,BEATTY_AIRPORT_HANGER,3")
        schedule = self.MakeLoaderAndLoad()
        e = self.accumulator.PopException('DuplicateID')
        self.assertEquals('(from_stop_id, to_stop_id)', e.column_name)
        self.assertEquals('(BEATTY_AIRPORT, BEATTY_AIRPORT_HANGER)', e.value)
        self.assertTrue(e.IsWarning())
        self.assertEquals('transfers.txt', e.file_name)
        self.assertEquals(3, e.row_num)
        self.accumulator.AssertNoMoreExceptions()

        saved_schedule_file = StringIO()
        schedule.WriteGoogleTransitFeed(saved_schedule_file)
        self.accumulator.AssertNoMoreExceptions()
        load_problems = util.GetTestFailureProblemReporter(
            self, ("ExpirationDate", "DuplicateID"))
        loaded_schedule = transitfeed.Loader(saved_schedule_file,
                                             problems=load_problems,
                                             extra_validation=True).Load()
        self.assertEquals(
            [0, 3],
            [int(t.transfer_type) for t in loaded_schedule.GetTransferIter()])
コード例 #5
0
class filter_unused_stops(util.TempDirTestCaseBase):
    def testNormalRun(self):
        unused_stop_path = self.GetPath('test', 'data', 'unused_stop')
        # Make sure load fails for input
        accumulator = transitfeed.ExceptionProblemAccumulator(
            raise_warnings=True)
        problem_reporter = transitfeed.ProblemReporter(accumulator)
        try:
            transitfeed.Loader(unused_stop_path,
                               problems=problem_reporter,
                               extra_validation=True).Load()
            self.fail('UnusedStop exception expected')
        except transitfeed.UnusedStop, e:
            pass
        (stdout, stderr) = self.CheckCallWithPath([
            self.GetExamplePath('filter_unused_stops.py'), '--list_removed',
            unused_stop_path, 'output.zip'
        ])
        # Extra stop was listed on stdout
        self.assertNotEqual(stdout.find('Bogus Stop'), -1)
        # Make sure unused stop was removed and another stop wasn't
        schedule = transitfeed.Loader('output.zip',
                                      problems=problem_reporter,
                                      extra_validation=True).Load()
        schedule.GetStop('STAGECOACH')
コード例 #6
0
    def runTest(self):
        problems = UnrecognizedColumnRecorder(self)
        loader = transitfeed.Loader(util.data_path('unrecognized_columns'),
                                    loader_problems=problems)
        loader.load()
        found_errors = set(problems.column_errors)
        expected_errors = {('agency.txt', 'agency_lange'),
                           ('stops.txt', 'stop_uri'),
                           ('routes.txt', 'Route_Text_Color'),
                           ('calendar.txt', 'leap_day'),
                           ('calendar_dates.txt', 'leap_day'),
                           ('trips.txt', 'sharpe_id'),
                           ('stop_times.txt', 'shapedisttraveled'),
                           ('stop_times.txt', 'drop_off_time'),
                           ('fare_attributes.txt', 'transfer_time'),
                           ('fare_rules.txt', 'source_id'),
                           ('frequencies.txt', 'superfluous'),
                           ('transfers.txt', 'to_stop')}

        # Now make sure we got the unrecognized column errors that we expected.
        not_expected = found_errors.difference(expected_errors)
        self.failIf(bool(not_expected),
                    'unexpected errors: %s' % str(not_expected))
        not_found = expected_errors.difference(found_errors)
        self.failIf(bool(not_found),
                    'expected but not found: %s' % str(not_found))
コード例 #7
0
 def testFilter(self):
     """Test if filtering works properly."""
     expected_values = {
         'CITY1': 0,
         'CITY2': 0,
         'CITY3': 0,
         'CITY4': 0,
         'CITY5': 0,
         'CITY6': 0,
         'CITY7': 0,
         'CITY8': 0,
         'CITY9': 0,
         'CITY10': 0,
         'CITY11': 1,
         'CITY12': 1,
     }
     filter = unusual_trip_filter.UnusualTripFilter(0.1, quiet=True)
     input = self.GetPath('test', 'data', 'filter_unusual_trips')
     loader = transitfeed.Loader(input, extra_validation=True)
     schedule = loader.Load()
     filter.filter(schedule)
     for trip_id, expected_trip_type in expected_values.items():
         actual_trip_type = schedule.trips[trip_id]['trip_type']
         try:
             self.assertEquals(int(actual_trip_type), expected_trip_type)
         except ValueError:
             self.assertEquals(actual_trip_type, '')
コード例 #8
0
 def runTest(self):
     loader = transitfeed.Loader(
         util.DataPath("utf8bom"),
         problems=util.GetTestFailureProblemReporter(self),
         extra_validation=True,
     )
     loader.Load()
コード例 #9
0
 def runTest(self):
     for feed in util.GetDataPathContents():
         loader = transitfeed.Loader(util.DataPath(feed),
                                     problems=transitfeed.ProblemReporter(),
                                     extra_validation=True)
         schedule = loader.Load()
         schedule.Validate()
コード例 #10
0
 def testFilter(self):
     """Test if filtering works properly."""
     expected_values = {
         "CITY1": 0,
         "CITY2": 0,
         "CITY3": 0,
         "CITY4": 0,
         "CITY5": 0,
         "CITY6": 0,
         "CITY7": 0,
         "CITY8": 0,
         "CITY9": 0,
         "CITY10": 0,
         "CITY11": 1,
         "CITY12": 1,
     }
     filter = unusual_trip_filter.UnusualTripFilter(0.1, quiet=True)
     input = self.GetPath("tests", "data", "filter_unusual_trips")
     loader = transitfeed.Loader(input, extra_validation=True)
     schedule = loader.Load()
     filter.filter(schedule)
     for trip_id, expected_trip_type in expected_values.items():
         actual_trip_type = schedule.trips[trip_id]["trip_type"]
         try:
             self.assertEquals(int(actual_trip_type), expected_trip_type)
         except ValueError:
             self.assertEquals(actual_trip_type, "")
コード例 #11
0
    def runTest(self):
        problems = UnrecognizedColumnRecorder(self)
        loader = transitfeed.Loader(util.DataPath("unrecognized_columns"),
                                    problems=problems)
        loader.Load()
        found_errors = set(problems.column_errors)
        expected_errors = set([
            ("agency.txt", "agency_lange"),
            ("stops.txt", "stop_uri"),
            ("routes.txt", "Route_Text_Color"),
            ("calendar.txt", "leap_day"),
            ("calendar_dates.txt", "leap_day"),
            ("trips.txt", "sharpe_id"),
            ("stop_times.txt", "shapedisttraveled"),
            ("stop_times.txt", "drop_off_time"),
            ("fare_attributes.txt", "transfer_time"),
            ("fare_rules.txt", "source_id"),
            ("frequencies.txt", "superfluous"),
            ("transfers.txt", "to_stop"),
        ])

        # Now make sure we got the unrecognized column errors that we expected.
        not_expected = found_errors.difference(expected_errors)
        self.failIf(not_expected, "unexpected errors: %s" % str(not_expected))
        not_found = expected_errors.difference(found_errors)
        self.failIf(not_found, "expected but not found: %s" % str(not_found))
コード例 #12
0
    def testBuildFeedWithUtf8Names(self):
        problems = util.GetTestFailureProblemReporter(self)
        schedule = transitfeed.Schedule(problem_reporter=problems)
        schedule.AddAgency("\xc8\x8b Fly Agency", "http://iflyagency.com",
                           "America/Los_Angeles")
        service_period = schedule.GetDefaultServicePeriod()
        service_period.SetDateHasService('20070101')
        # "u020b i with inverted accent breve" encoded in utf-8
        stop1 = schedule.AddStop(lng=140, lat=48.2, name="\xc8\x8b hub")
        # "u020b i with inverted accent breve" as unicode string
        stop2 = schedule.AddStop(lng=140.001,
                                 lat=48.201,
                                 name=u"remote \u020b station")
        route = schedule.AddRoute(u"\u03b2", "Beta", "Bus")
        trip = route.AddTrip(schedule, u"to remote \u020b station")
        repr(stop1)
        repr(stop2)
        repr(route)
        repr(trip)
        trip.AddStopTime(stop1, schedule=schedule, stop_time='10:00:00')
        trip.AddStopTime(stop2, stop_time='10:10:00')

        schedule.Validate(problems)
        schedule.WriteGoogleTransitFeed(self.tempfilepath)
        read_schedule = \
            transitfeed.Loader(self.tempfilepath, problems=problems,
                               extra_validation=True).Load()
        self.assertEquals(u'\u020b Fly Agency',
                          read_schedule.GetDefaultAgency().agency_name)
        self.assertEquals(
            u'\u03b2',
            read_schedule.GetRoute(route.route_id).route_short_name)
        self.assertEquals(u'to remote \u020b station',
                          read_schedule.GetTrip(trip.trip_id).trip_headsign)
コード例 #13
0
ファイル: testtransfer.py プロジェクト: pkrefta/transitfeed
  def testCustomAttribute(self):
    """Add unknown attributes to a Transfer and make sure they are saved."""
    transfer = transitfeed.Transfer()
    transfer.attr1 = "foo1"
    schedule = self.SimpleSchedule()
    transfer.to_stop_id = "stop1"
    transfer.from_stop_id = "stop1"
    schedule.AddTransferObject(transfer)
    transfer.attr2 = "foo2"

    saved_schedule_file = io.BytesIO()
    schedule.WriteGoogleTransitFeed(saved_schedule_file)
    self.accumulator.AssertNoMoreExceptions()

    # Ignore NoServiceExceptions error to keep the test simple
    load_problems = util.GetTestFailureProblemReporter(
        self, ("ExpirationDate", "UnrecognizedColumn", "NoServiceExceptions"))
    loaded_schedule = transitfeed.Loader(saved_schedule_file,
                                         problems=load_problems,
                                         extra_validation=True).Load()
    transfers = loaded_schedule.GetTransferList()
    self.assertEquals(1, len(transfers))
    self.assertEquals("foo1", transfers[0].attr1)
    self.assertEquals("foo1", transfers[0]["attr1"])
    self.assertEquals("foo2", transfers[0].attr2)
    self.assertEquals("foo2", transfers[0]["attr2"])
コード例 #14
0
def getScheduleAndShapes():
    print('Loading GTFS...')
    loader = transitfeed.Loader('../GRT_GTFS_w17')
    schedule = loader.Load()

    linestrings = {}
    terminals = []

    print('Calculating {} shapes...'.format(len(schedule.GetShapeList())))
    for shape in schedule.GetShapeList():
        points = []
        for lat, lng, dst in shape.points:
            x, y = utm17(lng, lat)
            points.append([x, y])
        linestring = LineString(points)
        linestrings[shape.shape_id] = linestring
        for i in 0, -1:
            terminals.append(linestring.coords[i])

    terminals = [Point(p) for p in set(terminals)]

    print('Processing roundabouts...')
    roundabouts = []
    with open('Roads.geojson.json') as fp:
        roads = json.load(fp)
    for road in roads['features']:
        if road['properties']['CartoClass'] == 'Roundabout':
            points = zip(*utm17(*zip(*road['geometry']['coordinates'])))
            roundabouts.append(LineString(points))

    return schedule, linestrings, terminals, roundabouts
コード例 #15
0
ファイル: static.py プロジェクト: jonathanzhang99/livesubway
def write_static_files(args):
    """ Writes the various files/objects storing useful static information.

    Through this method, one can selectively choose which files/objects
    write, in case there are a select number missing/need updates, without
    having to redo everything.

    Arguments
    ---------
    args: argparse.Namespace
        Arguments
    """
    PARSE_FUNCTIONS = {
        "graph": parse_graph,
        "stops": parse_stops,
        "shapes": parse_shapes,
        "prev_stops": parse_prev_stops
    }

    print "Loading static schedule information..."
    loader = transitfeed.Loader(STATIC_TRANSIT_DIR)
    schedule = loader.Load()
    print "Done. Writing to file(s)..."

    for file, parse_function in PARSE_FUNCTIONS.iteritems():
        if not getattr(args, file):
            print "Skipping {}.".format(file)
        else:
            print "Writing {}...".format(file)
            parse_function(schedule)

    print "File(s) written."
コード例 #16
0
    def testLoad(self):
        loader = transitfeed.Loader(util.DataPath("bad_eol.zip"),
                                    problems=self.problems,
                                    extra_validation=True)
        loader.Load()

        e = self.accumulator.PopException("OtherProblem")
        self.assertEqual(e.file_name, "calendar.txt")
        self.assertTrue(
            re.search(r"Found 1 CR LF.* \(line 2\) and 2 LF .*\(lines 1, 3\)",
                      e.FormatProblem()))

        e = self.accumulator.PopException("InvalidLineEnd")
        self.assertEqual(e.file_name, "routes.txt")
        self.assertEqual(e.row_num, 5)
        self.assertTrue(e.FormatProblem().find(r"\r\r\n") != -1)

        e = self.accumulator.PopException("OtherProblem")
        self.assertEqual(e.file_name, "trips.txt")
        self.assertEqual(e.row_num, 1)
        self.assertTrue(
            re.search(r"contains ASCII Form Feed", e.FormatProblem()))
        # TODO(Tom): avoid this duplicate error for the same issue
        e = self.accumulator.PopException("CsvSyntax")
        self.assertEqual(e.row_num, 1)
        self.assertTrue(
            re.search(r"header row should not contain any space char",
                      e.FormatProblem()))

        self.accumulator.AssertNoMoreExceptions()
コード例 #17
0
 def runTest(self):
   loader = transitfeed.Loader(
     util.DataPath('bad_utf8'),
     problems=transitfeed.ProblemReporter(),
     extra_validation=True)
   loader.Load()
   # raises exception if not found
   self.this_stdout.getvalue().index('Invalid value')
コード例 #18
0
 def runTest():
     for feed in util.get_data_path_contents():
         loader = transitfeed.Loader(
             util.data_path(feed),
             loader_problems=transitfeed.ProblemReporter(),
             extra_validation=True)
         schedule = loader.load()
         schedule.validate()
コード例 #19
0
 def test_TemporaryFile(self):
     loader = transitfeed.Loader(
         util.data_path('good_feed.zip'),
         loader_problems=util.get_test_failure_problem_reporter(self),
         extra_validation=True,
         memory_db=False)
     schedule = loader.load()
     self.assertLoadedCorrectly(schedule)
     self.assertLoadedStopTimesCorrectly(schedule)
コード例 #20
0
 def test_TemporaryFile(self):
     loader = transitfeed.Loader(
         util.DataPath('good_feed.zip'),
         problems=util.GetTestFailureProblemReporter(self),
         extra_validation=True,
         memory_db=False)
     schedule = loader.Load()
     self.assertLoadedCorrectly(schedule)
     self.assertLoadedStopTimesCorrectly(schedule)
コード例 #21
0
    def runTest(self):
        gtfs_input = data_path('good_feed.zip')
        feed1 = transitfeed.Loader(gtfs_input).load()
        kmlwriter.KMLWriter().write(feed1, self.kml_output)
        feed2 = transitfeed.Schedule()
        kmlparser.KMLParser().parse(self.kml_output, feed2)
        stops1 = set(map(stop_name_mapper, feed1.get_stop_list()))
        stops2 = set(map(stop_name_mapper, feed2.get_stop_list()))

        self.assertEqual(stops1, stops2)
コード例 #22
0
 def testNormalRun(self):
     shutil.copyfile(self.GetTestDataPath('one_stop.kml'), 'one_stop.kml')
     (out, err) = self.CheckCallWithPath(
         [self.GetPath('kmlparser.py'), 'one_stop.kml', 'one_stop.zip'])
     # There will be lots of problems, but ignore them
     accumulator = util.RecordingProblemAccumulator(self)
     problems = transitfeed.ProblemReporter(accumulator)
     schedule = transitfeed.Loader('one_stop.zip', problems=problems).Load()
     self.assertEquals(len(schedule.GetStopList()), 1)
     self.assertFalse(os.path.exists('transitfeedcrash.txt'))
コード例 #23
0
 def testFilterAppliedForRouteTypeSpecifiedByName(self):
   """Setting integer route_type filters trips of this route type."""
   filter = unusual_trip_filter.UnusualTripFilter(0.1, quiet=True,
                                                  route_type='Bus')
   input = self.GetPath('tests', 'data', 'filter_unusual_trips')
   loader = transitfeed.Loader(input, extra_validation=True)
   schedule = loader.Load()
   filter.filter(schedule)
   actual_trip_type = schedule.trips['CITY11']['trip_type']
   self.assertEquals(actual_trip_type, '1')
コード例 #24
0
 def runTest(self):
     loader = transitfeed.Loader(
         util.DataPath('empty_file'),
         problems=util.ExceptionProblemReporterNoExpiration(),
         extra_validation=True)
     try:
         loader.Load()
         self.fail('EmptyFile exception expected')
     except transitfeed.EmptyFile as e:
         self.assertEqual('agency.txt', e.file_name)
コード例 #25
0
 def testFilterNotAppliedForUnspecifiedRouteType(self):
     """Setting integer route_type filters trips of this route type."""
     filter = unusual_trip_filter.UnusualTripFilter(0.1,
                                                    quiet=True,
                                                    route_type=2)
     input = self.GetPath("tests", "data", "filter_unusual_trips")
     loader = transitfeed.Loader(input, extra_validation=True)
     schedule = loader.Load()
     filter.filter(schedule)
     actual_trip_type = schedule.trips["CITY11"]["trip_type"]
     self.assertEquals(actual_trip_type, "")
コード例 #26
0
 def test_NoLoadStopTimes(self):
     problems = util.GetTestFailureProblemReporter(
         self,
         ignore_types=("ExpirationDate", "UnusedStop", "OtherProblem"))
     loader = transitfeed.Loader(util.DataPath('good_feed.zip'),
                                 problems=problems,
                                 extra_validation=True,
                                 load_stop_times=False)
     schedule = loader.Load()
     self.assertLoadedCorrectly(schedule)
     self.assertEqual(0, len(schedule.GetTrip('CITY1').GetStopTimes()))
コード例 #27
0
 def runTest(self):
     feed_name = util.data_path('unknown_feed')
     loader = transitfeed.Loader(
         feed_name,
         loader_problems=util.ExceptionProblemReporterNoExpiration(),
         extra_validation=True)
     try:
         loader.load()
         self.fail('FeedNotFound exception expected')
     except transitfeed.FeedNotFound as e:
         self.assertEqual(feed_name, e.feed_name)
コード例 #28
0
 def runTest(self):
     loader = transitfeed.Loader(
         util.DataPath('missing_column'),
         problems=util.ExceptionProblemReporterNoExpiration(),
         extra_validation=True)
     try:
         loader.Load()
         self.fail('MissingColumn exception expected')
     except transitfeed.MissingColumn as e:
         self.assertEqual('agency.txt', e.file_name)
         self.assertEqual('agency_name', e.column_name)
コード例 #29
0
 def runTest(self):
     feed_name = util.DataPath('unknown_format.zip')
     loader = transitfeed.Loader(
         feed_name,
         problems=util.ExceptionProblemReporterNoExpiration(),
         extra_validation=True)
     try:
         loader.Load()
         self.fail('UnknownFormat exception expected')
     except transitfeed.UnknownFormat as e:
         self.assertEqual(feed_name, e.feed_name)
コード例 #30
0
    def runTest(self):
        loader = transitfeed.Loader(
            util.DataPath('good_feed.zip'),
            problems=util.GetTestFailureProblemReporter(self),
            extra_validation=True)
        loader.Load()

        # now try using Schedule.Load
        schedule = transitfeed.Schedule(
            problem_reporter=util.ExceptionProblemReporterNoExpiration())
        schedule.Load(util.DataPath('good_feed.zip'), extra_validation=True)