Skip to content

4.0.0 release prep - #5

Merged
taplin merged 6 commits into
mainfrom
release-prep
Oct 13, 2026
Merged

taplin merged 6 commits into
mainfrom
release-prep

Conversation

@taplin

@taplin taplin commented Oct 13, 2026

Copy link
Copy Markdown
Contributor

Summary

Release prep for Perfect-FileMaker 4.0.0, the first release since 3.0.1 (2018).

CI will fail at package resolution until Perfect-XML 4.0.0 is tagged, because this depends on Perfect-XML from: "4.0.0". Re-run the jobs once that tag exists.

  • Dependencies: Perfect-XML from: "4.0.0". iOS 15 declared.
  • CI:
    • Linux Swift 6.2/6.4 and macOS Xcode 26.0.1/26.6, debug and release, warnings as errors.
    • An iOS Simulator job. It runs without SWIFT_TREAT_WARNINGS_AS_ERRORS, which conflicts with Xcode's warning suppression for dependencies.
  • Tests:
    • The 7 live tests used to return early and count as passes without a FileMaker Server; they now show as skipped.
    • New offline tests cover layoutInfo (typed fields, portal definitions), layoutNames, typed query values and portal records, and error 401.
  • Docs:
    • README line 34 corrected: every request, layoutInfo included, uses the fmresultset grammar. FMPXMLLAYOUT/FMPXMLRESULT are never requested or parsed.
    • Operator-encoding history corrected: 3.0.1 sent operators literally apart from < and >; nothing was double-encoded.
    • Timeout: the 5-second timeout is an inactivity timeout.
    • Connection: close is a request to the server, not a guarantee.

Testing

27 tests, 20 run and 7 live skipped (no FileMaker Server available), 0 failures, built against a local Perfect-XML 4.0.0 tag:

  • Xcode 27 and Xcode 26.3, debug and release;
  • Linux 6.2 and 6.4;
  • iOS Simulator on Xcode 27 and 26.3.

Final verification checked:

  • the fixtures against real fmresultset structure, including the DOCTYPE line, which is never fetched;
  • the timeout behaviour and the operator history.

Open, pre-existing and unchanged (decisions for Tim):

  • error 200 ("record access denied") is treated as success;
  • the live round-trip test's last find probably throws 401 against a real server.

🤖 Generated with Claude Code

taplin and others added 6 commits October 6, 2026 07:30
- Package.swift: Perfect-XML moves from branch "main" to from: "4.0.0".
  Perfect-XML 4.0.0 is not tagged yet, so this does not resolve until it
  is. It was verified against a local 4.0.0 tag in a scratch clone of the
  Perfect-XML release-prep branch.
- CI modeled on Perfect-CRUD's: Linux Swift 6.2 and 6.4 (apt libxml2-dev
  and pkg-config for Perfect-XML) and macOS Xcode 26.0.1 and 26.6, debug
  and release, warnings as errors. No FileMaker Server service exists, so
  CI runs the server-independent tests.
- The seven live-server tests returned early and were reported as passing
  without FILEMAKER_TESTS=1. They now use .enabled(if:), so they show as
  skipped.
- defaultTimeout's doc comment described a per-call timeout: parameter
  that no public method has. Corrected.

Verified (scratch copy resolving Perfect-XML at the local 4.0.0 tag):
warning-free, 23 tests (16 run, 7 live tests skipped, 0 failures) in
debug and release on Xcode 27 (Swift 6.4), Xcode 26.3 (Swift 6.2.4), and
Linux swift:6.2-noble and swift:6.4-noble. Live tests not run: no
FileMaker Server available.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Install snippet uses from: "4.0.0"; drops the branch "main" wording.
- Linux is supported (built and tested on swift:6.2-noble and
  swift:6.4-noble); the README called it unverified.
- Fixes a contradiction: the Dependencies list said Perfect-XML parses
  "fmresultset and FMPXMLLAYOUT" responses, while a later note said
  FMPXMLLAYOUT is unimplemented. Every request uses the fmresultset
  grammar; layoutInfo reads field names, result types and portal fields
  from its metadata. FMPXMLLAYOUT and FMPXMLRESULT are not implemented.
- Adds "Migrating from 3.x" and "Testing" sections.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Perfect-XML 4.0 declares iOS 15, so FileMaker needs at least that to build
for iOS. The iOS job mirrors Perfect-XML's, including the wait for the
simulator, but without SWIFT_TREAT_WARNINGS_AS_ERRORS, which conflicts
with Xcode's warning suppression for remote package dependencies; the
SwiftPM jobs check warnings.

Verified with a scratch copy resolving Perfect-XML at a local 4.0.0 tag
of the Perfect-XML release-prep head (aa0cdb8): xcodebuild test on an
iPhone 17 simulator passes with Xcode 26.3 (iOS 26.2 runtime) and Xcode 27
(27 tests: 20 run, 7 live tests skipped). The library builds at iOS 15.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The mocked responses used type="text" on field definitions, but the code
reads the data type from result= (FileMaker's type= is normal/calculation/
summary), so field typing was never exercised offline. Mocks now use
result=, and new URLProtocol-stub tests cover:

- layoutInfo: the -view request body, result= typing (number, date,
  text), and a portal's relatedset-definition;
- query: typed values (number, date) and portal (relatedset) records;
- layoutNames: LAYOUT_NAME parsing and the -layoutnames request body;
- error 401 (no records match) thrown as FMPError.serverError(401, _).

Also corrects the operator-encoding test comments: 3.0.1 encoded
operator and value together once with PerfectLib's encoder, which left
= and * literal and encoded < and >. Nothing was double-encoded or broken.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- FMPQuery: 3.0.1's encoder left = * & ! ( ) ; ' , / ? @ unescaped; the
  operator comment no longer claims old queries were mangled.
- defaultTimeout is URLRequest.timeoutInterval, an inactivity timeout (in
  practice time to first byte), not a limit on the whole request. Doc
  comment and README say so.
- Connection: close asks the server to close the connection; URLSession
  doesn't close the socket itself. Reworded.
- README: lists new/edit/delete/duplicate, iOS 15, PerfectLib as a
  transitive dependency of Perfect-CURL, and FoundationNetworking's own
  libcurl use on Linux.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… 60 s

The defaultTimeout doc comment, the makeRequest comment and a test comment
said every earlier version fell back to URLSession's 60-second default.
3.0.1 used Perfect-CURL and set no timeout; only the pre-release URLSession
builds used 60 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@taplin
taplin merged commit cfb8c4f into main Oct 13, 2026
18 of 36 checks passed
@taplin
taplin deleted the release-prep branch October 13, 2026 16:37
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