cani 0.5.4 → 0.5.5
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 +4 -4
- data/README.md +30 -3
- data/lib/cani.rb +23 -9
- data/lib/cani/completions.rb +49 -33
- data/lib/cani/config.rb +27 -9
- data/lib/cani/fzf.rb +5 -1
- data/lib/cani/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1779bf69b0e5700933653fecb00fc5d01afa4356fdb9b0f6e3c33dee79e83b40
|
4
|
+
data.tar.gz: 54b9a94174250fc18a2593c05a474f3fa15e1f106f9146dd2fcb91373733a10f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d9d4bb3348016465616eaea9463e5f34a1f67b2f53bbd4ceba9c0395641c28f5de9144051af7e319986b7f712f3a84782ef218460911bbcd0a494987bf1f326f
|
7
|
+
data.tar.gz: 4f75d70a8ad7ca34887baadbf2ee1273d452aa3b63c945c1c687c5c35ff000576347e026d8af9763c82e011f682244541684ca5d7ec0f1a633933719314b8f69
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Cani — a [caniuse.com](caniuse.com) tui interface  [](rubygems.org/gems/cani) [](https://github.com/SidOfc/cani/issues)
|
1
|
+
# Cani — a [caniuse.com](caniuse.com) tui interface  [](https://rubygems.org/gems/cani) [](https://github.com/SidOfc/cani/issues)
|
2
2
|
|
3
3
|

|
4
4
|
|
@@ -34,7 +34,7 @@ Or install it yourself as:
|
|
34
34
|
|
35
35
|
**dependencies**
|
36
36
|
|
37
|
-
Cani depends on [fzf](https://github.com/junegunn/fzf) to display most menu's.
|
37
|
+
Cani depends on [fzf](https://github.com/junegunn/fzf) to display most menu's and Curses for displaying the feature support table.
|
38
38
|
<!-- Fzf is not a requirement when piping the output to another command -->
|
39
39
|
|
40
40
|
## Configuration
|
@@ -47,11 +47,16 @@ After installation, running the command (`cani`) for the first time will create
|
|
47
47
|
- `~/.config/cani/completions/_cani.zsh` - zsh completion
|
48
48
|
- `~/.config/fish/completions/cani.fish` - fish completions
|
49
49
|
|
50
|
-
|
50
|
+
**Existing shell configuration files will also be modified by default:**
|
51
51
|
|
52
52
|
- `~/.bashrc` - A source line to bash completions will be added, or updated if it exists
|
53
53
|
- `~/.zshrc` - A source line to zsh completions will be added, or updated if it exists
|
54
54
|
|
55
|
+
This behavior can be permanently disabled at any time by adding the `--no-modify`
|
56
|
+
[option](#options) at the end of the `cani` command. A built-in command is provided to print
|
57
|
+
the completion paths for each shell: [`cani completion_paths`](#completion_paths). This allows
|
58
|
+
you to add the path manually.
|
59
|
+
|
55
60
|
After running the command for the first time, please restart your shell or `source` your `~/.*rc` file to load completions.
|
56
61
|
There are some commented settings that can be adjusted in the `~/.config/cani/config.yml` file.
|
57
62
|
|
@@ -66,9 +71,17 @@ Cani supports the following actions:
|
|
66
71
|
- [`version`](#version) - print the version number
|
67
72
|
- [`update`](#update) - force update data and completions
|
68
73
|
- [`install_completions`](#install_completions) - install shell completions
|
74
|
+
- [`completion_paths`](#completion_paths) - prints paths to shell completion files (for sourcing)
|
69
75
|
- [`purge`](#purge) - purge files and directories created by `cani`
|
70
76
|
- [`edit`](#edit) - edit the default configuration file with `$EDITOR`
|
71
77
|
|
78
|
+
## Options
|
79
|
+
|
80
|
+
`cani` supports the following command line flags / options:
|
81
|
+
|
82
|
+
- `--no-modify` - permanently disable automatic addition / deletion of shell config files.
|
83
|
+
- `--modify` - permanently enable automatic addition / deletion of shell config files.
|
84
|
+
|
72
85
|
### use
|
73
86
|
|
74
87
|
```sh
|
@@ -157,6 +170,20 @@ Completions are supported for `zsh`, `bash` and `fish` shells (currently).
|
|
157
170
|
They are automatically installed upon first invocation of the `cani` command.
|
158
171
|
This command is only a fallback in case there were any issues with permissions etc..
|
159
172
|
|
173
|
+
### completion_paths
|
174
|
+
|
175
|
+
When `--no-modify` is applied the completion paths are no longer automatically inserted
|
176
|
+
in your shell configuration files. In order to figure out where the files you need to
|
177
|
+
source are located, you can run this command. It will output something like this:
|
178
|
+
|
179
|
+
```plain
|
180
|
+
fish: /home/sidofc/.config/fish/completions/cani.fish
|
181
|
+
bash: /home/sidofc/.config/cani/completions/_cani.bash
|
182
|
+
zsh: /home/sidofc/.config/cani/completions/_cani.zsh
|
183
|
+
```
|
184
|
+
|
185
|
+
The fish completions are autoloaded and do not need to be sourced manually.
|
186
|
+
|
160
187
|
### purge
|
161
188
|
|
162
189
|
```sh
|
data/lib/cani.rb
CHANGED
@@ -23,8 +23,10 @@ module Cani
|
|
23
23
|
@settings ||= Config.new
|
24
24
|
end
|
25
25
|
|
26
|
+
def self.exec!(command, *args_and_options)
|
27
|
+
return config if command.start_with? '-'
|
26
28
|
|
27
|
-
|
29
|
+
args = args_and_options.reject { |arg| arg.start_with? '-' }
|
28
30
|
command = :help unless command && respond_to?(command)
|
29
31
|
command = command.to_s.downcase.to_sym
|
30
32
|
|
@@ -35,7 +37,8 @@ module Cani
|
|
35
37
|
use args[0]
|
36
38
|
when :show
|
37
39
|
show args[0], args[1]
|
38
|
-
when :update, :purge, :help, :version,
|
40
|
+
when :update, :purge, :help, :version,
|
41
|
+
:install_completions, :completion_paths
|
39
42
|
send command
|
40
43
|
else
|
41
44
|
help
|
@@ -52,20 +55,23 @@ module Cani
|
|
52
55
|
puts 'in the \'use\' overview or calling \'use some-feature\' will display a'.light_black
|
53
56
|
puts 'table as seen on caniuse.com using curses.'.light_black
|
54
57
|
puts ''
|
55
|
-
puts 'cani is dependent on fzf (https://github.com/junegunn/fzf)
|
56
|
-
puts '
|
58
|
+
puts 'cani is dependent on fzf (https://github.com/junegunn/fzf)'.light_black
|
59
|
+
puts 'for the interactive TUI to work. Without fzf,'.light_black
|
60
|
+
puts 'commands can still be piped to get the regular (colorless) output.'.light_black
|
57
61
|
puts ''
|
58
|
-
puts 'Cani requires at least 20 lines and 40 cols to work properly,
|
59
|
-
puts 'below this width
|
62
|
+
puts 'Cani requires at least 20 lines and 40 cols to work properly,'.light_black
|
63
|
+
puts 'this is not a hard limit but below this width long lines could wrap'.light_black
|
64
|
+
puts 'a lot and significantly reduce visible information.'.light_black
|
60
65
|
puts ''
|
61
66
|
puts 'Usage:'.red
|
62
|
-
puts ' cani'.yellow + ' [COMMAND [ARGUMENTS]]'
|
67
|
+
puts ' cani'.yellow + ' [COMMAND [ARGUMENTS] [OPTIONS]]'
|
63
68
|
puts ''
|
64
69
|
puts 'Commands:'.red
|
65
70
|
puts ' use '.blue + ' [FEATURE] ' + 'show browser support for FEATURE'.light_black
|
66
71
|
puts ' show'.blue + ' [BROWSER [VERSION]] ' + 'show information about specific BROWSER and VERSION'.light_black
|
67
72
|
puts ' '
|
68
73
|
puts ' install_completions '.blue + 'installs completions for bash, zsh and fish'.light_black
|
74
|
+
puts ' completion_paths '.blue + 'prints completion paths that must be sourced in your shell configuration files'.light_black
|
69
75
|
puts ' update '.blue + 'force update api data and completions'.light_black
|
70
76
|
puts ' edit '.blue + 'edit configuration in $EDITOR'.light_black
|
71
77
|
puts ' purge '.blue + 'remove all completion, configuration and data'.light_black
|
@@ -74,6 +80,10 @@ module Cani
|
|
74
80
|
puts ' help '.blue + 'show this help'.light_black
|
75
81
|
puts ' version '.blue + 'print the version number'.light_black
|
76
82
|
puts ''
|
83
|
+
puts 'Options:'.red
|
84
|
+
puts ' --[no-]modify '.white + 'permanently enable/disable automatic adding/removing'.light_black
|
85
|
+
puts ' '.white + 'of source lines in shell configuration files'.light_black
|
86
|
+
puts ''
|
77
87
|
puts 'Examples:'.red
|
78
88
|
puts ' cani'.yellow + ' use'.blue
|
79
89
|
puts ' cani'.yellow + ' use'.blue + ' \'box-shadow\''
|
@@ -95,8 +105,12 @@ module Cani
|
|
95
105
|
puts VERSION
|
96
106
|
end
|
97
107
|
|
108
|
+
def self.completion_paths
|
109
|
+
Completions.paths
|
110
|
+
end
|
111
|
+
|
98
112
|
def self.install_completions
|
99
|
-
Completions.install!
|
113
|
+
Completions.install! || exit(1)
|
100
114
|
end
|
101
115
|
|
102
116
|
def self.purge
|
@@ -106,7 +120,7 @@ module Cani
|
|
106
120
|
end
|
107
121
|
|
108
122
|
def self.update
|
109
|
-
api.update! &&
|
123
|
+
api.update! && install_completions unless api.updated?
|
110
124
|
end
|
111
125
|
|
112
126
|
def self.edit
|
data/lib/cani/completions.rb
CHANGED
@@ -7,14 +7,14 @@ module Cani
|
|
7
7
|
shw = Cani.api.browsers.reduce String.new do |acc, browser|
|
8
8
|
versions = browser.versions.reverse.join(' ')
|
9
9
|
acc +
|
10
|
-
|
11
|
-
|
10
|
+
"\ncomplete -f -c cani -n '__fish_cani_using_command show' -a '#{browser.abbr}' -d '#{browser.label}'" +
|
11
|
+
"\ncomplete -f -c cani -n '__fish_cani_showing_browser #{browser.abbr}' -a '#{versions}'"
|
12
12
|
end
|
13
13
|
|
14
14
|
use = Cani.api.features.reduce String.new do |acc, feature|
|
15
15
|
description = feature.title.size > 40 ? feature.title[0..28] + '..' : feature.title
|
16
16
|
acc +
|
17
|
-
|
17
|
+
"\ncomplete -f -c cani -n '__fish_cani_using_command use' -a '#{feature.name}' -d '#{description}'"
|
18
18
|
end
|
19
19
|
|
20
20
|
tpl + shw + "\n" + use
|
@@ -26,8 +26,8 @@ module Cani
|
|
26
26
|
indent = 10
|
27
27
|
versions = Cani.api.browsers.reduce String.new do |acc, browser|
|
28
28
|
acc + (' ' * (indent - 2)) + browser.abbr + ")\n" +
|
29
|
-
|
30
|
-
|
29
|
+
(' ' * indent) + "_arguments -C \"1: :(#{browser.versions.join(' ')})\"\n" +
|
30
|
+
(' ' * indent) + ";;\n"
|
31
31
|
end.strip
|
32
32
|
|
33
33
|
tpl.gsub('{{names}}', Cani.api.browsers.map(&:abbr).join(' '))
|
@@ -41,8 +41,8 @@ module Cani
|
|
41
41
|
indent = 10
|
42
42
|
versions = Cani.api.browsers.reduce String.new do |acc, browser|
|
43
43
|
acc + (' ' * (indent - 2)) + '"' + browser.abbr + "\")\n" +
|
44
|
-
|
45
|
-
|
44
|
+
(' ' * indent) + "COMPREPLY=($(compgen -W \"#{browser.versions.join(' ')}\" ${COMP_WORDS[COMP_CWORD]}))\n" +
|
45
|
+
(' ' * indent) + ";;\n"
|
46
46
|
end.strip
|
47
47
|
|
48
48
|
tpl.gsub('{{names}}', Cani.api.browsers.map(&:abbr).join(' '))
|
@@ -55,13 +55,8 @@ module Cani
|
|
55
55
|
FileUtils.mkdir_p Cani.config.fish_comp_dir
|
56
56
|
FileUtils.mkdir_p Cani.config.comp_dir
|
57
57
|
|
58
|
-
|
59
|
-
|
60
|
-
file << generate_fish
|
61
|
-
end
|
62
|
-
|
63
|
-
%w[bash zsh].each do |shell|
|
64
|
-
File.open File.join(Cani.config.comp_dir, "_cani.#{shell}"), 'w' do |file|
|
58
|
+
%w[bash zsh fish].each do |shell|
|
59
|
+
File.open completion_path(shell), 'w' do |file|
|
65
60
|
file << send("generate_#{shell}")
|
66
61
|
end
|
67
62
|
end
|
@@ -71,12 +66,8 @@ module Cani
|
|
71
66
|
end
|
72
67
|
|
73
68
|
def self.remove!
|
74
|
-
|
75
|
-
|
76
|
-
File.unlink fish_comp if File.exist? fish_comp
|
77
|
-
|
78
|
-
%w[bash zsh].each do |shell|
|
79
|
-
shell_comp = File.join Cani.config.comp_dir, "_cani.#{shell}"
|
69
|
+
%w[bash zsh fish].each do |shell|
|
70
|
+
shell_comp = completion_path shell
|
80
71
|
|
81
72
|
File.unlink shell_comp if File.exist? shell_comp
|
82
73
|
end
|
@@ -85,12 +76,36 @@ module Cani
|
|
85
76
|
delete_source_lines!
|
86
77
|
end
|
87
78
|
|
79
|
+
def self.paths
|
80
|
+
puts "fish: #{completion_path(:fish)}"
|
81
|
+
puts "bash: #{completion_path(:bash)}"
|
82
|
+
puts "zsh: #{completion_path(:zsh)}"
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.completion_path(shell)
|
86
|
+
return File.join Cani.config.fish_comp_dir, 'cani.fish' if shell == :fish
|
87
|
+
|
88
|
+
File.join Cani.config.comp_dir, "_cani.#{shell}"
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.compile_source_line(path)
|
92
|
+
return "test -e #{path}; and source #{path}" if path.end_with? '.fish'
|
93
|
+
|
94
|
+
"[ -f #{path} ] && source #{path}"
|
95
|
+
end
|
96
|
+
|
88
97
|
def self.delete_source_lines!
|
98
|
+
return unless Cani.config.modify_shell_configs
|
99
|
+
|
89
100
|
%w[bash zsh].each do |shell|
|
90
|
-
shellrc
|
101
|
+
shellrc = File.join Dir.home, ".#{shell}rc"
|
102
|
+
|
103
|
+
next unless File.exist? shellrc
|
104
|
+
|
91
105
|
lines = File.read(shellrc).split "\n"
|
92
|
-
comp_path =
|
93
|
-
|
106
|
+
comp_path = completion_path shell
|
107
|
+
comp_src = compile_source_line comp_path
|
108
|
+
rm_idx = lines.find_index { |l| l.match comp_src }
|
94
109
|
|
95
110
|
lines.delete_at rm_idx unless rm_idx.nil?
|
96
111
|
File.write shellrc, lines.join("\n")
|
@@ -98,18 +113,19 @@ module Cani
|
|
98
113
|
end
|
99
114
|
|
100
115
|
def self.insert_source_lines!
|
116
|
+
return unless Cani.config.modify_shell_configs
|
117
|
+
|
101
118
|
%w[bash zsh].each do |shell|
|
102
|
-
shellrc
|
119
|
+
shellrc = File.join Dir.home, ".#{shell}rc"
|
120
|
+
|
121
|
+
next unless File.exist? shellrc
|
122
|
+
|
103
123
|
lines = File.read(shellrc).split "\n"
|
104
|
-
comp_path =
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
lines
|
109
|
-
"#{lines[slidx][/^\s+/]}[ -f #{comp_path} ] && source #{comp_path}"
|
110
|
-
else
|
111
|
-
lines << "[ -f #{comp_path} ] && source #{comp_path}"
|
112
|
-
end
|
124
|
+
comp_path = completion_path shell
|
125
|
+
comp_src = compile_source_line comp_path
|
126
|
+
|
127
|
+
lines << comp_src \
|
128
|
+
unless lines.find_index { |l| l.match comp_src }
|
113
129
|
|
114
130
|
File.write shellrc, lines.join("\n")
|
115
131
|
end
|
data/lib/cani/config.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
module Cani
|
2
2
|
class Config
|
3
|
-
attr_reader :settings
|
4
|
-
|
5
|
-
FILE
|
6
|
-
DIRECTORY
|
7
|
-
COMP_DIR
|
8
|
-
FISH_DIR
|
9
|
-
FISH_COMP_DIR
|
10
|
-
|
3
|
+
attr_reader :settings, :modify_shell_configs
|
4
|
+
|
5
|
+
FILE = File.join(Dir.home, '.config', 'cani', 'config.yml').freeze
|
6
|
+
DIRECTORY = File.dirname(FILE).freeze
|
7
|
+
COMP_DIR = File.join(DIRECTORY, 'completions').freeze
|
8
|
+
FISH_DIR = File.join(Dir.home, '.config', 'fish').freeze
|
9
|
+
FISH_COMP_DIR = File.join(FISH_DIR, 'completions').freeze
|
10
|
+
NO_MODIFY_FILE = File.join(DIRECTORY, '.no-modify-shellrc').freeze
|
11
|
+
DEFAULTS = {
|
11
12
|
# data settings
|
12
13
|
'expire' => 86_400,
|
13
14
|
'source' => 'https://raw.githubusercontent.com/Fyrd/caniuse/master/data.json',
|
@@ -20,7 +21,16 @@ module Cani
|
|
20
21
|
}.freeze
|
21
22
|
|
22
23
|
def initialize(**opts)
|
23
|
-
|
24
|
+
no_modify_exists = File.exist? NO_MODIFY_FILE
|
25
|
+
@settings = DEFAULTS.merge opts
|
26
|
+
@modify_shell_configs =
|
27
|
+
if allow_shellrc_modification?
|
28
|
+
File.delete NO_MODIFY_FILE if no_modify_exists
|
29
|
+
true
|
30
|
+
elsif disallow_shellrc_modification?
|
31
|
+
FileUtils.touch NO_MODIFY_FILE unless no_modify_exists
|
32
|
+
false
|
33
|
+
end
|
24
34
|
|
25
35
|
if File.exist? file
|
26
36
|
if (yml = YAML.load_file(file))
|
@@ -31,6 +41,14 @@ module Cani
|
|
31
41
|
end
|
32
42
|
end
|
33
43
|
|
44
|
+
def disallow_shellrc_modification?
|
45
|
+
ARGV.include?('--no-modify') || File.exist?(NO_MODIFY_FILE)
|
46
|
+
end
|
47
|
+
|
48
|
+
def allow_shellrc_modification?
|
49
|
+
ARGV.include?('--modify') || !disallow_shellrc_modification?
|
50
|
+
end
|
51
|
+
|
34
52
|
def file
|
35
53
|
FILE
|
36
54
|
end
|
data/lib/cani/fzf.rb
CHANGED
@@ -13,7 +13,11 @@ module Cani
|
|
13
13
|
header = ohdr.is_a?(Array) ? [:cani, *ohdr].map { |v| v.to_s.downcase }.join(':')
|
14
14
|
: 'cani:' + ohdr.to_s
|
15
15
|
|
16
|
-
|
16
|
+
IO.popen("fzf --ansi --header=\"[#{header}]\" #{query}", 'r+') do |io|
|
17
|
+
io.write rows
|
18
|
+
io.close_write
|
19
|
+
io.read
|
20
|
+
end.split ' '
|
17
21
|
else
|
18
22
|
# when output of any initial command is being piped
|
19
23
|
# print results and exit this command.
|
data/lib/cani/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cani
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sidney Liebrand
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -161,8 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
161
|
- !ruby/object:Gem::Version
|
162
162
|
version: '0'
|
163
163
|
requirements: []
|
164
|
-
|
165
|
-
rubygems_version: 2.7.6
|
164
|
+
rubygems_version: 3.0.3
|
166
165
|
signing_key:
|
167
166
|
specification_version: 4
|
168
167
|
summary: A simple caniuse CLI.
|