Skip to content

fix(antd-go): make 03-files example self-contained and runnable - #91

Merged
Nic-dorman merged 1 commit into
mainfrom
feat/v2-294-runnable-antd-go-examples
May 19, 2026
Merged

fix(antd-go): make 03-files example self-contained and runnable#91
Nic-dorman merged 1 commit into
mainfrom
feat/v2-294-runnable-antd-go-examples

Conversation

@Nic-dorman

Copy link
Copy Markdown
Collaborator

Summary

antd-go/examples/03-files/main.go was shaped as a documentation snippet rather than a runnable example. It hardcoded:

client.FileCost(ctx, "/path/to/file.txt", true)
client.FileUploadPublic(ctx, "/path/to/file.txt")
client.FileDownloadPublic(ctx, result.Address, "/path/to/output.txt")

When invoked against a live daemon (e.g. via ant dev example all -l go), the daemon correctly rejected the nonexistent path with HTTP 400: Bad request: invalid path and the example exited 1.

Change

Rewrite the example to be self-contained, mirroring the antd-py/examples/04_files.py reference shape:

  • Create a temp dir + source file with real bytes.
  • Call FileCostFileUploadPublicFileDownloadPublic against the real path.
  • Read the downloaded file back and assert byte-equal round-trip.
  • Clean up the temp dir on exit (defer os.RemoveAll).

Audited 01-connect and 02-data at the same time — neither has path or filesystem dependencies, both already work against a live daemon, no changes needed.

Test plan

  • go build ./... clean in antd-go/examples/03-files/.
  • 01-connect and 02-data still build clean.
  • End-to-end against dev2 with ant dev start --enable-evm:
    • Cost estimate: 30 bytes / 4 chunks / single-mode
    • Upload: 3 chunks stored, real cost atto + gas wei reported
    • Download: file written to <tmpdir>/hello.txt.downloaded
    • Round-trip assertion: content matches Hello from a file on Autonomi!
    • Example exits 0; no daemon 400s.
  • Reviewer: re-run against a fresh devnet to confirm.

Out of scope

  • The 3 missing go examples (03_chunks, 05_graph, 06_private_data) — different ticket, broader cross-SDK coverage work.
  • The 07_external_signer example to exercise the new prepare/finalize surface — different ticket.

🤖 Generated with Claude Code

Replace placeholder /path/to/file.txt and /path/to/output.txt with a
real tempfile that is written, uploaded, downloaded back, content-
asserted byte-equal, and cleaned up on exit.

Mirrors the antd-py 04_files.py reference shape so the example works
against a live daemon under `ant dev example all -l go`. Previously
crashed with `HTTP 400: Bad request: invalid path` because the daemon
correctly rejected the nonexistent path.

01-connect and 02-data audited at the same time — neither has path
or filesystem dependencies; both run clean against a live daemon.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@Nic-dorman
Nic-dorman merged commit 93e0c5a into main May 19, 2026
Nic-dorman added a commit that referenced this pull request May 19, 2026
…ruby/zig (#93)

* fix(examples): make 04-files runnable across cpp/rust/elixir/lua/php/ruby/zig

The 04-files examples in 7 SDKs were shaped as documentation snippets
with hardcoded /tmp/example.txt (or /path/to/myfile.txt) placeholder
paths. Against a live daemon, the daemon returns HTTP 400 "Bad request:
invalid path" and the example exits 1 (php exits 255 — same root cause,
PHP-style uncaught exception). Observed in the dev2 sweep on 2026-05-18.

Rewrite each example using the antd-py 04_files.py / antd-go 03-files
post-PR-#91 pattern:

* Create a real temp directory (language-idiomatic — sys_get_temp_dir
  in PHP, std::env::temp_dir in Rust, System.tmp_dir in Elixir,
  std::filesystem::temp_directory_path in C++, Dir.mktmpdir in Ruby,
  /tmp/antd-... fallback in Lua/Zig).
* Write a known file (hello.txt) and a subdir with a known file
  (mydir/file_in_dir.txt).
* Call file_cost on the real path.
* Upload + download + assert byte-equal round-trip on hello.txt.
* Upload + download + assert byte-equal round-trip on the directory's
  inner file.
* Clean up the temp directory on exit (defer/finally/block-scope).
* Exit non-zero with a clear message on assertion failure.

Plus: expand the ruby adapter in ant-dev/cmd_example.py to dispatch
the existing 04_files.rb and 06_private_data.rb examples — they were
on disk but never wired into the runner, so the sweep silently
skipped them and "passed" ruby in 5s without running them.

Verified end-to-end on dev2 with `ant dev example files -l <lang>`
for each of the 7 affected SDKs against `ant dev start --enable-evm`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(examples): trim 04-files to file-only + fix per-SDK signature bugs

dev2 sweep on the prior commit surfaced two distinct issues:

1. Directory upload is broken in the daemon. `POST /v1/dirs/upload/public`
   returns `HTTP 500 Internal error: encryption failed: I/O error: Is a
   directory (os error 21)` — the daemon attempts encryption on the
   directory path itself instead of recursing into files. Reproduces in
   cpp/rust/lua/zig (the SDKs whose new examples exercised this path).
   File upload/download works correctly on the same temp directory.
   Daemon fix is its own ticket; the example sidesteps by removing
   the dir_upload_public / dir_download_public step.

2. Three SDKs had wrong argument counts on `file_cost` in the original
   stub examples, hidden because the daemon errored at 400 first:
   * antd-elixir: was `file_cost(client, path, true, false)` (4 args).
     Function signature is `/3`. Drop the trailing `false`.
   * antd-ruby: was `file_cost(path, true, false)` (3 args). Signature
     is `/2`. Drop the trailing `false`.
   * antd-php: `fileCost()` returns an `UploadCostEstimate` object;
     printed it with string interpolation, which is a PHP fatal. Use
     `$cost->cost` and `$cost->chunkCount` properties.

What remains in each example: temp dir creation → write hello.txt with
known content → file_cost → file_upload_public → file_download_public
→ read back → assert byte-equal round-trip → cleanup.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Nic-dorman added a commit that referenced this pull request May 19, 2026
… + 15 SDKs + docs)

Resolved against origin/main (which now contains #91/#92/#93/#94/#96) using
dev2 integration HEAD aa94940 as the canonical post-merge state. Net of the
example-file overlap with #93/#94, V2-300 reduces to 99 files / 44+ / 1694-.
Nic-dorman added a commit that referenced this pull request May 19, 2026
… + 15 SDKs + docs) (#95)

Resolved against origin/main (which now contains #91/#92/#93/#94/#96) using
dev2 integration HEAD aa94940 as the canonical post-merge state. Net of the
example-file overlap with #93/#94, V2-300 reduces to 99 files / 44+ / 1694-.
Nic-dorman added a commit that referenced this pull request May 21, 2026
Cuts v0.8.0 atop v0.7.1. Substantial breaking-change roll-up of the
put/get rename, the private-file PUT/GET gap close, and several minor
surface cleanups -- bundled here so the v1.0 cut can ship stable on top.

## Breaking (antd daemon)

- feat(antd)!: bind to 127.0.0.1 by default on REST and gRPC (#107).
  Previously bound 0.0.0.0; use --bind-rest / --bind-grpc to override.
- chore: remove dead graph_entry surface from antd proto + 5 SDKs (#92).
  GraphService and its 4 RPCs are gone; REST mounts dropped.
- chore: remove dir_upload_public / dir_download_public surface (#95).
  Use file_put_public on a directory path instead; the daemon recurses.
- feat(antd)!: normalize put/get convention + close private-file PUT and
  GET gaps (#115). Method renames across proto + REST + SDKs:
    data_put_private    -> data_put
    data_get_private    -> data_get
    file_upload_public  -> file_put_public
    file_download_public -> file_get_public
  New: file_put / file_get for the private file path (previously only
  the public variant existed). New typed results: DataPutResult,
  DataPutPublicResult, FilePutResult, FilePutPublicResult; PutResult
  is now annotated as chunk_put only.

## Additive

- feat(antd): honor payment_mode on gRPC put/cost paths and REST cost
  endpoints (#114). Optional kwarg threaded through every put/cost
  signature; empty/omitted maps to "auto" so older clients keep working.
- feat: external-signer public uploads + single-chunk prepare/finalize
  across 15 SDKs (#90).
- docs+spec: openapi.yaml refreshed for the v1.0 surface, including
  POST /v1/chunks/prepare and /v1/chunks/finalize for single-chunk
  external-signer publish (#126).

## SDK fan-out (PaymentMode + put/get convention, all 15)

#116 antd-go, #117 antd-py/ruby/elixir, #118 antd-rust, #119 antd-csharp,
#120 antd-java, #121 antd-swift, #122 antd-dart, #123 antd-kotlin,
#124 antd-cpp, #125 antd-js/php/zig/lua, #127 antd-mcp.

## SDK example + build fixes

- fix(antd-go): make 03-files example self-contained and runnable (#91)
- fix(examples): make 04-files runnable across cpp/rust/elixir/lua/php/ruby/zig (#93)
- fix(examples): runnable dart 04_files + java Example03Files; add java Example03Chunks (#94)
- feat: gRPC transport example for antd-py and antd-rust (#113)
- feat(antd-py): 07_external_signer example + ant-dev dispatcher entry (#98)
- feat(antd-js): 07-external-signer example + antd-py empty-payments fix (#99)
- feat(rust/go): 07-external-signer examples (#100)
- feat(antd-csharp): 07_external_signer example (#101)
- feat(antd-java): 07_external_signer example (#102)
- feat(antd-kotlin): 07_external_signer example (#103)
- feat(antd-dart): 07_external_signer example (#104)
- feat(antd-ruby): 07_external_signer example (#105)
- feat(antd-php): 07_external_signer example (#106)
- chore(antd-kotlin): drop stale GraphDescendant from local proto copy (#108)

## Docs / infra

- docs: external-signer flow reference + ABI + python smoke test (#97)
- docs: add SECURITY.md with threat model and disclosure policy (#109)
- docs!: refresh per-SDK READMEs + llms-full.txt + openapi.yaml for v1.0 surface (#126)
- ci: add Go lint + test + vuln scanning for antd-go (#112)
- ci: extend antd-rust to sibling-repo parity (fmt + clippy + audit + doc) (#111)
- ci: skip antd/openapi.yaml and llms-full.txt from triggering CI (#128)
- chore(scripts): add full-stack + integration sweep helpers (#96)
- fix(antd-rust): regenerate Cargo.lock to unbreak --locked CI (#110)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant