getv 1.0.1 → 1.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dee216d169325a49c0b22c5a155f4cbf2d7de0485cf910187eea5e2a53e00fec
4
- data.tar.gz: b68a57c56575fde9a0838be0a63d9e79d918a0152ef30ecea597aa3b8d242586
3
+ metadata.gz: d3f1afae07aeb895e7cac0ef722a2a0c12008681ee09bfa724cdfc692accba75
4
+ data.tar.gz: 67ea05289cee910c2c53db2fa337cc6a20bc2459d407bf5bf995d01b5cea41a5
5
5
  SHA512:
6
- metadata.gz: e009db79c088984187e984880e7cd48c03ab72771c38085268f31ef242ea254657af6436f1a800aef2d2b017fad5bd5f6c32dd39bba986c56567332cd9859536
7
- data.tar.gz: 5004687e4f6614a93fc9074e7a452b814719807abaef12c4e3350d6011c704085caa04409c234ed58ee78b8937f2a24245fd0e7d2f5d3d033b349786b973b65e
6
+ metadata.gz: e33576d51b5d6a32d39f54421e87d458542b3ce38a52f2e8b5182d4c38d54257b5e4a75469f96d15df8ab34c0546e03a153e7133138dd5d2dd9b63258d0eaa02
7
+ data.tar.gz: da5ed58b41e029f1979147c6d3d614bdc9841f267fc56e37f9b4775b7f7c8dc1836141f57e477156876b03b2daa9ac518445364386f4e85802728e0981a7577e
data/README.md CHANGED
@@ -1,10 +1,18 @@
1
- # Getv
1
+ # getv
2
2
 
3
- Pull package version numbers from the web in various ways.
3
+ [![Gem Version](https://badge.fury.io/rb/getv.svg)](https://rubygems.org/gems/getv)
4
+
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
6
8
 
7
- Add this line to your application's Gemfile:
9
+ Install `getv` with:
10
+
11
+ ```
12
+ gem install getv
13
+ ```
14
+
15
+ Or add this line to your application's Gemfile:
8
16
 
9
17
  ```ruby
10
18
  gem 'getv'
@@ -12,50 +20,137 @@ gem 'getv'
12
20
 
13
21
  And then execute:
14
22
 
15
- $ bundle install
23
+ ```sh
24
+ bundle install
25
+ ```
26
+
27
+ ## CLI
28
+
29
+ An executable command tool, `getv` is bundled with this gem:
30
+
31
+ ```console
32
+ $ getv
33
+ NAME
34
+ getv - Get package version numbers from the web in various ways
35
+
36
+
37
+ SYNOPSIS
38
+ getv [global options] command [command options] [arguments...]
39
+
40
+
41
+ VERSION
42
+ 1.3.0
43
+
44
+
45
+
46
+ GLOBAL OPTIONS
47
+ --help - Show this message
48
+ -j, --json - Output in json
49
+ -l, --latest - Latest version
50
+ --version - Display the program version
51
+
52
+
53
+
54
+ COMMANDS
55
+ docker - Get package versions from a Docker or OCI container image registry
56
+ gem - Get package versions from RubyGems.org
57
+ get - Get package versions from text file URL
58
+ github_commit - Get package versions from GitHub commits. Set environment variable $GITHUB_TOKEN to avoid GitHub API limit.
59
+ github_release - Get package versions from GitHub releases. Set environment variable $GITHUB_TOKEN to avoid GitHub API limit.
60
+ github_tag - Get package versions from GitHub tags. Set environment variable $GITHUB_TOKEN to avoid GitHub API limit.
61
+ help - Shows a list of commands or help for one command
62
+ index - Get package versions from web page of links
63
+ npm - Get package versions from npm at registry.npmjs.org
64
+ pypi - Get package versions from the Python Package Index at pypi.org
65
+ ```
66
+
67
+ ### CLI examples
68
+
69
+ Show the latest available version of the `getv` gem:
70
+
71
+ ```console
72
+ $ getv --latest gem getv
73
+ 1.3.0
74
+ ```
75
+
76
+ Show all `dep` GitHub release versions in JSON:
77
+
78
+ ```console
79
+ $ getv --json github_release golang/dep
80
+ {"name":"golang/dep","versions":["0.2.0","0.2.1","0.3.0","0.3.1","0.3.2","0.4.0","0.4.1","0.5.0","0.5.1","0.5.2","0.5.3","0.5.4"]}
81
+ ```
82
+
83
+ Show all AtomicParsley Github release versions:
84
+
85
+ ```console
86
+ $ getv github_release --invalid_versions wez/atomicparsley
87
+ 20200701.154658.b0d6223
88
+ 20201231.092811.cbecfb1
89
+ 20210114.184825.1dbe1be
90
+ 20210124.204813.840499f
91
+ 20210617.200601.1ac7c08
92
+ 20210715.151551.e7ad03a
93
+ ```
16
94
 
17
- Or install it yourself as:
95
+ Show the latest stable version of Kubernetes using the release text file URL:
18
96
 
19
- $ gem install getv
97
+ ```console
98
+ $ getv -l get --url=https://storage.googleapis.com/kubernetes-release/release/stable.txt kubernetes
99
+ 1.23.2
100
+ ```
20
101
 
21
- ## Usage
102
+ Show selected semantic versions of the `apache/superset` Docker image in JSON:
22
103
 
104
+ ```console
105
+ $ getv --json docker --reject '-' --semantic_select '~>1.3.0,!=1.3.1' apache/superset
106
+ {"name":"apache/superset","versions":["1.3.0","1.3.2"]}
23
107
  ```
24
- irb(main):024:0> superset = Getv::Package.new('superset', type: 'docker', owner: 'apache', reject: '-')
25
- =>
26
- #<Getv::Package:0x000055b6d2326f20
27
- ...
28
- irb(main):025:0> superset.versions
29
- => ["1.0.0", "1.0.1", "1.1.0", "1.2.0", "1.3.0", "1.3.1", "1.3.2"]
30
- irb(main):026:0> superset.latest_version
31
- => "1.3.2"
32
- irb(main):027:0> superset
33
- =>
34
- #<Getv::Package:0x000055b6d2326f20
35
- @name="superset",
36
- @opts=
37
- {:owner=>"apache",
38
- :repo=>"superset",
39
- :url=>"https://registry.hub.docker.com",
40
- :type=>"docker",
41
- :select=>{:search=>"^\\s*v?((0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)\\s*$", :replace=>"\\1"},
42
- :reject=>"-",
43
- :semantic_only=>true,
44
- :semantic_select=>["*"],
45
- :versions=>["1.0.0", "1.0.1", "1.1.0", "1.2.0", "1.3.0", "1.3.1", "1.3.2"],
46
- :latest_version=>"1.3.2"}>
108
+
109
+ Show all versions of `libnetfilter_acct` using selected link values on an indexed web page:
110
+
111
+ ```console
112
+ $ getv --select_search='^.*libnetfilter_acct-([\d\.]*)\.tar\.bz2$' index --url=https://netfilter.org/projects/libnetfilter_acct/files --link_value libnetfilter_acct
113
+ 1.0.0
114
+ 1.0.1
115
+ 1.0.2
116
+ 1.0.3
117
+ ```
118
+
119
+ Show the latest GitHub commit to the `main` branch of the `getv` project in a useful versioning format:
120
+
121
+ ```console
122
+ # By default the \2 capture group contains the date and \5 contains the short commit hash
123
+ $ getv -l github_commit --select_replace '\2git\5' --branch main liger1978/getv
124
+ 20220123git9ed86f0
125
+ ```
126
+
127
+ ## Ruby library
128
+
129
+ Example:
130
+
131
+ ```ruby
132
+ require 'getv'
133
+
134
+ superset = Getv::Package.new 'superset', type: 'docker', owner: 'apache', reject: '-'
135
+ puts superset.versions
136
+ puts superset.latest_version
47
137
  ```
48
138
 
49
139
  ## Development
50
140
 
51
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
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.
52
142
 
53
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
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.
54
148
 
55
- ## Contributing
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`)
56
150
 
57
- Bug reports and pull requests are welcome on GitHub at https://github.com/liger1978/getv.
151
+ ## Contributing
58
152
 
153
+ Bug reports and pull requests are welcome on [GitHub](https://github.com/liger1978/getv).
59
154
 
60
155
  ## License
61
156
 
data/exe/getv ADDED
@@ -0,0 +1,314 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'getv'
5
+ require 'gli'
6
+
7
+ module Getv
8
+ # cli class
9
+ class Cli
10
+ def self.output(package, latest: false, json: false) # rubocop:disable Metrics/MethodLength
11
+ if latest
12
+ if json
13
+ require 'json'
14
+ puts({
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
22
+ require 'json'
23
+ puts({
24
+ 'name' => package.name,
25
+ 'versions' => package.versions
26
+ }.to_json)
27
+ else
28
+ puts package.versions
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ # app class
35
+ class App # rubocop:disable Metrics/ClassLength
36
+ extend GLI::App
37
+
38
+ program_desc 'Get package version numbers from the web in various ways'
39
+
40
+ version Getv::VERSION
41
+
42
+ subcommand_option_handling :normal
43
+ arguments :strict
44
+
45
+ switch %i[l latest], desc: 'Latest version', negatable: false
46
+ switch %i[j json], desc: 'Output in json', negatable: false
47
+
48
+ desc 'Get package versions from a Docker or OCI container image registry'
49
+ arg_name 'package_name'
50
+ command :docker do |c| # rubocop:disable Metrics/BlockLength
51
+ defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
52
+ c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
53
+ c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
54
+ c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
55
+ c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
56
+ c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
57
+ default_value: defaults[:semantic_select]
58
+ c.flag %i[owner], desc: 'Repository owner',
59
+ default_value: "'<owner>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
60
+ c.flag %i[repo], desc: 'Repository name',
61
+ default_value: "'<repo>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
62
+ c.flag %i[url], desc: 'URL', default_value: defaults[:url]
63
+ c.action do |global_options, options, args|
64
+ if args.size == 1
65
+ opts = global_options.merge(options)
66
+ opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select, :owner, :repo,
67
+ :url
68
+ opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
69
+ opts[:semantic_only] = !options[:invalid_versions]
70
+ opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
71
+ package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
72
+ Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
73
+ else
74
+ help_now!
75
+ end
76
+ end
77
+ end
78
+
79
+ desc 'Get package versions from RubyGems.org'
80
+ arg_name 'package_name'
81
+ command :gem do |c|
82
+ defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
83
+ c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
84
+ c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
85
+ c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
86
+ c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
87
+ c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
88
+ default_value: defaults[:semantic_select]
89
+ c.action do |global_options, options, args|
90
+ if args.size == 1
91
+ opts = global_options.merge(options)
92
+ opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select
93
+ opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
94
+ opts[:semantic_only] = !options[:invalid_versions]
95
+ opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
96
+ package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
97
+ Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
98
+ else
99
+ help_now!
100
+ end
101
+ end
102
+ end
103
+
104
+ desc 'Get package versions from text file URL'
105
+ arg_name 'package_name'
106
+ command :get do |c|
107
+ defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
108
+ c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
109
+ c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
110
+ c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
111
+ c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
112
+ c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
113
+ default_value: defaults[:semantic_select]
114
+ c.flag %i[url], desc: 'URL', default_value: defaults[:url]
115
+ c.action do |global_options, options, args|
116
+ if args.size == 1
117
+ opts = global_options.merge(options)
118
+ opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select, :url
119
+ opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
120
+ opts[:semantic_only] = !options[:invalid_versions]
121
+ opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
122
+ package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
123
+ Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
124
+ else
125
+ help_now!
126
+ end
127
+ end
128
+ end
129
+
130
+ desc 'Get package versions from GitHub commits. Set environment variable $GITHUB_TOKEN to avoid GitHub API limit.'
131
+ arg_name 'package_name'
132
+ command :github_commit do |c|
133
+ defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
134
+ c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
135
+ c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
136
+ c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
137
+ c.flag %i[owner], desc: 'Repository owner',
138
+ default_value: "'<owner>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
139
+ c.flag %i[repo], desc: 'Repository name',
140
+ default_value: "'<repo>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
141
+ c.flag %i[branch], desc: 'Repository branch', default_value: defaults[:branch]
142
+ c.action do |global_options, options, args|
143
+ if args.size == 1
144
+ opts = global_options.merge(options)
145
+ opts = opts.slice :select_search, :select_replace, :reject, :owner, :repo, :branch
146
+ opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
147
+ package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
148
+ Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
149
+ else
150
+ help_now!
151
+ end
152
+ end
153
+ end
154
+
155
+ desc 'Get package versions from GitHub releases. Set environment variable $GITHUB_TOKEN to avoid GitHub API limit.'
156
+ arg_name 'package_name'
157
+ command :github_release do |c|
158
+ defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
159
+ c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
160
+ c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
161
+ c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
162
+ c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
163
+ c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
164
+ default_value: defaults[:semantic_select]
165
+ c.flag %i[owner], desc: 'Repository owner',
166
+ default_value: "'<owner>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
167
+ c.flag %i[repo], desc: 'Repository name',
168
+ default_value: "'<repo>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
169
+ c.action do |global_options, options, args|
170
+ if args.size == 1
171
+ opts = global_options.merge(options)
172
+ opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select, :owner, :repo
173
+ opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
174
+ opts[:semantic_only] = !options[:invalid_versions]
175
+ opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
176
+ package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
177
+ Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
178
+ else
179
+ help_now!
180
+ end
181
+ end
182
+ end
183
+
184
+ desc 'Get package versions from GitHub tags. Set environment variable $GITHUB_TOKEN to avoid GitHub API limit.'
185
+ arg_name 'package_name'
186
+ command :github_tag do |c|
187
+ defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
188
+ c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
189
+ c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
190
+ c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
191
+ c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
192
+ c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
193
+ default_value: defaults[:semantic_select]
194
+ c.flag %i[owner], desc: 'Repository owner',
195
+ default_value: "'<owner>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
196
+ c.flag %i[repo], desc: 'Repository name',
197
+ default_value: "'<repo>' if package_name is in format '<owner>/<repo>', otherwise just package_name" # rubocop:disable Layout/LineLength
198
+ c.action do |global_options, options, args|
199
+ if args.size == 1
200
+ opts = global_options.merge(options)
201
+ opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select, :owner, :repo
202
+ opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
203
+ opts[:semantic_only] = !options[:invalid_versions]
204
+ opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
205
+ package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
206
+ Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
207
+ else
208
+ help_now!
209
+ end
210
+ end
211
+ end
212
+
213
+ desc 'Get package versions from web page of links'
214
+ arg_name 'package_name'
215
+ command :index do |c|
216
+ defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
217
+ c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
218
+ c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
219
+ c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
220
+ c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
221
+ c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
222
+ default_value: defaults[:semantic_select]
223
+ c.flag %i[url], desc: 'URL', default_value: defaults[:url]
224
+ c.switch %i[link_value], desc: 'Use the value (target) of links rather than the content (display text)',
225
+ negatable: false, default_value: false
226
+ c.action do |global_options, options, args|
227
+ if args.size == 1
228
+ opts = global_options.merge(options)
229
+ opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select, :url
230
+ opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
231
+ opts[:link] == 'value' if options[:link_value]
232
+ opts[:semantic_only] = !options[:invalid_versions]
233
+ opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
234
+ package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
235
+ Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
236
+ else
237
+ help_now!
238
+ end
239
+ end
240
+ end
241
+
242
+ desc 'Get package versions from npm at registry.npmjs.org'
243
+ arg_name 'package_name'
244
+ command :npm do |c|
245
+ defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
246
+ c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
247
+ c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
248
+ c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
249
+ c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
250
+ c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
251
+ default_value: defaults[:semantic_select]
252
+ c.action do |global_options, options, args|
253
+ if args.size == 1
254
+ opts = global_options.merge(options)
255
+ opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select
256
+ opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
257
+ opts[:semantic_only] = !options[:invalid_versions]
258
+ opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
259
+ package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
260
+ Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
261
+ else
262
+ help_now!
263
+ end
264
+ end
265
+ end
266
+
267
+ desc 'Get package versions from the Python Package Index at pypi.org'
268
+ arg_name 'package_name'
269
+ command :pypi do |c|
270
+ defaults = (Getv::Package.new 'name', type: c.name.to_s).opts
271
+ c.flag %i[select_search], desc: 'Regex version selection search', default_value: defaults[:select_search]
272
+ c.flag %i[select_replace], desc: 'Regex version selection replace', default_value: defaults[:select_replace]
273
+ c.flag %i[reject], desc: 'Regex version rejection', default_value: defaults[:reject]
274
+ c.switch %i[invalid_versions], desc: 'Include invalid semantic versions', negatable: false, default_value: false
275
+ c.flag %i[semantic_select], desc: 'Semantic version selection (comma delimited)',
276
+ default_value: defaults[:semantic_select]
277
+ c.action do |global_options, options, args|
278
+ if args.size == 1
279
+ opts = global_options.merge(options)
280
+ opts = opts.slice :select_search, :select_replace, :reject, :semantic_only, :semantic_select
281
+ opts = opts.delete_if { |k, v| v.nil? || v == c.flags[k].default_value }
282
+ opts[:semantic_only] = !options[:invalid_versions]
283
+ opts[:semantic_select] = opts[:semantic_select].split(',') unless opts.fetch(:semantic_select, nil).nil?
284
+ package = Getv::Package.new args[0], { type: c.name.to_s }.merge(opts)
285
+ Getv::Cli.output(package, latest: global_options[:latest], json: global_options[:json])
286
+ else
287
+ help_now!
288
+ end
289
+ end
290
+ end
291
+
292
+ pre do |_global, _command, _options, _args|
293
+ # Pre logic here
294
+ # Return true to proceed; false to abort and not call the
295
+ # chosen command
296
+ # Use skips_pre before a command to skip this block
297
+ # on that command only
298
+ true
299
+ end
300
+
301
+ post do |global, command, options, args|
302
+ # Post logic here
303
+ # Use skips_post before a command to skip this
304
+ # block on that command only
305
+ end
306
+
307
+ on_error do |_exception|
308
+ # Error logic here
309
+ # return false to skip default error handling
310
+ true
311
+ end
312
+ end
313
+
314
+ exit App.run(ARGV)
data/lib/getv/package.rb CHANGED
@@ -5,7 +5,7 @@ module Getv
5
5
  class Package # rubocop:disable Metrics/ClassLength
6
6
  attr_accessor :name, :opts
7
7
 
8
- def initialize(name, opts = {}) # rubocop:disable Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/AbcSize
8
+ def initialize(name, opts = {}) # rubocop:disable Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/AbcSize,Metrics/PerceivedComplexity
9
9
  @name = name
10
10
  case name
11
11
  when /rubygem-.*/
@@ -24,7 +24,7 @@ module Getv
24
24
  end
25
25
  opts = {
26
26
  type: 'github_release',
27
- select_search: '^\s*v?((0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)\s*$', # rubocop:disable Layout/LineLength
27
+ select_search: '^\s*v?(.*)\s*$',
28
28
  select_replace: '\1',
29
29
  reject: nil,
30
30
  semantic_only: true,
@@ -32,6 +32,9 @@ module Getv
32
32
  versions: nil,
33
33
  latest_version: nil
34
34
  }.merge(opts)
35
+ if (opts[:type] == 'docker' || opts[:type] =~ /github.*/) && (name.count('/') == 1)
36
+ opts = { owner: name.split('/')[0], repo: name.split('/')[1] }.merge(opts)
37
+ end
35
38
  case opts[:type]
36
39
  when 'docker'
37
40
  opts = { owner: 'library', repo: name, url: 'https://registry.hub.docker.com' }.merge(opts)
data/lib/getv/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Getv
4
- VERSION = '1.0.1'
4
+ VERSION = '1.3.0'
5
5
  end
metadata CHANGED
@@ -1,15 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: getv
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - harbottle
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-17 00:00:00.000000000 Z
11
+ date: 2022-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gli
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.20.1
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 3.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 2.20.1
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 3.0.0
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: docker_registry2
15
35
  requirement: !ruby/object:Gem::Requirement
@@ -93,20 +113,14 @@ dependencies:
93
113
  description: Pull package version numbers from the web in various ways.
94
114
  email:
95
115
  - harbottle@room3d3.com
96
- executables: []
116
+ executables:
117
+ - getv
97
118
  extensions: []
98
119
  extra_rdoc_files: []
99
120
  files:
100
- - ".bundle/config"
101
- - ".gitignore"
102
- - ".rspec"
103
- - ".rubocop.yml"
104
- - ".travis.yml"
105
- - Gemfile
106
121
  - LICENSE.txt
107
122
  - README.md
108
- - Rakefile
109
- - getv.gemspec
123
+ - exe/getv
110
124
  - lib/getv.rb
111
125
  - lib/getv/package.rb
112
126
  - lib/getv/version.rb
data/.bundle/config DELETED
@@ -1,4 +0,0 @@
1
- ---
2
- BUNDLE_BIN: "bin"
3
- BUNDLE_DISABLE_SHARED_GEMS: "true"
4
- BUNDLE_PATH: "./bundle"
data/.gitignore DELETED
@@ -1,15 +0,0 @@
1
- /bin/
2
- /bundle/
3
- /.yardoc
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- /*.gem
11
- /vendor
12
- Gemfile.lock
13
-
14
- # rspec failure tracking
15
- .rspec_status
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --format documentation
2
- --color
3
- --require spec_helper
data/.rubocop.yml DELETED
@@ -1,10 +0,0 @@
1
- ---
2
- AllCops:
3
- NewCops: enable
4
-
5
- Metrics/BlockLength:
6
- Exclude:
7
- - 'Rakefile'
8
- - '**/*.rake'
9
- - 'test/**/*.rb'
10
- - 'spec/**/*_spec.rb'
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.6.6
6
- before_install: gem install bundler -v 2.1.4
data/Gemfile DELETED
@@ -1,17 +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 'irb', '~> 1.4'
10
- gem 'nokogiri', '~> 1.13'
11
- gem 'octokit', '~> 4.21'
12
- gem 'rake', '~> 12.0'
13
- gem 'rdoc', '~> 6.4'
14
- gem 'rspec', '~> 3.0'
15
- gem 'semantic', '~> 1.6'
16
- gem 'vcr', '~> 6.0'
17
- gem 'webmock', '~> 3.0'
data/Rakefile DELETED
@@ -1,6 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
3
-
4
- RSpec::Core::RakeTask.new(:spec)
5
-
6
- task :default => :spec
data/getv.gemspec DELETED
@@ -1,33 +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('docker_registry2', '>= 1.0.0', '< 2.0.0')
30
- spec.add_dependency('nokogiri', '>= 1.0.0', '< 2.0.0')
31
- spec.add_dependency('octokit', '>= 3.0.0', '< 5.0.0')
32
- spec.add_dependency('semantic', '>= 1.0.0', '< 2.0.0')
33
- end