Class: CircleStatus::Script

Inherits:
Object
  • Object
show all
Defined in:
lib/circle_status/script.rb

Instance Method Summary collapse

Instance Method Details

#branchObject



92
93
94
# File 'lib/circle_status/script.rb', line 92

def branch
  git.current_branch
end

#buildsObject



28
29
30
31
32
33
34
# File 'lib/circle_status/script.rb', line 28

def builds
  @builds ||= begin
    builds = CircleCi::Project.recent_builds_branch(user_name, repo_name, branch).body
    fail ProjectError, 'no builds for this repository' if builds.empty?
    builds
  end
end

#configObject

Raises:



20
21
22
23
24
25
26
# File 'lib/circle_status/script.rb', line 20

def config
  token = ENV.fetch('CIRCLE_CI_TOKEN')
  raise ProjectError, 'no CIRCLE_CI_TOKEN ENV var' if token.nil?
  CircleCi.configure do |config|
    config.token = token
  end
end

#failing_filesObject



72
73
74
# File 'lib/circle_status/script.rb', line 72

def failing_files
  @failing_files ||= failures.map { |test| test['file'] }.uniq.sort
end

#failuresObject



64
65
66
# File 'lib/circle_status/script.rb', line 64

def failures
  @failures ||= split_tests.last
end

#gitObject



96
97
98
# File 'lib/circle_status/script.rb', line 96

def git
  @git ||= Git.open(Dir.pwd)
end

#latest_buildObject



36
37
38
39
40
41
42
# File 'lib/circle_status/script.rb', line 36

def latest_build
  @latest_build ||= begin
    build = builds.find { |build| %w(failed success).include?(build['status']) }
    fail ProjectError, 'no builds for this branch yet' if build.nil?
    build
  end
end

#latest_build_statusObject



48
49
50
# File 'lib/circle_status/script.rb', line 48

def latest_build_status
  latest_build['status']
end

#latest_build_urlObject



52
53
54
# File 'lib/circle_status/script.rb', line 52

def latest_build_url
  latest_build['build_url']
end

#origin_remoteObject



88
89
90
# File 'lib/circle_status/script.rb', line 88

def origin_remote
  @origin_remote ||= git.remotes.find { |r| r.name == 'origin' }
end

#pending_buildsObject



44
45
46
# File 'lib/circle_status/script.rb', line 44

def pending_builds
  @builds.select { |build| build['outcome'].nil? }
end

#remote_urlObject



84
85
86
# File 'lib/circle_status/script.rb', line 84

def remote_url
  origin_remote.url
end

#repo_nameObject



80
81
82
# File 'lib/circle_status/script.rb', line 80

def repo_name
  remote_url[/.+\/(?<repo>.+).git/, :repo]
end

#runObject



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/circle_status/script.rb', line 3

def run
  config

  puts "Status: #{latest_build_status.upcase.white}"
  puts "Successes: #{successes.size.to_s.green}"
  puts "Failures: #{failures.size.to_s.red}"
  puts "Failing specs: #{failing_files.join(' ').red}"
  puts "Details: #{latest_build_url}"
  puts
  puts "Pending builds: #{pending_builds.size}"
  pending_builds.map do |pending|
    puts " - #{pending['status']}: #{pending['build_url']}"
  end
rescue ProjectError => e
  puts "Circle Status failure: #{e.message}"
end

#split_testsObject



68
69
70
# File 'lib/circle_status/script.rb', line 68

def split_tests
  @split_tests ||= tests['tests'].partition { |test| test['result'] != 'failure' }
end

#successesObject



60
61
62
# File 'lib/circle_status/script.rb', line 60

def successes
  @sucesses ||= split_tests.first
end

#testsObject



56
57
58
# File 'lib/circle_status/script.rb', line 56

def tests
  @tests ||= CircleCi::Build.tests(user_name, repo_name, latest_build['build_num']).body
end

#user_nameObject



76
77
78
# File 'lib/circle_status/script.rb', line 76

def user_name
  remote_url[/github.com[\/:](?<user>.+)?\//, :user]
end