-
Notifications
You must be signed in to change notification settings - Fork 308
feat(swift): generate CONTRIBUTING.md for Swift SDKs #15648
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,129 @@ | ||
| # Contributing | ||
|
|
||
| Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. | ||
|
|
||
| ## Getting Started | ||
|
|
||
| ### Prerequisites | ||
|
|
||
| - Swift 5.9+ | ||
| - Swift Package Manager | ||
|
|
||
| ### Installation | ||
|
|
||
| Install the project dependencies: | ||
|
|
||
| ```bash | ||
| swift package resolve | ||
| ``` | ||
|
|
||
| ### Building | ||
|
|
||
| Build the project: | ||
|
|
||
| ```bash | ||
| swift build | ||
| ``` | ||
|
|
||
| ### Testing | ||
|
|
||
| Run the test suite: | ||
|
|
||
| ```bash | ||
| swift test | ||
| ``` | ||
|
|
||
| ### Formatting | ||
|
|
||
| Format the code: | ||
|
|
||
| ```bash | ||
| swift format . | ||
| ``` | ||
|
|
||
| Or using SwiftFormat: | ||
|
|
||
| ```bash | ||
| swiftformat . | ||
| ``` | ||
|
|
||
| ### Linting | ||
|
|
||
| Lint the code: | ||
|
|
||
| ```bash | ||
| swiftlint | ||
| ``` | ||
|
|
||
| ## About Generated Code | ||
|
|
||
| **Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. | ||
|
|
||
| ### Generated Files | ||
|
|
||
| The following directories contain generated code: | ||
| - `Sources/` - API client classes and types | ||
| - Most Swift files in the project | ||
|
|
||
| ### How to Customize | ||
|
|
||
| If you need to customize the SDK, you have two options: | ||
|
|
||
| #### Option 1: Use `.fernignore` | ||
|
|
||
| For custom code that should persist across SDK regenerations: | ||
|
|
||
| 1. Create a `.fernignore` file in the project root | ||
| 2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) | ||
| 3. Add your custom code to those files | ||
|
|
||
| Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. | ||
|
|
||
| For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). | ||
|
|
||
| #### Option 2: Contribute to the Generator | ||
|
|
||
| If you want to change how code is generated for all users of this SDK: | ||
|
|
||
| 1. The Swift SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) | ||
| 2. Generator code is located at `generators/swift/` | ||
| 3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) | ||
| 4. Submit a pull request with your changes to the generator | ||
|
|
||
| This approach is best for: | ||
| - Bug fixes in generated code | ||
| - New features that would benefit all users | ||
| - Improvements to code generation patterns | ||
|
|
||
| ## Making Changes | ||
|
|
||
| ### Workflow | ||
|
|
||
| 1. Create a new branch for your changes | ||
| 2. Make your modifications | ||
| 3. Run tests to ensure nothing breaks: `swift test` | ||
| 4. Run formatting: `swift format .` or `swiftformat .` | ||
| 5. Run linting: `swiftlint` | ||
| 6. Build the project: `swift build` | ||
| 7. Commit your changes with a clear commit message | ||
| 8. Push your branch and create a pull request | ||
|
|
||
| ### Commit Messages | ||
|
|
||
| Write clear, descriptive commit messages that explain what changed and why. | ||
|
|
||
| ### Code Style | ||
|
|
||
| This project uses automated code formatting and linting. Run `swift format .` or `swiftformat .` before committing to ensure your code meets the project's style guidelines. | ||
|
|
||
| ## Questions or Issues? | ||
|
|
||
| If you have questions or run into issues: | ||
|
|
||
| 1. Check the [Fern documentation](https://buildwithfern.com) | ||
| 2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) | ||
| 3. Open a new issue if your question hasn't been addressed | ||
|
|
||
| ## License | ||
|
|
||
| By contributing to this project, you agree that your contributions will be licensed under the same license as the project. |
3 changes: 3 additions & 0 deletions
3
generators/swift/sdk/changes/unreleased/add-contributing-md.yml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| - summary: | | ||
| Generate CONTRIBUTING.md for Swift SDKs. | ||
| type: feat |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
57 changes: 57 additions & 0 deletions
57
generators/swift/sdk/src/__test__/ContributingGenerator.test.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| import { RootAsIsFiles } from "@fern-api/swift-base"; | ||
| import { describe, expect, it } from "vitest"; | ||
|
|
||
| describe("CONTRIBUTING.md root AsIs file", () => { | ||
| it("contains Swift commands", async () => { | ||
| const result = await RootAsIsFiles.Contributing.loadContents(); | ||
| expect(result).toContain("swift build"); | ||
| expect(result).toContain("swift test"); | ||
| expect(result).toContain("swift format"); | ||
| expect(result).toContain("swiftformat ."); | ||
| expect(result).toContain("swiftlint"); | ||
| }); | ||
|
|
||
| it("includes all expected sections", async () => { | ||
| const result = await RootAsIsFiles.Contributing.loadContents(); | ||
| expect(result).toContain("# Contributing"); | ||
| expect(result).toContain("## Getting Started"); | ||
| expect(result).toContain("### Prerequisites"); | ||
| expect(result).toContain("### Installation"); | ||
| expect(result).toContain("### Building"); | ||
| expect(result).toContain("### Testing"); | ||
| expect(result).toContain("### Formatting"); | ||
| expect(result).toContain("### Linting"); | ||
| expect(result).toContain("## About Generated Code"); | ||
| expect(result).toContain("## Making Changes"); | ||
| expect(result).toContain("## Questions or Issues?"); | ||
| expect(result).toContain("## License"); | ||
| }); | ||
|
|
||
| it("includes Fern-specific information", async () => { | ||
| const result = await RootAsIsFiles.Contributing.loadContents(); | ||
| expect(result).toContain("Fern"); | ||
| expect(result).toContain(".fernignore"); | ||
| expect(result).toContain("buildwithfern.com"); | ||
| expect(result).toContain("github.com/fern-api/fern"); | ||
| }); | ||
|
|
||
| it("references Swift generator path", async () => { | ||
| const result = await RootAsIsFiles.Contributing.loadContents(); | ||
| expect(result).toContain("generators/swift/"); | ||
| }); | ||
|
|
||
| it("includes Swift prerequisites", async () => { | ||
| const result = await RootAsIsFiles.Contributing.loadContents(); | ||
| expect(result).toContain("Swift 5.9+"); | ||
| expect(result).toContain("Swift Package Manager"); | ||
| }); | ||
|
|
||
| it("has correct filename", () => { | ||
| expect(RootAsIsFiles.Contributing.filename).toBe("CONTRIBUTING.md"); | ||
| }); | ||
|
|
||
| it("generates full content snapshot", async () => { | ||
| const result = await RootAsIsFiles.Contributing.loadContents(); | ||
| expect(result).toMatchSnapshot(); | ||
| }); | ||
| }); |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there no AsIs pattern to do this with copy/paste file?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The AsIs pattern in Swift (
SourceAsIsFiles/addSourceAsIsFile) is designed for.swiftsource files that get compiled into the module — they include symbol registration with theNameRegistryand are placed underSources/. CONTRIBUTING.md is a root-level markdown file, so it follows the sameaddRootFiles(new File(...))pattern used by README.md, reference.md, and Package.swift.This also matches how C# and TypeScript handle it — both use a
ContributingGeneratorclass withaddRawFiles/addRootFilesrather than an AsIs file.That said, if you'd prefer a different approach (e.g. a static
.mdfile that gets copied), happy to refactor.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Devin it shouldn't be difficult to extend this to allow root AsIs I think. We could just add RootAsIsFiles to AsIs.ts and then generate them in SdkGeneratorCLI generateRootFiles()? Could we not do that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good call — refactored to use the AsIs pattern. I've:
RootAsIsFilestogenerators/swift/base/src/AsIs.ts— a simpler variant of the existing AsIs registry (justfilename+loadContents, no symbols/directory needed for root files)CONTRIBUTING.mdatgenerators/swift/base/src/asIs/Root/CONTRIBUTING.mdSdkGeneratorCli.tsto load viaRootAsIsFiles.Contributing.loadContents()ingenerateRootAsIsFiles(), called in parallel with README/reference generationContributingGeneratorclass entirelyThis makes it easy to add more root AsIs files in the future — just add an entry to
RootAsIsFileSpecsand drop the file inasIs/Root/.