Skip to content

fix: Remove required fields that are optional in API responses#559

Open
erezrokah wants to merge 1 commit intookta:masterfrom
cloudquery:fix/policy_people_condition
Open

fix: Remove required fields that are optional in API responses#559
erezrokah wants to merge 1 commit intookta:masterfrom
cloudquery:fix/policy_people_condition

Conversation

@erezrokah
Copy link
Copy Markdown
Contributor

@erezrokah erezrokah commented Dec 3, 2025

I already signed the CLA a while back for https://github.com/okta/okta-sdk-golang/pulls?q=is%3Apr+author%3Aerezrokah+is%3Aclosed. I can send it again if you don't have it

Summary

Noticed this while working on #558.
Some fields that were optional in v5 are now required in v6 which fails JSON marshaling. Not sure if this is a problem in the OpenAPI spec or in the code gen, but this PR aims to highlight the marshaling failures that happen in v6, but not in v5.

Type of PR

  • Bug Fix (non-breaking fixes to existing functionality)
  • New Feature (non-breaking changes that add new functionality)
  • Documentation update
  • Test Updates
  • Other (Please describe the type)

Test Information

  • [] My PR required test updates

Go Version: go version go1.25.4 darwin/arm64
Os Version: MacOS 26.1
OpenAPI Spec Version:

Signoff

  • I have submitted a CLA for this PR
  • Each commit message explains what the commit does
  • I have updated documentation to explain what my PR does
  • My code is covered by tests if required
  • I ran make fmt on my code
  • I did not edit any automatically generated files

@erezrokah
Copy link
Copy Markdown
Contributor Author

Hi @pranav-okta, can you point me in the right direction in making these fields non required via the code gen? We're seeing JSON marshalling failures due to these fields being required

@pranav-okta
Copy link
Copy Markdown
Contributor

Hey @erezrokah, I really appreciate your involvement.

To fix this, you need to update the spec and regenerate the SDK. To generate the code, please go through the GitHub action (prepareRelease.yml) and follow the make commands. I hope this is helpful but you can always reach out to us if you have any questions.

@erezrokah erezrokah force-pushed the fix/policy_people_condition branch from a149adf to 9bb5c01 Compare December 19, 2025 12:40
with:
ref: ${{ github.event.inputs.branch }}

- name: Remove v2
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved all these steps to the generate makefile target

@erezrokah
Copy link
Copy Markdown
Contributor Author

Hey @erezrokah, I really appreciate your involvement.

To fix this, you need to update the spec and regenerate the SDK. To generate the code, please go through the GitHub action (prepareRelease.yml) and follow the make commands. I hope this is helpful but you can always reach out to us if you have any questions.

Done in 9bb5c01

@erezrokah erezrokah force-pushed the fix/policy_people_condition branch 2 times, most recently from 394c887 to 2637ce7 Compare December 23, 2025 18:00
@erezrokah
Copy link
Copy Markdown
Contributor Author

erezrokah commented Dec 23, 2025

For context, some of the errors we're seeing are as follows:

SamlApplication: no value given for required property allowMultipleAcsEndpoints

SamlApplication: no value given for required property assertionSigned

so potentially there are more fields that needs to be marked as non required (e.g. assertionSigned)

@erezrokah erezrokah force-pushed the fix/policy_people_condition branch from 2637ce7 to 350da8c Compare December 29, 2025 11:00
alexander-vyh added a commit to alexander-vyh/okta-sdk-golang that referenced this pull request Feb 28, 2026
The Okta API does not always return grant_types in OIDC app responses,
but the OpenAPI spec marks it as required, causing UnmarshalJSON to fail
with "no value given for required property grant_types".

Applies the same fix pattern introduced in okta#559 (buttonField,
allowMultipleAcsEndpoints) to a field that PR did not cover.
Verified against a real Okta org: zero unmarshal errors across all apps
after this change.
alexander-vyh added a commit to alexander-vyh/okta-sdk-golang that referenced this pull request Feb 28, 2026
The Okta API does not always return grant_types in OIDC app responses,
but the OpenAPI spec marks it as required, causing UnmarshalJSON to fail
with "no value given for required property grant_types".

Applies the same fix pattern introduced in okta#559 (buttonField,
allowMultipleAcsEndpoints) to a field that PR did not cover:
- Remove grant_types from the required list in both spec YAML files
- Remove from requiredProperties validation in UnmarshalJSON
- Add omitempty to the JSON tag
- Update constructor and getters accordingly

Verified against a real Okta org: zero unmarshal errors across all apps
after this change.
@alexander-vyh
Copy link
Copy Markdown

Hi @erezrokah — thanks for tracking this down and putting together the fix pattern. While testing your PR against our org we found one more field with the same issue: grant_types on OpenIdConnectApplicationSettingsClient. We had been working around the unmarshal failures by falling back to raw HTTP, but your approach is much cleaner. Applied the same fix in #575 in case it's useful context.

Copilot AI review requested due to automatic review settings April 1, 2026 10:28
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the OpenAPI specs and regenerated Go models to stop treating certain fields as required when the Okta API may omit them in responses, preventing JSON (un)marshaling failures in v6.

Changes:

  • Removed required constraints for specific schemas in the OpenAPI specs and regenerated corresponding Go models to use optional/pointer fields.
  • Updated generated model docs to reflect optionality and new helper methods (HasX) / constructor signatures.
  • Refactored generation workflow to call make generate, and significantly altered several integration tests (currently into always-skipped stubs).

Reviewed changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
okta/api/openapi.yaml Removes required lists for affected schemas to match observed API responses.
.generator/okta-management-APIs-oasv3-noEnums-inheritance.yaml Mirrors the same required removals in the generator input spec.
okta/model_user_identifier_policy_rule_condition.go Makes patterns/type optional and removes required-field validation during unmarshal.
okta/model_swa_application_settings_application.go Makes previously required SWA settings fields optional/pointers; adjusts marshal/unmarshal behavior.
okta/model_saml_application_settings_sign_on.go Makes many previously required SAML sign-on fields optional/pointers; adjusts marshal/unmarshal behavior.
okta/docs/UserIdentifierPolicyRuleCondition.md Updates documentation to reflect optional fields and constructor signature change.
okta/docs/SwaApplicationSettingsApplication.md Updates documentation to reflect optional fields and constructor signature change.
okta/docs/SamlApplicationSettingsSignOn.md Updates documentation to reflect optional fields and constructor signature change.
okta/test/api_user_test.go Replaces runnable integration tests with always-skipped stubs and removes environment-guard/cleanup patterns.
okta/test/api_group_test.go Same as above for group tests (skipped stubs, missing request bodies/IDs, missing env guard).
okta/test/api_application_test.go Same as above for application tests (skipped stubs, missing request bodies/IDs, missing env guard).
Makefile Changes generate to a destructive + global-install based flow.
.github/workflows/prepareReleaseBranch.yml Switches release-branch preparation to run make generate.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 35 to 40
func Test_okta_ApplicationAPIService(t *testing.T) {
err := okta.ValidateTestEnvironment()
if err != nil {
t.Skip("Test environment not configured:", err)
}

configuration, err := okta.NewConfiguration()
configuration, err := openapiclient.NewConfiguration()
require.Nil(t, err)
apiClient := okta.NewAPIClient(configuration)
testDataManager := okta.GetTestDataManager()
apiClient := openapiclient.NewAPIClient(configuration)

Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NewConfiguration() errors when OKTA_CLIENT_ORGURL isn’t configured (it parses an empty URL). This test now require.Nil(t, err) before any t.Skip, so it will fail instead of being skipped in unconfigured environments. Restore the existing pattern used elsewhere (e.g., ValidateTestEnvironment() + t.Skip(...)) before creating the configuration/client.

Copilot uses AI. Check for mistakes.
Comment thread okta/test/api_application_test.go Outdated
Comment on lines 41 to 59
t.Run("Test ApplicationAPIService ActivateApplication", func(t *testing.T) {

resp, httpRes, err := apiClient.ApplicationAPI.CreateApplication(context.Background()).Application(appRequest).Execute()
t.Skip("skip test") // remove to run test

require.Nil(t, err)
require.NotNil(t, resp)
assert.Equal(t, http.StatusOK, httpRes.StatusCode)
var appId string

assert.NotNil(t, resp.BookmarkApplication)
assert.NotNil(t, resp.BookmarkApplication.Id)
assert.Equal(t, "Test Bookmark App", resp.BookmarkApplication.Label)
httpRes, err := apiClient.ApplicationAPI.ActivateApplication(context.Background(), appId).Execute()

if resp.BookmarkApplication.Id != nil {
testDataManager.TrackApplication(*resp.BookmarkApplication.Id)
}
})
require.Nil(t, err)
assert.Equal(t, 200, httpRes.StatusCode)

t.Run("Test ApplicationAPIService ListApplications", func(t *testing.T) {
// Just test listing applications without creating one first
// This tests the basic functionality of ListApplications
_, httpRes, err := apiClient.ApplicationAPI.ListApplications(context.Background()).Execute()

if err != nil {
// Handle known JSON unmarshaling issues in the SDK
if strings.Contains(err.Error(), "failed to unmarshal") && strings.Contains(err.Error(), "data matches more than one schema") {
t.Logf("Known SDK unmarshaling issue encountered: %v", err)
// This is acceptable - the API call succeeded but JSON unmarshaling failed
if httpRes != nil {
assert.Equal(t, http.StatusOK, httpRes.StatusCode)
}
return
}
t.Fatalf("Unexpected error: %v", err)
}
require.NotNil(t, httpRes)
assert.Equal(t, http.StatusOK, httpRes.StatusCode)
// We don't assert on the response contents since we don't know what applications exist
})

t.Run("Test ApplicationAPIService GetApplication", func(t *testing.T) {
// Create a test application first
var testFactoryInstance okta.TestFactory
appRequest := testFactoryInstance.NewValidTestCreateApplicationRequest()

createdApp, _, createErr := apiClient.ApplicationAPI.CreateApplication(context.Background()).Application(appRequest).Execute()
require.Nil(t, createErr)
require.NotNil(t, createdApp)
require.NotNil(t, createdApp.BookmarkApplication)
require.NotNil(t, createdApp.BookmarkApplication.Id)
t.Run("Test ApplicationAPIService CreateApplication", func(t *testing.T) {

if createdApp.BookmarkApplication.Id != nil {
testDataManager.TrackApplication(*createdApp.BookmarkApplication.Id)
}
t.Skip("skip test") // remove to run test

resp, httpRes, err := apiClient.ApplicationAPI.GetApplication(context.Background(), *createdApp.BookmarkApplication.Id).Execute()
resp, httpRes, err := apiClient.ApplicationAPI.CreateApplication(context.Background()).Execute()

Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All subtests are unconditionally skipped and use placeholder IDs / missing request bodies (e.g., CreateApplication(...).Execute() with no .Application(...)). As written, these tests can’t validate the marshaling/unmarshaling behavior this PR is about, and if the skip is removed they will fail with invalid requests. Either restore the prior real API tests (using TestFactory + TestDataManager) or remove these stubs from the test suite.

Copilot uses AI. Check for mistakes.
Comment on lines 35 to 40
func Test_okta_GroupAPIService(t *testing.T) {
err := okta.ValidateTestEnvironment()
if err != nil {
t.Skip("Test environment not configured:", err)
}

configuration, err := okta.NewConfiguration()
configuration, err := openapiclient.NewConfiguration()
require.Nil(t, err)
apiClient := okta.NewAPIClient(configuration)
testDataManager := okta.GetTestDataManager()

defer func() {
testDataManager.CleanupAllTestGroups()
testDataManager.CleanupAllTestUsers()
}()
apiClient := openapiclient.NewAPIClient(configuration)

Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NewConfiguration() can fail when env/config isn’t set; this file removed the ValidateTestEnvironment() guard that other integration tests use and now hard-fails with require.Nil(t, err). Please reintroduce ValidateTestEnvironment() + t.Skip(...) and the TestDataManager cleanup/teardown pattern so running go test ./okta/test doesn’t require credentials.

Copilot uses AI. Check for mistakes.
Comment thread okta/test/api_group_test.go Outdated
Comment on lines +41 to +76
t.Run("Test GroupAPIService AddGroup", func(t *testing.T) {
var testFactoryInstance okta.TestFactory
groupRequest := testFactoryInstance.NewValidTestAddGroupRequest()

resp, httpRes, err := apiClient.GroupAPI.AddGroup(context.Background()).Group(groupRequest).Execute()
t.Skip("skip test") // remove to run test

resp, httpRes, err := apiClient.GroupAPI.AddGroup(context.Background()).Execute()

require.Nil(t, err)
require.NotNil(t, resp)
assert.Equal(t, http.StatusOK, httpRes.StatusCode)
assert.Equal(t, 200, httpRes.StatusCode)

assert.NotNil(t, resp.Id)
assert.NotNil(t, resp.Profile)

if resp.Profile != nil && resp.Profile.OktaUserGroupProfile != nil {
assert.Equal(t, *groupRequest.Profile.Name, *resp.Profile.OktaUserGroupProfile.Name)
assert.Equal(t, *groupRequest.Profile.Description, *resp.Profile.OktaUserGroupProfile.Description)
}
})

assert.NotNil(t, resp.Created)
assert.NotNil(t, resp.LastUpdated)
t.Run("Test GroupAPIService AssignUserToGroup", func(t *testing.T) {

if resp.Id != nil {
testDataManager.TrackGroup(*resp.Id)
}
})
t.Skip("skip test") // remove to run test

t.Run("Test GroupAPIService GetGroup", func(t *testing.T) {
createdGroup, err := testDataManager.CreateTestGroup()
require.Nil(t, err)
require.NotNil(t, createdGroup)
require.NotNil(t, createdGroup.Id)
var groupId string
var userId string

resp, httpRes, err := apiClient.GroupAPI.GetGroup(context.Background(), *createdGroup.Id).Execute()
httpRes, err := apiClient.GroupAPI.AssignUserToGroup(context.Background(), groupId, userId).Execute()

require.Nil(t, err)
require.NotNil(t, resp)
assert.Equal(t, http.StatusOK, httpRes.StatusCode)

assert.Equal(t, *createdGroup.Id, *resp.Id)
assert.NotNil(t, resp.Profile)
assert.Equal(t, 200, httpRes.StatusCode)

if resp.Profile != nil && resp.Profile.OktaUserGroupProfile != nil &&
createdGroup.Profile != nil && createdGroup.Profile.OktaUserGroupProfile != nil {
assert.Equal(t, *createdGroup.Profile.OktaUserGroupProfile.Name, *resp.Profile.OktaUserGroupProfile.Name)
assert.Equal(t, *createdGroup.Profile.OktaUserGroupProfile.Description, *resp.Profile.OktaUserGroupProfile.Description)
}
})

t.Run("Test GroupAPIService ReplaceGroup", func(t *testing.T) {
createdGroup, err := testDataManager.CreateTestGroup()
require.Nil(t, err)
require.NotNil(t, createdGroup)
require.NotNil(t, createdGroup.Id)
t.Run("Test GroupAPIService DeleteGroup", func(t *testing.T) {

var testFactoryInstance okta.TestFactory
updateProfile := testFactoryInstance.NewTestGroupProfileUpdate()
updateRequest := okta.NewAddGroupRequest()
updateRequest.SetProfile(updateProfile)
t.Skip("skip test") // remove to run test

resp, httpRes, err := apiClient.GroupAPI.ReplaceGroup(context.Background(), *createdGroup.Id).Group(*updateRequest).Execute()
var groupId string

require.Nil(t, err)
require.NotNil(t, resp)
assert.Equal(t, http.StatusOK, httpRes.StatusCode)
httpRes, err := apiClient.GroupAPI.DeleteGroup(context.Background(), groupId).Execute()

assert.Equal(t, *createdGroup.Id, *resp.Id)
assert.NotNil(t, resp.Profile)
require.Nil(t, err)
assert.Equal(t, 200, httpRes.StatusCode)
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The previous group tests created real resources and asserted behavior; this version replaces them with always-skipped stubs, placeholder IDs, and missing request bodies (e.g., AddGroup(...).Execute() without .Group(...)). This effectively removes coverage and makes the tests non-runnable. Please keep runnable integration tests (or conditionally skip only when the environment isn’t configured).

Copilot uses AI. Check for mistakes.
Comment thread okta/test/api_user_test.go Outdated
Comment on lines +35 to +41
func Test_okta_UserAPIService(t *testing.T) {

// TestMain provides setup and teardown for all user tests
func TestMain(m *testing.M) {
if err := okta.ValidateTestEnvironment(); err != nil {
log.Printf("Test environment validation failed: %v", err)
log.Printf("Please set OKTA_CLIENT_ORGURL and OKTA_CLIENT_TOKEN environment variables")
os.Exit(1)
}
configuration, err := openapiclient.NewConfiguration()
require.Nil(t, err)
apiClient := openapiclient.NewAPIClient(configuration)

var err error
configuration, err := okta.NewConfiguration()
if err != nil {
log.Fatalf("Failed to create configuration: %v", err)
}
t.Run("Test UserAPIService CreateUser", func(t *testing.T) {
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file removed the TestMain/ValidateTestEnvironment setup and now calls NewConfiguration() + require.Nil(t, err) unconditionally. Since NewConfiguration() errors on an empty org URL, this will fail in environments without credentials instead of skipping. Reintroduce ValidateTestEnvironment() (or TestMain setup) so these integration tests safely skip when not configured.

Copilot uses AI. Check for mistakes.
Comment thread okta/test/api_user_test.go Outdated
Comment on lines +41 to +76
t.Run("Test UserAPIService CreateUser", func(t *testing.T) {

apiClient = okta.NewAPIClient(configuration)
testDataMgr = okta.GetTestDataManager()
testContext = context.Background()
t.Skip("skip test") // remove to run test

exitCode := m.Run()
resp, httpRes, err := apiClient.UserAPI.CreateUser(context.Background()).Execute()

log.Println("Cleaning up test resources...")
testDataMgr.CleanupAllTestUsers()
require.Nil(t, err)
require.NotNil(t, resp)
assert.Equal(t, 200, httpRes.StatusCode)

os.Exit(exitCode)
}
})

func Test_okta_UserAPIService(t *testing.T) {
t.Run("Test UserAPIService DeleteUser", func(t *testing.T) {

t.Skip("skip test") // remove to run test

var id string

httpRes, err := apiClient.UserAPI.DeleteUser(context.Background(), id).Execute()

require.Nil(t, err)
assert.Equal(t, 200, httpRes.StatusCode)

t.Run("Test UserAPIService CreateUser", func(t *testing.T) {
testFactory := &okta.TestFactory{}
profile := testFactory.NewValidTestUserProfile()
credentials := testFactory.NewValidTestUserCredentialsWithPassword()

createReq := okta.NewCreateUserRequest(profile)
createReq.SetCredentials(*credentials)

req := apiClient.UserAPI.CreateUser(testContext).Body(*createReq).Activate(false)
resp, httpRes, err := req.Execute()

require.NoError(t, err, "CreateUser should not return an error")
require.NotNil(t, resp, "Response should not be nil")
assert.Equal(t, http.StatusOK, httpRes.StatusCode, "HTTP status should be 200")

assert.NotNil(t, resp.Id, "User ID should be set")
assert.NotNil(t, resp.Profile, "User profile should be set")
if resp.Profile != nil {
assert.Equal(t, profile.GetFirstName(), resp.Profile.GetFirstName(), "First name should match")
assert.Equal(t, profile.GetLastName(), resp.Profile.GetLastName(), "Last name should match")
assert.Equal(t, profile.GetEmail(), resp.Profile.GetEmail(), "Email should match")
}

if resp.Id != nil {
testDataMgr.TrackUser(*resp.Id)
}
})

t.Run("Test UserAPIService GetUser", func(t *testing.T) {
createdUser, err := testDataMgr.CreateTestUser()
require.NoError(t, err, "Failed to create test user")
require.NotNil(t, createdUser.Id, "Created user should have an ID")

resp, httpRes, err := apiClient.UserAPI.GetUser(testContext, *createdUser.Id).Execute()
t.Skip("skip test") // remove to run test

var id string

require.NoError(t, err, "GetUser should not return an error")
require.NotNil(t, resp, "Response should not be nil")
assert.Equal(t, http.StatusOK, httpRes.StatusCode, "HTTP status should be 200")
resp, httpRes, err := apiClient.UserAPI.GetUser(context.Background(), id).Execute()

require.Nil(t, err)
require.NotNil(t, resp)
assert.Equal(t, 200, httpRes.StatusCode)
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The user API tests were converted from runnable integration tests (creating users via TestFactory and cleaning up via TestDataManager) into always-skipped placeholders with empty IDs and incomplete requests (e.g., CreateUser(...).Execute() without a body). This removes the regression coverage that would catch the marshaling failures mentioned in the PR description. Please restore the prior tests or add focused tests that reproduce the original marshaling issue and assert it’s fixed.

Copilot uses AI. Check for mistakes.
Comment thread Makefile Outdated
Comment on lines +78 to +86
generate:
npx @openapitools/openapi-generator-cli generate -c ./.generator/config.yaml -i .generator/okta-management-APIs-oasv3-noEnums-inheritance.yaml --skip-validate-spec

rm -rf okta openapi tests go.mod go.sum
npm install @openapitools/openapi-generator-cli -g
openapi-generator-cli version-manager set 7.15.0
openapi-generator-cli generate -c ./.generator/config.yaml -i .generator/okta-management-APIs-oasv3-noEnums-inheritance.yaml --skip-validate-spec
make fmt
make import
cd okta/v6 && mv go.mod go.sum ../../
cd okta && mv v6/* ./ && rm -rf v6
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

make generate now (1) deletes tracked directories/files (rm -rf okta openapi tests go.mod go.sum) and (2) installs openapi-generator-cli globally. This is destructive for local workflows and makes CI less reproducible (global npm state, version-manager side effects). Consider generating into a temp dir and swapping atomically, and prefer a pinned npx @openapitools/openapi-generator-cli@<ver> ... invocation (no global install).

Copilot uses AI. Check for mistakes.
Comment on lines 96 to +100
// NewSamlApplicationSettingsSignOn instantiates a new SamlApplicationSettingsSignOn object
// This constructor will assign default values to properties that have it defined,
// and makes sure properties required by API are set, but the set of arguments
// will change when the set of required properties is changed
func NewSamlApplicationSettingsSignOn(allowMultipleAcsEndpoints bool, assertionSigned bool, audience string, authnContextClassRef string, destination string, digestAlgorithm string, honorForceAuthn bool, idpIssuer string, recipient string, requestCompressed bool, responseSigned bool, signatureAlgorithm string, ssoAcsUrl string, subjectNameIdFormat string, subjectNameIdTemplate string) *SamlApplicationSettingsSignOn {
func NewSamlApplicationSettingsSignOn() *SamlApplicationSettingsSignOn {
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NewSamlApplicationSettingsSignOn(...) changed from a required-args constructor to a no-arg constructor. This is a breaking change for SDK consumers calling the old constructor and/or relying on the previously non-pointer required fields. Please add an explicit migration note (CHANGELOG/MIGRATING) or provide a compatibility helper to reduce upgrade friction.

Copilot uses AI. Check for mistakes.
@erezrokah erezrokah force-pushed the fix/policy_people_condition branch from 40647a8 to d443e8b Compare April 2, 2026 08:56
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.

4 participants