Revision history for Weather::Meteo

0.15	Mon Jul 13 12:51:54 EDT 2026
	[ Security ]
	- Fix SSRF: validate and untaint the host parameter in new() against a
	  hostname-only regex; rejects IP addresses, @-injection, and path segments
	  (WEATHER__METEO__host env var was previously accepted verbatim)
	- Fix taint-mode compliance: coordinate validation now uses list-context
	  captures so $latitude/$longitude are untainted before reaching URI/LWP
	- Fix ReDoS: replace /^-?\d+(\.\d+)?$/ with atomic-group equivalent
	  /\A(-?(?>\d+)(?:\.(?>\d+))?)\z/ in all three public data methods and
	  _normalise_coord(); eliminates O(n) backtracking on adversarial input
	- Fix log injection: sanitise $@ from JSON parse failures before carp
	  (strip control characters, cap at 200 chars)
	- Fix path traversal in bin/weather: CACHE_DIR and OPENADDR_HOME env vars
	  are now untainted via character-class regex and canonicalised with
	  Cwd::realpath() before any filesystem operation
	- Fix TOCTOU race in bin/weather cache directory creation: replaced the
	  -d check + mkdir pair with atomic mkdir()+EEXIST idiom

	[ Enhancements ]
	- Add forecast() method using api.open-meteo.com/v1/forecast (1-16 days ahead)
	- Add sunrise_sunset() method returning { sunrise, sunset } for any date
	- Add sunrise,sunset to weather() daily fields

0.14	Mon Jun  1 08:55:15 EDT 2026
	Use Test::Mockingbird instead of Test::MockModule in t/30-basics.t
	Fix $self->error() calls that should be $logger->error() in weather()
	Fix weather() to guard against UA returning a non-response object
	Fix weather() to guard against JSON decoding to a non-hashref
	Fix ua(undef) silently corrupting the stored user-agent
	Add explicit return at end of weather() when no hourly key is present
	Add formal API specification POD (with Z calculus) to new(), weather(), ua()
	Added t/function.t, t/unit.t, t/integration.t, t/edge_cases.t
	Added t/extended_tests.t targeting coverage gaps
	Added t/mutant_killers.t targeting surviving mutants

0.13	Thu Apr  9 07:48:29 EDT 2026
	Use Object::Configure to allow runtime configuration
	Remove magic numbers
	Added test dashboard
	Validate the argument given to ua()

0.12	Mon Feb 24 07:44:44 EST 2025
	Corrected the documentation for tz
	Handle "-0.25" as a co-ordinate

0.11	Fri Feb 14 08:11:25 EST 2025
	More useful error message
	Handle numbers starting with a decimal point
	Added rate-limiting and caching support

0.10	Thu Feb 13 07:47:59 EST 2025
	Better handling of JSON decode errors
	Added t/30-basics.t
	Better arg checking

0.09	Thu May 30 16:27:39 EDT 2024
	Attempt to fix https://www.cpantesters.org/cpan/report/cb5e2b52-a699-11ee-9c1e-22106e8775ea
	Added t/carp.t
	The date argument to weather() can now be a DateTime, or similar, object
	Fix giving location as a named argument

0.08	Wed Nov 29 07:08:36 EST 2023
	Test needs TimeZone::TimeZoneDB when TIMEZONEDB_KEY is set
	Fix https://github.com/nigelhorne/Weather-Meteo/issues/3 (SREZIC)
	Fix https://github.com/nigelhorne/Weather-Meteo/issues/4 (SREZIC)

0.07	Thu  9 Nov 07:45:17 EST 2023
	Fix http://www.cpantesters.org/cpan/report/b25e6af8-0ce4-11ee-8f82-220d6e8775ea
	Carp rather than croak when the website returns 500

0.06	Thu Jun 15 20:49:00 EDT 2023
	Added bin/weather
	weather() now supports the 'tz' argument

0.05	Fri Apr 14 09:55:47 EDT 2023
	Include the daily overview in the results
	The database is from 1940

0.04	Tue Mar 21 21:49:03 EDT 2023
	Support Geo::Location::Point object to give a location

0.03	Fri Mar 10 09:35:01 EST 2023
	Remove unused modules
	Look into http://www.cpantesters.org/cpan/report/8b5bb156-bd91-11ed-aba6-9a79f339625c
	Fix https://github.com/nigelhorne/Weather-Meteo/issues/1 (SREZIC)

0.02	Tue Feb 28 11:57:35 EST 2023
	Remove references left from the template code
	Added all my basic testing

0.01	Tue Feb 28 11:16:18 EST 2023
        First draft
