codecombat/app/schemas/models/level_component.coffee
2014-07-01 12:23:22 +08:00

164 lines
7 KiB
CoffeeScript

c = require './../schemas'
metaschema = require './../metaschema'
attackSelfCode = """
class AttacksSelf extends Component
@className: 'AttacksSelf'
chooseAction: ->
@attack @
"""
systems = [
'action', 'ai', 'alliance', 'collision', 'combat', 'display', 'event', 'existence', 'hearing',
'inventory', 'movement', 'programming', 'targeting', 'ui', 'vision', 'misc', 'physics', 'effect',
'magic'
]
PropertyDocumentationSchema = c.object {
title: 'Property Documentation'
description: 'Documentation entry for a property this Component will add to its Thang which other Components might want to also use.'
'default':
name: 'foo'
type: 'object'
description: 'The `foo` property can satisfy all the #{spriteName}\'s foobar needs. Use it wisely.'
required: ['name', 'type', 'description']
},
name: {type: 'string', title: 'Name', description: 'Name of the property.'}
# not actual JS types, just whatever they describe...
type: c.shortString(title: 'Type', description: 'Intended type of the property.')
description:
oneOf: [
{title: 'Description', type: 'string', description: 'Description of the property.', maxLength: 1000, format: 'markdown'}
{
type: 'object',
title: 'Language Descriptions',
description: 'Property descriptions by code language.',
additionalProperties: {type: 'string', description: 'Description of the property.', maxLength: 1000, format: 'markdown'}
}
]
args: c.array {title: 'Arguments', description: 'If this property has type "function", then provide documentation for any function arguments.'}, c.FunctionArgumentSchema
owner: {title: 'Owner', type: 'string', description: 'Owner of the property, like "this" or "Math".'}
example:
oneOf: [
{title: 'Example', type: 'string', description: 'An optional example code block.', format: 'javascript'}
{
type: 'object',
title: 'Language Examples',
description: 'Examples by code language.',
additionalProperties: {type: 'string', description: 'An example code block.', format: 'javascript'} # TODO: not JS
}
]
snippets: c.object {
title: 'Snippets',
description: 'List of snippets for the respective programming languages'
},
javascript: c.object {title: 'JavaScript'}, c.codeSnippet 'javascript'
coffeescript: c.object {title: 'CoffeeScript'}, c.codeSnippet 'coffee'
python: c.object {title: 'Python'}, c.codeSnippet 'python'
clojure: c.object {title: 'Clojure'}, c.codeSnippet 'clojure'
lua: c.object {title: 'Lua'}, c.codeSnippet 'lua'
io: c.object {title: 'IO'}, c.codeSnippet 'io'
returns: c.object {
title: 'Return Value'
description: 'Optional documentation of any return value.'
required: ['type']
default: {type: 'null'}
},
type: c.shortString(title: 'Type', description: 'Type of the return value')
example:
oneOf: [
c.shortString(title: 'Example', description: 'Example return value')
{
type: 'object',
title: 'Language Examples',
description: 'Example return values by code language.',
additionalProperties: c.shortString(description: 'Example return value.', format: 'javascript') # TODO: not JS
}
]
description:
oneOf: [
{title: 'Description', type: 'string', description: 'Description of the return value.', maxLength: 1000}
{
type: 'object',
title: 'Language Descriptions',
description: 'Example return values by code language.',
additionalProperties: {type: 'string', description: 'Description of the return value.', maxLength: 1000}
}
]
DependencySchema = c.object {
title: 'Component Dependency'
description: 'A Component upon which this Component depends.'
'default':
#original: ?
majorVersion: 0
required: ['original', 'majorVersion']
format: 'latest-version-reference'
links: [{rel: 'db', href: '/db/level.component/{(original)}/version/{(majorVersion)}'}]
},
original: c.objectId(title: 'Original', description: 'A reference to another Component upon which this Component depends.')
majorVersion:
title: 'Major Version'
description: 'Which major version of the Component this Component needs.'
type: 'integer'
minimum: 0
LevelComponentSchema = c.object {
title: 'Component'
description: 'A Component which can affect Thang behavior.'
required: ['system', 'name', 'description', 'code', 'dependencies', 'propertyDocumentation', 'codeLanguage']
'default':
system: 'ai'
name: 'AttacksSelf'
description: 'This Component makes the Thang attack itself.'
code: attackSelfCode
codeLanguage: 'coffeescript'
dependencies: [] # TODO: should depend on something by default
propertyDocumentation: []
}
c.extendNamedProperties LevelComponentSchema # let's have the name be the first property
LevelComponentSchema.properties.name.pattern = c.classNamePattern
_.extend LevelComponentSchema.properties,
system:
title: 'System'
description: 'The short name of the System this Component belongs to, like \"ai\".'
type: 'string'
'enum': systems
'default': 'ai'
description:
title: 'Description'
description: 'A short explanation of what this Component does.'
type: 'string'
maxLength: 2000
'default': 'This Component makes the Thang attack itself.'
codeLanguage:
type: 'string'
title: 'Language'
description: 'Which programming language this Component is written in.'
'enum': ['coffeescript']
code:
title: 'Code'
description: 'The code for this Component, as a CoffeeScript class. TODO: add link to documentation for how to write these.'
'default': attackSelfCode
type: 'string'
format: 'coffee'
js:
title: 'JavaScript'
description: 'The transpiled JavaScript code for this Component'
type: 'string'
format: 'hidden'
dependencies: c.array {title: 'Dependencies', description: 'An array of Components upon which this Component depends.', 'default': [], uniqueItems: true}, DependencySchema
propertyDocumentation: c.array {title: 'Property Documentation', description: 'An array of documentation entries for each notable property this Component will add to its Thang which other Components might want to also use.', 'default': []}, PropertyDocumentationSchema
configSchema: _.extend metaschema, {title: 'Configuration Schema', description: 'A schema for validating the arguments that can be passed to this Component as configuration.', default: {type: 'object', additionalProperties: false}}
official:
type: 'boolean'
title: 'Official'
description: 'Whether this is an official CodeCombat Component.'
'default': false
c.extendBasicProperties LevelComponentSchema, 'level.component'
c.extendSearchableProperties LevelComponentSchema
c.extendVersionedProperties LevelComponentSchema, 'level.component'
c.extendPermissionsProperties LevelComponentSchema, 'level.component'
c.extendPatchableProperties LevelComponentSchema
module.exports = LevelComponentSchema