getv 1.2.1 → 1.5.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 +4 -4
- data/README.md +19 -12
- data/exe/getv +171 -143
- data/lib/getv/package.rb +27 -24
- data/lib/getv/version.rb +1 -1
- metadata +26 -17
- data/.bundle/config +0 -4
- data/.github/workflows/ruby.yml +0 -37
- data/.gitignore +0 -17
- data/.rspec +0 -3
- data/.rubocop.yml +0 -16
- data/.travis.yml +0 -6
- data/Gemfile +0 -21
- data/Rakefile +0 -13
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/getv.gemspec +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eecf3794e494d199c44abee7e7c1813bf4cdb1ba4a3df0b1e84de43933c4b769
|
4
|
+
data.tar.gz: df3ef755f0275ba9dea7b06181156391d82a3dd456677d27eb2bc7849f8e2d30
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3cfe705be77258d3ad2fcef502d32a788134fbd6ef574725d1a2b8154b179b2652e6b6db060503d4b568c0e1524c602f726afdc275cf948f7fa6ee10c3d5c023
|
7
|
+
data.tar.gz: 84f5e7c13dd5e875f32b84203e1cba6aaadb8caa2919fd5ed54e20ce413ffa9ca0a73971ed812d08096b03e64d24bea085c0319dab66216932333ef77f84c358
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# getv
|
2
2
|
|
3
|
+
[](https://rubygems.org/gems/getv)
|
4
|
+
|
3
5
|
The goal of `getv` is to make it easy and quick to pull software package version numbers from various sources on the web. The application is packaged as a [gem](https://rubygems.org/gems/getv) and provides both a Ruby library and an executable command line tool, `getv`.
|
4
6
|
|
5
7
|
## Installation
|
@@ -37,18 +39,15 @@ SYNOPSIS
|
|
37
39
|
|
38
40
|
|
39
41
|
VERSION
|
40
|
-
1.
|
42
|
+
1.5.0
|
41
43
|
|
42
44
|
|
43
45
|
|
44
46
|
GLOBAL OPTIONS
|
45
|
-
--help
|
46
|
-
-j, --json
|
47
|
-
-l, --latest
|
48
|
-
--
|
49
|
-
--select_replace=arg - Regex version selection replace (default: none)
|
50
|
-
--select_search=arg - Regex version selection search (default: none)
|
51
|
-
--version - Display the program version
|
47
|
+
--help - Show this message
|
48
|
+
-j, --json - Output in json
|
49
|
+
-l, --latest - Latest version
|
50
|
+
--version - Display the program version
|
52
51
|
|
53
52
|
|
54
53
|
|
@@ -71,7 +70,7 @@ Show the latest available version of the `getv` gem:
|
|
71
70
|
|
72
71
|
```console
|
73
72
|
$ getv --latest gem getv
|
74
|
-
1.
|
73
|
+
1.5.0
|
75
74
|
```
|
76
75
|
|
77
76
|
Show all `dep` GitHub release versions in JSON:
|
@@ -84,7 +83,7 @@ $ getv --json github_release golang/dep
|
|
84
83
|
Show all AtomicParsley Github release versions:
|
85
84
|
|
86
85
|
```console
|
87
|
-
$ getv
|
86
|
+
$ getv github_release --invalid_versions wez/atomicparsley
|
88
87
|
20200701.154658.b0d6223
|
89
88
|
20201231.092811.cbecfb1
|
90
89
|
20210114.184825.1dbe1be
|
@@ -103,7 +102,7 @@ $ getv -l get --url=https://storage.googleapis.com/kubernetes-release/release/st
|
|
103
102
|
Show selected semantic versions of the `apache/superset` Docker image in JSON:
|
104
103
|
|
105
104
|
```console
|
106
|
-
$ getv --json --reject '-'
|
105
|
+
$ getv --json docker --reject '-' --semantic_select '~>1.3.0,!=1.3.1' apache/superset
|
107
106
|
{"name":"apache/superset","versions":["1.3.0","1.3.2"]}
|
108
107
|
```
|
109
108
|
|
@@ -121,7 +120,7 @@ Show the latest GitHub commit to the `main` branch of the `getv` project in a us
|
|
121
120
|
|
122
121
|
```console
|
123
122
|
# By default the \2 capture group contains the date and \5 contains the short commit hash
|
124
|
-
$ getv -l --select_replace '\2git\5'
|
123
|
+
$ getv -l github_commit --select_replace '\2git\5' --branch main liger1978/getv
|
125
124
|
20220123git9ed86f0
|
126
125
|
```
|
127
126
|
|
@@ -141,6 +140,14 @@ puts superset.latest_version
|
|
141
140
|
|
142
141
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rake spec` to run the tests. Run `bundle exec rubocop` to run the linter. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
143
142
|
|
143
|
+
Note that by default, Bundler will attempt to install gems to the system, e.g. `/usr/bin`, `/usr/share`, which requires elevated access and can interfere with files that are managed by the system's package manager. This behaviour can be overridden by creating the file `.bundle/config` and adding the following line:
|
144
|
+
```
|
145
|
+
BUNDLE_PATH: "./.bundle"
|
146
|
+
```
|
147
|
+
When you run `bin/setup` or `bundle install`, all gems will be installed inside the .bundle directory of this project.
|
148
|
+
|
149
|
+
To make this behaviour a default for all gem projects, the above line can be added to the user's bundle config file in their home directory (`~/.bundle/config`)
|
150
|
+
|
144
151
|
## Contributing
|
145
152
|
|
146
153
|
Bug reports and pull requests are welcome on [GitHub](https://github.com/liger1978/getv).
|
data/exe/getv
CHANGED
@@ -7,26 +7,16 @@ require 'gli'
|
|
7
7
|
module Getv
|
8
8
|
# cli class
|
9
9
|
class Cli
|
10
|
-
def self.output(package, latest: false, json: false)
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
'name' => package.name,
|
16
|
-
'latest_version' => package.latest_version
|
17
|
-
}.to_json)
|
18
|
-
else
|
19
|
-
puts package.latest_version
|
20
|
-
end
|
21
|
-
elsif json
|
10
|
+
def self.output(package, latest: false, json: false)
|
11
|
+
key = latest ? 'latest_version' : 'versions'
|
12
|
+
result = package.send(key)
|
13
|
+
|
14
|
+
if json
|
22
15
|
require 'json'
|
23
|
-
|
24
|
-
'name' => package.name,
|
25
|
-
'versions' => package.versions
|
26
|
-
}.to_json)
|
27
|
-
else
|
28
|
-
puts package.versions
|
16
|
+
result = { 'name' => package.name, key => result }.to_json
|
29
17
|
end
|
18
|
+
|
19
|
+
puts result
|
30
20
|
end
|
31
21
|
end
|
32
22
|
end
|
@@ -44,199 +34,237 @@ class App # rubocop:disable Metrics/ClassLength
|
|
44
34
|
|
45
35
|
switch %i[l latest], desc: 'Latest version', negatable: false
|
46
36
|
switch %i[j json], desc: 'Output in json', negatable: false
|
47
|
-
flag %i[
|
48
|
-
flag %i[select_replace], desc: 'Regex version selection replace'
|
49
|
-
flag %i[reject], desc: 'Regex version rejection'
|
37
|
+
flag %i[p proxy], desc: 'Web proxy', default_value: nil
|
50
38
|
|
51
39
|
desc 'Get package versions from a Docker or OCI container image registry'
|
52
40
|
arg_name 'package_name'
|
53
41
|
command :docker do |c|
|
42
|
+
defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
|
43
|
+
c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
|
44
|
+
c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
|
45
|
+
c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
|
54
46
|
c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
|
55
|
-
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)'
|
56
|
-
|
57
|
-
c.flag %i[
|
58
|
-
|
47
|
+
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
|
48
|
+
default_value: defaults[:semantic_select]
|
49
|
+
c.flag %i[owner], desc: 'Repository owner',
|
50
|
+
default_value: "'<owner>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
|
51
|
+
c.flag %i[repo], desc: 'Repository name',
|
52
|
+
default_value: "'<repo>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
|
53
|
+
c.flag %i[url], desc: 'URL', default_value: defaults[:url]
|
54
|
+
c.flag %i[user], desc: 'Username', default_value: defaults[:user]
|
55
|
+
c.flag %i[password], desc: 'Password', default_value: defaults[:password]
|
59
56
|
c.action do |global_options, options, args|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
help_now!
|
71
|
-
end
|
57
|
+
help_now! unless args.size == 1
|
58
|
+
|
59
|
+
opts = global_options.merge(options)
|
60
|
+
opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select, :owner, :repo,
|
61
|
+
:url, :user, :password, :proxy
|
62
|
+
opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
|
63
|
+
opts[:semantic_only] = !options[:invalid_versions]
|
64
|
+
opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
|
65
|
+
package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
|
66
|
+
Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
|
72
67
|
end
|
73
68
|
end
|
74
69
|
|
75
70
|
desc 'Get package versions from RubyGems.org'
|
76
71
|
arg_name 'package_name'
|
77
72
|
command :gem do |c|
|
73
|
+
defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
|
74
|
+
c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
|
75
|
+
c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
|
76
|
+
c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
|
78
77
|
c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
|
79
|
-
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)'
|
78
|
+
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
|
79
|
+
default_value: defaults[:semantic_select]
|
80
80
|
c.action do |global_options, options, args|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
help_now!
|
91
|
-
end
|
81
|
+
help_now! unless args.size == 1
|
82
|
+
|
83
|
+
opts = global_options.merge(options)
|
84
|
+
opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select, :proxy
|
85
|
+
opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
|
86
|
+
opts[:semantic_only] = !options[:invalid_versions]
|
87
|
+
opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
|
88
|
+
package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
|
89
|
+
Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
|
92
90
|
end
|
93
91
|
end
|
94
92
|
|
95
93
|
desc 'Get package versions from text file URL'
|
96
94
|
arg_name 'package_name'
|
97
95
|
command :get do |c|
|
96
|
+
defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
|
97
|
+
c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
|
98
|
+
c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
|
99
|
+
c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
|
98
100
|
c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
|
99
|
-
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)'
|
100
|
-
|
101
|
+
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
|
102
|
+
default_value: defaults[:semantic_select]
|
103
|
+
c.flag %i[url], desc: 'URL', default_value: defaults[:url]
|
101
104
|
c.action do |global_options, options, args|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
else
|
111
|
-
help_now!
|
112
|
-
end
|
105
|
+
help_now! unless args.size == 1
|
106
|
+
|
107
|
+
opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select, :url, :proxy
|
108
|
+
opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
|
109
|
+
opts[:semantic_only] = !options[:invalid_versions]
|
110
|
+
opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
|
111
|
+
package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
|
112
|
+
Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
desc 'Get package versions from GitHub commits
|
116
|
+
desc 'Get package versions from GitHub commits'
|
117
117
|
arg_name 'package_name'
|
118
118
|
command :github_commit do |c|
|
119
|
-
|
120
|
-
c.flag %i[
|
121
|
-
c.flag %i[
|
119
|
+
defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
|
120
|
+
c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
|
121
|
+
c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
|
122
|
+
c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
|
123
|
+
c.flag %i[owner], desc: 'Repository owner',
|
124
|
+
default_value: "'<owner>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
|
125
|
+
c.flag %i[repo], desc: 'Repository name',
|
126
|
+
default_value: "'<repo>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
|
127
|
+
c.flag %i[branch], desc: 'Repository branch', default_value: defaults[:branch]
|
128
|
+
c.flag %i[token], desc: 'Token', default_value: defaults[:token]
|
122
129
|
c.action do |global_options, options, args|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
help_now!
|
131
|
-
end
|
130
|
+
help_now! unless args.size == 1
|
131
|
+
|
132
|
+
opts = global_options.merge(options)
|
133
|
+
opts = opts.slice :select_search, :select_replace, :reject, :owner, :repo, :branch, :token, :proxy
|
134
|
+
opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
|
135
|
+
package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
|
136
|
+
Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
|
132
137
|
end
|
133
138
|
end
|
134
139
|
|
135
|
-
desc 'Get package versions from GitHub releases
|
140
|
+
desc 'Get package versions from GitHub releases'
|
136
141
|
arg_name 'package_name'
|
137
142
|
command :github_release do |c|
|
143
|
+
defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
|
144
|
+
c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
|
145
|
+
c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
|
146
|
+
c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
|
138
147
|
c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
|
139
|
-
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)'
|
140
|
-
|
141
|
-
c.flag %i[
|
148
|
+
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
|
149
|
+
default_value: defaults[:semantic_select]
|
150
|
+
c.flag %i[owner], desc: 'Repository owner',
|
151
|
+
default_value: "'<owner>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
|
152
|
+
c.flag %i[repo], desc: 'Repository name',
|
153
|
+
default_value: "'<repo>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
|
154
|
+
c.flag %i[token], desc: 'Token', default_value: defaults[:token]
|
142
155
|
c.action do |global_options, options, args|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
end
|
156
|
+
help_now! unless args.size == 1
|
157
|
+
|
158
|
+
opts = global_options.merge(options)
|
159
|
+
opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select, :owner, :repo,
|
160
|
+
:token, :proxy
|
161
|
+
opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
|
162
|
+
opts[:semantic_only] = !options[:invalid_versions]
|
163
|
+
opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
|
164
|
+
package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
|
165
|
+
Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
|
154
166
|
end
|
155
167
|
end
|
156
168
|
|
157
|
-
desc 'Get package versions from GitHub tags
|
169
|
+
desc 'Get package versions from GitHub tags'
|
158
170
|
arg_name 'package_name'
|
159
171
|
command :github_tag do |c|
|
172
|
+
defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
|
173
|
+
c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
|
174
|
+
c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
|
175
|
+
c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
|
160
176
|
c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
|
161
|
-
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)'
|
162
|
-
|
163
|
-
c.flag %i[
|
177
|
+
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
|
178
|
+
default_value: defaults[:semantic_select]
|
179
|
+
c.flag %i[owner], desc: 'Repository owner',
|
180
|
+
default_value: "'<owner>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
|
181
|
+
c.flag %i[repo], desc: 'Repository name',
|
182
|
+
default_value: "'<repo>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
|
183
|
+
c.flag %i[token], desc: 'Token', default_value: defaults[:token]
|
164
184
|
c.action do |global_options, options, args|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
end
|
185
|
+
help_now! unless args.size == 1
|
186
|
+
|
187
|
+
opts = global_options.merge(options)
|
188
|
+
opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select, :owner, :repo,
|
189
|
+
:token, :proxy
|
190
|
+
opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
|
191
|
+
opts[:semantic_only] = !options[:invalid_versions]
|
192
|
+
opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
|
193
|
+
package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
|
194
|
+
Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
|
176
195
|
end
|
177
196
|
end
|
178
197
|
|
179
198
|
desc 'Get package versions from web page of links'
|
180
199
|
arg_name 'package_name'
|
181
200
|
command :index do |c|
|
201
|
+
defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
|
202
|
+
c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
|
203
|
+
c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
|
204
|
+
c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
|
182
205
|
c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
|
183
|
-
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)'
|
184
|
-
|
206
|
+
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
|
207
|
+
default_value: defaults[:semantic_select]
|
208
|
+
c.flag %i[url], desc: 'URL', default_value: defaults[:url]
|
185
209
|
c.switch %i[link_value], desc: 'Use the value (target) of links rather than the content (display text)',
|
186
210
|
negatable: false, default_value: false
|
187
211
|
c.action do |global_options, options, args|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
help_now!
|
199
|
-
end
|
212
|
+
help_now! unless args.size == 1
|
213
|
+
|
214
|
+
opts = global_options.merge(options)
|
215
|
+
opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select, :url, :proxy
|
216
|
+
opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
|
217
|
+
opts[:link] == 'value' if options[:link_value]
|
218
|
+
opts[:semantic_only] = !options[:invalid_versions]
|
219
|
+
opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
|
220
|
+
package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
|
221
|
+
Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
|
200
222
|
end
|
201
223
|
end
|
202
224
|
|
203
225
|
desc 'Get package versions from npm at registry.npmjs.org'
|
204
226
|
arg_name 'package_name'
|
205
227
|
command :npm do |c|
|
228
|
+
defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
|
229
|
+
c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
|
230
|
+
c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
|
231
|
+
c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
|
206
232
|
c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
|
207
|
-
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)'
|
233
|
+
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
|
234
|
+
default_value: defaults[:semantic_select]
|
208
235
|
c.action do |global_options, options, args|
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
help_now!
|
219
|
-
end
|
236
|
+
help_now! unless args.size == 1
|
237
|
+
|
238
|
+
opts = global_options.merge(options)
|
239
|
+
opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select, :proxy
|
240
|
+
opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
|
241
|
+
opts[:semantic_only] = !options[:invalid_versions]
|
242
|
+
opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
|
243
|
+
package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
|
244
|
+
Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
|
220
245
|
end
|
221
246
|
end
|
222
247
|
|
223
248
|
desc 'Get package versions from the Python Package Index at pypi.org'
|
224
249
|
arg_name 'package_name'
|
225
250
|
command :pypi do |c|
|
251
|
+
defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
|
252
|
+
c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
|
253
|
+
c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
|
254
|
+
c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
|
226
255
|
c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
|
227
|
-
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)'
|
256
|
+
c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
|
257
|
+
default_value: defaults[:semantic_select]
|
228
258
|
c.action do |global_options, options, args|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
help_now!
|
239
|
-
end
|
259
|
+
help_now! unless args.size == 1
|
260
|
+
|
261
|
+
opts = global_options.merge(options)
|
262
|
+
opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select, :proxy
|
263
|
+
opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
|
264
|
+
opts[:semantic_only] = !options[:invalid_versions]
|
265
|
+
opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
|
266
|
+
package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
|
267
|
+
Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
|
240
268
|
end
|
241
269
|
end
|
242
270
|
|
data/lib/getv/package.rb
CHANGED
@@ -24,11 +24,12 @@ module Getv
|
|
24
24
|
end
|
25
25
|
opts = {
|
26
26
|
type: 'github_release',
|
27
|
-
select_search: '^\s*v?(
|
27
|
+
select_search: '^\s*v?(.*)\s*$',
|
28
28
|
select_replace: '\1',
|
29
29
|
reject: nil,
|
30
30
|
semantic_only: true,
|
31
31
|
semantic_select: ['*'],
|
32
|
+
proxy: nil,
|
32
33
|
versions: nil,
|
33
34
|
latest_version: nil
|
34
35
|
}.merge(opts)
|
@@ -37,11 +38,12 @@ module Getv
|
|
37
38
|
end
|
38
39
|
case opts[:type]
|
39
40
|
when 'docker'
|
40
|
-
opts = { owner: 'library', repo: name, url: 'https://registry.hub.docker.com'
|
41
|
+
opts = { owner: 'library', repo: name, url: 'https://registry.hub.docker.com', user: nil,
|
42
|
+
password: nil }.merge(opts)
|
41
43
|
when 'gem'
|
42
44
|
opts = { gem: name[/rubygem-(.*)/, 1] || name }.merge(opts)
|
43
45
|
when /github.*/
|
44
|
-
opts = { owner: name, repo: name }.merge(opts)
|
46
|
+
opts = { owner: name, repo: name, token: nil }.merge(opts)
|
45
47
|
when 'index'
|
46
48
|
opts = { link: 'content' }.merge(opts)
|
47
49
|
when 'npm'
|
@@ -89,37 +91,45 @@ module Getv
|
|
89
91
|
|
90
92
|
private
|
91
93
|
|
92
|
-
def
|
94
|
+
def get(url)
|
95
|
+
require 'rest-client'
|
96
|
+
RestClient::Request.execute(method: :get, url: url, proxy: opts[:proxy]).body
|
97
|
+
end
|
98
|
+
|
99
|
+
def versions_using_docker # rubocop:disable Metrics/AbcSize
|
93
100
|
require 'docker_registry2'
|
94
|
-
|
101
|
+
docker_opts = {}
|
102
|
+
docker_opts[:http_options] = { proxy: opts[:proxy] } unless opts[:proxy].nil?
|
103
|
+
if opts[:user] && opts[:password]
|
104
|
+
docker_opts[:user] = opts[:user]
|
105
|
+
docker_opts[:password] = opts[:password]
|
106
|
+
end
|
107
|
+
docker = DockerRegistry2.connect(opts[:url], docker_opts)
|
95
108
|
docker.tags("#{opts[:owner]}/#{opts[:repo]}")['tags']
|
96
109
|
end
|
97
110
|
|
98
111
|
def versions_using_gem
|
99
112
|
require 'json'
|
100
|
-
|
101
|
-
require 'net/http'
|
102
|
-
JSON.parse(Net::HTTP.get(URI("https://rubygems.org/api/v1/versions/#{opts[:gem]}.json"))).map do |v|
|
113
|
+
JSON.parse(get("https://rubygems.org/api/v1/versions/#{opts[:gem]}.json")).map do |v|
|
103
114
|
v['number']
|
104
115
|
end
|
105
116
|
end
|
106
117
|
|
107
118
|
def versions_using_get
|
108
|
-
|
109
|
-
require 'net/http'
|
110
|
-
Net::HTTP.get(URI(opts[:url])).split("\n")
|
119
|
+
get(opts[:url]).split("\n")
|
111
120
|
end
|
112
121
|
|
113
|
-
def github
|
122
|
+
def github # rubocop:disable Metrics/MethodLength
|
114
123
|
require 'octokit'
|
115
|
-
if
|
116
|
-
github = Octokit::Client.new(access_token:
|
124
|
+
if opts[:token]
|
125
|
+
github = Octokit::Client.new(access_token: opts[:token])
|
117
126
|
user = github.user
|
118
127
|
user.login
|
119
128
|
else
|
120
129
|
github = Octokit::Client.new
|
121
130
|
end
|
122
131
|
github.auto_paginate = true
|
132
|
+
github.proxy = opts[:proxy]
|
123
133
|
github
|
124
134
|
end
|
125
135
|
|
@@ -137,11 +147,8 @@ module Getv
|
|
137
147
|
end
|
138
148
|
|
139
149
|
def versions_using_index
|
140
|
-
require 'open-uri'
|
141
|
-
require 'net/http'
|
142
150
|
require 'nokogiri'
|
143
|
-
|
144
|
-
Nokogiri::HTML(URI.open(opts[:url])).css('a').map do |a| # rubocop:disable Security/Open
|
151
|
+
Nokogiri::HTML(get(opts[:url])).css('a').map do |a|
|
145
152
|
if opts[:link] == 'value'
|
146
153
|
a.values[0]
|
147
154
|
else
|
@@ -152,16 +159,12 @@ module Getv
|
|
152
159
|
|
153
160
|
def versions_using_npm
|
154
161
|
require 'json'
|
155
|
-
|
156
|
-
require 'net/http'
|
157
|
-
JSON.parse(Net::HTTP.get(URI("https://registry.npmjs.org/#{opts[:npm]}")))['versions'].keys
|
162
|
+
JSON.parse(get("https://registry.npmjs.org/#{opts[:npm]}"))['versions'].keys
|
158
163
|
end
|
159
164
|
|
160
165
|
def versions_using_pypi
|
161
166
|
require 'json'
|
162
|
-
|
163
|
-
require 'net/http'
|
164
|
-
JSON.parse(Net::HTTP.get(URI("https://pypi.org/pypi/#{opts[:pypi]}/json")))['releases'].keys
|
167
|
+
JSON.parse(get("https://pypi.org/pypi/#{opts[:pypi]}/json"))['releases'].keys
|
165
168
|
end
|
166
169
|
end
|
167
170
|
end
|
data/lib/getv/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: getv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- harbottle
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-01-
|
11
|
+
date: 2022-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gli
|
@@ -90,6 +90,26 @@ dependencies:
|
|
90
90
|
- - "<"
|
91
91
|
- !ruby/object:Gem::Version
|
92
92
|
version: 5.0.0
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: rest-client
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 2.1.0
|
100
|
+
- - "<"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 3.0.0
|
103
|
+
type: :runtime
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 2.1.0
|
110
|
+
- - "<"
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 3.0.0
|
93
113
|
- !ruby/object:Gem::Dependency
|
94
114
|
name: semantic
|
95
115
|
requirement: !ruby/object:Gem::Requirement
|
@@ -118,20 +138,9 @@ executables:
|
|
118
138
|
extensions: []
|
119
139
|
extra_rdoc_files: []
|
120
140
|
files:
|
121
|
-
- ".bundle/config"
|
122
|
-
- ".github/workflows/ruby.yml"
|
123
|
-
- ".gitignore"
|
124
|
-
- ".rspec"
|
125
|
-
- ".rubocop.yml"
|
126
|
-
- ".travis.yml"
|
127
|
-
- Gemfile
|
128
141
|
- LICENSE.txt
|
129
142
|
- README.md
|
130
|
-
- Rakefile
|
131
|
-
- bin/console
|
132
|
-
- bin/setup
|
133
143
|
- exe/getv
|
134
|
-
- getv.gemspec
|
135
144
|
- lib/getv.rb
|
136
145
|
- lib/getv/package.rb
|
137
146
|
- lib/getv/version.rb
|
@@ -142,7 +151,7 @@ metadata:
|
|
142
151
|
homepage_uri: https://github.com/liger1978/getv
|
143
152
|
source_code_uri: https://github.com/liger1978/getv
|
144
153
|
changelog_uri: https://github.com/liger1978/getv
|
145
|
-
post_install_message:
|
154
|
+
post_install_message:
|
146
155
|
rdoc_options: []
|
147
156
|
require_paths:
|
148
157
|
- lib
|
@@ -157,8 +166,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
157
166
|
- !ruby/object:Gem::Version
|
158
167
|
version: '0'
|
159
168
|
requirements: []
|
160
|
-
rubygems_version: 3.
|
161
|
-
signing_key:
|
169
|
+
rubygems_version: 3.0.3
|
170
|
+
signing_key:
|
162
171
|
specification_version: 4
|
163
172
|
summary: Pull package version numbers from the web in various ways.
|
164
173
|
test_files: []
|
data/.bundle/config
DELETED
data/.github/workflows/ruby.yml
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
# This workflow uses actions that are not certified by GitHub.
|
2
|
-
# They are provided by a third-party and are governed by
|
3
|
-
# separate terms of service, privacy policy, and support
|
4
|
-
# documentation.
|
5
|
-
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
-
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
-
|
8
|
-
name: Ruby
|
9
|
-
|
10
|
-
on:
|
11
|
-
push:
|
12
|
-
branches: [ main ]
|
13
|
-
pull_request:
|
14
|
-
branches: [ main ]
|
15
|
-
|
16
|
-
jobs:
|
17
|
-
test:
|
18
|
-
|
19
|
-
runs-on: ubuntu-latest
|
20
|
-
strategy:
|
21
|
-
matrix:
|
22
|
-
ruby-version: ['2.6', '2.7', '3.0']
|
23
|
-
|
24
|
-
steps:
|
25
|
-
- uses: actions/checkout@v2
|
26
|
-
- name: Set up Ruby
|
27
|
-
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
28
|
-
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
29
|
-
# uses: ruby/setup-ruby@v1
|
30
|
-
uses: ruby/setup-ruby@v1
|
31
|
-
with:
|
32
|
-
ruby-version: ${{ matrix.ruby-version }}
|
33
|
-
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
34
|
-
- name: Run linter
|
35
|
-
run: bundle exec rake rubocop
|
36
|
-
- name: Run unit tests
|
37
|
-
run: bundle exec rake
|
data/.gitignore
DELETED
data/.rspec
DELETED
data/.rubocop.yml
DELETED
data/.travis.yml
DELETED
data/Gemfile
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
source 'https://rubygems.org'
|
4
|
-
|
5
|
-
# Specify your gem's dependencies in getv.gemspec
|
6
|
-
gemspec
|
7
|
-
|
8
|
-
gem 'docker_registry2', '~> 1.10'
|
9
|
-
gem 'gli', '~> 2.20'
|
10
|
-
gem 'irb', '~> 1.4'
|
11
|
-
gem 'nokogiri', '~> 1.13'
|
12
|
-
gem 'octokit', '~> 4.21'
|
13
|
-
gem 'rake', '~> 12.0'
|
14
|
-
gem 'rdoc', '~> 6.4'
|
15
|
-
gem 'rspec', '~> 3.0'
|
16
|
-
gem 'rubocop', '~> 1.24', require: false
|
17
|
-
gem 'rubocop-rake', '~> 0.6', require: false
|
18
|
-
gem 'rubocop-rspec', '~> 2.7', require: false
|
19
|
-
gem 'semantic', '~> 1.6'
|
20
|
-
gem 'vcr', '~> 6.0'
|
21
|
-
gem 'webmock', '~> 3.0'
|
data/Rakefile
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bundler/gem_tasks'
|
4
|
-
require 'rspec/core/rake_task'
|
5
|
-
require 'rubocop/rake_task'
|
6
|
-
|
7
|
-
RSpec::Core::RakeTask.new(:spec)
|
8
|
-
|
9
|
-
RuboCop::RakeTask.new do |task|
|
10
|
-
task.requires << 'rubocop-rspec'
|
11
|
-
end
|
12
|
-
|
13
|
-
task default: :spec
|
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "getv"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|
data/bin/setup
DELETED
data/getv.gemspec
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'lib/getv/version'
|
4
|
-
|
5
|
-
Gem::Specification.new do |spec|
|
6
|
-
spec.name = 'getv'
|
7
|
-
spec.version = Getv::VERSION
|
8
|
-
spec.authors = ['harbottle']
|
9
|
-
spec.email = ['harbottle@room3d3.com']
|
10
|
-
|
11
|
-
spec.summary = 'Pull package version numbers from the web in various ways.'
|
12
|
-
spec.description = 'Pull package version numbers from the web in various ways.'
|
13
|
-
spec.homepage = 'https://github.com/liger1978/getv'
|
14
|
-
spec.license = 'MIT'
|
15
|
-
|
16
|
-
spec.metadata['homepage_uri'] = spec.homepage
|
17
|
-
spec.metadata['source_code_uri'] = 'https://github.com/liger1978/getv'
|
18
|
-
spec.metadata['changelog_uri'] = 'https://github.com/liger1978/getv'
|
19
|
-
|
20
|
-
# Specify which files should be added to the gem when it is released.
|
21
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
22
|
-
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
23
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
24
|
-
end
|
25
|
-
spec.bindir = 'exe'
|
26
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
|
-
spec.require_paths = ['lib']
|
28
|
-
|
29
|
-
spec.add_dependency('gli', '>= 2.20.1', '< 3.0.0')
|
30
|
-
spec.add_dependency('docker_registry2', '>= 1.0.0', '< 2.0.0')
|
31
|
-
spec.add_dependency('nokogiri', '>= 1.0.0', '< 2.0.0')
|
32
|
-
spec.add_dependency('octokit', '>= 3.0.0', '< 5.0.0')
|
33
|
-
spec.add_dependency('semantic', '>= 1.0.0', '< 2.0.0')
|
34
|
-
end
|