Toolbox module changelog
Jump to a version or snapshot
- 1.5.1.1
- 1.5.1
- 1.5.0.1
- 1.5
- 1.4.6.1
- 1.4.6
- 1.4.5.2
- 1.4.5.1
- 1.4.5
- 1.4.4.1
- 1.4.4
- 1.4.3
- 1.4.2
- 1.4.1
- 1.4
- 1.3.3.1
- 1.3.3
- 1.3.2
- 1.3.1.2
- 1.3.1.1
- 1.3.1
- 1.3.0.1
- 1.3
- 1.2.4.1
- 1.2.4
- 1.2.3
- 1.2.2.1
- 1.2.2
- 1.2.1
- 1.2
- 1.1.7
- 1.1.6
- 1.1.5
- 1.1.4
- 1.1.3
- 1.1.2
- 1.1.1.9
- 1.1.1.8
- 1.1.1.7
- 1.1.1.6
- 1.1.1.5
- 1.1.1.4
- 1.1.1.3
- 1.1.1.2
- 1.1.1.1
- 1.1.1
- 1.1.0.1
- 1.1
- 1.0.11.3
- 1.0.11.2
- 1.0.11.1
- 1.0.11
- 1.0.10.2
- 1.0.10.1
- 1.0.10
- 1.0.9.29
- 1.0.9.28
- 1.0.9.27
- 1.0.9.26
- 1.0.9.24
- 1.0.9.23
- 1.0.9.22
- 1.0.9.21
- 1.0.9.20
- 1.0.9.19
- 1.0.9.18
- 1.0.9.17
- 1.0.9.16
- 1.0.9.15
- 1.0.9.14
- 1.0.9.13
- 1.0.9.12
- 1.0.9.11
- 1.0.9.10
- 1.0.9.9
- 1.0.9.8
- 1.0.9.7
- 1.0.9.6
- 1.0.9.5
- 1.0.9.4
- 1.0.9.3
- 1.0.9.2
- 1.0.9.1
- 1.0.9
- 1.0.8.22
- 1.0.8.21
- 1.0.8.20
- 1.0.8.19
- 1.0.8.18
- 1.0.8.17
- 1.0.8.16
- 1.0.8.14
- 1.0.8.13
- 1.0.8.12
- 1.0.8.11
- 1.0.8.10
- 1.0.8.9
- 1.0.8.8
- 1.0.8.7
- 1.0.8.6
- 1.0.8.5
- 1.0.8.4
- 1.0.8.3
- 1.0.8.2
- 1.0.8.1
- 1.0.8
- 1.0.7.15
- 1.0.7.13
- 1.0.7.12
- 1.0.7.10
- 1.0.7.9
- 1.0.7.8
- 1.0.7.7
- 1.0.7.6
- 1.0.7.5
- 1.0.7.4
- 1.0.7.3
- 1.0.7.2
- 1.0.7.1
- 1.0.7
- 1.0.6.6
- 1.0.6.5
- 1.0.6.4
- 1.0.6.3
- 1.0.6.2
- 1.0.6.1
- 1.0.6
- 1.0.5
- 1.0.4.12
- 1.0.4.11
- 1.0.4.10
- 1.0.4.9
- 1.0.4.8
- 1.0.4.7
- 1.0.4.6
- 1.0.4.4
- 1.0.4.3
- 1.0.4.2
- 1.0.4.1
- 1.0.4
- 1.0.3.5
- 1.0.1.1
Reconstructed history of toolbox, covering 1.0.1.1 through 1.5.1.1, using all 140 available source snapshots and the in-module release notes. There are 142 version entries: 140 preserved versions plus two releases documented only in the notes. Newest versions appear first.
The active module is modules/toolbox.py modules/toolbox.py, as selected by modules.json modules.json. The root toolbox.py toolbox.py is the older 1.0.1.1 baseline. The current in-module changelog ends at 1.0.9.12; this document extends through every older toolbox backup and fills in omitted later patches.
How to read this history
- Snapshot evidence: each preserved version links to its exact source and the preceding available snapshot. Bullets describe observed source changes, informed by the author notes where available. An addition records the first available implementation, not a claim that it was bug-free.
- Author notes: explicit historical claims, performance figures, and release labels are identified where they differ from the code or cannot be independently established. Notes from older snapshots were checked as well as the current notes.
- Gaps: 1.3 and 1.4.5.2 have notes but no source snapshot. Other missing version numbers are not invented. In particular, the interval from 1.0.1.1 to 1.0.3.5 cannot be split into individual releases. Smaller observed gaps include 1.0.4.5, 1.0.7.11, 1.0.7.14, 1.0.8.15, and 1.0.9.25.
- Approximate dates: dates on preserved versions use each source file’s last-modified timestamp, converted to UTC. They are chronological estimates, not confirmed release dates: a timestamp may reflect a later save, backup, or copy rather than initial publication. The two note-only versions are estimated from the surrounding versioned snapshots and explicitly labeled as inferred. This workspace has no usable Git history to confirm release dates.
- Scope: features, behavior changes, fixes, reversions, API removals, meaningful documentation changes, and import-time demo side effects are included. Routine whitespace and unused-import churn are generally omitted. This is a source-based history; historical versions were not imported or executed, and old performance claims were not rebenchmarked.
Compatibility changes to notice
- The old ASN-specific
IpInfo/ReqInfoAPIs disappear by 1.0.3.5. - Mailgun/Twilio send methods change from numeric statuses to response objects in 1.0.7; direct automatic HTTP-error raising is removed there.
AsyncIpInfo.get_ipbecomes an async function in 1.0.8.3.- The temporary CSV
skip_bad_rowsoption is added in 1.0.8.19 and removed in 1.0.8.20. - Session payloads gain client-hint-enriched user-agent dictionaries in 1.2.2, with support for reading older string payloads; secure token generation follows in 1.2.3.
- IP-cache schemas gain timestamps in 1.2.4, with follow-up expiration and cache-loading changes through 1.3.1.2.
plugins.Mailgun.get_stored_email(storage_key), an asynchronous helper for fetching an email already stored by Mailgun using its storage key, is added in 1.4.1 and removed in 1.4.4.- Twilio identity matching returns a parsed
LookupNumbermodel from 1.4.5. - Startup/update behavior changes in 1.5.1 and 1.5.1.1.
Releases
1.5.1.1
Approximate date: 2026-09-12 (snapshot timestamp, UTC).
- Changed direct script execution to call
pmblue_update.self_update(adv_info=True, primary_mod=True). - Restored the ordinary-import call to
pmblue_update.self_update()with default arguments, replacing the explicitadv_info=False, primary_mod=Falsearguments from 1.5.1. Import-time self-updating remains present.
Evidence: Snapshot 1.5.1.1 modules/toolbox.py; compared with 1.5.1 backups/toolbox_1.5.1\n.py.
1.5.1
Approximate date: 2026-09-12 (snapshot timestamp, UTC).
- Added
peyton_day_timestamp,peyton_id_prefix,peyton_id_prefix_to_timestamp,peyton_id, andpeyton_id_securefor timestamp conversion and timestamp-prefixed identifiers, including a secure random-suffix variant. - Added integer conversion helpers
base10_to_base36andbase10_to_base62. - Changed
RandomString.get_alphanumtorandom.choices; streamlinedsecure_get_alphanumwhile retainingsecrets.choice. The author reports nearly 40% faster nonsecure alphanumeric generation; that benchmark was not rerun. - Disabled the eager
aiosqliteObjauto-install fallback when its initial import fails. Changed imported-module self-updating to passadv_info=False, primary_mod=False; 1.5.1.1 restores the call's default arguments.
Evidence: Snapshot 1.5.1 backups/toolbox_1.5.1\n.py; compared with 1.5.0.1 backups/toolbox_1.5.0.1\n.py.
1.5.0.1
Approximate date: 2026-09-12 (snapshot timestamp, UTC).
- No implementation change found relative to 1.5 after excluding the version declaration, release notes, and whitespace. The address-parser speed claim in the notes was revised from more than 2× to more than 4×; this is a documentation change, not a separately verified benchmark.
Evidence: Snapshot 1.5.0.1 backups/toolbox_1.5.0.1\n.py; compared with 1.5 backups/toolbox_1.5\n.py.
1.5
Approximate date: 2026-08-14 (snapshot timestamp, UTC).
- Replaced repeated street-suffix and state-name scans in
Address.parse_addresswithstreet_suffix_lookupandstate_name_lookup. Revised multiple-suffix detection to examine words and the remaining input. - Improved
name_to_normalandconvert_to_normal: reuse lowercase Unicode names, correct number-name handling, handle compound circled numbers, and callisalpha()correctly. Extendedword_to_digitwith tens from thirty through ninety. - Reduced repeated lowercasing in matching routines.
- Added
Matching.Methods.levenshtein_local. The in-module note calls itlevenshtein, but the actual method is namedlevenshtein_local; the existing fuzzy-match functions were not replaced with it. - The current author notes report more than 4× faster address parsing. Historical notes initially said more than 2×; neither claim was independently benchmarked for this changelog.
Evidence: Snapshot 1.5 backups/toolbox_1.5\n.py; compared with 1.4.6.1 backups/toolbox_1.4.6.1\n.py.
1.4.6.1
Approximate date: 2026-08-14 (snapshot timestamp, UTC).
- Commented out an unused regex assignment in the disabled demonstration block. No library behavior change found.
Evidence: Snapshot 1.4.6.1 backups/toolbox_1.4.6.1\n.py; compared with 1.4.6 backups/toolbox_1.4.6\n.py.
1.4.6
Approximate date: 2026-08-03 (snapshot timestamp, UTC).
- Added the
bot6user-agent format for ClaudeBot-style compatible strings, included it in format selection, and treatedos == "crawler"as a bot. - Broadened bot-format selection to strings containing
bot. - First available snapshot containing deferred
urllib3andconcurrent.futuresimports; the author assigns that import change to 1.4.5.2.
Evidence: Snapshot 1.4.6 backups/toolbox_1.4.6\n.py; compared with 1.4.5.1 backups/toolbox_1.4.5.1\n.py.
1.4.5.2
Approximate date: 2026-08-03 (inferred from the 1.4.5.1 and 1.4.6 snapshot timestamps).
- Author notes only: deferred
urllib3andconcurrent.futuresimports withDelayModuleLoadto reduce startup time. No snapshot with this declared version exists; the change is visible between 1.4.5.1 and 1.4.6.
Evidence: In-module release notes modules/toolbox.py; no matching snapshot.
1.4.5.1
Approximate date: 2026-08-03 (snapshot timestamp, UTC).
- Added
LookupNumber.LineStatus.is_line_active, returning true for active/reachable, false for inactive/unreachable, andNonefor errors or unknown states. - Added the
lookup_fieldsalias forrequested_fieldsand delegatedTwilio.is_line_activeto the response model property.
Evidence: Snapshot 1.4.5.1 backups/toolbox_1.4.5.1\n.py; compared with 1.4.5 backups/toolbox_1.4.5\n.py.
1.4.5
Approximate date: 2026-07-27 (snapshot timestamp, UTC).
- Added
Twilio.lookup, lookup-field normalization, and aLookupNumberresponse model extendingPhoneNumber, with caller-name, identity-match, line-status, and line-type-intelligence models plus access to the raw response. - Extended
identity_matchwithlookup_fieldsand arbitrary**params, routing it throughlookup. Corrected address query keys toCity,State, andPostalCode. - Added
line_statusandis_line_active. Identity-match calls now return the parsed lookup model rather than only the rawAiohttpResponse.
Evidence: Snapshot 1.4.5 backups/toolbox_1.4.5\n.py; compared with 1.4.4.1 backups/toolbox_1.4.4.1\n.py.
1.4.4.1
Approximate date: 2026-07-27 (snapshot timestamp, UTC).
- Added
Address.postal_codeas an alias forzip, supplying the property used by Twilio identity matching.
Evidence: Snapshot 1.4.4.1 backups/toolbox_1.4.4.1\n.py; compared with 1.4.4 backups/toolbox_1.4.4\n.py.
1.4.4
Approximate date: 2026-07-27 (snapshot timestamp, UTC).
- Added
Time.date_formats,Time.parse_date, and_DatetimeParser.compile_formats; skipped unused placeholders and deduplicated compiled format strings. The snapshot'sparse_datecalls those strings as functions and catches the resulting exceptions, so the addition should not be read as proof of working date parsing. - Corrected
Time.yearfrom 365 weeks to 365 days. - Added
Twilio.identity_matchwith name, address, and date-of-birth parameters. SMS destination and explicitly supplied sender normalization now usePhoneNumber.e164. - Removed
plugins.Mailgun.get_stored_email(storage_key), the asynchronous stored-message retrieval helper introduced in 1.4.1. It fetched an existing Mailgun message by storage key and returned anAiohttpResponse; this removal is absent from the current in-module notes. - Added explicit UTF-8 encoding to CSV file opens, including binary-mode calls. The latter pass an encoding with
rb, so this snapshot change is not a verified binary-read fix.
Evidence: Snapshot 1.4.4 backups/toolbox_1.4.4\n.py; compared with 1.4.3 backups/toolbox_1.4.3\n.py.
1.4.3
Approximate date: 2026-07-27 (snapshot timestamp, UTC).
- Added
Mailgun.send_email(archive_to=...)and constructor-leveldefault_archive_to; sends the archive destination through theo:archive-toparameter.
Evidence: Snapshot 1.4.3 backups/toolbox_1.4.3\n.py; compared with 1.4.2 backups/toolbox_1.4.2\n.py.
1.4.2
Approximate date: 2026-06-22 (snapshot timestamp, UTC).
- Expanded
FileInfoto accept strings, bytes, andos.PathLikepaths as well as directory entries. - Replaced directory enumeration in
scan_for_filewith a direct existence check andFileInfo(file), returningNonefor a missing path. The author reports faster scanning; no benchmark was rerun.
Evidence: Snapshot 1.4.2 backups/toolbox_1.4.2\n.py; compared with 1.4.1 backups/toolbox_1.4.1\n.py.
1.4.1
Approximate date: 2026-06-19 (snapshot timestamp, UTC).
- Added
plugins.Mailgun.get_stored_email(storage_key), an asynchronous helper for retrieving an email already stored by Mailgun. It converted the supplied storage key to a string, URL-encoded it, and issued a GET tohttps://api.mailgun.net/v3/domains/{self.domain}/messages/{storage_key}using HTTP Basic authentication with usernameapiand the instance's API key. - Returned the
AiohttpResponsedirectly, allowing callers to inspect the status and read.textor.json(). The method did not itself archive emails, send messages, or automatically callraise_for_status(). An older in-module note records the addition; the current note is blank. Removed again in 1.4.4.
Evidence: Snapshot 1.4.1 backups/toolbox_1.4.1\n.py; compared with 1.4 backups/toolbox_1.4\n.py.
1.4
Approximate date: 2026-06-18 (snapshot timestamp, UTC).
- Added
AttrDict, a dictionary wrapper exposing attribute access, item operations, andget. This records the API's introduction, not a runtime validation of the original implementation.
Evidence: Snapshot 1.4 backups/toolbox_1.4\n.py; compared with 1.3.3.1 backups/toolbox_1.3.3.1\n.py.
1.3.3.1
Approximate date: 2026-06-02 (snapshot timestamp, UTC).
- Fixed
SortedList.__contains__to useself.dinstead of an undefinedd. - Cached the midpoint sort key during insertion rather than recomputing it for each comparison.
- Changed
DataInfo.sd_devto usemath.sqrtand removed the standalonesqrtimport.
Evidence: Snapshot 1.3.3.1 backups/toolbox_1.3.3.1\n.py; compared with 1.3.3 backups/toolbox_1.3.3\n.py.
1.3.3
Approximate date: 2026-05-21 (snapshot timestamp, UTC).
- Added
CSVReader.basic_read(..., by_line=None)and a line-iteration path for larger file objects, avoiding a whole-file text read on that path. Automatic selection uses a 500,000-byte file-size threshold. - The original implementation overwrites
by_linewhile examining file objects and still accumulates parsed rows; this is not a guarantee of a forced streaming mode or constant total memory use.
Evidence: Snapshot 1.3.3 backups/toolbox_1.3.3\n.py; compared with 1.3.2 backups/toolbox_1.3.2\n.py.
1.3.2
Approximate date: 2026-05-21 (snapshot timestamp, UTC).
- Set
max_field_size=32768on theaiohttp.ClientSessionused bydownload_file_asyncto accommodate larger response header fields. The author note describes this as an AiohttpResponse change; the actual changed call is in the download helper.
Evidence: Snapshot 1.3.2 backups/toolbox_1.3.2\n.py; compared with 1.3.1.2 backups/toolbox_1.3.1.2\n.py.
1.3.1.2
Approximate date: 2026-05-21 (snapshot timestamp, UTC).
- Corrected loaded-SQLite IP-cache initialization to delete stale rows using each row's IP, continue past invalid timestamps, load valid rows into the cache, and return only the requested IP.
- Extended
word_to_digitthrough twenty and removed the specialAMPERSANDbranch fromname_to_normal. - Adjusted
Matching.matchwildcard preprocessing so positions containing an asterisk in either input become asterisks in both comparison strings.
Evidence: Snapshot 1.3.1.2 backups/toolbox_1.3.1.2\n.py; compared with 1.3.1.1 backups/toolbox_1.3.1.1\n.py.
1.3.1.1
Approximate date: 2026-05-21 (snapshot timestamp, UTC).
- No implementation change found relative to 1.3.1 after excluding the version declaration, release notes, and whitespace.
Evidence: Snapshot 1.3.1.1 backups/toolbox_1.3.1.1\n.py; compared with 1.3.1 backups/toolbox_1.3.1\n.py.
1.3.1
Approximate date: 2026-05-20 (snapshot timestamp, UTC).
- Fixed synchronous and asynchronous IP lookups to use the
ip_listproperty, ensuring lazy cache initialization before.get(...).
Evidence: Snapshot 1.3.1 backups/toolbox_1.3.1\n.py; compared with 1.3.0.1 backups/toolbox_1.3.0.1\n.py.
1.3.0.1
Approximate date: 2026-05-20 (snapshot timestamp, UTC).
- First preserved snapshot of
CacheList: bounded insertion-order storage, keyed lookup, custom stringification, add/remove/pop, iteration, and indexing. Migrated IP-cache code to use it. - Expanded async SQLite cache expiration checks and removal of invalid or stale rows, including the loaded-cache path. Further initialization and row-selection fixes follow in 1.3.1 and 1.3.1.2.
- Changed
Unique.__iter__to return an independent iterator instead of storing iteration state on the collection. - Added
Version.__le__andVersion.__ge__. - The author groups the main cache changes under 1.3; without a 1.3 snapshot, their exact split between 1.3 and 1.3.0.1 cannot be recovered.
Evidence: Snapshot 1.3.0.1 backups/toolbox_1.3.0.1\n.py; compared with 1.2.4.1 backups/toolbox_1.2.4.1\n.py.
1.3
Approximate date: 2026-05-20 (inferred from the 1.2.4.1 and 1.3.0.1 snapshot timestamps).
- Author notes only: introduced
CacheListfor indexed lookups, adopted it inIpInfoandAsyncIpInfo, and extended expiration support for the loaded SQLite cache. First preserved implementation is 1.3.0.1. - Earlier notes called this cache type 3; the source defines loaded SQLite as cache type 2. The current note removes that erroneous number.
Evidence: In-module release notes modules/toolbox.py; no matching snapshot.
1.2.4.1
Approximate date: 2026-05-20 (snapshot timestamp, UTC).
- Set the nonloaded SQLite cache timestamp column's default to zero; changed the index-creation version check from
>= 1.1.3to> 1.1.2. - Added deletion of rows with null timestamps in that loading path. Later 1.3-series changes further refine invalid-timestamp handling.
Evidence: Snapshot 1.2.4.1 backups/toolbox_1.2.4.1\n.py; compared with 1.2.4 backups/toolbox_1.2.4\n.py.
1.2.4
Approximate date: 2026-05-20 (snapshot timestamp, UTC).
- Added timestamps to
AsyncIpInfoobjects, serialized data, and cache schemas, plus configurableexpires_after = 604800seconds (one week). - Introduced SQLite expiration checks and conditional creation of a unique IP index with newer
aiosqliteObjversions. The loaded-cache implementation receives follow-up work in the 1.3 series. - Also changed CSV timestamp storage and old-cache handling, but the author limits the stated expiration support to SQLite cache types 1 and 2; do not infer reliable CSV expiration from these additions.
- An early note says 30 days; the actual snapshot constant and corrected current note say one week.
Evidence: Snapshot 1.2.4 backups/toolbox_1.2.4\n.py; compared with 1.2.3 backups/toolbox_1.2.3\n.py.
1.2.3
Approximate date: 2026-05-20 (snapshot timestamp, UTC).
- Added
RandomString.secure_get,secure_get_alpha,secure_get_num, andsecure_get_alphanum, usingsecrets.choice. - Changed user-session token creation to the secure alphanumeric generator.
Evidence: Snapshot 1.2.3 backups/toolbox_1.2.3\n.py; compared with 1.2.2.1 backups/toolbox_1.2.2.1\n.py.
1.2.2.1
Approximate date: 2026-05-20 (snapshot timestamp, UTC).
- Fixed modern iPhone Safari user-agent parsing with a dedicated regex handling both
CPU OSandCPU iPhone OS, avoiding fallback to the generic library format.
Evidence: Snapshot 1.2.2.1 backups/toolbox_1.2.2.1\n.py; compared with 1.2.2 backups/toolbox_1.2.2\n.py.
1.2.2
Approximate date: 2026-05-19 (snapshot timestamp, UTC).
- Allowed
UserAgent.from_requestto accept an existingStandardRequestwithout wrapping it again. - Persisted client-hint-enriched user-agent data in session payloads and restored it when loading sessions, retaining compatibility with older raw-string payloads.
- Used the same request parsing for session creation and validation; compared device strings only when both are sufficiently informative. This addresses Android session mismatches caused by inconsistent client-hint handling.
Evidence: Snapshot 1.2.2 backups/toolbox_1.2.2\n.py; compared with 1.2.1 backups/toolbox_1.2.1\n.py.
1.2.1
Approximate date: 2026-04-23 (snapshot timestamp, UTC).
- Expanded
UserAgent.from_requestto collect model, platform, platform version, mobile, browser full-version/list, architecture, bitness, WoW64, and form-factor hints. - Added case-insensitive header lookup, hint cleanup, Android model resolution, platform mapping, and browser-version fallback selection.
- Changed session validation to use
from_requestand reject requests without a usable user-agent result. Consistent persistence of the enriched values follows in 1.2.2.
Evidence: Snapshot 1.2.1 backups/toolbox_1.2.1\n.py; compared with 1.2 backups/toolbox_1.2\n.py.
1.2
Approximate date: 2026-04-22 (snapshot timestamp, UTC).
- Added
UserAgent.from_request, initially usingSec-CH-UA-Modelto supplement missing or weak device identification, including Android model lookup and Amazon Fire OS identification.
Evidence: Snapshot 1.2 backups/toolbox_1.2\n.py; compared with 1.1.7 backups/toolbox_1.1.7\n.py.
1.1.7
Approximate date: 2026-04-22 (snapshot timestamp, UTC).
- Added the
bot5format forname (+url)user agents and included additional bot formats inis_botchecks and format selection.
Evidence: Snapshot 1.1.7 backups/toolbox_1.1.7\n.py; compared with 1.1.6 backups/toolbox_1.1.6\n.py.
1.1.6
Approximate date: 2026-04-22 (snapshot timestamp, UTC).
- Added
Address.to_dictand itsget_dictalias, exposing address1, address2, city, state, and ZIP fields.
Evidence: Snapshot 1.1.6 backups/toolbox_1.1.6\n.py; compared with 1.1.5 backups/toolbox_1.1.5\n.py.
1.1.5
Approximate date: 2026-04-09 (snapshot timestamp, UTC).
- Allowed
ActionQueue.create_actionactivation values to bedatetime.date(midnight of that date) ordatetime.timedelta(relative to the current epoch time).
Evidence: Snapshot 1.1.5 backups/toolbox_1.1.5\n.py; compared with 1.1.4 backups/toolbox_1.1.4\n.py.
1.1.4
Approximate date: 2026-03-23 (snapshot timestamp, UTC).
- Handled duplicate-IP unique-constraint errors when inserting into both async SQLite cache modes, while re-raising other database operation errors.
Evidence: Snapshot 1.1.4 backups/toolbox_1.1.4\n.py; compared with 1.1.3 backups/toolbox_1.1.3\n.py.
1.1.3
Approximate date: 2026-03-23 (snapshot timestamp, UTC).
- Made
UserAgent.Versiontolerate nonnumeric or empty major-version components and version strings with four or more components. - Updated the disabled user-agent test/demo code to report parsing failures.
Evidence: Snapshot 1.1.3 backups/toolbox_1.1.3\n.py; compared with 1.1.2 backups/toolbox_1.1.2\n.py.
1.1.2
Approximate date: 2026-03-12 (snapshot timestamp, UTC).
- Extended
format_numberto attempt integer or float conversion for string inputs before formatting.
Evidence: Snapshot 1.1.2 backups/toolbox_1.1.2\n.py; compared with 1.1.1.9 backups/toolbox_1.1.1.9\n.py.
1.1.1.9
Approximate date: 2026-03-03 (snapshot timestamp, UTC).
- Uppercased two-character state values after address correction and normalized early street-direction abbreviations SW, NW, SE, and NE in parsed addresses.
Evidence: Snapshot 1.1.1.9 backups/toolbox_1.1.1.9\n.py; compared with 1.1.1.8 backups/toolbox_1.1.1.8\n.py.
1.1.1.8
Approximate date: 2026-01-23 (snapshot timestamp, UTC).
- Tightened street-suffix matching to include surrounding spaces when splitting street and secondary-address fields, reducing matches inside longer words. Added a leading-space requirement when counting suffix candidates.
Evidence: Snapshot 1.1.1.8 backups/toolbox_1.1.1.8\n.py; compared with 1.1.1.7 backups/toolbox_1.1.1.7\n.py.
1.1.1.7
Approximate date: 2026-01-23 (snapshot timestamp, UTC).
- Treated both actual
Noneand the string"None"as missing state values in the three-part address path, preventing later length checks on a missing state there.
Evidence: Snapshot 1.1.1.7 backups/toolbox_1.1.1.7\n.py; compared with 1.1.1.6 backups/toolbox_1.1.1.6\n.py.
1.1.1.6
Approximate date: 2026-01-23 (snapshot timestamp, UTC).
- Removed an unguarded CSV demonstration that read
testing.csvand printed addresses on import. - The author assigns the enclosed-field comma fix to this release, but the implementation change is already present in 1.1.1.5.
Evidence: Snapshot 1.1.1.6 backups/toolbox_1.1.1.6\n.py; compared with 1.1.1.5 backups/toolbox_1.1.1.5\n.py.
1.1.1.5
Approximate date: 2026-01-23 (snapshot timestamp, UTC).
- Fixed
CSVReader.readto append commas within enclosed fields to the current field buffer (s) instead of the overall input (txt). - Removed unused imports. Added an unguarded CSV demonstration, removed in 1.1.1.6.
Evidence: Snapshot 1.1.1.5 backups/toolbox_1.1.1.5\n.py; compared with 1.1.1.4 backups/toolbox_1.1.1.4\n.py.
1.1.1.4
Approximate date: 2026-01-23 (snapshot timestamp, UTC).
- Uppercased two-letter state abbreviations during address parsing.
- Improved case-insensitive street/secondary-field splitting and moved likely city text out of the secondary-address field when street and city were combined.
- Added an internal
reparseflag to regenerate normalized address text after corrections; it is not a new public constructor argument.
Evidence: Snapshot 1.1.1.4 backups/toolbox_1.1.1.4\n.py; compared with 1.1.1.3 backups/toolbox_1.1.1.3\n.py.
1.1.1.3
Approximate date: 2026-01-23 (snapshot timestamp, UTC).
- Added
Address.zip_codeas an alias forzip. The author also listsstreet2here, though that property first appears in 1.1.1.2.
Evidence: Snapshot 1.1.1.3 backups/toolbox_1.1.1.3\n.py; compared with 1.1.1.2 backups/toolbox_1.1.1.2\n.py.
1.1.1.2
Approximate date: 2026-01-23 (snapshot timestamp, UTC).
- Added
Address.street2as an alias foraddress2.
Evidence: Snapshot 1.1.1.2 backups/toolbox_1.1.1.2\n.py; compared with 1.1.1.1 backups/toolbox_1.1.1.1\n.py.
1.1.1.1
Approximate date: 2026-01-23 (snapshot timestamp, UTC).
- Expanded
make_json_parsableto attempt recursive conversion of iterable and mapping-like objects, stringifying mapping keys and retaining fallback handling when conversion fails.
Evidence: Snapshot 1.1.1.1 backups/toolbox_1.1.1.1\n.py; compared with 1.1.1 backups/toolbox_1.1.1\n.py.
1.1.1
Approximate date: 2025-11-06 (snapshot timestamp, UTC).
- Added
format_nameto trim surrounding spaces/commas, discard empty name parts, capitalize all-uppercase words, and uppercase the initial of mixed-case words while preserving their remaining case.
Evidence: Snapshot 1.1.1 backups/toolbox_1.1.1\n.py; compared with 1.1.0.1 backups/toolbox_1.1.0.1\n.py.
1.1.0.1
Approximate date: 2025-10-29 (snapshot timestamp, UTC).
- Added explanatory docstrings to
Matching.withinandMatching.fuzzy_within. No implementation change found.
Evidence: Snapshot 1.1.0.1 backups/toolbox_1.1.0.1\n.py; compared with 1.1 backups/toolbox_1.1\n.py.
1.1
Approximate date: 2025-10-21 (snapshot timestamp, UTC).
- Imported normalization and matching functionality from
normalize.py:word_to_digit,name_to_normal,convert_to_normal,convert_to_single_letters,equivilency_convert, and related replacement helpers. - Added
MatchingandMatching.Settingsfor normalized, phonetic, wildcard, fuzzy, and containment comparisons.
Evidence: Snapshot 1.1 backups/toolbox_1.1\n.py; compared with 1.0.11.3 backups/toolbox_1.0.11.3\n.py.
1.0.11.3
Approximate date: 2025-10-20 (snapshot timestamp, UTC).
- Required at least five digits before treating a long state field as combined state and ZIP text.
- Moved repeated-comma cleanup into
Address.parse_addressand removed the additional cached parsed-address assignment from 1.0.11.2. The author summarizes this release as combined state/ZIP parsing; the work begins in 1.0.11.1.
Evidence: Snapshot 1.0.11.3 backups/toolbox_1.0.11.3\n.py; compared with 1.0.11.2 backups/toolbox_1.0.11.2\n.py.
1.0.11.2
Approximate date: 2025-10-02 (snapshot timestamp, UTC).
- Regenerated the cached parsed address when separating combined state/ZIP text. This specific assignment is removed in 1.0.11.3 as normalization is adjusted.
Evidence: Snapshot 1.0.11.2 backups/toolbox_1.0.11.2\n.py; compared with 1.0.11.1 backups/toolbox_1.0.11.1\n.py.
1.0.11.1
Approximate date: 2025-10-02 (snapshot timestamp, UTC).
- Expanded correction of shifted address fields to recognize full state names as well as two-letter abbreviations.
- Added extraction of state and ZIP from a combined state field and collapsed repeated commas in the
parsed_addressproperty.
Evidence: Snapshot 1.0.11.1 backups/toolbox_1.0.11.1\n.py; compared with 1.0.11 backups/toolbox_1.0.11\n.py.
1.0.11
Approximate date: 2025-10-02 (snapshot timestamp, UTC).
- Corrected the picosecond multiplier in
format_time_secfrom 10^9 to 10^12 and adjusted picosecond/nanosecond thresholds. - Replaced
split_multiwith an escaped-regex implementation supporting multiple delimiters and longest-delimiter-first matching;splitnow uses nativestr.splitfor case-sensitive input and regex for case-insensitive input. - Retained previous implementations as
split_oldandsplit_multi_old; adjusted the latter to preserve remaining input when the split limit is reached. - Author-reported speedups are 20–80× for
split_multiand 200–800× forsplit, with expected benefits to non-regexTxtParser. These are historical claims, not newly measured results.
Evidence: Snapshot 1.0.11 backups/toolbox_1.0.11\n.py; compared with 1.0.10.2 backups/toolbox_1.0.10.2\n.py.
1.0.10.2
Approximate date: 2025-10-01 (snapshot timestamp, UTC).
- Caught invalid regex compilation in
TxtParserand fell back to its non-regex parsing path when no compiled pattern is available.
Evidence: Snapshot 1.0.10.2 backups/toolbox_1.0.10.2\n.py; compared with 1.0.10.1 backups/toolbox_1.0.10.1\n.py.
1.0.10.1
Approximate date: 2025-09-30 (snapshot timestamp, UTC).
- Removed unguarded address-parsing demonstrations and their import-time output.
- The author describes improved address correction and extra-comma handling here; those implementation changes first appear in the preserved 1.0.9.29 snapshot and remain in this release.
Evidence: Snapshot 1.0.10.1 backups/toolbox_1.0.10.1\n.py; compared with 1.0.10 backups/toolbox_1.0.10\n.py.
1.0.10
Approximate date: 2025-09-30 (snapshot timestamp, UTC).
- No implementation change found relative to 1.0.9.29 after excluding the version declaration, release notes, and whitespace.
Evidence: Snapshot 1.0.10 backups/toolbox_1.0.10\n.py; compared with 1.0.9.29 backups/toolbox_1.0.9.29\n.py.
1.0.9.29
Approximate date: 2025-09-30 (snapshot timestamp, UTC).
- Expanded address parsing for short strings with extra commas, limiting the five-field split and trimming trailing ZIP fragments.
- Added correction of shifted city/state/ZIP fields when a secondary field occupies the city position and ZIP is missing.
- Added unguarded address examples that print on import; removed in 1.0.10.1.
Evidence: Snapshot 1.0.9.29 backups/toolbox_1.0.9.29\n.py; compared with 1.0.9.28 backups/toolbox_1.0.9.28\n.py.
1.0.9.28
Approximate date: 2025-09-30 (snapshot timestamp, UTC).
- Removed the unguarded address example introduced in 1.0.9.27.
- The author assigns the multiple-suffix condition fix to this release; the changed condition is already present in 1.0.9.27.
Evidence: Snapshot 1.0.9.28 backups/toolbox_1.0.9.28\n.py; compared with 1.0.9.27 backups/toolbox_1.0.9.27\n.py.
1.0.9.27
Approximate date: 2025-09-30 (snapshot timestamp, UTC).
- Corrected the multiple-suffix branch condition in
Address.parse_addressfromsuffix_count < 1tosuffix_count > 1. - Added an unguarded address example and print, removed in 1.0.9.28.
Evidence: Snapshot 1.0.9.27 backups/toolbox_1.0.9.27\n.py; compared with 1.0.9.26 backups/toolbox_1.0.9.26\n.py.
1.0.9.26
Approximate date: 2025-09-30 (snapshot timestamp, UTC).
- Added suffix counting and look-ahead while parsing streets with multiple suffix-like words, such as “Boynton Beach Blvd”. This is first observed since 1.0.9.24; no 1.0.9.25 snapshot is available. A branch-condition correction follows in 1.0.9.27.
Evidence: Snapshot 1.0.9.26 backups/toolbox_1.0.9.26\n.py; compared with 1.0.9.24 backups/toolbox_1.0.9.24\n.py.
1.0.9.24
Approximate date: 2025-09-30 (snapshot timestamp, UTC).
- Added an early address-equality rejection when only one side has a missing primary street field.
Evidence: Snapshot 1.0.9.24 backups/toolbox_1.0.9.24\n.py; compared with 1.0.9.23 backups/toolbox_1.0.9.23\n.py.
1.0.9.23
Approximate date: 2025-08-28 (snapshot timestamp, UTC).
- Added three-part address parsing for strings with two commas and no separate secondary-address field. Added inference when the last part is a ZIP or the middle part is a state.
Evidence: Snapshot 1.0.9.23 backups/toolbox_1.0.9.23\n.py; compared with 1.0.9.22 backups/toolbox_10922\n.py.
1.0.9.22
Approximate date: 2025-08-28 (snapshot timestamp, UTC).
- Added cached
Address._state_match_list, containing state names and abbreviations. - Trimmed fields and detected four-part addresses missing a ZIP rather than always assuming a missing secondary-address field.
- Added local-variable cleanup in CSV parsing and the legacy download path. This snapshot has the unusual filename
toolbox_10922\n.py, but declares version 1.0.9.22 internally.
Evidence: Snapshot 1.0.9.22 backups/toolbox_10922\n.py; compared with 1.0.9.21 backups/toolbox_1.0.9.21\n.py.
1.0.9.21
Approximate date: 2025-08-27 (snapshot timestamp, UTC).
- No implementation change found relative to 1.0.9.20 after excluding the version declaration, release notes, and whitespace. The author records the
forgivingCSV option here; it is already implemented in 1.0.9.20.
Evidence: Snapshot 1.0.9.21 backups/toolbox_1.0.9.21\n.py; compared with 1.0.9.20 backups/toolbox_1.0.9.20\n.py.
1.0.9.20
Approximate date: 2025-08-26 (snapshot timestamp, UTC).
- Added
CSVReader.basic_read(..., forgiving=False), attempting to repair mismatched rows, pad missing fields, or trim excess fields when enabled. This records the added recovery logic, not a guarantee that every malformed-row branch works.
Evidence: Snapshot 1.0.9.20 backups/toolbox_1.0.9.20\n.py; compared with 1.0.9.19 backups/toolbox_1.0.9.19\n.py.
1.0.9.19
Approximate date: 2025-08-26 (snapshot timestamp, UTC).
- Added an SSL-error fallback to
download_fileusing a custom Requests adapter and SSL context enabling legacy-server connections.
Evidence: Snapshot 1.0.9.19 backups/toolbox_1.0.9.19\n.py; compared with 1.0.9.18 backups/toolbox_1.0.9.18\n.py.
1.0.9.18
Approximate date: 2025-08-26 (snapshot timestamp, UTC).
- Adjusted non-strict CSV parsing to skip otherwise unhandled characters outside quoted fields.
- Removed the unconditional JSON-queue save added in 1.0.9.17.
Evidence: Snapshot 1.0.9.18 backups/toolbox_1.0.9.18\n.py; compared with 1.0.9.17 backups/toolbox_1.0.9.17\n.py.
1.0.9.17
Approximate date: 2025-08-26 (snapshot timestamp, UTC).
- Initialized JSON-backed queues whenever
queued_itemsis absent, rather than only when the entire database is empty. - Added an immediate save after initialization; removed again in 1.0.9.18.
Evidence: Snapshot 1.0.9.17 backups/toolbox_1.0.9.17\n.py; compared with 1.0.9.16 backups/toolbox_1.0.9.16\n.py.
1.0.9.16
Approximate date: 2025-08-26 (snapshot timestamp, UTC).
- Initialized an empty JSON queue database with
queued_items = []. Follow-up handling for nonempty databases missing that key arrives in 1.0.9.17.
Evidence: Snapshot 1.0.9.16 backups/toolbox_1.0.9.16\n.py; compared with 1.0.9.15 backups/toolbox_1.0.9.15\n.py.
1.0.9.15
Approximate date: 2025-08-26 (snapshot timestamp, UTC).
- Added awaitable
ActionQueue.runand changed its background loop towhile True. - Made the initial
download_file_asyncprogress message obeyverbose, matching the other progress output.
Evidence: Snapshot 1.0.9.15 backups/toolbox_1.0.9.15\n.py; compared with 1.0.9.14 backups/toolbox_1.0.9.14\n.py.
1.0.9.14
Approximate date: 2025-08-26 (snapshot timestamp, UTC).
- Repaired chunk construction, handled empty input, used a global header-derived row width, and preserved chunk order in
CSVReader.basic_read_threaded. - Despite its name and the author note saying “thread pool”, the implementation uses
ProcessPoolExecutor.
Evidence: Snapshot 1.0.9.14 backups/toolbox_1.0.9.14\n.py; compared with 1.0.9.13 backups/toolbox_1.0.9.13\n.py.
1.0.9.13
Approximate date: 2025-08-26 (snapshot timestamp, UTC).
- Reworked
CSVReader.basic_read_threadedaroundProcessPoolExecutor, extracted a chunk parser, and addedmax_workers, defaulting to the CPU count. The initial chunk loop references undefinedn; 1.0.9.14 repairs it. - Passed the selected separator into
_parse_rowfrombasic_read.
Evidence: Snapshot 1.0.9.13 backups/toolbox_1.0.9.13\n.py; compared with 1.0.9.12 backups/toolbox_1.0.9.12\n.py.
1.0.9.12
Approximate date: 2025-08-26 (snapshot timestamp, UTC).
- Improved street-suffix normalization and ZIP cleanup, reducing sufficiently long numeric ZIP strings to five digits and dropping invalid short ones.
- Added comparison without ZIP when either address lacks one, with a cached
compare_addressvalue. - This is the oldest entry in the current in-module changelog; all earlier sections below are reconstructed from snapshots.
Evidence: Snapshot 1.0.9.12 backups/toolbox_1.0.9.12\n.py; compared with 1.0.9.11 backups/toolbox_1.0.9.11\n.py.
1.0.9.11
Approximate date: 2025-08-25 (snapshot timestamp, UTC).
- Added cached
Address.address2_intand compared existing fields directly rather than constructing two extraAddressobjects for normalized equality checks.
Evidence: Snapshot 1.0.9.11 backups/toolbox_1.0.9.11\n.py; compared with 1.0.9.10 backups/toolbox-1.0.9.10.py.
1.0.9.10
Approximate date: 2025-07-17 (snapshot timestamp, UTC).
- Adjusted address parsing to skip blank segments and recognize state abbreviations encountered while parsing city text, advancing the field position accordingly.
Evidence: Snapshot 1.0.9.10 backups/toolbox-1.0.9.10.py; compared with 1.0.9.9 backups/toolbox-1.0.9.9.py.
1.0.9.9
Approximate date: 2025-07-17 (snapshot timestamp, UTC).
- Refined address equality to distinguish missing secondary addresses and compare numeric secondary-address components after normalized-address comparison.
Evidence: Snapshot 1.0.9.9 backups/toolbox-1.0.9.9.py; compared with 1.0.9.8 backups/toolbox-1.0.9.8.py.
1.0.9.8
Approximate date: 2025-07-17 (snapshot timestamp, UTC).
- Added state/territory names and street-suffix abbreviation tables.
- Expanded
Addresswithcorrect_addressandparse_addressoptions, normalized parsing, cached parsed text, four-part address support, and correction that splits secondary details after a street suffix. - Changed equality from direct raw-field comparison to normalized address comparison and omitted a missing secondary address from string output.
Evidence: Snapshot 1.0.9.8 backups/toolbox-1.0.9.8.py; compared with 1.0.9.7 backups/toolbox-1.0.9.7.py.
1.0.9.7
Approximate date: 2025-07-17 (snapshot timestamp, UTC).
- Moved deletion of
row_txtuntil after CSV row-repair logic, allowing that logic to reuse the original row text.
Evidence: Snapshot 1.0.9.7 backups/toolbox-1.0.9.7.py; compared with 1.0.9.6 backups/toolbox-1.0.9.6.py.
1.0.9.6
Approximate date: 2025-07-16 (snapshot timestamp, UTC).
- No implementation change found relative to 1.0.9.5 after excluding the version declaration, release notes, and whitespace.
Evidence: Snapshot 1.0.9.6 backups/toolbox-1.0.9.6.py; compared with 1.0.9.5 backups/toolbox-1.0.9.5.py.
1.0.9.5
Approximate date: 2025-07-16 (snapshot timestamp, UTC).
- Added
_parse_row(..., strict=True)and retried mismatched rows withstrict=Falseinbasic_read, accepting the recovered row only when its width matches the expected width.
Evidence: Snapshot 1.0.9.5 backups/toolbox-1.0.9.5.py; compared with 1.0.9.4 backups/toolbox-1.0.9.4.py.
1.0.9.4
Approximate date: 2025-07-16 (snapshot timestamp, UTC).
- Guarded a look-ahead in malformed quoted-row recovery to avoid reading beyond the last character.
Evidence: Snapshot 1.0.9.4 backups/toolbox-1.0.9.4.py; compared with 1.0.9.3 backups/toolbox-1.0.9.3.py.
1.0.9.3
Approximate date: 2025-07-16 (snapshot timestamp, UTC).
- Removed the remaining per-row CSV debug print.
Evidence: Snapshot 1.0.9.3 backups/toolbox-1.0.9.3.py; compared with 1.0.9.2 backups/toolbox-1.0.9.2.py.
1.0.9.2
Approximate date: 2025-07-16 (snapshot timestamp, UTC).
- Removed per-character CSV debug output introduced in 1.0.9.1.
Evidence: Snapshot 1.0.9.2 backups/toolbox-1.0.9.2.py; compared with 1.0.9.1 backups/toolbox-1.0.9.1.py.
1.0.9.1
Approximate date: 2025-07-16 (snapshot timestamp, UTC).
- Added configurable
chunk_sizeto synchronousdownload_file. - Reworked handling of unexpected quotes in
_parse_row, including a recovery branch after an already closed enclosure. Added temporary per-character and per-row diagnostic prints, removed over the next two releases.
Evidence: Snapshot 1.0.9.1 backups/toolbox-1.0.9.1.py; compared with 1.0.9 backups/toolbox-1.0.9.py.
1.0.9
Approximate date: 2025-07-16 (snapshot timestamp, UTC).
- Added
download_filefor synchronous streamed downloads anddownload_file_asyncfor asynchronous chunked downloads, optional progress output, and optional gzip output. - Added the gzip dependency and removed an unused direct Requests import.
Evidence: Snapshot 1.0.9 backups/toolbox-1.0.9.py; compared with 1.0.8.22 backups/toolbox-1.0.8.22.py.
1.0.8.22
Approximate date: 2025-07-15 (snapshot timestamp, UTC).
- Changed
ListTablerow-width mismatches from an immediate exception to a diagnostic print; shorter rows are padded with empty strings.
Evidence: Snapshot 1.0.8.22 backups/toolbox-1.0.8.22.py; compared with 1.0.8.21 backups/toolbox-1.0.8.21.py.
1.0.8.21
Approximate date: 2025-07-11 (snapshot timestamp, UTC).
- Padded short rows in the then-current threaded CSV parser using the width of the first row in each chunk.
Evidence: Snapshot 1.0.8.21 backups/toolbox-1.0.8.21.py; compared with 1.0.8.20 backups/toolbox-1.0.8.20.py.
1.0.8.20
Approximate date: 2025-07-11 (snapshot timestamp, UTC).
- Reverted the
CSVReader.read(skip_bad_rows=...)option added in 1.0.8.19, restoringCharsAfterQuotedexceptions.
Evidence: Snapshot 1.0.8.20 backups/toolbox-1.0.8.20.py; compared with 1.0.8.19 backups/toolbox-1.0.8.19.py.
1.0.8.19
Approximate date: 2025-07-11 (snapshot timestamp, UTC).
- Added a temporary
skip_bad_rowsparameter toCSVReader.read, replacingCharsAfterQuotedexceptions with diagnostic output when enabled. Reverted in 1.0.8.20; the option name should not be taken as proof that whole malformed rows were discarded correctly.
Evidence: Snapshot 1.0.8.19 backups/toolbox-1.0.8.19.py; compared with 1.0.8.18 backups/toolbox-1.0.8.18.py.
1.0.8.18
Approximate date: 2025-07-11 (snapshot timestamp, UTC).
- Added
PhoneNumber.__getattr__, forwarding otherwise missing attributes to the normalized number string.
Evidence: Snapshot 1.0.8.18 backups/toolbox-1.0.8.18.py; compared with 1.0.8.17 backups/toolbox-1.0.8.17.py.
1.0.8.17
Approximate date: 2025-07-10 (snapshot timestamp, UTC).
- Added
PhoneNumber, with digit extraction, a default +1 country code for ten-digit input, normalizede164output, domestic/international formatting, length, and equality with other numbers or strings.
Evidence: Snapshot 1.0.8.17 backups/toolbox-1.0.8.17.py; compared with 1.0.8.16 backups/toolbox-1.0.8.16.py.
1.0.8.16
Approximate date: 2025-07-10 (snapshot timestamp, UTC).
- Hardened global and table-specific
to_numbconversion: preserve nonstrings and only parse decimal strings with exactly one dot. Added aNoneguard toextract_int. - Added the module terms-of-use header and removed unused imports. These changes are first observed since 1.0.8.14; no 1.0.8.15 snapshot is available.
Evidence: Snapshot 1.0.8.16 backups/toolbox-1.0.8.16.py; compared with 1.0.8.14 backups/toolbox-1.0.8.14.py.
1.0.8.14
Approximate date: 2025-07-03 (snapshot timestamp, UTC).
- Fixed closing row tags in generated
TxtTableHTML and added configurabletable_borderstyling. - Added
file_arg_to_buffer(..., must_exist=True); changedquick_savedefaults tomode="wb+"andmust_exist=False, allowing new files.
Evidence: Snapshot 1.0.8.14 backups/toolbox-1.0.8.14.py; compared with 1.0.8.13 backups/toolbox-1.0.8.13.py.
1.0.8.13
Approximate date: 2025-05-19 (snapshot timestamp, UTC).
- Removed the unguarded vCard demonstration and its import-time output from 1.0.8.12.
Evidence: Snapshot 1.0.8.13 backups/toolbox-1.0.8.13.py; compared with 1.0.8.12 backups/toolbox-1.0.8.12.py.
1.0.8.12
Approximate date: 2025-05-12 (snapshot timestamp, UTC).
- Added
vCardcontact generation with phone, email, organization, title, URL, and address fields. - Added the initial
Addressmodel, field accessors, string representation, and equality. - Added an unguarded contact-card demonstration that prints on import; removed in 1.0.8.13.
Evidence: Snapshot 1.0.8.12 backups/toolbox-1.0.8.12.py; compared with 1.0.8.11 backups/toolbox-1.0.8.11.py.
1.0.8.11
Approximate date: 2025-05-12 (snapshot timestamp, UTC).
- Moved expiration lookup inside the branch for expiring cached properties, avoiding unconditional access to expiration metadata for values without an expiry.
Evidence: Snapshot 1.0.8.11 backups/toolbox-1.0.8.11.py; compared with 1.0.8.10 backups/toolbox-1.0.8.10.py.
1.0.8.10
Approximate date: 2025-05-07 (snapshot timestamp, UTC).
- Handled a
Noneexpiration marker inCachedPropertyrather than comparing a datetime against it. A follow-up fix in 1.0.8.11 limits when that metadata is accessed.
Evidence: Snapshot 1.0.8.10 backups/toolbox-1.0.8.10.py; compared with 1.0.8.9 backups/toolbox-1.0.8.9.py.
1.0.8.9
Approximate date: 2025-05-07 (snapshot timestamp, UTC).
- Added coordination for concurrent first access to asynchronous
CachedPropertyvalues: mark work in progress, briefly wait for another computation's result, and remove the marker for nonexpiring values.
Evidence: Snapshot 1.0.8.9 backups/toolbox-1.0.8.9.py; compared with 1.0.8.8 backups/toolbox-1.0.8.8.py.
1.0.8.8
Approximate date: 2025-05-05 (snapshot timestamp, UTC).
- Added
SortedListwith an initial sort, key function, reverse ordering, binary-search-based insertion, iteration, indexing, membership, and length. The original membership implementation is corrected in 1.3.3.1.
Evidence: Snapshot 1.0.8.8 backups/toolbox-1.0.8.8.py; compared with 1.0.8.7 backups/toolbox-"1.0.8.7".py.
1.0.8.7
Approximate date: 2025-04-21 (snapshot timestamp, UTC).
- Fixed the
ListTableheader-cleanup typo fromstripe()tostrip().
Evidence: Snapshot 1.0.8.7 backups/toolbox-"1.0.8.7".py; compared with 1.0.8.6 backups/toolbox-"1.0.8.6".py.
1.0.8.6
Approximate date: 2025-04-16 (snapshot timestamp, UTC).
- Attempted to trim
ListTableheader names, but used nonexistentstripe(); corrected in 1.0.8.7.
Evidence: Snapshot 1.0.8.6 backups/toolbox-"1.0.8.6".py; compared with 1.0.8.5 backups/toolbox-"1.0.8.5".py.
1.0.8.5
Approximate date: 2025-04-16 (snapshot timestamp, UTC).
- Commented out unused eager imports of
ast,email.mime.base, andrequests.session.
Evidence: Snapshot 1.0.8.5 backups/toolbox-"1.0.8.5".py; compared with 1.0.8.4 backups/toolbox-"1.0.8.4".py.
1.0.8.4
Approximate date: 2025-03-16 (snapshot timestamp, UTC).
- Added
format_currencyandextract_int(which returns extracted digit text despite its name). - Rounded table-column totals to five decimal places.
- Added basic SMS destination cleanup/default US country-code handling and corrected Twilio authentication to use
account_sidandauth_token.
Evidence: Snapshot 1.0.8.4 backups/toolbox-"1.0.8.4".py; compared with 1.0.8.3 backups/toolbox-"1.0.8.3".py.
1.0.8.3
Approximate date: 2025-03-16 (snapshot timestamp, UTC).
- Made
AsyncIpInfo.get_ipitself asynchronous, awaiting IP lookups and current-IP loading before returning or reading the loaded IP.
Evidence: Snapshot 1.0.8.3 backups/toolbox-"1.0.8.3".py; compared with 1.0.8.2 backups/toolbox-"1.0.8.2".py.
1.0.8.2
Approximate date: 2025-03-11 (snapshot timestamp, UTC).
- Treated IPv6 loopback
::1as a request for the current public IP in bothIpInfo.get_ipandAsyncIpInfo.get_ip.
Evidence: Snapshot 1.0.8.2 backups/toolbox-"1.0.8.2".py; compared with 1.0.8.1 backups/toolbox-"1.0.8.1".py.
1.0.8.1
Approximate date: 2025-03-11 (snapshot timestamp, UTC).
- Added
Extra.removefor list-like stored extra data.
Evidence: Snapshot 1.0.8.1 backups/toolbox-"1.0.8.1".py; compared with 1.0.8 backups/toolbox-"1.0.8".py.
1.0.8
Approximate date: 2025-03-07 (snapshot timestamp, UTC).
- Added
iCalendarand nestedEventgeneration, including date/datetime formatting, event identifiers, start/end times, description, organizer, and location. This is the first calendar-export implementation found in the snapshots.
Evidence: Snapshot 1.0.8 backups/toolbox-"1.0.8".py; compared with 1.0.7.15 backups/toolbox-"1.0.7.15".py.
1.0.7.15
Approximate date: 2025-02-24 (snapshot timestamp, UTC).
- Added membership testing to
IterLoopvia__contains__. First observed since 1.0.7.13; no 1.0.7.14 snapshot is available.
Evidence: Snapshot 1.0.7.15 backups/toolbox-"1.0.7.15".py; compared with 1.0.7.13 backups/toolbox-"1.0.7.13".py.
1.0.7.13
Approximate date: 2025-01-28 (snapshot timestamp, UTC).
- Included session
extradata inUserSession.raw_data, preserving it during serialization. - Added
awaitexpressions to session-location access in distance validation. This records the source change rather than asserting that its await/indexing behavior was fully repaired.
Evidence: Snapshot 1.0.7.13 backups/toolbox-"1.0.7.13".py; compared with 1.0.7.12 backups/toolbox-"1.0.7.12".py.
1.0.7.12
Approximate date: 2025-01-12 (snapshot timestamp, UTC).
- Restricted table numeric conversion to strings with fewer than two dots, avoiding attempted float conversion of multi-dot strings. First observed since 1.0.7.10; no 1.0.7.11 snapshot is available.
Evidence: Snapshot 1.0.7.12 backups/toolbox-"1.0.7.12".py; compared with 1.0.7.10 backups/toolbox-"1.0.7.10".py.
1.0.7.10
Approximate date: 2024-12-31 (snapshot timestamp, UTC).
- Fixed
randomize_listto return the newly randomized list rather than the now-empty working copy.
Evidence: Snapshot 1.0.7.10 backups/toolbox-"1.0.7.10".py; compared with 1.0.7.9 backups/toolbox-"1.0.7.9".py.
1.0.7.9
Approximate date: 2024-11-12 (snapshot timestamp, UTC).
- Added
randomize_list, building a randomized copy by repeatedly removing a random element. Its initial return value is corrected in 1.0.7.10.
Evidence: Snapshot 1.0.7.9 backups/toolbox-"1.0.7.9".py; compared with 1.0.7.8 backups/toolbox-"1.0.7.8".py.
1.0.7.8
Approximate date: 2024-11-12 (snapshot timestamp, UTC).
- Kept the ActionQueue worker loop alive while
run_queueis false and conditionally skipped processing, rather than breaking out of the loop.
Evidence: Snapshot 1.0.7.8 backups/toolbox-"1.0.7.8".py; compared with 1.0.7.7 backups/toolbox-"1.0.7.7".py.
1.0.7.7
Approximate date: 2024-11-01 (snapshot timestamp, UTC).
- Converted digit-only
Extradictionary values to integers on decode and stringified values when encoding.
Evidence: Snapshot 1.0.7.7 backups/toolbox-"1.0.7.7".py; compared with 1.0.7.6 backups/toolbox-"1.0.7.6".py.
1.0.7.6
Approximate date: 2024-10-13 (snapshot timestamp, UTC).
- Allowed
ActionQueueto accept an existingaiosqliteObj.Database, infer SQLite storage from it, and reuse the database object instead of opening another one.
Evidence: Snapshot 1.0.7.6 backups/toolbox-"1.0.7.6".py; compared with 1.0.7.5 backups/toolbox-"1.0.7.5".py.
1.0.7.5
Approximate date: 2024-10-06 (snapshot timestamp, UTC).
- Rejected duplicate usernames case-insensitively in
UserManager.add_user.
Evidence: Snapshot 1.0.7.5 backups/toolbox-"1.0.7.5".py; compared with 1.0.7.4 backups/toolbox-"1.0.7.4".py.
1.0.7.4
Approximate date: 2024-10-02 (snapshot timestamp, UTC).
- No implementation change found relative to 1.0.7.3 after excluding the version declaration, release notes, and whitespace.
Evidence: Snapshot 1.0.7.4 backups/toolbox-"1.0.7.4".py; compared with 1.0.7.3 backups/toolbox-"1.0.7.3".py.
1.0.7.3
Approximate date: 2024-08-28 (snapshot timestamp, UTC).
- Corrected the update-data and row-filter argument order in
Extra.save.
Evidence: Snapshot 1.0.7.3 backups/toolbox-"1.0.7.3".py; compared with 1.0.7.2 backups/toolbox-"1.0.7.2".py.
1.0.7.2
Approximate date: 2024-08-28 (snapshot timestamp, UTC).
- Added
Extra.set(key, value).
Evidence: Snapshot 1.0.7.2 backups/toolbox-"1.0.7.2".py; compared with 1.0.7.1 backups/toolbox-"1.0.7.1".py.
1.0.7.1
Approximate date: 2024-08-28 (snapshot timestamp, UTC).
- Stopped copying every imported module attribute onto the
DelayModuleLoadproxy during first access; retained replacement of the caller/global binding with the loaded module.
Evidence: Snapshot 1.0.7.1 backups/toolbox-"1.0.7.1".py; compared with 1.0.7 backups/toolbox-"1.0.7".py.
1.0.7
Approximate date: 2024-08-28 (snapshot timestamp, UTC).
- Added
AiohttpResponse.post,delete, astatusalias, and response-method documentation. - Changed Mailgun email and Twilio SMS sending to return
AiohttpResponseobjects through the shared helper instead of numeric HTTP status values. Removed the previous directraise_for_status()calls in those send methods; callers now receive the response to inspect or raise from.
Evidence: Snapshot 1.0.7 backups/toolbox-"1.0.7".py; compared with 1.0.6.6 backups/toolbox-"1.0.6.6".py.
1.0.6.6
Approximate date: 2024-08-28 (snapshot timestamp, UTC).
- Allowed Mailgun template-only messages without requiring separate text or HTML content.
Evidence: Snapshot 1.0.6.6 backups/toolbox-"1.0.6.6".py; compared with 1.0.6.5 backups/toolbox-"1.0.6.5".py.
1.0.6.5
Approximate date: 2024-08-28 (snapshot timestamp, UTC).
- Added
User.set_username, updating the database and in-memory username.
Evidence: Snapshot 1.0.6.5 backups/toolbox-"1.0.6.5".py; compared with 1.0.6.4 backups/toolbox-"1.0.6.4".py.
1.0.6.4
Approximate date: 2024-08-28 (snapshot timestamp, UTC).
- Added
MFA.delete, deleting its database row and removing the object from the manager's cached list.
Evidence: Snapshot 1.0.6.4 backups/toolbox-"1.0.6.4".py; compared with 1.0.6.3 backups/toolbox-"1.0.6.3".py.
1.0.6.3
Approximate date: 2024-08-27 (snapshot timestamp, UTC).
- Added Mailgun
templateandtemplate_variablesparameters, JSON-encoding variables intoh:X-Mailgun-Variables. Template-only validation is corrected in 1.0.6.6.
Evidence: Snapshot 1.0.6.3 backups/toolbox-"1.0.6.3".py; compared with 1.0.6.2 backups/toolbox-"1.0.6.2".py.
1.0.6.2
Approximate date: 2024-08-27 (snapshot timestamp, UTC).
- Corrected the backslash literal used to escape regex characters in
TxtParser._regex_stringifyand commented out unused regex examples.
Evidence: Snapshot 1.0.6.2 backups/toolbox-"1.0.6.2".py; compared with 1.0.6.1 backups/toolbox-"1.0.6.1".py.
1.0.6.1
Approximate date: 2024-08-21 (snapshot timestamp, UTC).
- Added membership testing and dictionary-style
gettoExtra.
Evidence: Snapshot 1.0.6.1 backups/toolbox-"1.0.6.1".py; compared with 1.0.6 backups/toolbox-"1.0.6".py.
1.0.6
Approximate date: 2024-08-21 (snapshot timestamp, UTC).
- Added
Extra, a wrapper for encoding list/dictionary-like nonstandard data into anaiosqliteObjcolumn, with item access, mutation, iteration, append/add, and asynchronous saving.
Evidence: Snapshot 1.0.6 backups/toolbox-"1.0.6".py; compared with 1.0.5 backups/toolbox-"1.0.5".py.
1.0.5
Approximate date: 2024-08-21 (snapshot timestamp, UTC).
- Added
plugins.Twilioand asynchronoussend_sms, with destination/sender parameters and body or media URL support. Authentication initially uses the wrong attributes and is corrected in 1.0.8.4.
Evidence: Snapshot 1.0.5 backups/toolbox-"1.0.5".py; compared with 1.0.4.12 backups/toolbox-"1.0.4.12".py.
1.0.4.12
Approximate date: 2024-08-20 (snapshot timestamp, UTC).
- Guarded session browser/OS version comparisons so missing version values do not participate in less-than checks.
Evidence: Snapshot 1.0.4.12 backups/toolbox-"1.0.4.12".py; compared with 1.0.4.11 backups/toolbox-"1.0.4.11".py.
1.0.4.11
Approximate date: 2024-08-15 (snapshot timestamp, UTC).
- Removed the session-loading debug print added in 1.0.4.8.
Evidence: Snapshot 1.0.4.11 backups/toolbox-"1.0.4.11".py; compared with 1.0.4.10 backups/toolbox-"1.0.4.10".py.
1.0.4.10
Approximate date: 2024-08-14 (snapshot timestamp, UTC).
- Fixed session deletion to call
save_sessions()rather than nonexistentsave_session().
Evidence: Snapshot 1.0.4.10 backups/toolbox-"1.0.4.10".py; compared with 1.0.4.9 backups/toolbox-"1.0.4.9".py.
1.0.4.9
Approximate date: 2024-08-14 (snapshot timestamp, UTC).
- Changed the full-string branch of
TxtParser.__call__from regexmatchtofullmatch.
Evidence: Snapshot 1.0.4.9 backups/toolbox-"1.0.4.9".py; compared with 1.0.4.8 backups/toolbox-"1.0.4.8".py.
1.0.4.8
Approximate date: 2024-08-14 (snapshot timestamp, UTC).
- Added the user-ID filter to password database updates and corrected update-data/filter ordering when saving sessions.
- Added a temporary session-loading debug print, removed in 1.0.4.11.
Evidence: Snapshot 1.0.4.8 backups/toolbox-"1.0.4.8".py; compared with 1.0.4.7 backups/toolbox-"1.0.4.7".py.
1.0.4.7
Approximate date: 2024-08-14 (snapshot timestamp, UTC).
- Passed the request explicitly into the nested session-validation coroutine, avoiding the local-variable scoping problem caused by reassigning it inside that coroutine.
Evidence: Snapshot 1.0.4.7 backups/toolbox-"1.0.4.7".py; compared with 1.0.4.6 backups/toolbox-"1.0.4.6".py.
1.0.4.6
Approximate date: 2024-08-12 (snapshot timestamp, UTC).
- Changed
add_userto reload the inserted database row, construct and return aUser, and attempt to append it to cached users. First observed since 1.0.4.4; no 1.0.4.5 snapshot is available. This does not independently verify the original async cached-list expression.
Evidence: Snapshot 1.0.4.6 backups/toolbox-"1.0.4.6".py; compared with 1.0.4.4 backups/toolbox-"1.0.4.4".py.
1.0.4.4
Approximate date: 2024-08-12 (snapshot timestamp, UTC).
- Corrected creation of the session-storage column from singular
sessionto pluralsessions.
Evidence: Snapshot 1.0.4.4 backups/toolbox-"1.0.4.4".py; compared with 1.0.4.3 backups/toolbox-"1.0.4.3".py.
1.0.4.3
Approximate date: 2024-08-12 (snapshot timestamp, UTC).
- Made
User.add_sessionreturn the created session after saving it.
Evidence: Snapshot 1.0.4.3 backups/toolbox-"1.0.4.3".py; compared with 1.0.4.2 backups/toolbox-"1.0.4.2".py.
1.0.4.2
Approximate date: 2024-08-12 (snapshot timestamp, UTC).
- Added an attempt to append newly created users to the cached user collection and retained the underlying row as
User.data.
Evidence: Snapshot 1.0.4.2 backups/toolbox-"1.0.4.2".py; compared with 1.0.4.1 backups/toolbox-"1.0.4.1".py.
1.0.4.1
Approximate date: 2024-08-12 (snapshot timestamp, UTC).
- Added
UserManager.get_userlookup by username or integer ID. - Removed the explicit
auto_incrementargument from MFA-table primary-key creation.
Evidence: Snapshot 1.0.4.1 backups/toolbox-"1.0.4.1".py; compared with 1.0.4 backups/toolbox-"1.0.4".py.
1.0.4
Approximate date: 2024-08-10 (snapshot timestamp, UTC).
- Added
UserAgent.Versioncomparison methods and integer comparisons to the standaloneVersionclass. - Added asynchronous cached IP information to
StandardRequest. - Expanded
UserManagerwith configurable session-validation presets, cached user/MFA loading, session lookup, and correct nestedUserSessionconstruction. - Added session creation/saving, dictionary or encoded payload loading, optional extra data, deletion, age reporting, and validation by user agent, duration, distance, or custom callback. Several implementation fixes follow in the 1.0.4 patch releases.
- Removed the explicit
auto_incrementargument from user-table primary-key creation.
Evidence: Snapshot 1.0.4 backups/toolbox-"1.0.4".py; compared with 1.0.3.5 backups/toolbox-"1.0.3.5".py.
1.0.3.5
Approximate date: 2024-08-10 (snapshot timestamp, UTC).
- First snapshot after the 1.0.1.1 baseline; the changes below span the whole unsaved interval and cannot all be assigned specifically to 1.0.3.5.
- Added
AsyncIpInfowith awaitable loading and CSV/SQLite cache paths. ExpandedIpInfoequality to async IP objects and strings. - Removed
IpInfo.ASN, ASN-cache routines,get_asn, and relatedReqInfo.asn_info,registry, andasn_typeaccessors. - Added
plugins.Mailgunemail sending and the initialplugins.UserManageruser/password/session/MFA scaffolding. - Added
haversine, optional custom comparison/progress estimation incount_dict,StandardRequest.ip, andReqInfo.link_info/path. - Changed the updater bootstrap host from
update.pmblue.comtoupdate.pmblue.us, changed direct self-update toprimary_mod=False, and added auto-install fallbacks for missing SQLite helper modules when the updater is available.
Evidence: Snapshot 1.0.3.5 backups/toolbox-"1.0.3.5".py; compared with 1.0.1.1 toolbox.py.
1.0.1.1
Approximate date: 2024-06-09 (snapshot timestamp, UTC).
- Earliest available source snapshot, retained at the repository root. It is a baseline, not evidence that these APIs were introduced in this release; there is no earlier source or usable Git history in this workspace.
- Already contains delayed imports,
AiohttpResponseGET/ping support, number/time/size formatting, statistics and benchmarking helpers, file utilities, table models and text/HTML output,CSVReader, random-string generation, and iterable helpers. - Already contains async/cached/class property descriptors, text parsing and split helpers, country/IP lookup including the older ASN API, Android and user-agent parsing, date/time helpers,
ActionQueue, request wrappers, server analytics,ListIndex, version comparison, and permissions.
Evidence: Snapshot 1.0.1.1 toolbox.py; earliest available baseline.
Source inventory and reconstruction limits
All toolbox-prefixed files in backups/, the root baseline, and the active module were read. Ordering uses each file's internal __version__, not its filename or modification time. Several backup names contain literal quotes or newlines; links above percent-encode those characters and preserve the actual filenames.
Each of the 139 adjacent snapshot pairs was compared after excluding the top release-notes block. Entries reporting no implementation change also exclude version declarations and whitespace. Changes confined to examples or documentation are identified rather than described as functional fixes. Release-note discrepancies are resolved locally in the relevant entry, including changes recorded one or more versions after their first preserved implementation.
No source preceding 1.0.1.1 is available here. This document is complete for the supplied snapshots and discovered release-note versions, not a claim that every release ever published has been recovered.