Skip to main content

Parses opening hours from various human-readable strings into a standard JSON format

Project description

Python Opening Hours parser

CircleCI codecov Downloads

This library parses opening hours from various human-readable strings such as "Mon- Fri 9:00am - 5:30pm" into a more standard JSON format that can be processed more easily.

The format

opening_hours = [
	{
		"day": "monday",
		"opens": "9:00",
		"closes": "17:00"
	},
	//..
]

Installation

pip install jsonify-opening-hours

Usage

The simplest example is just printing the JSON for an opening hours string:

from parse_opening_hours import OpeningHours

print(OpeningHours.parse("Mon- Fri 9:00am - 5:30pm").json())

This should give you the below output:

[
	{'day': 'monday', 'opens': '9:00', 'closes': '17:30'},
	{'day': 'tuesday', 'opens': '9:00', 'closes': '17:30'},
	{'day': 'wednesday', 'opens': '9:00', 'closes': '17:30'},
	{'day': 'thursday', 'opens': '9:00', 'closes': '17:30'},
	{'day': 'friday', 'opens': '9:00', 'closes': '17:30'}
]

This has been tested using Python 3.8.5

Environment variables

Setting the environment variable OH_DEBUG to a value of Y will set the root logging level to debug and will cause log entries to appear in stdout for debugging purposes

Troubleshooting

Assumptions

When specifying a time without AM or PM indicators, you may get an error that reads TypeError: Cannot convert a time of unknown type (AM, PM or 24H) without assuming its type.. To resolve this, pass assume_type=TimeType.AM when calling the parse() function. This will use AM in place of an unknown AM or PM designation. In cases like the string "9-5", if the second value in the range (in this case the 5 is smaller than the first (i.e. the 9) then it will be converted to PM automatically

Tests and Coverage

run pytet and generate coverage database pipenv run pytest --cov=./

show coverage report: pipenv run coverage report

Build and Release

This is pretty much here so I can copy-paste the commands to make a new release.

build: python3 setup.py sdist bdist_wheel

check: twine check dist/*

upload: twine upload dist/*

todo:

  • add tests with emojis and stuff

  • add tests with unicode code points (partial)

  • "Noon" as alias for 12 PM

  • "midnight" alias for 12am

  • 24 hours as alias for 12am-11:59 PM also "24 hours" "24hrs" "24h" "All Day" "Open 24 hours"

  • "24/7" alias for 7 days a week, 24 hours a day also "24 Hours/Day, 7 Days/Week", "Seven Days a Week"

  • support for single specific dates ("April 22nd")

  • support lists of specific dates ("April 22nd & 23rd")

  • support "from" as separator betweendate and time

  • documentation

  • allow "Open" as an optional prefix

  • "Mon: 9a-4p, Tue: 11:30a- 6:30p, Wed:11:30a- 6:30p, Thurs: 9a-4p, Fri: 9a-4p, Sat: 9a-4p, Sun: Varies"

Long term:

  • support specific single days i.e. "April 22nd 9 am to 4 pm"

  • day lists "April 22nd & 23rd 9 am to 4 pm", "April 22nd & 23rd 9 am to 4 pm", "April 14th, 15th, 16th 9 am to 4 pm, 17th 9 am to 1 pm", "4/8 10 am to 3 pm & 4/9 9 am to 3 pm"

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jsonify-opening-hours-0.3.0.tar.gz (12.6 kB view hashes)

Uploaded Source

Built Distribution

jsonify_opening_hours-0.3.0-py3-none-any.whl (23.4 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page