Revision history for Geo-Coder-List

0.39	Mon Oct 19 12:54:37 PM EDT 2026
	[ Enhancements ]
	- reverse_geocode(): croak on a latlng that is not a numeric pair written in
	  the ASCII digits 0-9; it used to be split and sent to every backend
	- geocode(): a location that does not match a geocoder's regex no longer
	  spends that geocoder's limit
	- geocode(): in list context, every answer inside a Geo::GeoNames-style
	  array is returned, not only the first one of each array
	- new(): a clone has its own geocoder chain and limits; pushing onto it or
	  spending a limit no longer changes the original.  It still shares L1 and
	  L2 with the original
	- LWP::Protocol::https and IPC::System::Simple are no longer runtime
	  prerequisites, since the module uses neither; install them yourself if
	  you relied on this module to pull them in
	- geocode(): the location rule is Geo::Location::Predicate's, which is a
	  distribution of its own now, so this module declares it as a
	  recommendation in META instead of requiring Geo::Coder::Free, and nothing
	  here decides the rule again.  It is looked for when it is first needed
	  rather than when this module loads.  Without it a reference is still
	  refused and a string of digits is looked up as it was before the rule
	  existed; with it the rule decides everything
	- Debug messages also go to the configured logger, at debug level
	- An L2 cache whose get() or set() dies is warned about and treated as a
	  miss, rather than failing the lookup

	[ Bug fixes ]
	- geocode(): refuse a reference; it used to be accepted because the string it
	  turns into contains a non-digit
	- geocode(): the location rule is asked of the HTML-decoded string, so
	  '&#49;&#50;' is refused as the digits it is
	- geocode(): a result with a latitude but no longitude is passed over so the
	  next geocoder can answer, instead of croaking "BUG: ... not sensible"
	- geocode(): a bare scalar ahead of a valid result no longer dies with
	  "Can't use string as a HASH ref"
	- geocode(): with an L2 cache, the result returned (and held in L1) was
	  stripped to geometry and lost lat/lng and its geocoder; only the L2 copy is
	  stripped now
	- geocode(): a plain string in the cache is not returned as a result
	- geocode(), reverse_geocode(): the caller's $@ is left alone
	- _cache(): a result with no geometry is cached for cache_miss_duration; the
	  lat check auto-vivified geometry, so it was always cache_part_duration
	- reverse_geocode(): a list-context cache hit returned an arrayref, and a
	  scalar call after a list call returned one too
	- reverse_geocode(): in list context a geocoder with no address no longer
	  ends the search, and the empty answer is not cached
	- reverse_geocode(): in list context a plain-string address no longer dies
	  with "Can't use string as a HASH ref"
	- The module compiles on Perl 5.10.1 again, as Makefile.PL says; a regex
	  flag needing 5.14 had crept in

	[ Documentation ]
	- Rewrote the POD: more SYNOPSIS examples, DESCRIPTION, SUPPORTED ANSWER
	  FORMATS, COMMON PITFALLS, ENCODING, API SPECIFICATION blocks in the form
	  extract-schemas --strict-pod=fatal reads, FORMAL SPECIFICATION and STATE
	  DIAGRAM

	[ CI ]
	- .github/workflows/location-predicates.yml runs the location-predicate fuzz
	  here, on a schedule and on a push, with --sibling Geo-Coder-List: this
	  distribution is graded against Geo::Location::Predicate and the other five
	  are not, so a drift here fails in the repository that would have to fix it
	  rather than only in Geo-Coder-Free's daily run.

	[ Packaging ]
	- Declare Data::Dumper and constant at runtime; move LWP::Protocol::https and
	  IPC::System::Simple to TEST_REQUIRES and add LWP::UserAgent there
	- Dropped the unused autodie
	- ignore.txt is no longer shipped; xt/ is skipped by MANIFEST.SKIP

	[ Testing ]
	- Added t/reference.t, the same test as the other Geo::Coder distributions
	- t/function.t: hostile-input, mid-flight failure and helper tests
	- t/30-basics.t uses Test::Mockingbird instead of Test::MockObject
	- Added t/minimum-version.t, an author test that the module's syntax needs
	  no later Perl than Makefile.PL declares

0.38	Fri Jul 10 13:35:31 EDT 2026
	[ Bug fixes ]
	- Fixed testing prereqs (affected AUTHOR_TESTING only)

0.37	Thu Jun  4 19:02:53 EDT 2026
	[ Enhancements ]
	- Add Readonly constants and %config hash for configurable cache TTLs
	- Add logging to reverse_geocode()
	- Add full POD API specifications and Z-notation formal specs to all public methods
	- ua() now clones the incoming UA per geocoder and restores the geocoder's own
	  User-Agent string (e.g. Geo::Coder::OSM/0.03); APIs such as OSM Nominatim
	  reject requests that use the generic libwww-perl default

	[ Testing ]
	- Latest testing dashboard
	- Added fuzz testing
	- Use Test::Mockingbird in t/cache.t
	- Added t/edge_cases.t: destructive, pathological, boundary and security tests
	- Added t/extended_tests.t: coverage-raising tests for untested execution paths
	- Documented four unreachable code paths in comments with analysis

	[ Bug fixes ]
	- Extract _build_ca_address() helper; fix $state/.= bug in CA address builder
	- Fix 'gecoder' typo in log entries (now correctly 'geocoder')
	- Fix flush() to reset log to [] and return $self for chaining
	- Fix _cache() write-path detection to correctly handle undef not-found values
	- Fix $Data::Dumper::Maxdepth global side-effect (now uses local)
	- Fix return CORE::push bug in reverse_geocode list context (returned count not address)
	- Fix geocode() to return $good_result not blindly $rc[0] after last POSSIBLE_LOCATION
	- Replace warn with Carp::carp throughout
	- Add use autodie qw(:all), use Data::Dumper, use Readonly
	- Fix geocode() normalisation: lat=0 (equator) was silently discarded because
	  five branches used truthy checks ($l->{lat}) instead of defined($l->{lat})
	- Fix geocode() crash when a geocoder returns a bare scalar (e.g. 0 or ""):
	  added "next unless ref($l)" guard before hash dereference
	- Fix geocode() L1 cache hit mutating caller-held references in place:
	  HASH results are now shallow-copied before stamping geocoder => 'cache',
	  so external variables and the cached entry are not silently modified
	- Fix reverse_geocode() to retry without the 'latlng' key when a backing
	  geocoder rejects it as an unknown parameter (strict validation, e.g.
	  Geo::Coder::GeoApify); geocoders that require 'latlng' (e.g.
	  Geo::Coder::CA) still receive it on the first attempt

0.36	Tue Jan 13 08:17:40 EST 2026
	Invalid option now throws error rather than returning undef
	Added t/mock.t
	Use Params::Get and Object::Configure
	Clean up NO_NETWORK_TESTING setting
	Move the L1 cache into per-object
	Don't try to store an object in the cache
	Also set lon in the results
	Check that the argument is given to push()
	Added the test dashboard

0.35	Mon Feb 17 20:27:10 EST 2025
	GeoApify doesn't give an error if a location is not found
	geocode(): croak when input is just a set of numbers
	Allow a ref to a HASH to be used as the cache
	Added lat and lon to the output HASH for easier compatibility

0.34	Sat Oct 26 20:42:57 EDT 2024
	Turn off on-line tests for smokers
	Use Test::DescribeMe to simplify tests
	new(): Use Scalar::Util to verify it's an object
	Added support for Geo::Coder::ApifyKey

0.33	Thu May 16 09:28:54 EDT 2024
	Fix test count in t/googleplaces.t
	Don't test t/ua.t when network testing disabled
	Use Test::Needs
	Error if there's something wrong in the cache
	Looks like Geo::Coder::US::Census sometimes says it's worked when it hasn't
	Set the geocoder to 'cache' rather than undef for cached items

0.32	Sat Oct  7 10:07:45 EDT 2023
	Set "geocoder" to "cached" when the values have been retrieved from the L2 cache

0.31	Thu Jun 29 09:23:17 EDT 2023
	Change the croaks to carps
	Fix test when Geo::Coder::Free is not installed

0.30	Tue Jun 27 20:53:14 EDT 2023
	Better error message on wrong parameter
	Fix count if not enough installers installed in t/list.t
	Calling new on an object now returns a clone
	Don't fail if geocode.farm is down
	Handle OSM not setting state
	reverse_geocode now looks in the second cache
	Croak when geocode has invalid argument rather than silently return

0.29	Sun Jan 23 08:17:25 EST 2022
	Disable t/geofarm.t on smokers

0.28	Sat Jan 22 12:05:07 EST 2022
	Don't delete hashes when debugging
	Start to popluate the 'type' member of the returned hash
	Added support for Geo::Coder::Mapbox
	Temporarily invalid locations were being cached too long

0.27	Sat Jun 20 18:48:02 EDT 2020
	Added debug option to the constructor
	Be more intelligent in how long to keep a location in the cache
	Remove data from the cache of the wrong format

0.26	Wed  9 Oct 17:36:41 EDT 2019
	Fix reverse_coding of Canada
	Added support for OpenCage

0.25	Sat 20 Apr 21:24:01 EDT 2019
	Specify a minimum level of Perl

0.24	Wed 17 Apr 15:41:37 EDT 2019
	Support the cache option
	Test Geo::Coder::Free::Local
	Started work on reverse_geocode()

0.23	Fri Feb  1 20:57:05 EST 2019
	Add the calling line to the log
	Added support for Geo::Coder::DataScienceToolkit

0.22	Sun Jun  3 10:36:51 EDT 2018
	Fix call on unblessed instance

0.21	Sun Apr 22 19:53:36 EDT 2018
	Improved support for Geo::GeoNames error handling
	Remove HTML entities from locations, it confuses the URLs and breaks Geo::GeoNames
	Added the limit parameter to push()

0.20	Tue Apr 17 20:03:03 EDT 2018
	Don't bother to test using Google if you don't have a key
	Improved support for Geo::GeoNames

0.19	Sun Apr 15 20:42:05 EDT 2018
	Support Geo::GeoNames
	Explicit about which loop to finish
	Fix uninitialized variable
	Fix https://github.com/Humanstate/html-googlemaps-v3/issues/17

0.18	Tue Dec 26 08:18:54 EST 2017
	Improved return value checking
	Squash spaces

0.17	Fri Oct 27 14:14:57 EDT 2017
	Support Geo::Coder::Ovi, Geo::Coder::US::Census,
		Geo::Coder::GeocodeFarm and Geo::Coder::RandMcnally

0.16	Tue Oct 24 22:40:26 EDT 2017
	Return undef when the geocode fails

0.15	Fri Oct 20 14:25:48 EDT 2017
	Added log() and flush()

0.14	Wed Oct 11 09:58:18 EDT 2017
	Improve performance if asked for array first then scalar later
	Support Geo::Coder::Postcodes
	Verify against Geo::Coder::XYZ
	Set error

0.13	Tue Jul 25 11:40:19 EDT 2017
	Address RT#122441

0.12	Tue May 30 13:31:44 EDT 2017
	Bump minimum version of G:C:XYZ - RT#121919
	Stash array values
	When a geocoder errors, Carp the location

0.11	Sat 27 May 14:55:23 EDT 2017
	Test with the new L:U:Throttled

0.10	Fri May 26 17:29:04 EDT 2017
	If a geocoder returns error go to the next one
	If regex wasn't matched it tried it anyway
	Carp when a coder fails

0.09	Sat 13 May 10:15:44 EDT 2017
	Fix travis breakage that could also break cpan_testers

0.08	Sat 13 May 09:48:36 EDT 2017
	Only run on-line tests when wanted

0.07	Thu May 11 16:52:11 EDT 2017
	Added ua() method

0.06	Wed May 10 09:57:09 EDT 2017
	Allow different encoders to be used for different locations
	Added test for list context

0.05	Thu Feb  2 09:28:09 EST 2017
	Fix tests

0.04	Sat Jan 28 20:58:02 EST 2017
	Fixed Bing tests

0.03	Sat 28 Jan 07:52:23 EST 2017
	Some places now on the map, so change tests for failure
	Remember locations to increase speed

0.02	28 Dec 2016
	If a search dies, use the next encoder
	Build needs L:P:https

0.01	Thu 22 Dec 11:57:45 EST 2016
        First draft
