githuh 0.1.0 → 0.1.2

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.
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