diff --git a/.agents/skills/airflow-java-sdk/SKILL.md b/.agents/skills/airflow-java-sdk/SKILL.md index 9921832eafee5..5681c6f7ffd75 100644 --- a/.agents/skills/airflow-java-sdk/SKILL.md +++ b/.agents/skills/airflow-java-sdk/SKILL.md @@ -6,7 +6,7 @@ description: > coordinator in `task-sdk/src/airflow/sdk/coordinators/java/` — whether they want to add a feature, write tests, fix a bug, understand the architecture, or prepare a PR. Trigger on phrases like "Java SDK", "JavaCoordinator", - "java-sdk", "annotation processor", "Builder.Task", "BundleBuilder", or + "java-sdk", "annotation processor", "Airflow.Task", "BundleBuilder", or anything about running JVM tasks in Airflow. --- @@ -87,7 +87,7 @@ the Dag bundle or startup fails. Every JAR in the Dag bundle goes on one classpa | `java-sdk/sdk/.../execution/Client.kt` | Supervisor wire calls | | `java-sdk/sdk/.../execution/Comm.kt` | 4-byte-prefix MessagePack framing | | `java-sdk/sdk/.../Server.kt` | Entry-point; drives the execution loop | -| `java-sdk/processor/.../BuilderProcessor.kt` | Kapt annotation processor | +| `java-sdk/processor/.../AirflowProcessor.kt` | Kapt annotation processor | | `java-sdk/plugin/.../AirflowSdkPlugin.kt` | Gradle bundle plugin | | `task-sdk/.../coordinators/java/coordinator.py` | Python side — spawns the JVM | | `task-sdk/.../schema/schema.json` | Wire protocol definition (both sides) | diff --git a/airflow-core/docs/authoring-and-scheduling/language-sdks/java.rst b/airflow-core/docs/authoring-and-scheduling/language-sdks/java.rst index 793eda354121a..e8e63811c9617 100644 --- a/airflow-core/docs/authoring-and-scheduling/language-sdks/java.rst +++ b/airflow-core/docs/authoring-and-scheduling/language-sdks/java.rst @@ -178,16 +178,16 @@ Save the task implementations as package com.mycompany.airflow.sales; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; public class SalesPipeline { - @Builder.TaskHandler(dag = "sales_pipeline", task = "extract") + @Airflow.TaskHandler(dag = "sales_pipeline", task = "extract") public long extract() { return 3; } - @Builder.TaskHandler(dag = "sales_pipeline", task = "transform") + @Airflow.TaskHandler(dag = "sales_pipeline", task = "transform") public long transform(long recordCount) { return recordCount * 2; } @@ -344,20 +344,20 @@ Annotate a plain Java class and let the SDK generate the boilerplate at compile * - Annotation - Purpose - * - ``@Builder.TaskHandler(dag = "...", task = "...")`` + * - ``@Airflow.TaskHandler(dag = "...", task = "...")`` - Marks a method as the Java body of a task the Python Dag file declares with ``@task.stub``. ``dag`` must match the ``dag_id`` and ``task`` the stub function name; omitting ``task`` derives it from the method name. There is no class-level annotation on this surface — the Dag is the Python file's, so the handler names the pair it binds to. - * - ``@Builder.Dag(id = "...")`` + * - ``@Airflow.Dag(id = "...")`` - Marks a class as a Dag that Java itself owns. Attributes (``schedule``, ``description``, ``tags``, ``catchup``, …) are Airflow's own Dag settings; only attributes written explicitly are applied. See :ref:`java-sdk/native-dags`. - * - ``@Builder.Task(id = "...")`` + * - ``@Airflow.Task(id = "...")`` - Marks a method as a task of a Java-owned Dag. If ``id`` is omitted the method name is used. Further attributes (``retries``, ``queue``, ``retryDelay``, …) are Airflow's own task settings; only attributes written explicitly are applied. - * - ``@Builder.Deps`` + * - ``@Airflow.Deps`` - Marks the nested class that declares the task graph in Java, TaskFlow-style. Required for a Dag that Java owns end to end. See :ref:`java-sdk/native-dags`. * - ``TaskInput`` / ``@ArgName("...")`` @@ -378,14 +378,14 @@ registry and resolves data parameters and XCom pushes automatically. public class MyDag { - @Builder.TaskHandler(dag = "my_dag", task = "fetch") + @Airflow.TaskHandler(dag = "my_dag", task = "fetch") public String fetch(Client client) throws Exception { var conn = client.getConnection("my_api"); // implement task logic return result; } - @Builder.TaskHandler(dag = "my_dag", task = "process") + @Airflow.TaskHandler(dag = "my_dag", task = "process") public long process(Client client, String fetched) { var threshold = (String) client.getVariable("process_threshold"); // implement task logic @@ -493,7 +493,7 @@ so renaming one in an IDE never rebinds an input. .. code-block:: java - @Builder.TaskHandler(dag = "etl", task = "score") + @Airflow.TaskHandler(dag = "etl", task = "score") public long score(Client client, long rows, double threshold) { // rows <- the load_rows XCom (position 0) // threshold <- the literal 0.75 (position 1) @@ -552,7 +552,7 @@ and reported rather than handed the wrong value. public double threshold; // binds threshold } - @Builder.TaskHandler(dag = "etl", task = "score") + @Airflow.TaskHandler(dag = "etl", task = "score") public long score(Client client, ScoreInput input) { ... } Reach for ``@ArgName`` when the argument name is not a legal or usable Java identifier — a Python @@ -620,12 +620,12 @@ Edges are checked when the Dag is registered with a ``Bundle``: an upstream that Dag, or to no Dag, and a cycle anywhere in the graph both fail there rather than at the first task run. -Wiring the graph with ``@Builder.Deps`` +Wiring the graph with ``@Airflow.Deps`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -For a Dag written with annotations, the graph is declared by a nested ``@Builder.Deps`` class. The +For a Dag written with annotations, the graph is declared by a nested ``@Airflow.Deps`` class. The annotation processor generates a ``Deps`` interface, the *wiring view*, with one method -per ``@Builder.Task`` method: the injected ``Client`` and ``Context`` parameters are dropped, each +per ``@Airflow.Task`` method: the injected ``Client`` and ``Context`` parameters are dropped, each data parameter becomes an ``Arg``, and the return value becomes a ``TaskRef``. Calling a view method registers its task, and passing the handle one returned into another feeds the upstream's output into the downstream's parameter *and* wires the data edge. The call graph is the task graph, @@ -636,34 +636,34 @@ generated view, with a no-argument ``depends()`` method: .. code-block:: java - @Builder.Dag( + @Airflow.Dag( id = "java_etl", schedule = "@daily", description = "Pure-Java Dag built with annotations", tags = {"example", "java-sdk"}) public class EtlPipeline { - @Builder.Task(id = "extract", retries = 2) + @Airflow.Task(id = "extract", retries = 2) public long extract() { return 42L; } - @Builder.Task(id = "transform") + @Airflow.Task(id = "transform") public long transform(long extracted, double factor) { return (long) (extracted * factor); } - @Builder.Task(id = "load") + @Airflow.Task(id = "load") public void load(long transformed) { // implement task logic } - @Builder.Task(id = "audit") + @Airflow.Task(id = "audit") public void audit() { // side effect only, no data in or out } - @Builder.Deps + @Airflow.Deps static class Wiring implements EtlPipelineDeps { void depends() { var rows = extract(); @@ -673,7 +673,7 @@ generated view, with a no-argument ``depends()`` method: } } -Every ``@Builder.Task`` method must be called in the wiring class; a task the wiring missed fails at +Every ``@Airflow.Task`` method must be called in the wiring class; a task the wiring missed fails at Dag-parse time. ``lit(...)`` wires an inline constant where no upstream feeds a parameter. A bare ``double`` cannot be an ``Arg``, so a constant is wrapped. Airflow records what each task is called with, and that record travels as JSON, so a constant has to be a string, number, boolean, list or @@ -686,15 +686,15 @@ handle in a local and reuse that. the wiring class ``Flow`` is inherited by simple name, so it needs no import and never collides with ``java.util.concurrent.Flow``. -Every ``@Builder.Dag`` class declares a wiring class, because the graph is what the Dag owns. A +Every ``@Airflow.Dag`` class declares a wiring class, because the graph is what the Dag owns. A class that supplies only task bodies, for a Dag a Python file declares, carries -``@Builder.TaskHandler`` instead and contributes no Dag. +``@Airflow.TaskHandler`` instead and contributes no Dag. .. note:: A native Java Dag binds its task arguments from its own wiring, and the ``_arg_bindings`` it serializes are what Airflow records and shows. Runtime bindings (see :ref:`java-sdk/arg-binding`) - are what a ``@Builder.TaskHandler`` class reads, for a task whose Dag a Python file declares. + are what an ``@Airflow.TaskHandler`` class reads, for a task whose Dag a Python file declares. Task groups ~~~~~~~~~~~ @@ -711,24 +711,24 @@ the Dag or inside another group, and the group declares its tasks: staging.taskGroup("checks").task("nulls", Nulls.class).after(stage); // "staging.checks.nulls" extract.before(staging); -With annotations, a ``@Builder.TaskGroup`` class holds the tasks of one group, and nesting one in +With annotations, an ``@Airflow.TaskGroup`` class holds the tasks of one group, and nesting one in another nests the groups: .. code-block:: java - @Builder.TaskGroup // the group "Staging", after the class + @Airflow.TaskGroup // the group "Staging", after the class static class Staging { - @Builder.Task + @Airflow.Task public long stage(long rows) { ... } // the task "Staging.stage" - @Builder.TaskGroup(id = "checks") + @Airflow.TaskGroup(id = "checks") static class Checks { - @Builder.Task + @Airflow.Task public void nulls(long staged) { ... } // "Staging.checks.nulls" } } - @Builder.Deps + @Airflow.Deps static class Wiring implements EtlPipelineDeps { void depends() { var rows = extract(); @@ -762,7 +762,7 @@ underscores, or dashes, and no task or other group in the Dag can share it. Configuration attributes ~~~~~~~~~~~~~~~~~~~~~~~~ -The ``@Builder.Dag`` and ``@Builder.Task`` configuration attributes, and the keys accepted by +The ``@Airflow.Dag`` and ``@Airflow.Task`` configuration attributes, and the keys accepted by ``DagDef.config`` and ``TaskDef.config``, are Airflow's own Dag and task settings, under the names Airflow uses. Annotation attributes are ``camelCase`` (``retryDelay``); ``config`` keys are those names as Airflow writes them (``"retry_delay"``). @@ -788,7 +788,7 @@ remember things like an external job ID so a retried task can resume instead of .. code-block:: java - @Builder.Task(id = "submit") + @Airflow.Task(id = "submit") public void submit(Client client) throws Exception { var store = client.getTaskStateStore(); var jobId = (String) store.get("job_id"); @@ -845,7 +845,7 @@ SDK older than schema ``2026-10-30``, every released one today, fails to parse a several Java coordinators, an unmapped bundle's JARs fail to parse too. * Every JAR in the bundle whose manifest sets ``Main-Class`` is parsed. Each Dag its main class - declares, through ``Bundle.register`` of a ``DagDef`` or an ``@Builder.Dag`` class, is stored with + declares, through ``Bundle.register`` of a ``DagDef`` or an ``@Airflow.Dag`` class, is stored with that JAR as its file. Task handlers for a Python Dag are not Dags. A JAR without ``Main-Class`` is skipped, but many dependency JARs set one (the PostgreSQL JDBC driver and H2 do, for example), so a thin bundle should set ``main_class`` or list its dependency JARs in ``.airflowignore``. @@ -858,7 +858,7 @@ several Java coordinators, an unmapped bundle's JARs fail to parse too. ``Main-Class`` are parsed. List JARs that should not be parsed in ``.airflowignore``. * Two JARs in the bundle that set the same ``Main-Class`` fail to parse, because the JVM would load the classes of only one of them. Keep one in the bundle. -* Set ``queue`` on every task, with ``@Builder.Task(queue = "java-native")`` or +* Set ``queue`` on every task, with ``@Airflow.Task(queue = "java-native")`` or ``TaskDef.config("queue", "java-native")``, so it runs on the coordinator's queue. There is no Dag-level queue yet. * A task runs the JAR of its Dag on the ``JavaCoordinator`` that its queue routes to, @@ -889,7 +889,7 @@ is the conventional pattern regardless of which logging framework you choose: private static final System.Logger log = System.getLogger(SalesPipeline.class.getName()); - @Builder.TaskHandler(dag = "etl", task = "extract") + @Airflow.TaskHandler(dag = "etl", task = "extract") public long extract(Client client) { log.log(System.Logger.Level.INFO, "Starting extraction"); return recordCount; diff --git a/airflow-e2e-tests/java-native-bundle/src/java/org/apache/airflow/e2e/nativedag/AnnotationDag.java b/airflow-e2e-tests/java-native-bundle/src/java/org/apache/airflow/e2e/nativedag/AnnotationDag.java index e4d8fc71c5528..78531c2ccb5cd 100644 --- a/airflow-e2e-tests/java-native-bundle/src/java/org/apache/airflow/e2e/nativedag/AnnotationDag.java +++ b/airflow-e2e-tests/java-native-bundle/src/java/org/apache/airflow/e2e/nativedag/AnnotationDag.java @@ -25,70 +25,70 @@ import org.apache.airflow.sdk.*; /** A native Java Dag declared with annotations; its tasks use the interface Dag's queue. */ -@Builder.Dag( +@Airflow.Dag( id = "java_native_annotation_e2e", description = "Native Java Dag of the Airflow E2E tests, declared with annotations", catchup = false, tags = {"java-sdk", "native", "e2e"}) public class AnnotationDag { - @Builder.Task(id = "extract", queue = QUEUE) + @Airflow.Task(id = "extract", queue = QUEUE) public long extract() { return 42L; } - @Builder.Task(id = "transform", queue = QUEUE) + @Airflow.Task(id = "transform", queue = QUEUE) public long transform(long extracted, double factor) { return (long) (extracted * factor); } /** Fails the run unless the value reached it, so a successful run proves the XCom flow. */ - @Builder.Task(id = "load", queue = QUEUE) + @Airflow.Task(id = "load", queue = QUEUE) public void load(long transformed) { if (transformed != 63L) { throw new IllegalStateException("load expected 63 from transform, got " + transformed); } } - @Builder.Task(id = "report_many", queue = QUEUE) + @Airflow.Task(id = "report_many", queue = QUEUE) public void reportMany() {} - @Builder.Task(id = "report_few", queue = QUEUE) + @Airflow.Task(id = "report_few", queue = QUEUE) public void reportFew() {} /** Picks one of {@link #reportMany} and {@link #reportFew}; the other is skipped. */ - @Builder.If(id = "has_rows", queue = QUEUE) + @Airflow.If(id = "has_rows", queue = QUEUE) public boolean hasRows(long transformed) { return transformed > 0; } - @Builder.Task(id = "report_long", queue = QUEUE) + @Airflow.Task(id = "report_long", queue = QUEUE) public void reportLong() {} - @Builder.Task(id = "report_short", queue = QUEUE) + @Airflow.Task(id = "report_short", queue = QUEUE) public void reportShort() {} /** Names the one of {@link #reportLong} and {@link #reportShort} that runs; the other is skipped. */ - @Builder.Switch(id = "pick_report", queue = QUEUE) + @Airflow.Switch(id = "pick_report", queue = QUEUE) public Class pickReport(long transformed) { return transformed > 100 ? AnnotationDagBuilder.ReportLong.class : AnnotationDagBuilder.ReportShort.class; } // A task that starts a run of another Dag. The method runs when this Dag is // built, not when the task runs, so it takes no arguments. - @Builder.Task(id = "trigger_downstream", queue = QUEUE) + @Airflow.Task(id = "trigger_downstream", queue = QUEUE) public TriggerDagRun triggerDownstream() { return new TriggerDagRun("java_native_target_e2e"); } // A task group: everything it declares is prefixed with its id, so this is // the task "checks.audit". - @Builder.TaskGroup(id = "checks") + @Airflow.TaskGroup(id = "checks") static class Checks { - @Builder.Task(id = "audit", queue = QUEUE) + @Airflow.Task(id = "audit", queue = QUEUE) public void audit() {} } - @Builder.Deps + @Airflow.Deps static class Wiring implements AnnotationDagDeps { void depends() { var extracted = extract(); diff --git a/java-sdk/README.md b/java-sdk/README.md index fda035f80dcc6..11f326e3a8e46 100644 --- a/java-sdk/README.md +++ b/java-sdk/README.md @@ -643,7 +643,7 @@ prek hook regenerate it. | capability: `task-args` | MUST † | ✓ | 3.4 | | | capability: `dag-params` | MUST † | ✗ | – | | | capability: `taskflow-dependencies` | MUST † | ✓ | 3.4 | | -| capability: `branching` | SHOULD † | ✓ | 3.4 | DagDef.If and DagDef.Switch, or @Builder.If and @Builder.Switch | +| capability: `branching` | SHOULD † | ✓ | 3.4 | DagDef.If and DagDef.Switch, or @Airflow.If and @Airflow.Switch | | capability: `dag-test` | SHOULD † | ✗ | – | | | capability: `task-group` | MAY † | ✓ | 3.4 | | | capability: `dynamic-task-mapping` | MAY † | ✗ | – | | @@ -746,13 +746,13 @@ E2E_TEST_MODE=java_sdk uv run --project airflow-e2e-tests pytest \ not the implementation language. - Keep `sdk/src/main/kotlin/` (the public API surface) free of internal implementation details; those belong in the `execution/` sub-package. -- The annotation processor (`BuilderProcessor.kt`) uses `kapt`. The `Builder` - class holding the `@Builder.Dag` / `@Builder.Task` annotations is generated +- The annotation processor (`AirflowProcessor.kt`) uses `kapt`. The `Airflow` + class holding the `@Airflow.Dag` / `@Airflow.Task` annotations is generated from the Dag serialization schema by `:sdk:generateDagDsl` (vendored at - `sdk/schema/dag-schema.json`), `@Builder.Deps` included. The `Arg`/`TaskRef` + `sdk/schema/dag-schema.json`), `@Airflow.Deps` included. The `Arg`/`TaskRef` and `Deps`/`Flow` graph types are hand-written next to the rest of the public surface in `sdk/src/main/kotlin/org/apache/airflow/sdk/`. When adding annotation - behaviour, handle it in `BuilderProcessor.kt` and add a golden-output test in + behaviour, handle it in `AirflowProcessor.kt` and add a golden-output test in `processor/src/test/kotlin/`. - The Python coordinator subclasses `SubprocessCoordinator`. Do not reach into the JVM process from Python beyond what `_build_execute_task_command` @@ -779,12 +779,12 @@ E2E_TEST_MODE=java_sdk uv run --project airflow-e2e-tests pytest \ 1. Hand-written annotations live in `sdk/src/main/kotlin/org/apache/airflow/sdk/` next to the runtime types (one package, so user code needs a single `import org.apache.airflow.sdk.*`); the configuration attributes of - `@Builder.Dag` / `@Builder.Task` come from the Dag serialization schema via + `@Airflow.Dag` / `@Airflow.Task` come from the Dag serialization schema via `:sdk:generateDagDsl` (adjust its allowlist/exclusion rules in `sdk/build.gradle.kts` when the exposed field set should change). -2. Handle it in `BuilderProcessor.kt` — generate the appropriate code in the +2. Handle it in `AirflowProcessor.kt` — generate the appropriate code in the `*Builder` class. -3. Add a test in `BuilderTest.kt` with expected generated output. +3. Add a test in `AirflowProcessorTest.kt` with expected generated output. 4. Update the annotation table in `java.rst`. **Fixing a framing or protocol bug**: focus on `execution/Comm.kt` and diff --git a/java-sdk/capabilities.yaml b/java-sdk/capabilities.yaml index 84ee13a9dda3b..cf9ec1c5fa758 100644 --- a/java-sdk/capabilities.yaml +++ b/java-sdk/capabilities.yaml @@ -111,7 +111,7 @@ capabilities: branching: supported: true since: "3.4" - note: "DagDef.If and DagDef.Switch, or @Builder.If and @Builder.Switch" + note: "DagDef.If and DagDef.Switch, or @Airflow.If and @Airflow.Switch" dag-test: supported: false task-group: diff --git a/java-sdk/example/src/java/org/apache/airflow/example/AnnotationExample.java b/java-sdk/example/src/java/org/apache/airflow/example/AnnotationExample.java index c7f08be99a615..2a9059f91ea90 100644 --- a/java-sdk/example/src/java/org/apache/airflow/example/AnnotationExample.java +++ b/java-sdk/example/src/java/org/apache/airflow/example/AnnotationExample.java @@ -34,7 +34,7 @@ public class AnnotationExample { private static final System.Logger log = System.getLogger(AnnotationExample.class.getName()); - @Builder.TaskHandler(dag = "java_annotation_example", task = "extract") + @Airflow.TaskHandler(dag = "java_annotation_example", task = "extract") public long extractValue(Client client) throws InterruptedException { log.log(INFO, "Hello from task"); @@ -53,7 +53,7 @@ public long extractValue(Client client) throws InterruptedException { return new Date().getTime(); } - @Builder.TaskHandler(dag = "java_annotation_example", task = "transform") + @Airflow.TaskHandler(dag = "java_annotation_example", task = "transform") public long transformValue(Client client, long extracted) { log.log(INFO, "Got XCom from extract: {0}", extracted); @@ -69,7 +69,7 @@ public long transformValue(Client client, long extracted) { // the task UP_FOR_RETRY -- which only works because the Java SDK now returns // RetryTask (instead of a terminal FAILED) when ti_context.should_retry is // set. The retry then runs this task again and it returns normally. - @Builder.TaskHandler(dag = "java_annotation_example") + @Airflow.TaskHandler(dag = "java_annotation_example") public void load(Context context, long transformed) { log.log(INFO, "Got XCom from transform: {0}", transformed); if (context.ti.tryNumber == 1) { @@ -86,7 +86,7 @@ public static class ReportInput implements TaskInput { public long transformed; } - @Builder.TaskHandler(dag = "java_annotation_example", task = "report") + @Airflow.TaskHandler(dag = "java_annotation_example", task = "report") public void report(ReportInput input) { log.log(INFO, "Report {0} for transformed value {1}", input.runLabel, input.transformed); if (!"nightly".equals(input.runLabel)) { @@ -95,7 +95,7 @@ public void report(ReportInput input) { } // Verify one supervisor channel can handle client calls across threads. - @Builder.TaskHandler(dag = "java_annotation_example", task = "concurrent") + @Airflow.TaskHandler(dag = "java_annotation_example", task = "concurrent") public void concurrentClientCalls(Client client) throws Exception { var pool = Executors.newFixedThreadPool(8); try { diff --git a/java-sdk/example/src/java/org/apache/airflow/example/XComCastingExample.java b/java-sdk/example/src/java/org/apache/airflow/example/XComCastingExample.java index 5e15dd778d656..f3608fbd1b3e1 100644 --- a/java-sdk/example/src/java/org/apache/airflow/example/XComCastingExample.java +++ b/java-sdk/example/src/java/org/apache/airflow/example/XComCastingExample.java @@ -30,20 +30,20 @@ public class XComCastingExample { private static final System.Logger log = System.getLogger(XComCastingExample.class.getName()); - @Builder.TaskHandler(dag = "java_xcom_casting_example", task = "produce_number") + @Airflow.TaskHandler(dag = "java_xcom_casting_example", task = "produce_number") public int produceNumber() { log.log(INFO, "Producing int 7"); return 7; } // Any primitive numeric type (byte, short, int, long, float, double) and its boxed form works the same way. - @Builder.TaskHandler(dag = "java_xcom_casting_example", task = "widen_to_long") + @Airflow.TaskHandler(dag = "java_xcom_casting_example", task = "widen_to_long") public long widenToLong(long value) { log.log(INFO, "Got long {0}", value); return value + 1; } - @Builder.TaskHandler(dag = "java_xcom_casting_example", task = "widen_to_double") + @Airflow.TaskHandler(dag = "java_xcom_casting_example", task = "widen_to_double") public void widenToDouble(double value) { log.log(INFO, "Got double {0}", value); if (value != 8.0) { @@ -51,12 +51,12 @@ public void widenToDouble(double value) { } } - @Builder.TaskHandler(dag = "java_xcom_casting_example", task = "produce_nothing") + @Airflow.TaskHandler(dag = "java_xcom_casting_example", task = "produce_nothing") public void produceNothing() { // Pushes no return_value XCom. } - @Builder.TaskHandler(dag = "java_xcom_casting_example", task = "consume_nullable") + @Airflow.TaskHandler(dag = "java_xcom_casting_example", task = "consume_nullable") public void consumeNullable(Integer value) { log.log(INFO, "Got nullable int {0}", value); if (value != null) { @@ -64,13 +64,13 @@ public void consumeNullable(Integer value) { } } - @Builder.TaskHandler(dag = "java_xcom_casting_example", task = "produce_fraction") + @Airflow.TaskHandler(dag = "java_xcom_casting_example", task = "produce_fraction") public double produceFraction() { log.log(INFO, "Producing double 1.5"); return 1.5; } - @Builder.TaskHandler(dag = "java_xcom_casting_example", task = "consume_float") + @Airflow.TaskHandler(dag = "java_xcom_casting_example", task = "consume_float") public void consumeFloat(float value) { log.log(INFO, "Got float {0}", value); if (value != 1.5f) { @@ -81,7 +81,7 @@ public void consumeFloat(float value) { // A parameter with type arguments keeps its element type. Reading an element // is what would fail if it did not: the wire integers decode to Long unless // the declared List survives the binding. - @Builder.TaskHandler(dag = "java_xcom_casting_example", task = "consume_double_list") + @Airflow.TaskHandler(dag = "java_xcom_casting_example", task = "consume_double_list") public void consumeDoubleList(List values) { log.log(INFO, "Got list {0}", values); double total = values.get(0) + values.get(1); diff --git a/java-sdk/example/src/java/org/apache/airflow/example/nativedag/AnnotationExample.java b/java-sdk/example/src/java/org/apache/airflow/example/nativedag/AnnotationExample.java index 0bb55ceacd0f5..01639dd6f7e82 100644 --- a/java-sdk/example/src/java/org/apache/airflow/example/nativedag/AnnotationExample.java +++ b/java-sdk/example/src/java/org/apache/airflow/example/nativedag/AnnotationExample.java @@ -24,10 +24,10 @@ import org.apache.airflow.sdk.*; -// A Dag defined entirely in Java, annotation-style. The @Builder.Dag and -// @Builder.Task attributes carry the configuration and the @Builder.Deps class +// A Dag defined entirely in Java, annotation-style. The @Airflow.Dag and +// @Airflow.Task attributes carry the configuration and the @Airflow.Deps class // declares the graph -- the single place dependencies are defined. -@Builder.Dag( +@Airflow.Dag( id = "java_native_annotation_example", description = "Pure-Java Dag authored with annotations", schedule = "@daily", @@ -37,48 +37,48 @@ public class AnnotationExample { private static final System.Logger log = System.getLogger(AnnotationExample.class.getName()); - @Builder.Task(id = "extract", retries = 2) + @Airflow.Task(id = "extract", retries = 2) public long extract() { log.log(INFO, "Extracting a value"); return 42L; } - @Builder.Task(id = "transform") + @Airflow.Task(id = "transform") public long transform(long extracted, double factor) { log.log(INFO, "Transforming {0} by {1}", extracted, factor); return (long) (extracted * factor); } - @Builder.Task(id = "load") + @Airflow.Task(id = "load") public void load(long transformed) { log.log(INFO, "Loaded {0}", transformed); } - @Builder.Task(id = "load_empty") + @Airflow.Task(id = "load_empty") public void loadEmpty() { log.log(INFO, "Nothing to load"); } // A condition: its boolean picks one of the two loads, and the other is // skipped. - @Builder.If(id = "has_rows") + @Airflow.If(id = "has_rows") public boolean hasRows(long transformed) { return transformed > 0; } - @Builder.Task(id = "report_long") + @Airflow.Task(id = "report_long") public void reportLong() { log.log(INFO, "Long report"); } - @Builder.Task(id = "report_short") + @Airflow.Task(id = "report_short") public void reportShort() { log.log(INFO, "Short report"); } // A switch: it names the one case that runs by the class generated for it, // and every other case is skipped. - @Builder.Switch(id = "pick_report") + @Airflow.Switch(id = "pick_report") public Class pickReport(long transformed) { return transformed > 100 ? AnnotationExampleBuilder.ReportLong.class @@ -87,16 +87,16 @@ public Class pickReport(long transformed) { // A task that starts a run of another Dag. The method runs when this Dag is // built, not when the task runs, so it takes no arguments. - @Builder.Task(id = "trigger_downstream") + @Airflow.Task(id = "trigger_downstream") public TriggerDagRun triggerDownstream() { return new TriggerDagRun("java_native_target_example").config("note", "from the annotation example"); } // A task group: everything it declares is prefixed with its id, so this is // the task "checks.audit". - @Builder.TaskGroup(id = "checks") + @Airflow.TaskGroup(id = "checks") static class Checks { - @Builder.Task(id = "audit") + @Airflow.Task(id = "audit") public void audit() { log.log(INFO, "Audited the run"); } @@ -104,7 +104,7 @@ public void audit() { // Implements the generated wiring view, so javac type-checks the graph: // extract() yields a TaskRef, which is an Arg for transform. - @Builder.Deps + @Airflow.Deps static class Wiring implements AnnotationExampleDeps { void depends() { var extracted = extract(); diff --git a/java-sdk/processor/build.gradle.kts b/java-sdk/processor/build.gradle.kts index bddafe1a05120..6ec06748e83f1 100644 --- a/java-sdk/processor/build.gradle.kts +++ b/java-sdk/processor/build.gradle.kts @@ -49,7 +49,7 @@ publishing { name = "Apache Airflow Java SDK — Annotation Processor" description = "Annotation processor for the Apache Airflow Java SDK; " + - "generates *Builder classes from @Builder.Dag-annotated sources." + "generates *Builder classes from @Airflow.Dag-annotated sources." } } } diff --git a/java-sdk/processor/src/main/kotlin/org/apache/airflow/sdk/BuilderProcessor.kt b/java-sdk/processor/src/main/kotlin/org/apache/airflow/sdk/AirflowProcessor.kt similarity index 92% rename from java-sdk/processor/src/main/kotlin/org/apache/airflow/sdk/BuilderProcessor.kt rename to java-sdk/processor/src/main/kotlin/org/apache/airflow/sdk/AirflowProcessor.kt index e101c0e8572ae..666ca2e23e27e 100644 --- a/java-sdk/processor/src/main/kotlin/org/apache/airflow/sdk/BuilderProcessor.kt +++ b/java-sdk/processor/src/main/kotlin/org/apache/airflow/sdk/AirflowProcessor.kt @@ -68,24 +68,24 @@ import org.apache.airflow.sdk.internal.builderName as generatedBuilderName /** * @suppress * - * Annotation processor for [Builder.Dag]. + * Annotation processor for [Airflow.Dag]. * * This is registered as a standard javac processor via * `META-INF/services/javax.annotation.processing.Processor`; not intended to be * instantiated or referenced directly. * - * For each class annotated with [Builder.Dag], generates: + * For each class annotated with [Airflow.Dag], generates: * - * - A `*Builder` class containing one inner class per [Builder.Task]-annotated + * - A `*Builder` class containing one inner class per [Airflow.Task]-annotated * method (implementing [Task]), and a static `build()` that constructs the - * [DagDef], lowers every explicitly-written `@Builder.Dag` attribute into a - * `DagDef.config` call, then runs the class's [Builder.Deps] class and + * [DagDef], lowers every explicitly-written `@Airflow.Dag` attribute into a + * `DagDef.config` call, then runs the class's [Airflow.Deps] class and * verifies it registered every task. * - A `*Deps` wiring-view interface whose methods mirror the task methods: * injectable parameters ([Client], * [Context]) are dropped, data parameters become [Arg]-typed inputs, and the * return value becomes a [TaskRef]. Calling one registers the task with its - * explicitly-written `@Builder.Task` attributes lowered into `TaskDef.config` + * explicitly-written `@Airflow.Task` attributes lowered into `TaskDef.config` * calls; passing one call's handle to another wires the dependency edge and * feeds the upstream's return-value XCom into the downstream's parameter, * type-checked by javac through the [Arg] / [TaskRef] generics. @@ -97,47 +97,47 @@ import org.apache.airflow.sdk.internal.builderName as generatedBuilderName * forwarded to `client.setXCom`. */ @SupportedAnnotationTypes( - "org.apache.airflow.sdk.Builder.Dag", - "org.apache.airflow.sdk.Builder.Task", - "org.apache.airflow.sdk.Builder.If", - "org.apache.airflow.sdk.Builder.Switch", - "org.apache.airflow.sdk.Builder.TaskGroup", - "org.apache.airflow.sdk.Builder.TaskHandler", - "org.apache.airflow.sdk.Builder.Deps", + "org.apache.airflow.sdk.Airflow.Dag", + "org.apache.airflow.sdk.Airflow.Task", + "org.apache.airflow.sdk.Airflow.If", + "org.apache.airflow.sdk.Airflow.Switch", + "org.apache.airflow.sdk.Airflow.TaskGroup", + "org.apache.airflow.sdk.Airflow.TaskHandler", + "org.apache.airflow.sdk.Airflow.Deps", ) @SupportedSourceVersion(SourceVersion.RELEASE_11) -class BuilderProcessor : AbstractProcessor() { +class AirflowProcessor : AbstractProcessor() { override fun process( annotations: Set, roundEnv: RoundEnvironment, ): Boolean { if (annotations.isEmpty()) return false - roundEnv.getElementsAnnotatedWith(Builder.Deps::class.java).forEach { el -> + roundEnv.getElementsAnnotatedWith(Airflow.Deps::class.java).forEach { el -> val owner = el.enclosingElement - if (owner !is TypeElement || owner.getAnnotation(Builder.Dag::class.java) == null) { + if (owner !is TypeElement || owner.getAnnotation(Airflow.Dag::class.java) == null) { processingEnv.messager.printMessage( Diagnostic.Kind.ERROR, - "@Builder.Deps class '${el.simpleName}' must be nested directly in a @Builder.Dag class", + "@Airflow.Deps class '${el.simpleName}' must be nested directly in an @Airflow.Dag class", el, ) } } - roundEnv.getElementsAnnotatedWith(Builder.TaskGroup::class.java).forEach { el -> + roundEnv.getElementsAnnotatedWith(Airflow.TaskGroup::class.java).forEach { el -> val owner = el.enclosingElement val nested = owner is TypeElement && - (owner.getAnnotation(Builder.Dag::class.java) != null || owner.getAnnotation(Builder.TaskGroup::class.java) != null) + (owner.getAnnotation(Airflow.Dag::class.java) != null || owner.getAnnotation(Airflow.TaskGroup::class.java) != null) if (!nested) { processingEnv.messager.printMessage( Diagnostic.Kind.ERROR, - "@Builder.TaskGroup class '${el.simpleName}' must be nested in a @Builder.Dag class or in " + - "another @Builder.TaskGroup class", + "@Airflow.TaskGroup class '${el.simpleName}' must be nested in an @Airflow.Dag class or in " + + "another @Airflow.TaskGroup class", el, ) } } roundEnv - .getElementsAnnotatedWith(Builder.TaskHandler::class.java) + .getElementsAnnotatedWith(Airflow.TaskHandler::class.java) .mapNotNull { it.enclosingElement as? TypeElement } .distinct() .forEach { el -> @@ -150,7 +150,7 @@ class BuilderProcessor : AbstractProcessor() { }.onFailure { e -> messager.printMessage(Diagnostic.Kind.ERROR, e.message ?: "Unknown error", el) } } } - roundEnv.getElementsAnnotatedWith(Builder.Dag::class.java).filterIsInstance().forEach { el -> + roundEnv.getElementsAnnotatedWith(Airflow.Dag::class.java).filterIsInstance().forEach { el -> with(processingEnv) { runCatching { val packageName = elementUtils.getPackageOf(el).qualifiedName.toString() @@ -182,7 +182,7 @@ class BuilderProcessor : AbstractProcessor() { } /** - * Generates the registrar for a class of [Builder.TaskHandler] methods: one + * Generates the registrar for a class of [Airflow.TaskHandler] methods: one * [Task] implementation per handler, and a `registerInto` that binds each to * the Dag and task the annotation names. * @@ -191,7 +191,7 @@ class BuilderProcessor : AbstractProcessor() { */ private fun buildHandlers(el: TypeElement): TypeSpec { require(el.enclosingElement !is TypeElement || Modifier.STATIC in el.modifiers) { - "Nested class '${el.simpleName}' holding @Builder.TaskHandler methods must be static" + "Nested class '${el.simpleName}' holding @Airflow.TaskHandler methods must be static" } val registrar = TypeSpec @@ -210,18 +210,18 @@ class BuilderProcessor : AbstractProcessor() { val names = mutableSetOf() for (inner in el.enclosedElements) { if (inner !is ExecutableElement) continue - val handler = inner.getAnnotation(Builder.TaskHandler::class.java) ?: continue + val handler = inner.getAnnotation(Airflow.TaskHandler::class.java) ?: continue if (inner.isVarArgs) { throw IllegalArgumentException("Cannot create task from vararg function ${inner.simpleName}") } require(handler.dag.isNotBlank()) { - "@Builder.TaskHandler on '${inner.simpleName}' must name the Dag the Python file declares" + "@Airflow.TaskHandler on '${inner.simpleName}' must name the Dag the Python file declares" } val decl = TaskDeclaration(inner, handler.task.ifBlank { inner.simpleName.toString() }, collectDataParams(inner), el) require(names.add(inner.simpleName.toString())) { "Class ${el.simpleName} overloads task-handler method '${inner.simpleName}'; a method's name is " + "the name of its generated task class, so rename one and keep its task id with " + - "@Builder.TaskHandler(task = \"${decl.id}\")" + "@Airflow.TaskHandler(task = \"${decl.id}\")" } registrar.addType(buildTask(decl)) registerInto.addStatement( @@ -234,7 +234,7 @@ class BuilderProcessor : AbstractProcessor() { return registrar.addMethod(registerInto.build()).build() } - private fun dagAnnotation(el: TypeElement): Builder.Dag = el.getAnnotation(Builder.Dag::class.java)!! + private fun dagAnnotation(el: TypeElement): Airflow.Dag = el.getAnnotation(Airflow.Dag::class.java)!! private fun buildBuilder( el: TypeElement, @@ -287,7 +287,7 @@ class BuilderProcessor : AbstractProcessor() { * injected arguments stripped, each data argument lifted to [Arg] and the * return lifted to [TaskRef]. * - * It is an interface so the `@Builder.Deps` class can *implement* it and + * It is an interface so the `@Airflow.Deps` class can *implement* it and * keep its own `extends` free, and so the Dag class's real task methods -- * which differ only in their injected arguments -- do not clash with it. */ @@ -405,7 +405,7 @@ class BuilderProcessor : AbstractProcessor() { /** * Emits `new TaskDef(id, .class)` with the explicitly-written - * `@Builder.Task` attributes lowered into chained `.config` calls. + * `@Airflow.Task` attributes lowered into chained `.config` calls. */ private fun taskDefCode( decl: TaskDeclaration, @@ -465,12 +465,12 @@ class BuilderProcessor : AbstractProcessor() { checkDeciderReturn(kind, inner) if (kind == TaskKind.TRIGGER) { require(inner.parameters.isEmpty()) { - "@Builder.Task method '${inner.simpleName}' returns a TriggerDagRun, so it runs when the Dag " + + "@Airflow.Task method '${inner.simpleName}' returns a TriggerDagRun, so it runs when the Dag " + "is built rather than when the task runs; it takes no parameters" } val checked = inner.thrownTypes.filterNot { isUnchecked(it) } require(checked.isEmpty()) { - "@Builder.Task method '${inner.simpleName}' returns a TriggerDagRun, so it runs when the Dag " + + "@Airflow.Task method '${inner.simpleName}' returns a TriggerDagRun, so it runs when the Dag " + "is built, where a checked exception cannot be thrown; it must not throw: ${checked.joinToString()}" } } @@ -486,7 +486,7 @@ class BuilderProcessor : AbstractProcessor() { val groups = mutableListOf() for (inner in el.enclosedElements.filterIsInstance()) { - val ann = inner.getAnnotation(Builder.TaskGroup::class.java) ?: continue + val ann = inner.getAnnotation(Airflow.TaskGroup::class.java) ?: continue val localId = checkGroupClass(inner, ann) require(groups.none { it.id == localId }) { "Class ${el.simpleName} declares more than one task group '$localId'" @@ -500,21 +500,21 @@ class BuilderProcessor : AbstractProcessor() { /** Checks that `new ()` compiles and names a valid group, and returns its local ID. */ private fun checkGroupClass( el: TypeElement, - ann: Builder.TaskGroup, + ann: Airflow.TaskGroup, ): String { val name = el.simpleName require(el.kind == ElementKind.CLASS && Modifier.ABSTRACT !in el.modifiers) { - "@Builder.TaskGroup '$name' must be a concrete class" + "@Airflow.TaskGroup '$name' must be a concrete class" } require(Modifier.STATIC in el.modifiers && Modifier.PRIVATE !in el.modifiers) { - "@Builder.TaskGroup class '$name' must be static and non-private" + "@Airflow.TaskGroup class '$name' must be static and non-private" } require( el.enclosedElements .filterIsInstance() .any { it.kind == ElementKind.CONSTRUCTOR && it.parameters.isEmpty() && Modifier.PRIVATE !in it.modifiers }, ) { - "@Builder.TaskGroup class '$name' needs a non-private no-argument constructor" + "@Airflow.TaskGroup class '$name' needs a non-private no-argument constructor" } val id = ann.id.ifBlank { name.toString() } require(GROUP_ID.matches(id)) { @@ -524,7 +524,7 @@ class BuilderProcessor : AbstractProcessor() { } /** - * Finds and validates the class's `@Builder.Deps` wiring class, which + * Finds and validates the class's `@Airflow.Deps` wiring class, which * declares the Dag's task graph and is what makes it a Dag Java owns. * * The generated builder runs `new Wiring()::depends`, so everything that @@ -537,34 +537,34 @@ class BuilderProcessor : AbstractProcessor() { val classes = el.enclosedElements .filterIsInstance() - .filter { it.getAnnotation(Builder.Deps::class.java) != null } + .filter { it.getAnnotation(Airflow.Deps::class.java) != null } require(classes.isNotEmpty()) { - "Dag class ${el.simpleName} must declare a @Builder.Deps class implementing ${view.simpleName()} " + + "Dag class ${el.simpleName} must declare an @Airflow.Deps class implementing ${view.simpleName()} " + "to declare its task graph; a class of task bodies for a Dag the Python file owns carries " + - "@Builder.TaskHandler instead" + "@Airflow.TaskHandler instead" } val deps = classes.singleOrNull() ?: throw IllegalArgumentException( - "Dag class ${el.simpleName} declares more than one @Builder.Deps class: " + + "Dag class ${el.simpleName} declares more than one @Airflow.Deps class: " + classes.joinToString { it.simpleName.toString() }, ) val name = deps.simpleName require(deps.kind == ElementKind.CLASS && Modifier.ABSTRACT !in deps.modifiers) { - "@Builder.Deps '$name' must be a concrete class" + "@Airflow.Deps '$name' must be a concrete class" } require(Modifier.STATIC in deps.modifiers && Modifier.PRIVATE !in deps.modifiers) { - "@Builder.Deps class '$name' must be static and non-private" + "@Airflow.Deps class '$name' must be static and non-private" } require(deps.interfaces.any { it.isView(view) }) { - "@Builder.Deps class '$name' must implement ${view.simpleName()}, the wiring view of ${el.simpleName}" + "@Airflow.Deps class '$name' must implement ${view.simpleName()}, the wiring view of ${el.simpleName}" } require( deps.enclosedElements .filterIsInstance() .any { it.kind == ElementKind.CONSTRUCTOR && it.parameters.isEmpty() && Modifier.PRIVATE !in it.modifiers }, ) { - "@Builder.Deps class '$name' needs a non-private no-argument constructor" + "@Airflow.Deps class '$name' needs a non-private no-argument constructor" } val depends = processingEnv.elementUtils @@ -572,11 +572,11 @@ class BuilderProcessor : AbstractProcessor() { .filterIsInstance() .firstOrNull { it.isNoArgDepends() } ?: throw IllegalArgumentException( - "@Builder.Deps class '$name' must have a non-private, no-argument depends() method", + "@Airflow.Deps class '$name' must have a non-private, no-argument depends() method", ) val checked = depends.thrownTypes.filterNot { isUnchecked(it) } require(checked.isEmpty()) { - "depends() of @Builder.Deps class '$name' must not throw checked exceptions: ${checked.joinToString()}" + "depends() of @Airflow.Deps class '$name' must not throw checked exceptions: ${checked.joinToString()}" } return deps } @@ -602,7 +602,7 @@ class BuilderProcessor : AbstractProcessor() { byClassName.put(decl.className, decl)?.let { first -> throw IllegalArgumentException( "Task methods '${first.id}' and '${decl.id}' both generate the task class " + - "'${decl.className}'; rename one of them or an enclosing @Builder.TaskGroup class", + "'${decl.className}'; rename one of them or an enclosing @Airflow.TaskGroup class", ) } } @@ -630,7 +630,7 @@ class BuilderProcessor : AbstractProcessor() { scope.groups.forEach { group -> require(group.accessor !in reserved) { "Task group class '${group.element.simpleName}' clashes with a member of the wiring view; " + - "rename the class and keep the group id with @Builder.TaskGroup(id = \"${group.id}\")" + "rename the class and keep the group id with @Airflow.TaskGroup(id = \"${group.id}\")" } require(scope.tasks.none { it.method.simpleName.contentEquals(group.accessor) }) { "Task group class '${group.element.simpleName}' and task method '${group.accessor}' would both " + @@ -749,12 +749,12 @@ class BuilderProcessor : AbstractProcessor() { TaskKind.TASK, TaskKind.TRIGGER -> return TaskKind.CONDITION -> require(returns.kind == TypeKind.BOOLEAN || with(processingEnv) { isType(returns, BOXED_BOOLEAN_TYPE) }) { - "@Builder.If method '${method.simpleName}' returns $returns, but a condition returns boolean: " + + "@Airflow.If method '${method.simpleName}' returns $returns, but a condition returns boolean: " + "true runs the task named by Then, false the one named by Else" } TaskKind.SWITCH -> require(returnsTaskClass(returns)) { - "@Builder.Switch method '${method.simpleName}' returns $returns, but a switch returns the " + + "@Airflow.Switch method '${method.simpleName}' returns $returns, but a switch returns the " + "class of the task it chose, as Class" } } @@ -975,7 +975,7 @@ private class Scope( fun allGroups(): List = groups.flatMap { listOf(it) + it.scope.allGroups() } } -/** One `@Builder.TaskGroup` class, and what it declares. */ +/** One `@Airflow.TaskGroup` class, and what it declares. */ private class GroupDeclaration( val element: TypeElement, val id: String, @@ -987,7 +987,7 @@ private class GroupDeclaration( } /** - * One [Builder.Task]-annotated method with its resolved id and data parameters. + * One [Airflow.Task]-annotated method with its resolved id and data parameters. * [owner] is the class that declares it, which the generated body instantiates, * and [classPath] the task-group classes enclosing it. */ @@ -1043,7 +1043,7 @@ private val DEPS_TYPE = ClassName.get(Deps::class.java) private val GROUP_TYPE = DEPS_TYPE.nestedClass("TaskGroup") private val LIST_TYPE = ClassName.get(List::class.java) -private const val DAG_ANNOTATION = "org.apache.airflow.sdk.Builder.Dag" +private const val DAG_ANNOTATION = "org.apache.airflow.sdk.Airflow.Dag" /** * What a declared task is, and the annotation that declares it. A decider @@ -1058,10 +1058,10 @@ private enum class TaskKind( val taskInterface: ClassName, val refType: ClassName?, ) { - TASK("org.apache.airflow.sdk.Builder.Task", "@Builder.Task", "execute", TASK_TYPE, null), - TRIGGER("org.apache.airflow.sdk.Builder.Task", "@Builder.Task", "execute", TASK_TYPE, null), - CONDITION("org.apache.airflow.sdk.Builder.If", "@Builder.If", "decide", CONDITION_TASK_TYPE, CONDITION_REF_TYPE), - SWITCH("org.apache.airflow.sdk.Builder.Switch", "@Builder.Switch", "choose", SWITCH_TASK_TYPE, SWITCH_REF_TYPE), + TASK("org.apache.airflow.sdk.Airflow.Task", "@Airflow.Task", "execute", TASK_TYPE, null), + TRIGGER("org.apache.airflow.sdk.Airflow.Task", "@Airflow.Task", "execute", TASK_TYPE, null), + CONDITION("org.apache.airflow.sdk.Airflow.If", "@Airflow.If", "decide", CONDITION_TASK_TYPE, CONDITION_REF_TYPE), + SWITCH("org.apache.airflow.sdk.Airflow.Switch", "@Airflow.Switch", "choose", SWITCH_TASK_TYPE, SWITCH_REF_TYPE), ; companion object { diff --git a/java-sdk/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/java-sdk/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor index cc7c3d49ef78a..c383ac1ff8ed2 100644 --- a/java-sdk/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor +++ b/java-sdk/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor @@ -15,4 +15,4 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -org.apache.airflow.sdk.BuilderProcessor +org.apache.airflow.sdk.AirflowProcessor diff --git a/java-sdk/processor/src/test/kotlin/org/apache/airflow/sdk/BuilderTest.kt b/java-sdk/processor/src/test/kotlin/org/apache/airflow/sdk/AirflowProcessorTest.kt similarity index 85% rename from java-sdk/processor/src/test/kotlin/org/apache/airflow/sdk/BuilderTest.kt rename to java-sdk/processor/src/test/kotlin/org/apache/airflow/sdk/AirflowProcessorTest.kt index 5d8c89a058b06..368b9a5853288 100644 --- a/java-sdk/processor/src/test/kotlin/org/apache/airflow/sdk/BuilderTest.kt +++ b/java-sdk/processor/src/test/kotlin/org/apache/airflow/sdk/AirflowProcessorTest.kt @@ -30,7 +30,7 @@ import java.nio.file.Files import javax.tools.JavaFileObject private fun compile(source: String) = - Compiler.javac().withProcessors(BuilderProcessor()).compile( + Compiler.javac().withProcessors(AirflowProcessor()).compile( JavaFileObjects.forSourceString("org.apache.airflow.example.TestExample", source), ) @@ -41,7 +41,7 @@ private fun JavaFileObjectSubject.hasSourceEquivalentTo( JavaFileObjects.forSourceString(qual, source), ) -class BuilderTest { +class AirflowProcessorTest { @Test @DisplayName("generate builder and task-reference twins for dag class") fun generateBuilderAndRefForDagClass() { @@ -50,26 +50,26 @@ class BuilderTest { """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.Client; import org.apache.airflow.sdk.Context; - @Builder.Dag + @Airflow.Dag public class TestExample { - @Builder.Task + @Airflow.Task public void t1() {} - @Builder.Task + @Airflow.Task public int t2(Client client) { return 7; } - @Builder.Task + @Airflow.Task public void t3(Context ctx, int value) { System.out.println(String.format("%s %s", ctx.ti, value)); } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { t1(); @@ -178,15 +178,15 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.Client; import org.apache.airflow.sdk.Context; - @Builder.Dag + @Airflow.Dag public class TestExample { - @Builder.Task + @Airflow.Task public void t(long first, Client client, String second, Context ctx, Integer third) {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { t(lit(1L), lit("second"), lit(3)); } } @@ -246,13 +246,13 @@ class BuilderTest { package org.apache.airflow.example; import java.util.List; import java.util.Map; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task + @Airflow.Task public void t(boolean flag, float fraction, Double boxed, List tags, Map raw) {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { t(lit(true), lit(1f), lit(2.0), lit(List.of("a")), lit(Map.of())); } } @@ -316,25 +316,25 @@ class BuilderTest { """ package org.apache.airflow.example; import java.util.List; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task + @Airflow.Task public String ps() { return "x"; } - @Builder.Task + @Airflow.Task public void pv() {} - @Builder.Task + @Airflow.Task public List pl() { return null; } - @Builder.Task + @Airflow.Task public long pn() { return 1L; } - @Builder.Task + @Airflow.Task public void t(String text, Object anything, List items, Long boxed) {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { t(ps(), pv(), pl(), pn()); @@ -402,14 +402,14 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag(id = "cfg", schedule = "@daily", tags = {"a", "b"}, catchup = true, + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag(id = "cfg", schedule = "@daily", tags = {"a", "b"}, catchup = true, startDate = "2026-01-01T00:00:00Z") public class TestExample { - @Builder.Task(retries = 2, queue = "q", retryDelay = "PT5M", retryExponentialBackoff = 1.5) + @Airflow.Task(retries = 2, queue = "q", retryDelay = "PT5M", retryExponentialBackoff = 1.5) public void t1() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { t1(); @@ -494,13 +494,13 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task + @Airflow.Task public void t(String args, int other) {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { t(lit("a"), lit(1)); } } @@ -556,21 +556,21 @@ class BuilderTest { """ package org.apache.airflow.example; import java.util.List; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.TaskInput; - @Builder.Dag + @Airflow.Dag public class TestExample { public static class ScoreInput implements TaskInput { public double threshold; } - @Builder.Task + @Airflow.Task public void flat(String client, int context) {} - @Builder.Task + @Airflow.Task public void named(ScoreInput context) {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { flat(lit("a"), lit(1)); named(lit(null)); } } @@ -635,9 +635,9 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.TaskInput; - @Builder.Dag + @Airflow.Dag public class TestExample { public static class BaseInput { private String secret; @@ -647,7 +647,7 @@ class BuilderTest { public double threshold; } - @Builder.Task + @Airflow.Task public void t(ScoreInput input) {} } """, @@ -665,9 +665,9 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.TaskInput; - @Builder.Dag + @Airflow.Dag public class TestExample { public static class BaseInput { public String regionCode; @@ -677,7 +677,7 @@ class BuilderTest { public String region_code; } - @Builder.Task + @Airflow.Task public void t(ScoreInput input) {} } """, @@ -696,15 +696,15 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.TaskInput; - @Builder.Dag + @Airflow.Dag public class TestExample { public static class ScoreInput implements TaskInput { public double threshold; } - @Builder.Task + @Airflow.Task public void t(ScoreInput input, int extra) {} } """, @@ -722,15 +722,15 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.TaskInput; - @Builder.Dag + @Airflow.Dag public class TestExample { public static class ScoreInput implements TaskInput { public double threshold; } - @Builder.Task + @Airflow.Task public void t(ScoreInput first, ScoreInput second) {} } """, @@ -748,15 +748,15 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.TaskInput; - @Builder.Dag + @Airflow.Dag public class TestExample { public static class ScoreInput implements TaskInput { double threshold; } - @Builder.Task + @Airflow.Task public void t(ScoreInput input) {} } """, @@ -774,9 +774,9 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.TaskInput; - @Builder.Dag + @Airflow.Dag public class TestExample { public static class ScoreInput implements TaskInput { public double threshold; @@ -784,7 +784,7 @@ class BuilderTest { public ScoreInput(double threshold) { this.threshold = threshold; } } - @Builder.Task + @Airflow.Task public void t(ScoreInput input) {} } """, @@ -802,10 +802,10 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag(id = "foo") + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag(id = "foo") public class TestExample { - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -839,10 +839,10 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag(to = "Foo") + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag(to = "Foo") public class TestExample { - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -876,12 +876,12 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task(id = "foo") public void t1() {} + @Airflow.Task(id = "foo") public void t1() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { t1(); @@ -959,16 +959,16 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task + @Airflow.Task public String ps() { return "x"; } - @Builder.Task + @Airflow.Task public void t(int v) {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { t(ps()); } } @@ -986,16 +986,16 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task + @Airflow.Task public double ratio() { return 2.7; } - @Builder.Task + @Airflow.Task public void load(long rows) {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { load(ratio()); } } @@ -1013,18 +1013,18 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} } """, ) assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "Dag class TestExample must declare a @Builder.Deps class implementing TestExampleDeps " + + "Dag class TestExample must declare an @Airflow.Deps class implementing TestExampleDeps " + "to declare its task graph; a class of task bodies for a Dag the Python file owns carries " + - "@Builder.TaskHandler instead", + "@Airflow.TaskHandler instead", ) } @@ -1035,17 +1035,17 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} - @Builder.Deps + @Airflow.Deps static class One implements TestExampleDeps { void depends() { t1(); } } - @Builder.Deps + @Airflow.Deps static class Two implements TestExampleDeps { void depends() {} } @@ -1054,7 +1054,7 @@ class BuilderTest { ) assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "Dag class TestExample declares more than one @Builder.Deps class: One, Two", + "Dag class TestExample declares more than one @Airflow.Deps class: One, Two", ) } @@ -1065,12 +1065,12 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} - @Builder.Deps + @Airflow.Deps class Wiring implements TestExampleDeps { void depends() { t1(); } } @@ -1079,7 +1079,7 @@ class BuilderTest { ) assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "@Builder.Deps class 'Wiring' must be static and non-private", + "@Airflow.Deps class 'Wiring' must be static and non-private", ) } @@ -1090,12 +1090,12 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void wireItUp() { t1(); } } @@ -1104,7 +1104,7 @@ class BuilderTest { ) assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "@Builder.Deps class 'Wiring' must have a non-private, no-argument depends() method", + "@Airflow.Deps class 'Wiring' must have a non-private, no-argument depends() method", ) } @@ -1115,22 +1115,22 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements OtherDeps { void depends() { t1(); } } } - @Builder.Dag + @Airflow.Dag class Other { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements OtherDeps { void depends() { t1(); } } @@ -1139,7 +1139,7 @@ class BuilderTest { ) assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "@Builder.Deps class 'Wiring' must implement TestExampleDeps, the wiring view of TestExample", + "@Airflow.Deps class 'Wiring' must implement TestExampleDeps, the wiring view of TestExample", ) } @@ -1150,12 +1150,12 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} - @Builder.Deps + @Airflow.Deps abstract static class Wiring implements TestExampleDeps { void depends() { t1(); } } @@ -1163,7 +1163,7 @@ class BuilderTest { """, ) assertThat(compilation).failed() - assertThat(compilation).hadErrorContaining("@Builder.Deps 'Wiring' must be a concrete class") + assertThat(compilation).hadErrorContaining("@Airflow.Deps 'Wiring' must be a concrete class") } @Test @@ -1173,12 +1173,12 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { Wiring(int unused) {} void depends() { t1(); } @@ -1188,7 +1188,7 @@ class BuilderTest { ) assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "@Builder.Deps class 'Wiring' needs a non-private no-argument constructor", + "@Airflow.Deps class 'Wiring' needs a non-private no-argument constructor", ) } @@ -1199,12 +1199,12 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() throws java.io.IOException { t1(); } } @@ -1213,7 +1213,7 @@ class BuilderTest { ) assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "depends() of @Builder.Deps class 'Wiring' must not throw checked exceptions: java.io.IOException", + "depends() of @Airflow.Deps class 'Wiring' must not throw checked exceptions: java.io.IOException", ) } @@ -1224,16 +1224,16 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} static class Base implements TestExampleDeps { void depends() { t1(); } } - @Builder.Deps + @Airflow.Deps static class Wiring extends Base implements TestExampleDeps {} } """, @@ -1248,9 +1248,9 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; public class TestExample { - @Builder.Deps + @Airflow.Deps static class Wiring { void depends() {} } @@ -1259,7 +1259,7 @@ class BuilderTest { ) assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "@Builder.Deps class 'Wiring' must be nested directly in a @Builder.Dag class", + "@Airflow.Deps class 'Wiring' must be nested directly in an @Airflow.Dag class", ) } @@ -1270,12 +1270,12 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task(id = "wire") public void depends() {} + @Airflow.Task(id = "wire") public void depends() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -1285,7 +1285,7 @@ class BuilderTest { assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( "Task method 'depends' clashes with a member of the wiring view; rename the method and keep " + - "the task id with @Builder.Task(id = \"wire\")", + "the task id with @Airflow.Task(id = \"wire\")", ) } @@ -1296,22 +1296,22 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task public void extract() {} + @Airflow.Task public void extract() {} - @Builder.TaskGroup + @Airflow.TaskGroup static class Staging { - @Builder.Task public void stage() {} + @Airflow.Task public void stage() {} - @Builder.TaskGroup(id = "checks") + @Airflow.TaskGroup(id = "checks") static class Checks { - @Builder.Task public void nulls() {} + @Airflow.Task public void nulls() {} } } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { extract().before(staging()); @@ -1351,20 +1351,20 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.TaskGroup + @Airflow.TaskGroup static class First { - @Builder.Task public void run() {} + @Airflow.Task public void run() {} } - @Builder.TaskGroup + @Airflow.TaskGroup static class Second { - @Builder.Task public void run() {} + @Airflow.Task public void run() {} } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { first().run().before(second().run()); } } @@ -1386,12 +1386,12 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.TaskGroup(id = "staging.checks") + @Airflow.TaskGroup(id = "staging.checks") static class Staging { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} } } """, @@ -1409,19 +1409,19 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.TaskGroup + @Airflow.TaskGroup class Staging { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} } } """, ) assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "@Builder.TaskGroup class 'Staging' must be static and non-private", + "@Airflow.TaskGroup class 'Staging' must be static and non-private", ) } @@ -1432,17 +1432,17 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task public void staging() {} + @Airflow.Task public void staging() {} - @Builder.TaskGroup + @Airflow.TaskGroup static class Staging { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -1463,18 +1463,18 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.TaskGroup + @Airflow.TaskGroup abstract static class Staging { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} } } """, ) assertThat(compilation).failed() - assertThat(compilation).hadErrorContaining("@Builder.TaskGroup 'Staging' must be a concrete class") + assertThat(compilation).hadErrorContaining("@Airflow.TaskGroup 'Staging' must be a concrete class") } @Test @@ -1484,21 +1484,21 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.TaskGroup + @Airflow.TaskGroup static class Staging { Staging(String name) {} - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} } } """, ) assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "@Builder.TaskGroup class 'Staging' needs a non-private no-argument constructor", + "@Airflow.TaskGroup class 'Staging' needs a non-private no-argument constructor", ) } @@ -1509,15 +1509,15 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.TaskGroup + @Airflow.TaskGroup static class Staging { - @Builder.Task public void nodes() {} + @Airflow.Task public void nodes() {} } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -1527,7 +1527,7 @@ class BuilderTest { assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( "Task method 'nodes' clashes with a member of the wiring view; rename the method and keep the " + - "task id with @Builder.Task(id = \"nodes\")", + "task id with @Airflow.Task(id = \"nodes\")", ) } @@ -1538,15 +1538,15 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.TaskGroup + @Airflow.TaskGroup static class Staging { - @Builder.Task public void before() {} + @Airflow.Task public void before() {} } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -1556,7 +1556,7 @@ class BuilderTest { assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( "Task method 'before' clashes with a member of the wiring view; rename the method and keep the " + - "task id with @Builder.Task(id = \"before\")", + "task id with @Airflow.Task(id = \"before\")", ) } @@ -1567,20 +1567,20 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.TaskGroup(id = "checks") + @Airflow.TaskGroup(id = "checks") static class Alpha { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} } - @Builder.TaskGroup(id = "checks") + @Airflow.TaskGroup(id = "checks") static class Beta { - @Builder.Task public void t2() {} + @Airflow.Task public void t2() {} } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -1598,12 +1598,12 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task public void nodes() {} + @Airflow.Task public void nodes() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { public void depends() { nodes(); } } @@ -1620,20 +1620,20 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.TaskGroup + @Airflow.TaskGroup static class Staging { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} } - @Builder.TaskGroup(id = "lower") + @Airflow.TaskGroup(id = "lower") static class staging { - @Builder.Task public void t2() {} + @Airflow.Task public void t2() {} } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -1653,12 +1653,12 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task(id = "staging.stage") public void stage() {} + @Airflow.Task(id = "staging.stage") public void stage() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { public void depends() { stage(); } } @@ -1675,17 +1675,17 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task(id = "Staging") public void staged() {} + @Airflow.Task(id = "Staging") public void staged() {} - @Builder.TaskGroup + @Airflow.TaskGroup static class Staging { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -1705,23 +1705,23 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.TaskGroup(id = "flat") + @Airflow.TaskGroup(id = "flat") static class A_B { - @Builder.Task public void c() {} + @Airflow.Task public void c() {} } - @Builder.TaskGroup(id = "outer") + @Airflow.TaskGroup(id = "outer") static class A { - @Builder.TaskGroup(id = "inner") + @Airflow.TaskGroup(id = "inner") static class B { - @Builder.Task public void c() {} + @Airflow.Task public void c() {} } } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -1730,7 +1730,7 @@ class BuilderTest { ) assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "both generate the task class 'A_B_C'; rename one of them or an enclosing @Builder.TaskGroup class", + "both generate the task class 'A_B_C'; rename one of them or an enclosing @Airflow.TaskGroup class", ) } @@ -1741,19 +1741,19 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; public class TestExample { - @Builder.TaskGroup + @Airflow.TaskGroup static class Staging { - @Builder.Task public void t1() {} + @Airflow.Task public void t1() {} } } """, ) assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "@Builder.TaskGroup class 'Staging' must be nested in a @Builder.Dag class or in another " + - "@Builder.TaskGroup class", + "@Airflow.TaskGroup class 'Staging' must be nested in an @Airflow.Dag class or in another " + + "@Airflow.TaskGroup class", ) } @@ -1764,9 +1764,9 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag - public class TestExample { @Builder.Task(id = "foo") public void t1(String... client) {} } + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag + public class TestExample { @Airflow.Task(id = "foo") public void t1(String... client) {} } """, ) assertThat(compilation).failed() @@ -1782,13 +1782,13 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task(id = "x") + @Airflow.Task(id = "x") public void t1() {} - @Builder.Task(id = "x") + @Airflow.Task(id = "x") public void t2() {} } """, @@ -1804,13 +1804,13 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task(id = "a") public void extract() {} - @Builder.Task(id = "b") public void extract(String text) {} + @Airflow.Task(id = "a") public void extract() {} + @Airflow.Task(id = "b") public void extract(String text) {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -1821,7 +1821,7 @@ class BuilderTest { assertThat(compilation).hadErrorContaining( "Class TestExample overloads task method 'extract'; a method's name is the name of its " + "generated task class and of its wiring-view method, so rename one and keep its task id " + - "with @Builder.Task(id = \"b\")", + "with @Airflow.Task(id = \"b\")", ) } @@ -1832,10 +1832,10 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; public class TestExample { - @Builder.TaskHandler(dag = "etl", task = "a") public void score() {} - @Builder.TaskHandler(dag = "etl", task = "b") public void score(String text) {} + @Airflow.TaskHandler(dag = "etl", task = "a") public void score() {} + @Airflow.TaskHandler(dag = "etl", task = "b") public void score(String text) {} } """, ) @@ -1843,7 +1843,7 @@ class BuilderTest { assertThat(compilation).hadErrorContaining( "Class TestExample overloads task-handler method 'score'; a method's name is the name of its " + "generated task class, so rename one and keep its task id with " + - "@Builder.TaskHandler(task = \"b\")", + "@Airflow.TaskHandler(task = \"b\")", ) } @@ -1854,12 +1854,12 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task(retryDelay = "5 minutes") public void t() {} + @Airflow.Task(retryDelay = "5 minutes") public void t() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { t(); } } @@ -1879,12 +1879,12 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag(tags = {"say \"hi\"", "back\\slash"}) + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag(tags = {"say \"hi\"", "back\\slash"}) public class TestExample { - @Builder.Task public void t() {} + @Airflow.Task public void t() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { t(); } } @@ -1906,13 +1906,13 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task(id = "say \"hi\"") public void a() {} - @Builder.Task(id = "back\\slash") public void b() {} + @Airflow.Task(id = "say \"hi\"") public void a() {} + @Airflow.Task(id = "back\\slash") public void b() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { a(); @@ -1939,10 +1939,10 @@ class BuilderTest { package org.apache.airflow.example; import java.util.List; import org.apache.airflow.sdk.ArgName; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.Client; import org.apache.airflow.sdk.TaskInput; - @Builder.Dag + @Airflow.Dag public class TestExample { public static class ScoreInput implements TaskInput { @ArgName("region_code") public String region; @@ -1950,10 +1950,10 @@ class BuilderTest { public List tags; } - @Builder.Task + @Airflow.Task public double score(Client client, ScoreInput input) { return input.threshold; } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { score(lit(null)); } } @@ -2005,13 +2005,13 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.Client; public class TestExample { - @Builder.TaskHandler(dag = "etl", task = "score") + @Airflow.TaskHandler(dag = "etl", task = "score") public long score(Client client, long rows) { return rows; } - @Builder.TaskHandler(dag = "etl") + @Airflow.TaskHandler(dag = "etl") public void audit() {} } """, @@ -2070,16 +2070,16 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; public class TestExample { - @Builder.TaskHandler(dag = "") + @Airflow.TaskHandler(dag = "") public void t() {} } """, ) assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "@Builder.TaskHandler on 't' must name the Dag the Python file declares", + "@Airflow.TaskHandler on 't' must name the Dag the Python file declares", ) } @@ -2090,10 +2090,10 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; public class TestExample { public static class Inner { - @Builder.TaskHandler(dag = "etl", task = "score") + @Airflow.TaskHandler(dag = "etl", task = "score") public long score(long rows) { return rows; } } } @@ -2145,10 +2145,10 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; public class TestExample { public class Inner { - @Builder.TaskHandler(dag = "etl") + @Airflow.TaskHandler(dag = "etl") public void t() {} } } @@ -2157,7 +2157,7 @@ class BuilderTest { assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "Nested class 'Inner' holding @Builder.TaskHandler methods must be static", + "Nested class 'Inner' holding @Airflow.TaskHandler methods must be static", ) } @@ -2169,19 +2169,19 @@ class BuilderTest { """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; - @Builder.Dag(id = "etl") + @Airflow.Dag(id = "etl") public class TestExample { - @Builder.If(id = "has_rows") + @Airflow.If(id = "has_rows") public boolean hasRows() { return true; } - @Builder.Task + @Airflow.Task public void load() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { hasRows().Then(load()); @@ -2267,25 +2267,25 @@ class BuilderTest { """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; - @Builder.Dag(id = "etl") + @Airflow.Dag(id = "etl") public class TestExample { - @Builder.Task + @Airflow.Task public void extract() {} - @Builder.If(id = "has_rows") + @Airflow.If(id = "has_rows") public boolean hasRows() { return true; } - @Builder.Task + @Airflow.Task public void load() {} - @Builder.Task + @Airflow.Task public void reportEmpty() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { extract().before(hasRows()); @@ -2308,23 +2308,23 @@ class BuilderTest { """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.Task; - @Builder.Dag(id = "etl") + @Airflow.Dag(id = "etl") public class TestExample { - @Builder.Switch(id = "pick_path") + @Airflow.Switch(id = "pick_path") public Class pickPath() { return TestExampleBuilder.HandleLong.class; } - @Builder.Task + @Airflow.Task public void handleLong() {} - @Builder.Task + @Airflow.Task public void handleShort() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { pickPath().Case(handleLong()); @@ -2346,23 +2346,23 @@ class BuilderTest { """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.Task; - @Builder.Dag(id = "etl") + @Airflow.Dag(id = "etl") public class TestExample { - @Builder.Switch(id = "pick_path") + @Airflow.Switch(id = "pick_path") public Class pickPath() { return TestExampleBuilder.HandleLong.class; } - @Builder.Task + @Airflow.Task public void handleLong() {} - @Builder.Task + @Airflow.Task public void handleShort() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { pickPath().Case(handleLong()).Case(handleShort()); @@ -2460,17 +2460,17 @@ class BuilderTest { """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.TriggerDagRun; - @Builder.Dag(id = "etl") + @Airflow.Dag(id = "etl") public class TestExample { - @Builder.Task(id = "trigger_downstream", retries = 2) + @Airflow.Task(id = "trigger_downstream", retries = 2) public TriggerDagRun triggerDownstream() { return new TriggerDagRun("downstream_etl").config("wait_for_completion", true); } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { triggerDownstream(); @@ -2531,33 +2531,33 @@ class BuilderTest { """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.TriggerDagRun; - @Builder.Dag(id = "etl") + @Airflow.Dag(id = "etl") public class TestExample { - @Builder.Task + @Airflow.Task public long extract() { return 42L; } - @Builder.Task + @Airflow.Task public void load(long rows) {} - @Builder.Task + @Airflow.Task public void loadEmpty() {} - @Builder.If(id = "has_rows") + @Airflow.If(id = "has_rows") public boolean hasRows(long rows) { return rows > 0; } - @Builder.Task(id = "trigger_downstream") + @Airflow.Task(id = "trigger_downstream") public TriggerDagRun triggerDownstream() { return new TriggerDagRun("downstream_etl"); } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { var extracted = extract(); @@ -2600,16 +2600,16 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.TriggerDagRun; - @Builder.Dag + @Airflow.Dag public class TestExample { - @Builder.Task + @Airflow.Task public TriggerDagRun triggerDownstream(long rows) { return new TriggerDagRun("downstream_etl"); } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -2619,7 +2619,7 @@ class BuilderTest { assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "@Builder.Task method 'triggerDownstream' returns a TriggerDagRun, so it runs when the Dag is " + + "@Airflow.Task method 'triggerDownstream' returns a TriggerDagRun, so it runs when the Dag is " + "built rather than when the task runs; it takes no parameters", ) } @@ -2631,16 +2631,16 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; + import org.apache.airflow.sdk.Airflow; import org.apache.airflow.sdk.TriggerDagRun; - @Builder.Dag + @Airflow.Dag public class TestExample { - @Builder.Task + @Airflow.Task public TriggerDagRun triggerDownstream() throws java.io.IOException { return new TriggerDagRun("downstream_etl"); } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -2650,7 +2650,7 @@ class BuilderTest { assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "@Builder.Task method 'triggerDownstream' returns a TriggerDagRun, so it runs when the Dag is " + + "@Airflow.Task method 'triggerDownstream' returns a TriggerDagRun, so it runs when the Dag is " + "built, where a checked exception cannot be thrown; it must not throw: java.io.IOException", ) } @@ -2662,15 +2662,15 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Switch + @Airflow.Switch public String pickPath() { return "handleLong"; } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -2680,7 +2680,7 @@ class BuilderTest { assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "@Builder.Switch method 'pickPath' returns java.lang.String, but a switch returns the class of the task it chose", + "@Airflow.Switch method 'pickPath' returns java.lang.String, but a switch returns the class of the task it chose", ) } @@ -2691,15 +2691,15 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Switch + @Airflow.Switch public Class pickPath() { return String.class; } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -2709,7 +2709,7 @@ class BuilderTest { assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "@Builder.Switch method 'pickPath' returns java.lang.Class, but a switch returns the class of the task it chose", + "@Airflow.Switch method 'pickPath' returns java.lang.Class, but a switch returns the class of the task it chose", ) } @@ -2720,15 +2720,15 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.If + @Airflow.If public String hasRows() { return "yes"; } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -2738,7 +2738,7 @@ class BuilderTest { assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "@Builder.If method 'hasRows' returns java.lang.String, but a condition returns boolean", + "@Airflow.If method 'hasRows' returns java.lang.String, but a condition returns boolean", ) } @@ -2749,16 +2749,16 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag public class TestExample { - @Builder.Task - @Builder.If + @Airflow.Task + @Airflow.If public boolean hasRows() { return true; } - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() {} } @@ -2768,7 +2768,7 @@ class BuilderTest { assertThat(compilation).failed() assertThat(compilation).hadErrorContaining( - "Method 'hasRows' carries @Builder.Task, @Builder.If; a task is declared by one of them alone", + "Method 'hasRows' carries @Airflow.Task, @Airflow.If; a task is declared by one of them alone", ) } @@ -2779,13 +2779,13 @@ class BuilderTest { compile( """ package org.apache.airflow.example; - import org.apache.airflow.sdk.Builder; - @Builder.Dag(id = "orders") + import org.apache.airflow.sdk.Airflow; + @Airflow.Dag(id = "orders") public class TestExample { - @Builder.Task + @Airflow.Task public void t1() {} - @Builder.Deps + @Airflow.Deps static class Wiring implements TestExampleDeps { void depends() { t1(); diff --git a/java-sdk/sdk/build.gradle.kts b/java-sdk/sdk/build.gradle.kts index 0e247e6565365..88226f5c57b75 100644 --- a/java-sdk/sdk/build.gradle.kts +++ b/java-sdk/sdk/build.gradle.kts @@ -257,7 +257,7 @@ abstract class SyncDagSchemaTask : DefaultTask() { // Generate the Dag-authoring DSL surface from the Dag serialization schema: // -// - org.apache.airflow.sdk.Builder and its nested Dag / Task annotations, +// - org.apache.airflow.sdk.Airflow and its nested Dag / Task annotations, // whose configuration attributes mirror the scalar keys of the schema's // "dag" and "operator" definitions (the annotation processor lowers // explicitly-set attributes into DagDef.config / TaskDef.config calls), and @@ -508,7 +508,7 @@ abstract class GenerateDagDslTask : DefaultTask() { " /** ${f.doc} */\n val ${f.attribute}: ${f.attrType} = ${f.attrDefault}," } - outDir.resolve("org/apache/airflow/sdk").apply { mkdirs() }.resolve("Builder.kt").writeText( + outDir.resolve("org/apache/airflow/sdk").apply { mkdirs() }.resolve("Airflow.kt").writeText( """ |package org.apache.airflow.sdk | @@ -524,16 +524,16 @@ abstract class GenerateDagDslTask : DefaultTask() { | * Example: | * | * ```java - | * @Builder.Dag(id = "my_pipeline", schedule = "@daily") + | * @Airflow.Dag(id = "my_pipeline", schedule = "@daily") | * public class MyPipeline { | * - | * @Builder.Task(id = "extract", retries = 2) + | * @Airflow.Task(id = "extract", retries = 2) | * public long extract(Client client) { ... } | * - | * @Builder.Task(id = "transform") + | * @Airflow.Task(id = "transform") | * public long transform(Client client, long extracted) { ... } | * - | * @Builder.Deps + | * @Airflow.Deps | * static class Wiring implements MyPipelineDeps { | * void depends() { transform(extract()); } | * } @@ -546,7 +546,7 @@ abstract class GenerateDagDslTask : DefaultTask() { | * the arguments bound at that call site take their place. Keyword | * arguments bind by name instead through a single [TaskInput] parameter. | */ - |class Builder internal constructor() { + |class Airflow internal constructor() { | /** | * Annotation to automate a Dag-builder pattern. | * @@ -590,10 +590,10 @@ abstract class GenerateDagDslTask : DefaultTask() { | * [TaskRef], so each side is named where the Dag is wired: | * | * ```java - | * @Builder.If(id = "has_rows") + | * @Airflow.If(id = "has_rows") | * public boolean hasRows(long rows) { return rows > 0; } | * - | * @Builder.Deps + | * @Airflow.Deps | * static class Wiring implements EtlDeps { | * void depends() { hasRows(extract()).Then(load()).Else(reportEmpty()); } | * } @@ -623,12 +623,12 @@ abstract class GenerateDagDslTask : DefaultTask() { | * [SwitchRef], so the cases are listed where the Dag is wired: | * | * ```java - | * @Builder.Switch(id = "pick_path") + | * @Airflow.Switch(id = "pick_path") | * public Class pickPath(long rows) { | * return rows > 1000 ? EtlBuilder.HandleLong.class : EtlBuilder.HandleShort.class; | * } | * - | * @Builder.Deps + | * @Airflow.Deps | * static class Wiring implements EtlDeps { | * void depends() { pickPath(extract()).Case(handleLong()).Case(handleShort()); } | * } @@ -658,7 +658,7 @@ abstract class GenerateDagDslTask : DefaultTask() { | * to rather than an id it owns: | * | * ```java - | * @Builder.TaskHandler(dag = "etl", task = "score") + | * @Airflow.TaskHandler(dag = "etl", task = "score") | * public long score(Client client, long rows) { ... } | * ``` | * @@ -687,7 +687,7 @@ abstract class GenerateDagDslTask : DefaultTask() { | * wire an ordering-only one: | * | * ```java - | * @Builder.Deps + | * @Airflow.Deps | * static class Wiring implements EtlPipelineDeps { | * void depends() { | * var rows = extract(); @@ -716,14 +716,14 @@ abstract class GenerateDagDslTask : DefaultTask() { | * task `Staging.stage`: | * | * ```java - | * @Builder.TaskGroup + | * @Airflow.TaskGroup | * static class Staging { - | * @Builder.Task + | * @Airflow.Task | * public long stage(long rows) { ... } | * - | * @Builder.TaskGroup(id = "checks") + | * @Airflow.TaskGroup(id = "checks") | * static class Checks { - | * @Builder.Task + | * @Airflow.Task | * public void nulls(long staged) { ... } | * } | * } @@ -770,7 +770,7 @@ abstract class GenerateDagDslTask : DefaultTask() { |/** | * Configuration keys accepted by `DagDef.config` and `TaskDef.config`, | * keyed by Dag serialization schema property name. Public so that the - | * annotation processor can lower `@Builder.Dag` / `@Builder.Task` + | * annotation processor can lower `@Airflow.Dag` / `@Airflow.Task` | * attributes onto the same tables; not user-facing API. | */ |object SchemaFields { @@ -822,7 +822,7 @@ val syncDagSchema by tasks.registering(SyncDagSchemaTask::class) { tasks.register("generateDagDsl") { dependsOn(syncDagSchema) - description = "Generate the Builder.Dag/Builder.Task annotations and SchemaFields from the Dag serialization schema" + description = "Generate the Airflow.Dag/Airflow.Task annotations and SchemaFields from the Dag serialization schema" schemaFile = dagSchemaInput targetDirectory = dagDslDir } diff --git a/java-sdk/sdk/module.md b/java-sdk/sdk/module.md index 2cc58f52b4d1c..4e9f368e47512 100644 --- a/java-sdk/sdk/module.md +++ b/java-sdk/sdk/module.md @@ -60,7 +60,7 @@ meaning of each dimension is defined in the | capability: `task-args` | MUST † | ✓ | 3.4 | | | capability: `dag-params` | MUST † | ✗ | – | | | capability: `taskflow-dependencies` | MUST † | ✓ | 3.4 | | -| capability: `branching` | SHOULD † | ✓ | 3.4 | DagDef.If and DagDef.Switch, or @Builder.If and @Builder.Switch | +| capability: `branching` | SHOULD † | ✓ | 3.4 | DagDef.If and DagDef.Switch, or @Airflow.If and @Airflow.Switch | | capability: `dag-test` | SHOULD † | ✗ | – | | | capability: `task-group` | MAY † | ✓ | 3.4 | | | capability: `dynamic-task-mapping` | MAY † | ✗ | – | | diff --git a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/Arg.kt b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/Arg.kt index bff37ad02efa3..765cfc8882213 100644 --- a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/Arg.kt +++ b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/Arg.kt @@ -34,7 +34,7 @@ sealed class Arg { * Wraps an inline constant as a task argument, passed to the task as a * constant and creating no dependency edge. * - * [Deps.lit] is the spelling a [Builder.Deps] class uses; this is the same + * [Deps.lit] is the spelling an [Airflow.Deps] class uses; this is the same * call for code with no `Deps` in scope. * * @param value Constant to bind; may be null for a nullable parameter. diff --git a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/Bundle.kt b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/Bundle.kt index 5e817c05e9316..232bf3b723d30 100644 --- a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/Bundle.kt +++ b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/Bundle.kt @@ -115,25 +115,25 @@ class Bundle( * Registers what an annotated class holds, read from the class itself so * there is no second name to keep in sync. * - * A [Builder.Dag] class contributes the Dag its generated builder builds; a - * class of [Builder.TaskHandler] methods contributes each handler, bound to + * An [Airflow.Dag] class contributes the Dag its generated builder builds; a + * class of [Airflow.TaskHandler] methods contributes each handler, bound to * the Dag the Python file owns. A class can carry both. * - * @param annotated A class carrying [Builder.Dag] or [Builder.TaskHandler]. + * @param annotated A class carrying [Airflow.Dag] or [Airflow.TaskHandler]. * @return This bundle, for chaining. * @throws IllegalArgumentException if the class has no generated code, * because annotation processing did not run over it, or if the Dag's - * wiring is invalid, such as a task the `@Builder.Deps` class did not + * wiring is invalid, such as a task the `@Airflow.Deps` class did not * call. */ fun register(annotated: Class<*>): Bundle { checkOpen() - val dag = annotated.getAnnotation(Builder.Dag::class.java) + val dag = annotated.getAnnotation(Airflow.Dag::class.java) if (dag != null) { val builder = generated(builderName(annotated.packageName, annotated.simpleName, dag.to), annotated, "builder") register(invokeGenerated(builder.getMethod("build")) as DagDef) } - if (dag == null || annotated.declaredMethods.any { it.isAnnotationPresent(Builder.TaskHandler::class.java) }) { + if (dag == null || annotated.declaredMethods.any { it.isAnnotationPresent(Airflow.TaskHandler::class.java) }) { val registrar = generated(registrarName(annotated.name), annotated, "registrar") invokeGenerated(registrar.getMethod("registerInto", Bundle::class.java), this) } @@ -184,8 +184,8 @@ class Bundle( Class.forName(name, true, from.classLoader) } catch (e: ClassNotFoundException) { throw IllegalArgumentException( - "No generated $what $name for ${from.name}; does it carry @Builder.Dag or " + - "@Builder.TaskHandler, and is airflow-sdk-processor on the annotationProcessor path?", + "No generated $what $name for ${from.name}; does it carry @Airflow.Dag or " + + "@Airflow.TaskHandler, and is airflow-sdk-processor on the annotationProcessor path?", e, ) } diff --git a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/DagDef.kt b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/DagDef.kt index 4b275c4b7eacd..06630cc89f43a 100644 --- a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/DagDef.kt +++ b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/DagDef.kt @@ -32,7 +32,7 @@ import kotlin.Throws * * Create a [DagDef] directly and register [TaskDef]s with [addTask]. * - * The [Builder.Dag] annotation should generally be preferred in user code, + * The [Airflow.Dag] annotation should generally be preferred in user code, * where the annotation processor generates the wiring for you. Only use this * class directly if you need to do low-level plumbing: * @@ -49,7 +49,7 @@ import kotlin.Throws * * @param id Dag identifier; must be unique within a [Bundle]. * - * @see Builder.Dag + * @see Airflow.Dag */ class DagDef( val id: String, @@ -427,7 +427,7 @@ private val EMPTY_GROUP_EDGES = GroupEdges() * declared input cannot be bound, so that a mis-declared input fails while * the [Bundle] is built rather than mid-run. * - * @see Builder.Task + * @see Airflow.Task */ class TaskDef( val id: String, @@ -500,7 +500,7 @@ class TaskDef( /** * A single unit of work executed by Airflow. * - * Prefer using the [Builder.Task] annotation with [Builder.Dag] to have the + * Prefer using the [Airflow.Task] annotation with [Airflow.Dag] to have the * annotation processor generate an implementation for you. Only use this * interface if you need to do low-level plumbing. * @@ -511,8 +511,8 @@ class TaskDef( * Implement [InputTask] instead for a task the Python Dag file calls with * TaskFlow arguments; the SDK then resolves those arguments and injects them. * - * @see Builder.Dag - * @see Builder.Task + * @see Airflow.Dag + * @see Airflow.Task * @see InputTask */ interface Task { diff --git a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/Deps.kt b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/Deps.kt index 01b26177cd6dd..1cf9049184126 100644 --- a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/Deps.kt +++ b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/Deps.kt @@ -25,7 +25,7 @@ import org.apache.airflow.sdk.internal.Refs * Vocabulary for declaring a Dag's task graph in Java, and the base of every * generated `Deps` wiring view. * - * A [Builder.Deps] class inherits [lit] and [Flow] by simple name, so it needs + * An [Airflow.Deps] class inherits [lit] and [Flow] by simple name, so it needs * no import and `Flow` does not collide with `java.util.concurrent.Flow`. */ interface Deps { @@ -99,7 +99,7 @@ interface Deps { * One task group of the Dag being wired: a point in the flow, and the * namespace of the tasks and groups declared inside it. * - * The generated wiring view nests one of these per [Builder.TaskGroup] + * The generated wiring view nests one of these per [Airflow.TaskGroup] * class, so a group is reached by calling it and its contents by calling on * through: * diff --git a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/TaskInput.kt b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/TaskInput.kt index 8fd78fa632ce6..a29372bc08dc1 100644 --- a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/TaskInput.kt +++ b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/TaskInput.kt @@ -36,12 +36,12 @@ package org.apache.airflow.sdk * public double threshold; // binds threshold * } * - * @Builder.TaskHandler(dag = "etl", task = "score") + * @Airflow.TaskHandler(dag = "etl", task = "score") * public Result score(Client client, ScoreInput input) { ... } * ``` * * A `TaskInput` binds the same way whichever authoring API declares it: as a - * `@Builder.TaskHandler` parameter, as above, or as the input type of an + * `@Airflow.TaskHandler` parameter, as above, or as the input type of an * [InputTask]. A task method may declare at most one `TaskInput` parameter * and, if it does, no other data parameters — the `TaskInput` owns the whole named-argument * surface, so field names and flat positions cannot shift each other. diff --git a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/TriggerDagRun.kt b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/TriggerDagRun.kt index c78d1a9fd5fc2..15a6a5b3d0da2 100644 --- a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/TriggerDagRun.kt +++ b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/TriggerDagRun.kt @@ -60,7 +60,7 @@ private val TRIGGER_FIELDS: Map = * .config("conf", Map.of("rows", 2))); * ``` * - * In an annotated Dag, a `@Builder.Task` method returns one instead; the + * In an annotated Dag, an `@Airflow.Task` method returns one instead; the * method runs when the Dag is built, not when the task runs. * * The task runs no Java code and takes no arguments. It pushes the triggered diff --git a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/ArgValues.kt b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/ArgValues.kt index e3920f2b67f76..25b5f021e47ad 100644 --- a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/ArgValues.kt +++ b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/ArgValues.kt @@ -68,7 +68,7 @@ object ArgValues { * claims. * * The single populator behind both authoring APIs — the annotation processor - * emits a call to it for a `@Builder.Task` [TaskInput] parameter, and + * emits a call to it for an `@Airflow.Task` [TaskInput] parameter, and * [org.apache.airflow.sdk.InputTask] calls it before handing the input to a * task written against the interface. * diff --git a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/Fields.kt b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/Fields.kt index 5b813b5c7333f..0afea428eedb0 100644 --- a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/Fields.kt +++ b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/Fields.kt @@ -25,7 +25,7 @@ import java.time.OffsetDateTime /** * Value shape of one Dag serialization schema key. Public so that the - * annotation processor can lower `@Builder.Dag` / `@Builder.Task` attributes; + * annotation processor can lower `@Airflow.Dag` / `@Airflow.Task` attributes; * not user-facing API. */ enum class FieldType { @@ -49,7 +49,7 @@ private val DAG_RUN_STATE_NAMES = listOf("queued", "running", "success", "failed /** * One configuration key from the Dag serialization schema. Public so that the - * annotation processor can lower `@Builder.Dag` / `@Builder.Task` attributes; + * annotation processor can lower `@Airflow.Dag` / `@Airflow.Task` attributes; * not user-facing API. * * @property key Schema property name, e.g. `retry_delay`. diff --git a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/InputTypes.kt b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/InputTypes.kt index fad312ffcf354..0d56fd35a4c2c 100644 --- a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/InputTypes.kt +++ b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/InputTypes.kt @@ -50,7 +50,7 @@ internal fun resolveInputType(taskClass: Class<*>): Class = * is being built rather than mid-run. A plain [Task] declares no input and passes. * * The annotation processor enforces the same rules at compile time for the - * [TaskInput] a `@Builder.Task` method declares. + * [TaskInput] an `@Airflow.Task` method declares. * * @throws IllegalArgumentException if the declared input type is unresolvable * or cannot be populated. diff --git a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/Refs.kt b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/Refs.kt index 761d5b8f28261..c668020b21d8b 100644 --- a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/Refs.kt +++ b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/Refs.kt @@ -28,7 +28,7 @@ import org.apache.airflow.sdk.TaskRef /** * @suppress * - * The recorder behind a `@Builder.Deps` wiring class. Public so that + * The recorder behind an `@Airflow.Deps` wiring class. Public so that * processor-generated wiring views can call it; not user-facing API. * * A wiring view's methods are `default` methods on an interface, so they hold @@ -75,7 +75,7 @@ object Refs { val missing = taskIds.filterNot { it in dag.tasks } require(missing.isEmpty()) { "Wiring for Dag '${dag.id}' did not register task(s) ${missing.joinToString { "'$it'" }}: " + - "every @Builder.Task method must be called in the @Builder.Deps class" + "every @Airflow.Task method must be called in the @Airflow.Deps class" } return dag } @@ -126,7 +126,7 @@ object Refs { } val active = checkNotNull(recording.get()) { - "Task '${def.id}' was wired outside a @Builder.Deps class; the wiring view's methods " + + "Task '${def.id}' was wired outside an @Airflow.Deps class; the wiring view's methods " + "only record while the generated builder is running depends()" } active.byTaskId[def.id]?.let { existing -> @@ -156,7 +156,7 @@ object Refs { fun group(id: String): TaskGroupRef { val active = checkNotNull(recording.get()) { - "Task group '$id' was looked up outside a @Builder.Deps class" + "Task group '$id' was looked up outside an @Airflow.Deps class" } return requireNotNull(active.dag.groups[id]) { "Dag '${active.dag.id}' has no task group '$id'" diff --git a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/Registrar.kt b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/Registrar.kt index 30edadb3060fb..60a4d715c6718 100644 --- a/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/Registrar.kt +++ b/java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/internal/Registrar.kt @@ -22,7 +22,7 @@ package org.apache.airflow.sdk.internal /** * @suppress * - * Names the registrar generated for a class of `@Builder.TaskHandler` + * Names the registrar generated for a class of `@Airflow.TaskHandler` * methods: a top-level class in the handler class's package, named after that * class and any class enclosing it, so `Outer.Inner` is served by * `Outer_InnerHandlers`. @@ -38,7 +38,7 @@ fun registrarName(binaryName: String): String = "${binaryName.replace('$', '_')} /** * @suppress * - * Names the builder generated for a `@Builder.Dag` class: a top-level class + * Names the builder generated for an `@Airflow.Dag` class: a top-level class * in the Dag class's package, named by the annotation's `to` or, when that is * blank, `Builder`. * diff --git a/java-sdk/sdk/src/test/kotlin/org/apache/airflow/sdk/BundleTest.kt b/java-sdk/sdk/src/test/kotlin/org/apache/airflow/sdk/BundleTest.kt index 4c645aab89fb1..2676b070b3fc4 100644 --- a/java-sdk/sdk/src/test/kotlin/org/apache/airflow/sdk/BundleTest.kt +++ b/java-sdk/sdk/src/test/kotlin/org/apache/airflow/sdk/BundleTest.kt @@ -35,17 +35,17 @@ internal class BundleTest { class Nested /** A Dag class that the processor generated [WiredDagBuilder] for. */ - @Builder.Dag(id = "wired") + @Airflow.Dag(id = "wired") class WiredDag /** A Dag class whose generated [BrokenDagBuilder] fails, as an invalid wiring would. */ - @Builder.Dag + @Airflow.Dag class BrokenDag /** A Dag class that also holds a task handler, so the processor generated both. */ - @Builder.Dag(id = "mixed") + @Airflow.Dag(id = "mixed") class MixedDag { - @Builder.TaskHandler(dag = "etl", task = "score") + @Airflow.TaskHandler(dag = "etl", task = "score") fun score() = Unit } @@ -150,7 +150,7 @@ internal class BundleTest { } @Test - @DisplayName("Should register the Dag a @Builder.Dag class's generated builder builds") + @DisplayName("Should register the Dag an @Airflow.Dag class's generated builder builds") fun shouldRegisterDagFromBuilderClass() { val bundle = Bundle().register(WiredDag::class.java) @@ -209,7 +209,7 @@ internal class BundleTest { Assertions.assertEquals( "No generated registrar org.apache.airflow.sdk.BundleTest_NoOpHandlers for " + - "${NoOp::class.java.name}; does it carry @Builder.Dag or @Builder.TaskHandler, " + + "${NoOp::class.java.name}; does it carry @Airflow.Dag or @Airflow.TaskHandler, " + "and is airflow-sdk-processor on the annotationProcessor path?", error.message, ) diff --git a/java-sdk/sdk/src/test/kotlin/org/apache/airflow/sdk/internal/ArgValuesTest.kt b/java-sdk/sdk/src/test/kotlin/org/apache/airflow/sdk/internal/ArgValuesTest.kt index cafbd5e40d281..bcb254547be33 100644 --- a/java-sdk/sdk/src/test/kotlin/org/apache/airflow/sdk/internal/ArgValuesTest.kt +++ b/java-sdk/sdk/src/test/kotlin/org/apache/airflow/sdk/internal/ArgValuesTest.kt @@ -54,7 +54,7 @@ private class NoopArgTask : Task { ) = Unit } -/** Resolution of the inputs a `@Builder.Deps` class recorded, without runtime bindings. */ +/** Resolution of the inputs an `@Airflow.Deps` class recorded, without runtime bindings. */ internal class ArgValuesTest { /** Upstream task ids read through the transport, in arrival order. */ private val pulls = java.util.concurrent.CopyOnWriteArrayList() diff --git a/java-sdk/sdk/src/test/kotlin/org/apache/airflow/sdk/internal/RefsTest.kt b/java-sdk/sdk/src/test/kotlin/org/apache/airflow/sdk/internal/RefsTest.kt index c764585e409fe..ef1748e8472ca 100644 --- a/java-sdk/sdk/src/test/kotlin/org/apache/airflow/sdk/internal/RefsTest.kt +++ b/java-sdk/sdk/src/test/kotlin/org/apache/airflow/sdk/internal/RefsTest.kt @@ -125,7 +125,7 @@ internal class RefsTest { assertEquals( "Wiring for Dag 'd' did not register task(s) 'x', 'y': " + - "every @Builder.Task method must be called in the @Builder.Deps class", + "every @Airflow.Task method must be called in the @Airflow.Deps class", error.message, ) } @@ -139,7 +139,7 @@ internal class RefsTest { } assertEquals( - "Task 't' was wired outside a @Builder.Deps class; the wiring view's methods " + + "Task 't' was wired outside an @Airflow.Deps class; the wiring view's methods " + "only record while the generated builder is running depends()", error.message, ) diff --git a/kubernetes-tests/lang_sdk/java_example/src/java/org/apache/airflow/k8sexample/MixedLanguageExample.java b/kubernetes-tests/lang_sdk/java_example/src/java/org/apache/airflow/k8sexample/MixedLanguageExample.java index 1a35838c82b11..64251d1defa07 100644 --- a/kubernetes-tests/lang_sdk/java_example/src/java/org/apache/airflow/k8sexample/MixedLanguageExample.java +++ b/kubernetes-tests/lang_sdk/java_example/src/java/org/apache/airflow/k8sexample/MixedLanguageExample.java @@ -32,13 +32,13 @@ public class MixedLanguageExample { private static final Logger logger = LoggerFactory.getLogger(MixedLanguageExample.class); - @Builder.TaskHandler(dag = "lang_sdk_mixed_language", task = "java_extract") + @Airflow.TaskHandler(dag = "lang_sdk_mixed_language", task = "java_extract") public long extract(Client client) { logger.info("java_extract running"); return new Date().getTime(); } - @Builder.TaskHandler(dag = "lang_sdk_mixed_language", task = "java_transform") + @Airflow.TaskHandler(dag = "lang_sdk_mixed_language", task = "java_transform") public void transform(Client client) { var variable = client.getVariable("my_variable"); logger.info("java_transform obtained variable {}", variable); diff --git a/task-sdk/docs/lang-sdk-spec.rst b/task-sdk/docs/lang-sdk-spec.rst index a260b7a56fc2c..dfcf76c1bb40e 100644 --- a/task-sdk/docs/lang-sdk-spec.rst +++ b/task-sdk/docs/lang-sdk-spec.rst @@ -105,11 +105,11 @@ Per-SDK spelling - an ``async`` function * - ``TaskHandler`` - ``airflow.TaskHandler(dagId, taskId, fn)`` - - ``@Builder.TaskHandler(dagId, taskId)`` + - ``@Airflow.TaskHandler(dagId, taskId)`` - ``new TaskHandler(dagId, taskId, fn)`` * - ``Dag`` - ``airflow.Dag(spec)`` - - ``@Builder.Dag(id, ...)``, or ``new Dag(id)`` + - ``@Airflow.Dag(id, ...)``, or ``new Dag(id)`` - ``new Dag(id)`` * - ``dag`` - ``*airflow.DagRef`` @@ -117,7 +117,7 @@ Per-SDK spelling - ``Dag`` * - ``dag.Task`` - ``dag.Task(fn, opts...)`` - - ``@Builder.Task(id)``, or ``dag.task(id, cls)`` + - ``@Airflow.Task(id)``, or ``dag.task(id, cls)`` - ``dag.task(id, fn)`` * - data edge - ``airflow.Inputs(refs...)``