zypper-onlinesearch 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +81 -0
- data/Gemfile +12 -2
- data/Gemfile.lock +36 -5
- data/LICENSE +674 -0
- data/README.md +8 -104
- data/Rakefile +7 -1
- data/lib/zypper/onlinesearch/cache.rb +20 -23
- data/lib/zypper/onlinesearch/cli.rb +63 -61
- data/lib/zypper/onlinesearch/data.rb +116 -106
- data/lib/zypper/onlinesearch/release.rb +13 -12
- data/lib/zypper/onlinesearch/request.rb +62 -54
- data/lib/zypper/onlinesearch/utils.rb +64 -26
- data/lib/zypper/onlinesearch/version.rb +3 -1
- data/lib/zypper/onlinesearch/view.rb +188 -155
- data/lib/zypper/onlinesearch.rb +69 -90
- data/zypper-onlinesearch.gemspec +20 -23
- metadata +12 -56
- data/.gitignore +0 -11
- data/.travis.yml +0 -5
- data/bin/console +0 -14
- data/bin/setup +0 -8
data/README.md
CHANGED
@@ -6,6 +6,9 @@ directly in your terminal.
|
|
6
6
|
Basically it is just a command-line frontend to these search engines, it executes a query to them,
|
7
7
|
arrange the results and display them in a table or report view.
|
8
8
|
|
9
|
+
[![Ruby](https://github.com/fabiomux/zypper-onlinesearch/actions/workflows/main.yml/badge.svg)][wf_main]
|
10
|
+
[![Gem Version](https://badge.fury.io/rb/zypper-onlinesearch.svg)][gem_version]
|
11
|
+
|
9
12
|
## Installation
|
10
13
|
|
11
14
|
There are a couple of options to install this application.
|
@@ -44,108 +47,6 @@ To list the links from that page:
|
|
44
47
|
$ onlinesearch -l <page>,<link_number>
|
45
48
|
```
|
46
49
|
|
47
|
-
For example looking for *Qmmp*:
|
48
|
-
```shell
|
49
|
-
$ onlinesearch -s qmmp
|
50
|
-
|
51
|
-
====================================================================================================
|
52
|
-
Parameters: Engine: packman | Query: qmmp | Cache: On (2023-02-23 16:37)
|
53
|
-
====================================================================================================
|
54
|
-
# | Page | Description
|
55
|
-
----------------------------------------------------------------------------------------------------
|
56
|
-
1 | qmmp | Qt-based Multimedia Player
|
57
|
-
----------------------------------------------------------------------------------------------------
|
58
|
-
2 | qmmp-plugin-pack | Extra plugins for Qmmp
|
59
|
-
----------------------------------------------------------------------------------------------------
|
60
|
-
|
61
|
-
====================================================================================================
|
62
|
-
Parameters: Engine: opensuse | Query: qmmp | Cache: On (2023-02-23 16:37)
|
63
|
-
====================================================================================================
|
64
|
-
# | Page | Description
|
65
|
-
----------------------------------------------------------------------------------------------------
|
66
|
-
1 | qmmp | Qt-based Multimedia Player
|
67
|
-
----------------------------------------------------------------------------------------------------
|
68
|
-
2 | libqmmp1 | Qmmp library
|
69
|
-
----------------------------------------------------------------------------------------------------
|
70
|
-
3 | libqmmp-devel | Development files for libqmmp
|
71
|
-
----------------------------------------------------------------------------------------------------
|
72
|
-
...
|
73
|
-
```
|
74
|
-
|
75
|
-
We get among the results a page called *qmmp* for both engines, so to read that pages:
|
76
|
-
```shell
|
77
|
-
$ onlinesearch -p qmmp
|
78
|
-
|
79
|
-
====================================================================================================
|
80
|
-
Parameters: Engine: packman | OS: openSUSE Leap 15.4 | Architecture: 64 Bit | Cache: On (2023-02-07 16:57)
|
81
|
-
====================================================================================================
|
82
|
-
Name: qmmp
|
83
|
-
Summary:
|
84
|
-
Description:
|
85
|
-
Qt-based Multimedia Player
|
86
|
-
----------------------------------------------------------------------------------------------------
|
87
|
-
# | Version | Repo | Distro
|
88
|
-
----------------------------------------------------------------------------------------------------
|
89
|
-
1 | 2.1.2 | Packman | openSUSE Leap 15.4
|
90
|
-
----------------------------------------------------------------------------------------------------
|
91
|
-
|
92
|
-
====================================================================================================
|
93
|
-
Parameters: Engine: opensuse | OS: openSUSE Leap 15.4 | Architecture: 64 Bit | Cache: On (2023-02-07 16:57)
|
94
|
-
====================================================================================================
|
95
|
-
Name: qmmp
|
96
|
-
Summary: Qt-based Multimedia Player
|
97
|
-
Description: This program is an audio-player, written with help of Qt library.
|
98
|
-
----------------------------------------------------------------------------------------------------
|
99
|
-
# | Version | Repo | Distro
|
100
|
-
----------------------------------------------------------------------------------------------------
|
101
|
-
1 | 2.1.2 | home:plater | openSUSE Leap 15.4
|
102
|
-
----------------------------------------------------------------------------------------------------
|
103
|
-
2 | 1.4.4 | home:ykoba:multimedia | openSUSE Leap 15.4
|
104
|
-
----------------------------------------------------------------------------------------------------
|
105
|
-
3 | 2.1.2 | multimedia:apps | openSUSE Leap 15.4
|
106
|
-
----------------------------------------------------------------------------------------------------
|
107
|
-
```
|
108
|
-
|
109
|
-
To show the page from one engine only, just append the `--engine <engine_name>` param:
|
110
|
-
```shell
|
111
|
-
$ onlinesearch -p qmmp --engine opensuse
|
112
|
-
```
|
113
|
-
|
114
|
-
To list the links in the third repository listed in the *opensuse* engine:
|
115
|
-
```shell
|
116
|
-
$ onlinesearch -l qmmp,3 --engine opensuse
|
117
|
-
|
118
|
-
====================================================================================================
|
119
|
-
Parameters: Engine: opensuse | OS: openSUSE Leap 15.4 | Architecture: 64 Bit | Cache: On (2023-02-07 16:57)
|
120
|
-
====================================================================================================
|
121
|
-
Name: qmmp
|
122
|
-
Summary: Qt-based Multimedia Player
|
123
|
-
Description: This program is an audio-player, written with help of Qt library.
|
124
|
-
----------------------------------------------------------------------------------------------------
|
125
|
-
# | Format | Link
|
126
|
-
----------------------------------------------------------------------------------------------------
|
127
|
-
1 | ymp | https://software.opensuse.org/ymp/multimedia:apps/15.4/qmmp.ymp?base=openSUSE%3ALeap%3A15.4&query=qmmp
|
128
|
-
----------------------------------------------------------------------------------------------------
|
129
|
-
2 | src | https://download.opensuse.org/repositories/multimedia:/apps/15.4/src/qmmp-2.1.2-lp154.182.3.src.rpm
|
130
|
-
----------------------------------------------------------------------------------------------------
|
131
|
-
3 | x86_64 | https://download.opensuse.org/repositories/multimedia:/apps/15.4/x86_64/qmmp-2.1.2-lp154.182.3.x86_64.rpm
|
132
|
-
----------------------------------------------------------------------------------------------------
|
133
|
-
```
|
134
|
-
|
135
|
-
To print only the raw URLs:
|
136
|
-
```shell
|
137
|
-
$ onlinesearch -l qmmp,3 --urls
|
138
|
-
https://software.opensuse.org/ymp/multimedia:apps/15.4/qmmp.ymp?base=openSUSE%3ALeap%3A15.4&query=qmmp
|
139
|
-
https://download.opensuse.org/repositories/multimedia:/apps/15.4/src/qmmp-2.1.2-lp154.182.3.src.rpm
|
140
|
-
https://download.opensuse.org/repositories/multimedia:/apps/15.4/x86_64/qmmp-2.1.2-lp154.182.3.x86_64.rpm
|
141
|
-
```
|
142
|
-
|
143
|
-
And in case we are interested to a specific format:
|
144
|
-
```shell
|
145
|
-
$ onlinesearch -l qmmp,3 --urls --format ymp
|
146
|
-
https://software.opensuse.org/ymp/multimedia:apps/15.4/qmmp.ymp?base=openSUSE%3ALeap%3A15.4&query=qmmp
|
147
|
-
```
|
148
|
-
|
149
50
|
## Get help
|
150
51
|
|
151
52
|
Where to start:
|
@@ -156,7 +57,10 @@ $ onlinesearch --help
|
|
156
57
|
## More Help:
|
157
58
|
|
158
59
|
More info is available at:
|
159
|
-
- the [Zypper-Onlinesearch Project page][project_page]
|
60
|
+
- the [Zypper-Onlinesearch Project page][project_page];
|
61
|
+
- the [Zypper-Onlinesearch Github wiki][zypper_onlinesearch_wiki].
|
160
62
|
|
161
63
|
[project_page]: https://freeaptitude.altervista.org/projects/zypper-onlinesearch.html "Zypper-Onlinesearch project page"
|
162
|
-
|
64
|
+
[zypper_onlinesearch_wiki]: https://github.com/fabiomux/zypper-onlinesearch/wiki "Zypper-Onlinesearch wiki page on GitHub"
|
65
|
+
[wf_main]: https://github.com/fabiomux/zypper-onlinesearch/actions/workflows/main.yml
|
66
|
+
[gem_version]: https://badge.fury.io/rb/zypper-onlinesearch
|
data/Rakefile
CHANGED
@@ -1,40 +1,39 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "fileutils"
|
4
|
+
require "uri"
|
3
5
|
|
4
6
|
module Zypper
|
5
7
|
module Onlinesearch
|
6
|
-
|
8
|
+
#
|
9
|
+
# Handles the cached data.
|
10
|
+
#
|
7
11
|
class Cache
|
8
|
-
|
9
12
|
def initialize(operation, engine)
|
10
|
-
@base_folder = File.join(
|
11
|
-
FileUtils.mkdir_p @base_folder
|
13
|
+
@base_folder = File.join(Dir.home, ".cache", "zypper-onlinesearch", engine, operation)
|
14
|
+
FileUtils.mkdir_p @base_folder
|
12
15
|
end
|
13
16
|
|
14
17
|
def set(query, response)
|
15
|
-
File.
|
16
|
-
f.write Marshal.dump(response)
|
17
|
-
end
|
18
|
+
File.write(File.join(@base_folder, query_to_filename(query)), Marshal.dump(response))
|
18
19
|
end
|
19
20
|
|
20
21
|
def get(query)
|
21
22
|
fname = query_to_filename(query)
|
22
|
-
Marshal.load(File.read(File.join(@base_folder, fname))) if
|
23
|
+
Marshal.load(File.read(File.join(@base_folder, fname))) if exist? query
|
23
24
|
end
|
24
25
|
|
25
|
-
def
|
26
|
-
File.
|
26
|
+
def exist?(query)
|
27
|
+
File.exist?(File.join(@base_folder, query_to_filename(query)))
|
27
28
|
end
|
28
29
|
|
29
30
|
def self.reset!
|
30
|
-
base_folder = File.join(
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
raise EmptyCache
|
37
|
-
end
|
31
|
+
base_folder = File.join(Dir.home, ".cache", "zypper-onlinesearch")
|
32
|
+
raise EmptyCache unless Dir.exist? base_folder
|
33
|
+
|
34
|
+
size = Dir.glob(File.join(base_folder, "**", "*")).map { |f| File.size(f) }.inject(:+)
|
35
|
+
FileUtils.remove_dir base_folder
|
36
|
+
size
|
38
37
|
end
|
39
38
|
|
40
39
|
def mtime(query)
|
@@ -45,10 +44,8 @@ module Zypper
|
|
45
44
|
private
|
46
45
|
|
47
46
|
def query_to_filename(query)
|
48
|
-
URI.encode query.delete(
|
47
|
+
URI.encode query.delete("./")
|
49
48
|
end
|
50
49
|
end
|
51
|
-
|
52
50
|
end
|
53
51
|
end
|
54
|
-
|
@@ -1,162 +1,164 @@
|
|
1
|
-
|
2
|
-
require 'ostruct'
|
3
|
-
require 'zypper/onlinesearch'
|
4
|
-
require 'zypper/onlinesearch/version'
|
1
|
+
# frozen_string_literal: true
|
5
2
|
|
6
|
-
|
3
|
+
require "optparse"
|
4
|
+
require "zypper/onlinesearch"
|
5
|
+
require "zypper/onlinesearch/version"
|
7
6
|
|
7
|
+
module Zypper
|
8
8
|
module Onlinesearch
|
9
|
-
|
9
|
+
#
|
10
|
+
# Parsing the input data.
|
11
|
+
#
|
10
12
|
class OptParseMain
|
11
|
-
|
12
13
|
def self.parse(args)
|
13
|
-
options =
|
14
|
+
options = Struct.new(:operation, :query, :refresh, :engine, :timeout, :formats,
|
15
|
+
:distributions, :types, :number, :view, :format).new
|
14
16
|
options.operation = :search
|
15
|
-
options.query =
|
17
|
+
options.query = ""
|
16
18
|
options.refresh = false
|
17
19
|
options.engine = :all # :opensuse, :packman
|
18
20
|
options.timeout = 20
|
19
21
|
options.formats = :compatible # :all
|
20
22
|
options.distributions = :compatible # :all
|
21
|
-
options.types = [
|
23
|
+
options.types = %i[supported community experimental unsupported]
|
22
24
|
options.number = 0
|
23
25
|
options.view = :table
|
24
26
|
options.format = :all # or single format
|
25
|
-
#options.preload = nil #used by :links or :page operations
|
27
|
+
# options.preload = nil #used by :links or :page operations
|
26
28
|
|
27
29
|
opt_parser = OptionParser.new do |opt|
|
30
|
+
command = ENV["ZYPPER_ONLINESEARCH"] ? "zypper onlinesearch" : "onlinesearch"
|
31
|
+
opt.banner = "Usage: #{command} [OPTIONS] [OPERATION]"
|
28
32
|
|
29
|
-
|
30
|
-
|
31
|
-
else
|
32
|
-
opt.banner = 'Usage: onlinesearch [OPTIONS] [OPERATION]'
|
33
|
-
end
|
34
|
-
|
35
|
-
opt.separator ''
|
36
|
-
opt.separator 'Operations:'
|
33
|
+
opt.separator ""
|
34
|
+
opt.separator "Operations:"
|
37
35
|
|
38
|
-
opt.on(
|
36
|
+
opt.on("-s", "--search <STRING>", "Search for STRING to the online engines available") do |o|
|
39
37
|
options.operation = :search
|
40
38
|
options.query = o
|
41
39
|
end
|
42
40
|
|
43
|
-
opt.on(
|
41
|
+
opt.on("-p", "--page <PAGE_NAME>", "Get info about the PAGE_NAME") do |o|
|
44
42
|
options.operation = :page
|
45
43
|
options.query = o
|
46
44
|
end
|
47
45
|
|
48
|
-
opt.on(
|
46
|
+
opt.on("-l", "--links <PAGE_NAME>,<NTH>", Array,
|
47
|
+
"Print all the links of the NTH item in the PAGE_NAME") do |o|
|
49
48
|
options.operation = :links
|
50
49
|
options.query = o[0]
|
51
50
|
options.number = o[1].to_i
|
52
|
-
#options.preload = :page
|
51
|
+
# options.preload = :page
|
53
52
|
end
|
54
53
|
|
55
|
-
opt.on(
|
54
|
+
opt.on("--clean-cache", "Clean the whole cache") do
|
56
55
|
options.operation = :cache_clean
|
57
56
|
end
|
58
57
|
|
59
|
-
opt.separator
|
60
|
-
opt.separator
|
58
|
+
opt.separator ""
|
59
|
+
opt.separator "General Options"
|
61
60
|
|
62
|
-
|
61
|
+
alt = Request::Search.constants.map(&:to_s).map(&:downcase).join(", ")
|
62
|
+
opt.on("--engine <ENGINE>",
|
63
|
+
"Use only ENGINE to search for (default: #{options.engine}, alternatives: #{alt})") do |o|
|
63
64
|
options.engine = o.to_sym
|
64
65
|
end
|
65
66
|
|
66
|
-
opt.on(
|
67
|
+
opt.on("--refresh", "Refresh the cached values.") do
|
67
68
|
options.refresh = true
|
68
69
|
end
|
69
70
|
|
70
|
-
opt.on(
|
71
|
+
opt.on("--timeout <SECONDS>", "The SECONDS before an HTTP Timeout Error (Default: #{options.timeout})") do |o|
|
71
72
|
options.timeout = o.to_f
|
72
73
|
end
|
73
74
|
|
74
|
-
opt.separator
|
75
|
-
opt.separator
|
75
|
+
opt.separator ""
|
76
|
+
opt.separator "View options:"
|
76
77
|
|
77
|
-
opt.on(
|
78
|
+
opt.on("--table", "Show the results as a table [DEFAULT]") do
|
78
79
|
options.view = :table
|
79
80
|
end
|
80
81
|
|
81
|
-
opt.on(
|
82
|
+
opt.on("--report", "Show the results as report") do
|
82
83
|
options.view = :report
|
83
84
|
end
|
84
85
|
|
85
|
-
opt.separator
|
86
|
+
opt.separator ""
|
86
87
|
opt.separator '"Page" and "Links" options:'
|
87
88
|
|
88
|
-
opt.on(
|
89
|
+
opt.on("--all-formats", "Show all the available formats") do
|
89
90
|
options.formats = :all
|
90
91
|
end
|
91
92
|
|
92
|
-
opt.on(
|
93
|
+
opt.on("--all-distributions", "Show all the available distributions") do
|
93
94
|
options.distributions = :all
|
94
95
|
end
|
95
96
|
|
96
|
-
opt.on(
|
97
|
+
opt.on("--no-supported", "Hide supported packages.") do
|
97
98
|
options.types.delete :supported
|
98
99
|
end
|
99
100
|
|
100
|
-
opt.on(
|
101
|
+
opt.on("--no-experimental", "Hide experimental packages.") do
|
101
102
|
options.types.delete :experimental
|
102
103
|
end
|
103
104
|
|
104
|
-
opt.on(
|
105
|
+
opt.on("--no-community", "Hide community packages.") do
|
105
106
|
options.types.delete :community
|
106
107
|
end
|
107
108
|
|
108
|
-
opt.
|
109
|
+
opt.on("--no-unsupported", "Hide unsupported packages.") do
|
110
|
+
options.types.delete :unsupported
|
111
|
+
end
|
112
|
+
|
113
|
+
opt.separator ""
|
109
114
|
opt.separator '"Links" options:'
|
110
115
|
|
111
|
-
opt.on(
|
116
|
+
opt.on("--format FORMAT", "Filter for packages with the specified FORMAT") do |o|
|
112
117
|
options.format = o.to_sym
|
113
118
|
end
|
114
119
|
|
115
|
-
opt.on(
|
120
|
+
opt.on("--urls", "Show only the urls without headers") do
|
116
121
|
options.view = :urls
|
117
122
|
end
|
118
123
|
|
119
|
-
unless ENV[
|
120
|
-
opt.separator
|
121
|
-
opt.separator
|
124
|
+
unless ENV["ZYPPER_ONLINESEARCH"]
|
125
|
+
opt.separator ""
|
126
|
+
opt.separator "Other:"
|
122
127
|
|
123
|
-
opt.on_tail(
|
128
|
+
opt.on_tail("-h", "--help", "Show this message") do
|
124
129
|
puts opt
|
125
130
|
exit
|
126
131
|
end
|
127
132
|
|
128
|
-
opt.on_tail(
|
133
|
+
opt.on_tail("-v", "--version", "Show version") do
|
129
134
|
puts VERSION
|
130
135
|
exit
|
131
136
|
end
|
132
137
|
end
|
133
|
-
|
134
138
|
end
|
135
139
|
|
136
|
-
|
137
140
|
if ARGV.empty?
|
138
|
-
puts opt_parser
|
141
|
+
puts opt_parser
|
142
|
+
exit
|
139
143
|
else
|
140
|
-
opt_parser.parse!(
|
144
|
+
opt_parser.parse!(args)
|
141
145
|
end
|
142
146
|
|
143
147
|
options
|
144
148
|
end
|
145
149
|
end
|
146
150
|
|
147
|
-
|
151
|
+
#
|
152
|
+
# Interface class to run the application.
|
153
|
+
#
|
148
154
|
class CLI
|
149
155
|
def self.start
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
exit e.error_code
|
156
|
-
end
|
156
|
+
options = OptParseMain.parse(ARGV)
|
157
|
+
Onlinesearch::Builder.new(options).send(options.operation)
|
158
|
+
rescue StandardError => e
|
159
|
+
Messages.error e
|
160
|
+
exit e.error_code
|
157
161
|
end
|
158
162
|
end
|
159
|
-
|
160
163
|
end
|
161
164
|
end
|
162
|
-
|