travis 1.0.3 → 1.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.
Files changed (48) hide show
  1. data/README.md +786 -86
  2. data/Rakefile +3 -0
  3. data/lib/travis/cli/api_command.rb +22 -0
  4. data/lib/travis/cli/command.rb +36 -15
  5. data/lib/travis/cli/console.rb +13 -0
  6. data/lib/travis/cli/disable.rb +13 -0
  7. data/lib/travis/cli/enable.rb +29 -0
  8. data/lib/travis/cli/encrypt.rb +17 -4
  9. data/lib/travis/cli/history.rb +43 -0
  10. data/lib/travis/cli/logs.rb +18 -0
  11. data/lib/travis/cli/open.rb +36 -0
  12. data/lib/travis/cli/parser.rb +3 -3
  13. data/lib/travis/cli/repo_command.rb +16 -1
  14. data/lib/travis/cli/restart.rb +14 -0
  15. data/lib/travis/cli/show.rb +50 -0
  16. data/lib/travis/cli/status.rb +17 -0
  17. data/lib/travis/cli/sync.rb +28 -0
  18. data/lib/travis/cli/whatsup.rb +16 -0
  19. data/lib/travis/cli.rb +11 -0
  20. data/lib/travis/client/artifact.rb +25 -0
  21. data/lib/travis/client/build.rb +41 -0
  22. data/lib/travis/client/commit.rb +26 -0
  23. data/lib/travis/client/entity.rb +47 -3
  24. data/lib/travis/client/job.rb +52 -0
  25. data/lib/travis/client/methods.rb +22 -1
  26. data/lib/travis/client/repository.rb +70 -5
  27. data/lib/travis/client/session.rb +40 -8
  28. data/lib/travis/client/states.rb +85 -0
  29. data/lib/travis/client/user.rb +6 -0
  30. data/lib/travis/client.rb +5 -0
  31. data/lib/travis/tools/formatter.rb +38 -0
  32. data/lib/travis/version.rb +1 -1
  33. data/spec/cli/encrypt_spec.rb +16 -1
  34. data/spec/cli/history_spec.rb +28 -0
  35. data/spec/cli/logs_spec.rb +8 -0
  36. data/spec/cli/open_spec.rb +33 -0
  37. data/spec/cli/restart_spec.rb +15 -0
  38. data/spec/cli/show_spec.rb +9 -0
  39. data/spec/cli/status_spec.rb +28 -0
  40. data/spec/client/build_spec.rb +31 -0
  41. data/spec/client/commit_spec.rb +18 -0
  42. data/spec/client/job_spec.rb +30 -0
  43. data/spec/client/repository_spec.rb +15 -0
  44. data/spec/client/session_spec.rb +4 -0
  45. data/spec/spec_helper.rb +4 -1
  46. data/spec/support/fake_api.rb +616 -1
  47. data/travis.gemspec +37 -3
  48. metadata +66 -2
data/Rakefile CHANGED
@@ -17,6 +17,9 @@ task 'travis.gemspec' do
17
17
  :files => `git ls-files`.split("\n").reject { |f| f =~ /^(\.|Gemfile)/ }
18
18
  }
19
19
 
20
+ # :(
21
+ fields[:email].delete("konstantin.haase@gmail.com")
22
+
20
23
  # insert data
21
24
  fields.each do |field, values|
22
25
  updated = " s.#{field} = ["
@@ -12,6 +12,13 @@ module Travis
12
12
  on('--org', "short-cut for --api-endpoint '#{Travis::Client::ORG_URI}'") { |c,_| c.api_endpoint = Travis::Client::ORG_URI }
13
13
  on('-t', '--token [ACCESS_TOKEN]', 'access token to use') { |c, t| c.access_token = t }
14
14
 
15
+ on('--debug', 'show API requests') do |c,_|
16
+ c.session.instrument do |info, request|
17
+ c.debug(info)
18
+ request.call
19
+ end
20
+ end
21
+
15
22
  def initialize(*)
16
23
  @session = Travis::Client.new
17
24
  super
@@ -44,6 +51,21 @@ module Travis
44
51
  error "not logged in, please run #{command("login#{endpoint_option}")}" if access_token.nil?
45
52
  end
46
53
 
54
+ def sync(block = true, dot = '.')
55
+ user.sync
56
+
57
+ steps = count = 1
58
+ while block and user.reload.syncing?
59
+ count += 1
60
+ sleep(1)
61
+
62
+ if count % steps == 0
63
+ steps = count/10 + 1
64
+ output.print dot
65
+ end
66
+ end
67
+ end
68
+
47
69
  private
48
70
 
49
71
  def detected_endpoint
@@ -1,4 +1,6 @@
1
1
  require 'travis/cli'
2
+ require 'travis/tools/formatter'
3
+
2
4
  require 'highline'
3
5
  require 'forwardable'
4
6
  require 'delegate'
@@ -11,13 +13,14 @@ module Travis
11
13
  extend Forwardable
12
14
  def_delegators :terminal, :agree, :ask, :choose
13
15
 
14
- HighLine.use_color = !CLI.windows?
16
+ HighLine.use_color = !CLI.windows? && $stdin.tty?
15
17
  HighLine.color_scheme = HighLine::ColorScheme.new do |cs|
16
18
  cs[:command] = [ :bold ]
17
19
  cs[:error] = [ :red ]
18
20
  cs[:important] = [ :bold, :underline ]
19
21
  cs[:success] = [ :green ]
20
22
  cs[:info] = [ :yellow ]
23
+ cs[:debug] = [ :magenta ]
21
24
  end
22
25
 
23
26
  on('-h', '--help', 'Display help') do |c, _|
@@ -26,6 +29,7 @@ module Travis
26
29
  end
27
30
 
28
31
  on('-i', '--[no-]interactive', "be interactive and colorful") do |c, v|
32
+ HighLine.use_color = v unless CLI.windows?
29
33
  c.force_interactive = v
30
34
  end
31
35
 
@@ -48,12 +52,13 @@ module Travis
48
52
  define_method(name) {}
49
53
  end
50
54
 
51
- attr_accessor :arguments, :config, :terminal, :force_interactive
55
+ attr_accessor :arguments, :config, :terminal, :force_interactive, :formatter
52
56
 
53
57
  def initialize(options = {})
54
- @output = SimpleDelegator.new($stdout)
55
- @input = SimpleDelegator.new($stdin)
56
- @terminal = HighLine.new(@input, @output)
58
+ @formatter = Travis::Tools::Formatter.new
59
+ @output = SimpleDelegator.new($stdout)
60
+ @input = SimpleDelegator.new($stdin)
61
+ @terminal = HighLine.new(@input, @output)
57
62
  options.each do |key, value|
58
63
  public_send("#{key}=", value) if respond_to? "#{key}="
59
64
  end
@@ -109,7 +114,7 @@ module Travis
109
114
  end
110
115
 
111
116
  def usage
112
- usage = "#$0 #{command_name} [options]"
117
+ usage = "#$0 #{command_name}"
113
118
  method = method(:run)
114
119
  if method.respond_to? :parameters
115
120
  method.parameters.each do |type, name|
@@ -117,9 +122,10 @@ module Travis
117
122
  name = "[#{name}..]" if type == :rest
118
123
  usage << " #{name}"
119
124
  end
120
- else
125
+ elsif method.arity != 0
121
126
  usage << " ..."
122
127
  end
128
+ usage << " [options]"
123
129
  "Usage: " << color(usage, :command)
124
130
  end
125
131
 
@@ -128,20 +134,31 @@ module Travis
128
134
  parser.to_s
129
135
  end
130
136
 
131
- def say(data, format = nil)
132
- data = format % color(data, :important) if format and interactive?
133
- terminal.say data.gsub(/<\[\[/, '<%=').gsub(/\]\]>/, '%>')
137
+ def say(data, format = nil, style = nil)
138
+ terminal.say format(data, format, style)
139
+ end
140
+
141
+ def debug(line)
142
+ write_to($stderr) do
143
+ say color("** #{line}", :debug)
144
+ end
134
145
  end
135
146
 
136
147
  private
137
148
 
149
+ def format(data, format = nil, style = nil)
150
+ style ||= :important
151
+ data = format % color(data, style) if format and interactive?
152
+ data = data.gsub(/<\[\[/, '<%=').gsub(/\]\]>/, '%>')
153
+ end
154
+
138
155
  def template(file)
139
156
  File.read(file).split('__END__', 2)[1].strip
140
157
  end
141
158
 
142
- def color(line, *args)
159
+ def color(line, style)
143
160
  return line unless interactive?
144
- terminal.color(line, *args)
161
+ terminal.color(line, Array(style).map(&:to_sym))
145
162
  end
146
163
 
147
164
  def interactive?(io = output)
@@ -153,14 +170,18 @@ module Travis
153
170
  say "\n"
154
171
  end
155
172
 
156
- def error(message)
173
+ def warn(message)
157
174
  write_to($stderr) do
158
175
  say color(message, :error)
159
176
  yield if block_given?
160
- exit 1
161
177
  end
162
178
  end
163
179
 
180
+ def error(message, &block)
181
+ warn(message, &block)
182
+ exit 1
183
+ end
184
+
164
185
  def command(name)
165
186
  color("#$0 #{name}", :command)
166
187
  end
@@ -197,7 +218,7 @@ module Travis
197
218
  return unless method.respond_to? :parameters
198
219
  method.parameters.each do |type, name|
199
220
  return if type == :rest
200
- wrong_args("few") unless args.shift or type == :opt
221
+ wrong_args("few") unless args.shift or type == :opt or type == :block
201
222
  end
202
223
  wrong_args("many") if args.any?
203
224
  end
@@ -0,0 +1,13 @@
1
+ require 'travis/cli'
2
+ require 'pry'
3
+
4
+ module Travis
5
+ module CLI
6
+ class Console < ApiCommand
7
+ def run
8
+ Object.send(:include, Client::Namespace.new(session))
9
+ binding.pry(:quiet => true, :prompt => Pry::SIMPLE_PROMPT)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'travis/cli'
2
+
3
+ module Travis
4
+ module CLI
5
+ class Disable < RepoCommand
6
+ def run
7
+ authenticate
8
+ repository.enable
9
+ say "disabled", color("#{slug}: %s :(", :error)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,29 @@
1
+ require 'travis/cli'
2
+
3
+ module Travis
4
+ module CLI
5
+ class Enable < RepoCommand
6
+ on('-s', '--skip-sync', "don't trigger a sync if the repo is unknown")
7
+
8
+ def run
9
+ authenticate
10
+ repository.enable
11
+ say "enabled", color("#{slug}: %s :)", :success)
12
+ end
13
+
14
+ private
15
+
16
+ def repository
17
+ repo(slug)
18
+ rescue Travis::Client::NotFound
19
+ unless skip_sync?
20
+ say "repository not known to Travis CI (or no access?)"
21
+ say "triggering sync: "
22
+ sync
23
+ say " done"
24
+ end
25
+ super
26
+ end
27
+ end
28
+ end
29
+ end
@@ -11,7 +11,16 @@ module Travis
11
11
  c.config_key = value || 'env.global'
12
12
  end
13
13
 
14
+ on('-s', '--[no-]split', 'treat each line as a separate input')
15
+
14
16
  def run(*args)
17
+ if args.first =~ %r{\w+/\w+}
18
+ warn "WARNING: The name of the repository is now passed to the command with the -r option:"
19
+ warn " #{command("encrypt [...] -r #{args.first}")}"
20
+ warn " If you tried to pass the name of the repository as the first argument, you"
21
+ warn " probably won't get the results you wanted.\n"
22
+ end
23
+
15
24
  data = args.join(" ")
16
25
 
17
26
  if data.empty?
@@ -19,17 +28,21 @@ module Travis
19
28
  data = $stdin.read
20
29
  end
21
30
 
22
- encrypted = repository.encrypt(data)
31
+ data = split? ? data.split("\n") : [data]
32
+ encrypted = data.map { |data| repository.encrypt(data) }
23
33
 
24
34
  if config_key
25
35
  travis_config = YAML.load_file(travis_yaml)
26
36
  keys = config_key.split('.')
27
37
  last_key = keys.pop
28
38
  nested_config = keys.inject(travis_config) { |c,k| c[k] ||= {}}
29
- nested_config[last_key] ||= [] << { 'secret' => encrypted }
39
+ encrypted.each do |encrypted|
40
+ nested_config[last_key] ||= [] << { 'secure' => encrypted }
41
+ end
30
42
  File.write(travis_yaml, travis_config.to_yaml)
31
43
  else
32
- say encrypted.inspect, template(__FILE__)
44
+ list = encrypted.map { |data| format(data.inspect, " secure: %s") }
45
+ say(list.join("\n"), template(__FILE__), :none)
33
46
  end
34
47
  end
35
48
 
@@ -51,7 +64,7 @@ end
51
64
  __END__
52
65
  Please add the following to your <[[ color('.travis.yml', :info) ]]> file:
53
66
 
54
- secure: %s
67
+ %s
55
68
 
56
69
  Pro Tip<[[ "™" unless Travis::CLI.windows? ]]>: You can add it automatically by running with <[[ color('--add', :info) ]]>.
57
70
 
@@ -0,0 +1,43 @@
1
+ require 'travis/cli'
2
+
3
+ module Travis
4
+ module CLI
5
+ class History < RepoCommand
6
+ on('-a', '--after BUILD', 'Only show history after a given build number')
7
+ on('-p', '--pull-request NUMBER', 'Only show history for the given Pull Request')
8
+ on('-b', '--branch BRANCH', 'Only show history for the given branch')
9
+ on('-l', '--limit LIMIT', 'Maximum number of history items')
10
+ on('--[no-]all', 'Display all history items')
11
+
12
+ def run
13
+ countdown = Integer(limit || 10) unless all?
14
+ params = { :after_number => after } if after
15
+ repository.each_build(params) do |build|
16
+ next unless display? build
17
+ display(build)
18
+
19
+ if countdown
20
+ countdown -= 1
21
+ break if countdown < 1
22
+ end
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def display?(build)
29
+ return build.pr_number == pull_request if pull_request
30
+ return build.branch_info == branch if branch
31
+ true
32
+ end
33
+
34
+ def display(build)
35
+ say [
36
+ color("##{build.number} #{build.state}:".ljust(14), [build.color, :bold]),
37
+ color("#{build.branch_info} ", :info),
38
+ build.commit.subject
39
+ ].join
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,18 @@
1
+ require 'travis/cli'
2
+
3
+ module Travis
4
+ module CLI
5
+ class Logs < RepoCommand
6
+ def run(number = last_build.number)
7
+ error "##{number} is not a job" unless job = job(number)
8
+ say log(job)
9
+ end
10
+
11
+ private
12
+
13
+ def log(job)
14
+ interactive? ? job.log.colorized_body : job.log.clean_body
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,36 @@
1
+ require 'travis/cli'
2
+ require 'launchy'
3
+
4
+ module Travis
5
+ module CLI
6
+ class Open < RepoCommand
7
+ on('-g', '--github', 'Open the corresponding project, compare view or pull request on GitHub')
8
+ on('-p', '--print', 'Print out the URL instead of opening it in a browser')
9
+
10
+ def run(number = nil)
11
+ url = url_for(number)
12
+ if print?
13
+ say url, "web view: %s"
14
+ else
15
+ Launchy.open(url)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def url_for(number)
22
+ return repo_url unless number
23
+ entity = job(number) || build(number)
24
+ github ? entity.commit.compare_url : "#{repo_url}/#{entity.class.many}/#{entity.id}"
25
+ end
26
+
27
+ def repo_url
28
+ "https://#{host}/#{slug}"
29
+ end
30
+
31
+ def host
32
+ github ? "github.com" : session.config['host']
33
+ end
34
+ end
35
+ end
36
+ end
@@ -18,9 +18,9 @@ module Travis
18
18
  block ||= begin
19
19
  full_arg = args.detect { |a| a.start_with? '--' }
20
20
  name = full_arg.gsub(/^--(\[no-\])?(\S+).*$/, '\2').gsub('-', '_')
21
- attr_reader(name) unless method_defined? name
22
- attr_writer(name) unless method_defined? "#{name}="
23
- alias_method("#{name}?", name) if full_arg.start_with? '--[no-]' and not method_defined? "#{name}?"
21
+ attr_reader(name) unless method_defined? name
22
+ attr_writer(name) unless method_defined? "#{name}="
23
+ alias_method("#{name}?", name) unless method_defined? "#{name}?"
24
24
  proc { |instance, value| instance.public_send("#{name}=", value) }
25
25
  end
26
26
 
@@ -13,16 +13,31 @@ module Travis
13
13
  error "Can't figure out GitHub repo name. Are you in the right directory?" unless self.slug ||= find_slug
14
14
  self.api_endpoint = detect_api_endpoint
15
15
  super
16
+ repository.load # makes sure we actually have access to the repo
16
17
  end
17
18
 
18
19
  def repository
19
20
  repo(slug)
20
21
  rescue Travis::Client::NotFound
21
- error "repository not known to travis: #{color(slug, :important)}"
22
+ error "repository not known to #{api_endpoint}: #{color(slug, :important)}"
22
23
  end
23
24
 
24
25
  private
25
26
 
27
+ def build(number_or_id)
28
+ return super if number_or_id.is_a? Integer
29
+ repository.build(number_or_id)
30
+ end
31
+
32
+ def job(number_or_id)
33
+ return super if number_or_id.is_a? Integer
34
+ repository.job(number_or_id)
35
+ end
36
+
37
+ def last_build
38
+ repository.last_build or error("no build yet for #{slug}")
39
+ end
40
+
26
41
  def detected_endpoint?
27
42
  !explicit_api_endpoint?
28
43
  end
@@ -0,0 +1,14 @@
1
+ require 'travis/cli'
2
+
3
+ module Travis
4
+ module CLI
5
+ class Restart < RepoCommand
6
+ def run(number = last_build.number)
7
+ entity = job(number) || build(number)
8
+ entity.restart
9
+
10
+ say "restarted", "#{entity.class.one} ##{entity.number} has been %s"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,50 @@
1
+ require 'travis/cli'
2
+
3
+ module Travis
4
+ module CLI
5
+ class Show < RepoCommand
6
+ def run(number = last_build.number)
7
+ entity = job(number) || build(number)
8
+
9
+ say template(__FILE__) % [
10
+ entity.class.one.capitalize,
11
+ entity.number,
12
+ entity.commit.subject,
13
+ entity.state,
14
+ entity.color,
15
+ entity.pull_request? ? "pull request" : "push",
16
+ entity.commit.compare_url,
17
+ formatter.duration(entity.duration),
18
+ formatter.time(entity.started_at),
19
+ formatter.time(entity.finished_at)
20
+ ]
21
+
22
+ if entity.respond_to? :jobs
23
+ empty_line
24
+ entity.jobs.each do |job|
25
+ say [
26
+ color("##{job.number} #{job.state}:".ljust(16), [job.color, :bold]),
27
+ formatter.duration(job.duration).ljust(14),
28
+ formatter.job_config(job.config),
29
+ (color("(failure allowed)", :info) if job.allow_failures?)
30
+ ].compact.join(" ").rstrip
31
+ end
32
+ else
33
+ config = formatter.job_config(entity.config)
34
+ say color("Allow Failure: ", :info) + entity.allow_failures?.inspect
35
+ say color("Config: ", :info) + config unless config.empty?
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ __END__
43
+
44
+ <[[ color("%s #%s: %s", :bold) ]]>
45
+ <[[ color("State: ", :info) ]]><[[ color(%p, :%s) ]]>
46
+ <[[ color("Type: ", :info) ]]>%s
47
+ <[[ color("Compare URL: ", :info) ]]>%s
48
+ <[[ color("Duration: ", :info) ]]>%s
49
+ <[[ color("Started: ", :info) ]]>%s
50
+ <[[ color("Finished: ", :info) ]]>%s
@@ -0,0 +1,17 @@
1
+ require 'travis/cli'
2
+
3
+ module Travis
4
+ module CLI
5
+ class Status < RepoCommand
6
+ on '-x', '--[no-]exit-code', 'sets the exit code to 1 if the build failed'
7
+ on '-q', '--[no-]quiet', 'does not print anything'
8
+ on '-p', '--[no-]fail-pending', 'sets the status code to 1 if the build is pending'
9
+
10
+ def run
11
+ say color(last_build.state, last_build.color), "build ##{last_build.number} %s" unless quiet?
12
+ exit 1 if exit_code? and last_build.unsuccessful?
13
+ exit 1 if fail_pending? and last_build.pending?
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,28 @@
1
+ require 'travis/cli'
2
+
3
+ module Travis
4
+ module CLI
5
+ class Sync < ApiCommand
6
+ on '-c', '--check', 'only check the sync status'
7
+ on '-b', '--background', 'will trigger sync but not block until sync is done'
8
+ on '-f', '--force', 'will force sync, even if one is already running'
9
+
10
+ def run
11
+ authenticate
12
+
13
+ if check?
14
+ say "#{"not " unless user.syncing?}syncing", "#{user.login} is currently %s"
15
+ elsif user.syncing? and not force?
16
+ error "user is already syncing"
17
+ elsif background?
18
+ say "starting synchronization"
19
+ sync(false)
20
+ else
21
+ say "synchronizing: "
22
+ sync
23
+ say color(" done", :success)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,16 @@
1
+ require 'travis/cli'
2
+
3
+ module Travis
4
+ module CLI
5
+ class Whatsup < ApiCommand
6
+ def run
7
+ repos.each do |repo|
8
+ say [
9
+ color(repo.slug, [:bold, repo.color]),
10
+ color("#{repo.last_build.state}: ##{repo.last_build.number}", repo.color)
11
+ ].join(" ")
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
data/lib/travis/cli.rb CHANGED
@@ -16,14 +16,25 @@ module Travis
16
16
  module CLI
17
17
  autoload :ApiCommand, 'travis/cli/api_command'
18
18
  autoload :Command, 'travis/cli/command'
19
+ autoload :Console, 'travis/cli/console'
20
+ autoload :Disable, 'travis/cli/disable'
21
+ autoload :Enable, 'travis/cli/enable'
19
22
  autoload :Encrypt, 'travis/cli/encrypt'
20
23
  autoload :Endpoint, 'travis/cli/endpoint'
21
24
  autoload :Help, 'travis/cli/help'
25
+ autoload :History, 'travis/cli/history'
22
26
  autoload :Login, 'travis/cli/login'
27
+ autoload :Logs, 'travis/cli/logs'
28
+ autoload :Open, 'travis/cli/open'
23
29
  autoload :Parser, 'travis/cli/parser'
24
30
  autoload :Raw, 'travis/cli/raw'
25
31
  autoload :RepoCommand, 'travis/cli/repo_command'
32
+ autoload :Restart, 'travis/cli/restart'
33
+ autoload :Show, 'travis/cli/show'
34
+ autoload :Status, 'travis/cli/status'
35
+ autoload :Sync, 'travis/cli/sync'
26
36
  autoload :Version, 'travis/cli/version'
37
+ autoload :Whatsup, 'travis/cli/whatsup'
27
38
  autoload :Whoami, 'travis/cli/whoami'
28
39
 
29
40
  extend self
@@ -0,0 +1,25 @@
1
+ require 'travis/client'
2
+
3
+ module Travis
4
+ module Client
5
+ class Artifact < Entity
6
+ # @!parse attr_reader :job_id, :type, :body
7
+ attributes :job_id, :type, :body
8
+
9
+ # @!parse attr_reader :job
10
+ has :job
11
+
12
+ def colorized_body
13
+ attributes['colorized_body'] ||= body.gsub(/[^[:print:]\e\n]/, '')
14
+ end
15
+
16
+ def clean_body
17
+ attributes['clean_body'] ||= colorized_body.gsub(/\e[^m]+m/, '')
18
+ end
19
+
20
+ one :artifact
21
+ many :artifacts
22
+ aka :log
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,41 @@
1
+ require 'travis/client'
2
+
3
+ module Travis
4
+ module Client
5
+ class Build < Entity
6
+ include States
7
+
8
+ # @!parse attr_reader :repository_id, :commit_id, :number, :pull_request, :config, :state, :started_at, :finished_at, :duration, :job_ids
9
+ attributes :repository_id, :commit_id, :number, :pull_request, :config, :state, :started_at, :finished_at, :duration, :job_ids
10
+ time :started_at, :finished_at
11
+
12
+ alias pull_request? pull_request
13
+
14
+ # @!parse attr_reader :repository, :commit, :jobs
15
+ has :repository, :commit, :jobs
16
+
17
+ one :build
18
+ many :builds
19
+
20
+ def restart
21
+ session.restart(self)
22
+ end
23
+
24
+ def push?
25
+ not pull_request?
26
+ end
27
+
28
+ def pr_number
29
+ commit.compare_url[/\d+$/] if pull_request?
30
+ end
31
+
32
+ def branch_info
33
+ pull_request? ? "Pull Request ##{pr_number}" : commit.branch
34
+ end
35
+
36
+ def inspect_info
37
+ "#{repository.slug}##{number}"
38
+ end
39
+ end
40
+ end
41
+ end