Skip to content

Latest commit

 

History

History
59 lines (59 loc) · 5.26 KB

CHANGELOG.md

File metadata and controls

59 lines (59 loc) · 5.26 KB
  • 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.
  • 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 to ast.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.