From 4b24eebd8387c442b4f1211865a4a9e167ccc8be Mon Sep 17 00:00:00 2001 From: davidvader Date: Mon, 6 Nov 2023 14:51:16 -0600 Subject: [PATCH 01/11] fix(viz): track draw state to apply recenter on fresh draws --- src/static/graph.ts | 10 +++++++++- src/static/index.ts | 9 ++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/static/graph.ts b/src/static/graph.ts index 09bcfbfc0..9ae291f26 100644 --- a/src/static/graph.ts +++ b/src/static/graph.ts @@ -22,7 +22,8 @@ export function drawGraph(opts, content) { // check that a valid graph was rendered if (buildGraphElement === null || buildGraphElement.node() === null) { - return; + // control draw state + return false; } drawViewbox(opts, buildGraphElement); @@ -32,6 +33,9 @@ export function drawGraph(opts, content) { var edges = drawEdges(opts, buildGraphElement, graphSelectors.edge); drawNodes(opts, buildGraphElement, graphSelectors.node, edges); + + // control draw state + return true; } function drawBaseGraphWithZoom(opts, selector, content) { @@ -123,6 +127,10 @@ function drawBaseGraphWithZoom(opts, selector, content) { resetZoomAndCenter(opts, zoom); } + if (!opts.drawn) { + resetZoomAndCenter(opts, zoom); + } + return buildGraphElement; } diff --git a/src/static/index.ts b/src/static/index.ts index 187b78b4f..47ea4045b 100644 --- a/src/static/index.ts +++ b/src/static/index.ts @@ -130,6 +130,7 @@ function envOrNull(env: string, subst: string): string | null { // track rendering options globally to help determine draw logic var opts = { + drawn: false, currentBuild: -1, isRefreshDraw: false, centerOnDraw: false, @@ -141,6 +142,12 @@ app.ports.renderBuildGraph.subscribe(function (graphData) { const graphviz = Graphviz.load().then(res => { var content = res.layout(graphData.dot, 'svg', 'dot'); // construct graph building options + + // reset draw state when build changes + if (opts.currentBuild !== graphData.buildID) { + opts.drawn = false; + } + opts.isRefreshDraw = opts.currentBuild === graphData.buildID; opts.centerOnDraw = graphData.centerOnDraw; opts.contentFilter = graphData.filter; @@ -152,7 +159,7 @@ app.ports.renderBuildGraph.subscribe(function (graphData) { // dispatch the draw command to avoid elm/js rendering race condition setTimeout(() => { - Graph.drawGraph(opts, content); + opts.drawn = Graph.drawGraph(opts, content); }, 0); }); }); From 8dd13f9ae055b66fbf6d8cf908dff5fad1ff7516 Mon Sep 17 00:00:00 2001 From: davidvader Date: Mon, 6 Nov 2023 14:54:37 -0600 Subject: [PATCH 02/11] fix(viz): clearer option field name and comments --- src/static/graph.ts | 2 +- src/static/index.ts | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/static/graph.ts b/src/static/graph.ts index 9ae291f26..809d38401 100644 --- a/src/static/graph.ts +++ b/src/static/graph.ts @@ -119,7 +119,7 @@ function drawBaseGraphWithZoom(opts, selector, content) { buildGraphElement.html(content); // recenter on draw, when necessary - if (!opts.isRefreshDraw) { + if (!opts.sameBuild) { resetZoomAndCenter(opts, zoom); } diff --git a/src/static/index.ts b/src/static/index.ts index 47ea4045b..18bebd9d0 100644 --- a/src/static/index.ts +++ b/src/static/index.ts @@ -132,7 +132,7 @@ function envOrNull(env: string, subst: string): string | null { var opts = { drawn: false, currentBuild: -1, - isRefreshDraw: false, + sameBuild: false, centerOnDraw: false, contentFilter: '', onGraphInteraction: {}, @@ -141,20 +141,21 @@ var opts = { app.ports.renderBuildGraph.subscribe(function (graphData) { const graphviz = Graphviz.load().then(res => { var content = res.layout(graphData.dot, 'svg', 'dot'); - // construct graph building options - // reset draw state when build changes + // construct graph building options + // reset the draw state when the build changes if (opts.currentBuild !== graphData.buildID) { opts.drawn = false; } - opts.isRefreshDraw = opts.currentBuild === graphData.buildID; + opts.sameBuild = opts.currentBuild === graphData.buildID; opts.centerOnDraw = graphData.centerOnDraw; opts.contentFilter = graphData.filter; // track the currently drawn build opts.currentBuild = graphData.buildID; + // graph interactivity opts.onGraphInteraction = app.ports.onGraphInteraction; // dispatch the draw command to avoid elm/js rendering race condition From d135c898cd778bf482a6275b0f3aa31b87ff8bdc Mon Sep 17 00:00:00 2001 From: davidvader Date: Mon, 6 Nov 2023 15:50:48 -0600 Subject: [PATCH 03/11] fix(viz): recenter on tab switch --- src/elm/Main.elm | 4 ++-- src/elm/Pages/Build/Graph/Interop.elm | 4 ++-- src/elm/Vela.elm | 4 ++-- src/static/graph.ts | 2 +- src/static/index.d.ts | 4 ++-- src/static/index.ts | 6 +++--- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/elm/Main.elm b/src/elm/Main.elm index 2684fdaf0..267d592d4 100644 --- a/src/elm/Main.elm +++ b/src/elm/Main.elm @@ -2160,7 +2160,7 @@ update msg model = cmd = if not sameBuild then - renderBuildGraph updatedModel False + renderBuildGraph updatedModel True else Cmd.none @@ -4376,7 +4376,7 @@ loadBuildGraphPage model org repo buildNumber = , getBuild um org repo buildNumber , getAllBuildSteps um org repo buildNumber Nothing False , getBuildGraph um org repo buildNumber False - , renderBuildGraph um True + , renderBuildGraph um <| not sameResource ] ) diff --git a/src/elm/Pages/Build/Graph/Interop.elm b/src/elm/Pages/Build/Graph/Interop.elm index af3d256b2..69f235d53 100644 --- a/src/elm/Pages/Build/Graph/Interop.elm +++ b/src/elm/Pages/Build/Graph/Interop.elm @@ -16,7 +16,7 @@ import Vela exposing (encodeBuildGraphRenderData) {-| renderBuildGraph : takes partial build model and render options, and returns a cmd for dispatching a graphviz+d3 render command -} renderBuildGraph : BuildModel.PartialModel a -> Bool -> Cmd msg -renderBuildGraph model centerOnDraw = +renderBuildGraph model freshDraw = -- rendering the full graph requires repo, build and graph case ( model.repo.repo, model.repo.build.build, model.repo.build.graph.graph ) of ( Success r, Success b, Success g ) -> @@ -28,7 +28,7 @@ renderBuildGraph model centerOnDraw = , showServices = model.repo.build.graph.showServices , showSteps = model.repo.build.graph.showSteps , focusedNode = model.repo.build.graph.focusedNode - , centerOnDraw = centerOnDraw + , freshDraw = freshDraw } _ -> diff --git a/src/elm/Vela.elm b/src/elm/Vela.elm index 938e285b3..82b79eb17 100644 --- a/src/elm/Vela.elm +++ b/src/elm/Vela.elm @@ -1398,7 +1398,7 @@ encodeBuildGraphRenderData graphData = , ( "focusedNode", Encode.int graphData.focusedNode ) , ( "showServices", Encode.bool graphData.showServices ) , ( "showSteps", Encode.bool graphData.showSteps ) - , ( "centerOnDraw", Encode.bool graphData.centerOnDraw ) + , ( "freshDraw", Encode.bool graphData.freshDraw ) ] @@ -1409,7 +1409,7 @@ type alias BuildGraphRenderInteropData = , focusedNode : Int , showServices : Bool , showSteps : Bool - , centerOnDraw : Bool + , freshDraw : Bool } diff --git a/src/static/graph.ts b/src/static/graph.ts index 809d38401..1aaf46ebc 100644 --- a/src/static/graph.ts +++ b/src/static/graph.ts @@ -123,7 +123,7 @@ function drawBaseGraphWithZoom(opts, selector, content) { resetZoomAndCenter(opts, zoom); } - if (opts.centerOnDraw) { + if (opts.freshDraw) { resetZoomAndCenter(opts, zoom); } diff --git a/src/static/index.d.ts b/src/static/index.d.ts index 61f4b3327..dc1984564 100644 --- a/src/static/index.d.ts +++ b/src/static/index.d.ts @@ -113,8 +113,8 @@ export type GraphData = { showServices: boolean; /** @property showSteps: boolean */ showSteps: boolean; - /** @property centerOnDraw: boolean */ - centerOnDraw: boolean; + /** @property freshDraw: boolean */ + freshDraw: boolean; }; export type GraphInteraction = { diff --git a/src/static/index.ts b/src/static/index.ts index 18bebd9d0..3f0b8740d 100644 --- a/src/static/index.ts +++ b/src/static/index.ts @@ -133,7 +133,7 @@ var opts = { drawn: false, currentBuild: -1, sameBuild: false, - centerOnDraw: false, + freshDraw: false, contentFilter: '', onGraphInteraction: {}, }; @@ -144,12 +144,12 @@ app.ports.renderBuildGraph.subscribe(function (graphData) { // construct graph building options // reset the draw state when the build changes - if (opts.currentBuild !== graphData.buildID) { + if (opts.currentBuild !== graphData.buildID || graphData.freshDraw) { opts.drawn = false; } opts.sameBuild = opts.currentBuild === graphData.buildID; - opts.centerOnDraw = graphData.centerOnDraw; + opts.freshDraw = graphData.freshDraw; opts.contentFilter = graphData.filter; // track the currently drawn build From 97dd23a2338a2b083fae47fe449052907e8e1458 Mon Sep 17 00:00:00 2001 From: davidvader Date: Mon, 6 Nov 2023 15:54:16 -0600 Subject: [PATCH 04/11] fix(viz): remove duplicate logic --- src/static/graph.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/static/graph.ts b/src/static/graph.ts index 1aaf46ebc..59f70b20b 100644 --- a/src/static/graph.ts +++ b/src/static/graph.ts @@ -123,10 +123,6 @@ function drawBaseGraphWithZoom(opts, selector, content) { resetZoomAndCenter(opts, zoom); } - if (opts.freshDraw) { - resetZoomAndCenter(opts, zoom); - } - if (!opts.drawn) { resetZoomAndCenter(opts, zoom); } From 5fc0a34688d9c31b4856165b06160fb22c2f2ed3 Mon Sep 17 00:00:00 2001 From: davidvader Date: Tue, 7 Nov 2023 09:28:30 -0600 Subject: [PATCH 05/11] fix(viz): apply more truthy recenter logic --- src/elm/Main.elm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elm/Main.elm b/src/elm/Main.elm index 267d592d4..4976e695e 100644 --- a/src/elm/Main.elm +++ b/src/elm/Main.elm @@ -4367,7 +4367,7 @@ loadBuildGraphPage model org repo buildNumber = -- do not load resources if transition is auto refresh, line focus, etc -- MUST render graph here, or clicking on nodes won't cause an immediate change , if sameBuild && sameResource then - renderBuildGraph um False + renderBuildGraph um True else Cmd.batch From da54067f99482a2716e9e67fac76cf65e74eeb2b Mon Sep 17 00:00:00 2001 From: davidvader Date: Tue, 7 Nov 2023 09:29:11 -0600 Subject: [PATCH 06/11] fix(viz): only recenter once --- src/static/graph.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/static/graph.ts b/src/static/graph.ts index 59f70b20b..325c5a1f3 100644 --- a/src/static/graph.ts +++ b/src/static/graph.ts @@ -119,11 +119,7 @@ function drawBaseGraphWithZoom(opts, selector, content) { buildGraphElement.html(content); // recenter on draw, when necessary - if (!opts.sameBuild) { - resetZoomAndCenter(opts, zoom); - } - - if (!opts.drawn) { + if (!opts.sameBuild || !opts.drawn) { resetZoomAndCenter(opts, zoom); } From 118bb52f9a0d1b998137cd0c1797fca8bcc27f14 Mon Sep 17 00:00:00 2001 From: davidvader Date: Tue, 7 Nov 2023 15:15:07 -0600 Subject: [PATCH 07/11] fix(viz): apply better refresh logic --- src/elm/Main.elm | 26 +++++++--------------- src/elm/Pages/Build/Graph/DOT.elm | 32 +++++++++++++-------------- src/elm/Pages/Build/Graph/Interop.elm | 8 +++---- src/elm/Vela.elm | 12 ++++++++-- src/static/index.ts | 3 +++ 5 files changed, 41 insertions(+), 40 deletions(-) diff --git a/src/elm/Main.elm b/src/elm/Main.elm index 4976e695e..096c561f8 100644 --- a/src/elm/Main.elm +++ b/src/elm/Main.elm @@ -1047,7 +1047,10 @@ update msg model = case interaction.eventType of "href" -> ( model.repo.build.graph - , Util.dispatch <| FocusOn (focusFragmentToFocusId "step" (Just <| String.Extra.rightOf "#" interaction.href)) + , Cmd.batch + [ Util.dispatch <| FocusOn (focusFragmentToFocusId "step" (Just <| String.Extra.rightOf "#" interaction.href)) + , Navigation.pushUrl model.navigationKey interaction.href + ] ) "backdrop_click" -> @@ -1068,16 +1071,13 @@ update msg model = um_ = updateRepoModels model rm bm ugm in - ( ugm, renderBuildGraph um_ False ) + ( ugm, Cmd.batch [ renderBuildGraph um_ False ] ) _ -> ( model.repo.build.graph, Cmd.none ) in ( updateRepoModels model rm bm ugm_ - , Cmd.batch - [ Navigation.pushUrl model.navigationKey interaction.href - , cmd - ] + , cmd ) -- Outgoing HTTP requests @@ -2143,30 +2143,20 @@ update msg model = Err error -> ( model, addError error ) - BuildGraphResponse _ _ buildNumber _ response -> + BuildGraphResponse _ _ buildNumber isRefresh response -> case response of Ok ( _, g ) -> case model.page of Pages.BuildGraph _ _ _ -> let - sameBuild = - gm.buildNumber == buildNumber - ugm = { gm | buildNumber = buildNumber, graph = RemoteData.succeed g } updatedModel = updateRepoModels model rm bm ugm - - cmd = - if not sameBuild then - renderBuildGraph updatedModel True - - else - Cmd.none in ( updatedModel - , cmd + , renderBuildGraph updatedModel <| not isRefresh ) _ -> diff --git a/src/elm/Pages/Build/Graph/DOT.elm b/src/elm/Pages/Build/Graph/DOT.elm index 185f3b335..7582d5b57 100644 --- a/src/elm/Pages/Build/Graph/DOT.elm +++ b/src/elm/Pages/Build/Graph/DOT.elm @@ -38,8 +38,8 @@ import Visualization.DOT -} -renderDOT : BuildModel.PartialModel a -> Repository -> Build -> BuildGraph -> String -renderDOT model repo build buildGraph = +renderDOT : BuildModel.PartialModel a -> BuildGraph -> String +renderDOT model buildGraph = let isNodeFocused : String -> BuildGraphNode -> Bool isNodeFocused filter n = @@ -103,15 +103,15 @@ renderDOT model repo build buildGraph = -- convert nodes and edges to DOT string format builtInNodesString = - List.map (nodeToString model repo build) builtInNodes + List.map (nodeToString model buildGraph) builtInNodes |> String.join "\n" pipelineNodesString = - List.map (nodeToString model repo build) pipelineNodes + List.map (nodeToString model buildGraph) pipelineNodes |> String.join "\n" serviceNodesString = - List.map (nodeToString model repo build) serviceNodes + List.map (nodeToString model buildGraph) serviceNodes |> String.join "\n" builtInEdgesString = @@ -170,8 +170,8 @@ renderDOT model repo build buildGraph = a "label" is actually a disguised graphviz table that is used to render a list of stage-steps as graph content that is recognized by the layout -} -nodeLabel : BuildModel.PartialModel a -> Repository -> Build -> BuildGraphNode -> Bool -> String -nodeLabel model repo build node showSteps = +nodeLabel : BuildModel.PartialModel a -> BuildGraph -> BuildGraphNode -> Bool -> String +nodeLabel model buildGraph node showSteps = let label = node.name @@ -218,9 +218,9 @@ nodeLabel model repo build node showSteps = link step = Routes.routeToUrl <| - Routes.Build repo.org - repo.name - (String.fromInt build.number) + Routes.Build buildGraph.org + buildGraph.repo + (String.fromInt buildGraph.buildNumber) (Just <| Focus.resourceFocusFragment "step" @@ -276,11 +276,11 @@ nodeLabel model repo build node showSteps = {-| nodeLabel : takes model and a node, and returns the DOT string representation -} -nodeToString : BuildModel.PartialModel a -> Repository -> Build -> Node BuildGraphNode -> String -nodeToString model repo build node = +nodeToString : BuildModel.PartialModel a -> BuildGraph -> Node BuildGraphNode -> String +nodeToString model buildGraph node = " " ++ String.fromInt node.id - ++ makeAttributes (nodeAttributes model repo build node.label) + ++ makeAttributes (nodeAttributes model buildGraph node.label) {-| edgeToString : takes model and a node, and returns the DOT string representation @@ -416,8 +416,8 @@ nodeLabelTableAttributes = {-| nodeAttributes : returns the node-specific dynamic attributes -} -nodeAttributes : BuildModel.PartialModel a -> Repository -> Build -> BuildGraphNode -> Dict String Attribute -nodeAttributes model repo build node = +nodeAttributes : BuildModel.PartialModel a -> BuildGraph-> BuildGraphNode -> Dict String Attribute +nodeAttributes model buildGraph node = let -- embed node information in the element id id = @@ -449,7 +449,7 @@ nodeAttributes model repo build node = , ( "id", DefaultJSONLabelEscape id ) , ( "class", DefaultJSONLabelEscape class ) , ( "href", DefaultJSONLabelEscape ("#" ++ node.name) ) - , ( "label", HtmlLabelEscape <| nodeLabel model repo build node showSteps ) + , ( "label", HtmlLabelEscape <| nodeLabel model buildGraph node showSteps ) , ( "tooltip", DefaultJSONLabelEscape id ) ] diff --git a/src/elm/Pages/Build/Graph/Interop.elm b/src/elm/Pages/Build/Graph/Interop.elm index 69f235d53..82be29fc8 100644 --- a/src/elm/Pages/Build/Graph/Interop.elm +++ b/src/elm/Pages/Build/Graph/Interop.elm @@ -18,12 +18,12 @@ import Vela exposing (encodeBuildGraphRenderData) renderBuildGraph : BuildModel.PartialModel a -> Bool -> Cmd msg renderBuildGraph model freshDraw = -- rendering the full graph requires repo, build and graph - case ( model.repo.repo, model.repo.build.build, model.repo.build.graph.graph ) of - ( Success r, Success b, Success g ) -> + case model.repo.build.graph.graph of + Success g -> Interop.renderBuildGraph <| encodeBuildGraphRenderData - { dot = renderDOT model r b g - , buildID = b.id + { dot = renderDOT model g + , buildID = g.buildID , filter = model.repo.build.graph.filter , showServices = model.repo.build.graph.showServices , showSteps = model.repo.build.graph.showSteps diff --git a/src/elm/Vela.elm b/src/elm/Vela.elm index 82b79eb17..eba416a62 100644 --- a/src/elm/Vela.elm +++ b/src/elm/Vela.elm @@ -1386,7 +1386,7 @@ defaultBuildGraphModel = defaultBuildGraph : BuildGraph defaultBuildGraph = - BuildGraph Dict.empty [] + BuildGraph -1 -1 "" "" Dict.empty [] encodeBuildGraphRenderData : BuildGraphRenderInteropData -> Encode.Value @@ -1425,7 +1425,11 @@ type alias BuildGraphModel = type alias BuildGraph = - { nodes : Dict Int BuildGraphNode + { buildID : Int + , buildNumber : Int + , org : Org + , repo : Repo + , nodes : Dict Int BuildGraphNode , edges : List BuildGraphEdge } @@ -1454,6 +1458,10 @@ type alias BuildGraphEdge = decodeBuildGraph : Decoder BuildGraph decodeBuildGraph = Decode.succeed BuildGraph + |> required "build_id" int + |> required "build_number" int + |> required "org" string + |> required "repo" string |> required "nodes" (dict2 int decodeBuildGraphNode) |> optional "edges" (Decode.list decodeEdge) [] diff --git a/src/static/index.ts b/src/static/index.ts index 3f0b8740d..9fe55f94f 100644 --- a/src/static/index.ts +++ b/src/static/index.ts @@ -144,6 +144,9 @@ app.ports.renderBuildGraph.subscribe(function (graphData) { // construct graph building options // reset the draw state when the build changes + + // what if the first freshDraw is skipped, and the next draw is a fresh + // but we never reset this drawn to false if (opts.currentBuild !== graphData.buildID || graphData.freshDraw) { opts.drawn = false; } From e262b71e41fbb5dc9d3e224c0278f9c4e659b219 Mon Sep 17 00:00:00 2001 From: davidvader Date: Tue, 7 Nov 2023 15:17:31 -0600 Subject: [PATCH 08/11] chore: elm-format --- src/elm/Pages/Build/Graph/DOT.elm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elm/Pages/Build/Graph/DOT.elm b/src/elm/Pages/Build/Graph/DOT.elm index 7582d5b57..8a6f95c76 100644 --- a/src/elm/Pages/Build/Graph/DOT.elm +++ b/src/elm/Pages/Build/Graph/DOT.elm @@ -416,7 +416,7 @@ nodeLabelTableAttributes = {-| nodeAttributes : returns the node-specific dynamic attributes -} -nodeAttributes : BuildModel.PartialModel a -> BuildGraph-> BuildGraphNode -> Dict String Attribute +nodeAttributes : BuildModel.PartialModel a -> BuildGraph -> BuildGraphNode -> Dict String Attribute nodeAttributes model buildGraph node = let -- embed node information in the element id From 590dfb3f2792afccf3e3230579c92487906f465f Mon Sep 17 00:00:00 2001 From: davidvader Date: Tue, 7 Nov 2023 15:18:33 -0600 Subject: [PATCH 09/11] chore: remove unused cmd.Batch --- src/elm/Main.elm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elm/Main.elm b/src/elm/Main.elm index 096c561f8..4839e0e6b 100644 --- a/src/elm/Main.elm +++ b/src/elm/Main.elm @@ -1071,7 +1071,7 @@ update msg model = um_ = updateRepoModels model rm bm ugm in - ( ugm, Cmd.batch [ renderBuildGraph um_ False ] ) + ( ugm, renderBuildGraph um_ False ) _ -> ( model.repo.build.graph, Cmd.none ) From 85bdbe1696c6ab9c8f366a4431894f54c861587b Mon Sep 17 00:00:00 2001 From: davidvader Date: Tue, 7 Nov 2023 15:19:42 -0600 Subject: [PATCH 10/11] chore: remove repo api call --- src/elm/Main.elm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/elm/Main.elm b/src/elm/Main.elm index 4839e0e6b..1239adf40 100644 --- a/src/elm/Main.elm +++ b/src/elm/Main.elm @@ -4361,8 +4361,7 @@ loadBuildGraphPage model org repo buildNumber = else Cmd.batch - [ getRepo um org repo - , getBuilds um org repo Nothing Nothing Nothing + [ getBuilds um org repo Nothing Nothing Nothing , getBuild um org repo buildNumber , getAllBuildSteps um org repo buildNumber Nothing False , getBuildGraph um org repo buildNumber False From 6454422686b865473b0ad7b9953b1701efd9b702 Mon Sep 17 00:00:00 2001 From: davidvader Date: Tue, 7 Nov 2023 15:47:48 -0600 Subject: [PATCH 11/11] fix(test): update cypress fixtures --- cypress/fixtures/build_graph.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cypress/fixtures/build_graph.json b/cypress/fixtures/build_graph.json index f587738fd..7c27f884c 100644 --- a/cypress/fixtures/build_graph.json +++ b/cypress/fixtures/build_graph.json @@ -1,5 +1,8 @@ { "build_id": 4, + "build_number": 4, + "org": "github", + "repo": "octocat", "nodes": { "0": { "id": 0,