summaryrefslogtreecommitdiff
path: root/cmd/prognosis
Commit message (Collapse)AuthorAgeFilesLines
* Draw a meteogram, and let the output go somewhereHEADv0.1.4mainLukasz Kasprzak2026-08-272-3/+187
| | | | | | | | | | | | | | | | | | | | | | | | | | -svg renders the forecast as a standalone SVG: temperature with the apparent temperature dashed, precipitation as bars with the probability on its own right-hand axis, and humidity, over shaded night bands with a rule at each midnight. The rain panel carries two units, so the probability gets a second axis; read against millimetres a 60% chance looks like 0.6 mm. Written as markup rather than through gnuplot or a plotting library, so it needs nothing installed and works wherever the binary does -- the phone included. Axis ticks are snapped to round values and the number of gridlines follows the step, since snapping only the ends still yields 12.5 and 27.5. An hour label that would land under a bold date is dropped, or "23" and "28.08" render on top of each other. -o and -out choose the destination, for the table as much as the meteogram. A directory gets a filename made from the place and the date, so a daily run does not overwrite yesterday; a bare name gains the extension, so nothing lands as a file no viewer will open. Colour is omitted when writing to a file. The place is transliterated rather than stripped, so Zbylitowska Gora keeps its vowels. Documented which viewers accept a pipe: feh - and chafa do, nsxiv does not and answers with its usage, which hides the cause. The earlier claim that ImageMagick renders these files wrong was too broad -- that is convert falling back to its own renderer; display delegates to rsvg-convert and is fine.
* privacy: use Krakow in examples, tests and fixturesv0.1.2Lukasz Kasprzak2026-08-251-1/+1
| | | | | | | | | | | | | | | | | | | A recorded GUGiK fixture was a reverse address lookup for the author's home: it carried a house number, a postal code and coordinates to about a metre, and it was published. The place name in the README was the lesser half of the problem. Fixtures are re-recorded against Rynek Glowny in Krakow, a public square, and the tests, spec example and README follow. The README example is regenerated from the binary. warnings.json is left as recorded: it is a verbatim national bulletin whose teryt array lists roughly two hundred powiats, so no single entry says anything about anyone. NOTE: this removes the address from the tip, not from history. Commit e14a7db and its successors still contain it, and remain reachable on any clone or mirror.
* ci: fail the build when documentation falls behindLukasz Kasprzak2026-08-252-45/+183
| | | | | | | | | | | | | | | | Adding a flag and forgetting the man page was the kind of thing only a reader would catch, and the README had already drifted: it documented seven of fifteen flags, claimed three cross-compilation targets where the Makefile builds six, and its example output predated the humidity column. Flag definitions move into defineFlags(), so the test enumerates the same set run() does rather than a hand-copied list that could drift in its own right. usage() gains a writer so its output can be captured. Tests then assert that every flag reaches -h, the README and the man page; that every key written into the generated config is documented; and that every column name is explained. The man page check normalises roff's \- hyphen escape first -- without that, every multi-word flag looks undocumented when it is not.
* Stand alone, document, and let the config show anythingv0.1.1Lukasz Kasprzak2026-08-252-36/+60
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | prognosis no longer reads ~/.wegorc. Falling back to another program's configuration made it useless without wego installed, and hid the fact that it has no way to know where you are: location= is now required in its own config, and the error says so and shows how to set it. Custom columns. Any field the two Open-Meteo APIs expose can be displayed by declaring it -- column.birch = air:birch_pollen -- and then naming it in columns=. The source is explicit because forecast and air-quality are separate services with separate fields; an air column costs one extra request, made only when one is declared. Air values merge onto forecast hours by timestamp rather than array index, since nothing guarantees the two endpoints start at the same hour and merging by position would shift a column by an hour unnoticed. A value the API withholds renders blank, not zero: for an allergen those are different claims. Pollen selection no longer privileges grass. A species named in pollen= is shown even at zero, because you named it for a reason; pollen=all shows only what is present, or the line is six zeroes. Grass had been special-cased, which forced it on someone allergic to birch while hiding theirs. Temperature colours are compared in Celsius whatever the display units. In imperial, 85F -- a mild 29C -- was rendering in the red that means IMGW would issue a heat warning. A man page, checked by make lint and installed by make install. The Makefile gains PREFIX/DESTDIR for packaging, a version stamped into the binary, a release target that refuses to tag a dirty tree or a version with no changelog entry, cross-compilation for six platforms, and a pre-push hook. Also: humidity in the default columns, -weather for output meant for someone else, -ascii so an SMS stays in GSM-7 rather than dropping to 70-character UCS-2 segments, and -pollen and -version.
* Initial commit: prognosis, the Go implementationLukasz Kasprzak2026-08-136-0/+762
An hour-by-hour forecast for the terminal, with official IMGW warnings for Polish locations. Replaces the Python version, whose cache file format it keeps so the two can coexist until this reaches parity. Open-Meteo provides the forecast, geocoding and pollen; GUGiK turns coordinates into a TERYT powiat code; IMGW supplies the warnings, filtered to that powiat rather than the whole country. Only the two lookups that never change are cached. Forecasts never are. Silence is never allowed to read as all-clear: "no warnings in force" and "the check failed" are reported as distinct states. Place names are resolved without guessing. A name matching several places is refused with a numbered list carrying each candidate's region and coordinates, and -pick N chooses one and remembers it. A stray positional beside -l is an error, so an unquoted "Wiry, PL" cannot silently resolve to somewhere else. The cache is written one entry per line with sorted keys, and treated as disposable but not worthless: an entry that will not parse is skipped and the rest kept, and a file that will not parse at all is moved to cache.json.bad rather than overwritten. No third-party dependencies. `make ci` is the gate: gofmt clean, vet, tests.