termcity 0.5.0 → 1.0.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.
- checksums.yaml +4 -4
- data/exe/termcity +27 -7
- data/lib/termcity/api.rb +2 -2
- data/lib/termcity/cli.rb +3 -1
- data/lib/termcity/formatters/iterm2.rb +5 -5
- data/lib/termcity/formatters/simple.rb +19 -27
- data/lib/termcity/summary.rb +23 -38
- data/lib/termcity/version.rb +1 -1
- data/termcity.gemspec +2 -2
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c892485b183a6b842bc3423e3e763e46cf7290f0
|
4
|
+
data.tar.gz: 9624a4743a97c74b8615a0ab6131fdedc9f800e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57adcd164a8300e3b36d43a2696c9cde192cd9147fd7c1aef643c8643fb412dd1a09b873ceae23d1679f7663939f48a3dab40ee44f9144c6965827a530f38312
|
7
|
+
data.tar.gz: e2ff976bdf83a13e6341f0bd2e81b509d1a2ae5861bd437906c1fb4447dbdf08b73595d78a631d6292b29c58344573557c2dd024db64ba8c61837b28bf3c6ac0
|
data/exe/termcity
CHANGED
@@ -13,7 +13,8 @@ HELP = <<~TXT
|
|
13
13
|
[Options]
|
14
14
|
|
15
15
|
-b, --branch: defaults to current repo branch
|
16
|
-
-p, --project: defaults to camelcasing repo directory
|
16
|
+
-p, --teamcity-project: defaults to camelcasing repo directory
|
17
|
+
-n, --circleci-reponame: defaults to repo directory
|
17
18
|
-r, --revision: defaults to latest revision known to CI
|
18
19
|
|
19
20
|
[CREDENTIALS]:
|
@@ -51,10 +52,14 @@ OptionParser.new do |opts|
|
|
51
52
|
options[:branch] = b
|
52
53
|
end
|
53
54
|
|
54
|
-
opts.on("-p PROJECT_ID", "--project PROJECT_ID", "The project id (defaults to camelCasing on repo directory)") do |p|
|
55
|
+
opts.on("-p PROJECT_ID", "--teamcity-project PROJECT_ID", "The project id (defaults to camelCasing on repo directory)") do |p|
|
55
56
|
options[:project_id] = p
|
56
57
|
end
|
57
58
|
|
59
|
+
opts.on("-n REPONAME", "--circleci-reponame REPONAME", "The reponame (defaults to repo directory)") do |p|
|
60
|
+
options[:reponame] = p
|
61
|
+
end
|
62
|
+
|
58
63
|
opts.on("-r REVISION", "--revision REVISION", "The git revision to look for (defaults to revision of latest test run)") do |r|
|
59
64
|
options[:revision] = r
|
60
65
|
|
@@ -84,21 +89,35 @@ if !options[:branch]
|
|
84
89
|
end
|
85
90
|
end
|
86
91
|
|
92
|
+
root_dir = nil
|
93
|
+
|
87
94
|
if !options[:project_id]
|
88
|
-
root_dir
|
89
|
-
|
95
|
+
root_dir ||=
|
96
|
+
File.basename(
|
97
|
+
`git rev-parse --show-toplevel`
|
90
98
|
.chomp
|
91
99
|
.tap { raise "detecting root dir failed" unless $?==0}
|
100
|
+
)
|
92
101
|
|
93
102
|
camelcase_root_dir =
|
94
|
-
|
95
|
-
.basename(root_dir)
|
103
|
+
root_dir
|
96
104
|
.sub(/^[a-z\d]*/) { $&.capitalize }
|
97
105
|
.gsub(/(?:_|(\/))([a-z\d]*)/) { $2.capitalize }
|
98
106
|
|
99
107
|
options[:project_id] = camelcase_root_dir
|
100
108
|
end
|
101
109
|
|
110
|
+
if !options[:reponame]
|
111
|
+
root_dir ||=
|
112
|
+
File.basename(
|
113
|
+
`git rev-parse --show-toplevel`
|
114
|
+
.chomp
|
115
|
+
.tap { raise "detecting root dir failed" unless $?==0}
|
116
|
+
)
|
117
|
+
|
118
|
+
options[:reponame] = root_dir
|
119
|
+
end
|
120
|
+
|
102
121
|
creds_file = File.expand_path("~/.termcity")
|
103
122
|
if !File.exist?(creds_file)
|
104
123
|
warn "Could not find a credentials file. See --help for info."
|
@@ -122,5 +141,6 @@ Termcity::CLI.simple_format(
|
|
122
141
|
host: yaml["host"],
|
123
142
|
branch: options[:branch],
|
124
143
|
revision: options[:revision],
|
125
|
-
project_id: options[:project_id]
|
144
|
+
project_id: options[:project_id],
|
145
|
+
reponame: options[:reponame]
|
126
146
|
)
|
data/lib/termcity/api.rb
CHANGED
@@ -19,8 +19,8 @@ module Termcity
|
|
19
19
|
@host = host
|
20
20
|
end
|
21
21
|
|
22
|
-
def summary(branch:, project_id:, revision:)
|
23
|
-
path = "/builds?branch=#{branch}&project_id=#{project_id}"
|
22
|
+
def summary(branch:, project_id:, revision:, reponame:)
|
23
|
+
path = "/builds?branch=#{branch}&project_id=#{project_id}&reponame=#{reponame}"
|
24
24
|
path = "#{path}&revision=#{revision}" if revision
|
25
25
|
url = URI.join(@host, path).to_s
|
26
26
|
get(url)
|
data/lib/termcity/cli.rb
CHANGED
@@ -10,12 +10,13 @@ module Termcity
|
|
10
10
|
new(**args).simple_format
|
11
11
|
end
|
12
12
|
|
13
|
-
def initialize(branch:, token:, host:, project_id:, revision:)
|
13
|
+
def initialize(branch:, token:, host:, project_id:, revision:, reponame:)
|
14
14
|
@branch = branch
|
15
15
|
@token = token
|
16
16
|
@host = host
|
17
17
|
@project_id = project_id
|
18
18
|
@revision = revision
|
19
|
+
@reponame = reponame
|
19
20
|
end
|
20
21
|
|
21
22
|
def simple_format
|
@@ -29,6 +30,7 @@ module Termcity
|
|
29
30
|
branch: @branch,
|
30
31
|
revision: @revision,
|
31
32
|
project_id: @project_id,
|
33
|
+
reponame: @reponame,
|
32
34
|
)
|
33
35
|
|
34
36
|
formatter =
|
@@ -11,15 +11,15 @@ module Termcity
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def format(summary)
|
14
|
-
rows = summary.builds.map do |
|
14
|
+
rows = summary.builds.map do |build|
|
15
15
|
cols = []
|
16
16
|
|
17
|
-
text = simple_formatter.status_string(
|
18
|
-
"#{linkify(t,
|
17
|
+
text = simple_formatter.status_string(build) { |t|
|
18
|
+
"#{linkify(t, build.fetch("web_url"))}#{" "*(10-t.length)}"
|
19
19
|
}
|
20
20
|
|
21
|
-
cols << linkify(text,
|
22
|
-
cols <<
|
21
|
+
cols << linkify(text, build.fetch("web_url"))
|
22
|
+
cols << build.fetch("build_type")
|
23
23
|
cols.join(" ")
|
24
24
|
end
|
25
25
|
|
@@ -5,22 +5,13 @@ module Termcity
|
|
5
5
|
class Simple
|
6
6
|
include Utils::Color
|
7
7
|
|
8
|
-
STATUSES = {
|
9
|
-
queued: "queued",
|
10
|
-
failing: "failing",
|
11
|
-
running: "running",
|
12
|
-
failed_to_start: "failstrt",
|
13
|
-
failed: "failed",
|
14
|
-
success: "success"
|
15
|
-
}
|
16
|
-
|
17
8
|
COLORS = {
|
18
|
-
failing
|
19
|
-
queued
|
20
|
-
running
|
21
|
-
|
22
|
-
failed
|
23
|
-
success
|
9
|
+
"failing" => :red,
|
10
|
+
"queued" => :yellow,
|
11
|
+
"running" => :blue,
|
12
|
+
"failstrt" => :default,
|
13
|
+
"failed" => :red,
|
14
|
+
"success" => :green
|
24
15
|
}
|
25
16
|
|
26
17
|
attr_reader :io
|
@@ -29,22 +20,22 @@ module Termcity
|
|
29
20
|
end
|
30
21
|
|
31
22
|
def format(summary)
|
32
|
-
rows = summary.builds.map
|
23
|
+
rows = summary.builds.map { |build|
|
33
24
|
cols = []
|
34
|
-
cols << status_string(
|
35
|
-
cols <<
|
36
|
-
cols <<
|
25
|
+
cols << status_string(build)
|
26
|
+
cols << build.fetch("build_type")
|
27
|
+
cols << build.fetch("web_url")
|
37
28
|
|
38
29
|
cols.join(" : ")
|
39
|
-
|
30
|
+
}
|
40
31
|
|
41
32
|
@io.puts(summarize(summary, rows))
|
42
33
|
end
|
43
34
|
|
44
|
-
def status_string(
|
45
|
-
name =
|
46
|
-
name = "#{name},q" if re_enqueued
|
47
|
-
color = COLORS[
|
35
|
+
def status_string(build)
|
36
|
+
name = build.fetch("status")
|
37
|
+
name = "#{name},q" if build.fetch("re_enqueued")
|
38
|
+
color = COLORS[build.fetch("status")]
|
48
39
|
|
49
40
|
text =
|
50
41
|
if block_given?
|
@@ -62,12 +53,13 @@ module Termcity
|
|
62
53
|
"This revision may still be in the queue (or may be unkown/old)"
|
63
54
|
else
|
64
55
|
|
65
|
-
revision = summary.builds.map {|b| b.dig(
|
56
|
+
revision = summary.builds.map {|b| b.dig("sha")}.compact.first
|
66
57
|
[
|
67
58
|
rows,
|
68
59
|
"",
|
69
60
|
"Revision: #{revision}",
|
70
|
-
"Overview: #{summary.
|
61
|
+
"Teamcity Overview: #{summary.teamcity_link}",
|
62
|
+
"CircleCI Overview: #{summary.circle_link}",
|
71
63
|
counts(summary),
|
72
64
|
].join("\n")
|
73
65
|
end
|
@@ -79,7 +71,7 @@ module Termcity
|
|
79
71
|
["Success", summary.counts[:success]],
|
80
72
|
["Failure", summary.counts[:failure]],
|
81
73
|
["Running", summary.counts[:running]],
|
82
|
-
["FailedToStart", summary.counts[:
|
74
|
+
["FailedToStart", summary.counts[:failstrt]],
|
83
75
|
["Queued", summary.counts[:queued]],
|
84
76
|
["Re-Queued", summary.counts[:re_enqueued]]
|
85
77
|
]
|
data/lib/termcity/summary.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module Termcity
|
2
2
|
class Summary
|
3
|
-
def initialize(revision:, api:, branch:, project_id:)
|
3
|
+
def initialize(revision:, api:, branch:, project_id:, reponame:)
|
4
4
|
@branch = branch
|
5
5
|
@project_id = project_id
|
6
6
|
@api = api
|
7
7
|
@revision = revision
|
8
|
+
@reponame = reponame
|
8
9
|
end
|
9
10
|
|
10
11
|
def builds
|
@@ -15,8 +16,12 @@ module Termcity
|
|
15
16
|
data[:counts]
|
16
17
|
end
|
17
18
|
|
18
|
-
def
|
19
|
-
data.dig(:links, :
|
19
|
+
def teamcity_link
|
20
|
+
data.dig(:links, :teamcity_overview)
|
21
|
+
end
|
22
|
+
|
23
|
+
def circle_link
|
24
|
+
data.dig(:links, :circle_overview)
|
20
25
|
end
|
21
26
|
|
22
27
|
def data
|
@@ -28,18 +33,26 @@ module Termcity
|
|
28
33
|
failure: 0,
|
29
34
|
running: 0,
|
30
35
|
queued: 0,
|
31
|
-
|
36
|
+
failstrt: 0,
|
32
37
|
re_enqueued: 0,
|
33
38
|
}
|
34
39
|
|
35
|
-
summary = @api.summary(
|
40
|
+
summary = @api.summary(
|
41
|
+
branch: @branch,
|
42
|
+
project_id: @project_id,
|
43
|
+
revision: @revision,
|
44
|
+
reponame: @reponame
|
45
|
+
)
|
36
46
|
|
37
47
|
builds = summary.fetch("builds")
|
38
48
|
.sort_by {|b| b.fetch("build_type")}
|
39
49
|
.map {|b| summarize(b, counts) }
|
40
50
|
|
41
51
|
{
|
42
|
-
links: {
|
52
|
+
links: {
|
53
|
+
teamcity_overview: summary.dig("links", "teamcity_overview"),
|
54
|
+
circle_overview: summary.dig("links", "circle_overview")
|
55
|
+
},
|
43
56
|
builds: builds,
|
44
57
|
counts: counts
|
45
58
|
}
|
@@ -47,44 +60,16 @@ module Termcity
|
|
47
60
|
end
|
48
61
|
|
49
62
|
def summarize(build, counts)
|
50
|
-
status = status(build)
|
51
|
-
|
52
63
|
count_type =
|
53
|
-
if [
|
64
|
+
if ["failing", "failed"].include?(build.fetch("status"))
|
54
65
|
:failure
|
55
66
|
else
|
56
|
-
status
|
67
|
+
build.fetch("status").to_sym
|
57
68
|
end
|
58
69
|
counts[count_type] += 1
|
59
70
|
counts[:total] += 1
|
60
|
-
counts[:re_enqueued] +=1 if
|
61
|
-
|
62
|
-
{
|
63
|
-
raw: build,
|
64
|
-
status: status
|
65
|
-
}
|
66
|
-
end
|
67
|
-
|
68
|
-
def status(build)
|
69
|
-
re_enqueued = build.fetch("re_enqueued")
|
70
|
-
|
71
|
-
if build.fetch("state") == "queued"
|
72
|
-
{type: :queued, re_enqueued: false}
|
73
|
-
elsif build.fetch("state") == "running"
|
74
|
-
if build.fetch("status") == "FAILURE"
|
75
|
-
{type: :failing, re_enqueued: re_enqueued}
|
76
|
-
else
|
77
|
-
{type: :running, re_enqueued: re_enqueued}
|
78
|
-
end
|
79
|
-
else
|
80
|
-
if build.fetch("failed_to_start", false)
|
81
|
-
{type: :failed_to_start, re_enqueued: re_enqueued}
|
82
|
-
elsif build.fetch("status") == "FAILURE"
|
83
|
-
{type: :failed, re_enqueued: re_enqueued}
|
84
|
-
else
|
85
|
-
{type: :success, re_enqueued: re_enqueued}
|
86
|
-
end
|
87
|
-
end
|
71
|
+
counts[:re_enqueued] +=1 if build.fetch("re_enqueued")
|
72
|
+
build
|
88
73
|
end
|
89
74
|
end
|
90
75
|
end
|
data/lib/termcity/version.rb
CHANGED
data/termcity.gemspec
CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Pete Kinnecom"]
|
10
10
|
spec.email = ["git@k7u7.com"]
|
11
11
|
|
12
|
-
spec.summary = %q{Terminal view of TeamCity}
|
13
|
-
spec.description = %q{See TeamCity build status for a branch in your terminal. Pipe it to grep or whatever. Get nicely formatted links if you use iTerm2.}
|
12
|
+
spec.summary = %q{Terminal view of TeamCity/CircleCI}
|
13
|
+
spec.description = %q{See TeamCity/CircleCI build status for a branch in your terminal. Pipe it to grep or whatever. Get nicely formatted links if you use iTerm2.}
|
14
14
|
# spec.homepage = "none"
|
15
15
|
|
16
16
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: termcity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pete Kinnecom
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,8 +38,8 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
|
-
description: See TeamCity build status for a branch in your terminal. Pipe
|
42
|
-
or whatever. Get nicely formatted links if you use iTerm2.
|
41
|
+
description: See TeamCity/CircleCI build status for a branch in your terminal. Pipe
|
42
|
+
it to grep or whatever. Get nicely formatted links if you use iTerm2.
|
43
43
|
email:
|
44
44
|
- git@k7u7.com
|
45
45
|
executables:
|
@@ -85,5 +85,5 @@ rubyforge_project:
|
|
85
85
|
rubygems_version: 2.5.2
|
86
86
|
signing_key:
|
87
87
|
specification_version: 4
|
88
|
-
summary: Terminal view of TeamCity
|
88
|
+
summary: Terminal view of TeamCity/CircleCI
|
89
89
|
test_files: []
|