Class: CircleStatus::Script

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

Instance Method Summary collapse

Instance Method Details

#branchObject



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

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



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

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

#failuresObject



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

def failures
  @failures ||= split_tests.last
end

#gitObject



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

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

#latest_buildObject



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

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

#latest_build_statusObject



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

def latest_build_status
  latest_build['status']
end

#latest_build_urlObject



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

def latest_build_url
  latest_build['build_url']
end

#origin_remoteObject



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

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

#pending_buildsObject



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

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

#remote_urlObject



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

def remote_url
  origin_remote.url
end

#repo_nameObject



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

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



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

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

#successesObject



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

def successes
  @sucesses ||= split_tests.first
end

#testsObject



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

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

#user_nameObject



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

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