You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hop.apache.org by ba...@apache.org on 2026/10/23 05:59:15 UTC
(hop) branch main updated: Escape variable references in the docs that Asciidoctor reads as attributes #9069 (#9087)
This is an automated email from the ASF dual-hosted git repository.
bamaer pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git
The following commit(s) were added to refs/heads/main by this push:
new f37520fb52 Escape variable references in the docs that Asciidoctor reads as attributes #9069 (#9087)
f37520fb52 is described below
commit f37520fb52b99d9940b0c63be65cab3bad9e09e5
Author: Ankit Garg <an...@gmail.com>
AuthorDate: Fri Oct 23 11:29:04 2026 +0530
Escape variable references in the docs that Asciidoctor reads as attributes #9069 (#9087)
A variable such as ${PROJECT_HOME} in inline code is read by Asciidoctor
as the attribute {PROJECT_HOME}, which gives 35 "skipping reference to
missing attribute" warnings in 27 pages when building the docs. Write
them as `+${PROJECT_HOME}+`, like the other pages already do.
Also remove the stray "(TODO)" at the end of the IHopMetadataObjectFactory
paragraph in the metadata plugins page of the developer manual.
---
.../hop-dev-manual/modules/ROOT/pages/annotation-derived-widgets.adoc | 2 +-
docs/hop-dev-manual/modules/ROOT/pages/metadata-plugins.adoc | 1 -
docs/hop-dev-manual/modules/ROOT/pages/sdk/vfs.adoc | 2 +-
docs/hop-user-manual/modules/ROOT/pages/docker-container.adoc | 2 +-
.../hop-user-manual/modules/ROOT/pages/hop-gui/vfs-file-explorer.adoc | 2 +-
docs/hop-user-manual/modules/ROOT/pages/hop-tools/hop-lint.adoc | 2 +-
docs/hop-user-manual/modules/ROOT/pages/linting/lint-rules.adoc | 2 +-
.../ROOT/pages/metadata-types/graphs/graph-database-connection.adoc | 2 +-
.../modules/ROOT/pages/metadata-types/masking-pattern.adoc | 2 +-
.../modules/ROOT/pages/metadata-types/smb-connection.adoc | 4 ++--
.../modules/ROOT/pages/pipeline/transforms/avro-file-output.adoc | 2 +-
.../modules/ROOT/pages/pipeline/transforms/beamdebeziuminput.adoc | 4 ++--
.../ROOT/pages/pipeline/transforms/beamelasticsearchinput.adoc | 2 +-
.../ROOT/pages/pipeline/transforms/beamelasticsearchoutput.adoc | 2 +-
.../modules/ROOT/pages/pipeline/transforms/beammqttinput.adoc | 2 +-
.../modules/ROOT/pages/pipeline/transforms/beammqttoutput.adoc | 2 +-
.../modules/ROOT/pages/pipeline/transforms/beamsnowflakeinput.adoc | 2 +-
.../modules/ROOT/pages/pipeline/transforms/beamsnowflakeoutput.adoc | 2 +-
.../modules/ROOT/pages/pipeline/transforms/beamsplunkoutput.adoc | 2 +-
.../modules/ROOT/pages/pipeline/transforms/jsoninput.adoc | 2 +-
.../modules/ROOT/pages/pipeline/transforms/pipeline-executor.adoc | 4 ++--
.../modules/ROOT/pages/pipeline/transforms/spark-file-input.adoc | 2 +-
.../modules/ROOT/pages/pipeline/transforms/spark-file-output.adoc | 2 +-
.../modules/ROOT/pages/pipeline/transforms/watchfiles.adoc | 4 ++--
.../modules/ROOT/pages/pipeline/transforms/webservices.adoc | 4 ++--
.../modules/ROOT/pages/technology/graph-databases/index.adoc | 2 +-
.../modules/ROOT/pages/workflow/actions/graph-constraint.adoc | 2 +-
.../modules/ROOT/pages/workflow/actions/graph-index.adoc | 2 +-
28 files changed, 32 insertions(+), 33 deletions(-)
diff --git a/docs/hop-dev-manual/modules/ROOT/pages/annotation-derived-widgets.adoc b/docs/hop-dev-manual/modules/ROOT/pages/annotation-derived-widgets.adoc
index a20d494cca..425a19276b 100644
--- a/docs/hop-dev-manual/modules/ROOT/pages/annotation-derived-widgets.adoc
+++ b/docs/hop-dev-manual/modules/ROOT/pages/annotation-derived-widgets.adoc
@@ -78,7 +78,7 @@ Sort key among the widgets in this parent, compared as a string.
`label` and `toolTip`::
Shown next to the control.
Use an `i18n::` key, as described in xref:internationalisation.adoc[Internationalisation].
-In the properties file, quote a variable expression with single quotes: `Folder='${PROJECT_HOME}'`.
+In the properties file, quote a variable expression with single quotes: `+Folder='${PROJECT_HOME}'+`.
`parentId`::
The form this widget belongs to.
diff --git a/docs/hop-dev-manual/modules/ROOT/pages/metadata-plugins.adoc b/docs/hop-dev-manual/modules/ROOT/pages/metadata-plugins.adoc
index 18fd64bfdb..cb1873973f 100644
--- a/docs/hop-dev-manual/modules/ROOT/pages/metadata-plugins.adoc
+++ b/docs/hop-dev-manual/modules/ROOT/pages/metadata-plugins.adoc
@@ -142,5 +142,4 @@ The parent object is often another metadata object.
You can use it to check if it implements IVariables so you can inherit variables from there.
* ```public String getObjectId( Object object ) throws HopException``` -> Retrieves the object ID from the given object.
We recommend that you check the instance of the object until the factory interface supports generics.
-(TODO)
diff --git a/docs/hop-dev-manual/modules/ROOT/pages/sdk/vfs.adoc b/docs/hop-dev-manual/modules/ROOT/pages/sdk/vfs.adoc
index ffdbe85bce..b01168b7df 100644
--- a/docs/hop-dev-manual/modules/ROOT/pages/sdk/vfs.adoc
+++ b/docs/hop-dev-manual/modules/ROOT/pages/sdk/vfs.adoc
@@ -33,7 +33,7 @@ Using `java.io.File` is one of the most common causes of bugs when running pipel
* **Non-local Schemes:** `java.io.File` only understands the local operating system's filesystem syntax. Passing a cloud path such as `s3://my-bucket/orders.csv` or `gs://my-bucket/orders.csv` to `java.io.File` will either throw a `FileNotFoundException` or corrupt the path into a nonsensical local directory like `./s3:/my-bucket/orders.csv`.
* **Portability across Runtimes:** Pipelines configured on a local machine frequently execute on a remote Hop Server, in a Docker container, or on a distributed cluster with Apache Beam / Spark / Flink. Using `HopVfs` ensures that paths remain portable across all runtime targets.
-* **Variable Resolution:** `HopVfs` automatically expands variables (such as `${PROJECT_HOME}/data/file.csv` or `${S3_BUCKET}/data.parquet`) before resolving the underlying file system provider.
+* **Variable Resolution:** `HopVfs` automatically expands variables (such as `+${PROJECT_HOME}/data/file.csv+` or `+${S3_BUCKET}/data.parquet+`) before resolving the underlying file system provider.
== Core File Operations with HopVfs
diff --git a/docs/hop-user-manual/modules/ROOT/pages/docker-container.adoc b/docs/hop-user-manual/modules/ROOT/pages/docker-container.adoc
index c7d6d457bc..2b38be89b2 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/docker-container.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/docker-container.adoc
@@ -607,7 +607,7 @@ Connections that are defined as metadata in your project, such as xref:vfs/aws-s
* An S3 connection with the `Default (environment / instance profile)` authentication type uses the `AWS_*` variables from the table above.
* An Azure connection with the `Managed Identity` authentication type also accepts a service principal through `AZURE_CLIENT_ID`, `AZURE_TENANT_ID` and `AZURE_CLIENT_SECRET`.
-Other connection fields can use Hop variables such as `${S3_SECRET_KEY}`.
+Other connection fields can use Hop variables such as `+${S3_SECRET_KEY}+`.
Container environment variables are not Hop variables.
Set them in the environment configuration file (`HOP_ENVIRONMENT_CONFIG_FILE_NAME_PATHS`) or pass them as system properties with `HOP_SYSTEM_PROPERTIES`.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/hop-gui/vfs-file-explorer.adoc b/docs/hop-user-manual/modules/ROOT/pages/hop-gui/vfs-file-explorer.adoc
index 6478ea6c5f..6dd4ca281d 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/hop-gui/vfs-file-explorer.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/hop-gui/vfs-file-explorer.adoc
@@ -123,7 +123,7 @@ After a cut and paste, the files that were moved leave the explorer clipboard.
Files you skipped, or that could not be moved, stay on it, so you can paste them again.
Right-click a file or folder and choose **Copy path** to put its path on the system clipboard.
-**Copy path as '${PROJECT_HOME}/...'** writes it relative to the project home folder, ready to paste into a transform or action.
+**Copy path as '+${PROJECT_HOME}+/...'** writes it relative to the project home folder, ready to paste into a transform or action.
== Save a copy, copy to a folder, download and upload
diff --git a/docs/hop-user-manual/modules/ROOT/pages/hop-tools/hop-lint.adoc b/docs/hop-user-manual/modules/ROOT/pages/hop-tools/hop-lint.adoc
index 6ae394d785..b2bd1cc1bf 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/hop-tools/hop-lint.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/hop-tools/hop-lint.adoc
@@ -46,7 +46,7 @@ Relative paths, for the target and for options such as `--output`, `--config` an
== Project and environment
`hop lint` takes the project and environment options of `hop run`.
-Hop's own checks then see the variables a pipeline is run with, so a transform that reads `'${INPUT_FOLDER}'` from the environment is checked against that folder rather than reported as unable to find it.
+Hop's own checks then see the variables a pipeline is run with, so a transform that reads `+'${INPUT_FOLDER}'+` from the environment is checked against that folder rather than reported as unable to find it.
Without `-j` or `-e` the default project and environment from the Hop configuration apply, but only to what lies inside that project.
Anything else, such as another project's folder or a commit checked by the pre-commit hook, is linted with the `metadata` folder found above it.
A project chosen with `-j` or `-e` applies whatever is linted; for a target outside it, `hop lint` prints a warning.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/linting/lint-rules.adoc b/docs/hop-user-manual/modules/ROOT/pages/linting/lint-rules.adoc
index be6068f081..8f50bb1771 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/linting/lint-rules.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/linting/lint-rules.adoc
@@ -101,7 +101,7 @@ Scope such a rule with `appliesTo`, naming the metadata key — the folder name
|is a collection with at least one entry
|`NO_HARDCODED`
-|is empty, or takes its value from a variable (`${NAME}`, `%%NAME%%`) or a variable resolver (`#{vault:path:key}`) rather than holding a literal value. An `Encrypted` value is a literal value: Hop obfuscates it, and anyone with Hop and the same encoder key can read it back
+|is empty, or takes its value from a variable (`+${NAME}+`, `%%NAME%%`) or a variable resolver (`#{vault:path:key}`) rather than holding a literal value. An `Encrypted` value is a literal value: Hop obfuscates it, and anyone with Hop and the same encoder key can read it back
|`MAX_VALUE`, `MIN_VALUE`, `EXACT_VALUE`
|compares as required against `conditionValue`
diff --git a/docs/hop-user-manual/modules/ROOT/pages/metadata-types/graphs/graph-database-connection.adoc b/docs/hop-user-manual/modules/ROOT/pages/metadata-types/graphs/graph-database-connection.adoc
index 1ecd59147d..283676683f 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/metadata-types/graphs/graph-database-connection.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/metadata-types/graphs/graph-database-connection.adoc
@@ -146,7 +146,7 @@ They are grouped in four tabs:
|Protocol
|Automatic configuration, protocol (URL scheme), routing, routing policy, encryption and trusting all certificates.
-Every on/off option has a variable alternative which, when set, overrides it, for example `'${NEO4J_ENCRYPTION}'`.
+Every on/off option has a variable alternative which, when set, overrides it, for example `+'${NEO4J_ENCRYPTION}'+`.
|Advanced
|Connection liveness check timeout, maximum connection lifetime, maximum connection pool size, connection acquisition timeout, connection timeout and maximum transaction retry time, all in milliseconds.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/metadata-types/masking-pattern.adoc b/docs/hop-user-manual/modules/ROOT/pages/metadata-types/masking-pattern.adoc
index dca8d136ab..62ea9ba127 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/metadata-types/masking-pattern.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/metadata-types/masking-pattern.adoc
@@ -77,5 +77,5 @@ image::metadata-types/masking-pattern-first-name.jpg[Masking pattern first-name,
|Mapping table. A second table with the suffix `_seq` stores the next sequence number. Both are created when they are missing. A new mapping table holds masked values of up to 255 characters.
|Hash secret
-|The mapping table stores an HMAC-SHA256 of each value, made with this secret, instead of the value itself. Use a variable such as `${MASKING_SECRET}`. Changing the secret starts a new mapping. Without a secret the table stores the original values and is itself personal data.
+|The mapping table stores an HMAC-SHA256 of each value, made with this secret, instead of the value itself. Use a variable such as `+${MASKING_SECRET}+`. Changing the secret starts a new mapping. Without a secret the table stores the original values and is itself personal data.
|===
diff --git a/docs/hop-user-manual/modules/ROOT/pages/metadata-types/smb-connection.adoc b/docs/hop-user-manual/modules/ROOT/pages/metadata-types/smb-connection.adoc
index e65ecca900..eb21826ae9 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/metadata-types/smb-connection.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/metadata-types/smb-connection.adoc
@@ -42,7 +42,7 @@ The tabs are Server, Authentication, and Security.
|===
|Option|Description
|Description|Optional note about this connection. It is not part of the URL.
-|Hostname|Server name. A variable such as `${FINANCE_FILE_SERVER}` is resolved at runtime. For Azure Files this is `account.file.core.windows.net`.
+|Hostname|Server name. A variable such as `+${FINANCE_FILE_SERVER}+` is resolved at runtime. For Azure Files this is `account.file.core.windows.net`.
|Port|TCP port. Default `445`.
|Share|Share name, without a leading slash.
|Folder in the share|Optional folder. Every path on this connection stays under that folder.
@@ -61,7 +61,7 @@ Kerberos is not available in this version.
The connection type is the place it will be added.
The password is stored with Hop's password encoder.
-A variable such as `${SMB_PASSWORD}` is resolved at runtime.
+A variable such as `+${SMB_PASSWORD}+` is resolved at runtime.
== Security
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/avro-file-output.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/avro-file-output.adoc
index 5d4816e416..898cc6ff95 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/avro-file-output.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/avro-file-output.adoc
@@ -63,7 +63,7 @@ Note: This name has to be unique in a single pipeline.
|Schema filename
|Filepath to write or read the schema from.
-The path can contain variables, for example `${PROJECT_HOME}/schemas/customer.avsc`, and can point to any file system Hop supports (local, `s3://`, `azure://`, `gs://`, ...).
+The path can contain variables, for example `+${PROJECT_HOME}/schemas/customer.avsc+`, and can point to any file system Hop supports (local, `s3://`, `azure://`, `gs://`, ...).
When *Automatically create schema* is disabled, the transform reads the schema from this file before it writes the first row, and fails if the file can't be read or isn't a valid Avro schema.
|Create parent folder
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamdebeziuminput.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamdebeziuminput.adoc
index c7f513c1c9..2817dcfdb6 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamdebeziuminput.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamdebeziuminput.adoc
@@ -37,10 +37,10 @@ PostgreSQL is included; other connectors and their drivers must be supplied by t
|Transform name |Unique name within the pipeline.
|Connector |`PostgreSQL` (bundled) or `Custom` (user-supplied Kafka Connect source connector).
|Custom connector class |Fully qualified `SourceConnector` implementation, used only for Custom. A missing/incompatible class fails pipeline preparation with a classpath diagnostic.
-|Hostname |Database host, for example `'${CDC_HOST}'`.
+|Hostname |Database host, for example `+'${CDC_HOST}'+`.
|Port |Positive TCP port (1–65535). Default: 5432.
|Username |Database account with CDC/replication privileges.
-|Password |Use a secret variable such as `'${CDC_PASSWORD}'`. Hop encrypts literal passwords in transform XML using its standard password handling; this is not a secure credential vault.
+|Password |Use a secret variable such as `+'${CDC_PASSWORD}'+`. Hop encrypts literal passwords in transform XML using its standard password handling; this is not a secure credential vault.
|Connector properties (JSON) |JSON object whose values are strings. Configure database, tables, snapshot mode, slot, publication, SSL and other connector-specific options here. Variables are resolved before parsing. Connection-tab settings cannot be duplicated here. This JSON is stored as text, not encrypted: reference variables for any additional secrets.
|JSON field |Name of the single output String field. Default: `event`.
|Maximum records |Optional positive integer, at most 2147483647. Stops after this many events. Blank means no record limit; an idle database can wait indefinitely if no time limit is set.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchinput.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchinput.adoc
index 77b7fb0c13..cfcb8011c9 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchinput.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchinput.adoc
@@ -29,7 +29,7 @@ It is not an incremental change feed and does not parse document properties into
== Options
-All String settings support Hop variables, for example `${ES_HOSTS}` and `${ES_PASSWORD}`.
+All String settings support Hop variables, for example `+${ES_HOSTS}+` and `+${ES_PASSWORD}+`.
Variables are resolved while constructing the Beam graph. Empty required settings, unresolved variables and invalid configuration fail before submission; credentials must also be available on workers through the resolved graph.
[options="header"]
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchoutput.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchoutput.adoc
index 9b4510cb24..7809e17353 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchoutput.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchoutput.adoc
@@ -29,7 +29,7 @@ The sink does not create mappings or manage index lifecycle. Ensure the target i
== Options
-All String settings support Hop variables, for example `${ES_HOSTS}` and `${ES_PASSWORD}`.
+All String settings support Hop variables, for example `+${ES_HOSTS}+` and `+${ES_PASSWORD}+`.
Variables are resolved while constructing the Beam graph. Empty required settings, unresolved variables and invalid configuration fail before submission; credentials must also be available on workers through the resolved graph.
[options="header"]
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttinput.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttinput.adoc
index 58a293aa35..55c84864ea 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttinput.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttinput.adoc
@@ -36,7 +36,7 @@ Read MQTT message payloads as Hop rows using Apache Beam MqttIO. This is a sourc
|Topic|Required subscription filter.
|Client ID prefix|Optional prefix. Beam appends a UUID and truncates the resulting client ID to 23 characters. Leave empty for a random ID; use a short prefix to preserve random suffix characters.
|Username|Optional broker username.
-|Password|Optional broker password, requires a username. Masked in the dialog and encrypted with Hop password conventions in saved pipelines. Prefer a secret variable such as `${MQTT_PASSWORD}`.
+|Password|Optional broker password, requires a username. Masked in the dialog and encrypted with Hop password conventions in saved pipelines. Prefer a secret variable such as `+${MQTT_PASSWORD}+`.
|Payload field|Name of the output payload field (default `message`).
|Payload type|`String` or `Binary`. String decodes UTF-8; Binary preserves arbitrary bytes.
|Maximum records|Non-negative record limit; zero or empty means unlimited.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttoutput.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttoutput.adoc
index fdc9beb00d..32ac005528 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttoutput.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttoutput.adoc
@@ -36,7 +36,7 @@ Publish one MQTT message for each incoming Hop row using Apache Beam MqttIO. Con
|Topic|Required fixed publish topic.
|Client ID prefix|Optional prefix. Beam appends a UUID and truncates the resulting client ID to 23 characters. Leave empty for a random ID; use a short prefix to preserve random suffix characters.
|Username|Optional broker username.
-|Password|Optional broker password, requires a username. Masked in the dialog and encrypted with Hop password conventions in saved pipelines. Prefer a secret variable such as `${MQTT_PASSWORD}`.
+|Password|Optional broker password, requires a username. Masked in the dialog and encrypted with Hop password conventions in saved pipelines. Prefer a secret variable such as `+${MQTT_PASSWORD}+`.
|Payload field|Required incoming field to publish (default `message`).
|Payload type|`String` or `Binary`. String uses Hop value metadata to convert to text, then encodes UTF-8. Binary requires a Hop Binary field and preserves the bytes. Null payloads fail the pipeline; empty payloads are allowed.
|Retain messages|Sets the MQTT retained flag. Default is off. A retained publish replaces the broker's retained message; a retained empty payload clears it.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeinput.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeinput.adoc
index 3cee05474d..2030598351 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeinput.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeinput.adoc
@@ -36,7 +36,7 @@ The read is bounded. SnowflakeIO rejects a streaming read, and this transform do
|Transform name|Unique name in the pipeline.
|Server|Required account host. It must look like `account.snowflakecomputing.com`. The value is not repeated in an error.
|Username|Required Snowflake user.
-|Password|Used when no private key is set. Masked in the dialog and encrypted with Hop password conventions. Prefer a variable such as `${SNOWFLAKE_PASSWORD}`.
+|Password|Used when no private key is set. Masked in the dialog and encrypted with Hop password conventions. Prefer a variable such as `+${SNOWFLAKE_PASSWORD}+`.
|Private key|PEM private key. When this is set, Hop uses key-pair authentication and does not send the password. A passphrase is optional. Key files and OAuth are not offered.
|Database|Optional database identifier.
|Warehouse|Optional warehouse identifier.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeoutput.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeoutput.adoc
index cd1b70784d..2ad65d1905 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeoutput.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeoutput.adoc
@@ -36,7 +36,7 @@ Snowpipe is not used. An unbounded collection is rejected. Declared Beam compati
|Transform name|Unique name in the pipeline.
|Server|Required account host. It must look like `account.snowflakecomputing.com`. The value is not repeated in an error.
|Username|Required Snowflake user.
-|Password|Used when no private key is set. Masked in the dialog and encrypted with Hop password conventions. Prefer a variable such as `${SNOWFLAKE_PASSWORD}`.
+|Password|Used when no private key is set. Masked in the dialog and encrypted with Hop password conventions. Prefer a variable such as `+${SNOWFLAKE_PASSWORD}+`.
|Private key|PEM private key. When this is set, Hop uses key-pair authentication and does not send the password. A passphrase is optional. Key files and OAuth are not offered.
|Database|Optional database identifier.
|Warehouse|Optional warehouse identifier.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsplunkoutput.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsplunkoutput.adoc
index c24fcf4abb..ac863a7f21 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsplunkoutput.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsplunkoutput.adoc
@@ -35,7 +35,7 @@ The HEC token is sent as `Authorization: Splunk <token>`. The request URL is the
|Option|Description
|Transform name|Unique name in the pipeline.
|HEC URL|Required base URL, `http://host:8088` or `https://host:8088`. No path, user info or query.
-|HEC token|Required token. Masked in the dialog and encrypted with Hop password conventions in saved pipelines. Prefer a secret variable such as `${SPLUNK_HEC_TOKEN}`.
+|HEC token|Required token. Masked in the dialog and encrypted with Hop password conventions in saved pipelines. Prefer a secret variable such as `+${SPLUNK_HEC_TOKEN}+`.
|Batch count|Optional events per HTTP request. Empty uses the Beam default of 10. A partial batch is flushed on a 2 second timer.
|Root CA certificate|Optional PEM used while certificate validation stays enabled. A `gs://` path needs the Beam GCS filesystem on the worker.
|Disable certificate validation|Unchecked by default. HTTPS validates the server certificate and hostname unless this is enabled.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/jsoninput.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/jsoninput.adoc
index c591eefddc..193c399f32 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/jsoninput.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/jsoninput.adoc
@@ -118,7 +118,7 @@ Results are not limited when set to zero.
=== JSONPath tab
-*Resolve variables in JSONPath* is enabled by default, including for existing pipelines. Clear it to use every extraction Path literally. This is required for root-array paths such as `$[0].similarity`, whose `$[0]` otherwise has a meaning in Hop variable resolution. Clearing it also disables `${VARIABLE}` substitution inside extraction paths. File and URL settings continue to resolve variables normally.
+*Resolve variables in JSONPath* is enabled by default, including for existing pipelines. Clear it to use every extraction Path literally. This is required for root-array paths such as `$[0].similarity`, whose `$[0]` otherwise has a meaning in Hop variable resolution. Clearing it also disables `+${VARIABLE}+` substitution inside extraction paths. File and URL settings continue to resolve variables normally.
=== Fields Tab
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/pipeline-executor.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/pipeline-executor.adoc
index f3a6c04d86..e926faeedb 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/pipeline-executor.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/pipeline-executor.adoc
@@ -89,8 +89,8 @@ The filename may contain variables (for example, you can use the built-in Intern
*NOTE:* It must be considered that, by specifying the pipeline file name using this option, we can experience a little performance penalty because the pipeline that will be executed will be initialized at runtime and not during the initialization phase as usual. On the other side this option gives greater flexibility in specifying the pipeline filename dynamically and this could be useful for many use-cases.
|Run configuration|Specify the Pipeline Run Configuration to be used for execution.
|Stop after (milliseconds)|Maximum time to wait for each child pipeline execution attempt. Empty or 0 means wait indefinitely. When the time is reached the child pipeline is stopped and the execution-results stream reports a failure (`ExecutionResult=N`, `ExecutionNrErrors>=1`) for that attempt. The value may contain a variable.
-|Retry attempts on failure|Number of retries after a failed child pipeline execution attempt. `0` means no retries (default), so the transform executes the child once. The value can use integer shorthand and variables (for example `1,000`, `100k`, `1.5m`, `1e3`, `'${PIPELINE_RETRY_ATTEMPTS}'`).
-|Retry delay (milliseconds)|Delay between retry attempts. Empty or `0` means retry immediately. The delay happens only between attempts and is not part of the per-attempt stop-after timeout. The value can use integer shorthand and variables (for example `1,000`, `100k`, `1.5m`, `1e3`, `'${PIPELINE_RETRY_DELAY_MS}'`).
+|Retry attempts on failure|Number of retries after a failed child pipeline execution attempt. `0` means no retries (default), so the transform executes the child once. The value can use integer shorthand and variables (for example `1,000`, `100k`, `1.5m`, `1e3`, `+'${PIPELINE_RETRY_ATTEMPTS}'+`).
+|Retry delay (milliseconds)|Delay between retry attempts. Empty or `0` means retry immediately. The delay happens only between attempts and is not part of the per-attempt stop-after timeout. The value can use integer shorthand and variables (for example `1,000`, `100k`, `1.5m`, `1e3`, `+'${PIPELINE_RETRY_DELAY_MS}'+`).
|===
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-input.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-input.adoc
index dd8e201f84..737f766e60 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-input.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-input.adoc
@@ -42,7 +42,7 @@ Hop-only schemes such as `s3://`, `azure://` or a named MinIO connection do not
|Unique name of the transform in the pipeline.
|Spark path (Hadoop URI)
-|File, directory or glob to read. Supports variables. Avoid `${PROJECT_HOME}` when running with a Spark project package: that variable points at the extracted definition files, not at data. Use a data variable such as `HOP_DATA` or an explicit `s3a://` / `hdfs://` URI instead.
+|File, directory or glob to read. Supports variables. Avoid `+${PROJECT_HOME}+` when running with a Spark project package: that variable points at the extracted definition files, not at data. Use a data variable such as `HOP_DATA` or an explicit `s3a://` / `hdfs://` URI instead.
|Format
|`csv` (default), `parquet`, `json`, `orc` or `text`. Any other Spark data source name is passed to `spark.read.format()` as is.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-output.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-output.adoc
index fa9b4f711e..f2e6fd7962 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-output.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-output.adoc
@@ -44,7 +44,7 @@ See xref:pipeline/spark/paths-and-filesystems.adoc[Paths and file systems] for t
|Unique name of the transform in the pipeline.
|Spark path / directory (Hadoop URI)
-|Output directory or prefix. Supports variables. Avoid `${PROJECT_HOME}` when running with a Spark project package: that variable points at the extracted definition files, not at a data location. Use a data variable such as `HOP_DATA` or `OUTPUT_ROOT`, or an explicit `s3a://` / `hdfs://` URI. Can be left empty for a path-less sink such as `jdbc`, which is addressed entirely through *Extra options*.
+|Output directory or prefix. Supports variables. Avoid `+${PROJECT_HOME}+` when running with a Spark project package: that variable points at the extracted definition files, not at a data location. Use a data variable such as `HOP_DATA` or `OUTPUT_ROOT`, or an explicit `s3a://` / `hdfs://` URI. Can be left empty for a path-less sink such as `jdbc`, which is addressed entirely through *Extra options*.
|Format
|`csv` (default), `parquet`, `json`, `orc` or `text`. Any other Spark data source name is passed to `df.write.format()` as is, for example `jdbc`.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/watchfiles.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/watchfiles.adoc
index 830ed3b5d6..133a48bd6a 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/watchfiles.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/watchfiles.adoc
@@ -122,7 +122,7 @@ Remote schemes use Hop's installed VFS providers; this plugin creates no SFTP, F
Root resolution uses `HopVfs.getFileObject(resolvedPath, variables)`, preserving execution variables, metadata-driven connections and VFS namespaces.
Subsequent operations resolve relative to that same root FileObject.
Named connections are recommended, particularly on Hop Server. Relative paths follow the existing HopVfs working-directory rules;
-use an explicit variable such as `${PROJECT_HOME}` for a project-relative path.
+use an explicit variable such as `+${PROJECT_HOME}+` for a project-relative path.
=== Stability and coalescing
@@ -280,7 +280,7 @@ For local filenames containing a literal percent sign, `filename` is a file URI
== Example
-The bundled `watch-files/watch-files.hpl` sample monitors `${PROJECT_HOME}/watch-files/input` and writes filename, event type, size and modification time to the log.
+The bundled `watch-files/watch-files.hpl` sample monitors `+${PROJECT_HOME}/watch-files/input+` and writes filename, event type, size and modification time to the log.
Create or modify a CSV in that directory, wait for stability, then stop the pipeline.
Restart it after adding a CSV while stopped to observe recovery.
Its sibling `state` directory persists checkpoints.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/webservices.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/webservices.adoc
index 7ff5567511..f963b08cfd 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/webservices.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/webservices.adoc
@@ -32,12 +32,12 @@ The Web Services Lookup transform performs a Web Services lookup using the Web S
|Option|Description
|Transform Name|Name of the transform this name has to be unique in a single pipeline.
|URL|The location of the WSDL document.
-This is either an `http://` or `https://` URL, or a file, for example `${PROJECT_HOME}/wsdl/service.wsdl`.
+This is either an `http://` or `https://` URL, or a file, for example `+${PROJECT_HOME}/wsdl/service.wsdl+`.
A file can be on any file system Hop can read: a local folder, a `file://` URL, S3, Azure, a named VFS connection and so on.
Variables are resolved, both in the dialog and when the pipeline runs.
|Browse... (button)|Select a WSDL file.
Its location is put in the URL field and the WSDL is loaded, as with the Load button.
-A file in your project folder is kept relative to `${PROJECT_HOME}`, so the pipeline keeps working when the project moves.
+A file in your project folder is kept relative to `+${PROJECT_HOME}+`, so the pipeline keeps working when the project moves.
|Load (button)|The load button loads the WSDL at the specified URL and tries to automatically populate the input and output tabs and fields.
NOTE: If this doesn't work, you can still try to manually specify the input and output fields using the "Add Input" and "Add Output" buttons.
|Operation|The operation of the web service to call.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/technology/graph-databases/index.adoc b/docs/hop-user-manual/modules/ROOT/pages/technology/graph-databases/index.adoc
index 28a05d7891..4168b5781b 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/technology/graph-databases/index.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/technology/graph-databases/index.adoc
@@ -179,7 +179,7 @@ From Hop 2.20 on it works with every graph database above. Existing projects kee
|Neo4j location |Graph database location
|===
* `HOP_GRAPH_LOGGING_CONNECTION` replaces `NEO4J_LOGGING_CONNECTION`, which keeps working when the new variable isn't set.
-* The Cypher builder writes parameters as `$name`. It wrote them as `{name}`, which Neo4j 4 and later reject, so statements without UNWIND work again.
+* The Cypher builder writes parameters as `$name`. It wrote them as `+{name}+`, which Neo4j 4 and later reject, so statements without UNWIND work again.
* Get graph logging info finds the previous executions of pipelines and workflows: it looked for execution types which the logging doesn't write.
The workflow logging now writes the status of a workflow, which these lookups need.
* The graph index, graph constraint, graph script and check connections actions report their own success, also after a failure hop.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-constraint.adoc b/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-constraint.adoc
index 629a1630a1..129e8d4bf8 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-constraint.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-constraint.adoc
@@ -39,7 +39,7 @@ For similar operations on indexes, check the xref:workflow/actions/graph-index.a
** Object name: the label of the node or relationship you want to update a constraint for
** Property: the property to put the constraint on (for NODE_KEY, use comma-separated properties like "id,name")
-The constraint name, object name and properties can be variables, for example `${PERSON_KEY}`.
+The constraint name, object name and properties can be variables, for example `+${PERSON_KEY}+`.
The action resolves them before it builds the statement, for create and drop, and the Cypher preview shows the resolved values.
[NOTE]
diff --git a/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-index.adoc b/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-index.adoc
index ae37987fe6..6ea5dae87c 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-index.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-index.adoc
@@ -42,7 +42,7 @@ For similar operations on constraints, check the xref:workflow/actions/graph-con
** Vector similarity: VECTOR only, COSINE (the default) or EUCLIDEAN
** Vector capacity: VECTOR on Memgraph only, the number of vectors to reserve room for, 1000 when empty
-The index name, object name, properties, vector dimensions and vector capacity can be variables, for example `${CHUNK_INDEX}` to keep a test and a production index apart.
+The index name, object name, properties, vector dimensions and vector capacity can be variables, for example `+${CHUNK_INDEX}+` to keep a test and a production index apart.
The action resolves them before it builds the statement, for create and drop, and the Cypher preview shows the resolved values.
Use the same variable for the index name in xref:pipeline/transforms/graph-vector-search.adoc[Graph vector search].