githuh 0.1.0 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c65591c34bc51c5a7b3074db037db0f26cab2e04b2e08524ccd2f2a7fdaef0d0
4
- data.tar.gz: 8a6101f582e720ff69ca98d8ee60686099ec20f0146585b65721ed4657e6c876
3
+ metadata.gz: 3b4517eedc84850ed85b10e50952ffc26302a915d023f2c165dafeaa8b357534
4
+ data.tar.gz: 2f723bd311807a98a62c6e8bf5438386a02907ff81cfc1ef1e35cb686aa1b346
5
5
  SHA512:
6
- metadata.gz: 6e745d10d18e4e7a63a32911075be060d2168a5741ef03ef06944f7e0d1970dc43a6009616b9f0cd320a74970eb33d7516424241a599e8c56e65fe64531d2356
7
- data.tar.gz: 142883c54d4a543ea8222d86d9db79ec9441f16891588849364b221260f47e4323c4a3e9df1339daede22592ef793b4c4413be2f6bdaa40b31d8ab11384201f8
6
+ metadata.gz: 8a664c0091551871d5105c80ad0ad4e09f1fb6b3111d073519064ed4d26b13318e61d11277c0c2d03c9b49198b53c16f181191ac9c6091fb8707f0c90599b7bd
7
+ data.tar.gz: d7888af02067237199ad0bab8880c643370c7f23645ee36e2dbfdd5deb771b32808d274dca4f669937b968b1f5b684098194acfd5ab807be14cafb5a0db1511d
@@ -0,0 +1,24 @@
1
+ name: Ruby
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+
9
+ jobs:
10
+ build:
11
+
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - uses: actions/checkout@v2
16
+ - name: Set up Ruby 2.6
17
+ uses: actions/setup-ruby@v1
18
+ with:
19
+ ruby-version: 2.6.x
20
+ - name: Build and test with Rake
21
+ run: |
22
+ gem install bundler
23
+ bundle install --jobs 4 --retry 3
24
+ bundle exec rspec
data/.gitignore CHANGED
@@ -1,7 +1,7 @@
1
1
  ## MAC OS
2
2
  .DS_Store
3
3
  .idea/
4
-
4
+ kigster.repositories.*
5
5
  ## TEXTMATE
6
6
  *.tmproj
7
7
  tmtags
@@ -21,4 +21,3 @@ pkg
21
21
 
22
22
  ## PROJECT::SPECIFIC
23
23
  .yardoc
24
- doc
data/.rspec CHANGED
@@ -1 +1,2 @@
1
1
  --require spec_helper
2
+ --order random
data/Gemfile CHANGED
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source "https://rubygems.org"
3
+ source 'https://rubygems.org'
4
4
 
5
5
  gemspec
6
-
data/Gemfile.lock CHANGED
@@ -1,28 +1,66 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- githuh (0.1.0)
4
+ githuh (0.1.2)
5
5
  colored2 (~> 3)
6
6
  dry-cli (~> 0.6)
7
7
  octokit (~> 4)
8
+ tty-box (~> 0.5)
9
+ tty-progressbar
8
10
 
9
11
  GEM
10
12
  remote: https://rubygems.org/
11
13
  specs:
12
14
  addressable (2.7.0)
13
15
  public_suffix (>= 2.0.2, < 5.0)
16
+ aruba (1.0.0)
17
+ childprocess (~> 3.0)
18
+ contracts (~> 0.16.0)
19
+ cucumber (>= 2.4, < 4.0)
20
+ ffi (~> 1.9)
21
+ rspec-expectations (~> 3.4)
22
+ thor (~> 1.0)
14
23
  awesome_print (1.8.0)
24
+ backports (3.16.1)
25
+ builder (3.2.4)
26
+ childprocess (3.0.0)
15
27
  colored2 (3.1.2)
16
28
  concurrent-ruby (1.1.6)
29
+ contracts (0.16.0)
30
+ cucumber (3.1.2)
31
+ builder (>= 2.1.2)
32
+ cucumber-core (~> 3.2.0)
33
+ cucumber-expressions (~> 6.0.1)
34
+ cucumber-wire (~> 0.0.1)
35
+ diff-lcs (~> 1.3)
36
+ gherkin (~> 5.1.0)
37
+ multi_json (>= 1.7.5, < 2.0)
38
+ multi_test (>= 0.1.2)
39
+ cucumber-core (3.2.1)
40
+ backports (>= 3.8.0)
41
+ cucumber-tag_expressions (~> 1.1.0)
42
+ gherkin (~> 5.0)
43
+ cucumber-expressions (6.0.1)
44
+ cucumber-tag_expressions (1.1.1)
45
+ cucumber-wire (0.0.1)
17
46
  diff-lcs (1.3)
47
+ docile (1.3.2)
18
48
  dry-cli (0.6.0)
19
49
  concurrent-ruby (~> 1.0)
50
+ equatable (0.6.1)
20
51
  faraday (1.0.0)
21
52
  multipart-post (>= 1.2, < 3)
53
+ ffi (1.12.2)
54
+ gherkin (5.1.0)
55
+ multi_json (1.14.1)
56
+ multi_test (0.1.2)
22
57
  multipart-post (2.1.1)
23
58
  octokit (4.17.0)
24
59
  faraday (>= 0.9)
25
60
  sawyer (~> 0.8.0, >= 0.5.3)
61
+ pastel (0.7.3)
62
+ equatable (~> 0.6)
63
+ tty-color (~> 0.5)
26
64
  public_suffix (4.0.3)
27
65
  rake (13.0.1)
28
66
  rspec (3.9.0)
@@ -44,17 +82,42 @@ GEM
44
82
  sawyer (0.8.2)
45
83
  addressable (>= 2.3.5)
46
84
  faraday (> 0.8, < 2.0)
85
+ simplecov (0.18.5)
86
+ docile (~> 1.1)
87
+ simplecov-html (~> 0.11)
88
+ simplecov-formatter-badge (0.1.0)
89
+ simplecov-html (0.12.2)
90
+ strings (0.1.8)
91
+ strings-ansi (~> 0.1)
92
+ unicode-display_width (~> 1.5)
93
+ unicode_utils (~> 1.4)
94
+ strings-ansi (0.2.0)
95
+ thor (1.0.1)
96
+ tty-box (0.5.0)
97
+ pastel (~> 0.7.2)
98
+ strings (~> 0.1.6)
99
+ tty-cursor (~> 0.7)
100
+ tty-color (0.5.1)
101
+ tty-cursor (0.7.1)
102
+ tty-progressbar (0.11.0)
103
+ tty-screen (~> 0.5.0)
104
+ tty-screen (0.5.1)
105
+ unicode-display_width (1.7.0)
106
+ unicode_utils (1.4.0)
47
107
 
48
108
  PLATFORMS
49
109
  ruby
50
110
 
51
111
  DEPENDENCIES
112
+ aruba (= 1.0.0)
52
113
  awesome_print (~> 1)
53
114
  bundler (~> 2)
54
115
  githuh!
55
116
  rake (~> 13)
56
117
  rspec (~> 3)
57
118
  rspec-its (~> 1)
119
+ simplecov
120
+ simplecov-formatter-badge
58
121
 
59
122
  BUNDLED WITH
60
123
  2.1.2
data/README.md CHANGED
@@ -1,8 +1,18 @@
1
- # Repos Markdown
1
+ ![Ruby](https://github.com/kigster/githuh/workflows/Ruby/badge.svg)
2
+ ![Coverage](docs/img/coverage.svg)
2
3
 
3
- List my github repos and generate pretty markdown.
4
+ # Githuh GitHub API client
4
5
 
5
- ## Setup
6
+ As in... **git? huh?**.
7
+
8
+ Github API client wrapper on top of Octokit, that provides extensible command pattern for wrapping Github functionality.
9
+
10
+ At the moment two features are implemented:
11
+
12
+ * Generating a list of org's (or personal) repositories and rending in either markdown or JSON
13
+ * Printing info of the logged in user.
14
+
15
+ ## Using `githuh`
6
16
 
7
17
  Add your Github Token to the global config:
8
18
 
@@ -13,7 +23,74 @@ git config --global --set user.token <token>
13
23
  After that:
14
24
 
15
25
  ```bash
16
- bin/repos-markdown output-file
26
+ githuh
27
+ Commands:
28
+ githuh repo [SUBCOMMAND]
29
+ githuh user [SUBCOMMAND]
30
+ githuh version # Print version
31
+ ```
32
+
33
+ Githuh works by implement subcomands:
34
+
35
+ ### `repo list`
36
+
37
+ #### Motivation
38
+
39
+ This functionality was born out of the need to generate a brief but comprehensive, well-formatted list of prior inventions for a typical employment contract.
40
+
41
+ > NOTE: nothing in this library constitutes a legal advice. Use it at your own risk. For more information, please see [WARRANTY](WARANTY.md).
42
+
43
+ Please watch the following Ascii Screen cast to see this command in action:
44
+
45
+ [![asciicast](https://asciinema.org/a/CW8NbYfu9RsifQJVU6tKRtRkU.svg)](https://asciinema.org/a/CW8NbYfu9RsifQJVU6tKRtRkU)
46
+
47
+ #### Usage
48
+
49
+ ```bash
50
+ ❯ githuh repo list --help
51
+
52
+ Githuh CLI 0.1.2 — API client for Github.com.
53
+ © 2020 Konstantin Gredeskoul, All rights reserved. MIT License.
54
+
55
+ Usage:
56
+ githuh repo list
57
+
58
+ Description:
59
+ List owned repositories and render the output in markdown or JSON
60
+ Default output file is <username>.repositories.<format>
61
+
62
+ Options:
63
+ --api-token=VALUE # Github API token; if not given, user.token is read from ~/.gitconfig
64
+ --per-page=VALUE # Pagination page size for Github API, default: 20
65
+ --[no-]info # Print UI elements, like a the progress bar, default: true
66
+ --[no-]verbose # Print additional debugging info, default: false
67
+ --file=VALUE # Output file, overrides <username>.repositories.<format>
68
+ --format=VALUE # Output format: (markdown/json), default: "markdown"
69
+ --forks=VALUE # Include or exclude forks: (exclude/include/only), default: "exclude"
70
+ --[no-]private # If specified, returns only private repos for true, public for false
71
+ --help, -h # Print this help
72
+ ```
73
+
74
+ #### Example
75
+
76
+ For instance, to generate a markdown list of all of your **public** repos that are also **not forks**, run the following:
77
+
78
+ ```bash
79
+ $ githuh repo list --format=markdown --no-private --forks=exclude --file=repos.md
80
+ ```
81
+
82
+ ### `user info`
83
+
84
+ This command prints the info about currently authenticated user.
85
+
86
+ ```bash
87
+ ❯ githuh user info
88
+ {
89
+ :login => "kigster",
90
+ :url => "https://api.github.com/users/kigster",
91
+ :html_url => "https://github.com/kigster",
92
+ ..............
93
+
17
94
  ```
18
95
 
19
96
  ## Copyright
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
  require 'timeout'
@@ -11,22 +13,17 @@ task :clean do
11
13
  shell('rm -rf pkg/ tmp/ coverage/ doc/ ' )
12
14
  end
13
15
 
14
- task :gem => [:build] do
16
+ task gem: [:build] do
15
17
  shell('gem install pkg/*')
16
18
  end
17
19
 
18
- task :permissions => [ :clean ] do
20
+ task permissions: [:clean] do
19
21
  shell("chmod -v o+r,g+r * */* */*/* */*/*/* */*/*/*/* */*/*/*/*/*")
20
22
  shell("find . -type d -exec chmod o+x,g+x {} \\;")
21
23
  end
22
24
 
23
- task :build => :permissions
25
+ task build: :permissions
24
26
 
25
27
  RSpec::Core::RakeTask.new(:spec)
26
28
 
27
- task :default => :spec
28
-
29
-
30
-
31
-
32
-
29
+ task default: :spec
data/WARRANTY.md ADDED
@@ -0,0 +1,7 @@
1
+ # WARRANTY CLAUSE
2
+
3
+ EXCEPT AS REPRESENTED IN THIS AGREEMENT, ALL WORK PRODUCT BY DEVELOPER IS PROVIDED "AS IS".
4
+ OTHER THAN AS PROVIDED IN THIS AGREEMENT, DEVELOPER MAKES NO OTHER WARRANTIES, EXPRESS OR
5
+ IMPLIED, AND HEREBY DISCLAIMS ALL IMPLIED WARRANTIES, INCLUDING ANY WARRANTY OF
6
+ MERCHANTABILITY AND WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE.
7
+
@@ -0,0 +1,19 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="94" height="20">
2
+ <linearGradient id="b" x2="0" y2="100%">
3
+ <stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
4
+ <stop offset="1" stop-opacity=".1"/>
5
+ </linearGradient>
6
+ <clipPath id="a">
7
+ <rect width="94" height="20" rx="3" fill="#fff"/>
8
+ </clipPath>
9
+ <g clip-path="url(#a)">
10
+ <path fill="#555" d="M0 0h59v20H0z"/>
11
+ <path fill="#e05d44" d="M59 0h35v20H59z"/>
12
+ <path fill="url(#b)" d="M0 0h94v20H0z"/>
13
+ </g>
14
+ <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110">
15
+ <text x="305" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="490">coverage</text>
16
+ <text x="305" y="140" transform="scale(.1)" textLength="490">coverage</text>
17
+ <text x="755" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="250">67%</text>
18
+ <text x="755" y="140" transform="scale(.1)" textLength="250">67%</text></g>
19
+ </svg>
data/exe/githuh CHANGED
@@ -12,4 +12,4 @@ $LOAD_PATH << lib_path if File.exist?(lib_path)
12
12
 
13
13
  require 'githuh'
14
14
 
15
- Dry::CLI.new(Githuh::CLI::Commands).call
15
+ Githuh::CLI::Launcher.new(ARGV.dup).execute!
data/githuh.gemspec CHANGED
@@ -2,11 +2,12 @@
2
2
 
3
3
  lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'githuh'
5
+
6
+ require_relative 'lib/githuh/version'
6
7
 
7
8
  Gem::Specification.new do |spec|
8
9
  spec.name = 'githuh'
9
- spec.version = '0.1.0'
10
+ spec.version = Githuh::VERSION
10
11
  spec.authors = ['Konstantin Gredeskoul']
11
12
  spec.email = %w(kigster@gmail.com)
12
13
 
@@ -26,10 +27,15 @@ Gem::Specification.new do |spec|
26
27
  spec.add_dependency 'colored2', '~> 3'
27
28
  spec.add_dependency 'dry-cli', '~> 0.6'
28
29
  spec.add_dependency 'octokit', '~> 4'
30
+ spec.add_dependency 'tty-box', '~> 0.5'
31
+ spec.add_dependency 'tty-progressbar'
29
32
 
33
+ spec.add_development_dependency 'aruba', '= 1.0.0'
30
34
  spec.add_development_dependency 'awesome_print', '~> 1'
31
35
  spec.add_development_dependency 'bundler', '~> 2'
32
36
  spec.add_development_dependency 'rake', '~> 13'
33
37
  spec.add_development_dependency 'rspec', '~> 3'
34
38
  spec.add_development_dependency 'rspec-its', '~> 1'
39
+ spec.add_development_dependency 'simplecov'
40
+ spec.add_development_dependency 'simplecov-formatter-badge'
35
41
  end
data/lib/githuh.rb CHANGED
@@ -6,9 +6,13 @@
6
6
  require 'octokit'
7
7
  require 'colored2'
8
8
  require 'dry/cli'
9
+ require 'forwardable'
10
+
11
+ require_relative 'githuh/version'
9
12
 
10
13
  module Githuh
11
- VERSION = '0.1.0'
14
+ BANNER = "Githuh Version #{VERSION}"
15
+ BINARY = File.expand_path('../exe/githuh', __dir__).freeze
12
16
 
13
17
  module CLI
14
18
  module Commands
@@ -17,6 +21,68 @@ module Githuh
17
21
  end
18
22
  end
19
23
 
24
+ require 'githuh/cli/launcher'
25
+
26
+ module Githuh
27
+ class << self
28
+ attr_accessor :launcher, :in_test
29
+
30
+ extend Forwardable
31
+
32
+ def_delegators :launcher, :stdout, :stderr, :stdin, :kernel, :argv
33
+
34
+ def configure_kernel_behavior!(help: false)
35
+ Kernel.module_eval do
36
+ alias original_exit exit
37
+ alias original_puts puts
38
+ alias original_warn warn
39
+ end
40
+
41
+ Kernel.module_eval do
42
+ def puts(*args)
43
+ ::Githuh.stdout.puts(*args)
44
+ end
45
+
46
+ def warn(*args)
47
+ ::Githuh.stderr.puts(*args)
48
+ end
49
+ end
50
+
51
+ if in_test
52
+ Kernel.module_eval do
53
+ def exit(code)
54
+ ::Githuh.stderr.puts("RSpec: intercepted exit code: #{code}")
55
+ end
56
+ end
57
+ elsif help
58
+ Kernel.module_eval do
59
+ def exit(_code)
60
+ # for help, override default exit code with 0
61
+ original_exit(0)
62
+ end
63
+ end
64
+ else
65
+ Kernel.module_eval do
66
+ def exit(code)
67
+ original_exit(code)
68
+ end
69
+ end
70
+ end
71
+
72
+ Dry::CLI
73
+ end
74
+
75
+ def restore_kernel_behavior!
76
+ Kernel.module_eval do
77
+ alias exit original_exit
78
+ alias puts original_puts
79
+ alias warn original_warn
80
+ alias exit original_exit
81
+ end
82
+ end
83
+ end
84
+ end
85
+
20
86
  require 'githuh/cli/commands/base'
21
87
  require 'githuh/cli/commands/user/info'
22
88
  require 'githuh/cli/commands/version'
@@ -1,39 +1,109 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'tty/box'
4
+ require 'stringio'
5
+ require 'githuh/version'
6
+ require 'forwardable'
7
+
3
8
  module Githuh
4
9
  module CLI
5
10
  module Commands
6
- DEFAULT_PAGE_SIZE = 50
11
+ DEFAULT_PAGE_SIZE = 20
7
12
 
8
13
  class Base < Dry::CLI::Command
14
+ extend Forwardable
15
+
16
+ def_delegators :context, :stdout, :stderr, :stdin, :kernel, :argv
17
+
9
18
  class << self
10
19
  def inherited(base)
11
20
  super
12
21
  base.instance_eval do
13
22
  option :api_token, required: false, desc: "Github API token; if not given, user.token is read from ~/.gitconfig"
14
23
  option :per_page, required: false, default: DEFAULT_PAGE_SIZE, desc: "Pagination page size for Github API"
15
- option :verbose, type: :boolean, default: true, desc: 'Print verbose info'
16
-
24
+ option :info, type: :boolean, default: true, desc: 'Print UI elements, like a the progress bar'
25
+ option :verbose, type: :boolean, default: false, desc: 'Print additional debugging info'
17
26
  end
18
27
  end
19
28
  end
20
29
 
21
- attr_accessor :client, :token, :per_page, :verbose
30
+ attr_accessor :client, :token, :per_page, :verbose, :info, :box, :context
22
31
 
23
32
  def call(api_token: nil,
24
33
  per_page: DEFAULT_PAGE_SIZE,
25
- verbose: true)
34
+ verbose: false,
35
+ info: true)
26
36
 
37
+ self.context = Githuh
27
38
  self.verbose = verbose
39
+ self.info = info
28
40
  self.token = api_token || token_from_gitconfig
29
41
  self.per_page = per_page || DEFAULT_PAGE_SIZE
30
42
  self.client = Octokit::Client.new(access_token: token)
43
+
44
+ print_userinfo if info
45
+ end
46
+
47
+ protected
48
+
49
+ def puts(*args)
50
+ stdout.puts(*args)
51
+ end
52
+
53
+ def warn(*args)
54
+ stderr.puts(*args)
55
+ end
56
+
57
+ def user_info
58
+ @user_info ||= client.user
59
+ end
60
+
61
+ def ui_width
62
+ 80
31
63
  end
32
64
 
33
65
  private
34
66
 
67
+ def print_userinfo
68
+ duration = DateTime.now - DateTime.parse(user_info[:created_at].to_s)
69
+ years = (duration / 365).to_i
70
+ months = ((duration - years * 365) / 30).to_i
71
+ days = (duration - years * 365 - months * 30).to_i
72
+
73
+ lines = []
74
+ lines << sprintf(" Github API Token: %s", h("#{token[0..9]}#{'.' * 20}#{token[-11..-1]}"))
75
+ lines << sprintf(" Current User: %s", h(user_info.login))
76
+ lines << sprintf(" Public Repos: %s", h(user_info.public_repos.to_s))
77
+ lines << sprintf(" Followers: %s", h(user_info.followers.to_s))
78
+ lines << sprintf(" Member For: %s", h(sprintf("%d years, %d months, %d days", years, months, days)))
79
+
80
+ self.box = TTY::Box.frame *lines,
81
+ padding: 1,
82
+ width: ui_width,
83
+ align: :left,
84
+ title: { top_center: Githuh::BANNER },
85
+ style: {
86
+ fg: :white,
87
+ border: {
88
+ fg: :bright_green
89
+ }
90
+ }
91
+
92
+ Githuh.stdout.print box
93
+ end
94
+
95
+ def h(arg)
96
+ arg.to_s.bold.blue
97
+ end
98
+
35
99
  def token_from_gitconfig
36
- `git config --global --get user.token`.chomp
100
+ @token_from_gitconfig ||= `git config --global --get user.token`.chomp
101
+
102
+ return @token_from_gitconfig unless @token_from_gitconfig.empty?
103
+
104
+ raise "No token was found in your ~/.gitconfig.\n" \
105
+ "To add, run the following command: \n" \
106
+ "git config --global --set user.token YOUR_GITHUB_TOKEN"
37
107
  end
38
108
  end
39
109
  end
@@ -5,6 +5,7 @@
5
5
  require 'bundler/setup'
6
6
  require 'dry/cli'
7
7
  require 'json'
8
+ require 'tty/progressbar'
8
9
 
9
10
  require_relative '../base'
10
11
 
@@ -13,67 +14,100 @@ module Githuh
13
14
  module Commands
14
15
  module Repo
15
16
  class List < Base
16
- FORMATS = %w(markdown json).freeze
17
- FORK_OPTIONS = %w(include only exclude).freeze
17
+ FORMATS = {
18
+ markdown: 'md',
19
+ json: 'json'
20
+ }.freeze
18
21
 
19
- attr_accessor :file, :output, :repos, :format, :forks
22
+ DEFAULT_FORMAT = :markdown
23
+ DEFAULT_OUTPUT_FORMAT = "<username>.repositories.<format>"
24
+ FORK_OPTIONS = %w(exclude include only).freeze
20
25
 
21
- desc 'List owned repositories and render the output in markdown or JSON'
26
+ attr_accessor :filename, :file, :output, :repos, :format, :forks, :private, :record_count
22
27
 
23
- option :file, required: false, desc: 'Output file. If not provided, STDERR is used.'
24
- option :format, values: FORMATS, default: FORMATS.first, required: false, desc: 'Output format'
28
+ desc "List owned repositories and render the output in markdown or JSON\n" \
29
+ " Default output file is " + DEFAULT_OUTPUT_FORMAT.bold.yellow
30
+
31
+ option :file, required: false, desc: 'Output file, overrides ' + DEFAULT_OUTPUT_FORMAT
32
+ option :format, values: FORMATS.keys, default: DEFAULT_FORMAT.to_s, required: false, desc: 'Output format'
25
33
  option :forks, type: :string, values: FORK_OPTIONS, default: FORK_OPTIONS.first, required: false, desc: 'Include or exclude forks'
34
+ option :private, type: :boolean, default: nil, required: false, desc: 'If specified, returns only private repos for true, public for false'
26
35
 
27
- def call(file: nil, format: nil, forks: nil, **opts)
36
+ def call(file: nil, format: nil, forks: nil, private: nil, **opts)
28
37
  super(**opts)
29
38
 
30
- self.forks = forks
31
- self.format = (format || FORMATS.first).to_sym
32
- self.repos = []
33
- self.output = StringIO.new
34
- self.file = STDOUT
35
- self.file = file ? File.open(file, 'w') : STDERR
36
-
39
+ self.record_count = 0
40
+ self.forks = forks
41
+ self.private = private
42
+ self.repos = []
43
+ self.output = StringIO.new
44
+ self.format = (format || DEFAULT_FORMAT).to_sym
45
+
46
+ self.filename = file || "#{user_info.login}.repositories.#{FORMATS[self.format]}"
47
+ self.file = File.open(filename, 'w')
48
+
49
+ puts
50
+ puts TTY::Box.info("Format : #{self.format}\n" \
51
+ "File : #{filename}\n" \
52
+ "Forks : #{self.forks}\n",
53
+ width: ui_width,
54
+ padding: 1)
55
+ puts
56
+ # —————————— actually get all repositories ———————————————
37
57
  self.file.write send("render_as_#{format}", repositories)
58
+ # ————————————————————————————————————————————————————————
59
+
60
+ puts
61
+ puts TTY::Box.info("Success: written a total of #{record_count} records to #{filename}",
62
+ width: ui_width, padding: 1)
63
+ puts
38
64
  ensure
39
65
  file.close if file.respond_to?(:close) && !file.closed?
40
66
  end
41
67
 
42
- private
43
-
44
68
  def repositories
45
69
  page = 0
70
+ bar = nil
71
+
46
72
  [].tap do |repo_list|
47
73
  loop do
48
- print '.'.green if verbose
49
74
  options = {
50
- page: page,
51
- per_page: per_page,
52
- type: :owner,
75
+ page: page,
76
+ per_page: per_page,
77
+ type: :owner,
53
78
  }
54
79
 
55
80
  result = client.repos({}, query: options)
56
- result.reject! do |r|
57
- case forks
58
- when 'exclude'
59
- r.fork
60
- when 'only'
61
- !r.fork
62
- when 'include'
63
- false
64
- end
65
- end
81
+ bar = create_progress_bar if info && !verbose && page == 0
82
+
83
+ bar&.advance
84
+ filter_result!(result)
85
+
66
86
  break if result.empty?
67
87
 
68
- result.size.times { print '.'.green } if verbose
88
+ result.each { |repo| printf "%s\n", repo.name } if verbose
69
89
 
70
90
  repo_list << result
91
+
71
92
  page += 1
93
+
94
+ self.record_count += result.size
72
95
  end
73
- puts " ✓".bold.green if verbose
96
+
97
+ bar&.finish; puts
74
98
  end.flatten.sort_by(&:stargazers_count).reverse.uniq(&:name)
75
99
  end
76
100
 
101
+ def create_progress_bar
102
+ number_of_pages = client.last_response.rels[:last].href.match(/page=(\d+).*$/)[1]
103
+ TTY::ProgressBar.new("[:bar]",
104
+ title: 'Fetching Repositories',
105
+ total: number_of_pages.to_i,
106
+ width: ui_width - 2,
107
+ head: '',
108
+ complete: '▉'.magenta)
109
+ end
110
+
77
111
  def render_as_markdown(repositories)
78
112
  output.puts "### #{client.user.name}'s Repos\n"
79
113
  repositories.each_with_index do |repo, index|
@@ -98,6 +132,32 @@ module Githuh
98
132
 
99
133
  REPO
100
134
  end
135
+
136
+ private
137
+
138
+ def filter_result!(result)
139
+ result.reject! do |r|
140
+ fork_reject = case forks
141
+ when 'exclude'
142
+ r.fork
143
+ when 'only'
144
+ !r.fork
145
+ when 'include'
146
+ false
147
+ end
148
+
149
+ private_reject = case private
150
+ when true
151
+ !r.private
152
+ when false
153
+ r.private
154
+ when nil
155
+ false
156
+ end
157
+
158
+ fork_reject || private_reject
159
+ end
160
+ end
101
161
  end
102
162
  end
103
163
 
@@ -6,6 +6,7 @@ require "bundler/setup"
6
6
  require "dry/cli"
7
7
  require_relative '../base'
8
8
  require 'awesome_print'
9
+ require 'json'
9
10
 
10
11
  module Githuh
11
12
  module CLI
@@ -16,7 +17,7 @@ module Githuh
16
17
 
17
18
  def call(**opts)
18
19
  super(**opts)
19
- ap client.user.to_hash
20
+ puts JSON.pretty_generate(client.user.to_hash)
20
21
  end
21
22
  end
22
23
  end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/cli'
4
+ require 'forwardable'
5
+ require 'tty/box'
6
+
7
+ module Githuh
8
+ module CLI
9
+ class Launcher
10
+ attr_accessor :argv, :stdin, :stdout, :stderr, :kernel
11
+
12
+ def initialize(argv, stdin = STDIN, stdout = STDOUT, stderr = STDERR, kernel = nil)
13
+ if ::Githuh.launcher
14
+ raise(ArgumentError, "Another instance of CLI Launcher was detected, aborting.")
15
+ else
16
+ Githuh.launcher = self
17
+ end
18
+
19
+ self.argv = argv
20
+ self.stdin = stdin
21
+ self.stdout = stdout
22
+ self.stderr = stderr
23
+ self.kernel = kernel
24
+ end
25
+
26
+ def execute!
27
+ if argv.empty? || !(%w(--help -h) & argv).empty?
28
+ stdout.puts <<~BANNER
29
+
30
+ #{'Githuh CLI'.bold.yellow} #{::Githuh::VERSION.bold.green} — API client for Github.com.
31
+ #{'© 2020 Konstantin Gredeskoul, All rights reserved. MIT License.'.cyan}
32
+
33
+ BANNER
34
+
35
+ Githuh.configure_kernel_behavior! help: true
36
+ else
37
+ Githuh.configure_kernel_behavior!
38
+ end
39
+
40
+ ::Dry::CLI.new(Commands).call(arguments: argv, out: stdout, err: stderr)
41
+ rescue StandardError => e
42
+ box = TTY::Box.frame('ERROR:', ' ',
43
+ e.message,
44
+ padding: 1,
45
+ align: :left,
46
+ title: { top_center: Githuh::BANNER },
47
+ width: 80,
48
+ style: {
49
+ bg: :red,
50
+ border: {
51
+ fg: :bright_yellow,
52
+ bg: :red
53
+ }
54
+ })
55
+ stderr.print box
56
+ ensure
57
+ Githuh.restore_kernel_behavior!
58
+ exit(10) unless Githuh.in_test
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Githuh
4
+ VERSION = '0.1.2'
5
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: githuh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Konstantin Gredeskoul
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-12 00:00:00.000000000 Z
11
+ date: 2020-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colored2
@@ -52,6 +52,48 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: tty-box
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.5'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.5'
69
+ - !ruby/object:Gem::Dependency
70
+ name: tty-progressbar
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: aruba
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 1.0.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 1.0.0
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: awesome_print
57
99
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +164,34 @@ dependencies:
122
164
  - - "~>"
123
165
  - !ruby/object:Gem::Version
124
166
  version: '1'
167
+ - !ruby/object:Gem::Dependency
168
+ name: simplecov
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: simplecov-formatter-badge
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
125
195
  description: Generate repository list, show user info and more.
126
196
  email:
127
197
  - kigster@gmail.com
@@ -131,6 +201,7 @@ extensions: []
131
201
  extra_rdoc_files: []
132
202
  files:
133
203
  - ".envrc"
204
+ - ".github/workflows/ruby.yml"
134
205
  - ".gitignore"
135
206
  - ".rspec"
136
207
  - Gemfile
@@ -138,6 +209,8 @@ files:
138
209
  - LICENSE
139
210
  - README.md
140
211
  - Rakefile
212
+ - WARRANTY.md
213
+ - docs/img/coverage.svg
141
214
  - exe/githuh
142
215
  - githuh.gemspec
143
216
  - lib/githuh.rb
@@ -145,6 +218,8 @@ files:
145
218
  - lib/githuh/cli/commands/repo/list.rb
146
219
  - lib/githuh/cli/commands/user/info.rb
147
220
  - lib/githuh/cli/commands/version.rb
221
+ - lib/githuh/cli/launcher.rb
222
+ - lib/githuh/version.rb
148
223
  homepage: https://github.com/kigster/githuh
149
224
  licenses:
150
225
  - MIT