diff --git a/.jshintrc b/.jshintrc index a3ad17f..6f9bf81 100644 --- a/.jshintrc +++ b/.jshintrc @@ -19,7 +19,6 @@ "immed": true, "browser": false, "es3": true, - "maxlen": 80, "nonbsp": true, "freeze": true, "node": true, diff --git a/.travis.yml b/.travis.yml index e843f40..30818d8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ before_install: - if [[ "$TASK" == "spellintian" ]]; then sudo add-apt-repository ppa:waja/trusty-backports -y; sudo apt-get update -qq; sudo apt-get install lintian -y; fi # Install a late enough lintian install: - - if [ "$TASK" = "codespell" ]; then npm install -g grunt-cli; fi + - if [ "$TASK" = "npm-test" ]; then npm install -g grunt-cli; fi - if [ "$TASK" = "npm-test" ]; then npm install; fi - if [ "$TASK" = "codespell" ]; then pip install urllib3[secure]; fi - if [ "$TASK" = "codespell" ]; then sudo pip install --upgrade git+https://github.com/codespell-project/codespell.git; fi diff --git a/data/bitfields.json b/data/bitfields.json index 67dd2b7..1a27f67 100644 --- a/data/bitfields.json +++ b/data/bitfields.json @@ -2,22 +2,18 @@ "name": "PROXIED_DEVICES", "pid": 16, "version": 1, - "get_request": { - "fields": [] - }, - "get_response": { - "fields": [ - { - "type": "bitfield", - "size": 8, - "bits": [ - { - "index": 0, - "name": "foo" - } - ] - } - ] - }, - "get_subdevice_range": 0 + "get_request": [], + "get_response": [ + { + "type": "bitField", + "size": 8, + "bits": [ + { + "index": 0, + "name": "foo" + } + ] + } + ], + "get_subdevice_range": "root" } diff --git a/data/device_info.json b/data/device_info.json index 320f463..b514d35 100644 --- a/data/device_info.json +++ b/data/device_info.json @@ -2,38 +2,34 @@ "name": "DEVICE_INFO", "pid": 96, "version": 1, - "get_request": { - "fields": [] - }, - "get_response": { - "fields": [ - {"name": "protocol_major", "type": "uint8"}, - {"name": "protocol_minor", "type": "uint8"}, - {"name": "device_model", "type": "uint16"}, - {"name": "product_category", "type": "uint16"}, - {"name": "software_version", "type": "uint32"}, - { - "name": "dmx_footprint", - "type": "uint16", - "ranges": [ - { - "lower": 0, - "upper": 512 - } - ], - "labels": [ - { - "label": "No footprint", - "value": 65535 - } - ] - }, - {"name": "current_personality", "type": "uint8"}, - {"name": "personality_count", "type": "uint8"}, - {"name": "dmx_start_address", "type": "uint16"}, - {"name": "sub_device_count", "type": "uint16"}, - {"name": "sensor_count", "type": "uint8"} - ] - }, - "get_subdevice_range": 2 + "get_request": [], + "get_response": [ + {"name": "protocol_major", "type": "uint8"}, + {"name": "protocol_minor", "type": "uint8"}, + {"name": "device_model", "type": "uint16"}, + {"name": "product_category", "type": "uint16"}, + {"name": "software_version", "type": "uint32"}, + { + "name": "dmx_footprint", + "type": "uint16", + "ranges": [ + { + "minimum": 0, + "maximum": 512 + } + ], + "labels": [ + { + "label": "No footprint", + "value": 65535 + } + ] + }, + {"name": "current_personality", "type": "uint8"}, + {"name": "personality_count", "type": "uint8"}, + {"name": "dmx_start_address", "type": "uint16"}, + {"name": "sub_device_count", "type": "uint16"}, + {"name": "sensor_count", "type": "uint8"} + ], + "get_subdevice_range": "root_or_any_subdevice" } diff --git a/data/dmx_start_address.json b/data/dmx_start_address.json index 5acf044..524c40f 100644 --- a/data/dmx_start_address.json +++ b/data/dmx_start_address.json @@ -2,52 +2,44 @@ "name": "DMX_START_ADDRESS", "pid": 240, "version": 1, - "get_request": { - "fields": [] - }, - "get_response": { - "fields": [ - { - "name": "start_address", - "type": "uint16", - "ranges": [ - { - "lower": 0, - "upper": 512 - } - ], - "labels": [ - { - "label": "No footprint", - "value": 65535 - } - ] - } - ] - }, - "get_subdevice_range": 2, - "set_request": { - "fields": [ - { - "name": "start_address", - "type": "uint16", - "ranges": [ - { - "lower": 0, - "upper": 512 - } - ], - "labels": [ - { - "label": "No footprint", - "value": 65535 - } - ] - } - ] - }, - "set_response": { - "fields": [] - }, - "set_subdevice_range": 3 + "get_request": [], + "get_response": [ + { + "name": "start_address", + "type": "uint16", + "ranges": [ + { + "minimum": 0, + "maximum": 512 + } + ], + "labels": [ + { + "label": "No footprint", + "value": 65535 + } + ] + } + ], + "get_subdevice_range": "root_or_any_subdevice", + "set_request": [ + { + "name": "start_address", + "type": "uint16", + "ranges": [ + { + "minimum": 0, + "maximum": 512 + } + ], + "labels": [ + { + "label": "No footprint", + "value": 65535 + } + ] + } + ], + "set_response": [], + "set_subdevice_range": "root_or_any_subdevice_or_broadcast" } diff --git a/data/proxied_devices.json b/data/proxied_devices.json index 768260d..ca04790 100644 --- a/data/proxied_devices.json +++ b/data/proxied_devices.json @@ -2,22 +2,16 @@ "name": "PROXIED_DEVICES", "pid": 16, "version": 1, - "get_request": { - "fields": [] - }, - "get_response": { - "fields": [ - { - "name": "devices", - "type": "group", - "fields": [ - { - "name": "uid", - "type": "uid" - } - ] + "get_request": [], + "get_response": [ + { + "name": "devices", + "type": "list", + "itemType": { + "name": "uid", + "type": "uid" } - ] - }, - "get_subdevice_range": 2 + } + ], + "get_subdevice_range": "root_or_any_subdevice" } diff --git a/package.json b/package.json index 7c531b2..81d15b2 100644 --- a/package.json +++ b/package.json @@ -6,10 +6,10 @@ "dependencies": { "grunt": "^1.0.0", "grunt-contrib-jshint": "^0.12.0", - "grunt-jsonschema-ajv": "^0.1.0", + "grunt-jsonschema-ajv": "github:peternewman/grunt-jsonschema-ajv#travis", "ajv": "^6.10.2" }, "scripts": { - "test": "grunt --verbose --stack" + "test": "grunt --verbose --debug --stack" } } diff --git a/schema.json b/schema.json index ecc5cd3..c18d93f 100644 --- a/schema.json +++ b/schema.json @@ -1,255 +1,252 @@ { - "$schema": "http://json-schema.org/draft-04/schema#", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Parameter Metadata Language Schema, Informative", + "description": "The (informative) schema for the Parameter Metadata Language from E1.37-5, Section 5. This schema is subject to change.", "definitions": { - "bitfield": { + "bitType": { + "description": "Describes the meaning of one bit in a bit field.", "type": "object", "properties": { + "name": { "$ref": "#/definitions/nameType" }, "index": { "type": "integer", "minimum": 0 - }, - "name": { - "$ref": "#/definitions/name" } }, - "required": ["index", "name"] + "required": [ "name", "index" ] + }, + "bitFieldType": { + "description": "A bit field, a collection of 'bit' items.", + "properties": { + "name": { "$ref": "#/definitions/nameType" }, + "type": { "const": "bitField" }, + "bits": { + "type": "array", + "items": { "$ref": "#/definitions/bitType" }, + "uniqueItems": true + }, + "size": { + "type": "integer", + "multipleOf": 8 + } + }, + "required": [ "type", "bits" ] + }, + "commandType": { + "description": "Represents an RDM command, a collection of 'field' items, each a simple or compound type.", + "type": "array", + "items": { "$ref": "#/definitions/oneOfTypes" }, + "uniqueItems": true }, - "command": { + "compoundType": { + "description": "Defines a compound type, a type used to combine other types. This is useful for including in lists.", "type": "object", "properties": { - "fields": { + "name": { "$ref": "#/definitions/nameType" }, + "type": { "const": "compound" }, + "subtypes": { "type": "array", "items": { - "$ref": "#/definitions/field" + "$ref": "#/definitions/oneOfTypes" } } }, - "required": ["fields"] + "required": [ "type", "subtypes" ] }, - "field": { - "type": "object", - "oneOf": [ - { - "properties": { - "type": { - "enum": ["bitfield"] - }, - "bits": { - "type": "array", - "items": { - "$ref": "#/definitions/bitfield" - } - }, - "size": { - "type": "integer", - "multipleOf": 8 - } - }, - "required": ["bits", "type", "size"] - }, - { - "properties": { - "type": { - "enum": ["bool"] - }, - "name": { - "$ref": "#/definitions/name" - } - }, - "required": ["name", "type"] - }, - { - "properties": { - "type": { - "enum": ["int8", "int16", "int32", "int64", - "uint8", "uint16", "uint32", "uint64"] - }, - "name": { - "$ref": "#/definitions/name" - }, - "labels": { - "type": "array", - "items": { - "$ref": "#/definitions/label" - } - }, - "prefix": { - "type": "integer", - "maximum": 255, - "minimum": 0 - }, - "ranges": { - "type": "array", - "items": { - "$ref": "#/definitions/range" - } - }, - "unit": { - "type": "integer", - "maximum": 255, - "minimum": 0 - } - }, - "required": ["name", "type"] - }, - { - "properties": { - "type": { - "enum": ["string"] - }, - "name": { - "$ref": "#/definitions/name" - }, - "max_size": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "min_size": { - "type": "integer", - "minimum": 0 - } - }, - "required": ["name", "type"] + "integerType": { + "description": "A signed or unsigned integer, can have an optional prefix, unit, and range.", + "properties": { + "name": { "$ref": "#/definitions/nameType" }, + "type": { + "enum": [ + "int8", + "int16", + "int32", + "int64", + "uint8", + "uint16", + "uint32", + "uint64" + ] }, - { - "properties": { - "type": { - "enum": ["ipv4"] - }, - "name": { - "$ref": "#/definitions/name" - } - }, - "required": ["name", "type"] + "labels": { + "description": "A list of labels that name special values.", + "type": "array", + "items": { "$ref": "#/definitions/labeledIntegerType" }, + "uniqueItems": true }, - { - "properties": { - "type": { - "enum": ["mac"] - }, - "name": { - "$ref": "#/definitions/name" - } - }, - "required": ["name", "type"] + "prefix": { + "description": "The unit prefix, defined in Table A-14 of E1.20.", + "type": "integer", + "minimum": 0, + "maximum": 255 }, - { - "properties": { - "type": { - "enum": ["uid"] - }, - "name": { - "$ref": "#/definitions/name" - } - }, - "required": ["name", "type"] + "ranges": { + "description": "A list of possible ranges for the value. The complete range is the union of all the ranges and labels.", + "type": "array", + "items": { "$ref": "#/definitions/rangeType" }, + "uniqueItems": true }, - { - "properties": { - "type": { - "enum": ["group"] - }, - "name": { - "$ref": "#/definitions/name" - }, - "fields": { - "type": "array", - "items": { - "$ref": "#/definitions/field" - } - }, - "max_size": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "min_size": { - "type": "integer", - "minimum": 0 - } - }, - "required": ["name", "fields", "type"] + "unit": { + "description": "The unit type, defined in Table A-13 of E1.20.", + "type": "integer", + "minimum": 0, + "maximum": 255 } - ] + }, + "required": [ "type" ] + }, + "labeledIntegerType": { + "description": "Associates a name to an integer value.", + "type": "object", + "properties": { + "name": { "$ref": "#/definitions/nameType" }, + "value": { "type": "integer" } + }, + "required": [ "value" ] }, - "label": { + "listType": { + "description": "A list of objects all having the same type.", "type": "object", "properties": { - "label": { - "minLength": 1, - "type": "string" + "name": { "$ref": "#/definitions/nameType" }, + "type": { "const": "list" }, + "itemType": { + "$ref": "#/definitions/oneOfTypes" }, - "value": { + "minItems": { + "description": "The minimum list size.", + "type": "integer", + "minimum": 0 + }, + "maxItems": { + "description": "The maximum list size.", "type": "integer", - "maximum": 4294967295, "minimum": 0 } }, - "required": ["label", "value"] + "required": [ "type", "itemType" ] }, - "name": { + "nameType": { + "description": "A name is a string having a length of at least 1.", "type": "string", "minLength": 1 }, - "range": { + "oneOfTypes": { + "description": "One of any of the types. This provides a single location to keep the list.", + "oneOf": [ + { "$ref": "#/definitions/bitFieldType" }, + { "$ref": "#/definitions/compoundType" }, + { "$ref": "#/definitions/integerType" }, + { "$ref": "#/definitions/listType" }, + { "$ref": "#/definitions/pdEnvelopeType" }, + { "$ref": "#/definitions/simpleType" }, + { "$ref": "#/definitions/stringType" } + ] + }, + "subdeviceType": { + "description": "A subdevice type. One of the root device (e.g. value 0), the root or all subdevices or the broadcast subdevice, the root or any subdevice, or just any subdevice.", + "type" : "string", + "enum": [ + "root", + "root_or_any_subdevice_or_broadcast", + "root_or_any_subdevice", + "any_subdevice" + ] + }, + "pdEnvelopeType": { + "description": "Contains a length/data pair for one Parameter Data item, where the length is an unsigned 8-bit value and the data has 'length' bytes. This exists to provide a schema definition for the 'envelope' of a PDL/PD pair.", + "type": "object", + "properties": { + "type": { "const": "pdEnvelope" }, + "length": { + "description": "The data length can be optionally specified.", + "type": "integer", + "minimum": 0 + } + }, + "required": [ "type" ] + }, + "rangeType": { + "description": "Defines an inclusive range of numbers.", "type": "object", "properties": { - "lower": { + "minimum": { + "description": "The lower bound, inclusive.", "type": "integer" }, - "upper": { + "maximum": { + "description": "The upper bound, inclusive.", "type": "integer" } }, - "required": ["lower", "upper"] + "required": [ "minimum", "maximum" ] + }, + "simpleType": { + "description": "Simple type that has no fields other than a name and type.", + "type": "object", + "properties": { + "name": { "$ref": "#/definitions/nameType" }, + "type": { + "enum": [ + "bool", + "hostname", + "ipv4", + "ipv6", + "mac", + "uid", + "url" + ] + } + }, + "required": [ "type" ] + }, + "stringType": { + "description": "A string having a possibly bounded size.", + "properties": { + "name": { "$ref": "#/definitions/nameType" }, + "type": { "const": "string" }, + "minLength": { + "description": "The minimum string length.", + "type": "integer", + "minimum": 0 + }, + "maxLength": { + "description": "The maximum string length.", + "type": "integer", + "minimum": 0 + } + }, + "required": [ "type" ] } }, "type": "object", "properties": { - "get_request": { - "$ref": "#/definitions/command" - }, - "get_response": { - "$ref": "#/definitions/command" - }, - "get_subdevice_range": { - "maximum": 3, - "minimum": 0, - "type": "integer" - }, - "name": { - "minLength": 1, - "type": "string" - }, + "name": { "$ref": "#/definitions/nameType" }, "pid": { - "maximum": 65535, - "minimum": 0, - "type": "integer" - }, - "set_request": { - "$ref": "#/definitions/command" - }, - "set_response": { - "$ref": "#/definitions/command" - }, - "set_subdevice_range": { - "maximum": 3, + "type": "integer", "minimum": 0, - "type": "integer" + "maximum": 65535 }, "version": { - "minimum": 0, - "type": "integer" - } + "type": "integer", + "minimum": 1, + "maximum": 65535 + }, + "get_request": { "$ref": "#/definitions/commandType" }, + "get_response": { "$ref": "#/definitions/commandType" }, + "get_subdevice_range" : { "$ref": "#/definitions/subdeviceType" }, + "set_request": { "$ref": "#/definitions/commandType" }, + "set_response": { "$ref": "#/definitions/commandType" }, + "set_subdevice_range" : { "$ref": "#/definitions/subdeviceType" } }, - "required": ["name", "pid", "version"], + "required": [ "name", "pid", "version" ], "dependencies": { - "get_request": ["get_response", "get_subdevice_range"], - "get_response": ["get_request", "get_subdevice_range"], - "get_subdevice_range": ["get_request", "get_response"], - "set_request": ["set_response", "set_subdevice_range"], - "set_response": ["set_request", "set_subdevice_range"], - "set_subdevice_range": ["set_request", "set_response"] + "get_request": [ "get_response" ], + "get_response": [ "get_request" ], + "get_subdevice_range" : [ "get_request", "get_response" ], + "set_request": [ "set_response" ], + "set_response": [ "set_request" ], + "set_subdevice_range" : [ "set_request", "set_response" ] } }