diff --git a/README.md b/README.md index 170bf608..d372d426 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ __IMPORTANT NOTICE:__ The contents of this repository currectly reflect a __DRAF 1. [EiffelIssueVerifiedEvent (IV)](./eiffel-vocabulary/EiffelIssueVerifiedEvent.md) 1. [EiffelTestExecutionRecipeCollectionCreatedEvent (TERCC)](./eiffel-vocabulary/EiffelTestExecutionRecipeCollectionCreatedEvent.md) 1. [EiffelAnnouncementPublishedEvent (AnnP)](./eiffel-vocabulary/EiffelAnnouncementPublishedEvent.md) + 1. [EiffelIssueDefinedEvent (ID)](./eiffel-vocabulary/EiffelIssueDefinedEvent.md) 1. Usage Examples 1. [Confidence Level Joining](./usage-examples/confidence-level-joining.md) 1. [Delivery Interface](./usage-examples/delivery-interface.md) diff --git a/eiffel-vocabulary/EiffelIssueDefinedEvent.md b/eiffel-vocabulary/EiffelIssueDefinedEvent.md new file mode 100644 index 00000000..e1bb247f --- /dev/null +++ b/eiffel-vocabulary/EiffelIssueDefinedEvent.md @@ -0,0 +1,247 @@ + + +# EiffelIssueDefinedEvent (ID) +The EiffelIssueDefinedEvent declares that an issue has been created in some +external issue management software. ID is semantically similar to +[EiffelFlowContextDefinedEvent](../eiffel-vocabulary/EiffelFlowContextDefinedEvent.md) +and [EiffelEnvironmentDefinedEvent](../eiffel-vocabulary/EiffelEnvironmentDefinedEvent.md). + +## Data Members + +### data.type +__Type:__ String +__Required:__ Yes +__Legal values:__ BUG, IMPROVEMENT, FEATURE, WORK_ITEM, REQUIREMENT, OTHER +__Description:__ The type of issue. + +### data.tracker +__Type:__ String +__Required:__ Yes +__Description:__ The name of the issue tracker. This can unfortunately not be +standardized, and is therefore context sensitive: though some trackers and ALM +tools are more popular than others, an exhaustive enumeration is impossible, +particularly when considering company specific internal solutions. Consequently +one should not rely on the name as the primary method of retrieval, but rather +__data.uri__. __data.tracker__ together with __data.id__ +is still useful for analysis and traceability, however, as long as it can be +correctly interpreted. + +### data.id +__Type:__ String +__Required:__ Yes +__Description:__ The identity of the issue. This is tracker dependent - most +trackers have their own issue naming schemes. + +### data.uri +__Type:__ String +__Required:__ Yes +__Description:__ A URI that links to a document describing the issue in depth. + +### data.title +__Type:__ String +__Required:__ No +__Description:__ A one-line title or summary of the issue. This exists mostly +for human consumption, as "Implement widget X" is much more meaningful to a +human when viewing a graph of Eiffel events than "1302". This is not meant +to be a detailed description, as such information should be accessible by +following __data.uri__. + +## Links + +### CAUSE +__Required:__ No +__Legal targets:__ Any +__Multiple allowed:__ Yes +__Description:__ Identifies a cause of the event occurring. SHOULD not be +used in conjunction with __CONTEXT__: individual events providing __CAUSE__ +within a larger context gives rise to ambiguity. It is instead recommended to +let the root event of the context declare __CAUSE__. + +### CONTEXT +__Required:__ No +__Legal targets:__ +[EiffelActivityTriggeredEvent](../eiffel-vocabulary/EiffelActivityTriggeredEvent.md), +[EiffelTestSuiteStartedEvent](../eiffel-vocabulary/EiffelTestSuiteStartedEvent.md) +__Multiple allowed:__ No +__Description:__ Identifies the activity or test suite of which this event +constitutes a part. + +### FLOW_CONTEXT +__Required:__ No +__Legal targets:__ +[EiffelFlowContextDefinedEvent](./EiffelFlowContextDefinedEvent.md) +__Multiple allowed:__ No +__Description:__ Identifies the flow context of the event: which is the +continuous integration and delivery flow in which this occurred – e.g. which +product, project, track or version this is applicable to. + +## Meta Members +### meta.id +__Type:__ String +__Format:__ [UUID](http://tools.ietf.org/html/rfc4122) +__Required:__ Yes +__Description:__ The unique identity of the event, generated at event +creation. + +### meta.type +__Type:__ String +__Format:__ An event type name +__Required:__ Yes +__Description:__ The type of event. This field is required by the recipient +of the event, as each event type has a specific meaning and a specific set of +members in the __data__ and __links__ objects. + +### meta.version +__Type:__ String +__Format:__ [Semantic Versioning 2.0.0](http://semver.org/spec/v2.0.0.html) +__Required:__ Yes +__Description:__ The version of the event type. This field is required by the +recipient of the event to interpret the contents. Please see +[Versioning](../eiffel-syntax-and-usage/versioning.md) for more information. + +### meta.time +__Type:__ Integer +__Format:__ Milliseconds since epoch. +__Required:__ Yes +__Description:__ The event creation timestamp. + +### meta.tags +__Type:__ String[] +__Format:__ Free text +__Required:__ No +__Description:__ Any tags or keywords associated with the events, for +searchability purposes. + +### meta.source +__Type:__ Object +__Format:__ +__Required:__ No +__Description:__ A description of the source of the event. This object is +primarily for traceability purposes, and while optional, some form of +identification of the source is __HIGHLY RECOMMENDED__. It offers multiple +methods of identifying the source of the event, techniques which may be +select from based on the technology domain and needs in any particular use +case. + +#### meta.source.domainId +__Type:__ String +__Format:__ Free text +__Required:__ No +__Description:__ Identifies the domain that produced an event. A domain is an +infrastructure topological concept, which may or may not corresponds to an +organization or product structures. A good example would be Java packages +notation, ex. com.mycompany.product.component or mycompany.site.division. +Also, keep in mind that all names are more or less prone to change. +Particularly, it is recommended to avoid organizational names or site names, +as organizations tend to be volatile and development is easily relocated. +Relatively speaking, product and component names tend to be more stable and +are therefore encouraged, while code names may be an option. You need to +decide what is the most sensible option in your case. + +#### meta.source.host +__Type:__ String +__Format:__ Hostname +__Required:__ No +__Description:__ The hostname of the event sender. + +#### meta.source.name +__Type:__ String +__Format:__ Free text +__Required:__ No +__Description:__ The name of the event sender. + +#### meta.source.serializer +__Type:__ Object +__Format:__ +__Required:__ No +__Description:__ The +[GAV](https://maven.apache.org/guides/mini/guide-naming-conventions.html) +coordinates of the serializer software used to construct the event. + +##### meta.source.serializer.groupId +__Type:__ String +__Format:__ groupId +__Required:__ Yes +__Description:__ The groupId of the serializer software. + +##### meta.source.serializer.artifactId +__Type:__ String +__Format:__ artifactId +__Required:__ Yes +__Description:__ The artifactId of the serializer software. + +##### meta.source.serializer.version +__Type:__ String +__Format:__ version +__Required:__ Yes +__Description:__ The version of the serializer software. + +#### meta.source.uri +__Type:__ String +__Format:__ URI +__Required:__ No +__Description:__ The URI of, related to or describing the event sender. + +### meta.security +__Type:__ Object +__Format:__ +__Required:__ No +__Description:__ An optional object for enclosing security related +information, particularly supporting data integrity. See +[Security](../eiffel-syntax-and-usage/security.md) for further information. + +#### meta.security.sdm +__Type:__ Object +__Format:__ +__Required:__ No +__Description:__ An optional object for properties supporting the [Strong +Distribution Model](http://www.cryptnet.net/fdp/crypto/strong_distro.html). +Note that this only addressed the _integrity_ of the Eiffel event, not its +_confidentiality_ or _availability_. + +##### meta.security.sdm.authorIdentity +__Type:__ String +__Format:__ +__Required:__ Yes +__Description:__ The identity of the author of the event. This property is +intended to enable the recipient to look up the appropriate public key for +decrypting the digest and thereby verifying author identity and data +integrity. The format of the author identity varies depending on the key +infrastructure solution used. Note that this requires the presence of a +Trusted Authority (TA) which the recipient can query for the correct public +key. The identity and location of the TA must never be included in the event +itself, as this would compromise the security of the solution. + +##### meta.security.sdm.encryptedDigest +__Type:__ String +__Format:__ +__Required:__ Yes +__Description:__ The encrypted digest. The cryptographic hash function and +the decryption algorithm to use, similarly to the Trusted Authority (TA), +must be known to the recipient. Note that the digest of the entire event is +affected by the value of this property. For this reason the input to the hash +function SHALL be the entire event unaltered in all parts except for this +property, which SHALL be replaced by an empty string. + +## Version History +| Version | Introduced in | Changes | +| --------- | ------------------------------------------------------ | --------------------------------------- | +| 1.0.0 | Current version | Initial version | + +## Examples +* [Simple example](../examples/events/EiffelIssueDefinedEvent/simple.json) diff --git a/eiffel-vocabulary/EiffelIssueVerifiedEvent.md b/eiffel-vocabulary/EiffelIssueVerifiedEvent.md index 2f397626..20173842 100644 --- a/eiffel-vocabulary/EiffelIssueVerifiedEvent.md +++ b/eiffel-vocabulary/EiffelIssueVerifiedEvent.md @@ -18,43 +18,29 @@ # EiffelIssueVerifiedEvent (IV) The EiffelIssueVerifiedEvent declares that an issue, typically a requirement, has been verified by some means. It is different from [EiffelTestCaseFinishedEvent](./EiffelTestCaseFinishedEvent.md) in that multiple test case executions may serve as the basis for a single verification or, conversely, multiple issues may be verified based on a single test case execution. -## Data Members -### data.issues -__Type:__ Object[] -__Required:__ Yes -__Description:__ A list of verified (successfully or not) issues. - -#### data.issues.type -__Type:__ String -__Required:__ Yes -__Legal values:__ BUG, IMPROVEMENT, FEATURE, WORK_ITEM, REQUIREMENT, OTHER -__Description:__ The type of issue. +EiffelIssueVerifiedEvent has no data members, instead relying on its required link types. While "SUCCESSFUL_ISSUE", "FAILED_ISSUE", and "INCONCLUSIVE_ISSUE" are all marked as not required, at least one link of at least one of these types MUST be present in an EiffelIssueVerifiedEvent. -#### data.issues.tracker -__Type:__ String -__Required:__ Yes -__Description:__ The name of the issue tracker. This can unfortunately not be standardized, and is therefore context sensitive: though some trackers and ALM tools are more popular than others, an exhaustive enumeration is impossible, particularly when considering company specific internal solutions. Consequently one should not rely on the name as the primary method of retrieval, but rather __data.issues.uri__. __data.issues.tracker__ together with __data.issues.id__ is still useful for analysis and traceability, however, as long as it can be correctly interpreted. +## Data Members -#### data.issues.id -__Type:__ String -__Required:__ Yes -__Description:__ The identity of the issue. This is tracker dependent - most trackers have their own issue naming schemes. +## Links +### SUCCESSFUL_ISSUE +__Required:__ No +__Legal targets:__ [EiffelIssueDefinedEvent](../eiffel-vocabulary/EiffelIssueDefinedEvent.md) +__Multiple allowed:__ No +__Description:__ Identifies an issue that has been successfully verified. -#### data.issues.uri -__Type:__ String -__Required:__ Yes -__Description:__ The URI of the issue. +### FAILED_ISSUE +__Required:__ No +__Legal targets:__ [EiffelIssueDefinedEvent](../eiffel-vocabulary/EiffelIssueDefinedEvent.md) +__Multiple allowed:__ No +__Description:__ Identifies an issue that has failed verification. -#### data.issues.value -__Type:__ String -__Required:__ Yes -__Legal values:__ SUCCESS, FAILURE, INCONCLUSIVE -__Description:__ The value of the verification. -SUCCESS signifies that the issue was successfully verified. -FAILURE signifies that verification of the issue failed. -INCONCLUSIVE signifies that the verification of the issue was inconclusive. +### INCONCLUSIVE_ISSUE +__Required:__ No +__Legal targets:__ [EiffelIssueDefinedEvent](../eiffel-vocabulary/EiffelIssueDefinedEvent.md) +__Multiple allowed:__ No +__Description:__ Identifies an issue for which this verification was inconclusive. -## Links ### IUT __Required:__ Yes __Optional in:__ None @@ -206,6 +192,7 @@ __Description:__ The encrypted digest. The cryptographic hash function and the d ## Version History | Version | Introduced in | Changes | | --------- | ------------------------------------------------------ | --------------------------------------- | +| 2.0.0 | Current version | Replaced data.issues with links | | 1.1.0 | [edition-toulouse](../../../tree/edition-toulouse) | Multiple links of type FLOW_CONTEXT allowed. | | 1.0.0 | [edition-bordeaux](../../../tree/edition-bordeaux) | Initial version. | diff --git a/eiffel-vocabulary/EiffelSourceChangeCreatedEvent.md b/eiffel-vocabulary/EiffelSourceChangeCreatedEvent.md index 1ca66191..e166f6e8 100644 --- a/eiffel-vocabulary/EiffelSourceChangeCreatedEvent.md +++ b/eiffel-vocabulary/EiffelSourceChangeCreatedEvent.md @@ -81,38 +81,6 @@ __Type:__ String __Required:__ No __Description:__ The unique identity, if any, of the change (apart from what is expressed in the identifier object). Examples include e.g. Gerrit Change-Ids or GitHub Pull Requests. It is recommended to also include __data.change.tracker__ to provide a hint as to the nature of the identity. -### data.issues -__Type:__ Object[] -__Required:__ No -__Description:__ A list of issues addressed by the change. - -#### data.issues.type -__Type:__ String -__Required:__ Yes -__Legal values:__ BUG, IMPROVEMENT, FEATURE, WORK_ITEM, REQUIREMENT, OTHER -__Description:__ The type of issue. - -#### data.issues.tracker -__Type:__ String -__Required:__ Yes -__Description:__ The name of the issue tracker. This can unfortunately not be standardized, and is therefore context sensitive: though some trackers and ALM tools are more popular than others, an exhaustive enumeration is impossible, particularly when considering company specific internal solutions. Consequently one should not rely on the name as the primary method of retrieval, but rather __data.issues.uri__. __data.issues.tracker__ together with __data.issues.id__ is still useful for analysis and traceability, however, as long as it can be correctly interpreted. - -#### data.issues.id -__Type:__ String -__Required:__ Yes -__Description:__ The identity of the issue. This is tracker dependent - most trackers have their own issue naming schemes. - -#### data.issues.uri -__Type:__ String -__Required:__ Yes -__Description:__ The URI of the issue. - -#### data.issues.transition -__Type:__ String -__Required:__ Yes -__Legal values:__ RESOLVED, PARTIAL, REMOVED -__Description:__ The new state of the issue: does the change resolve it, partially resolve it or remove it? - ### data.gitIdentifier __Type:__ Object __Required:__ No @@ -221,6 +189,24 @@ __Legal targets:__ [EiffelSourceChangeCreatedEvent](../eiffel-vocabulary/EiffelS __Multiple allowed:__ Yes __Description:__ Identifies a latest previous version (there may be more than one in case of merges) of the created source change. +### PARTIALLY_RESOLVED_ISSUE +__Required:__ No +__Legal targets:__ [EiffelIssueDefinedEvent](../eiffel-vocabulary/EiffelIssueDefinedEvent.md) +__Multiple allowed:__ Yes +__Description:__ Identifies an issue that this event partially resolves. That is, this SCC introduces some change that has advanced an issue towards a resolved state, but not completely resolved. + +### RESOLVED_ISSUE +__Required:__ No +__Legal targets:__ [EiffelIssueDefinedEvent](../eiffel-vocabulary/EiffelIssueDefinedEvent.md) +__Multiple allowed:__ Yes +__Description:__ Identifies an issue that this SCC is claiming it has done enough to resolve. This is not an authoritative resolution, only a claim. The issue may or may not change status as a consequence this, e.g. through a [successful verification](../eiffel-vocabular/EiffelIssueVerifiedEvent.md) or a manual update on the issue tracker. + +### DERESOLVED_ISSUE +__Required:__ No +__Legal targets:__ [EiffelIssueDefinedEvent](../eiffel-vocabulary/EiffelIssueDefinedEvent.md) +__Multiple allowed:__ Yes +__Description:__ Identifies an issue which was previously resolved, but that this SCC claims it has made changes to warrant removing the resolved status. For example, if an issue "Feature X" was resolved, but this SCC removed the implmentation that led to "Feature X" being resolved, that issue should no longer be considered resolved. + ### CAUSE __Required:__ No __Legal targets:__ Any @@ -352,6 +338,7 @@ __Description:__ The encrypted digest. The cryptographic hash function and the d ## Version History | Version | Introduced in | Changes | | --------- | ------------------------------------------------------ | --------------------------------------- | +| 2.0.0 | Current version | Replaced data.issues with links | | 1.1.0 | [edition-toulouse](../../../tree/edition-toulouse) | Multiple links of type FLOW_CONTEXT allowed. | | 1.0.0 | [edition-bordeaux](../../../tree/edition-bordeaux) | Initial version. | diff --git a/examples/events/EiffelIssueDefinedEvent/simple.json b/examples/events/EiffelIssueDefinedEvent/simple.json new file mode 100644 index 00000000..f0bf30c7 --- /dev/null +++ b/examples/events/EiffelIssueDefinedEvent/simple.json @@ -0,0 +1,20 @@ +{ + "meta": { + "type": "EiffelIssueDefinedEvent", + "version": "1.0.0", + "time": 1234567890, + "id": "aaaaaaaa-bbbb-5ccc-8ddd-eeeeeeeeeee0" + }, + "data": { + "type": "BUG", + "tracker": "github", + "id": "aaaaaaaa-bbbb-5ccc-8ddd-eeeeeeeeeee0", + "uri": "https://github.com/my-user/my-repo/issues/3" + }, + "links": [ + { + "type": "CAUSE", + "target": "aaaaaaaa-bbbb-5ccc-8ddd-eeeeeeeeeee8" + } + ] +} diff --git a/examples/events/EiffelIssueVerifiedEvent/simple.json b/examples/events/EiffelIssueVerifiedEvent/simple.json index 723b2018..7a909842 100644 --- a/examples/events/EiffelIssueVerifiedEvent/simple.json +++ b/examples/events/EiffelIssueVerifiedEvent/simple.json @@ -1,20 +1,11 @@ { "meta": { "type": "EiffelIssueVerifiedEvent", - "version": "1.1.0", + "version": "2.0.0", "time": 1234567890, "id": "aaaaaaaa-bbbb-5ccc-8ddd-eeeeeeeeeee0" }, "data": { - "issues": [ - { - "type": "BUG", - "tracker": "JIRA", - "id": "JIRA-1234", - "uri": "http://jira.company.com/browse/JIRA-1234", - "value": "SUCCESS" - } - ] }, "links": [ { @@ -32,6 +23,18 @@ { "type": "ENVIRONMENT", "target": "aaaaaaaa-bbbb-5ccc-8ddd-eeeeeeeeeee4" + }, + { + "type": "SUCCESSFUL_ISSUE", + "target": "aaaaaaaa-bbbb-5ccc-8ddd-eeeeeeeeeee5" + }, + { + "type": "FAILED_ISSUE", + "target": "aaaaaaaa-bbbb-5ccc-8ddd-eeeeeeeeeee6" + }, + { + "type": "INCONCLUSIVE_ISSUE", + "target": "aaaaaaaa-bbbb-5ccc-8ddd-eeeeeeeeeee7" } ] } diff --git a/examples/events/EiffelSourceChangeCreatedEvent/simple.json b/examples/events/EiffelSourceChangeCreatedEvent/simple.json index 7a01a3c0..85bfeb98 100644 --- a/examples/events/EiffelSourceChangeCreatedEvent/simple.json +++ b/examples/events/EiffelSourceChangeCreatedEvent/simple.json @@ -1,7 +1,7 @@ { "meta": { "type": "EiffelSourceChangeCreatedEvent", - "version": "1.1.0", + "version": "2.0.0", "time": 1234567890, "id": "aaaaaaaa-bbbb-5ccc-8ddd-eeeeeeeeeee0" }, @@ -25,16 +25,7 @@ "tracker": "GitHub", "details": "https://github.com/johndoe/myPrivateRepo/commit/fd090b60a4aedc5161da9c035a49b14a319829b4", "id": "42" - }, - "issues": [ - { - "type": "BUG", - "tracker": "JIRA", - "id": "JIRA-1234", - "uri": "http://jira.company.com/browse/JIRA-1234", - "transition": "RESOLVED" - } - ] + } }, "links": [ { @@ -52,6 +43,10 @@ { "type": "FLOW_CONTEXT", "target": "aaaaaaaa-bbbb-5ccc-8ddd-eeeeeeeeeee4" + }, + { + "type": "RESOLVED_ISSUE", + "target": "aaaaaaaa-bbbb-5ccc-8ddd-eeeeeeeeeee5" } ] } diff --git a/schemas/EiffelIssueDefinedEvent/1.0.0.json b/schemas/EiffelIssueDefinedEvent/1.0.0.json new file mode 100644 index 00000000..2ceed9f1 --- /dev/null +++ b/schemas/EiffelIssueDefinedEvent/1.0.0.json @@ -0,0 +1,173 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "meta": { + "type": "object", + "properties": { + "id": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" + }, + "type": { + "type": "string", + "enum": [ "EiffelIssueDefinedEvent" ] + }, + "version": { + "type": "string", + "enum": [ "1.0.0" ], + "default": "1.0.0" + }, + "time": { + "type": "integer" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "source": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "host": { + "type": "string" + }, + "name": { + "type": "string" + }, + "serializer": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "artifactId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "groupId", + "artifactId", + "version" + ], + "additionalProperties": false + }, + "uri": { + "type": "string" + } + }, + "additionalProperties": false + }, + "security": { + "type": "object", + "properties": { + "sdm": { + "type": "object", + "properties": { + "authorIdentity": { + "type": "string" + }, + "encryptedDigest": { + "type": "string" + } + }, + "required": [ + "authorIdentity", + "encryptedDigest" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "required": [ + "id", + "type", + "version", + "time" + ], + "additionalProperties": false + }, + "data": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "BUG", + "IMPROVEMENT", + "FEATURE", + "WORK_ITEM", + "REQUIREMENT", + "OTHER" + ] + }, + "tracker": { + "type": "string" + }, + "id": { + "type": "string" + }, + "uri": { + "type": "string" + }, + "title": { + "type": "string" + }, + "customData": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + } + }, + "required": [ + "key", + "value" + ], + "additionalProperties": false + } + } + }, + "required": [ + "type", + "tracker", + "id", + "uri" + ], + "additionalProperties": false + }, + "links": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "target": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" + } + }, + "required": [ + "type", + "target" + ], + "additionalProperties": false + } + } + } +} diff --git a/schemas/EiffelIssueVerifiedEvent/2.0.0.json b/schemas/EiffelIssueVerifiedEvent/2.0.0.json new file mode 100644 index 00000000..5e465738 --- /dev/null +++ b/schemas/EiffelIssueVerifiedEvent/2.0.0.json @@ -0,0 +1,150 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "meta": { + "type": "object", + "properties": { + "id": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" + }, + "type": { + "type": "string", + "enum": [ "EiffelIssueVerifiedEvent" ] + }, + "version": { + "type": "string", + "enum": [ "2.0.0" ], + "default": "2.0.0" + }, + "time": { + "type": "integer" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "source": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "host": { + "type": "string" + }, + "name": { + "type": "string" + }, + "serializer": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "artifactId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "groupId", + "artifactId", + "version" + ], + "additionalProperties": false + }, + "uri": { + "type": "string" + } + }, + "additionalProperties": false + }, + "security": { + "type": "object", + "properties": { + "sdm": { + "type": "object", + "properties": { + "authorIdentity": { + "type": "string" + }, + "encryptedDigest": { + "type": "string" + } + }, + "required": [ + "authorIdentity", + "encryptedDigest" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "required": [ + "id", + "type", + "version", + "time" + ], + "additionalProperties": false + }, + "data": { + "type": "object", + "properties": { + "customData": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + } + }, + "required": [ + "key", + "value" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "links": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "target": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" + } + }, + "required": [ + "type", + "target" + ], + "additionalProperties": false + } + } + }, + "required": [ + "meta", + "data", + "links" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/EiffelSourceChangeCreatedEvent/2.0.0.json b/schemas/EiffelSourceChangeCreatedEvent/2.0.0.json new file mode 100644 index 00000000..fc0edd09 --- /dev/null +++ b/schemas/EiffelSourceChangeCreatedEvent/2.0.0.json @@ -0,0 +1,282 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "meta": { + "type": "object", + "properties": { + "id": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" + }, + "type": { + "type": "string", + "enum": [ "EiffelSourceChangeCreatedEvent" ] + }, + "version": { + "type": "string", + "enum": [ "2.0.0" ], + "default": "2.0.0" + }, + "time": { + "type": "integer" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "source": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "host": { + "type": "string" + }, + "name": { + "type": "string" + }, + "serializer": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "artifactId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "groupId", + "artifactId", + "version" + ], + "additionalProperties": false + }, + "uri": { + "type": "string" + } + }, + "additionalProperties": false + }, + "security": { + "type": "object", + "properties": { + "sdm": { + "type": "object", + "properties": { + "authorIdentity": { + "type": "string" + }, + "encryptedDigest": { + "type": "string" + } + }, + "required": [ + "authorIdentity", + "encryptedDigest" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "required": [ + "id", + "type", + "version", + "time" + ], + "additionalProperties": false + }, + "data": { + "type": "object", + "properties": { + "author": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "id": { + "type": "string" + }, + "group": { + "type": "string" + } + }, + "additionalProperties": false + }, + "change": { + "type": "object", + "properties": { + "insertions": { + "type": "integer" + }, + "deletions": { + "type": "integer" + }, + "files": { + "type": "string" + }, + "details": { + "type": "string" + }, + "tracker": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "additionalProperties": false + }, + "gitIdentifier": { + "type": "object", + "properties": { + "commitId": { + "type": "string" + }, + "branch": { + "type": "string" + }, + "repoName": { + "type": "string" + }, + "repoUri": { + "type": "string" + } + }, + "required": [ + "commitId", + "repoUri" + ], + "additionalProperties": false + }, + "svnIdentifier": { + "type": "object", + "properties": { + "revision": { + "type": "integer" + }, + "directory": { + "type": "string" + }, + "repoName": { + "type": "string" + }, + "repoUri": { + "type": "string" + } + }, + "required": [ + "revision", + "directory", + "repoUri" + ], + "additionalProperties": false + }, + "ccCompositeIdentifier": { + "type": "object", + "properties": { + "vobs": { + "type": "array", + "items": { + "type": "string" + } + }, + "branch": { + "type": "string" + }, + "configSpec": { + "type": "string" + } + }, + "required": [ + "vobs", + "branch", + "configSpec" + ], + "additionalProperties": false + }, + "hgIdentifier": { + "type": "object", + "properties": { + "commitId": { + "type": "string" + }, + "branch": { + "type": "string" + }, + "repoName": { + "type": "string" + }, + "repoUri": { + "type": "string" + } + }, + "required": [ + "commitId", + "repoUri" + ], + "additionalProperties": false + }, + "customData": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + } + }, + "required": [ + "key", + "value" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "links": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "target": { + "type": "string", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" + } + }, + "required": [ + "type", + "target" + ], + "additionalProperties": false + } + } + }, + "required": [ + "meta", + "data", + "links" + ], + "additionalProperties": false +}