buildkite-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/bk/format.rb ADDED
@@ -0,0 +1,79 @@
1
+ module Bk
2
+ module Format
3
+ VERTICAL_PIPE = "⏐"
4
+ HORIZONTAL_PIPE = "⎯"
5
+
6
+ def pastel
7
+ @pastel ||= Pastel.new
8
+ end
9
+
10
+ def vertical_pipe
11
+ is_tty? ? "#{VERTICAL_PIPE} " : ""
12
+ end
13
+
14
+ def is_tty?
15
+ $stdout.tty?
16
+ end
17
+
18
+ def build_header(build)
19
+ io = StringIO.new
20
+
21
+ started_at = Time.parse(build.started_at)
22
+ finished_at = Time.parse(build.finished_at) if build.finished_at
23
+
24
+ build_color = build_colors[build.state]
25
+
26
+ build_url = pastel.dim("» #{build.url}")
27
+ # TODO handle multi-line message better
28
+ io.puts "#{build_color.call(vertical_pipe)}#{pastel.bold(build.message)} #{build_url}"
29
+ io.puts build_color.call(vertical_pipe)
30
+
31
+ state = if build.state == "RUNNING" || build.state == "FAILING"
32
+ duration = Time.now - started_at
33
+ minutes = (duration / 60).to_i
34
+ seconds = (duration % 60).to_i
35
+ "running for #{minutes}m #{seconds}s"
36
+ elsif finished_at
37
+ duration = finished_at - started_at
38
+ "#{build.state.downcase.capitalize} in #{duration}s"
39
+ end
40
+
41
+ parts = [
42
+ "Build ##{build.number}",
43
+ build.branch,
44
+ build_color.call(state)
45
+ ].join(pastel.dim(" | "))
46
+ io.puts "#{build_color.call(vertical_pipe)}#{parts}"
47
+
48
+ io.string
49
+ end
50
+
51
+ def annotation_colors
52
+ return @annotation_colors if defined?(@annotation_colors)
53
+
54
+ @annotation_colors = create_color_hash({
55
+ "SUCCESS" => success_color,
56
+ "ERROR" => error_color,
57
+ "WARNING" => warning_color,
58
+ "INFO" => info_color
59
+ })
60
+ end
61
+
62
+ def build_colors
63
+ return @build_colors if defined?(@build_colors)
64
+ @build_colors = create_color_hash({
65
+ "FAILED" => error_color
66
+ })
67
+ end
68
+
69
+ def job_colors
70
+ return @job_colors if defined?(@job_colors)
71
+
72
+ @job_colors = Hash.new(error_color)
73
+ @job_colors.merge!({
74
+ "0" => success_color,
75
+ "BROKEN" => @pastel.dim
76
+ })
77
+ end
78
+ end
79
+ end
data/lib/bk/version.rb ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bk
4
+ VERSION = "0.1.0"
5
+ end
data/lib/bk.rb ADDED
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zeitwerk"
4
+ loader = Zeitwerk::Loader.for_gem
5
+ loader.setup
6
+
7
+ require "json"
8
+ require "httparty"
9
+ require "tty-pager"
10
+ require "tty-markdown"
11
+ require "tty-spinner"
12
+ require "tty-box"
13
+ require "graphql/client"
14
+ require "graphql/client/http"
15
+ require "dry/cli"
16
+ require "cgi"
17
+
18
+ require_relative "bk/version"
19
+
20
+ module Bk
21
+ class Error < StandardError; end
22
+
23
+ # Configure GraphQL endpoint using the basic HTTP network adapter.
24
+ HTTP = GraphQL::Client::HTTP.new("https://graphql.buildkite.com/v1") do
25
+ def headers(context)
26
+ unless (token = context[:access_token] || ENV["BUILDKITE_API_TOKEN"])
27
+ raise "missing BuildKite access token"
28
+ end
29
+
30
+ {
31
+ "Authorization" => "Bearer #{token}",
32
+ "Content-Type" => "application/json"
33
+ }
34
+ end
35
+ end
36
+
37
+ SCHEMA_PATH = Pathname.new(__FILE__).dirname.dirname.join("schema.json")
38
+ Schema = GraphQL::Client.load_schema(SCHEMA_PATH.to_s)
39
+ # Schema = GraphQL::Client.load_schema(HTTP)
40
+ Client = GraphQL::Client.new(schema: Schema, execute: HTTP)
41
+ end