Skip to content

Commit

Permalink
Merge branch 'release/1.0.0-preview.20240207' into master/1.x
Browse files Browse the repository at this point in the history
  • Loading branch information
github-actions[bot] committed Feb 6, 2024
2 parents 77cc11e + eed71ce commit 446c4a4
Show file tree
Hide file tree
Showing 16 changed files with 301 additions and 68 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/deploy-snapshot.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ jobs:
build:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3.3.0
- uses: actions/checkout@v4.1.1
- name: Set up JDK 1.8
uses: actions/setup-java@v3.10.0
uses: actions/setup-java@v4.0.0
with:
java-version: '8'
distribution: 'temurin'
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ jobs:
build:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3.0.2
- uses: actions/checkout@v4.1.1
with:
fetch-depth: 0

- name: Set up JDK 1.8
uses: actions/setup-java@v3.5.1
uses: actions/setup-java@v4.0.0
with:
java-version: '8'
distribution: 'temurin'
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/test-pull-requests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ jobs:
build:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3.3.0
- uses: actions/checkout@v4.1.1
- name: Set up JDK 1.8
uses: actions/setup-java@v3.10.0
uses: actions/setup-java@v4.0.0
with:
java-version: '8'
distribution: 'temurin'
Expand Down
44 changes: 22 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ Usage

First, you need Java 8 or later.

If you use Maven, add the following snippet to the `<dependencies>` section of your POM. For instructions for other build tools (Gradle, etc.), visit [jackson-jq](https://search.maven.org/artifact/net.thisptr/jackson-jq/1.0.0-preview.20230409/jar) on search.maven.org.
If you use Maven, add the following snippet to the `<dependencies>` section of your POM. For instructions for other build tools (Gradle, etc.), visit [jackson-jq](https://search.maven.org/artifact/net.thisptr/jackson-jq/1.0.0-preview.20240207/jar) on search.maven.org.

```xml
<dependency>
<groupId>net.thisptr</groupId>
<artifactId>jackson-jq</artifactId>
<version>1.0.0-preview.20230409</version>
<version>1.0.0-preview.20240207</version>
</dependency>
```

Expand All @@ -32,29 +32,29 @@ To test a query quickly, we provide jackson-jq CLI.
*Please note that jackson-jq is a Java library and the CLI is provided solely for debugging/testing purpose (and not for production). The command-line options might change without notice.*

```sh
$ curl -LO https://repo1.maven.org/maven2/net/thisptr/jackson-jq-cli/1.0.0-preview.20230409/jackson-jq-cli-1.0.0-preview.20230409.jar
$ curl -LO https://repo1.maven.org/maven2/net/thisptr/jackson-jq-cli/1.0.0-preview.20240207/jackson-jq-cli-1.0.0-preview.20240207.jar

$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar --help
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar --help
usage: jackson-jq [OPTIONS...] QUERY
-c,--compact compact instead of pretty-printed output
-h,--help print this message
--jq <arg> specify jq version
-n,--null-input use `null` as the single input value
-r,--raw output raw strings, not JSON texts

$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar '.foo'
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar '.foo'
{"foo": 42}
42
```

To test a query with a specific jq version,

```sh
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar --jq 1.5 'join("-")'
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar --jq 1.5 'join("-")'
["1", 2]
jq: error: string ("-") and number (2) cannot be added

$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar --jq 1.6 'join("-")' # jq-1.6 can join any values, not only strings
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar --jq 1.6 'join("-")' # jq-1.6 can join any values, not only strings
["1", 2]
"1-2"
```
Expand Down Expand Up @@ -236,9 +236,9 @@ $ jq -n '1 + 3 as $a | ($a * 2)' # interpreted as 1 + (3 as $a | ($a * 2))
whereas jackson-jq consistently interprets them as `(1 + 3)` whether `as $a` is used or not:

```console
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar -n '1 + 3 | (. * 2)' # interpreted as (1 + 3) | (. * 2)
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar -n '1 + 3 | (. * 2)' # interpreted as (1 + 3) | (. * 2)
8
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar -n '1 + 3 as $a | ($a * 2)' # interpreted as (1 + 3) as $a | ($a * 2)
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar -n '1 + 3 as $a | ($a * 2)' # interpreted as (1 + 3) as $a | ($a * 2)
8
```

Expand All @@ -247,7 +247,7 @@ $ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar -n '1 + 3 as $a | ($a * 2)
```console
$ jq -n '1 + 3 as $a | ($a * 2)' # interpreted as 1 + (3 as $a | ($a * 2))
7
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar -n '1 + 3 as $a | ($a * 2)' # interpreted as (1 + 3) as $a | ($a * 2)
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar -n '1 + 3 as $a | ($a * 2)' # interpreted as (1 + 3) as $a | ($a * 2)
8
```

Expand All @@ -274,7 +274,7 @@ If the function with the same is defined more than once at the same scope, jacks
```console
$ jq -n 'def f: 1; def g: f; def f: 2; g'
1
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar -n 'def f: 1; def g: f; def f: 2; g'
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar -n 'def f: 1; def g: f; def f: 2; g'
2
```

Expand All @@ -283,7 +283,7 @@ $ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar -n 'def f: 1; def g: f; de
Avoid using the duplicate function name.

```console
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar -n 'def f1: 1; def g: f1; def f2: 2; g'
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar -n 'def f1: 1; def g: f1; def f2: 2; g'
1
```

Expand Down Expand Up @@ -353,7 +353,7 @@ jq: error: Division by zero? at <top-level>, line 1:
jq: 1 compile error
$ jq '. / 0' <<< 0
jq: error (at <stdin>:1): number (0) and number (0) cannot be divided because the divisor is zero
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar -n '0 / 0'
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar -n '0 / 0'
jq: error: number (0) and number (0) cannot be divided because the divisor is zero
```

Expand Down Expand Up @@ -386,9 +386,9 @@ $ jq-1.2 -n '[1,2,3] | ((.[] | select(. > 1)) |= empty)'
2,
3
]
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar --jq 1.6 -n '[1,2,3] | ((.[] | select(. > 1)) |= empty)'
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar --jq 1.6 -n '[1,2,3] | ((.[] | select(. > 1)) |= empty)'
jq: error: `|= empty` is undefined. See https://github.com/stedolan/jq/issues/897
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar --jq 1.5 -n '[1,2,3] | ((.[] | select(. > 1)) |= empty)'
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar --jq 1.5 -n '[1,2,3] | ((.[] | select(. > 1)) |= empty)'
jq: error: `|= empty` is undefined. See https://github.com/stedolan/jq/issues/897
```

Expand All @@ -397,9 +397,9 @@ jq: error: `|= empty` is undefined. See https://github.com/stedolan/jq/issues/89
You can use `_modify/2` if you really want to the original behavior.

```console
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar --jq 1.6 -n '[1,2,3] | _modify((.[] | select(. > 1)); empty)'
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar --jq 1.6 -n '[1,2,3] | _modify((.[] | select(. > 1)); empty)'
[ 1, 3 ]
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar --jq 1.5 -n '[1,2,3] | _modify((.[] | select(. > 1)); empty)'
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar --jq 1.5 -n '[1,2,3] | _modify((.[] | select(. > 1)); empty)'
null
```

Expand All @@ -419,7 +419,7 @@ jq 1.5
```console
$ jq-1.5 -c 'path(.foo as $a | $a)' <<< '{"foo": 1}'
["foo"]
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar --jq 1.5 -c 'path(.foo as $a | $a)' <<< '{"foo": 1}'
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar --jq 1.5 -c 'path(.foo as $a | $a)' <<< '{"foo": 1}'
jq: error: Invalid path expression with result 1
```

Expand All @@ -428,7 +428,7 @@ jq 1.6
```console
$ jq-1.6 -c 'path(.foo as $a | $a)' <<< '{"foo": 1}'
jq: error (at <stdin>:1): Invalid path expression with result 1
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar --jq 1.6 -c 'path(.foo as $a | $a)' <<< '{"foo": 1}'
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar --jq 1.6 -c 'path(.foo as $a | $a)' <<< '{"foo": 1}'
jq: error: Invalid path expression with result 1
```

Expand All @@ -452,7 +452,7 @@ $ jq -n 'label $a | label $b | try (break $b) catch .'
{
"__jq": 1
}
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar -n 'label $a | label $b | try (break $b) catch .'
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar -n 'label $a | label $b | try (break $b) catch .'
{
"__jq" : 0
}
Expand Down Expand Up @@ -482,7 +482,7 @@ $ jq-1.6 -n '"x" | indices("")' # stuck in infinite loop
^C
$ jq-1.6-83-gb52fc10 -n '"x" | indices("")'
[]
$ java -jar jackson-jq-cli-1.0.0-preview.20230409.jar -n '"x" | indices("")'
$ java -jar jackson-jq-cli-1.0.0-preview.20240207.jar -n '"x" | indices("")'
[ ]
```

Expand All @@ -499,7 +499,7 @@ To use this module, you need to add the following Maven dependency and set `Buil
<dependency>
<groupId>net.thisptr</groupId>
<artifactId>jackson-jq-extra</artifactId>
<version>1.0.0-preview.20230409</version>
<version>1.0.0-preview.20240207</version>
</dependency>
```

Expand Down
6 changes: 3 additions & 3 deletions jackson-jq-cli/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@
<parent>
<groupId>net.thisptr</groupId>
<artifactId>jackson-jq-parent</artifactId>
<version>1.0.0-preview.20230409</version>
<version>1.0.0-preview.20240207</version>
</parent>

<dependencies>
<dependency>
<groupId>net.thisptr</groupId>
<artifactId>jackson-jq-extra</artifactId>
<version>1.0.0-preview.20230409</version>
<version>1.0.0-preview.20240207</version>
</dependency>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.5.0</version>
<version>1.6.0</version>
</dependency>
</dependencies>

Expand Down
4 changes: 2 additions & 2 deletions jackson-jq-extra/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@
<parent>
<groupId>net.thisptr</groupId>
<artifactId>jackson-jq-parent</artifactId>
<version>1.0.0-preview.20230409</version>
<version>1.0.0-preview.20240207</version>
</parent>

<dependencies>
<dependency>
<groupId>net.thisptr</groupId>
<artifactId>jackson-jq</artifactId>
<version>1.0.0-preview.20230409</version>
<version>1.0.0-preview.20240207</version>
</dependency>
</dependencies>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package net.thisptr.jackson.jq.extra;

import com.google.auto.service.AutoService;

import net.thisptr.jackson.jq.BuiltinFunction;
import net.thisptr.jackson.jq.Function;
import net.thisptr.jackson.jq.extra.functions.HostnameFunction;
Expand All @@ -11,6 +10,7 @@
import net.thisptr.jackson.jq.extra.functions.TimestampFunction;
import net.thisptr.jackson.jq.extra.functions.UriDecodeFunction;
import net.thisptr.jackson.jq.extra.functions.UriParseFunction;
import net.thisptr.jackson.jq.extra.functions.Uuid35Function;
import net.thisptr.jackson.jq.extra.functions.Uuid4Function;
import net.thisptr.jackson.jq.module.BuiltinModule;
import net.thisptr.jackson.jq.module.Module;
Expand All @@ -29,6 +29,8 @@ public ModuleImpl() {
addFunction(new UriDecodeFunction());
addFunction(new UriParseFunction());
addFunction(new Uuid4Function());
addFunction("uuid3/1", new Uuid35Function(3));
addFunction("uuid5/1", new Uuid35Function(5));
}

private void addFunction(final Function f) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package net.thisptr.jackson.jq.extra.functions;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.UUID;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.JsonNodeType;
import com.fasterxml.jackson.databind.node.TextNode;
import net.thisptr.jackson.jq.Expression;
import net.thisptr.jackson.jq.Function;
import net.thisptr.jackson.jq.PathOutput;
import net.thisptr.jackson.jq.Scope;
import net.thisptr.jackson.jq.Version;
import net.thisptr.jackson.jq.exception.JsonQueryException;
import net.thisptr.jackson.jq.exception.JsonQueryTypeException;
import net.thisptr.jackson.jq.extra.internal.misc.Preconditions;
import net.thisptr.jackson.jq.extra.internal.misc.UuidUtils;
import net.thisptr.jackson.jq.path.Path;

public class Uuid35Function implements Function {
private final int uuidVersion;

public Uuid35Function(int uuidVersion) {
this.uuidVersion = uuidVersion;
}

@Override
public void apply(Scope scope, List<Expression> args, JsonNode in, Path path, PathOutput output, Version version) throws JsonQueryException {
Preconditions.checkInputType("uuid5", in, JsonNodeType.STRING, JsonNodeType.BINARY);

args.get(0).apply(scope, in, (namespaceArg) -> {
if (!namespaceArg.isTextual())
throw new JsonQueryTypeException("namespace must be string, but got: %s", namespaceArg.getNodeType());
UUID namespace;
try {
namespace = UUID.fromString(namespaceArg.asText());
} catch (IllegalArgumentException e) {
throw new JsonQueryException("namespace must be a valid UUID", e);
}

UUID uuid;
if (in.isBinary()) {
try {
uuid = UuidUtils.uuid3or5(namespace, in.binaryValue(), this.uuidVersion);
} catch (IOException e) {
throw new JsonQueryException(e);
}
} else {
uuid = UuidUtils.uuid3or5(namespace, in.asText().getBytes(StandardCharsets.UTF_8), this.uuidVersion);
}

output.emit(new TextNode(uuid.toString()), null);
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package net.thisptr.jackson.jq.extra.internal.misc;

import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;

public class UuidUtils {

public static UUID uuid3(final UUID namespace, final byte[] name) {
return uuid3or5(namespace, name, 3);
}

public static UUID uuid5(final UUID namespace, final byte[] name) {
return uuid3or5(namespace, name, 5);
}

public static UUID uuid3or5(final UUID namespace, final byte[] name, final int version) {
// https://datatracker.ietf.org/doc/html/rfc4122#section-4.3
MessageDigest md;
try {
switch (version) {
case 3:
md = MessageDigest.getInstance("MD5");
break;
case 5:
md = MessageDigest.getInstance("SHA-1");
break;
default:
throw new IllegalArgumentException("invalid version");
}
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}

md.update(toBytes(namespace));
md.update(name);
byte[] hash = md.digest();

// put in the variant and version bits
hash[6] &= (byte) 0b0000_1111;
hash[6] |= (byte) (version << 4);
hash[8] &= (byte) 0b0011_1111;
hash[8] |= (byte) 0b1000_0000;
return fromBytes(hash);
}

public static byte[] toBytes(UUID uuid) {
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
return bb.array();
}

public static UUID fromBytes(byte[] bytes) {
ByteBuffer bb = ByteBuffer.wrap(bytes);
long mostSigBits = bb.getLong();
long leastSigBits = bb.getLong();
return new UUID(mostSigBits, leastSigBits);
}
}
Loading

0 comments on commit 446c4a4

Please sign in to comment.