Skip to content
This repository has been archived by the owner on Jan 10, 2024. It is now read-only.

Commit

Permalink
Adds support for deployment node instance ranges (e.g. 0..1, 1..3, 5.…
Browse files Browse the repository at this point in the history
….10, 0..N, 0..*, 1..N, 1..*, etc).
  • Loading branch information
Simon Brown committed Jan 5, 2023
1 parent 84f8bf9 commit 375f457
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 31 deletions.
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ repositories {
}

dependencies {
api 'com.structurizr:structurizr-client:1.16.2'
api 'com.structurizr:structurizr-client:1.17.0'
implementation 'com.structurizr:structurizr-documentation:1.0.2'

testImplementation 'org.codehaus.groovy:groovy-jsr223:3.0.13'
Expand All @@ -27,7 +27,7 @@ targetCompatibility = 1.8

description = 'Structurizr DSL'
group = 'com.structurizr'
version = '1.21.2'
version = '1.22.0'

test {
useJUnitPlatform()
Expand Down
5 changes: 3 additions & 2 deletions docs/changelog.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# Changelog

## 1.21.2 (unreleased)
## 1.22.0 (5th January 2023)

- Fixes #194 (Disabling the online DSL editor).
- Fixes #194 (Disabling the online DSL editor).
- Adds support for deployment node instance ranges (e.g. 0..1, 1..3, 5..10, 0..N, 0..*, 1..N, 1..*, etc).

## 1.21.1 (23rd December 2022)

Expand Down
5 changes: 5 additions & 0 deletions docs/language-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -819,11 +819,16 @@ technology "Technology"
### instances

`instances` is used to set the number of instances of a deployment node.
This can either be a static number, or a range (e.g. 0..1, 1..3, 5..10, 0..N, 0..*, 1..N, 1..*, etc).

```
instances "4"
```

```
instances "1..N"
```

### url

`url` is used to set a URL on an element or relationship.
Expand Down
23 changes: 7 additions & 16 deletions src/main/java/com/structurizr/dsl/DeploymentNodeParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,9 @@ DeploymentNode parse(DslContext context, Tokens tokens) {
deploymentNode.addTags(tags.split(","));
}

int instances = 1;
String instances = "1";
if (tokens.includes(INSTANCES_INDEX)) {
String instancesAsString = tokens.get(INSTANCES_INDEX);
try {
instances = Integer.parseInt(instancesAsString);
} catch (NumberFormatException e) {
throw new RuntimeException("\"" + instancesAsString + "\" is not a valid number of instances");
}
instances = tokens.get(INSTANCES_INDEX);
deploymentNode.setInstances(instances);
}

Expand All @@ -84,21 +79,17 @@ void parseTechnology(DeploymentNodeDslContext context, Tokens tokens) {
void parseInstances(DeploymentNodeDslContext context, Tokens tokens) {
int index = 1;

// instances <number>
// instances <number|range>
if (tokens.hasMoreThan(index)) {
throw new RuntimeException("Too many tokens, expected: instances <number>");
throw new RuntimeException("Too many tokens, expected: instances <number|range>");
}

if (!tokens.includes(index)) {
throw new RuntimeException("Expected: instances <number>");
throw new RuntimeException("Expected: instances <number|range>");
}

try {
int instances = Integer.parseInt(tokens.get(index));
context.getDeploymentNode().setInstances(instances);
} catch (NumberFormatException e) {
throw new RuntimeException("Expected: instances <number>");
}
String instances = tokens.get(index);
context.getDeploymentNode().setInstances(instances);
}

}
22 changes: 11 additions & 11 deletions src/test/java/com/structurizr/dsl/DeploymentNodeParserTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ void test_parse_CreatesADeploymentNode() {
assertEquals("", deploymentNode.getDescription());
assertEquals("", deploymentNode.getTechnology());
assertEquals("Element,Deployment Node", deploymentNode.getTags());
assertEquals(1, deploymentNode.getInstances());
assertEquals("1", deploymentNode.getInstances());
assertEquals("Live", deploymentNode.getEnvironment());
}

Expand All @@ -58,7 +58,7 @@ void test_parse_CreatesADeploymentNodeWithADescription() {
assertEquals("Description", deploymentNode.getDescription());
assertEquals("", deploymentNode.getTechnology());
assertEquals("Element,Deployment Node", deploymentNode.getTags());
assertEquals(1, deploymentNode.getInstances());
assertEquals("1", deploymentNode.getInstances());
assertEquals("Live", deploymentNode.getEnvironment());
}

Expand All @@ -74,7 +74,7 @@ void test_parse_CreatesADeploymentNodeWithADescriptionAndTechnology() {
assertEquals("Description", deploymentNode.getDescription());
assertEquals("Technology", deploymentNode.getTechnology());
assertEquals("Element,Deployment Node", deploymentNode.getTags());
assertEquals(1, deploymentNode.getInstances());
assertEquals("1", deploymentNode.getInstances());
assertEquals("Live", deploymentNode.getEnvironment());
}

Expand All @@ -90,7 +90,7 @@ void test_parse_CreatesADeploymentNodeWithADescriptionAndTechnologyAndTags() {
assertEquals("Description", deploymentNode.getDescription());
assertEquals("Technology", deploymentNode.getTechnology());
assertEquals("Element,Deployment Node,Tag 1,Tag 2", deploymentNode.getTags());
assertEquals(1, deploymentNode.getInstances());
assertEquals("1", deploymentNode.getInstances());
assertEquals("Live", deploymentNode.getEnvironment());
}

Expand All @@ -106,7 +106,7 @@ void test_parse_CreatesADeploymentNodeWithADescriptionAndTechnologyAndTagsAndIns
assertEquals("Description", deploymentNode.getDescription());
assertEquals("Technology", deploymentNode.getTechnology());
assertEquals("Element,Deployment Node,Tag 1,Tag 2", deploymentNode.getTags());
assertEquals(8, deploymentNode.getInstances());
assertEquals("8", deploymentNode.getInstances());
assertEquals("Live", deploymentNode.getEnvironment());
}

Expand All @@ -120,7 +120,7 @@ void test_parse_ThrowsAnException_WhenTheNumberOfInstancesIsNotValid() {
System.out.println(model.getDeploymentNodes().iterator().next().getInstances());
fail();
} catch (Exception e) {
assertEquals("\"abc\" is not a valid number of instances", e.getMessage());
assertEquals("Number of instances must be a positive integer or a range.", e.getMessage());
}
}

Expand All @@ -137,7 +137,7 @@ void test_parse_CreatesAChildDeploymentNode() {
assertEquals("", deploymentNode.getDescription());
assertEquals("", deploymentNode.getTechnology());
assertEquals("Element,Deployment Node", deploymentNode.getTags());
assertEquals(1, deploymentNode.getInstances());
assertEquals("1", deploymentNode.getInstances());
assertEquals("Live", deploymentNode.getEnvironment());
}

Expand Down Expand Up @@ -182,7 +182,7 @@ void test_parseInstances_ThrowsAnException_WhenThereAreTooManyTokens() {
parser.parseInstances(context, tokens("instances", "number", "extra"));
fail();
} catch (Exception e) {
assertEquals("Too many tokens, expected: instances <number>", e.getMessage());
assertEquals("Too many tokens, expected: instances <number|range>", e.getMessage());
}
}

Expand All @@ -194,7 +194,7 @@ void test_parseInstances_ThrowsAnException_WhenNoNumberIsSpecified() {
parser.parseInstances(context, tokens("instances"));
fail();
} catch (Exception e) {
assertEquals("Expected: instances <number>", e.getMessage());
assertEquals("Expected: instances <number|range>", e.getMessage());
}
}

Expand All @@ -206,7 +206,7 @@ void test_parseInstances_ThrowsAnException_WhenAnInvalidNumberIsSpecified() {
parser.parseInstances(context, tokens("instances", "abc"));
fail();
} catch (Exception e) {
assertEquals("Expected: instances <number>", e.getMessage());
assertEquals("Number of instances must be a positive integer or a range.", e.getMessage());
}
}

Expand All @@ -216,7 +216,7 @@ void test_parseInstances_SetsTheInstances_WhenANumberIsSpecified() {
DeploymentNodeDslContext context = new DeploymentNodeDslContext(deploymentNode);
parser.parseInstances(context, tokens("instances", "123"));

assertEquals(123, deploymentNode.getInstances());
assertEquals("123", deploymentNode.getInstances());
}

}

0 comments on commit 375f457

Please sign in to comment.