Skip to content

adhocore/py-routes

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

adhocore/py-routes

A simple Python3 CLI app to find the optimal route between two points in terms of number of stops and duration.

It does not use Dijkstra's algorithm and has no external dependencies. It supports reverse traversal as well.

FAQs

Why?

It does not use Dijkstra's algorithm and has no external dependencies. It supports reverse traversal as well.

Do I know recursion is bad in Python?

Yes, that's why.


Structure

├── main.py             => The main CLI app
├── README.md           => The README (this file)
├── requirements.txt    => The Project deps definition (none)
├── routes              => The routes module
│   ├── __init__.py     => The Module init
│   ├── calculator.py   => The abstract route calculator
│   ├── cost.py         => The cost object
│   ├── decorator.py    => The reverse route decorator
│   ├── exception.py    => The container for exception
│   ├── option.py       => The argv option parser
│   ├── parser.py       => The routes.csv parser
│   ├── route.py        => The recursive ro
├── routes.csv          => The default input file with route info
└── tests               => The tests
    ├── __init__.py     => The Module init
    ├── cost_test.py    => The test for cost.py
    ├── main_test.py    => The test for main.py
    ├── option_test.py  => The test for option.py
    ├── parser_test.py  => The test for parser.py
    ├── route_test.py   => The test for route.py
    └── testcase.py     => The base testcase where we deal with CSV

Usage

As a command line app, you can run it in shell:

# Show usage help
python3 main.py
# OR
python3 main.py --help
Usage:
  python main.py <options>

Options:
  <--file>     Path to csv file with route information
  <--start>    The starting point
  <--end>      The destination point
  [--two-way]  Check if the reverse route is possible
  [--help]     Show the help

Examples:
  python main.py --file=routes.csv --start=A --end=D
  python main.py --file routes.csv --start A --end D
  python main.py --file routes.csv --start D --end A --two-way

[Requires Python3.3+]

It interactively asks in the value for start and end points if you didn't pass them via shell.

Options

--start

Case insensitive start point.

--end

Case insensitive end point.

--file

We can use both relative (to this project root) or full path as file. The file CSV is very flexible so can have all random stuffs in there like so:

"A", B,5
  B,"C",5
C,D ,7

A,D,"15"
 E, F,5
F,G, 5

G,H,10
XX,YY,10

Where the values in each row as start,end,distance i.e. A,B,5 mean the distance between point A and B is 5.

--two-way

And here is an option for power user. Suppose our input csv lacks elaborate routes for two way round trips, can pass in --two-way for reverse traversal.

How it works?

python3 main.py --file=routes.csv --start=E --end=J           # Stops 2, Time 30
python3 main.py --file=routes.csv --start=J --end=E           # No routes
python3 main.py --file=routes.csv --start=J --end=E --two-way # Stops 2, Time 30

Unit testing

python3 -m unittest discover -s tests -p '*_test.py'