Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 37 additions & 40 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ on:
# Only run on pull requests against main.
branches: [main]

permissions:
contents: write

jobs:
# We run this job first, to create any GitHub release that we might need.
# Creating a release can only be done once, so we need to split it out from
Expand All @@ -23,16 +26,14 @@ jobs:
runs-on: ubuntu-latest
outputs:
release_version: ${{ steps.extract_release_version.outputs.release_version }}
upload_url: ${{ steps.create_release.outputs.upload_url }}
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Extract release version
id: extract_release_version
run: |
release_version="$(echo '${{ github.ref }}' | sed 's,^.*/\([^/]*\)$,\1,; s,^v,,' )"
echo Release version: $release_version
echo "::set-output name=release_version::$release_version"
echo "release_version=$release_version" >> $GITHUB_OUTPUT
- name: Extract release body from CHANGELOG.md
id: extract_release_body
if: ${{ startsWith(github.ref, 'refs/tags/v') }}
Expand All @@ -49,13 +50,11 @@ jobs:
- name: "Make release"
id: create_release
if: ${{ startsWith(github.ref, 'refs/tags/v') }}
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref }}
release_name: "${{ steps.extract_release_version.outputs.release_version }}"
name: ${{ steps.extract_release_version.outputs.release_version }}
body_path: RELEASE_BODY.md
prerelease: ${{ contains(github.ref, 'alpha') || contains(github.ref, 'beta') || contains(github.ref, 'rc') }}

# We use a matrix to run our build on every supported platform.
build:
Expand All @@ -75,14 +74,14 @@ jobs:
host: x86_64-unknown-linux-musl
cargo: cross
os: ubuntu-latest
- target: x86_64-apple-darwin
host: x86_64-apple-darwin
cargo: cargo
os: macos-latest
- target: aarch64-apple-darwin
host: x86_64-apple-darwin
cargo: cargo
os: macos-latest
# - target: x86_64-apple-darwin
# host: x86_64-apple-darwin
# cargo: cargo
# os: macos-latest
# - target: aarch64-apple-darwin
# host: x86_64-apple-darwin
# cargo: cargo
# os: macos-latest

runs-on: ${{ matrix.os }}

Expand All @@ -92,33 +91,35 @@ jobs:
if: runner.os == 'macOS'
run: |
brew install automake
- uses: abelfodil/protoc-action@v1
- name: Install protoc
run: |
if [ "${{ runner.os }}" = "macOS" ]; then
brew install protobuf
else
sudo apt-get update
sudo apt-get install -y protobuf-compiler
fi
# Checks-out our repository first so `rust-toolchain` is present when we
# install Rust.
- uses: actions/checkout@v4
with:
protoc-version: "3.0.0"
submodules: recursive
- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
uses: dtolnay/rust-toolchain@stable
with:
profile: minimal
# We track latest stable Rust instead of hardcoding it because it
# virtually never breaks old code.
toolchain: stable
components: rustfmt, clippy
target: ${{ matrix.target }}
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
with:
submodules: recursive
targets: ${{ matrix.target }}
- name: Install Just
run: |
version=1.13.0
version=1.42.4
basename=just-$version-${{ matrix.host }}
curl -fLO https://github.com/casey/just/releases/download/$version/$basename.tar.gz
tar xf $basename.tar.gz just
mv just /usr/local/bin/
rm -rf $basename.tar.gz
- name: Install cargo-deny
run: |
version=0.14.20
version=0.20.2
basename=cargo-deny-$version-${{ matrix.host }}
curl -fLO https://github.com/EmbarkStudios/cargo-deny/releases/download/$version/$basename.tar.gz
tar xf $basename.tar.gz
Expand Down Expand Up @@ -151,14 +152,10 @@ jobs:
run: |
release_file=geocode-csv_${{ needs.create_release.outputs.release_version }}_${{ matrix.target }}.zip
zip -j $release_file target/${{ matrix.target }}/release/geocode-csv
echo "::set-output name=release_file::$release_file"
- name: Upload Release Asset
echo "release_file=$release_file" >> $GITHUB_OUTPUT
- name: Upload release asset
if: ${{ startsWith(github.ref, 'refs/tags/v') }}
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create_release.outputs.upload_url }}
asset_path: ./${{ steps.build_release.outputs.release_file }}
asset_name: ${{ steps.build_release.outputs.release_file }}
asset_content_type: application/zip
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release upload "${{ github.ref_name }}" "${{ steps.build_release.outputs.release_file }}" --clobber
31 changes: 31 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,37 @@ All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [1.5.0-alpha.1] - 2026-09-14

### Changed

- The BigTable cache now loads Application Default Credentials with `google-cloud-auth` and injects them into `bigtable_rs`. Impersonated service accounts and GitHub `external_account` files work. A missing or unparseable `GOOGLE_APPLICATION_CREDENTIALS` file is an error. The process never falls through to the `gcloud` CLI.

## [1.4.1-alpha.1] - 2026-09-01

### Added

- `libpostal` output now includes the `building` and `metro_station` columns, which the address parser can produce but which we previously discarded.
- `--refresh-failures-after-days`, `--refresh-failures-max-attempts`, optional `--refresh-successes-after-days`, and `--refresh-rate` re-geocode stale BigTable cache entries on the read path. Failures back off exponentially (`period * 2^attempts`) and stop after max attempts. A per-key-per-day rate cap bounds spend so a bulk-loaded backlog does not all come due on one day. New rows keep the legacy `N` payload so older binaries can still read them; refresh metadata is appended after that payload. If a success refresh comes back as no match, the prior success is kept.

### Changed

- Reworked the set of `libpostal` output columns to match the labels the address parser can actually emit (per `address_parser.h`). This removes ten columns that were always empty (`archipelago`, `continent`, `country_code`, `county`, `hamlet`, `municipality`, `neighbourhood`, `postal_city`, `region`, `village`), because they came from OpenCage's address-_formatting_ vocabulary rather than libpostal's parser vocabulary. This changes the columns emitted by `--include-libpostal`.
- Upgraded all dependencies to latest versions, including `bigtable_rs` 0.4, `reqwest` 0.13, `sha2` 0.11, `strum` 0.28, `clap` 4.6, `tikv-jemallocator` 0.7.
- Replaced hand-rolled `hyper`/`hyper-util`/`http-body-util`/`hyper-rustls` HTTP client for Smarty API with `reqwest`, removing four direct dependencies.
- Replaced `jemallocator` with `tikv-jemallocator`, the actively maintained fork.
- Replaced `lazy_static` with `std::sync::LazyLock` in `libpostal-sys` and `libpostal-rust`.
- Consolidated `strum` + `strum_macros` into `strum` with `derive` feature.
- Removed standalone `serde_derive` dependency (already re-exported by `serde` with `derive` feature).
- Bumped Rust edition from 2018 to 2021.

### Fixed

- When normalizing addresses, we no longer drop the secondary-unit designators `level` (e.g. "2nd Floor"), `staircase`, and `entrance` that libpostal parses out. These are now appended to the street, alongside `building`, so they reach the downstream geocoder instead of being silently discarded (the same class of bug as the earlier "city parsed as suburb" fix).
- `island` (e.g. "Maui") is now kept as part of the city during normalization instead of being dropped.

## [1.4.0] - 2024-04-26

### Added
Expand Down
Loading
Loading