circleci-cli 0.6.3 → 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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +21 -19
  4. data/bin/circle +2 -2
  5. data/bin/console +1 -1
  6. data/{circler.gemspec → circleci-cli.gemspec} +3 -3
  7. data/exe/{circle → circleci-cli} +2 -2
  8. data/lib/circleci/cli.rb +77 -0
  9. data/lib/circleci/cli/command.rb +16 -0
  10. data/lib/circleci/cli/command/base_command.rb +45 -0
  11. data/lib/circleci/cli/command/browse_command.rb +24 -0
  12. data/lib/circleci/cli/command/build_command.rb +19 -0
  13. data/lib/circleci/cli/command/builds_command.rb +25 -0
  14. data/lib/circleci/cli/command/cancel_command.rb +23 -0
  15. data/lib/circleci/cli/command/projects_command.rb +16 -0
  16. data/lib/circleci/cli/command/retry_command.rb +23 -0
  17. data/lib/circleci/cli/command/watch_command.rb +77 -0
  18. data/lib/circleci/cli/networking.rb +9 -0
  19. data/lib/circleci/cli/networking/pusher_client.rb +62 -0
  20. data/lib/circleci/cli/printer.rb +11 -0
  21. data/lib/circleci/cli/printer/build_printer.rb +63 -0
  22. data/lib/circleci/cli/printer/project_printer.rb +37 -0
  23. data/lib/circleci/cli/printer/step_printer.rb +57 -0
  24. data/lib/circleci/cli/response.rb +13 -0
  25. data/lib/circleci/cli/response/account.rb +21 -0
  26. data/lib/circleci/cli/response/action.rb +39 -0
  27. data/lib/circleci/cli/response/build.rb +104 -0
  28. data/lib/circleci/cli/response/project.rb +21 -0
  29. data/lib/circleci/cli/response/step.rb +22 -0
  30. data/lib/circleci/cli/version.rb +7 -0
  31. data/lib/circleci_cli.rb +7 -0
  32. metadata +29 -25
  33. data/lib/circler.rb +0 -6
  34. data/lib/circler/cli.rb +0 -88
  35. data/lib/circler/command/base_command.rb +0 -41
  36. data/lib/circler/command/browse_command.rb +0 -20
  37. data/lib/circler/command/build_command.rb +0 -15
  38. data/lib/circler/command/builds_command.rb +0 -21
  39. data/lib/circler/command/cancel_command.rb +0 -19
  40. data/lib/circler/command/projects_command.rb +0 -12
  41. data/lib/circler/command/retry_command.rb +0 -19
  42. data/lib/circler/command/watch_command.rb +0 -73
  43. data/lib/circler/networking/pusher_client.rb +0 -56
  44. data/lib/circler/printer/build_printer.rb +0 -59
  45. data/lib/circler/printer/project_printer.rb +0 -33
  46. data/lib/circler/printer/step_printer.rb +0 -53
  47. data/lib/circler/response/account.rb +0 -17
  48. data/lib/circler/response/action.rb +0 -35
  49. data/lib/circler/response/build.rb +0 -100
  50. data/lib/circler/response/project.rb +0 -17
  51. data/lib/circler/response/step.rb +0 -18
  52. data/lib/circler/version.rb +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d0d7f94b9e9ab370f379d14c0face1967e11968f1b1ada03bb2eb7969094b211
4
- data.tar.gz: b93a93c8c72e496c3dfc17dea23142dec3cd0c14b08bf9228dbcafc7a9dd43aa
3
+ metadata.gz: 5210a33cd66ffb1d7cdf4294653d0a8b0098ad7755689ead6ff50419377937ca
4
+ data.tar.gz: 16e6f04777f3046d6e0c67d3919d39713236da8a2cf9393497cf62b5310a271b
5
5
  SHA512:
6
- metadata.gz: 89894c5a304c926ccc064353e544e80dd5a682fe81e55dc69b9f2c46a09bbb6e386a231022b904a56bccbb21054bba3889a60a3c2b7a4dcf9e3ba9bc1449dc3b
7
- data.tar.gz: 2e962e7dd84b1f06bc703b1702b412ab944fb92b9d880b7dcc7bac4b6346e53af25152a1abfdb133b6c10d48a8ad51140fc1e7c26b4d852da78081645ad75cea
6
+ metadata.gz: 6166152b480e9accfbbb5321496a14b5fa92ea5277c629d4ce96ebbd4b5bfd520a803afebe713fcba873f2945e23f75743e24671155f018f157f7e373a50860f
7
+ data.tar.gz: ec1d2459890466344fc641fad40b0e1375d997ce3979d6babf5259d4227124cd6c0c4976dbcdb7007ea3cfad656bc1218508f76a12edadceecf06b553902840e
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- circleci-cli (0.6.3)
4
+ circleci-cli (1.0.0)
5
5
  circleci (~> 2.0.2)
6
6
  colorize (~> 0.8.1)
7
7
  faraday (>= 0.14, < 0.16)
data/README.md CHANGED
@@ -1,21 +1,23 @@
1
- # Circler
1
+ # circleci-cli
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/circler.svg)](https://badge.fury.io/rb/circler)
4
- [![Circle CI](https://circleci.com/gh/unhappychoice/Circler.svg?style=shield)](https://circleci.com/gh/unhappychoice/Circler)
5
- [![Code Climate](https://codeclimate.com/github/unhappychoice/Circler/badges/gpa.svg)](https://codeclimate.com/github/unhappychoice/Circler)
6
- [![codecov](https://codecov.io/gh/unhappychoice/Circler/branch/master/graph/badge.svg)](https://codecov.io/gh/unhappychoice/Circler)
7
- [![Libraries.io dependency status for GitHub repo](https://img.shields.io/librariesio/github/unhappychoice/Circler.svg)](https://libraries.io/github/unhappychoice/Circler)
8
- ![](http://ruby-gem-downloads-badge.herokuapp.com/circler?type=total)
9
- ![GitHub](https://img.shields.io/github/license/unhappychoice/Circler.svg)
3
+ [![Gem Version](https://badge.fury.io/rb/circleci-cli.svg)](https://badge.fury.io/rb/circleci-cli)
4
+ [![Circle CI](https://circleci.com/gh/unhappychoice/circleci-cli.svg?style=shield)](https://circleci.com/gh/unhappychoice/circleci-cli)
5
+ [![Code Climate](https://codeclimate.com/github/unhappychoice/circleci-cli/badges/gpa.svg)](https://codeclimate.com/github/unhappychoice/circleci-cli)
6
+ [![codecov](https://codecov.io/gh/unhappychoice/circleci-cli/branch/master/graph/badge.svg)](https://codecov.io/gh/unhappychoice/circleci-cli)
7
+ [![Libraries.io dependency status for GitHub repo](https://img.shields.io/librariesio/github/unhappychoice/circleci-cli.svg)](https://libraries.io/github/unhappychoice/circleci-cli)
8
+ ![](http://ruby-gem-downloads-badge.herokuapp.com/circleci-cli?type=total)
9
+ ![GitHub](https://img.shields.io/github/license/unhappychoice/circleci-cli.svg)
10
10
 
11
- Circler is a CLI tool for [Circle CI](https://circleci.com).
11
+ circleci-cli is a CLI tool for [Circle CI](https://circleci.com).
12
12
 
13
13
  ![sample.gif](https://github.com/unhappychoice/circler/raw/master/movie/rec.gif)
14
14
 
15
+ Notice: This gem is renamed from `circler` to `circleci-cli` on 2019/09/22
16
+
15
17
  ## Installation
16
18
 
17
19
  ```sh
18
- $ gem install circler
20
+ $ gem install circleci-cli
19
21
  ```
20
22
 
21
23
  set the `CIRCLE_CI_TOKEN` environment variable. (optional)
@@ -27,14 +29,14 @@ export CIRCLE_CI_TOKEN=your-circle-ci-token
27
29
  ## Usage
28
30
  ```
29
31
  Commands:
30
- circle browse # open circle ci website
31
- circle build # show build description
32
- circle builds # list builds
33
- circle help [COMMAND] # describe available commands or one specific command
34
- circle projects # list projects
35
- circle retry # retry a build
36
- circle version # show gem version
37
- circle watch # watch a build in real time
32
+ circleci-cli browse # open circle ci website
33
+ circleci-cli build # show build description
34
+ circleci-cli builds # list builds
35
+ circleci-cli help [COMMAND] # describe available commands or one specific command
36
+ circleci-cli projects # list projects
37
+ circleci-cli retry # retry a build
38
+ circleci-cli version # show gem version
39
+ circleci-cli watch # watch a build in real time
38
40
 
39
41
  Options:
40
42
  -p user_name/project # specify repository
@@ -44,7 +46,7 @@ Options:
44
46
 
45
47
  ## Contributing
46
48
 
47
- Bug reports and pull requests are welcome on GitHub at https://github.com/unhappychoice/circler.
49
+ Bug reports and pull requests are welcome on GitHub at https://github.com/unhappychoice/circleci-cli.
48
50
 
49
51
  ## License
50
52
 
data/bin/circle CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'circler'
4
+ require 'circleci_cli'
5
5
 
6
- Circler::CLI.start
6
+ CircleCI::CLI::Runner.start
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'bundler/setup'
5
- require 'circler'
5
+ require 'circleci-cli'
6
6
 
7
7
  # You can add fixtures and/or initialization code here to make experimenting
8
8
  # with your gem easier. You can also use a different console, if you like.
@@ -2,7 +2,7 @@
2
2
 
3
3
  lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'circler/version'
5
+ require 'circleci/cli/version'
6
6
 
7
7
  def production_dependency(spec)
8
8
  spec.add_dependency 'circleci', '~> 2.0.2'
@@ -37,13 +37,13 @@ end
37
37
 
38
38
  Gem::Specification.new do |spec|
39
39
  spec.name = 'circleci-cli'
40
- spec.version = Circler::VERSION
40
+ spec.version = CircleCI::CLI::VERSION
41
41
  spec.authors = ['unhappychoice']
42
42
  spec.email = ['unhappychoice@gmail.com']
43
43
 
44
44
  spec.summary = 'CLI tool for CircleCI'
45
45
  spec.description = 'A command line tool for CircleCI'
46
- spec.homepage = 'https://github.com/unhappychoice/circler'
46
+ spec.homepage = 'https://github.com/unhappychoice/circleci-cli'
47
47
  spec.license = 'MIT'
48
48
  spec.files = project_files
49
49
  spec.bindir = 'exe'
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'circler'
4
+ require 'circleci_cli'
5
5
 
6
- Circler::CLI.start
6
+ CircleCI::CLI::Runner.start
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor'
4
+ require 'faraday'
5
+ require 'launchy'
6
+ require 'terminal-table'
7
+ require 'highline/import'
8
+ require 'colorize'
9
+ require 'rugged'
10
+ require 'circleci'
11
+ require 'terminal-notifier'
12
+
13
+ require 'circleci/cli/version'
14
+ require 'circleci/cli/command'
15
+ require 'circleci/cli/response'
16
+ require 'circleci/cli/printer'
17
+ require 'circleci/cli/networking'
18
+
19
+ module CircleCI
20
+ module CLI
21
+ class Runner < Thor
22
+ desc 'projects', 'list projects'
23
+ method_option :format, aliases: 'f', type: :string, banner: 'pretty/simple'
24
+ def projects
25
+ Command::ProjectsCommand.run(options)
26
+ end
27
+
28
+ desc 'builds', 'list builds'
29
+ method_option :project, aliases: 'p', type: :string, banner: 'user/project'
30
+ method_option :branch, aliases: 'b', type: :string, banner: 'some-branch'
31
+ method_option :format, aliases: 'f', type: :string, banner: 'pretty/simple'
32
+ def builds
33
+ Command::BuildsCommand.run(options)
34
+ end
35
+
36
+ desc 'build', 'show build description'
37
+ method_option :project, aliases: 'p', type: :string, banner: 'user/project'
38
+ method_option :build, aliases: 'n', type: :numeric, banner: 'build-number'
39
+ def build
40
+ Command::BuildCommand.run(options)
41
+ end
42
+
43
+ desc 'browse', 'open circle ci website'
44
+ method_option :project, aliases: 'p', type: :string, banner: 'user/project'
45
+ method_option :build, aliases: 'n', type: :numeric, banner: 'build-number'
46
+ def browse
47
+ Command::BrowseCommand.run(options)
48
+ end
49
+
50
+ desc 'retry', 'retry a build'
51
+ method_option :project, aliases: 'p', type: :string, banner: 'user/project'
52
+ method_option :build, aliases: 'n', type: :numeric, banner: 'build-number'
53
+ def retry
54
+ Command::RetryCommand.run(options)
55
+ end
56
+
57
+ desc 'cancel', 'cancel a build'
58
+ method_option :project, aliases: 'p', type: :string, banner: 'user/project'
59
+ method_option :build, aliases: 'n', type: :numeric, banner: 'build-number'
60
+ def cancel
61
+ Command::CancelCommand.run(options)
62
+ end
63
+
64
+ desc 'watch', 'watch a build in real time'
65
+ method_option :project, aliases: 'p', type: :string, banner: 'user/project'
66
+ method_option :build, aliases: 'n', type: :numeric, banner: 'build-number'
67
+ def watch
68
+ Command::WatchCommand.run(options)
69
+ end
70
+
71
+ desc 'version', 'show gem version'
72
+ def version
73
+ say CircleCI::CLI::VERSION
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'circleci/cli/command/base_command'
4
+ require 'circleci/cli/command/projects_command'
5
+ require 'circleci/cli/command/builds_command'
6
+ require 'circleci/cli/command/build_command'
7
+ require 'circleci/cli/command/browse_command'
8
+ require 'circleci/cli/command/watch_command'
9
+ require 'circleci/cli/command/retry_command'
10
+ require 'circleci/cli/command/cancel_command'
11
+
12
+ module CircleCI
13
+ module CLI
14
+ module Command; end
15
+ end
16
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CircleCI
4
+ module CLI
5
+ module Command
6
+ class BaseCommand
7
+ class << self
8
+ def setup_token
9
+ CircleCi.configure do |config|
10
+ config.token = ENV['CIRCLE_CI_TOKEN'] || ask('Circle CI token ? :')
11
+ end
12
+ end
13
+
14
+ def project_name(options)
15
+ if options.project
16
+ options.project
17
+ elsif reponame
18
+ reponame
19
+ else
20
+ say Printer::ProjectPrinter.new(Response::Project.all).to_s
21
+ ask('Input user-name/project-name :')
22
+ end
23
+ end
24
+
25
+ def reponame
26
+ repository = Rugged::Repository.new('.')
27
+ origin = repository.remotes.find { |r| r.name == 'origin' }
28
+ regexp = %r{git@github.com(?::|/)([\w_-]+/[\w_-]+)(?:\.git)*}
29
+ return Regexp.last_match(1) if origin.url =~ regexp
30
+
31
+ nil
32
+ end
33
+
34
+ def build_number(options)
35
+ options.build || ask('Input build number')
36
+ end
37
+
38
+ def should_be_pretty(options)
39
+ options['format'] != 'simple'
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CircleCI
4
+ module CLI
5
+ module Command
6
+ class BrowseCommand < BaseCommand
7
+ class << self
8
+ def run(options)
9
+ setup_token
10
+ project = project_name(options)
11
+ number = options.build
12
+ Launchy.open url(project, number)
13
+ end
14
+
15
+ def url(project, number)
16
+ return "https://circleci.com/gh/#{project}" unless number
17
+
18
+ "https://circleci.com/gh/#{project}/#{number}"
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CircleCI
4
+ module CLI
5
+ module Command
6
+ class BuildCommand < BaseCommand
7
+ class << self
8
+ def run(options)
9
+ setup_token
10
+ username, reponame = project_name(options).split('/')
11
+ number = build_number(options)
12
+ build = Response::Build.get(username, reponame, number)
13
+ say Printer::StepPrinter.new(build.steps).to_s
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CircleCI
4
+ module CLI
5
+ module Command
6
+ class BuildsCommand < BaseCommand
7
+ class << self
8
+ def run(options)
9
+ setup_token
10
+ username, reponame = project_name(options).split('/')
11
+
12
+ builds =
13
+ if options.branch
14
+ Response::Build.branch(username, reponame, options.branch)
15
+ else
16
+ Response::Build.all(username, reponame)
17
+ end
18
+
19
+ say Printer::BuildPrinter.new(builds, pretty: should_be_pretty(options)).to_s
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CircleCI
4
+ module CLI
5
+ module Command
6
+ class CancelCommand < BaseCommand
7
+ class << self
8
+ def run(options)
9
+ setup_token
10
+ username, reponame = project_name(options).split('/')
11
+ number = build_number(options)
12
+ build = Response::Build.cancel(username, reponame, number)
13
+ if build.username
14
+ say "build #{build.project_name} #{build.build_number} is canceled."
15
+ else
16
+ say "failed to cancel #{username}/#{reponame} #{number}."
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CircleCI
4
+ module CLI
5
+ module Command
6
+ class ProjectsCommand < BaseCommand
7
+ class << self
8
+ def run(options)
9
+ setup_token
10
+ say Printer::ProjectPrinter.new(Response::Project.all, pretty: should_be_pretty(options)).to_s
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CircleCI
4
+ module CLI
5
+ module Command
6
+ class RetryCommand < BaseCommand
7
+ class << self
8
+ def run(options)
9
+ setup_token
10
+ username, reponame = project_name(options).split('/')
11
+ number = build_number(options)
12
+ build = Response::Build.retry(username, reponame, number)
13
+ if build.username
14
+ say "build #{username}/#{reponame} #{build.build_number} is triggered"
15
+ else
16
+ say "failed to trigger #{username}/#{reponame} #{number}"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CircleCI
4
+ module CLI
5
+ module Command
6
+ class WatchCommand < BaseCommand
7
+ class << self
8
+ def run(options)
9
+ setup_token
10
+ setup_client
11
+
12
+ build = get_build(options)
13
+
14
+ if build&.running?
15
+ start_watch(build)
16
+ wait_until_finish
17
+ finalize(build, build.channel_name)
18
+ else
19
+ say 'The build is not running'
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def setup_client
26
+ @client = Networking::CircleCIPusherClient.new
27
+ @client.connect
28
+ end
29
+
30
+ def get_build(options)
31
+ username, reponame = project_name(options).split('/')
32
+ number = build_number options
33
+ Response::Build.get(username, reponame, number)
34
+ end
35
+
36
+ def start_watch(build)
37
+ @running = true
38
+ text = "Start watching #{build.project_name} ##{build.build_number}"
39
+ print_bordered text
40
+ TerminalNotifier.notify text
41
+
42
+ bind_event_handling build.channel_name
43
+ end
44
+
45
+ def bind_event_handling(channel)
46
+ @client.bind_event_json(channel, 'newAction') do |json|
47
+ print_bordered json['log']['name'].green
48
+ end
49
+
50
+ @client.bind_event_json(channel, 'appendAction') do |json|
51
+ say json['out']['message']
52
+ end
53
+
54
+ @client.bind_event_json(channel, 'updateAction') do |json|
55
+ @running = json['log']['name'] != 'Disable SSH'
56
+ end
57
+ end
58
+
59
+ def wait_until_finish
60
+ sleep(1) while @running
61
+ end
62
+
63
+ def finalize(build, channel)
64
+ @client.unsubscribe(channel)
65
+ text = "Finish watching #{build.project_name} ##{build.build_number}"
66
+ print_bordered text.blue
67
+ TerminalNotifier.notify text
68
+ end
69
+
70
+ def print_bordered(text)
71
+ say Terminal::Table.new(rows: [[text]], style: { width: 120 }).to_s
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end