Skip to content

Commit

Permalink
feat: add seam cli code samples (#58)
Browse files Browse the repository at this point in the history
* feat: add seam cli code samples

* rename bash -> seam_cli

* add req/res syntax

* ci: Generate code

* Update src/lib/code-sample/schema.ts

Co-authored-by: Evan Sosenko <evan@getseam.com>

* ci: Generate code

* fix double quotes

---------

Co-authored-by: Seam Bot <devops@getseam.com>
Co-authored-by: Evan Sosenko <evan@getseam.com>
  • Loading branch information
3 people authored Aug 13, 2024
1 parent 67bbff4 commit f41c469
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 1 deletion.
25 changes: 24 additions & 1 deletion src/lib/code-sample/schema.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { z } from 'zod'

import type { Endpoint } from 'lib/blueprint.js'
import {
createSeamCliRequest,
createSeamCliResponse,
} from 'lib/code-sample/seam-cli.js'
import { JsonSchema } from 'lib/json.js'

import {
Expand Down Expand Up @@ -35,13 +39,17 @@ export type CodeSampleDefinitionInput = z.input<

export type CodeSampleDefinition = z.output<typeof CodeSampleDefinitionSchema>

const syntax = z.enum(['javascript', 'json', 'python', 'php', 'ruby', 'bash'])

const CodeSampleSchema = CodeSampleDefinitionSchema.extend({
code: z.record(
z.enum(['javascript', 'python', 'php', 'ruby']),
z.enum(['javascript', 'python', 'php', 'ruby', 'seam_cli']),
z.object({
title: z.string().min(1),
request: z.string(),
response: z.string(),
request_syntax: syntax,
response_syntax: syntax,
}),
),
})
Expand All @@ -63,21 +71,36 @@ export const createCodeSample = (
title: 'JavaScript',
request: createJavascriptRequest(codeSampleDefinition, context),
response: createJavascriptResponse(codeSampleDefinition, context),
request_syntax: 'javascript',
response_syntax: 'javascript',
},
python: {
title: 'Python',
request: createPythonRequest(codeSampleDefinition, context),
response: createPythonResponse(codeSampleDefinition, context),
request_syntax: 'python',
response_syntax: 'python',
},
ruby: {
title: 'Ruby',
request: createRubyRequest(codeSampleDefinition, context),
response: createRubyResponse(codeSampleDefinition, context),
request_syntax: 'ruby',
response_syntax: 'ruby',
},
php: {
title: 'PHP',
request: createPhpRequest(codeSampleDefinition, context),
response: createPhpResponse(codeSampleDefinition, context),
request_syntax: 'php',
response_syntax: 'json',
},
seam_cli: {
title: 'Seam CLI',
request: createSeamCliRequest(codeSampleDefinition, context),
response: createSeamCliResponse(codeSampleDefinition, context),
request_syntax: 'bash',
response_syntax: 'json',
},
},
}
Expand Down
18 changes: 18 additions & 0 deletions src/lib/code-sample/seam-cli.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { kebabCase } from 'change-case'

import { createJsonResponse } from './create-json-response.js'
import type { CodeSampleDefinition, Context } from './schema.js'

export const createSeamCliRequest = (
{ request }: CodeSampleDefinition,
_context: Context,
): string => {
const parts = request.path.split('/')
const requestParams = Object.entries(request.parameters)
.map(([key, value]) => `--${key} ${JSON.stringify(value)}`)
.join(' ')

return `seam${parts.map((p) => kebabCase(p)).join(' ')} ${requestParams}`
}

export const createSeamCliResponse = createJsonResponse
60 changes: 60 additions & 0 deletions test/snapshots/blueprint.test.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,27 +70,42 @@ Generated by [AVA](https://avajs.dev).
code: {
javascript: {
request: 'await seam.foos.get({"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33"})',
request_syntax: 'javascript',
response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}',
response_syntax: 'javascript',
title: 'JavaScript',
},
php: {
request: '$seam->foos->get(foo_id:"8d7e0b3a-b889-49a7-9164-4b71a0506a33")',
request_syntax: 'php',
response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}',
response_syntax: 'json',
title: 'PHP',
},
python: {
request: 'seam.foos.get(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33")',
request_syntax: 'python',
response: 'Foo(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", name="Best foo", nullable_property=None)',
response_syntax: 'python',
title: 'Python',
},
ruby: {
request: 'seam.foos.get(foo_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33")',
request_syntax: 'ruby',
response: `<Seam::Foo:0x00000␊
foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33"␊
name="Best foo"␊
nullable_property=nil>`,
response_syntax: 'ruby',
title: 'Ruby',
},
seam_cli: {
request: 'seam foos get --foo_id "8d7e0b3a-b889-49a7-9164-4b71a0506a33"',
request_syntax: 'bash',
response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}',
response_syntax: 'json',
title: 'Seam CLI',
},
},
description: 'This is the way to get a foo',
request: {
Expand Down Expand Up @@ -139,27 +154,42 @@ Generated by [AVA](https://avajs.dev).
code: {
javascript: {
request: 'await seam.foos.get({"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33"})',
request_syntax: 'javascript',
response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}',
response_syntax: 'javascript',
title: 'JavaScript',
},
php: {
request: '$seam->foos->get(foo_id:"8d7e0b3a-b889-49a7-9164-4b71a0506a33")',
request_syntax: 'php',
response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}',
response_syntax: 'json',
title: 'PHP',
},
python: {
request: 'seam.foos.get(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33")',
request_syntax: 'python',
response: 'Foo(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", name="Best foo", nullable_property=None)',
response_syntax: 'python',
title: 'Python',
},
ruby: {
request: 'seam.foos.get(foo_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33")',
request_syntax: 'ruby',
response: `<Seam::Foo:0x00000␊
foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33"␊
name="Best foo"␊
nullable_property=nil>`,
response_syntax: 'ruby',
title: 'Ruby',
},
seam_cli: {
request: 'seam foos get --foo_id "8d7e0b3a-b889-49a7-9164-4b71a0506a33"',
request_syntax: 'bash',
response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}',
response_syntax: 'json',
title: 'Seam CLI',
},
},
description: 'This is the way to get a foo',
request: {
Expand Down Expand Up @@ -208,27 +238,42 @@ Generated by [AVA](https://avajs.dev).
code: {
javascript: {
request: 'await seam.foos.list()',
request_syntax: 'javascript',
response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]',
response_syntax: 'javascript',
title: 'JavaScript',
},
php: {
request: '$seam->foos->list()',
request_syntax: 'php',
response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]',
response_syntax: 'json',
title: 'PHP',
},
python: {
request: 'seam.foos.list()',
request_syntax: 'python',
response: '[Foo(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", name="Best foo", nullable_property=None)]',
response_syntax: 'python',
title: 'Python',
},
ruby: {
request: 'seam.foos.list()',
request_syntax: 'ruby',
response: `[<Seam::Foos:0x00000␊
foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33"␊
name="Best foo"␊
nullable_property=nil>]`,
response_syntax: 'ruby',
title: 'Ruby',
},
seam_cli: {
request: 'seam foos list ',
request_syntax: 'bash',
response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]',
response_syntax: 'json',
title: 'Seam CLI',
},
},
description: 'This is the way to list foos',
request: {
Expand Down Expand Up @@ -277,27 +322,42 @@ Generated by [AVA](https://avajs.dev).
code: {
javascript: {
request: 'await seam.foos.list()',
request_syntax: 'javascript',
response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]',
response_syntax: 'javascript',
title: 'JavaScript',
},
php: {
request: '$seam->foos->list()',
request_syntax: 'php',
response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]',
response_syntax: 'json',
title: 'PHP',
},
python: {
request: 'seam.foos.list()',
request_syntax: 'python',
response: '[Foo(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", name="Best foo", nullable_property=None)]',
response_syntax: 'python',
title: 'Python',
},
ruby: {
request: 'seam.foos.list()',
request_syntax: 'ruby',
response: `[<Seam::Foos:0x00000␊
foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33"␊
name="Best foo"␊
nullable_property=nil>]`,
response_syntax: 'ruby',
title: 'Ruby',
},
seam_cli: {
request: 'seam foos list ',
request_syntax: 'bash',
response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]',
response_syntax: 'json',
title: 'Seam CLI',
},
},
description: 'This is the way to list foos',
request: {
Expand Down
Binary file modified test/snapshots/blueprint.test.ts.snap
Binary file not shown.

0 comments on commit f41c469

Please sign in to comment.