gui.py: one button per direction, "SAB file to SAX file" and "SAX file to
SAB file". The button decides which extension the chooser offers and which
way the conversion goes. The log names the chosen file and its folder before
the work starts, then the output file and folder when it finishes, each value
on its own line. Output lands next to the input under the timestamped name,
so there is no save dialog and nothing is overwritten. Sedona home sits at
the top with a Change... button that validates manifests/ and rewrites
system.properties.
run.py: no arguments opens the window, any argument goes to the command line
converter. pythonw run.py for a shortcut with no console.
config: NAME/VERSION are now "SAB - SAX Sedona Files Converter 0.0.0.002",
carried by the window title, every dialog title and the CLI banner. Adds
choose_sab_input() - the existing choose_sab_file() is the save dialog.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
testprogram/ is local test data, not part of the tool: untracked and
gitignored so it never comes back. verify.py now prints SKIP and exits 0
when the test pair is absent instead of blowing up.
Adds config.NAME / config.VERSION (sab2sax 0.0.0.001). Every dialog title
bar goes through config.title(), and the CLI prints the same line at
startup, so it is clear which build produced a file.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Adds the reverse conversion (sab -> sax) and makes the tools usable without
remembering paths on the command line.
- sax.py: decoder ported from OfflineApp.decodeAppBinary + encodeAppXml.
Rebuilds the tree from the firstChild/nextSibling chain and writes XML the
way XWriter does. Reproduces java.lang.Float.toString, and rounds manifest
defaults to f4 before comparing them - otherwise props equal to their
default (0.1) get written where sedonac omits them.
- sab2sax.py: CLI dispatching on the input extension, like sedonac. sab.py
still runs and hands off to it.
- config.py: sedona.home lives in system.properties. If it is missing or has
no manifests/, a folder chooser opens and the answer is written back. File
choosers for the input, save dialogs for the output; the default output name
carries a timestamp so a run never overwrites the previous one.
- verify.py: checks both directions plus a sab -> sax -> sab round trip, and
points at testprogram/ where the test files actually live.
All three checks pass byte-identical against the checked-in sedonac output.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>