# hnblogs

A Go library for the [blogs.hn](https://blogs.hn) dataset: a list of personal
blogs collected from Hacker News.

```go
import "sneak.berlin/go/hnblogs"

blog, err := hnblogs.RandomBlog()
```

## Embedded data

The dataset is vendored into this repository as `blogs.json` and compiled into
the package with `go:embed`. The library performs no network I/O: importing it
does not reach out to anything, results do not change under a caller between
runs of the same build, and `go test` works offline.

`GetBlogs` decodes the embedded bytes on first call and memoizes the result;
every other accessor goes through it. Its error return is only reachable if the
committed `blogs.json` is malformed.

The trade-off is that the dataset is a build-time artifact: it is roughly 8 MB
of JSON, it lands in every binary that links the package, and it is only as
fresh as the last commit that refreshed it.

## Refreshing the dataset

```sh
make update-data
```

That target reads the upstream location from the `BlogsURL` constant in
`hnblogs.go` — the single source of truth — and downloads it to a temporary
file. It replaces `blogs.json` only once that file parses as a non-empty JSON
array of blog entries, so a response that arrives complete but is not the
dataset leaves the vendored copy untouched. It then runs the test suite
against the new data. Requires `curl` and `jq`. Commit the resulting
`blogs.json` to publish the update.

## Development

```sh
make test
make lint
make docker
```

`make docker` runs lint and tests in containers.
