repofetch 0.4.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +64 -0
- data/CODEOWNERS +1 -0
- data/CONTRIBUTING.md +123 -0
- data/CREDITS.md +20 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +147 -0
- data/LICENSE +27 -0
- data/Makefile +7 -0
- data/README.md +66 -0
- data/Rakefile +15 -0
- data/exe/repofetch +60 -0
- data/lib/repofetch/DEFAULT_CONFIG +4 -0
- data/lib/repofetch/config.rb +40 -0
- data/lib/repofetch/env.rb +15 -0
- data/lib/repofetch/exceptions.rb +13 -0
- data/lib/repofetch/github/ASCII +20 -0
- data/lib/repofetch/github.rb +153 -0
- data/lib/repofetch/theme.rb +50 -0
- data/lib/repofetch/util.rb +11 -0
- data/lib/repofetch.rb +247 -0
- metadata +290 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 82e31a1aff66491aa6ee4f0ce862ed960876a5762fe7b870536d2a4b6f3ab2a2
|
4
|
+
data.tar.gz: cdd76b64181cfa253e87be1633ab3f16b370462de69d47e4d1b4468eb6e5f0c2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 798b248c171c24dc046904cbd76fd0b9a8d81a32d73244d657881e815f6801f464018a518990fb31e64429c756cf090c97a2d3ec77fe4200703d10c85e07ddfc
|
7
|
+
data.tar.gz: 170af910f544c77a35eb66a8f7155a0105e7a3493590b875ee38d3787a158f6fc6815b73ecdae5d53f474ab5906d51636813c70c0f5e3aa19f1be65549487ba1
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## [Unreleased]
|
4
|
+
|
5
|
+
### Other
|
6
|
+
|
7
|
+
- NetBSD installation option (@0323pin)
|
8
|
+
|
9
|
+
## [0.3.3]
|
10
|
+
|
11
|
+
### Fixed
|
12
|
+
|
13
|
+
- Crash caused by `-r`/`--repository` type mismatch (@orhun)
|
14
|
+
- GitHub repository names not being detected when they didn't have the optional
|
15
|
+
`.git` suffix
|
16
|
+
|
17
|
+
## [0.3.2]
|
18
|
+
|
19
|
+
Internal changes only
|
20
|
+
|
21
|
+
## [0.3.1]
|
22
|
+
|
23
|
+
### Changed
|
24
|
+
|
25
|
+
- CLI help to be colored
|
26
|
+
- Order of CLI help
|
27
|
+
|
28
|
+
## [0.3.0]
|
29
|
+
|
30
|
+
### Added
|
31
|
+
|
32
|
+
- GitHub ASCII art
|
33
|
+
- Option to select local repository to detect remote owner and repository
|
34
|
+
|
35
|
+
### Changed
|
36
|
+
|
37
|
+
- Date created and updated to be human-readable durations
|
38
|
+
|
39
|
+
## [0.2.1]
|
40
|
+
|
41
|
+
### Added
|
42
|
+
|
43
|
+
- config option for a personal access token
|
44
|
+
|
45
|
+
## [0.2.0]
|
46
|
+
|
47
|
+
### Added
|
48
|
+
|
49
|
+
- Issues counts
|
50
|
+
- Pull Requests counts
|
51
|
+
- Count of available issues with the `help wanted` label
|
52
|
+
- Count of available issues with the `good first issue` label
|
53
|
+
- Customizable behavior via `repofetch.yml` config file
|
54
|
+
|
55
|
+
## 0.1.0
|
56
|
+
Initial version :tada:
|
57
|
+
|
58
|
+
[Unreleased]: https://github.com/spenserblack/repofetch/compare/v0.3.3...HEAD
|
59
|
+
[0.3.3]: https://github.com/spenserblack/repofetch/compare/v0.3.2...v0.3.3
|
60
|
+
[0.3.2]: https://github.com/spenserblack/repofetch/compare/v0.3.1...v0.3.2
|
61
|
+
[0.3.1]: https://github.com/spenserblack/repofetch/compare/v0.3.0...v0.3.1
|
62
|
+
[0.3.0]: https://github.com/spenserblack/repofetch/compare/v0.2.1...v0.3.0
|
63
|
+
[0.2.1]: https://github.com/spenserblack/repofetch/compare/v0.2.0...v0.2.1
|
64
|
+
[0.2.0]: https://github.com/spenserblack/repofetch/compare/v0.1.0...v0.2.0
|
data/CODEOWNERS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
* @spenserblack
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
# Contributing
|
2
|
+
|
3
|
+
## Contributing to repofetch
|
4
|
+
|
5
|
+
### Initializing your repository
|
6
|
+
|
7
|
+
This will install dependencies and also set up git to run code quality checks
|
8
|
+
when you attempt to make a commit. If you are using a codespace, this should
|
9
|
+
run automatically.
|
10
|
+
|
11
|
+
```bash
|
12
|
+
bundle install
|
13
|
+
bundle exec overcommit --install
|
14
|
+
```
|
15
|
+
|
16
|
+
## Writing a 3rd-party plugin
|
17
|
+
|
18
|
+
3rd-party plugins are Ruby gems that users can install and activate in their
|
19
|
+
configuration files.
|
20
|
+
|
21
|
+
You can view an officially supported plugin, like `Repofetch::Github`, as an
|
22
|
+
example for writing a plugin.
|
23
|
+
|
24
|
+
The easiest way to set up a plugin is to inherit from `Repofetch::Plugin`, which
|
25
|
+
will provide several helper methods that repofetch relies on to construct the
|
26
|
+
output. A few methods need to be implemented to complete your plugin:
|
27
|
+
|
28
|
+
### Required Plugin Class Methods
|
29
|
+
|
30
|
+
#### Detecting if repofetch should use a plugin
|
31
|
+
|
32
|
+
When a user does *not* explicitly choose their plugin from the command-line,
|
33
|
+
repofetch must select the plugin by matching it against a directory. `matches_repo?`
|
34
|
+
is a class method that takes a [`Git::Base`][git-base] instance and returns `true`
|
35
|
+
if repofetch should use the plugin for that repository, and `false` if repofetch should
|
36
|
+
not use the plugin (e.g. a GitHub plugin would return `false` for a GitLab repository).
|
37
|
+
|
38
|
+
#### Constructing the Plugin Instance
|
39
|
+
|
40
|
+
When repofetch selects a plugin using `matches_repo?`, it will then try to create an
|
41
|
+
instance of that plugin by calling `from_git`. From git will receive the
|
42
|
+
[`Git::Base`][git-base] instance, an array of CLI args that the plugin can use, and
|
43
|
+
an instance of `Repofetch::Config`.
|
44
|
+
|
45
|
+
If the user explicitly chooses the plugin to use via `repofetch --plugin <plugin>`, then
|
46
|
+
repofetch will pick that plugin and call its `from_args` class method. `from_args` takes
|
47
|
+
an array of CLI args and an instance of `Repofetch::Config`.
|
48
|
+
|
49
|
+
### Required Plugin Instance Methods
|
50
|
+
|
51
|
+
The following requirements assume you are *not* manually implementing a plugin's
|
52
|
+
`to_s` method, and you are inheriting from `Repofetch::Plugin`.
|
53
|
+
|
54
|
+
- `ascii` should return a string for the ASCII art
|
55
|
+
- `header` should return the header text that will be above the `---` separator on the right side.
|
56
|
+
- `stats` should return an array of values that implement `to_s`. These will be
|
57
|
+
the stats displayed to the right of the ASCII art. You can use`Repofetch::Stat` and
|
58
|
+
`Repofetch::TimespanStat` to create a pretty stat.
|
59
|
+
|
60
|
+
The following are optional.
|
61
|
+
|
62
|
+
- `theme` can return an instance of `Repofetch::Theme` to use a different color scheme.
|
63
|
+
|
64
|
+
### Authoring ASCII Art
|
65
|
+
|
66
|
+
The ASCII art should be no more than 40 characters wide or 20 characters tall.
|
67
|
+
It can receive ANSI escape sequences for styling by using `%{<style>}`. For example,
|
68
|
+
using the default theme, `%{red}foo%{reset}` would print `foo` with red text. See the
|
69
|
+
source code of `Repofetch::Theme` for all available default styles.
|
70
|
+
|
71
|
+
### Registering a Plugin
|
72
|
+
|
73
|
+
A plugin must register itself so that repofetch can discover it. You can call either
|
74
|
+
the plugin class's `register` method, or `Repofetch.register_plugin`.
|
75
|
+
|
76
|
+
### Example Plugin
|
77
|
+
|
78
|
+
This is a simple example of a plugin.
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
require 'repofetch'
|
82
|
+
|
83
|
+
class MyCoolPlugin < Repofetch::Plugin
|
84
|
+
def initialize(detected_from_git, arg_count)
|
85
|
+
@detected_from_git = detected_from_git
|
86
|
+
@arg_count = arg_count
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.from_git(git, args, _config)
|
90
|
+
new(true, args.length)
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.from_args(args, _config)
|
94
|
+
new(false, args.length)
|
95
|
+
end
|
96
|
+
|
97
|
+
def ascii
|
98
|
+
<<~ASCII
|
99
|
+
####################
|
100
|
+
# %{bold}Hello, World%{reset} #
|
101
|
+
####################
|
102
|
+
ASCII
|
103
|
+
end
|
104
|
+
|
105
|
+
def header
|
106
|
+
# NOTE: theme is provided by the base Plugin class
|
107
|
+
"stats from #{theme.format(:underline, 'my plugin')}"
|
108
|
+
end
|
109
|
+
|
110
|
+
def stats
|
111
|
+
# if theme is not passed, the stat will not be styled
|
112
|
+
[
|
113
|
+
Repofetch::Stat.new('git repo detected', @detected_from_git, emoji: '📂', theme: theme),
|
114
|
+
Repofetch::Stat.new('args passed', @arg_count, theme: theme)
|
115
|
+
]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# When the user adds your plugin to their configuration file, this line will register the plugin
|
120
|
+
MyCoolPlugin.register
|
121
|
+
```
|
122
|
+
|
123
|
+
[git-base]: https://www.rubydoc.info/github/ruby-git/ruby-git/Git/Base
|
data/CREDITS.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Credits
|
2
|
+
|
3
|
+
A special thanks to all listed below!
|
4
|
+
|
5
|
+
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
6
|
+
<!-- prettier-ignore-start -->
|
7
|
+
<!-- markdownlint-disable -->
|
8
|
+
<table>
|
9
|
+
<tbody>
|
10
|
+
<tr>
|
11
|
+
<td align="center"><a href="http://orhun.dev"><img src="https://avatars.githubusercontent.com/u/24392180?v=4?s=100" width="100px;" alt="Orhun Parmaksız"/><br /><sub><b>Orhun Parmaksız</b></sub></a><br /><a href="#bug-orhun" title="Bug reports">🐛</a> <a href="#code-orhun" title="Code">💻</a></td>
|
12
|
+
<td align="center"><a href="https://github.com/0323pin"><img src="https://avatars.githubusercontent.com/u/90570748?v=4?s=100" width="100px;" alt="pin"/><br /><sub><b>pin</b></sub></a><br /><a href="#platform-0323pin" title="Packaging/porting to new platform">📦</a></td>
|
13
|
+
</tr>
|
14
|
+
</tbody>
|
15
|
+
</table>
|
16
|
+
|
17
|
+
<!-- markdownlint-restore -->
|
18
|
+
<!-- prettier-ignore-end -->
|
19
|
+
|
20
|
+
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
repofetch (0.4.0)
|
5
|
+
actionview (~> 7.0, >= 7.0.4)
|
6
|
+
dotenv (~> 2.8)
|
7
|
+
faraday-retry (~> 2.0)
|
8
|
+
git (~> 1.12)
|
9
|
+
octokit (~> 6.0, >= 6.0.1)
|
10
|
+
|
11
|
+
GEM
|
12
|
+
remote: https://rubygems.org/
|
13
|
+
specs:
|
14
|
+
actionview (7.0.4)
|
15
|
+
activesupport (= 7.0.4)
|
16
|
+
builder (~> 3.1)
|
17
|
+
erubi (~> 1.4)
|
18
|
+
rails-dom-testing (~> 2.0)
|
19
|
+
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
20
|
+
activesupport (7.0.4)
|
21
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
22
|
+
i18n (>= 1.6, < 2)
|
23
|
+
minitest (>= 5.1)
|
24
|
+
tzinfo (~> 2.0)
|
25
|
+
addressable (2.8.1)
|
26
|
+
public_suffix (>= 2.0.2, < 6.0)
|
27
|
+
ast (2.4.2)
|
28
|
+
awesome_print (1.9.2)
|
29
|
+
builder (3.2.4)
|
30
|
+
childprocess (4.1.0)
|
31
|
+
concurrent-ruby (1.1.10)
|
32
|
+
crass (1.0.6)
|
33
|
+
diff-lcs (1.5.0)
|
34
|
+
docile (1.4.0)
|
35
|
+
dotenv (2.8.1)
|
36
|
+
erubi (1.11.0)
|
37
|
+
faraday (2.7.1)
|
38
|
+
faraday-net_http (>= 2.0, < 3.1)
|
39
|
+
ruby2_keywords (>= 0.0.4)
|
40
|
+
faraday-net_http (3.0.2)
|
41
|
+
faraday-retry (2.0.0)
|
42
|
+
faraday (~> 2.0)
|
43
|
+
git (1.12.0)
|
44
|
+
addressable (~> 2.8)
|
45
|
+
rchardet (~> 1.8)
|
46
|
+
i18n (1.12.0)
|
47
|
+
concurrent-ruby (~> 1.0)
|
48
|
+
iniparse (1.5.0)
|
49
|
+
json (2.6.2)
|
50
|
+
loofah (2.19.0)
|
51
|
+
crass (~> 1.0.2)
|
52
|
+
nokogiri (>= 1.5.9)
|
53
|
+
mini_portile2 (2.8.0)
|
54
|
+
minitest (5.16.3)
|
55
|
+
nokogiri (1.13.9)
|
56
|
+
mini_portile2 (~> 2.8.0)
|
57
|
+
racc (~> 1.4)
|
58
|
+
octokit (6.0.1)
|
59
|
+
faraday (>= 1, < 3)
|
60
|
+
sawyer (~> 0.9)
|
61
|
+
overcommit (0.59.1)
|
62
|
+
childprocess (>= 0.6.3, < 5)
|
63
|
+
iniparse (~> 1.4)
|
64
|
+
rexml (~> 3.2)
|
65
|
+
parallel (1.22.1)
|
66
|
+
parser (3.1.3.0)
|
67
|
+
ast (~> 2.4.1)
|
68
|
+
public_suffix (5.0.0)
|
69
|
+
racc (1.6.0)
|
70
|
+
rails-dom-testing (2.0.3)
|
71
|
+
activesupport (>= 4.2.0)
|
72
|
+
nokogiri (>= 1.6)
|
73
|
+
rails-html-sanitizer (1.4.3)
|
74
|
+
loofah (~> 2.3)
|
75
|
+
rainbow (3.1.1)
|
76
|
+
rake (13.0.6)
|
77
|
+
rchardet (1.8.0)
|
78
|
+
regexp_parser (2.6.1)
|
79
|
+
rexml (3.2.5)
|
80
|
+
rspec (3.12.0)
|
81
|
+
rspec-core (~> 3.12.0)
|
82
|
+
rspec-expectations (~> 3.12.0)
|
83
|
+
rspec-mocks (~> 3.12.0)
|
84
|
+
rspec-core (3.12.0)
|
85
|
+
rspec-support (~> 3.12.0)
|
86
|
+
rspec-expectations (3.12.0)
|
87
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
88
|
+
rspec-support (~> 3.12.0)
|
89
|
+
rspec-mocks (3.12.0)
|
90
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
91
|
+
rspec-support (~> 3.12.0)
|
92
|
+
rspec-snapshot (2.0.1)
|
93
|
+
awesome_print (> 1.0.0)
|
94
|
+
rspec (> 3.0.0)
|
95
|
+
rspec-support (3.12.0)
|
96
|
+
rubocop (1.39.0)
|
97
|
+
json (~> 2.3)
|
98
|
+
parallel (~> 1.10)
|
99
|
+
parser (>= 3.1.2.1)
|
100
|
+
rainbow (>= 2.2.2, < 4.0)
|
101
|
+
regexp_parser (>= 1.8, < 3.0)
|
102
|
+
rexml (>= 3.2.5, < 4.0)
|
103
|
+
rubocop-ast (>= 1.23.0, < 2.0)
|
104
|
+
ruby-progressbar (~> 1.7)
|
105
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
106
|
+
rubocop-ast (1.24.0)
|
107
|
+
parser (>= 3.1.1.0)
|
108
|
+
rubocop-rake (0.6.0)
|
109
|
+
rubocop (~> 1.0)
|
110
|
+
rubocop-rspec (2.15.0)
|
111
|
+
rubocop (~> 1.33)
|
112
|
+
ruby-progressbar (1.11.0)
|
113
|
+
ruby2_keywords (0.0.5)
|
114
|
+
sawyer (0.9.2)
|
115
|
+
addressable (>= 2.3.5)
|
116
|
+
faraday (>= 0.17.3, < 3)
|
117
|
+
simplecov (0.21.2)
|
118
|
+
docile (~> 1.1)
|
119
|
+
simplecov-html (~> 0.11)
|
120
|
+
simplecov_json_formatter (~> 0.1)
|
121
|
+
simplecov-cobertura (2.1.0)
|
122
|
+
rexml
|
123
|
+
simplecov (~> 0.19)
|
124
|
+
simplecov-html (0.12.3)
|
125
|
+
simplecov_json_formatter (0.1.4)
|
126
|
+
tzinfo (2.0.5)
|
127
|
+
concurrent-ruby (~> 1.0)
|
128
|
+
unicode-display_width (2.3.0)
|
129
|
+
|
130
|
+
PLATFORMS
|
131
|
+
ruby
|
132
|
+
|
133
|
+
DEPENDENCIES
|
134
|
+
bundler (~> 2.0)
|
135
|
+
overcommit (~> 0.59)
|
136
|
+
rake (~> 13.0)
|
137
|
+
repofetch!
|
138
|
+
rspec (~> 3.11)
|
139
|
+
rspec-snapshot (~> 2.0)
|
140
|
+
rubocop (~> 1.36)
|
141
|
+
rubocop-rake (~> 0.6)
|
142
|
+
rubocop-rspec (~> 2.13)
|
143
|
+
simplecov (~> 0.21)
|
144
|
+
simplecov-cobertura (~> 2.1)
|
145
|
+
|
146
|
+
BUNDLED WITH
|
147
|
+
2.1.2
|
data/LICENSE
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2022 Spenser Black
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any
|
6
|
+
person obtaining a copy of this software and associated
|
7
|
+
documentation files (the "Software"), to deal in the
|
8
|
+
Software without restriction, including without
|
9
|
+
limitation the rights to use, copy, modify, merge,
|
10
|
+
publish, distribute, sublicense, and/or sell copies of
|
11
|
+
the Software, and to permit persons to whom the Software
|
12
|
+
is furnished to do so, subject to the following
|
13
|
+
conditions:
|
14
|
+
|
15
|
+
The above copyright notice and this permission notice
|
16
|
+
shall be included in all copies or substantial portions
|
17
|
+
of the Software.
|
18
|
+
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
|
20
|
+
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
21
|
+
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
22
|
+
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
23
|
+
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
24
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
25
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
26
|
+
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
27
|
+
DEALINGS IN THE SOFTWARE.
|
data/Makefile
ADDED
data/README.md
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# `repofetch`
|
2
|
+
|
3
|
+
[](./CREDITS.md)
|
4
|
+

|
5
|
+
[](https://github.com/spenserblack/repofetch/actions/workflows/codeql.yml)
|
6
|
+
[](https://codecov.io/gh/spenserblack/repofetch)
|
7
|
+
|
8
|
+
Fetch details about your remote repository.
|
9
|
+
|
10
|
+
## Description
|
11
|
+
|
12
|
+
repofetch is a CLI tool to fetch stats (think [neofetch] or
|
13
|
+
[onefetch]) that uses plugins for its implementation. The original version was focused on
|
14
|
+
repository stats, and any official plugin will be for repositories, hence the "repo" in
|
15
|
+
repofetch. With 3rd-party plugins, however, it can support other types of outputs, too.
|
16
|
+
|
17
|
+
## Installation
|
18
|
+
|
19
|
+
### NetBSD (version <= 0.3.3)
|
20
|
+
|
21
|
+
Pre-compiled binaries are available from the [official repositories](https://pkgsrc.se/sysutils/repofetch)
|
22
|
+
To install this, simply run:
|
23
|
+
|
24
|
+
```bash
|
25
|
+
pkgin install repofetch
|
26
|
+
```
|
27
|
+
|
28
|
+
Or, if you prefer to build it from source:
|
29
|
+
|
30
|
+
```
|
31
|
+
cd /usr/pkgsrc/sysutils/repofetch
|
32
|
+
make install
|
33
|
+
```
|
34
|
+
|
35
|
+
You need to have `rust` and `libgit2` installed in order to build the package.
|
36
|
+
|
37
|
+
## Configuration
|
38
|
+
|
39
|
+
A file called `.repofetch.yml` in your home directory will configure repofetch. The
|
40
|
+
first time you run `repofetch`, the default configuration will be written to this file.
|
41
|
+
|
42
|
+
Files called `.repofetch.env` and `repofetch.env` in your home directory will set
|
43
|
+
environment variables for repofetch, via the [dotenv gem][dotenv]. These environment
|
44
|
+
variables can be useful for plugins that require secrets. The purpose of these files
|
45
|
+
is to separate secrets from configuration, so that, for example, you could add
|
46
|
+
`.repofetch.yml` to a dotfiles repository without compromising an API token.
|
47
|
+
|
48
|
+
You can find the absolute paths to these files with the `--help` option.
|
49
|
+
|
50
|
+
### Examples
|
51
|
+
|
52
|
+
```yaml
|
53
|
+
# .repofetch.yml
|
54
|
+
plugins:
|
55
|
+
- 'repofetch/github'
|
56
|
+
```
|
57
|
+
|
58
|
+
```dotenv
|
59
|
+
# .repofetch.env
|
60
|
+
# Assuming you have gh (the GitHub CLI) installed
|
61
|
+
GITHUB_TOKEN=$(gh auth token)
|
62
|
+
```
|
63
|
+
|
64
|
+
[dotenv]: https://github.com/bkeepers/dotenv
|
65
|
+
[neofetch]: https://github.com/dylanaraps/neofetch
|
66
|
+
[onefetch]: https://github.com/o2sh/onefetch
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'rake'
|
5
|
+
|
6
|
+
require 'rspec/core/rake_task'
|
7
|
+
require 'rubocop/rake_task'
|
8
|
+
|
9
|
+
RSpec::Core::RakeTask.new(:spec)
|
10
|
+
RuboCop::RakeTask.new(:format) do |t|
|
11
|
+
t.requires << 'rubocop-rspec'
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'Run tests'
|
15
|
+
task default: %i[format spec]
|
data/exe/repofetch
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'git'
|
5
|
+
require 'optparse'
|
6
|
+
require 'repofetch'
|
7
|
+
require 'repofetch/config'
|
8
|
+
require 'repofetch/env'
|
9
|
+
|
10
|
+
Repofetch::Env.load
|
11
|
+
config = Repofetch::Config.load!
|
12
|
+
|
13
|
+
config.plugins.each { |plugin| require plugin }
|
14
|
+
|
15
|
+
options = {
|
16
|
+
plugin: nil,
|
17
|
+
repository: '.'
|
18
|
+
}
|
19
|
+
|
20
|
+
available_plugins = Repofetch.plugins.to_h { |plugin| [plugin.name, plugin] }
|
21
|
+
|
22
|
+
command = OptionParser.new do |opts|
|
23
|
+
opts.banner = 'Usage: repofetch [options] -- [plugin arguments]'
|
24
|
+
|
25
|
+
opts.on('-r', '--repository PATH', 'Use the provided repository. Defaults to the current directory.') do |path|
|
26
|
+
options[:repository] = path
|
27
|
+
end
|
28
|
+
|
29
|
+
opts.on('-p', '--plugin PLUGIN', 'Use the specified plugin') do |plugin|
|
30
|
+
options[:plugin] = available_plugins[plugin]
|
31
|
+
end
|
32
|
+
|
33
|
+
Repofetch.plugins.each do |plugin|
|
34
|
+
opts.on("--#{plugin.name.sub(/::/, '-').downcase}", "Shortcut for --plugin #{plugin.name}") do
|
35
|
+
options[:plugin] = plugin
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
opts.separator ''
|
40
|
+
dotenv_paths = Repofetch::Env::DOTENV_PATHS.join(', ')
|
41
|
+
opts.separator "The following dotenv files can be used to set environment variables: #{dotenv_paths}"
|
42
|
+
opts.separator ''
|
43
|
+
opts.separator "You config file is at #{Repofetch::Config::PATH}"
|
44
|
+
opts.separator "Installed plugins: #{available_plugins.keys.join(', ')}"
|
45
|
+
end
|
46
|
+
|
47
|
+
command.parse!
|
48
|
+
|
49
|
+
git = Git.open(options[:repository])
|
50
|
+
plugin_class = options[:plugin]
|
51
|
+
# NOTE: If the user explicitly selected a plugin, then it is constructed from CLI args.
|
52
|
+
# Otherwise, we try to build it from the repository.
|
53
|
+
begin
|
54
|
+
plugin = plugin_class.nil? ? Repofetch.get_plugin(git, ARGV, config) : plugin_class.from_args(ARGV, config)
|
55
|
+
rescue ArgumentError => e
|
56
|
+
warn e
|
57
|
+
exit 1
|
58
|
+
end
|
59
|
+
|
60
|
+
puts plugin
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
class Repofetch
|
6
|
+
# Utilities for managing config.
|
7
|
+
class Config
|
8
|
+
PATH = File.expand_path('.repofetch.yml', Dir.home)
|
9
|
+
DEFAULT_CONFIG = File.read(File.expand_path('DEFAULT_CONFIG', __dir__))
|
10
|
+
|
11
|
+
# Loads from config file.
|
12
|
+
def self.load
|
13
|
+
new(File.read(PATH))
|
14
|
+
end
|
15
|
+
|
16
|
+
# Loads from a config file if it exists. If it doesn't, it writes the config file,
|
17
|
+
# then creates a default.
|
18
|
+
def self.load!
|
19
|
+
if File.exist?(PATH)
|
20
|
+
self.load
|
21
|
+
else
|
22
|
+
File.write(PATH, DEFAULT_CONFIG)
|
23
|
+
new(DEFAULT_CONFIG)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# @param config_yaml [String] a YAML string
|
28
|
+
def initialize(config_yaml = DEFAULT_CONFIG)
|
29
|
+
@config = YAML.safe_load(config_yaml, symbolize_names: true)
|
30
|
+
end
|
31
|
+
|
32
|
+
def plugins
|
33
|
+
@config[:plugins] || []
|
34
|
+
end
|
35
|
+
|
36
|
+
def [](key)
|
37
|
+
@config[key]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'dotenv'
|
4
|
+
|
5
|
+
class Repofetch
|
6
|
+
# Environment variable manager. Basically a wrapper around dotenv.
|
7
|
+
class Env
|
8
|
+
DOTENV_NAMES = ['repofetch.env', '.repofetch.env'].freeze
|
9
|
+
DOTENV_PATHS = DOTENV_NAMES.map { |name| File.expand_path(name, Dir.home) }
|
10
|
+
|
11
|
+
def self.load
|
12
|
+
DOTENV_PATHS.each { |dotenv| Dotenv.load(dotenv) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
.ooOOOOOOOoo.
|
2
|
+
.oOOOOOOOOOOOOOOOOOo.
|
3
|
+
.oOOOOOOOOOOOOOOOOOOOOOOo.
|
4
|
+
.oOOOOOOOOOOOOOOOOOOOOOOOOOOOo
|
5
|
+
.OOOOO OO-------OO OOOOo
|
6
|
+
oOOOOOO OOOOOo
|
7
|
+
.OOOOOOO OOOOOOo
|
8
|
+
oOOOOOO OOOOOOo
|
9
|
+
OOOOOOo oOOOOOO
|
10
|
+
OOOOOO. .OOOOOO
|
11
|
+
OOOOOOO OOOOOOO
|
12
|
+
.OOOOOOo oOOOOOO.
|
13
|
+
OOOOOOOo. .OOOOOOO.
|
14
|
+
oOOO|\OOOoo./ \.ooOOOOOOOOo
|
15
|
+
.OOO \\OO/ \OOOOOOOOO.
|
16
|
+
OO. OOOOOOOOO
|
17
|
+
OOOOOOO OOOOOOO
|
18
|
+
OOO OOO
|
19
|
+
|
20
|
+
|