* Resolved issues 772, 827, 909
* Added numerous unit tests
* Code cleanup
* Improved type safety by using PbDeviceType instead of string
* Do not flush cache on failed STOP UNIT
* Error message and error handling updates
* Removed duplicate code
* Use map for mapping shift counts
* Reject read/write access if the drive has 0 sectors
* Updated logging configuration for tests
* Prompt the user before continuing with installation when Netatalk config dir is detected
* Add Netatalk with images dir sharing as an experimental feature
* Dockerize Pytest
* Fix auto-delete warning in delete file test
* Allow tests to be executed with a non-default home dir
* Use hostname for Docker container only if tests executed in Docker
* Update container entrypoint to pytest
* Re-format tests with black
* Define if the execution environment is a Docker container in env fixture
* Skip unsupported host bridge attachment test in Docker
- Use Path objects for file operations
- Use urllib to sanitize URLs
- Some explicit type conversions
- Consistent regex syntax
- Add rudimentary logging when archive extraction caching fails
- Fixed two cases of the property file creation not being notified in the Flash message
- added doctype and html lang attribute to the web server 502 page
- copy/move/delete file class methods now take Path objects as arguments
- The file download endpoint in the Web UI uses the safer download from dir method
- Simplified logging
- Merged nested if statements
- Removed naked handling of unknown error states
- Added fallback empty list for drive_properties, to avoid errors when json file is missing or broken
- Move drive_properties to env[]
- Constants for common error messages
- Dummy variable for list comprehension