- Package into single executable file. Easier to distribute. User doesn't need to install runtime environment and dependency libraries, which could be tedious for non-tech-savvy users.
- Add lightweight formatting to xlsx, widening cell to make text clear.
- Output excel file instead of csv file.
- Add progress indicator. Informative printing message.
- When searching for fund name, distinguish between fund and stock.
- Strip tqdm to minimal and copy to this repo.
- Try to use RESET api as much as possible. Avoid fetching web content which could be outdated or up to JavaScript modification. And it would be super tedious and engineering-wise difficult to up a whole JS engine to run JavaScript code.
- Add version as suffix to release assets and/or release executable.
- Instead of asking for override confirmation, just backup the old file and create the new file in-place.
- Add LICENSE
- Take advantage of the knowledge that fund info stays the same within 0:00 to 20:00. Implement persistent cache mechanism to acclerate following queries. Possible implementation schemes are SQLite3, pickle, shelve, dbm, marshal, copyreg, json.
- Maybe it's okay to let autopep8 check all, instead of just check E501. Some other problems are worth addressed. Like changing "x == None" to "x is None", and changing "except:" to "except BaseException:".
- When fail, print clean succinct intuitive user-friendly stack trace. Consider use logging, warning modules.
- Implement auto update detector
- Use optimization mode when packaging to executable file.
- Use executable compression utility to reduce executable size.
- Add README
- Leverage concurrent programming to accelerate network IO. Take inspiration from black and autopep8's code about concurrently formatting multiple files. Use asyncio, multiprocessing, concurrent.futures, threading library.
- Inspect the dependency graph generated from PyInstaller and figure out which third-party library is the the heavy one that takes up most of the size of the generated executable file.
- Experiment shows that applying
pyinstaller --onefile
on an empty Python file yields a 9.7MB executable. Probably this is the minimal executable size generated by PyInstaller. - Read PyInstaller document's section about Advanced Usage.
- Experiment shows that applying
- Use timeit to profile which is more performant: re.fullmatch(r"\d{6}", s) or test numberness of all chars.
- Turn out they don't have much different regarding performance.
- Try some other freeze tools other than pyinstaller. See if they can lead to smaller executable size and smaller executable startup time.
- py2exe, nuitka, cx_freeze, etc.
- Add screenshot pictures to README.
- Don't close immediately after success or failure.
- Push archived executable to GitHub. Since GitHub release page doesn't permit Chinese character name asserts.
- Recompile and archive and publish to old release page.
- Instead of using raw print and raise exception, use logging and warning module to print out more user-friendly messages.
- Add auto workflow to bump version.
- Add executable hash signature in GitHub release page, for security verification.
- Arrange TODO entries into groups with respectively different priority. Streamline workflow.
- Use requests' response.json() sugar shortcut.
- standard library's
atexit
module. - On failure or exception, log message to file instead of printing to bother non-tech-savvy user.
- Use setup.py to install console script.
- Careful about the web request cache. This could lead to outdated information. How to disable web request cache?
- We really need to handle the lengthy startup time of the executable generated by PyInstaller. This is unbearable and detrimental to the user experience.
- Fill more details and instructions to README.
- Compare namedtuple, user-defined class, dict, Enum, dataclass, and attrs library.
- When getting fund info of fund code 519674, a error is raised saying that NoneType has no member 'group'.
- Turn out that Pylance static type checker doesn't do a good job in checking about dataclass. It doesn't signal error when a field is assigned a value of type not the same with the type annotation in dataclass definition. It doesn't signal error when dataclass instance is assigned new property dynamically. It doesn't signal error when a non-existent method is called from a datalcass instance.
- Check whether Pylance suffers similar problems when checking about attrs library.
- Mypy does good.
- Turn out that Pylance is good as well. We just need to turn the configuration term python.analysis.typeCheckingMode from off to strict.
- Move some entries from TODO.md to CHANGELOG.md
- Use color output in console. Use library like colorama, colored, termcolor, blessings.
- Bump to first major release v1.0.0
- Issue: tqdm progress bar is not displayed correctly in some console environment.
- Issue: color code output is not displayed correctly in some console environment.
- Add
--help
output to README's "Usage" section. - Polish the
--help
generated message. - Migrate to Python 3.9
- Some attributes in the typing library are deprecated.
- When CPython 3.9 is released, change
astor.to_source
toast.unparse
. - Reduce overhead of network IO, which is expensive.
- Use requests session feature to leverage connection pool.
- Add retry mechanism ot all occurrences of requests.get across the whole repository.